ruby-llvm-next 10.0.0
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 +7 -0
- data/LICENSE +30 -0
- data/README.md +67 -0
- data/ext/ruby-llvm-support/Rakefile +110 -0
- data/ext/ruby-llvm-support/support.cpp +32 -0
- data/lib/llvm.rb +29 -0
- data/lib/llvm/analysis.rb +49 -0
- data/lib/llvm/analysis_ffi.rb +77 -0
- data/lib/llvm/config.rb +10 -0
- data/lib/llvm/core.rb +97 -0
- data/lib/llvm/core/bitcode.rb +84 -0
- data/lib/llvm/core/bitcode_ffi.rb +132 -0
- data/lib/llvm/core/builder.rb +944 -0
- data/lib/llvm/core/context.rb +24 -0
- data/lib/llvm/core/module.rb +240 -0
- data/lib/llvm/core/pass_manager.rb +80 -0
- data/lib/llvm/core/type.rb +210 -0
- data/lib/llvm/core/value.rb +1005 -0
- data/lib/llvm/core_ffi.rb +6021 -0
- data/lib/llvm/execution_engine.rb +323 -0
- data/lib/llvm/execution_engine_ffi.rb +421 -0
- data/lib/llvm/linker.rb +16 -0
- data/lib/llvm/linker_ffi.rb +44 -0
- data/lib/llvm/support.rb +38 -0
- data/lib/llvm/target.rb +318 -0
- data/lib/llvm/target_ffi.rb +628 -0
- data/lib/llvm/transforms/builder.rb +107 -0
- data/lib/llvm/transforms/builder_ffi.rb +117 -0
- data/lib/llvm/transforms/ipo.rb +78 -0
- data/lib/llvm/transforms/ipo_ffi.rb +127 -0
- data/lib/llvm/transforms/scalar.rb +152 -0
- data/lib/llvm/transforms/scalar_ffi.rb +344 -0
- data/lib/llvm/transforms/vectorize.rb +22 -0
- data/lib/llvm/transforms/vectorize_ffi.rb +38 -0
- data/lib/llvm/version.rb +5 -0
- data/test/array_test.rb +38 -0
- data/test/basic_block_test.rb +87 -0
- data/test/binary_operations_test.rb +58 -0
- data/test/bitcode_test.rb +24 -0
- data/test/branch_test.rb +57 -0
- data/test/call_test.rb +82 -0
- data/test/comparisons_test.rb +66 -0
- data/test/conversions_test.rb +92 -0
- data/test/double_test.rb +34 -0
- data/test/equality_test.rb +89 -0
- data/test/function_test.rb +100 -0
- data/test/generic_value_test.rb +22 -0
- data/test/instruction_test.rb +30 -0
- data/test/ipo_test.rb +53 -0
- data/test/linker_test.rb +37 -0
- data/test/mcjit_test.rb +94 -0
- data/test/memory_access_test.rb +38 -0
- data/test/module_test.rb +93 -0
- data/test/parameter_collection_test.rb +28 -0
- data/test/pass_manager_builder_test.rb +53 -0
- data/test/phi_test.rb +33 -0
- data/test/select_test.rb +22 -0
- data/test/struct_test.rb +98 -0
- data/test/target_test.rb +113 -0
- data/test/test_helper.rb +62 -0
- data/test/type_test.rb +15 -0
- data/test/vector_test.rb +64 -0
- metadata +240 -0
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'llvm'
|
2
|
+
require 'llvm/core'
|
3
|
+
require 'llvm/transforms/builder_ffi'
|
4
|
+
|
5
|
+
module LLVM
|
6
|
+
class PassManagerBuilder
|
7
|
+
include PointerIdentity
|
8
|
+
|
9
|
+
attr_reader :size_level
|
10
|
+
attr_reader :opt_level
|
11
|
+
attr_reader :unit_at_a_time
|
12
|
+
attr_reader :unroll_loops
|
13
|
+
attr_reader :simplify_lib_calls
|
14
|
+
attr_reader :inliner_threshold
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@ptr = C.pass_manager_builder_create
|
18
|
+
|
19
|
+
@size_level = 0
|
20
|
+
@opt_level = 0
|
21
|
+
@unit_at_a_time = false
|
22
|
+
@unroll_loops = false
|
23
|
+
@simplify_lib_calls = false
|
24
|
+
@inliner_threshold = 0
|
25
|
+
end
|
26
|
+
|
27
|
+
def dispose
|
28
|
+
return if @ptr.nil?
|
29
|
+
|
30
|
+
C.pass_manager_builder_dispose(@ptr)
|
31
|
+
@ptr = nil
|
32
|
+
end
|
33
|
+
|
34
|
+
# Specify the basic optimization level.
|
35
|
+
# @param [Integer] level 0 = -O0, 1 = -O1, 2 = -O2, 3 = -O3
|
36
|
+
def opt_level=(level)
|
37
|
+
@opt_level = level.to_i
|
38
|
+
C.pass_manager_builder_set_opt_level(self, @opt_level)
|
39
|
+
end
|
40
|
+
|
41
|
+
# How much we're optimizing for size.
|
42
|
+
# @param [Integer] level 0 = none, 1 = -Os, 2 = -Oz
|
43
|
+
def size_level=(level)
|
44
|
+
@size_level = level.to_i
|
45
|
+
C.pass_manager_builder_set_size_level(self, @size_level)
|
46
|
+
end
|
47
|
+
|
48
|
+
# @param [Boolean] do_unit_at_a_time
|
49
|
+
def unit_at_a_time=(do_unit_at_a_time)
|
50
|
+
@unit_at_a_time = do_unit_at_a_time
|
51
|
+
C.pass_manager_builder_set_disable_unit_at_a_time(self, flag(!@unit_at_a_time))
|
52
|
+
end
|
53
|
+
|
54
|
+
# @param [Boolean] do_unroll
|
55
|
+
def unroll_loops=(do_unroll)
|
56
|
+
@unroll_loops = do_unroll
|
57
|
+
C.pass_manager_builder_set_disable_unroll_loops(self, flag(!@unroll_loops))
|
58
|
+
end
|
59
|
+
|
60
|
+
# @param [Boolean] do_simplify_lib_calls
|
61
|
+
def simplify_lib_calls=(do_simplify_lib_calls)
|
62
|
+
@simplify_lib_calls = do_simplify_lib_calls
|
63
|
+
C.pass_manager_builder_set_disable_simplify_lib_calls(self, flag(!@simplify_lib_calls))
|
64
|
+
end
|
65
|
+
|
66
|
+
# @param [Integer] threshold 0 = -O1, 225 = -O2, 275 = -O3
|
67
|
+
def inliner_threshold=(threshold)
|
68
|
+
@inliner_threshold = threshold
|
69
|
+
C.pass_manager_builder_use_inliner_with_threshold(self, @inliner_threshold)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Populate a pass manager.
|
73
|
+
# @param [PassManager, FunctionPassManager] pass_manager
|
74
|
+
def build(pass_manager)
|
75
|
+
case pass_manager
|
76
|
+
when FunctionPassManager
|
77
|
+
C.pass_manager_builder_populate_function_pass_manager(self, pass_manager)
|
78
|
+
|
79
|
+
when PassManager
|
80
|
+
C.pass_manager_builder_populate_module_pass_manager(self, pass_manager)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Populate an LTO pass manager.
|
85
|
+
# @param [PassManager] pass_manager
|
86
|
+
def build_with_lto(pass_manager, internalize = false, run_inliner = false)
|
87
|
+
if pass_manager.is_a?(FunctionPassManager)
|
88
|
+
raise ArgumentError, "FunctionPassManager does not support LTO"
|
89
|
+
end
|
90
|
+
|
91
|
+
if internalize.kind_of?(Integer) || run_inliner.kind_of?(Integer)
|
92
|
+
warn 'Warning: Passing Integer value to LLVM::PassManagerBuilder#build_with_lto is deprecated.'
|
93
|
+
internalize = !internalize.zero? if internalize.kind_of?(Integer)
|
94
|
+
run_inliner = !run_inliner.zero? if run_inliner.kind_of?(Integer)
|
95
|
+
end
|
96
|
+
|
97
|
+
C.pass_manager_builder_populate_lto_pass_manager(self,
|
98
|
+
pass_manager, flag(internalize), flag(run_inliner))
|
99
|
+
end
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
def flag(boolean)
|
104
|
+
boolean ? 1 : 0
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# Generated by ffi_gen. Please do not change this file by hand.
|
2
|
+
|
3
|
+
require 'ffi'
|
4
|
+
|
5
|
+
module LLVM::C
|
6
|
+
extend FFI::Library
|
7
|
+
ffi_lib ["libLLVM-10.so.1", "LLVM-10"]
|
8
|
+
|
9
|
+
def self.attach_function(name, *_)
|
10
|
+
begin; super; rescue FFI::NotFoundError => e
|
11
|
+
(class << self; self; end).class_eval { define_method(name) { |*_| raise e } }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# (Not documented)
|
16
|
+
class OpaquePassManagerBuilder < FFI::Struct
|
17
|
+
layout :dummy, :char
|
18
|
+
end
|
19
|
+
|
20
|
+
# See llvm::PassManagerBuilder.
|
21
|
+
#
|
22
|
+
# @method pass_manager_builder_create()
|
23
|
+
# @return [OpaquePassManagerBuilder]
|
24
|
+
# @scope class
|
25
|
+
attach_function :pass_manager_builder_create, :LLVMPassManagerBuilderCreate, [], OpaquePassManagerBuilder
|
26
|
+
|
27
|
+
# (Not documented)
|
28
|
+
#
|
29
|
+
# @method pass_manager_builder_dispose(pmb)
|
30
|
+
# @param [OpaquePassManagerBuilder] pmb
|
31
|
+
# @return [nil]
|
32
|
+
# @scope class
|
33
|
+
attach_function :pass_manager_builder_dispose, :LLVMPassManagerBuilderDispose, [OpaquePassManagerBuilder], :void
|
34
|
+
|
35
|
+
# See llvm::PassManagerBuilder::OptLevel.
|
36
|
+
#
|
37
|
+
# @method pass_manager_builder_set_opt_level(pmb, opt_level)
|
38
|
+
# @param [OpaquePassManagerBuilder] pmb
|
39
|
+
# @param [Integer] opt_level
|
40
|
+
# @return [nil]
|
41
|
+
# @scope class
|
42
|
+
attach_function :pass_manager_builder_set_opt_level, :LLVMPassManagerBuilderSetOptLevel, [OpaquePassManagerBuilder, :uint], :void
|
43
|
+
|
44
|
+
# See llvm::PassManagerBuilder::SizeLevel.
|
45
|
+
#
|
46
|
+
# @method pass_manager_builder_set_size_level(pmb, size_level)
|
47
|
+
# @param [OpaquePassManagerBuilder] pmb
|
48
|
+
# @param [Integer] size_level
|
49
|
+
# @return [nil]
|
50
|
+
# @scope class
|
51
|
+
attach_function :pass_manager_builder_set_size_level, :LLVMPassManagerBuilderSetSizeLevel, [OpaquePassManagerBuilder, :uint], :void
|
52
|
+
|
53
|
+
# See llvm::PassManagerBuilder::DisableUnitAtATime.
|
54
|
+
#
|
55
|
+
# @method pass_manager_builder_set_disable_unit_at_a_time(pmb, value)
|
56
|
+
# @param [OpaquePassManagerBuilder] pmb
|
57
|
+
# @param [Integer] value
|
58
|
+
# @return [nil]
|
59
|
+
# @scope class
|
60
|
+
attach_function :pass_manager_builder_set_disable_unit_at_a_time, :LLVMPassManagerBuilderSetDisableUnitAtATime, [OpaquePassManagerBuilder, :int], :void
|
61
|
+
|
62
|
+
# See llvm::PassManagerBuilder::DisableUnrollLoops.
|
63
|
+
#
|
64
|
+
# @method pass_manager_builder_set_disable_unroll_loops(pmb, value)
|
65
|
+
# @param [OpaquePassManagerBuilder] pmb
|
66
|
+
# @param [Integer] value
|
67
|
+
# @return [nil]
|
68
|
+
# @scope class
|
69
|
+
attach_function :pass_manager_builder_set_disable_unroll_loops, :LLVMPassManagerBuilderSetDisableUnrollLoops, [OpaquePassManagerBuilder, :int], :void
|
70
|
+
|
71
|
+
# See llvm::PassManagerBuilder::DisableSimplifyLibCalls
|
72
|
+
#
|
73
|
+
# @method pass_manager_builder_set_disable_simplify_lib_calls(pmb, value)
|
74
|
+
# @param [OpaquePassManagerBuilder] pmb
|
75
|
+
# @param [Integer] value
|
76
|
+
# @return [nil]
|
77
|
+
# @scope class
|
78
|
+
attach_function :pass_manager_builder_set_disable_simplify_lib_calls, :LLVMPassManagerBuilderSetDisableSimplifyLibCalls, [OpaquePassManagerBuilder, :int], :void
|
79
|
+
|
80
|
+
# See llvm::PassManagerBuilder::Inliner.
|
81
|
+
#
|
82
|
+
# @method pass_manager_builder_use_inliner_with_threshold(pmb, threshold)
|
83
|
+
# @param [OpaquePassManagerBuilder] pmb
|
84
|
+
# @param [Integer] threshold
|
85
|
+
# @return [nil]
|
86
|
+
# @scope class
|
87
|
+
attach_function :pass_manager_builder_use_inliner_with_threshold, :LLVMPassManagerBuilderUseInlinerWithThreshold, [OpaquePassManagerBuilder, :uint], :void
|
88
|
+
|
89
|
+
# See llvm::PassManagerBuilder::populateFunctionPassManager.
|
90
|
+
#
|
91
|
+
# @method pass_manager_builder_populate_function_pass_manager(pmb, pm)
|
92
|
+
# @param [OpaquePassManagerBuilder] pmb
|
93
|
+
# @param [FFI::Pointer(PassManagerRef)] pm
|
94
|
+
# @return [nil]
|
95
|
+
# @scope class
|
96
|
+
attach_function :pass_manager_builder_populate_function_pass_manager, :LLVMPassManagerBuilderPopulateFunctionPassManager, [OpaquePassManagerBuilder, :pointer], :void
|
97
|
+
|
98
|
+
# See llvm::PassManagerBuilder::populateModulePassManager.
|
99
|
+
#
|
100
|
+
# @method pass_manager_builder_populate_module_pass_manager(pmb, pm)
|
101
|
+
# @param [OpaquePassManagerBuilder] pmb
|
102
|
+
# @param [FFI::Pointer(PassManagerRef)] pm
|
103
|
+
# @return [nil]
|
104
|
+
# @scope class
|
105
|
+
attach_function :pass_manager_builder_populate_module_pass_manager, :LLVMPassManagerBuilderPopulateModulePassManager, [OpaquePassManagerBuilder, :pointer], :void
|
106
|
+
|
107
|
+
# See llvm::PassManagerBuilder::populateLTOPassManager.
|
108
|
+
#
|
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]
|
115
|
+
# @scope class
|
116
|
+
attach_function :pass_manager_builder_populate_lto_pass_manager, :LLVMPassManagerBuilderPopulateLTOPassManager, [OpaquePassManagerBuilder, :pointer, :int, :int], :void
|
117
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# Interprocedural optimization (IPO)
|
2
|
+
require 'llvm'
|
3
|
+
require 'llvm/core'
|
4
|
+
require 'llvm/transforms/ipo_ffi'
|
5
|
+
|
6
|
+
module LLVM
|
7
|
+
class PassManager
|
8
|
+
# @LLVMpass arg_promotion
|
9
|
+
def arg_promote!
|
10
|
+
C.add_argument_promotion_pass(self)
|
11
|
+
end
|
12
|
+
|
13
|
+
# @LLVMpass const_merge
|
14
|
+
def const_merge!
|
15
|
+
C.add_constant_merge_pass(self)
|
16
|
+
end
|
17
|
+
|
18
|
+
# @LLVMpass dae
|
19
|
+
def dae!
|
20
|
+
C.add_dead_arg_elimination(self)
|
21
|
+
end
|
22
|
+
|
23
|
+
# @LLVMpass function_attrs
|
24
|
+
def fun_attrs!
|
25
|
+
C.add_function_attrs_pass(self)
|
26
|
+
end
|
27
|
+
|
28
|
+
# @LLVMpass inline
|
29
|
+
def inline!
|
30
|
+
C.add_function_inlining_pass(self)
|
31
|
+
end
|
32
|
+
|
33
|
+
# @LLVMpass always_inline
|
34
|
+
def always_inline!
|
35
|
+
C.add_always_inliner_pass(self)
|
36
|
+
end
|
37
|
+
|
38
|
+
# @LLVMpass gdce
|
39
|
+
def gdce!
|
40
|
+
C.add_global_dce_pass(self)
|
41
|
+
end
|
42
|
+
|
43
|
+
# @LLVMpass global_opt
|
44
|
+
def global_opt!
|
45
|
+
C.add_global_optimizer_pass(self)
|
46
|
+
end
|
47
|
+
|
48
|
+
# @LLVMpass ipcp
|
49
|
+
def ipcp!
|
50
|
+
C.add_ip_constant_propagation_pass(self)
|
51
|
+
end
|
52
|
+
|
53
|
+
# @LLVMpass prune_eh
|
54
|
+
def prune_eh!
|
55
|
+
C.add_prune_eh_pass(self)
|
56
|
+
end
|
57
|
+
|
58
|
+
# @LLVMpass ipsccp
|
59
|
+
def ipsccp!
|
60
|
+
C.add_ipsccp_pass(self)
|
61
|
+
end
|
62
|
+
|
63
|
+
# @LLVMpass internalize
|
64
|
+
def internalize!(all_but_main = true)
|
65
|
+
C.add_internalize_pass(self, all_but_main)
|
66
|
+
end
|
67
|
+
|
68
|
+
# @LLVMpass sdp
|
69
|
+
def sdp!
|
70
|
+
C.add_strip_dead_prototypes_pass(self)
|
71
|
+
end
|
72
|
+
|
73
|
+
# @LLVMpass strip
|
74
|
+
def strip!
|
75
|
+
C.add_strip_symbols_pass(self)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
# Generated by ffi_gen. Please do not change this file by hand.
|
2
|
+
|
3
|
+
require 'ffi'
|
4
|
+
|
5
|
+
module LLVM::C
|
6
|
+
extend FFI::Library
|
7
|
+
ffi_lib ["libLLVM-10.so.1", "LLVM-10"]
|
8
|
+
|
9
|
+
def self.attach_function(name, *_)
|
10
|
+
begin; super; rescue FFI::NotFoundError => e
|
11
|
+
(class << self; self; end).class_eval { define_method(name) { |*_| raise e } }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# See llvm::createArgumentPromotionPass function.
|
16
|
+
#
|
17
|
+
# @method add_argument_promotion_pass(pm)
|
18
|
+
# @param [FFI::Pointer(PassManagerRef)] pm
|
19
|
+
# @return [nil]
|
20
|
+
# @scope class
|
21
|
+
attach_function :add_argument_promotion_pass, :LLVMAddArgumentPromotionPass, [:pointer], :void
|
22
|
+
|
23
|
+
# See llvm::createConstantMergePass function.
|
24
|
+
#
|
25
|
+
# @method add_constant_merge_pass(pm)
|
26
|
+
# @param [FFI::Pointer(PassManagerRef)] pm
|
27
|
+
# @return [nil]
|
28
|
+
# @scope class
|
29
|
+
attach_function :add_constant_merge_pass, :LLVMAddConstantMergePass, [:pointer], :void
|
30
|
+
|
31
|
+
# See llvm::createDeadArgEliminationPass function.
|
32
|
+
#
|
33
|
+
# @method add_dead_arg_elimination_pass(pm)
|
34
|
+
# @param [FFI::Pointer(PassManagerRef)] pm
|
35
|
+
# @return [nil]
|
36
|
+
# @scope class
|
37
|
+
attach_function :add_dead_arg_elimination_pass, :LLVMAddDeadArgEliminationPass, [:pointer], :void
|
38
|
+
|
39
|
+
# See llvm::createFunctionAttrsPass function.
|
40
|
+
#
|
41
|
+
# @method add_function_attrs_pass(pm)
|
42
|
+
# @param [FFI::Pointer(PassManagerRef)] pm
|
43
|
+
# @return [nil]
|
44
|
+
# @scope class
|
45
|
+
attach_function :add_function_attrs_pass, :LLVMAddFunctionAttrsPass, [:pointer], :void
|
46
|
+
|
47
|
+
# See llvm::createFunctionInliningPass function.
|
48
|
+
#
|
49
|
+
# @method add_function_inlining_pass(pm)
|
50
|
+
# @param [FFI::Pointer(PassManagerRef)] pm
|
51
|
+
# @return [nil]
|
52
|
+
# @scope class
|
53
|
+
attach_function :add_function_inlining_pass, :LLVMAddFunctionInliningPass, [:pointer], :void
|
54
|
+
|
55
|
+
# See llvm::createAlwaysInlinerPass function.
|
56
|
+
#
|
57
|
+
# @method add_always_inliner_pass(pm)
|
58
|
+
# @param [FFI::Pointer(PassManagerRef)] pm
|
59
|
+
# @return [nil]
|
60
|
+
# @scope class
|
61
|
+
attach_function :add_always_inliner_pass, :LLVMAddAlwaysInlinerPass, [:pointer], :void
|
62
|
+
|
63
|
+
# See llvm::createGlobalDCEPass function.
|
64
|
+
#
|
65
|
+
# @method add_global_dce_pass(pm)
|
66
|
+
# @param [FFI::Pointer(PassManagerRef)] pm
|
67
|
+
# @return [nil]
|
68
|
+
# @scope class
|
69
|
+
attach_function :add_global_dce_pass, :LLVMAddGlobalDCEPass, [:pointer], :void
|
70
|
+
|
71
|
+
# See llvm::createGlobalOptimizerPass function.
|
72
|
+
#
|
73
|
+
# @method add_global_optimizer_pass(pm)
|
74
|
+
# @param [FFI::Pointer(PassManagerRef)] pm
|
75
|
+
# @return [nil]
|
76
|
+
# @scope class
|
77
|
+
attach_function :add_global_optimizer_pass, :LLVMAddGlobalOptimizerPass, [:pointer], :void
|
78
|
+
|
79
|
+
# See llvm::createIPConstantPropagationPass function.
|
80
|
+
#
|
81
|
+
# @method add_ip_constant_propagation_pass(pm)
|
82
|
+
# @param [FFI::Pointer(PassManagerRef)] pm
|
83
|
+
# @return [nil]
|
84
|
+
# @scope class
|
85
|
+
attach_function :add_ip_constant_propagation_pass, :LLVMAddIPConstantPropagationPass, [:pointer], :void
|
86
|
+
|
87
|
+
# See llvm::createPruneEHPass function.
|
88
|
+
#
|
89
|
+
# @method add_prune_eh_pass(pm)
|
90
|
+
# @param [FFI::Pointer(PassManagerRef)] pm
|
91
|
+
# @return [nil]
|
92
|
+
# @scope class
|
93
|
+
attach_function :add_prune_eh_pass, :LLVMAddPruneEHPass, [:pointer], :void
|
94
|
+
|
95
|
+
# See llvm::createIPSCCPPass function.
|
96
|
+
#
|
97
|
+
# @method add_ipsccp_pass(pm)
|
98
|
+
# @param [FFI::Pointer(PassManagerRef)] pm
|
99
|
+
# @return [nil]
|
100
|
+
# @scope class
|
101
|
+
attach_function :add_ipsccp_pass, :LLVMAddIPSCCPPass, [:pointer], :void
|
102
|
+
|
103
|
+
# See llvm::createInternalizePass function.
|
104
|
+
#
|
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]
|
109
|
+
# @scope class
|
110
|
+
attach_function :add_internalize_pass, :LLVMAddInternalizePass, [:pointer, :uint], :void
|
111
|
+
|
112
|
+
# See llvm::createStripDeadPrototypesPass function.
|
113
|
+
#
|
114
|
+
# @method add_strip_dead_prototypes_pass(pm)
|
115
|
+
# @param [FFI::Pointer(PassManagerRef)] pm
|
116
|
+
# @return [nil]
|
117
|
+
# @scope class
|
118
|
+
attach_function :add_strip_dead_prototypes_pass, :LLVMAddStripDeadPrototypesPass, [:pointer], :void
|
119
|
+
|
120
|
+
# See llvm::createStripSymbolsPass function.
|
121
|
+
#
|
122
|
+
# @method add_strip_symbols_pass(pm)
|
123
|
+
# @param [FFI::Pointer(PassManagerRef)] pm
|
124
|
+
# @return [nil]
|
125
|
+
# @scope class
|
126
|
+
attach_function :add_strip_symbols_pass, :LLVMAddStripSymbolsPass, [:pointer], :void
|
127
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require 'llvm'
|
2
|
+
require 'llvm/core'
|
3
|
+
require 'llvm/transforms/scalar_ffi'
|
4
|
+
|
5
|
+
module LLVM
|
6
|
+
class PassManager
|
7
|
+
# @LLVMpass adce
|
8
|
+
def adce!
|
9
|
+
C.add_aggressive_dce_pass(self)
|
10
|
+
end
|
11
|
+
|
12
|
+
# @LLVMpass simplifycfg
|
13
|
+
def simplifycfg!
|
14
|
+
C.add_cfg_simplification_pass(self)
|
15
|
+
end
|
16
|
+
|
17
|
+
# @LLVMpass dse
|
18
|
+
def dse!
|
19
|
+
C.add_dead_store_elimination_pass(self)
|
20
|
+
end
|
21
|
+
|
22
|
+
# @LLVMpass gvn
|
23
|
+
def gvn!
|
24
|
+
C.add_gvn_pass(self)
|
25
|
+
end
|
26
|
+
|
27
|
+
# @LLVMpass indvars
|
28
|
+
def indvars!
|
29
|
+
C.add_ind_var_simplify_pass(self)
|
30
|
+
end
|
31
|
+
|
32
|
+
# @LLVMpass instcombine
|
33
|
+
def instcombine!
|
34
|
+
C.add_instruction_combining_pass(self)
|
35
|
+
end
|
36
|
+
|
37
|
+
# @LLVMpass jump-threading
|
38
|
+
def jump_threading!
|
39
|
+
C.add_jump_threading_pass(self)
|
40
|
+
end
|
41
|
+
|
42
|
+
# @LLVMpass licm
|
43
|
+
def licm!
|
44
|
+
C.add_licm_pass(self)
|
45
|
+
end
|
46
|
+
|
47
|
+
# @LLVMpass loop-deletion
|
48
|
+
def loop_deletion!
|
49
|
+
C.add_loop_deletion_pass(self)
|
50
|
+
end
|
51
|
+
|
52
|
+
# @LLVMpass loop-idiom
|
53
|
+
def loop_idiom!
|
54
|
+
C.add_loop_idiom_pass(self)
|
55
|
+
end
|
56
|
+
|
57
|
+
# @LLVMpass loop-rotate
|
58
|
+
def loop_rotate!
|
59
|
+
C.add_loop_rotate_pass(self)
|
60
|
+
end
|
61
|
+
|
62
|
+
# @LLVMpass loop-unroll
|
63
|
+
def loop_unroll!
|
64
|
+
C.add_loop_unroll_pass(self)
|
65
|
+
end
|
66
|
+
|
67
|
+
# @LLVMpass loop-unswitch
|
68
|
+
def loop_unswitch!
|
69
|
+
C.add_loop_unswitch_pass(self)
|
70
|
+
end
|
71
|
+
|
72
|
+
# @LLVMpass memcpyopt
|
73
|
+
def memcpyopt!
|
74
|
+
C.add_mem_cpy_opt_pass(self)
|
75
|
+
end
|
76
|
+
|
77
|
+
# @LLVMpass mem2reg
|
78
|
+
def mem2reg!
|
79
|
+
C.add_promote_memory_to_register_pass(self)
|
80
|
+
end
|
81
|
+
|
82
|
+
# @LLVMpass reassociate
|
83
|
+
def reassociate!
|
84
|
+
C.add_reassociate_pass(self)
|
85
|
+
end
|
86
|
+
|
87
|
+
# @LLVMpass sccp
|
88
|
+
def sccp!
|
89
|
+
C.add_sccp_pass(self)
|
90
|
+
end
|
91
|
+
|
92
|
+
# @LLVMpass scalarrepl
|
93
|
+
def scalarrepl!
|
94
|
+
C.add_scalar_repl_aggregates_pass(self)
|
95
|
+
end
|
96
|
+
|
97
|
+
# @LLVMpass scalarrepl
|
98
|
+
def scalarrepl_ssa!
|
99
|
+
C.add_scalar_repl_aggregates_pass_ssa(self)
|
100
|
+
end
|
101
|
+
|
102
|
+
# @LLVMpass scalarrepl
|
103
|
+
def scalarrepl_threshold!(threshold)
|
104
|
+
C.add_scalar_repl_aggregates_pass(self, threshold)
|
105
|
+
end
|
106
|
+
|
107
|
+
# @LLVMpass simplify-libcalls
|
108
|
+
def simplify_libcalls!
|
109
|
+
C.add_simplify_lib_calls_pass(self)
|
110
|
+
end
|
111
|
+
|
112
|
+
# @LLVMpass tailcallelim
|
113
|
+
def tailcallelim!
|
114
|
+
C.add_tail_call_elimination_pass(self)
|
115
|
+
end
|
116
|
+
|
117
|
+
# @LLVMpass constprop
|
118
|
+
def constprop!
|
119
|
+
C.add_constant_propagation_pass(self)
|
120
|
+
end
|
121
|
+
|
122
|
+
# @LLVMpass reg2mem
|
123
|
+
def reg2mem!
|
124
|
+
C.add_demote_memory_to_register_pass(self)
|
125
|
+
end
|
126
|
+
|
127
|
+
# @LLVMpass cvprop
|
128
|
+
def cvprop!
|
129
|
+
C.add_correlated_value_propagation_pass(self)
|
130
|
+
end
|
131
|
+
|
132
|
+
# @LLVMpass early-cse
|
133
|
+
def early_cse!
|
134
|
+
C.add_early_cse_pass(self)
|
135
|
+
end
|
136
|
+
|
137
|
+
# @LLVMpass lower-expect
|
138
|
+
def lower_expect!
|
139
|
+
C.add_lower_expect_intrinsic_pass(self)
|
140
|
+
end
|
141
|
+
|
142
|
+
# @LLVMpass tbaa
|
143
|
+
def tbaa!
|
144
|
+
C.add_type_based_alias_analysis_pass(self)
|
145
|
+
end
|
146
|
+
|
147
|
+
# @LLVMpass basicaa
|
148
|
+
def basicaa!
|
149
|
+
C.add_basic_alias_analysis_pass(self)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|