ruby-llvm 3.5.0 → 13.0.1
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 +17 -6
- data/lib/llvm/analysis.rb +2 -0
- data/lib/llvm/analysis_ffi.rb +27 -28
- data/lib/llvm/config.rb +4 -4
- data/lib/llvm/core/bitcode.rb +12 -10
- data/lib/llvm/core/bitcode_ffi.rb +89 -65
- data/lib/llvm/core/builder.rb +4 -3
- data/lib/llvm/core/context.rb +3 -1
- data/lib/llvm/core/module.rb +2 -0
- data/lib/llvm/core/pass_manager.rb +6 -2
- data/lib/llvm/core/type.rb +9 -2
- data/lib/llvm/core/value.rb +154 -24
- data/lib/llvm/core.rb +47 -2
- data/lib/llvm/core_ffi.rb +3863 -3730
- data/lib/llvm/execution_engine.rb +39 -35
- data/lib/llvm/execution_engine_ffi.rb +238 -276
- data/lib/llvm/linker.rb +3 -14
- data/lib/llvm/linker_ffi.rb +22 -26
- data/lib/llvm/support.rb +2 -0
- data/lib/llvm/target.rb +11 -15
- data/lib/llvm/target_ffi.rb +301 -293
- data/lib/llvm/transforms/builder.rb +3 -1
- data/lib/llvm/transforms/builder_ffi.rb +57 -58
- data/lib/llvm/transforms/ipo.rb +3 -1
- data/lib/llvm/transforms/ipo_ffi.rb +59 -60
- data/lib/llvm/transforms/scalar.rb +12 -0
- data/lib/llvm/transforms/scalar_ffi.rb +199 -143
- data/lib/llvm/transforms/vectorize.rb +2 -0
- data/lib/llvm/transforms/vectorize_ffi.rb +15 -16
- data/lib/llvm/version.rb +5 -2
- data/lib/llvm.rb +2 -0
- data/test/array_test.rb +2 -0
- data/test/basic_block_test.rb +2 -1
- data/test/binary_operations_test.rb +2 -0
- data/test/bitcode_test.rb +3 -2
- data/test/branch_test.rb +2 -0
- data/test/call_test.rb +3 -1
- data/test/comparisons_test.rb +2 -0
- data/test/conversions_test.rb +2 -0
- data/test/double_test.rb +10 -7
- data/test/equality_test.rb +4 -4
- data/test/function_test.rb +29 -0
- data/test/generic_value_test.rb +3 -1
- data/test/instruction_test.rb +2 -2
- data/test/integer_test.rb +28 -0
- data/test/ipo_test.rb +3 -1
- data/test/linker_test.rb +2 -9
- data/test/mcjit_test.rb +11 -3
- data/test/memory_access_test.rb +2 -0
- data/test/module_test.rb +18 -1
- data/test/parameter_collection_test.rb +2 -0
- data/test/pass_manager_builder_test.rb +22 -2
- data/test/phi_test.rb +2 -0
- data/test/select_test.rb +2 -0
- data/test/struct_test.rb +2 -0
- data/test/target_test.rb +16 -20
- data/test/test_helper.rb +6 -1
- data/test/type_test.rb +47 -0
- data/test/vector_test.rb +2 -0
- metadata +105 -40
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'llvm'
|
2
4
|
require 'llvm/core'
|
3
5
|
require 'llvm/target'
|
@@ -25,8 +27,8 @@ module LLVM
|
|
25
27
|
@ptr = ptr.read_pointer
|
26
28
|
else
|
27
29
|
C.dispose_message(error)
|
28
|
-
error.autorelease=false
|
29
|
-
raise
|
30
|
+
error.autorelease = false
|
31
|
+
raise "Error creating JIT compiler: #{message}"
|
30
32
|
end
|
31
33
|
end
|
32
34
|
end
|
@@ -63,7 +65,7 @@ module LLVM
|
|
63
65
|
def run_function(fun, *args)
|
64
66
|
FFI::MemoryPointer.new(FFI.type_size(:pointer) * args.size) do |args_ptr|
|
65
67
|
new_values = []
|
66
|
-
args_ptr.write_array_of_pointer
|
68
|
+
args_ptr.write_array_of_pointer(fun.params.zip(args).map do |p, a|
|
67
69
|
if a.kind_of?(GenericValue)
|
68
70
|
a
|
69
71
|
else
|
@@ -71,7 +73,7 @@ module LLVM
|
|
71
73
|
new_values << value
|
72
74
|
value
|
73
75
|
end
|
74
|
-
|
76
|
+
end)
|
75
77
|
result = LLVM::GenericValue.from_ptr(
|
76
78
|
C.run_function(self, fun, args.size, args_ptr))
|
77
79
|
new_values.each(&:dispose)
|
@@ -84,6 +86,10 @@ module LLVM
|
|
84
86
|
C.get_pointer_to_global(self, global)
|
85
87
|
end
|
86
88
|
|
89
|
+
def function_address(name)
|
90
|
+
C.get_function_address(self, name)
|
91
|
+
end
|
92
|
+
|
87
93
|
# Returns a ModuleCollection of all the Modules in the engine.
|
88
94
|
# @return [ModuleCollection]
|
89
95
|
def modules
|
@@ -123,7 +129,7 @@ module LLVM
|
|
123
129
|
message = errorp.read_string unless errorp.null?
|
124
130
|
|
125
131
|
C.dispose_message(error)
|
126
|
-
error.autorelease=false
|
132
|
+
error.autorelease = false
|
127
133
|
|
128
134
|
raise "Error removing module: #{message}"
|
129
135
|
end
|
@@ -166,35 +172,6 @@ module LLVM
|
|
166
172
|
end
|
167
173
|
end
|
168
174
|
|
169
|
-
class JITCompiler < ExecutionEngine
|
170
|
-
# Create a JIT execution engine.
|
171
|
-
#
|
172
|
-
# @note You should call `LLVM.init_jit` before creating an execution engine.
|
173
|
-
#
|
174
|
-
# @param [LLVM::Module] mod module
|
175
|
-
# @param [Hash{Symbol => Object}] options options
|
176
|
-
# @option options [Integer] :opt_level (3) Optimization level
|
177
|
-
# @return [ExecutionEngine] Execution engine
|
178
|
-
def initialize(mod, options = {})
|
179
|
-
# Prior to ruby-llvm 3.4.0, signature is initialize(mod, opt_level = 3)
|
180
|
-
if options.kind_of?(Integer)
|
181
|
-
options = { :opt_level => options }
|
182
|
-
end
|
183
|
-
|
184
|
-
options = {
|
185
|
-
:opt_level => 3,
|
186
|
-
}.merge(options)
|
187
|
-
|
188
|
-
super
|
189
|
-
end
|
190
|
-
|
191
|
-
protected
|
192
|
-
|
193
|
-
def create_execution_engine_for_module(out_ee, mod, out_error, options)
|
194
|
-
C.create_jit_compiler_for_module(out_ee, mod, options[:opt_level], out_error)
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
175
|
class MCJITCompiler < ExecutionEngine
|
199
176
|
# Create a MCJIT execution engine.
|
200
177
|
#
|
@@ -211,7 +188,7 @@ module LLVM
|
|
211
188
|
def initialize(mod, options = {})
|
212
189
|
options = {
|
213
190
|
:opt_level => 2, # LLVMCodeGenLevelDefault
|
214
|
-
:code_model => 0,
|
191
|
+
:code_model => 0,
|
215
192
|
:no_frame_pointer_elim => false,
|
216
193
|
:enable_fast_i_sel => false,
|
217
194
|
# TODO
|
@@ -221,6 +198,31 @@ module LLVM
|
|
221
198
|
super
|
222
199
|
end
|
223
200
|
|
201
|
+
def convert_type(type)
|
202
|
+
case type.kind
|
203
|
+
when :integer
|
204
|
+
if type.width <= 8
|
205
|
+
:int8
|
206
|
+
else
|
207
|
+
"int#{type.width}".to_sym
|
208
|
+
end
|
209
|
+
else
|
210
|
+
type.kind
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
def run_function(fun, *args)
|
215
|
+
args2 = fun.params.map {|e| convert_type(e.type)}
|
216
|
+
ptr = FFI::Pointer.new(function_address(fun.name))
|
217
|
+
raise "Couldn't find function" if ptr.null?
|
218
|
+
|
219
|
+
return_type = convert_type(fun.function_type.return_type)
|
220
|
+
f = FFI::Function.new(return_type, args2, ptr)
|
221
|
+
ret1 = f.call(*args)
|
222
|
+
ret2 = LLVM.make_generic_value(fun.function_type.return_type, ret1)
|
223
|
+
ret2
|
224
|
+
end
|
225
|
+
|
224
226
|
protected
|
225
227
|
|
226
228
|
def create_execution_engine_for_module(out_ee, mod, out_error, options)
|
@@ -237,6 +239,8 @@ module LLVM
|
|
237
239
|
end
|
238
240
|
end
|
239
241
|
|
242
|
+
JITCompiler = MCJITCompiler
|
243
|
+
|
240
244
|
class GenericValue
|
241
245
|
# @private
|
242
246
|
def to_ptr
|