ruby-llvm 3.5.0 → 10.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +19 -4
  3. data/ext/ruby-llvm-support/Rakefile +15 -6
  4. data/lib/llvm/analysis_ffi.rb +27 -28
  5. data/lib/llvm/config.rb +4 -4
  6. data/lib/llvm/core.rb +45 -2
  7. data/lib/llvm/core/bitcode.rb +10 -10
  8. data/lib/llvm/core/bitcode_ffi.rb +89 -65
  9. data/lib/llvm/core/builder.rb +2 -3
  10. data/lib/llvm/core/context.rb +1 -1
  11. data/lib/llvm/core/pass_manager.rb +4 -2
  12. data/lib/llvm/core/type.rb +2 -2
  13. data/lib/llvm/core/value.rb +138 -24
  14. data/lib/llvm/core_ffi.rb +3863 -3730
  15. data/lib/llvm/execution_engine.rb +37 -35
  16. data/lib/llvm/execution_engine_ffi.rb +238 -276
  17. data/lib/llvm/linker.rb +1 -14
  18. data/lib/llvm/linker_ffi.rb +22 -26
  19. data/lib/llvm/target.rb +9 -15
  20. data/lib/llvm/target_ffi.rb +301 -293
  21. data/lib/llvm/transforms/builder.rb +1 -1
  22. data/lib/llvm/transforms/builder_ffi.rb +57 -58
  23. data/lib/llvm/transforms/ipo.rb +1 -1
  24. data/lib/llvm/transforms/ipo_ffi.rb +59 -60
  25. data/lib/llvm/transforms/scalar_ffi.rb +199 -143
  26. data/lib/llvm/transforms/vectorize_ffi.rb +15 -16
  27. data/lib/llvm/version.rb +3 -2
  28. data/test/basic_block_test.rb +0 -1
  29. data/test/bitcode_test.rb +1 -2
  30. data/test/call_test.rb +1 -1
  31. data/test/double_test.rb +8 -7
  32. data/test/equality_test.rb +2 -4
  33. data/test/function_test.rb +27 -0
  34. data/test/generic_value_test.rb +1 -1
  35. data/test/instruction_test.rb +0 -2
  36. data/test/ipo_test.rb +1 -1
  37. data/test/linker_test.rb +0 -9
  38. data/test/mcjit_test.rb +3 -3
  39. data/test/module_test.rb +16 -1
  40. data/test/pass_manager_builder_test.rb +1 -2
  41. data/test/target_test.rb +3 -20
  42. data/test/test_helper.rb +4 -1
  43. metadata +55 -37
@@ -4,36 +4,35 @@ require 'ffi'
4
4
 
5
5
  module LLVM::C
6
6
  extend FFI::Library
7
- ffi_lib ["libLLVM-3.5.so.1", "LLVM-3.5"]
8
-
7
+ ffi_lib ["libLLVM-10.so.1", "LLVM-10"]
8
+
9
9
  def self.attach_function(name, *_)
10
10
  begin; super; rescue FFI::NotFoundError => e
11
11
  (class << self; self; end).class_eval { define_method(name) { |*_| raise e } }
12
12
  end
13
13
  end
14
-
15
- # See llvm::createBBVectorizePass function.
16
- #
14
+
15
+ # DEPRECATED - Use LLVMAddSLPVectorizePass
16
+ #
17
17
  # @method add_bb_vectorize_pass(pm)
18
- # @param [FFI::Pointer(PassManagerRef)] pm
19
- # @return [nil]
18
+ # @param [FFI::Pointer(PassManagerRef)] pm
19
+ # @return [nil]
20
20
  # @scope class
21
21
  attach_function :add_bb_vectorize_pass, :LLVMAddBBVectorizePass, [:pointer], :void
22
-
22
+
23
23
  # See llvm::createLoopVectorizePass function.
24
- #
24
+ #
25
25
  # @method add_loop_vectorize_pass(pm)
26
- # @param [FFI::Pointer(PassManagerRef)] pm
27
- # @return [nil]
26
+ # @param [FFI::Pointer(PassManagerRef)] pm
27
+ # @return [nil]
28
28
  # @scope class
29
29
  attach_function :add_loop_vectorize_pass, :LLVMAddLoopVectorizePass, [:pointer], :void
30
-
30
+
31
31
  # See llvm::createSLPVectorizerPass function.
32
- #
32
+ #
33
33
  # @method add_slp_vectorize_pass(pm)
