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.
- 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/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-
|
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
|
data/lib/llvm/transforms/ipo.rb
CHANGED
@@ -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-
|
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
|