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/transforms/builder_ffi'
@@ -83,7 +85,7 @@ module LLVM
83
85
 
84
86
  # Populate an LTO pass manager.
85
87
  # @param [PassManager] pass_manager
86
- def build_with_lto(pass_manager, internalize=false, run_inliner=false)
88
+ def build_with_lto(pass_manager, internalize = false, run_inliner = false)
87
89
  if pass_manager.is_a?(FunctionPassManager)
88
90
  raise ArgumentError, "FunctionPassManager does not support LTO"
89
91
  end
@@ -4,115 +4,114 @@ require 'ffi'
4
4
 
5
5
  module LLVM::C
6
6
  extend FFI::Library
7
- ffi_lib ["libLLVM-3.5.so.1", "LLVM-3.5"]
8
-
7
+ ffi_lib ["libLLVM-13.so.1", "libLLVM.so.13", "LLVM-13"]
8
+
9
9
  def self.attach_function(name, *_)
10
10
  begin; super; rescue FFI::NotFoundError => e
11
11
  (class << self; self; end).class_eval { define_method(name) { |*_| raise e } }
12
12
  end
13
13
  end
14
-
14
+
15
15
  # (Not documented)
16
16
  class OpaquePassManagerBuilder < FFI::Struct
17
17
  layout :dummy, :char
18
18
  end
19
-
19
+
20
20
  # See llvm::PassManagerBuilder.
21
- #
21
+ #
22
22
  # @method pass_manager_builder_create()
23
- # @return [OpaquePassManagerBuilder]
23
+ # @return [OpaquePassManagerBuilder]
24
24
  # @scope class
25
25
  attach_function :pass_manager_builder_create, :LLVMPassManagerBuilderCreate, [], OpaquePassManagerBuilder
26
-
26
+
27
27
  # (Not documented)
28
- #
28
+ #
29
29
  # @method pass_manager_builder_dispose(pmb)
30
- # @param [OpaquePassManagerBuilder] pmb
31
- # @return [nil]
30
+ # @param [OpaquePassManagerBuilder] pmb
31
+ # @return [nil]
32
32
  # @scope class
33
33
  attach_function :pass_manager_builder_dispose, :LLVMPassManagerBuilderDispose, [OpaquePassManagerBuilder], :void
34
-
34
+
35
35
  # See llvm::PassManagerBuilder::OptLevel.
36
- #
36
+ #
37
37
  # @method pass_manager_builder_set_opt_level(pmb, opt_level)
38
- # @param [OpaquePassManagerBuilder] pmb
39
- # @param [Integer] opt_level
40
- # @return [nil]
38
+ # @param [OpaquePassManagerBuilder] pmb
39
+ # @param [Integer] opt_level
40
+ # @return [nil]
41
41
  # @scope class
42
42
  attach_function :pass_manager_builder_set_opt_level, :LLVMPassManagerBuilderSetOptLevel, [OpaquePassManagerBuilder, :uint], :void
43
-
43
+
44
44
  # See llvm::PassManagerBuilder::SizeLevel.
45
- #
45
+ #
46
46
  # @method pass_manager_builder_set_size_level(pmb, size_level)
47
- # @param [OpaquePassManagerBuilder] pmb
48
- # @param [Integer] size_level
49
- # @return [nil]
47
+ # @param [OpaquePassManagerBuilder] pmb
48
+ # @param [Integer] size_level
49
+ # @return [nil]
50
50
  # @scope class
51
51
  attach_function :pass_manager_builder_set_size_level, :LLVMPassManagerBuilderSetSizeLevel, [OpaquePassManagerBuilder, :uint], :void
52
-
52
+
53
53
  # See llvm::PassManagerBuilder::DisableUnitAtATime.
54
- #
54
+ #
55
55
  # @method pass_manager_builder_set_disable_unit_at_a_time(pmb, value)
56
- # @param [OpaquePassManagerBuilder] pmb
57
- # @param [Integer] value
58
- # @return [nil]
56
+ # @param [OpaquePassManagerBuilder] pmb
57
+ # @param [Integer] value
58
+ # @return [nil]
59
59
  # @scope class
60
60
  attach_function :pass_manager_builder_set_disable_unit_at_a_time, :LLVMPassManagerBuilderSetDisableUnitAtATime, [OpaquePassManagerBuilder, :int], :void
61
-
61
+
62
62
  # See llvm::PassManagerBuilder::DisableUnrollLoops.
63
- #
63
+ #
64
64
  # @method pass_manager_builder_set_disable_unroll_loops(pmb, value)
