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.
Files changed (62) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +21 -4
  3. data/ext/ruby-llvm-support/Rakefile +17 -6
  4. data/lib/llvm/analysis.rb +2 -0
  5. data/lib/llvm/analysis_ffi.rb +27 -28
  6. data/lib/llvm/config.rb +4 -4
  7. data/lib/llvm/core/bitcode.rb +12 -10
  8. data/lib/llvm/core/bitcode_ffi.rb +89 -65
  9. data/lib/llvm/core/builder.rb +4 -3
  10. data/lib/llvm/core/context.rb +3 -1
  11. data/lib/llvm/core/module.rb +2 -0
  12. data/lib/llvm/core/pass_manager.rb +6 -2
  13. data/lib/llvm/core/type.rb +9 -2
  14. data/lib/llvm/core/value.rb +154 -24
  15. data/lib/llvm/core.rb +47 -2
  16. data/lib/llvm/core_ffi.rb +3863 -3730
  17. data/lib/llvm/execution_engine.rb +39 -35
  18. data/lib/llvm/execution_engine_ffi.rb +238 -276
  19. data/lib/llvm/linker.rb +3 -14
  20. data/lib/llvm/linker_ffi.rb +22 -26
  21. data/lib/llvm/support.rb +2 -0
  22. data/lib/llvm/target.rb +11 -15
  23. data/lib/llvm/target_ffi.rb +301 -293
  24. data/lib/llvm/transforms/builder.rb +3 -1
  25. data/lib/llvm/transforms/builder_ffi.rb +57 -58
  26. data/lib/llvm/transforms/ipo.rb +3 -1
  27. data/lib/llvm/transforms/ipo_ffi.rb +59 -60
  28. data/lib/llvm/transforms/scalar.rb +12 -0
  29. data/lib/llvm/transforms/scalar_ffi.rb +199 -143
  30. data/lib/llvm/transforms/vectorize.rb +2 -0
  31. data/lib/llvm/transforms/vectorize_ffi.rb +15 -16
  32. data/lib/llvm/version.rb +5 -2
  33. data/lib/llvm.rb +2 -0
  34. data/test/array_test.rb +2 -0
  35. data/test/basic_block_test.rb +2 -1
  36. data/test/binary_operations_test.rb +2 -0
  37. data/test/bitcode_test.rb +3 -2
  38. data/test/branch_test.rb +2 -0
  39. data/test/call_test.rb +3 -1
  40. data/test/comparisons_test.rb +2 -0
  41. data/test/conversions_test.rb +2 -0
  42. data/test/double_test.rb +10 -7
  43. data/test/equality_test.rb +4 -4
  44. data/test/function_test.rb +29 -0
  45. data/test/generic_value_test.rb +3 -1
  46. data/test/instruction_test.rb +2 -2
  47. data/test/integer_test.rb +28 -0
  48. data/test/ipo_test.rb +3 -1
  49. data/test/linker_test.rb +2 -9
  50. data/test/mcjit_test.rb +11 -3
  51. data/test/memory_access_test.rb +2 -0
  52. data/test/module_test.rb +18 -1
  53. data/test/parameter_collection_test.rb +2 -0
  54. data/test/pass_manager_builder_test.rb +22 -2
  55. data/test/phi_test.rb +2 -0
  56. data/test/select_test.rb +2 -0
  57. data/test/struct_test.rb +2 -0
  58. data/test/target_test.rb +16 -20
  59. data/test/test_helper.rb +6 -1
  60. data/test/type_test.rb +47 -0
  61. data/test/vector_test.rb +2 -0
  62. 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 RuntimeError, "Error creating JIT compiler: #{message}"
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 fun.params.zip(args).map { |p, a|
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, # LLVMCodeModelDefault
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