34
- # @param [FFI::Pointer(PassManagerRef)] pm
35
- # @return [nil]
34
+ # @param [FFI::Pointer(PassManagerRef)] pm
35
+ # @return [nil]
36
36
  # @scope class
37
37
  attach_function :add_slp_vectorize_pass, :LLVMAddSLPVectorizePass, [:pointer], :void
38
-
39
38
  end
@@ -1,4 +1,5 @@
1
1
  module LLVM
2
- LLVM_VERSION = "3.5"
3
- RUBY_LLVM_VERSION = "3.5.0"
2
+ LLVM_VERSION = "10".freeze
3
+ LLVM_REQUIRED_VERSION = "10.0".freeze
4
+ RUBY_LLVM_VERSION = "10.0.0".freeze
4
5
  end
@@ -85,4 +85,3 @@ class BasicBlockTestCase < Minitest::Test
85
85
  end
86
86
 
87
87
  end
88
-
@@ -8,8 +8,7 @@ class BitcodeTestCase < Minitest::Test
8
8
 
9
9
  def test_bitcode
10
10
  test_module = define_module("test_module") do |mod|
11
- define_function(mod, "test_function", [], LLVM::Int) do
12
- |builder, function, *arguments|
11
+ define_function(mod, "test_function", [], LLVM::Int) do |builder, function, *arguments|
13
12
  entry = function.basic_blocks.append
14
13
  builder.position_at_end(entry)
15
14
  builder.ret(LLVM::Int(1))
@@ -60,7 +60,7 @@ class CallTestCase < Minitest::Test
60
60
  builder.ret(builder.call(external, arguments.first))
61
61
  end
62
62
  end
63
- assert_equal -10.abs, run_function_on_module(test_module, "test_function", -10).to_i
63
+ assert_equal(-10.abs, run_function_on_module(test_module, "test_function", -10).to_i)
64
64
  end
65
65
 
66
66
  def test_external_string
@@ -6,7 +6,7 @@ class DoubleTestCase < Minitest::Test
6
6
  end
7
7
 
8
8
  def test_double
9
- mod = LLVM::Module.new("Double Test")
9
+ mod = LLVM::Module.new("Double Test")
10
10
  mod.functions.add(:sin, [LLVM::Double], LLVM::Double)
11
11
 
12
12
  builder = LLVM::Builder.new
@@ -20,14 +20,15 @@ class DoubleTestCase < Minitest::Test
20
20
  builder.ret(builder.fadd(p0, LLVM::Double(1.0)))
21
21
  end
22
22
 
23
- engine = LLVM::JITCompiler.new(mod)
23
+ engine = LLVM::MCJITCompiler.new(mod)
24
24
 
25
- arg = 5.0
25
+ arg = 5.0
26
26
  result = engine.run_function(mod.functions["test"], arg)
27
- assert_equal arg+1, result.to_f(LLVM::Double)
27
+ assert_equal arg + 1, result.to_f(LLVM::Double)
28
28
 
29
- assert_in_delta(Math.sin(1.0),
30
- engine.run_function(mod.functions["sin"], 1.0).to_f(LLVM::Double),
31
- 1e-10)
29
+ # TODO: fix this
30
+ # assert_in_delta(Math.sin(1.0),
31
+ # engine.run_function(mod.functions["sin"], 1.0).to_f(LLVM::Double),
32
+ # 1e-10)
32
33
  end
33
34
  end
@@ -14,9 +14,9 @@ class EqualityTestCase < Minitest::Test
14
14
  def assert_equalities(options)
15
15
  map = {
16
16
  :equal => method(:assert_equal),
17
- :not_equal => lambda {|n, m, name| assert n != m, name },
17
+ :not_equal => lambda {|n, m, name| assert n != m, name },
18
18
  :same => method(:assert_same),
19
- :not_same => lambda {|n, m, name| assert !n.equal?(m), name },
19
+ :not_same => lambda {|n, m, name| assert !n.equal?(m), name },
20
20
  :eql => lambda {|n, m, name| assert n.eql?(m), name },
21
21
  :not_eql => lambda {|n, m, name| assert !n.eql?(m), name },
22
22
  }
@@ -26,7 +26,6 @@ class EqualityTestCase < Minitest::Test
26
26
  callable.call(n, m, name.to_s)
27
27
  end
28
28
  end
29
-
30
29
  end
31
30
 
32
31
  def test_int_value
@@ -88,4 +87,3 @@ class EqualityTestCase < Minitest::Test
88
87
  end
89
88
 
90
89
  end