65
- # @param [OpaquePassManagerBuilder] pmb
66
- # @param [Integer] value
67
- # @return [nil]
65
+ # @param [OpaquePassManagerBuilder] pmb
66
+ # @param [Integer] value
67
+ # @return [nil]
68
68
  # @scope class
69
69
  attach_function :pass_manager_builder_set_disable_unroll_loops, :LLVMPassManagerBuilderSetDisableUnrollLoops, [OpaquePassManagerBuilder, :int], :void
70
-
70
+
71
71
  # See llvm::PassManagerBuilder::DisableSimplifyLibCalls
72
- #
72
+ #
73
73
  # @method pass_manager_builder_set_disable_simplify_lib_calls(pmb, value)
74
- # @param [OpaquePassManagerBuilder] pmb
75
- # @param [Integer] value
76
- # @return [nil]
74
+ # @param [OpaquePassManagerBuilder] pmb
75
+ # @param [Integer] value
76
+ # @return [nil]
77
77
  # @scope class
78
78
  attach_function :pass_manager_builder_set_disable_simplify_lib_calls, :LLVMPassManagerBuilderSetDisableSimplifyLibCalls, [OpaquePassManagerBuilder, :int], :void
79
-
79
+
80
80
  # See llvm::PassManagerBuilder::Inliner.
81
- #
81
+ #
82
82
  # @method pass_manager_builder_use_inliner_with_threshold(pmb, threshold)
83
- # @param [OpaquePassManagerBuilder] pmb
84
- # @param [Integer] threshold
85
- # @return [nil]
83
+ # @param [OpaquePassManagerBuilder] pmb
84
+ # @param [Integer] threshold
85
+ # @return [nil]
86
86
  # @scope class
87
87
  attach_function :pass_manager_builder_use_inliner_with_threshold, :LLVMPassManagerBuilderUseInlinerWithThreshold, [OpaquePassManagerBuilder, :uint], :void
88
-
88
+
89
89
  # See llvm::PassManagerBuilder::populateFunctionPassManager.
90
- #
90
+ #
91
91
  # @method pass_manager_builder_populate_function_pass_manager(pmb, pm)
92
- # @param [OpaquePassManagerBuilder] pmb
93
- # @param [FFI::Pointer(PassManagerRef)] pm
94
- # @return [nil]
92
+ # @param [OpaquePassManagerBuilder] pmb
93
+ # @param [FFI::Pointer(PassManagerRef)] pm
94
+ # @return [nil]
95
95
  # @scope class
96
96
  attach_function :pass_manager_builder_populate_function_pass_manager, :LLVMPassManagerBuilderPopulateFunctionPassManager, [OpaquePassManagerBuilder, :pointer], :void
97
-
97
+
98
98
  # See llvm::PassManagerBuilder::populateModulePassManager.
99
- #
99
+ #
100
100
  # @method pass_manager_builder_populate_module_pass_manager(pmb, pm)
101
- # @param [OpaquePassManagerBuilder] pmb
102
- # @param [FFI::Pointer(PassManagerRef)] pm
103
- # @return [nil]
101
+ # @param [OpaquePassManagerBuilder] pmb
102
+ # @param [FFI::Pointer(PassManagerRef)] pm
103
+ # @return [nil]
104
104
  # @scope class
105
105
  attach_function :pass_manager_builder_populate_module_pass_manager, :LLVMPassManagerBuilderPopulateModulePassManager, [OpaquePassManagerBuilder, :pointer], :void
106
-
106
+
107
107
  # See llvm::PassManagerBuilder::populateLTOPassManager.
108
- #
108
+ #
109
109
  # @method pass_manager_builder_populate_lto_pass_manager(pmb, pm, internalize, run_inliner)
110
- # @param [OpaquePassManagerBuilder] pmb
111
- # @param [FFI::Pointer(PassManagerRef)] pm
112
- # @param [Integer] internalize
113
- # @param [Integer] run_inliner
114
- # @return [nil]
110
+ # @param [OpaquePassManagerBuilder] pmb
111
+ # @param [FFI::Pointer(PassManagerRef)] pm
112
+ # @param [Integer] internalize
113
+ # @param [Integer] run_inliner
114
+ # @return [nil]
115
115
  # @scope class
116
116
  attach_function :pass_manager_builder_populate_lto_pass_manager, :LLVMPassManagerBuilderPopulateLTOPassManager, [OpaquePassManagerBuilder, :pointer, :int, :int], :void
117
-
118
117
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Interprocedural optimization (IPO)
2
4
  require 'llvm'
