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