91
-
@@ -30,6 +30,33 @@ class FunctionTest < Minitest::Test
30
30
  end
31
31
  end
32
32
 
33
+ def helper_test_attribute(name)
34
+ with_function [], LLVM.Void do |fun|
35
+ assert_equal 0, fun.attribute_count
36
+ assert_equal [], fun.attributes
37
+
38
+ fun.add_attribute(name)
39
+ assert_equal 1, fun.attribute_count
40
+ assert_equal [33], fun.attributes
41
+
42
+ assert_equal false, fun.verify
43
+
44
+ fun.remove_attribute(name)
45
+ assert_equal 0, fun.attribute_count
46
+ assert_equal [], fun.attributes
47
+
48
+ assert_equal false, fun.verify
49
+ end
50
+ end
51
+
52
+ def test_add_attribute_old_name
53
+ helper_test_attribute(:no_unwind_attribute)
54
+ end
55
+
56
+ def test_add_attribute_new_name
57
+ helper_test_attribute(:nounwind)
58
+ end
59
+
33
60
  end
34
61
 
35
62
  class FunctionTypeTest < Minitest::Test
@@ -8,7 +8,7 @@ class GenericValueTestCase < Minitest::Test
8
8
 
9
9
  def test_from_i
10
10
  assert_equal 2, LLVM::GenericValue.from_i(2).to_i
11
- assert_equal 2 ,LLVM::GenericValue.from_i(2.2).to_i
11
+ assert_equal 2, LLVM::GenericValue.from_i(2.2).to_i
12
12
  end
13
13
 
14
14
  def test_from_float
@@ -28,5 +28,3 @@ class InstructionTestCase < Minitest::Test
28
28
  assert_equal entry, inst2.parent
29
29
  end
30
30
  end
31
-
32
-
@@ -39,7 +39,7 @@ class IPOTestCase < Minitest::Test
39
39
  assert fns.include?(main)
40
40
 
41
41
  # optimize
42
- engine = LLVM::JITCompiler.new(mod)
42
+ engine = LLVM::MCJITCompiler.new(mod)
43
43
  passm = LLVM::PassManager.new(engine)
44
44
 
45
45
  passm.gdce!
@@ -34,13 +34,4 @@ class LinkerTestCase < Minitest::Test
34
34
 
35
35
  assert_equal 42, run_function_on_module(@mod1, 'main').to_i
36
36
  end
37
-
38
- def test_link_into_and_destroy
39
- create_modules
40
- @mod2.link_into_and_destroy(@mod1)
41
-
42
- assert_nil @mod2.to_ptr
43
-
44
- assert_equal 42, run_function_on_module(@mod1, 'main').to_i
45
- end
46
37
  end
@@ -77,7 +77,7 @@ class MCJITTestCase < Minitest::Test
77
77
  assert_equal engine.modules, ret, '#<< returns self'
78
78
  end
79
79
 
80
- assert engine.functions[:bar]
80
+ refute_nil engine.functions[:bar]
81
81
  engine.modules.delete(mod2).tap do |ret|
82
82
  assert_instance_of LLVM::Module, ret, '#delete returns module'
83
83
  assert_equal mod2, ret
@@ -88,7 +88,7 @@ class MCJITTestCase < Minitest::Test
88
88
  def test_accessors
89
89
  main_mod = LLVM::Module.new('main')
90
90
  engine = LLVM::MCJITCompiler.new(main_mod, :opt_level => 0)
91
- assert_match /^e-/, engine.data_layout.to_s
92
- assert_match /gnu/, engine.target_machine.triple
91
+ assert_match(/^e-/, engine.data_layout.to_s)
92
+ assert_match(/gnu/, engine.target_machine.triple)
93
93
  end
94
94
  end
@@ -54,7 +54,8 @@ class ModuleTestCase < Minitest::Test
54
54
 
55
55
  def test_to_s
56
56
  mod = LLVM::Module.new('test_print')
57
- assert_equal mod.to_s, "; ModuleID = 'test_print'\n"
57
+ assert_equal mod.to_s,
58
+ "; ModuleID = 'test_print'\nsource_filename = \"test_print\"\n"
58
59
  end
59
60
 
60
61
  def test_dump
@@ -75,4 +76,18 @@ class ModuleTestCase < Minitest::Test
75
76
  end
76
77
  end
77
78
 