3
5
  require 'llvm/core'
@@ -61,7 +63,7 @@ module LLVM
61
63
  end
62
64
 
63
65
  # @LLVMpass internalize
64
- def internalize!(all_but_main=true)
66
+ def internalize!(all_but_main = true)
65
67
  C.add_internalize_pass(self, all_but_main)
66
68
  end
67
69
 
@@ -4,125 +4,124 @@ require 'ffi'
4
4
 
5
5
  module LLVM::C
6
6
  extend FFI::Library
7
- ffi_lib ["libLLVM-3.5.so.1", "LLVM-3.5"]
8
-
7
+ ffi_lib ["libLLVM-13.so.1", "libLLVM.so.13", "LLVM-13"]
8
+
9
9
  def self.attach_function(name, *_)
10
10
  begin; super; rescue FFI::NotFoundError => e
11
11
  (class << self; self; end).class_eval { define_method(name) { |*_| raise e } }
12
12
  end
13
13
  end
14
-
14
+
15
15
  # See llvm::createArgumentPromotionPass function.
16
- #
16
+ #
17
17
  # @method add_argument_promotion_pass(pm)
18
- # @param [FFI::Pointer(PassManagerRef)] pm
19
- # @return [nil]
18
+ # @param [FFI::Pointer(PassManagerRef)] pm
19
+ # @return [nil]
20
20
  # @scope class
21
21
  attach_function :add_argument_promotion_pass, :LLVMAddArgumentPromotionPass, [:pointer], :void
22
-
22
+
23
23
  # See llvm::createConstantMergePass function.
24
- #
24
+ #
25
25
  # @method add_constant_merge_pass(pm)
26
- # @param [FFI::Pointer(PassManagerRef)] pm
27
- # @return [nil]
26
+ # @param [FFI::Pointer(PassManagerRef)] pm
27
+ # @return [nil]
28
28
  # @scope class
29
29
  attach_function :add_constant_merge_pass, :LLVMAddConstantMergePass, [:pointer], :void
30
-
30
+
31
31
  # See llvm::createDeadArgEliminationPass function.
32
- #
32
+ #
33
33
  # @method add_dead_arg_elimination_pass(pm)
34
- # @param [FFI::Pointer(PassManagerRef)] pm
35
- # @return [nil]
34
+ # @param [FFI::Pointer(PassManagerRef)] pm
35
+ # @return [nil]
36
36
  # @scope class
37
37
  attach_function :add_dead_arg_elimination_pass, :LLVMAddDeadArgEliminationPass, [:pointer], :void
38
-
38
+
39
39
  # See llvm::createFunctionAttrsPass function.
40
- #
40
+ #
41
41
  # @method add_function_attrs_pass(pm)
42
- # @param [FFI::Pointer(PassManagerRef)] pm
43
- # @return [nil]
42
+ # @param [FFI::Pointer(PassManagerRef)] pm
43
+ # @return [nil]
44
44
  # @scope class
45
45
  attach_function :add_function_attrs_pass, :LLVMAddFunctionAttrsPass, [:pointer], :void
46
-
46
+
47
47
  # See llvm::createFunctionInliningPass function.
48
- #
48
+ #
49
49
  # @method add_function_inlining_pass(pm)
50
- # @param [FFI::Pointer(PassManagerRef)] pm
51
- # @return [nil]
50
+ # @param [FFI::Pointer(PassManagerRef)] pm
51
+ # @return [nil]
52
52
  # @scope class
53
53
  attach_function :add_function_inlining_pass, :LLVMAddFunctionInliningPass, [:pointer], :void
54
-
54
+
55
55
  # See llvm::createAlwaysInlinerPass function.
56
- #
56
+ #
57
57
  # @method add_always_inliner_pass(pm)
58
- # @param [FFI::Pointer(PassManagerRef)] pm
59
- # @return [nil]
58
+ # @param [FFI::Pointer(PassManagerRef)] pm
59
+ # @return [nil]
60
60
  # @scope class
61
61
  attach_function :add_always_inliner_pass, :LLVMAddAlwaysInlinerPass, [:pointer], :void
62
-
62
+
63
63
  # See llvm::createGlobalDCEPass function.
64
- #
64
+ #
65
65
  # @method add_global_dce_pass(pm)
66
- # @param [FFI::Pointer(PassManagerRef)] pm
67
- # @return [nil]
66
+ # @param [FFI::Pointer(PassManagerRef)] pm
67
+ # @return [nil]
68
68
  # @scope class
