ruby-llvm 3.4.2 → 13.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +21 -4
- data/ext/ruby-llvm-support/Rakefile +15 -6
- data/ext/ruby-llvm-support/support.cpp +0 -12
- data/lib/llvm/analysis_ffi.rb +30 -28
- data/lib/llvm/config.rb +4 -4
- data/lib/llvm/core/bitcode.rb +10 -10
- data/lib/llvm/core/bitcode_ffi.rb +92 -70
- data/lib/llvm/core/builder.rb +2 -3
- data/lib/llvm/core/context.rb +1 -1
- data/lib/llvm/core/pass_manager.rb +4 -2
- data/lib/llvm/core/type.rb +2 -2
- data/lib/llvm/core/value.rb +148 -26
- data/lib/llvm/core.rb +45 -2
- data/lib/llvm/core_ffi.rb +4038 -3716
- data/lib/llvm/execution_engine.rb +45 -36
- data/lib/llvm/execution_engine_ffi.rb +245 -272
- data/lib/llvm/linker.rb +2 -19
- data/lib/llvm/linker_ffi.rb +24 -25
- data/lib/llvm/support.rb +0 -8
- data/lib/llvm/target.rb +9 -15
- data/lib/llvm/target_ffi.rb +336 -362
- data/lib/llvm/transforms/builder.rb +1 -1
- data/lib/llvm/transforms/builder_ffi.rb +57 -58
- data/lib/llvm/transforms/ipo.rb +1 -1
- data/lib/llvm/transforms/ipo_ffi.rb +60 -61
- data/lib/llvm/transforms/scalar_ffi.rb +208 -136
- data/lib/llvm/transforms/vectorize_ffi.rb +15 -16
- data/lib/llvm/version.rb +3 -2
- data/lib/llvm.rb +0 -6
- data/test/basic_block_test.rb +0 -1
- data/test/bitcode_test.rb +1 -2
- data/test/call_test.rb +1 -1
- data/test/double_test.rb +8 -7
- data/test/equality_test.rb +2 -4
- data/test/function_test.rb +27 -0
- data/test/generic_value_test.rb +1 -1
- data/test/instruction_test.rb +0 -2
- data/test/ipo_test.rb +1 -1
- data/test/linker_test.rb +0 -9
- data/test/mcjit_test.rb +14 -1
- data/test/module_test.rb +20 -1
- data/test/pass_manager_builder_test.rb +1 -2
- data/test/target_test.rb +8 -24
- data/test/test_helper.rb +4 -1
- metadata +103 -41
- data/lib/llvm/support_ffi.rb +0 -23
data/test/instruction_test.rb
CHANGED
data/test/ipo_test.rb
CHANGED
data/test/linker_test.rb
CHANGED
@@ -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
|
data/test/mcjit_test.rb
CHANGED
@@ -35,6 +35,9 @@ class MCJITTestCase < Minitest::Test
|
|
35
35
|
|
36
36
|
engine = LLVM::MCJITCompiler.new(mod, :opt_level => 0)
|
37
37
|
|
38
|
+
# TODO: fix or replace find_function
|
39
|
+
skip
|
40
|
+
|
38
41
|
['foo', :foo].each do |name|
|
39
42
|
engine.functions[name].tap do |fun|
|
40
43
|
assert fun, "function named #{name.inspect}"
|
@@ -77,11 +80,21 @@ class MCJITTestCase < Minitest::Test
|
|
77
80
|
assert_equal engine.modules, ret, '#<< returns self'
|
78
81
|
end
|
79
82
|
|
80
|
-
|
83
|
+
# TODO: fix or replace find_function
|
84
|
+
skip
|
85
|
+
|
86
|
+
refute_nil engine.functions[:bar]
|
81
87
|
engine.modules.delete(mod2).tap do |ret|
|
82
88
|
assert_instance_of LLVM::Module, ret, '#delete returns module'
|
83
89
|
assert_equal mod2, ret
|
84
90
|
end
|
85
91
|
assert_nil engine.functions[:bar]
|
86
92
|
end
|
93
|
+
|
94
|
+
def test_accessors
|
95
|
+
main_mod = LLVM::Module.new('main')
|
96
|
+
engine = LLVM::MCJITCompiler.new(main_mod, :opt_level => 0)
|
97
|
+
assert_match(/^e-/, engine.data_layout.to_s)
|
98
|
+
assert_match(/gnu/, engine.target_machine.triple)
|
99
|
+
end
|
87
100
|
end
|
data/test/module_test.rb
CHANGED
@@ -33,6 +33,10 @@ class ModuleTestCase < Minitest::Test
|
|
33
33
|
var.unnamed_addr = true
|
34
34
|
assert var.unnamed_addr?
|
35
35
|
|
36
|
+
assert (var.dll_storage_class == :default)
|
37
|
+
var.dll_storage_class = :dll_import
|
38
|
+
assert (var.dll_storage_class == :dll_import)
|
39
|
+
|
36
40
|
# global_constant
|
37
41
|
assert !var.global_constant?
|
38
42
|
var.global_constant = true
|
@@ -50,7 +54,8 @@ class ModuleTestCase < Minitest::Test
|
|
50
54
|
|
51
55
|
def test_to_s
|
52
56
|
mod = LLVM::Module.new('test_print')
|
53
|
-
assert_equal mod.to_s,
|
57
|
+
assert_equal mod.to_s,
|
58
|
+
"; ModuleID = 'test_print'\nsource_filename = \"test_print\"\n"
|
54
59
|
end
|
55
60
|
|
56
61
|
def test_dump
|
@@ -71,4 +76,18 @@ class ModuleTestCase < Minitest::Test
|
|
71
76
|
end
|
72
77
|
end
|
73
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
|
+
|
74
93
|
end
|
@@ -7,8 +7,7 @@ class PassManagerBuilderTest < Minitest::Test
|
|
7
7
|
LLVM.init_jit
|
8
8
|
@builder = LLVM::PassManagerBuilder.new
|
9
9
|
|
10
|
-
|
11
|
-
@pass_manager = LLVM::PassManager.new(machine)
|
10
|
+
@pass_manager = LLVM::PassManager.new
|
12
11
|
end
|
13
12
|
|
14
13
|
def teardown
|
data/test/target_test.rb
CHANGED
@@ -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-p:32:32:32-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f16:16:16-f32:32:32-f64:32:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32', layout.to_s
|
62
59
|
end
|
63
60
|
|
64
61
|
def test_emit
|
@@ -74,42 +71,29 @@ class TargetTestCase < Minitest::Test
|
|
74
71
|
|
75
72
|
Tempfile.open('emit') do |tmp|
|
76
73
|
mach.emit(mod, tmp.path)
|
77
|
-
assert_match
|
74
|
+
assert_match(/xorl\t%eax, %eax/, tmp.read)
|
78
75
|
end
|
79
76
|
|
77
|
+
skip "This changes from LLVM 11 to 13"
|
80
78
|
Tempfile.open('emit') do |tmp|
|
81
79
|
mach.emit(mod, tmp.path, :object)
|
82
|
-
assert_match
|
80
|
+
assert_match(/\x66\x31\xc0/, File.read(tmp.path, mode: 'rb'))
|
83
81
|
end
|
84
82
|
end
|
85
83
|
|
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:64:64:64'
|
97
|
-
assert_equal 'e-p:64:64:64', mod.data_layout
|
98
|
-
end
|
99
|
-
|
100
84
|
def test_data_layout
|
101
85
|
layout_be = LLVM::TargetDataLayout.new('E')
|
102
86
|
assert_equal :big_endian, layout_be.byte_order
|
103
87
|
|
104
|
-
desc = "e-p:
|
88
|
+
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
89
|
layout = LLVM::TargetDataLayout.new(desc)
|
106
90
|
|
107
91
|
assert_equal desc, layout.to_s
|
108
92
|
assert_equal :little_endian, layout.byte_order
|
109
|
-
assert_equal
|
110
|
-
assert_equal
|
111
|
-
assert_equal LLVM::
|
112
|
-
assert_equal LLVM::
|
93
|
+
assert_equal 4, layout.pointer_size
|
94
|
+
assert_equal 4, layout.pointer_size(0)
|
95
|
+
assert_equal LLVM::Int32.type, layout.int_ptr_type
|
96
|
+
assert_equal LLVM::Int32.type, layout.int_ptr_type(0)
|
113
97
|
|
114
98
|
assert_equal 19, layout.bit_size_of(LLVM::Int19.type)
|
115
99
|
assert_equal 3, layout.storage_size_of(LLVM::Int19.type)
|
data/test/test_helper.rb
CHANGED
@@ -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::
|
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,134 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-llvm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 13.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
+
- Jesse Johnson
|
7
8
|
- Jeremy Voorhis
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2021-10-21 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
15
|
+
name: ffi
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
16
17
|
requirements:
|
17
18
|
- - "~>"
|
18
19
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
20
|
+
version: 1.13.1
|
20
21
|
type: :runtime
|
21
22
|
prerelease: false
|
22
23
|
version_requirements: !ruby/object:Gem::Requirement
|
23
24
|
requirements:
|
24
25
|
- - "~>"
|
25
26
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
27
|
+
version: 1.13.1
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
29
|
+
name: rake
|
29
30
|
requirement: !ruby/object:Gem::Requirement
|
30
31
|
requirements:
|
31
|
-
- - "
|
32
|
+
- - ">="
|
32
33
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
+
version: '12'
|
35
|
+
- - "<"
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '14'
|
34
38
|
type: :runtime
|
35
39
|
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '12'
|
45
|
+
- - "<"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '14'
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: ffi_gen
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.2.0
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
36
57
|
version_requirements: !ruby/object:Gem::Requirement
|
37
58
|
requirements:
|
38
59
|
- - "~>"
|
39
60
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.
|
61
|
+
version: 1.2.0
|
41
62
|
- !ruby/object:Gem::Dependency
|
42
63
|
name: minitest
|
43
64
|
requirement: !ruby/object:Gem::Requirement
|
44
65
|
requirements:
|
45
66
|
- - "~>"
|
46
67
|
- !ruby/object:Gem::Version
|
47
|
-
version: 5.
|
68
|
+
version: 5.14.1
|
48
69
|
type: :development
|
49
70
|
prerelease: false
|
50
71
|
version_requirements: !ruby/object:Gem::Requirement
|
51
72
|
requirements:
|
52
73
|
- - "~>"
|
53
74
|
- !ruby/object:Gem::Version
|
54
|
-
version: 5.
|
75
|
+
version: 5.14.1
|
55
76
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
77
|
+
name: minitest-reporters
|
78
|
+
requirement: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.4.2
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.4.2
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
name: rubocop
|
57
92
|
requirement: !ruby/object:Gem::Requirement
|
58
93
|
requirements:
|
59
94
|
- - "~>"
|
60
95
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.1
|
96
|
+
version: 1.22.1
|
62
97
|
type: :development
|
63
98
|
prerelease: false
|
64
99
|
version_requirements: !ruby/object:Gem::Requirement
|
65
100
|
requirements:
|
66
101
|
- - "~>"
|
67
102
|
- !ruby/object:Gem::Version
|
68
|
-
version: 1.1
|
103
|
+
version: 1.22.1
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
name: rubocop-minitest
|
106
|
+
requirement: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
type: :development
|
112
|
+
prerelease: false
|
113
|
+
version_requirements: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
- !ruby/object:Gem::Dependency
|
119
|
+
name: rubocop-performance
|
120
|
+
requirement: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
type: :development
|
126
|
+
prerelease: false
|
127
|
+
version_requirements: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
69
132
|
- !ruby/object:Gem::Dependency
|
70
133
|
name: simplecov
|
71
134
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,17 +149,19 @@ dependencies:
|
|
86
149
|
requirements:
|
87
150
|
- - "~>"
|
88
151
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.8
|
152
|
+
version: 0.9.8
|
90
153
|
type: :development
|
91
154
|
prerelease: false
|
92
155
|
version_requirements: !ruby/object:Gem::Requirement
|
93
156
|
requirements:
|
94
157
|
- - "~>"
|
95
158
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.8
|
159
|
+
version: 0.9.8
|
97
160
|
description: Ruby-LLVM is a Ruby language binding to the LLVM compiler infrastructure
|
98
161
|
library.
|
99
|
-
email:
|
162
|
+
email:
|
163
|
+
- jesse@hightechsorcery.com
|
164
|
+
- jvoorhis@gmail.com
|
100
165
|
executables: []
|
101
166
|
extensions:
|
102
167
|
- ext/ruby-llvm-support/Rakefile
|
@@ -127,7 +192,6 @@ files:
|
|
127
192
|
- lib/llvm/linker.rb
|
128
193
|
- lib/llvm/linker_ffi.rb
|
129
194
|
- lib/llvm/support.rb
|
130
|
-
- lib/llvm/support_ffi.rb
|
131
195
|
- lib/llvm/target.rb
|
132
196
|
- lib/llvm/target_ffi.rb
|
133
197
|
- lib/llvm/transforms/builder.rb
|
@@ -175,46 +239,44 @@ require_paths:
|
|
175
239
|
- lib
|
176
240
|
required_ruby_version: !ruby/object:Gem::Requirement
|
177
241
|
requirements:
|
178
|
-
- -
|
242
|
+
- - '='
|
179
243
|
- !ruby/object:Gem::Version
|
180
|
-
version: '
|
244
|
+
version: '2.7'
|
181
245
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
182
246
|
requirements:
|
183
247
|
- - ">="
|
184
248
|
- !ruby/object:Gem::Version
|
185
249
|
version: '0'
|
186
250
|
requirements: []
|
187
|
-
|
188
|
-
rubygems_version: 2.4.1
|
251
|
+
rubygems_version: 3.1.2
|
189
252
|
signing_key:
|
190
253
|
specification_version: 4
|
191
254
|
summary: LLVM bindings for Ruby
|
192
255
|
test_files:
|
256
|
+
- test/double_test.rb
|
193
257
|
- test/type_test.rb
|
258
|
+
- test/basic_block_test.rb
|
259
|
+
- test/struct_test.rb
|
260
|
+
- test/array_test.rb
|
261
|
+
- test/vector_test.rb
|
262
|
+
- test/instruction_test.rb
|
194
263
|
- test/ipo_test.rb
|
264
|
+
- test/branch_test.rb
|
195
265
|
- test/binary_operations_test.rb
|
196
|
-
- test/module_test.rb
|
197
|
-
- test/basic_block_test.rb
|
198
|
-
- test/test_helper.rb
|
199
|
-
- test/phi_test.rb
|
200
266
|
- test/bitcode_test.rb
|
201
|
-
- test/double_test.rb
|
202
|
-
- test/instruction_test.rb
|
203
|
-
- test/equality_test.rb
|
204
267
|
- test/pass_manager_builder_test.rb
|
205
|
-
- test/
|
206
|
-
- test/linker_test.rb
|
207
|
-
- test/comparisons_test.rb
|
208
|
-
- test/select_test.rb
|
268
|
+
- test/equality_test.rb
|
209
269
|
- test/function_test.rb
|
210
|
-
- test/memory_access_test.rb
|
211
|
-
- test/struct_test.rb
|
212
270
|
- test/parameter_collection_test.rb
|
213
|
-
- test/
|
214
|
-
- test/
|
215
|
-
- test/
|
271
|
+
- test/memory_access_test.rb
|
272
|
+
- test/select_test.rb
|
273
|
+
- test/module_test.rb
|
274
|
+
- test/test_helper.rb
|
275
|
+
- test/comparisons_test.rb
|
216
276
|
- test/target_test.rb
|
217
|
-
- test/
|
218
|
-
- test/branch_test.rb
|
277
|
+
- test/call_test.rb
|
219
278
|
- test/conversions_test.rb
|
220
|
-
|
279
|
+
- test/linker_test.rb
|
280
|
+
- test/generic_value_test.rb
|
281
|
+
- test/phi_test.rb
|
282
|
+
- test/mcjit_test.rb
|
data/lib/llvm/support_ffi.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
# Generated by ffi_gen. Please do not change this file by hand.
|
2
|
-
|
3
|
-
require 'ffi'
|
4
|
-
|
5
|
-
module LLVM::C
|
6
|
-
extend FFI::Library
|
7
|
-
ffi_lib 'LLVM-3.4'
|
8
|
-
|
9
|
-
def self.attach_function(name, *_)
|
10
|
-
begin; super; rescue FFI::NotFoundError => e
|
11
|
-
(class << self; self; end).class_eval { define_method(name) { |*_| raise e } }
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
# (Not documented)
|
16
|
-
#
|
17
|
-
# @method load_library_permanently(filename)
|
18
|
-
# @param [String] filename
|
19
|
-
# @return [Integer]
|
20
|
-
# @scope class
|
21
|
-
attach_function :load_library_permanently, :LLVMLoadLibraryPermanently, [:string], :int
|
22
|
-
|
23
|
-
end
|