79
+ def test_module_properties
80
+ mod = LLVM::Module.new('mod')
81
+
82
+ assert_equal '', mod.triple
83
+
84
+ mod.triple = 'x86-linux-gnu'
85
+ assert_equal 'x86-linux-gnu', mod.triple
86
+
87
+ assert_equal '', mod.data_layout
88
+
89
+ mod.data_layout = 'e-p:32:32'
90
+ assert_equal 'e-p:32:32', mod.data_layout
91
+ end
92
+
78
93
  end
@@ -7,8 +7,7 @@ class PassManagerBuilderTest < Minitest::Test
7
7
  LLVM.init_jit
8
8
  @builder = LLVM::PassManagerBuilder.new
9
9
 
10
- machine = LLVM::Target.by_name('x86-64').create_machine('x86-linux-gnu')
11
- @pass_manager = LLVM::PassManager.new(machine)
10
+ @pass_manager = LLVM::PassManager.new
12
11
  end
13
12
 
14
13
  def teardown
@@ -56,9 +56,6 @@ class TargetTestCase < Minitest::Test
56
56
  assert_equal 'x86-linux-gnu', mach.triple
57
57
  assert_equal 'i686', mach.cpu
58
58
  assert_equal '', mach.features
59
-
60
- layout = mach.data_layout
61
- assert_equal 'e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128', layout.to_s
62
59
  end
63
60
 
64
61
  def test_emit
@@ -74,29 +71,15 @@ class TargetTestCase < Minitest::Test
74
71
 
75
72
  Tempfile.open('emit') do |tmp|
76
73
  mach.emit(mod, tmp.path)
77
- assert_match %r{xorl\t%eax, %eax}, tmp.read
74
+ assert_match(/xorl\t%eax, %eax/, tmp.read)
78
75
  end
79
76
 
80
77
  Tempfile.open('emit') do |tmp|
81
78
  mach.emit(mod, tmp.path, :object)
82
- assert_match %r{\x66\x31\xc0}, File.read(tmp.path, mode: 'rb')
79
+ assert_match(/\x66\x31\xc0/, File.read(tmp.path, mode: 'rb'))
83
80
  end
84
81
  end
85
82
 
86
- def test_module_properties
87
- mod = LLVM::Module.new('mod')
88
-
89
- assert_equal '', mod.triple
90
-
91
- mod.triple = 'x86-linux-gnu'
92
- assert_equal 'x86-linux-gnu', mod.triple
93
-
94
- assert_equal '', mod.data_layout
95
-
96
- mod.data_layout = 'e-p:32:32'
97
- assert_equal 'e-p:32:32', mod.data_layout
98
- end
99
-
100
83
  def test_data_layout
101
84
  layout_be = LLVM::TargetDataLayout.new('E')
102
85
  assert_equal :big_endian, layout_be.byte_order
@@ -104,7 +87,7 @@ class TargetTestCase < Minitest::Test
104
87
  desc = "e-p:32:32:32-S0-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64"
105
88
  layout = LLVM::TargetDataLayout.new(desc)
106
89
 
107
- assert_equal "e-p:32:32", layout.to_s
90
+ assert_equal desc, layout.to_s
108
91
  assert_equal :little_endian, layout.byte_order
109
92
  assert_equal 4, layout.pointer_size
110
93
  assert_equal 4, layout.pointer_size(0)
@@ -17,6 +17,9 @@ rescue LoadError
17
17
  end
18
18
 
19
19
  require "minitest/autorun"
20
+ require 'minitest/reporters'
21
+
22
+ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
20
23
 
21
24
  require "llvm/core"
22
25
  require "llvm/execution_engine"
@@ -46,7 +49,7 @@ def define_function(host_module, function_name, argument_types, return_type)
46
49
  end
47
50
 
48
51
  def run_function_on_module(host_module, function_name, *argument_values)
49
- LLVM::JITCompiler.new(host_module).
52
+ LLVM::MCJITCompiler.new(host_module).
50
53
  run_function(host_module.functions[function_name], *argument_values)
51
54
  end
52
55
 
metadata CHANGED
@@ -1,71 +1,91 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-llvm
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.0
4
+ version: 10.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Voorhis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-25 00:00:00.000000000 Z
11
+ date: 2020-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rake
14
+ name: ffi
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '10.0'
19
+ version: 1.13.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '10.0'
26
+ version: 1.13.1
27
27
  - !ruby/object:Gem::Dependency
28
- name: ffi
28
+ name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.9.3
33
+ version: '12'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '14'
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '12'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '14'
47
+ - !ruby/object:Gem::Dependency
48
+ name: ffi_gen
49
+ requirement: !ruby/object:Gem::Requirement
37
50
  requirements:
38
51
  - - "~>"
39
52
  - !ruby/object:Gem::Version
40
- version: 1.9.3
53
+ version: 1.2.0
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 1.2.0
41
61
  - !ruby/object:Gem::Dependency
42
62
  name: minitest
43
63
  requirement: !ruby/object:Gem::Requirement
44
64
  requirements:
45
65
  - - "~>"
46
66
  - !ruby/object:Gem::Version
47
- version: 5.3.4
67
+ version: 5.14.1
48
68
  type: :development
49
69
  prerelease: false
50
70
  version_requirements: !ruby/object:Gem::Requirement
51
71
  requirements:
52
72
  - - "~>"
53
73
  - !ruby/object:Gem::Version
54
- version: 5.3.4
74
+ version: 5.14.1
55
75
  - !ruby/object:Gem::Dependency
56
- name: ffi_gen
76
+ name: minitest-reporters
57
77
  requirement: !ruby/object:Gem::Requirement
58
78
  requirements:
59
79
  - - "~>"
60
80
  - !ruby/object:Gem::Version
61
- version: 1.1.0
81
+ version: 1.4.2
62
82
  type: :development
63
83
  prerelease: false
64
84
  version_requirements: !ruby/object:Gem::Requirement
65
85
  requirements:
66
86
  - - "~>"
67
87
  - !ruby/object:Gem::Version
68
- version: 1.1.0
88
+ version: 1.4.2
69
89
  - !ruby/object:Gem::Dependency
70
90
  name: simplecov
71
91
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +106,14 @@ dependencies:
86
106
  requirements:
87
107
  - - "~>"
88
108
  - !ruby/object:Gem::Version
89
- version: 0.8.3
109
+ version: 0.9.8
90
110
  type: :development
91
111
  prerelease: false
92
112
  version_requirements: !ruby/object:Gem::Requirement
93
113
  requirements:
94
114
  - - "~>"
95
115
  - !ruby/object:Gem::Version
96
- version: 0.8.3
116
+ version: 0.9.8
97
117
  description: Ruby-LLVM is a Ruby language binding to the LLVM compiler infrastructure
98
118
  library.
99
119
  email: jvoorhis@gmail.com
@@ -183,37 +203,35 @@ required_rubygems_version: !ruby/object:Gem::Requirement
183
203
  - !ruby/object:Gem::Version
184
204
  version: '0'
185
205
  requirements: []
186
- rubyforge_project:
187
- rubygems_version: 2.4.1
206
+ rubygems_version: 3.1.2
188
207
  signing_key:
189
208
  specification_version: 4
190
209
  summary: LLVM bindings for Ruby
191
210
  test_files:
211
+ - test/double_test.rb
192
212
  - test/type_test.rb
213
+ - test/basic_block_test.rb
214
+ - test/struct_test.rb
215
+ - test/array_test.rb
216
+ - test/vector_test.rb
217
+ - test/instruction_test.rb
193
218
  - test/ipo_test.rb
219
+ - test/branch_test.rb
194
220
  - test/binary_operations_test.rb
195
- - test/module_test.rb
196
- - test/basic_block_test.rb
197
- - test/test_helper.rb
198
- - test/phi_test.rb
199
221
  - test/bitcode_test.rb
200
- - test/double_test.rb
201
- - test/instruction_test.rb
202
- - test/equality_test.rb
203
222
  - test/pass_manager_builder_test.rb
204
- - test/generic_value_test.rb
205
- - test/linker_test.rb
206
- - test/comparisons_test.rb
207
- - test/select_test.rb
223
+ - test/equality_test.rb
208
224
  - test/function_test.rb
209
- - test/memory_access_test.rb
210
- - test/struct_test.rb
211
225
  - test/parameter_collection_test.rb
212
- - test/call_test.rb
213
- - test/mcjit_test.rb
214
- - test/vector_test.rb
226
+ - test/memory_access_test.rb
227
+ - test/select_test.rb
228
+ - test/module_test.rb
229
+ - test/test_helper.rb
230
+ - test/comparisons_test.rb
215
231
  - test/target_test.rb
216
- - test/array_test.rb
217
- - test/branch_test.rb
232
+ - test/call_test.rb
218
233
  - test/conversions_test.rb
219
- has_rdoc: yard
234
+ - test/linker_test.rb
235
+ - test/generic_value_test.rb
236
+ - test/phi_test.rb
237
+ - test/mcjit_test.rb