69
69
  attach_function :add_global_dce_pass, :LLVMAddGlobalDCEPass, [:pointer], :void
70
-
70
+
71
71
  # See llvm::createGlobalOptimizerPass function.
72
- #
72
+ #
73
73
  # @method add_global_optimizer_pass(pm)
74
- # @param [FFI::Pointer(PassManagerRef)] pm
75
- # @return [nil]
74
+ # @param [FFI::Pointer(PassManagerRef)] pm
75
+ # @return [nil]
76
76
  # @scope class
77
77
  attach_function :add_global_optimizer_pass, :LLVMAddGlobalOptimizerPass, [:pointer], :void
78
-
78
+
79
79
  # See llvm::createIPConstantPropagationPass function.
80
- #
80
+ #
81
81
  # @method add_ip_constant_propagation_pass(pm)
82
- # @param [FFI::Pointer(PassManagerRef)] pm
83
- # @return [nil]
82
+ # @param [FFI::Pointer(PassManagerRef)] pm
83
+ # @return [nil]
84
84
  # @scope class
85
85
  attach_function :add_ip_constant_propagation_pass, :LLVMAddIPConstantPropagationPass, [:pointer], :void
86
-
86
+
87
87
  # See llvm::createPruneEHPass function.
88
- #
88
+ #
89
89
  # @method add_prune_eh_pass(pm)
90
- # @param [FFI::Pointer(PassManagerRef)] pm
91
- # @return [nil]
90
+ # @param [FFI::Pointer(PassManagerRef)] pm
91
+ # @return [nil]
92
92
  # @scope class
93
93
  attach_function :add_prune_eh_pass, :LLVMAddPruneEHPass, [:pointer], :void
94
-
94
+
95
95
  # See llvm::createIPSCCPPass function.
96
- #
96
+ #
97
97
  # @method add_ipsccp_pass(pm)
98
- # @param [FFI::Pointer(PassManagerRef)] pm
99
- # @return [nil]
98
+ # @param [FFI::Pointer(PassManagerRef)] pm
99
+ # @return [nil]
100
100
  # @scope class
101
101
  attach_function :add_ipsccp_pass, :LLVMAddIPSCCPPass, [:pointer], :void
102
-
102
+
103
103
  # See llvm::createInternalizePass function.
104
- #
104
+ #
105
105
  # @method add_internalize_pass(pass_manager_ref, all_but_main)
106
- # @param [FFI::Pointer(PassManagerRef)] pass_manager_ref
107
- # @param [Integer] all_but_main
108
- # @return [nil]
106
+ # @param [FFI::Pointer(PassManagerRef)] pass_manager_ref
107
+ # @param [Integer] all_but_main
108
+ # @return [nil]
109
109
  # @scope class
110
110
  attach_function :add_internalize_pass, :LLVMAddInternalizePass, [:pointer, :uint], :void
111
-
111
+
112
112
  # See llvm::createStripDeadPrototypesPass function.
113
- #
113
+ #
114
114
  # @method add_strip_dead_prototypes_pass(pm)
115
- # @param [FFI::Pointer(PassManagerRef)] pm
116
- # @return [nil]
115
+ # @param [FFI::Pointer(PassManagerRef)] pm
116
+ # @return [nil]
117
117
  # @scope class
118
118
  attach_function :add_strip_dead_prototypes_pass, :LLVMAddStripDeadPrototypesPass, [:pointer], :void
119
-
119
+
120
120
  # See llvm::createStripSymbolsPass function.
121
- #
121
+ #
122
122
  # @method add_strip_symbols_pass(pm)
123
- # @param [FFI::Pointer(PassManagerRef)] pm
124
- # @return [nil]
123
+ # @param [FFI::Pointer(PassManagerRef)] pm
124
+ # @return [nil]
125
125
  # @scope class
126
126
  attach_function :add_strip_symbols_pass, :LLVMAddStripSymbolsPass, [:pointer], :void
127
-
128
127
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'llvm'
2
4
  require 'llvm/core'
3
5
  require 'llvm/transforms/scalar_ffi'
@@ -148,5 +150,15 @@ module LLVM
148
150
  def basicaa!
149
151
  C.add_basic_alias_analysis_pass(self)
150
152
  end
153
+
154
+ # @LLVMpass mergefunc
155
+ def mergefunc!
156
+ C.add_merge_functions_pass(self)
157
+ end
158
+
159
+ end
160
+
161
+ module C
162
+ attach_function :add_merge_functions_pass, :LLVMAddMergeFunctionsPass, [:pointer], :void
151
163
  end
152
164
  end