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.
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