ruby-llvm 3.5.0 → 13.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|