ruby-llvm 3.0.0.beta → 3.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.
- data/README.rdoc +6 -3
- data/ext/ruby-llvm-support/Rakefile +1 -0
- data/lib/llvm/analysis.rb +8 -18
- data/lib/llvm/analysis_ffi.rb +68 -0
- data/lib/llvm/core.rb +2 -598
- data/lib/llvm/core/bitcode.rb +12 -16
- data/lib/llvm/core/bitcode_ffi.rb +104 -0
- data/lib/llvm/core/builder.rb +85 -84
- data/lib/llvm/core/context.rb +5 -3
- data/lib/llvm/core/module.rb +24 -22
- data/lib/llvm/core/pass_manager.rb +13 -11
- data/lib/llvm/core/type.rb +56 -24
- data/lib/llvm/core/value.rb +98 -99
- data/lib/llvm/core_ffi.rb +4712 -0
- data/lib/llvm/execution_engine.rb +46 -57
- data/lib/llvm/execution_engine_ffi.rb +310 -0
- data/lib/llvm/support.rb +2 -2
- data/lib/llvm/target.rb +2 -4
- data/lib/llvm/target_ffi.rb +217 -0
- data/lib/llvm/transforms/ipo.rb +3 -8
- data/lib/llvm/transforms/ipo_ffi.rb +122 -0
- data/lib/llvm/transforms/scalar.rb +22 -46
- data/lib/llvm/transforms/scalar_ffi.rb +250 -0
- data/lib/llvm/version.rb +1 -1
- data/test/conversions_test.rb +6 -0
- data/test/equality_test.rb +2 -2
- data/test/struct_test.rb +11 -2
- metadata +97 -83
data/lib/llvm/core/context.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module LLVM
|
2
2
|
class Context
|
3
3
|
def initialize(ptr = nil)
|
4
|
-
@ptr = ptr || C.
|
4
|
+
@ptr = ptr || C.context_create()
|
5
5
|
end
|
6
6
|
|
7
7
|
# @private
|
@@ -11,12 +11,14 @@ module LLVM
|
|
11
11
|
|
12
12
|
# Obtains a reference to the global Context.
|
13
13
|
def self.global
|
14
|
-
new(C.
|
14
|
+
new(C.get_global_context())
|
15
15
|
end
|
16
16
|
|
17
17
|
# Diposes the Context.
|
18
18
|
def dispose
|
19
|
-
|
19
|
+
return if @ptr.nil?
|
20
|
+
C.context_dispose(@ptr)
|
21
|
+
@ptr = nil
|
20
22
|
end
|
21
23
|
end
|
22
24
|
end
|
data/lib/llvm/core/module.rb
CHANGED
@@ -8,8 +8,15 @@ module LLVM
|
|
8
8
|
mod
|
9
9
|
end
|
10
10
|
|
11
|
+
# Important: Call #dispose to free backend memory after use, but not when using JITCompiler with this module.
|
11
12
|
def initialize(name)
|
12
|
-
@ptr = C.
|
13
|
+
@ptr = C.module_create_with_name(name)
|
14
|
+
end
|
15
|
+
|
16
|
+
def dispose
|
17
|
+
return if @ptr.nil?
|
18
|
+
C.dispose_module(@ptr)
|
19
|
+
@ptr = nil
|
13
20
|
end
|
14
21
|
|
15
22
|
# @private
|
@@ -44,7 +51,7 @@ module LLVM
|
|
44
51
|
|
45
52
|
# Returns the Type with the given name (symbol or string).
|
46
53
|
def named(name)
|
47
|
-
Type.from_ptr(C.
|
54
|
+
Type.from_ptr(C.get_type_by_name(@module, name.to_s), nil)
|
48
55
|
end
|
49
56
|
|
50
57
|
# Returns the Type with the a name equal to key (symbol or string).
|
@@ -72,37 +79,37 @@ module LLVM
|
|
72
79
|
|
73
80
|
# Adds a GlobalVariable with the given type and name to the collection (symbol or string).
|
74
81
|
def add(ty, name)
|
75
|
-
GlobalVariable.from_ptr(C.
|
82
|
+
GlobalVariable.from_ptr(C.add_global(@module, LLVM::Type(ty), name.to_s))
|
76
83
|
end
|
77
84
|
|
78
85
|
# Returns the GlobalVariable with the given name (symbol or string).
|
79
86
|
def named(name)
|
80
|
-
GlobalValue.from_ptr(C.
|
87
|
+
GlobalValue.from_ptr(C.get_named_global(@module, name.to_s))
|
81
88
|
end
|
82
89
|
|
83
90
|
# Returns the first GlobalVariable in the collection.
|
84
91
|
def first
|
85
|
-
GlobalValue.from_ptr(C.
|
92
|
+
GlobalValue.from_ptr(C.get_first_global(@module))
|
86
93
|
end
|
87
94
|
|
88
95
|
# Returns the last GlobalVariable in the collection.
|
89
96
|
def last
|
90
|
-
GlobalValue.from_ptr(C.
|
97
|
+
GlobalValue.from_ptr(C.get_last_global(@module))
|
91
98
|
end
|
92
99
|
|
93
100
|
# Returns the next GlobalVariable in the collection after global.
|
94
101
|
def next(global)
|
95
|
-
GlobalValue.from_ptr(C.
|
102
|
+
GlobalValue.from_ptr(C.get_next_global(global))
|
96
103
|
end
|
97
104
|
|
98
105
|
# Returns the previous GlobalVariable in the collection before global.
|
99
106
|
def previous(global)
|
100
|
-
GlobalValue.from_ptr(C.
|
107
|
+
GlobalValue.from_ptr(C.get_previous_global(global))
|
101
108
|
end
|
102
109
|
|
103
110
|
# Deletes the GlobalVariable from the collection.
|
104
111
|
def delete(global)
|
105
|
-
C.
|
112
|
+
C.delete_global(global)
|
106
113
|
end
|
107
114
|
|
108
115
|
# Returns the GlobalVariable with a name equal to key (symbol or string) or at key (integer).
|
@@ -149,7 +156,7 @@ module LLVM
|
|
149
156
|
else
|
150
157
|
type = Type.function(*args)
|
151
158
|
end
|
152
|
-
function = Function.from_ptr(C.
|
159
|
+
function = Function.from_ptr(C.add_function(@module, name.to_s, type))
|
153
160
|
|
154
161
|
if block_given?
|
155
162
|
params = (0...function.params.size).map { |i| function.params[i] }
|
@@ -161,32 +168,32 @@ module LLVM
|
|
161
168
|
|
162
169
|
# Returns the Function with the given name (symbol or string).
|
163
170
|
def named(name)
|
164
|
-
Function.from_ptr(C.
|
171
|
+
Function.from_ptr(C.get_named_function(@module, name.to_s))
|
165
172
|
end
|
166
173
|
|
167
174
|
# Returns the first Function in the collection.
|
168
175
|
def first
|
169
|
-
Function.from_ptr(C.
|
176
|
+
Function.from_ptr(C.get_first_function(@module))
|
170
177
|
end
|
171
178
|
|
172
179
|
# Returns the last Function in the collection.
|
173
180
|
def last
|
174
|
-
Function.from_ptr(C.
|
181
|
+
Function.from_ptr(C.get_last_function(@module))
|
175
182
|
end
|
176
183
|
|
177
184
|
# Returns the next Function in the collection after function.
|
178
185
|
def next(function)
|
179
|
-
Function.from_ptr(C.
|
186
|
+
Function.from_ptr(C.get_next_function(function))
|
180
187
|
end
|
181
188
|
|
182
189
|
# Returns the previous Function in the collection before function.
|
183
190
|
def previous(function)
|
184
|
-
Function.from_ptr(C.
|
191
|
+
Function.from_ptr(C.get_previous_function(function))
|
185
192
|
end
|
186
193
|
|
187
194
|
# Deletes the Function from the collection.
|
188
195
|
def delete(function)
|
189
|
-
C.
|
196
|
+
C.delete_function(function)
|
190
197
|
end
|
191
198
|
|
192
199
|
# Returns the Function with a name equal to key (symbol or string) or at key (integer).
|
@@ -216,12 +223,7 @@ module LLVM
|
|
216
223
|
|
217
224
|
# Print the module's IR to stdout.
|
218
225
|
def dump
|
219
|
-
C.
|
220
|
-
end
|
221
|
-
|
222
|
-
# Dispose the module.
|
223
|
-
def dispose
|
224
|
-
C.LLVMDisposeModule(@ptr)
|
226
|
+
C.dump_module(self)
|
225
227
|
end
|
226
228
|
end
|
227
229
|
end
|
@@ -4,9 +4,9 @@ module LLVM
|
|
4
4
|
class PassManager
|
5
5
|
# Creates a new pass manager on the given ExecutionEngine.
|
6
6
|
def initialize(execution_engine)
|
7
|
-
ptr = C.
|
8
|
-
C.
|
9
|
-
C.
|
7
|
+
ptr = C.create_pass_manager()
|
8
|
+
C.add_target_data(
|
9
|
+
C.get_execution_engine_target_data(execution_engine), ptr)
|
10
10
|
@ptr = ptr
|
11
11
|
|
12
12
|
do_initialization
|
@@ -29,13 +29,15 @@ module LLVM
|
|
29
29
|
# @param [LLVM::Module]
|
30
30
|
# @return [true, false] Indicates whether the module was modified.
|
31
31
|
def run(mod)
|
32
|
-
C.
|
32
|
+
C.run_pass_manager(self, mod) != 0
|
33
33
|
end
|
34
34
|
|
35
35
|
# Disposes the pass manager.
|
36
36
|
def dispose
|
37
|
+
return if @ptr.nil?
|
37
38
|
do_finalization
|
38
|
-
C.
|
39
|
+
C.dispose_pass_manager(@ptr)
|
40
|
+
@ptr = nil
|
39
41
|
end
|
40
42
|
|
41
43
|
protected
|
@@ -50,9 +52,9 @@ module LLVM
|
|
50
52
|
class FunctionPassManager < PassManager
|
51
53
|
# Creates a new pass manager on the given ExecutionEngine and Module.
|
52
54
|
def initialize(execution_engine, mod)
|
53
|
-
ptr = C.
|
54
|
-
C.
|
55
|
-
C.
|
55
|
+
ptr = C.create_function_pass_manager_for_module(mod)
|
56
|
+
C.add_target_data(
|
57
|
+
C.get_execution_engine_target_data(execution_engine), ptr)
|
56
58
|
@ptr = ptr
|
57
59
|
end
|
58
60
|
|
@@ -60,17 +62,17 @@ module LLVM
|
|
60
62
|
# @param [LLVM::Function]
|
61
63
|
# @return [true, false] indicates whether the function was modified.
|
62
64
|
def run(fn)
|
63
|
-
C.
|
65
|
+
C.run_function_pass_manager(self, fn) != 0
|
64
66
|
end
|
65
67
|
|
66
68
|
protected
|
67
69
|
|
68
70
|
def do_initialization
|
69
|
-
C.
|
71
|
+
C.initialize_function_pass_manager(self) != 0
|
70
72
|
end
|
71
73
|
|
72
74
|
def do_finalization
|
73
|
-
C.
|
75
|
+
C.finalize_function_pass_manager(self) != 0
|
74
76
|
end
|
75
77
|
end
|
76
78
|
end
|
data/lib/llvm/core/type.rb
CHANGED
@@ -14,7 +14,11 @@ module LLVM
|
|
14
14
|
false
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
|
+
def hash
|
19
|
+
@ptr.address.hash
|
20
|
+
end
|
21
|
+
|
18
22
|
# Checks if the type is equal to other.
|
19
23
|
def eql?(other)
|
20
24
|
other.instance_of?(self.class) && self == other
|
@@ -22,34 +26,34 @@ module LLVM
|
|
22
26
|
|
23
27
|
# Returns a symbol representation of the types kind (ex. :pointer, :vector, :array.)
|
24
28
|
def kind
|
25
|
-
|
29
|
+
@kind
|
26
30
|
end
|
27
31
|
|
28
32
|
# Returns the size of the type.
|
29
33
|
def size
|
30
|
-
LLVM::Int64.from_ptr(C.
|
34
|
+
LLVM::Int64.from_ptr(C.size_of(self))
|
31
35
|
end
|
32
36
|
|
33
37
|
def align
|
34
|
-
LLVM::Int64.from_ptr(C.
|
38
|
+
LLVM::Int64.from_ptr(C.align_of(self))
|
35
39
|
end
|
36
40
|
|
37
41
|
# Returns the type of this types elements (works only for Pointer, Vector, and Array types.)
|
38
42
|
def element_type
|
39
43
|
case self.kind
|
40
44
|
when :pointer, :vector, :array
|
41
|
-
Type.from_ptr(C.
|
45
|
+
Type.from_ptr(C.get_element_type(self), nil)
|
42
46
|
end
|
43
47
|
end
|
44
48
|
|
45
49
|
# Returns a null pointer ConstantExpr of this type.
|
46
50
|
def null_pointer
|
47
|
-
ConstantExpr.from_ptr(C.
|
51
|
+
ConstantExpr.from_ptr(C.const_pointer_null(self))
|
48
52
|
end
|
49
53
|
|
50
54
|
# Returns a null ConstantExpr of this type.
|
51
55
|
def null
|
52
|
-
ConstantExpr.from_ptr(C.
|
56
|
+
ConstantExpr.from_ptr(C.const_null(self))
|
53
57
|
end
|
54
58
|
|
55
59
|
# Creates a pointer type with this type and the given address space.
|
@@ -57,32 +61,34 @@ module LLVM
|
|
57
61
|
Type.pointer(self, address_space)
|
58
62
|
end
|
59
63
|
|
60
|
-
# Returns the name of the struct type.
|
61
|
-
def name
|
62
|
-
C.LLVMGetStructName(self)
|
63
|
-
end
|
64
|
-
|
65
64
|
# @private
|
66
|
-
def self.from_ptr(ptr)
|
65
|
+
def self.from_ptr(ptr, kind)
|
67
66
|
return if ptr.null?
|
68
|
-
|
67
|
+
kind ||= C.get_type_kind(ptr)
|
68
|
+
ty = case kind
|
69
|
+
when :integer then IntType.allocate
|
70
|
+
when :function then FunctionType.allocate
|
71
|
+
when :struct then StructType.allocate
|
72
|
+
else allocate
|
73
|
+
end
|
69
74
|
ty.instance_variable_set(:@ptr, ptr)
|
75
|
+
ty.instance_variable_set(:@kind, kind)
|
70
76
|
ty
|
71
77
|
end
|
72
78
|
|
73
79
|
# Creates an array type of Type with the given size.
|
74
80
|
def self.array(ty, sz = 0)
|
75
|
-
from_ptr(C.
|
81
|
+
from_ptr(C.array_type(LLVM::Type(ty), sz), :array)
|
76
82
|
end
|
77
83
|
|
78
84
|
# Creates the pointer type of Type with the given address space.
|
79
85
|
def self.pointer(ty, address_space = 0)
|
80
|
-
from_ptr(C.
|
86
|
+
from_ptr(C.pointer_type(LLVM::Type(ty), address_space), :pointer)
|
81
87
|
end
|
82
88
|
|
83
89
|
# Creates a vector type of Type with the given element count.
|
84
90
|
def self.vector(ty, element_count)
|
85
|
-
from_ptr(C.
|
91
|
+
from_ptr(C.vector_type(LLVM::Type(ty), element_count), :vector)
|
86
92
|
end
|
87
93
|
|
88
94
|
# Creates a function type. Takes an array of argument Types and the result Type. The only option is <tt>:varargs</tt>,
|
@@ -91,7 +97,7 @@ module LLVM
|
|
91
97
|
arg_types.map! { |ty| LLVM::Type(ty) }
|
92
98
|
arg_types_ptr = FFI::MemoryPointer.new(FFI.type_size(:pointer) * arg_types.size)
|
93
99
|
arg_types_ptr.write_array_of_pointer(arg_types)
|
94
|
-
|
100
|
+
from_ptr(C.function_type(LLVM::Type(result_type), arg_types_ptr, arg_types.size, options[:varargs] ? 1 : 0), :function)
|
95
101
|
end
|
96
102
|
|
97
103
|
# Creates a struct type with the given array of element types.
|
@@ -100,17 +106,17 @@ module LLVM
|
|
100
106
|
elt_types_ptr = FFI::MemoryPointer.new(FFI.type_size(:pointer) * elt_types.size)
|
101
107
|
elt_types_ptr.write_array_of_pointer(elt_types)
|
102
108
|
if name
|
103
|
-
struct = from_ptr(C.
|
104
|
-
C.
|
109
|
+
struct = from_ptr(C.struct_create_named(Context.global, name), :struct)
|
110
|
+
C.struct_set_body(struct, elt_types_ptr, elt_types.size, is_packed ? 1 : 0) unless elt_types.empty?
|
105
111
|
struct
|
106
112
|
else
|
107
|
-
from_ptr(C.
|
113
|
+
from_ptr(C.struct_type(elt_types_ptr, elt_types.size, is_packed ? 1 : 0), :struct)
|
108
114
|
end
|
109
115
|
end
|
110
116
|
|
111
117
|
# Creates a void type.
|
112
118
|
def self.void
|
113
|
-
from_ptr(C.
|
119
|
+
from_ptr(C.void_type, :void)
|
114
120
|
end
|
115
121
|
|
116
122
|
def self.rec
|
@@ -123,13 +129,39 @@ module LLVM
|
|
123
129
|
|
124
130
|
class IntType < Type
|
125
131
|
def width
|
126
|
-
C.
|
132
|
+
C.get_int_type_width(self)
|
127
133
|
end
|
128
134
|
end
|
129
135
|
|
130
136
|
class FunctionType < Type
|
131
137
|
def return_type
|
132
|
-
|
138
|
+
Type.from_ptr(C.get_return_type(self), nil)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
class StructType < Type
|
143
|
+
# Returns the name of the struct.
|
144
|
+
def name
|
145
|
+
C.get_struct_name(self)
|
146
|
+
end
|
147
|
+
|
148
|
+
# Returns the element types of the struct.
|
149
|
+
def element_types
|
150
|
+
count = C.count_struct_element_types(self)
|
151
|
+
elt_types = nil
|
152
|
+
FFI::MemoryPointer.new(FFI.type_size(:pointer) * count) do |types_ptr|
|
153
|
+
C.get_struct_element_types(self, types_ptr)
|
154
|
+
elt_types = types_ptr.read_array_of_pointer(count).map { |type_ptr| Type.from_ptr(type_ptr, nil) }
|
155
|
+
end
|
156
|
+
elt_types
|
157
|
+
end
|
158
|
+
|
159
|
+
# Sets the struct body.
|
160
|
+
def element_types=(elt_types)
|
161
|
+
elt_types.map! { |ty| LLVM::Type(ty) }
|
162
|
+
elt_types_ptr = FFI::MemoryPointer.new(FFI.type_size(:pointer) * elt_types.size)
|
163
|
+
elt_types_ptr.write_array_of_pointer(elt_types)
|
164
|
+
C.struct_set_body(self, elt_types_ptr, elt_types.size, 0)
|
133
165
|
end
|
134
166
|
end
|
135
167
|
|
data/lib/llvm/core/value.rb
CHANGED
@@ -43,28 +43,28 @@ module LLVM
|
|
43
43
|
|
44
44
|
# Returns the value's type.
|
45
45
|
def type
|
46
|
-
Type.from_ptr(C.
|
46
|
+
Type.from_ptr(C.type_of(self), nil)
|
47
47
|
end
|
48
48
|
|
49
49
|
# Returns the value's name.
|
50
50
|
def name
|
51
|
-
C.
|
51
|
+
C.get_value_name(self)
|
52
52
|
end
|
53
53
|
|
54
54
|
# Sets the value's name to str.
|
55
55
|
def name=(str)
|
56
|
-
C.
|
56
|
+
C.set_value_name(self, str)
|
57
57
|
str
|
58
58
|
end
|
59
59
|
|
60
60
|
# Print the value's IR to stdout.
|
61
61
|
def dump
|
62
|
-
C.
|
62
|
+
C.dump_value(self)
|
63
63
|
end
|
64
64
|
|
65
65
|
# Returns whether the value is constant.
|
66
66
|
def constant?
|
67
|
-
case C.
|
67
|
+
case C.is_constant(self)
|
68
68
|
when 0 then false
|
69
69
|
when 1 then true
|
70
70
|
end
|
@@ -72,7 +72,7 @@ module LLVM
|
|
72
72
|
|
73
73
|
# Returns whether the value is null.
|
74
74
|
def null?
|
75
|
-
case C.
|
75
|
+
case C.is_null(self)
|
76
76
|
when 0 then false
|
77
77
|
when 1 then true
|
78
78
|
end
|
@@ -80,7 +80,7 @@ module LLVM
|
|
80
80
|
|
81
81
|
# Returns whether the value is undefined.
|
82
82
|
def undefined?
|
83
|
-
case C.
|
83
|
+
case C.is_undef(self)
|
84
84
|
when 0 then false
|
85
85
|
when 1 then true
|
86
86
|
end
|
@@ -88,7 +88,7 @@ module LLVM
|
|
88
88
|
|
89
89
|
# Adds attr to this value's attributes.
|
90
90
|
def add_attribute(attr)
|
91
|
-
C.
|
91
|
+
C.add_attribute(self, attr)
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
@@ -98,38 +98,37 @@ module LLVM
|
|
98
98
|
class BasicBlock < Value
|
99
99
|
# Creates a basic block for the given function with the given name.
|
100
100
|
def self.create(fun = nil, name = "")
|
101
|
-
self.from_ptr(C.
|
101
|
+
self.from_ptr(C.append_basic_block(fun, name))
|
102
102
|
end
|
103
103
|
|
104
104
|
# Build the basic block with the given builder. Creates a new one if nil. Yields the builder.
|
105
105
|
def build(builder = nil)
|
106
106
|
if builder.nil?
|
107
107
|
builder = Builder.new
|
108
|
-
|
108
|
+
builder.position_at_end(self)
|
109
|
+
yield builder
|
110
|
+
builder.dispose
|
109
111
|
else
|
110
|
-
|
112
|
+
builder.position_at_end(self)
|
113
|
+
yield builder
|
111
114
|
end
|
112
|
-
builder.position_at_end(self)
|
113
|
-
yield builder
|
114
|
-
ensure
|
115
|
-
builder.dispose if islocal
|
116
115
|
end
|
117
116
|
|
118
117
|
# Returns the parent of this basic block (a Function).
|
119
118
|
def parent
|
120
|
-
fp = C.
|
119
|
+
fp = C.get_basic_block_parent(self)
|
121
120
|
LLVM::Function.from_ptr(fp) unless fp.null?
|
122
121
|
end
|
123
122
|
|
124
123
|
# Returns the next basic block in the sequence.
|
125
124
|
def next
|
126
|
-
ptr = C.
|
125
|
+
ptr = C.get_next_basic_block(self)
|
127
126
|
BasicBlock.from_ptr(ptr) unless ptr.null?
|
128
127
|
end
|
129
128
|
|
130
129
|
# Returns the previous basic block in the sequence.
|
131
130
|
def previous
|
132
|
-
ptr = C.
|
131
|
+
ptr = C.get_previous_basic_block(self)
|
133
132
|
BasicBlock.from_ptr(ptr) unless ptr.null?
|
134
133
|
end
|
135
134
|
|
@@ -170,13 +169,13 @@ module LLVM
|
|
170
169
|
|
171
170
|
# Returns the first Instruction in the collection.
|
172
171
|
def first
|
173
|
-
ptr = C.
|
172
|
+
ptr = C.get_first_instruction(@block)
|
174
173
|
LLVM::Instruction.from_ptr(ptr) unless ptr.null?
|
175
174
|
end
|
176
175
|
|
177
176
|
# Returns the last Instruction in the collection.
|
178
177
|
def last
|
179
|
-
ptr = C.
|
178
|
+
ptr = C.get_last_instruction(@block)
|
180
179
|
LLVM::Instruction.from_ptr(ptr) unless ptr.null?
|
181
180
|
end
|
182
181
|
end
|
@@ -198,18 +197,18 @@ module LLVM
|
|
198
197
|
|
199
198
|
# Get a reference to an operand by index.
|
200
199
|
def [](i)
|
201
|
-
ptr = C.
|
200
|
+
ptr = C.get_operand(@user, i)
|
202
201
|
Value.from_ptr(ptr) unless ptr.null?
|
203
202
|
end
|
204
203
|
|
205
204
|
# Set or replace an operand by index.
|
206
205
|
def []=(i, v)
|
207
|
-
C.
|
206
|
+
C.set_operand(@user, i, v)
|
208
207
|
end
|
209
208
|
|
210
209
|
# Returns the number of operands in the collection.
|
211
210
|
def size
|
212
|
-
C.
|
211
|
+
C.get_num_operands(@user)
|
213
212
|
end
|
214
213
|
|
215
214
|
# Iterates through each operand in the collection.
|
@@ -224,22 +223,22 @@ module LLVM
|
|
224
223
|
class Constant < User
|
225
224
|
# Creates a null constant of Type.
|
226
225
|
def self.null(type)
|
227
|
-
from_ptr(C.
|
226
|
+
from_ptr(C.const_null(type))
|
228
227
|
end
|
229
228
|
|
230
229
|
# Creates a undefined constant of Type.
|
231
230
|
def self.undef(type)
|
232
|
-
from_ptr(C.
|
231
|
+
from_ptr(C.get_undef(type))
|
233
232
|
end
|
234
233
|
|
235
234
|
# Creates a null pointer constant of Type.
|
236
235
|
def self.null_ptr(type)
|
237
|
-
from_ptr(C.
|
236
|
+
from_ptr(C.const_pointer_null(type))
|
238
237
|
end
|
239
238
|
|
240
239
|
# Bitcast this constant to Type.
|
241
240
|
def bitcast_to(type)
|
242
|
-
ConstantExpr.from_ptr(C.
|
241
|
+
ConstantExpr.from_ptr(C.const_bit_cast(self, type))
|
243
242
|
end
|
244
243
|
|
245
244
|
# Returns the element pointer at the given indices of the constant.
|
@@ -249,7 +248,7 @@ module LLVM
|
|
249
248
|
FFI::MemoryPointer.new(FFI.type_size(:pointer) * indices.size) do |indices_ptr|
|
250
249
|
indices_ptr.write_array_of_pointer(indices)
|
251
250
|
return ConstantExpr.from_ptr(
|
252
|
-
C.
|
251
|
+
C.const_gep(self, indices_ptr, indices.size))
|
253
252
|
end
|
254
253
|
end
|
255
254
|
end
|
@@ -272,14 +271,14 @@ module LLVM
|
|
272
271
|
|
273
272
|
class ConstantArray < Constant
|
274
273
|
def self.string(str, null_terminate = true)
|
275
|
-
from_ptr(C.
|
274
|
+
from_ptr(C.const_string(str, str.length, null_terminate ? 0 : 1))
|
276
275
|
end
|
277
276
|
|
278
277
|
# ConstantArray.const(type, 3) {|i| ... } or
|
279
278
|
# ConstantArray.const(type, [...])
|
280
279
|
def self.const(type, size_or_values, &block)
|
281
280
|
vals = LLVM::Support.allocate_pointers(size_or_values, &block)
|
282
|
-
from_ptr C.
|
281
|
+
from_ptr C.const_array(type, vals, vals.size / vals.type_size)
|
283
282
|
end
|
284
283
|
end
|
285
284
|
|
@@ -288,77 +287,77 @@ module LLVM
|
|
288
287
|
|
289
288
|
class ConstantInt < Constant
|
290
289
|
def self.all_ones
|
291
|
-
from_ptr(C.
|
290
|
+
from_ptr(C.const_all_ones(type))
|
292
291
|
end
|
293
292
|
|
294
293
|
# Creates a ConstantInt from an integer.
|
295
294
|
def self.from_i(n, signed = true)
|
296
|
-
from_ptr(C.
|
295
|
+
from_ptr(C.const_int(type, n, signed ? 1 : 0))
|
297
296
|
end
|
298
297
|
|
299
298
|
def self.parse(str, radix = 10)
|
300
|
-
from_ptr(C.
|
299
|
+
from_ptr(C.const_int_of_string(type, str, radix))
|
301
300
|
end
|
302
301
|
|
303
302
|
# Negation.
|
304
303
|
def -@
|
305
|
-
self.class.from_ptr(C.
|
304
|
+
self.class.from_ptr(C.const_neg(self))
|
306
305
|
end
|
307
306
|
|
308
307
|
# Boolean negation.
|
309
308
|
def not
|
310
|
-
self.class.from_ptr(C.
|
309
|
+
self.class.from_ptr(C.const_not(self))
|
311
310
|
end
|
312
311
|
|
313
312
|
# Addition.
|
314
313
|
def +(rhs)
|
315
|
-
self.class.from_ptr(C.
|
314
|
+
self.class.from_ptr(C.const_add(self, rhs))
|
316
315
|
end
|
317
316
|
|
318
317
|
# "No signed wrap" addition. See
|
319
318
|
# http://llvm.org/docs/LangRef.html#i_add for discusison.
|
320
319
|
def nsw_add(rhs)
|
321
|
-
self.class.from_ptr(C.
|
320
|
+
self.class.from_ptr(C.const_nsw_add(self, rhs))
|
322
321
|
end
|
323
322
|
|
324
323
|
# Multiplication.
|
325
324
|
def *(rhs)
|
326
|
-
self.class.from_ptr(C.
|
325
|
+
self.class.from_ptr(C.const_mul(self, rhs))
|
327
326
|
end
|
328
327
|
|
329
328
|
# Unsigned division.
|
330
329
|
def udiv(rhs)
|
331
|
-
self.class.from_ptr(C.
|
330
|
+
self.class.from_ptr(C.const_u_div(self, rhs))
|
332
331
|
end
|
333
332
|
|
334
333
|
# Signed division.
|
335
334
|
def /(rhs)
|
336
|
-
self.class.from_ptr(C.
|
335
|
+
self.class.from_ptr(C.const_s_div(self, rhs))
|
337
336
|
end
|
338
337
|
|
339
338
|
# Unsigned remainder.
|
340
339
|
def urem(rhs)
|
341
|
-
self.class.from_ptr(C.
|
340
|
+
self.class.from_ptr(C.const_u_rem(self, rhs))
|
342
341
|
end
|
343
342
|
|
344
343
|
# Signed remainder.
|
345
344
|
def rem(rhs)
|
346
|
-
self.class.from_ptr(C.
|
345
|
+
self.class.from_ptr(C.const_s_rem(self, rhs))
|
347
346
|
end
|
348
347
|
|
349
348
|
# Integer AND.
|
350
349
|
def and(rhs)
|
351
|
-
self.class.from_ptr(C.
|
350
|
+
self.class.from_ptr(C.const_and(self, rhs))
|
352
351
|
end
|
353
352
|
|
354
353
|
# Integer OR.
|
355
354
|
def or(rhs)
|
356
|
-
self.class.from_ptr(C.
|
355
|
+
self.class.from_ptr(C.const_or(self, rhs))
|
357
356
|
end
|
358
357
|
|
359
358
|
# Integer XOR.
|
360
359
|
def xor(rhs)
|
361
|
-
self.class.from_ptr(C.
|
360
|
+
self.class.from_ptr(C.const_xor(self, rhs))
|
362
361
|
end
|
363
362
|
|
364
363
|
# Integer comparison using the predicate specified via the first parameter.
|
@@ -374,22 +373,22 @@ module LLVM
|
|
374
373
|
# :slt - signed less than
|
375
374
|
# :sle - signed less than or equal to
|
376
375
|
def icmp(pred, rhs)
|
377
|
-
self.class.from_ptr(C.
|
376
|
+
self.class.from_ptr(C.const_i_cmp(pred, self, rhs))
|
378
377
|
end
|
379
378
|
|
380
379
|
# Shift left.
|
381
380
|
def <<(bits)
|
382
|
-
self.class.from_ptr(C.
|
381
|
+
self.class.from_ptr(C.const_shl(self, bits))
|
383
382
|
end
|
384
383
|
|
385
384
|
# Shift right.
|
386
385
|
def >>(bits)
|
387
|
-
self.class.from_ptr(C.
|
386
|
+
self.class.from_ptr(C.const_l_shr(self, bits))
|
388
387
|
end
|
389
388
|
|
390
389
|
# Arithmatic shift right.
|
391
390
|
def ashr(bits)
|
392
|
-
self.class.from_ptr(C.
|
391
|
+
self.class.from_ptr(C.const_a_shr(self, bits))
|
393
392
|
end
|
394
393
|
end
|
395
394
|
|
@@ -401,7 +400,7 @@ module LLVM
|
|
401
400
|
eval <<-KLASS
|
402
401
|
class #{name} < ConstantInt
|
403
402
|
def self.type
|
404
|
-
|
403
|
+
Type.from_ptr(C.int_type(#{width}), :integer)
|
405
404
|
end
|
406
405
|
end
|
407
406
|
KLASS
|
@@ -430,36 +429,36 @@ module LLVM
|
|
430
429
|
class ConstantReal < Constant
|
431
430
|
# Creates a ConstantReal from a float of Type.
|
432
431
|
def self.from_f(n)
|
433
|
-
from_ptr(C.
|
432
|
+
from_ptr(C.const_real(type, n))
|
434
433
|
end
|
435
434
|
|
436
435
|
def self.parse(type, str)
|
437
|
-
from_ptr(C.
|
436
|
+
from_ptr(C.const_real_of_string(type, str))
|
438
437
|
end
|
439
438
|
|
440
439
|
# Negation.
|
441
440
|
def -@
|
442
|
-
self.class.from_ptr(C.
|
441
|
+
self.class.from_ptr(C.const_f_neg(self))
|
443
442
|
end
|
444
443
|
|
445
444
|
# Returns the result of adding this ConstantReal to rhs.
|
446
445
|
def +(rhs)
|
447
|
-
self.class.from_ptr(C.
|
446
|
+
self.class.from_ptr(C.const_f_add(self, rhs))
|
448
447
|
end
|
449
448
|
|
450
449
|
# Returns the result of multiplying this ConstantReal by rhs.
|
451
450
|
def *(rhs)
|
452
|
-
self.class.from_ptr(C.
|
451
|
+
self.class.from_ptr(C.const_f_mul(self, rhs))
|
453
452
|
end
|
454
453
|
|
455
454
|
# Returns the result of dividing this ConstantReal by rhs.
|
456
455
|
def /(rhs)
|
457
|
-
self.class.from_ptr(C.
|
456
|
+
self.class.from_ptr(C.const_f_div(self, rhs))
|
458
457
|
end
|
459
458
|
|
460
459
|
# Remainder.
|
461
460
|
def rem(rhs)
|
462
|
-
self.class.from_ptr(C.
|
461
|
+
self.class.from_ptr(C.const_f_rem(self, rhs))
|
463
462
|
end
|
464
463
|
|
465
464
|
# Floating point comparison using the predicate specified via the first
|
@@ -481,14 +480,14 @@ module LLVM
|
|
481
480
|
# :true - always true
|
482
481
|
# :false- always false
|
483
482
|
def fcmp(pred, rhs)
|
484
|
-
self.class.from_ptr(C.
|
483
|
+
self.class.from_ptr(C.llmv_const_f_cmp(pred, self, rhs))
|
485
484
|
end
|
486
485
|
end
|
487
486
|
|
488
487
|
class Float < ConstantReal
|
489
488
|
# Return a Type representation of the float.
|
490
489
|
def self.type
|
491
|
-
Type.from_ptr(C.
|
490
|
+
Type.from_ptr(C.float_type, :float)
|
492
491
|
end
|
493
492
|
end
|
494
493
|
|
@@ -499,7 +498,7 @@ module LLVM
|
|
499
498
|
|
500
499
|
class Double < ConstantReal
|
501
500
|
def self.type
|
502
|
-
Type.from_ptr(C.
|
501
|
+
Type.from_ptr(C.double_type, :double)
|
503
502
|
end
|
504
503
|
end
|
505
504
|
|
@@ -512,90 +511,90 @@ module LLVM
|
|
512
511
|
# ConstantStruct.const([...])
|
513
512
|
def self.const(size_or_values, packed = false, &block)
|
514
513
|
vals = LLVM::Support.allocate_pointers(size_or_values, &block)
|
515
|
-
from_ptr C.
|
514
|
+
from_ptr C.const_struct(vals, vals.size / vals.type_size, packed ? 1 : 0)
|
516
515
|
end
|
517
516
|
end
|
518
517
|
|
519
518
|
class ConstantVector < Constant
|
520
519
|
def self.all_ones
|
521
|
-
from_ptr(C.
|
520
|
+
from_ptr(C.const_all_ones(type))
|
522
521
|
end
|
523
522
|
|
524
523
|
def self.const(size_or_values, &block)
|
525
524
|
vals = LLVM::Support.allocate_pointers(size_or_values, &block)
|
526
|
-
from_ptr(C.
|
525
|
+
from_ptr(C.const_vector(vals, vals.size / vals.type_size))
|
527
526
|
end
|
528
527
|
end
|
529
528
|
|
530
529
|
class GlobalValue < Constant
|
531
530
|
def declaration?
|
532
|
-
C.
|
531
|
+
C.is_declaration(self)
|
533
532
|
end
|
534
533
|
|
535
534
|
def linkage
|
536
|
-
C.
|
535
|
+
C.get_linkage(self)
|
537
536
|
end
|
538
537
|
|
539
538
|
def linkage=(linkage)
|
540
|
-
C.
|
539
|
+
C.set_linkage(self, linkage)
|
541
540
|
end
|
542
541
|
|
543
542
|
def section
|
544
|
-
C.
|
543
|
+
C.get_section(self)
|
545
544
|
end
|
546
545
|
|
547
546
|
def section=(section)
|
548
|
-
C.
|
547
|
+
C.set_section(self, section)
|
549
548
|
end
|
550
549
|
|
551
550
|
def visibility
|
552
|
-
C.
|
551
|
+
C.get_visibility(self)
|
553
552
|
end
|
554
553
|
|
555
554
|
def visibility=(viz)
|
556
|
-
C.
|
555
|
+
C.set_visibility(self, viz)
|
557
556
|
end
|
558
557
|
|
559
558
|
def alignment
|
560
|
-
C.
|
559
|
+
C.get_alignment(self)
|
561
560
|
end
|
562
561
|
|
563
562
|
def alignment=(bytes)
|
564
|
-
C.
|
563
|
+
C.set_alignment(self, bytes)
|
565
564
|
end
|
566
565
|
|
567
566
|
def initializer
|
568
|
-
Value.from_ptr(C.
|
567
|
+
Value.from_ptr(C.get_initializer(self))
|
569
568
|
end
|
570
569
|
|
571
570
|
def initializer=(val)
|
572
|
-
C.
|
571
|
+
C.set_initializer(self, val)
|
573
572
|
end
|
574
573
|
|
575
574
|
def global_constant?
|
576
|
-
C.
|
575
|
+
C.is_global_constant(self)
|
577
576
|
end
|
578
577
|
|
579
578
|
def global_constant=(flag)
|
580
|
-
C.
|
579
|
+
C.set_global_constant(self, flag)
|
581
580
|
end
|
582
581
|
end
|
583
582
|
|
584
583
|
class Function < GlobalValue
|
585
584
|
# Sets the function's calling convention and returns it.
|
586
585
|
def call_conv=(conv)
|
587
|
-
C.
|
586
|
+
C.set_function_call_conv(self, conv)
|
588
587
|
conv
|
589
588
|
end
|
590
589
|
|
591
590
|
# Adds the given attribute to the function.
|
592
591
|
def add_attribute(attr)
|
593
|
-
C.
|
592
|
+
C.add_function_attr(self, attr)
|
594
593
|
end
|
595
594
|
|
596
595
|
# Removes the given attribute from the function.
|
597
596
|
def remove_attribute(attr)
|
598
|
-
C.
|
597
|
+
C.remove_function_attr(self, attr)
|
599
598
|
end
|
600
599
|
|
601
600
|
# Returns an Enumerable of the BasicBlocks in this function.
|
@@ -604,7 +603,7 @@ module LLVM
|
|
604
603
|
end
|
605
604
|
|
606
605
|
def type
|
607
|
-
|
606
|
+
Type.from_ptr(C.type_of(self), :function)
|
608
607
|
end
|
609
608
|
|
610
609
|
# @private
|
@@ -617,17 +616,17 @@ module LLVM
|
|
617
616
|
|
618
617
|
# Returns the number of BasicBlocks in the collection.
|
619
618
|
def size
|
620
|
-
C.
|
619
|
+
C.count_basic_blocks(@fun)
|
621
620
|
end
|
622
621
|
|
623
622
|
# Iterates through each BasicBlock in the collection.
|
624
623
|
def each
|
625
624
|
return to_enum :each unless block_given?
|
626
625
|
|
627
|
-
ptr = C.
|
626
|
+
ptr = C.get_first_basic_block(@fun)
|
628
627
|
0.upto(size-1) do |i|
|
629
628
|
yield BasicBlock.from_ptr(ptr)
|
630
|
-
ptr = C.
|
629
|
+
ptr = C.get_next_basic_block(ptr)
|
631
630
|
end
|
632
631
|
|
633
632
|
self
|
@@ -641,18 +640,18 @@ module LLVM
|
|
641
640
|
# Returns the entry BasicBlock in the collection. This is the block the
|
642
641
|
# function starts on.
|
643
642
|
def entry
|
644
|
-
BasicBlock.from_ptr(C.
|
643
|
+
BasicBlock.from_ptr(C.get_entry_basic_block(@fun))
|
645
644
|
end
|
646
645
|
|
647
646
|
# Returns the first BasicBlock in the collection.
|
648
647
|
def first
|
649
|
-
ptr = C.
|
648
|
+
ptr = C.get_first_basic_block(@fun)
|
650
649
|
BasicBlock.from_ptr(ptr) unless ptr.null?
|
651
650
|
end
|
652
651
|
|
653
652
|
# Returns the last BasicBlock in the collection.
|
654
653
|
def last
|
655
|
-
ptr = C.
|
654
|
+
ptr = C.get_last_basic_block(@fun)
|
656
655
|
BasicBlock.from_ptr(ptr) unless ptr.null?
|
657
656
|
end
|
658
657
|
end
|
@@ -673,12 +672,12 @@ module LLVM
|
|
673
672
|
sz = self.size
|
674
673
|
i = sz + i if i < 0
|
675
674
|
return unless 0 <= i && i < sz
|
676
|
-
Value.from_ptr(C.
|
675
|
+
Value.from_ptr(C.get_param(@fun, i))
|
677
676
|
end
|
678
677
|
|
679
678
|
# Returns the number of paramters in the collection.
|
680
679
|
def size
|
681
|
-
C.
|
680
|
+
C.count_params(@fun)
|
682
681
|
end
|
683
682
|
|
684
683
|
include Enumerable
|
@@ -697,41 +696,41 @@ module LLVM
|
|
697
696
|
|
698
697
|
class GlobalVariable < GlobalValue
|
699
698
|
def initializer
|
700
|
-
Value.from_ptr(C.
|
699
|
+
Value.from_ptr(C.get_initializer(self))
|
701
700
|
end
|
702
701
|
|
703
702
|
def initializer=(val)
|
704
|
-
C.
|
703
|
+
C.set_initializer(self, val)
|
705
704
|
end
|
706
705
|
|
707
706
|
def thread_local?
|
708
|
-
case C.
|
707
|
+
case C.is_thread_local(self)
|
709
708
|
when 0 then false
|
710
709
|
else true
|
711
710
|
end
|
712
711
|
end
|
713
712
|
|
714
713
|
def thread_local=(local)
|
715
|
-
C.
|
714
|
+
C.set_thread_local(self, local ? 1 : 0)
|
716
715
|
end
|
717
716
|
end
|
718
717
|
|
719
718
|
class Instruction < User
|
720
719
|
# Returns the parent of the instruction (a BasicBlock).
|
721
720
|
def parent
|
722
|
-
ptr = C.
|
721
|
+
ptr = C.get_instruction_parent(self)
|
723
722
|
LLVM::BasicBlock.from_ptr(ptr) unless ptr.null?
|
724
723
|
end
|
725
724
|
|
726
725
|
# Returns the next instruction after this one.
|
727
726
|
def next
|
728
|
-
ptr = C.
|
727
|
+
ptr = C.get_next_instruction(self)
|
729
728
|
LLVM::Instruction.from_ptr(ptr) unless ptr.null?
|
730
729
|
end
|
731
730
|
|
732
731
|
# Returns the previous instruction before this one.
|
733
732
|
def previous
|
734
|
-
ptr = C.
|
733
|
+
ptr = C.get_previous_instruction(self)
|
735
734
|
LLVM::Instruction.from_ptr(ptr) unless ptr.null?
|
736
735
|
end
|
737
736
|
end
|
@@ -739,13 +738,13 @@ module LLVM
|
|
739
738
|
class CallInst < Instruction
|
740
739
|
# Sets the call convention to conv.
|
741
740
|
def call_conv=(conv)
|
742
|
-
C.
|
741
|
+
C.set_instruction_call_conv(self, conv)
|
743
742
|
conv
|
744
743
|
end
|
745
744
|
|
746
745
|
# Returns the call insatnce's call convention.
|
747
746
|
def call_conv
|
748
|
-
C.
|
747
|
+
C.get_instruction_call_conv(self)
|
749
748
|
end
|
750
749
|
end
|
751
750
|
|
@@ -763,7 +762,7 @@ module LLVM
|
|
763
762
|
vals_ptr.write_array_of_pointer(vals)
|
764
763
|
FFI::MemoryPointer.new(FFI.type_size(:pointer) * size) do |blks_ptr|
|
765
764
|
blks_ptr.write_array_of_pointer(blks)
|
766
|
-
C.
|
765
|
+
C.add_incoming(self, vals_ptr, blks_ptr, vals.size)
|
767
766
|
end
|
768
767
|
end
|
769
768
|
|
@@ -776,7 +775,7 @@ module LLVM
|
|
776
775
|
# Adds a case to a switch instruction. First the value to match on, then
|
777
776
|
# the basic block.
|
778
777
|
def add_case(val, block)
|
779
|
-
C.
|
778
|
+
C.add_case(self, val, block)
|
780
779
|
end
|
781
780
|
end
|
782
781
|
end
|