ruby-llvm 3.0.0.beta → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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/bitcode.rb
CHANGED
@@ -1,12 +1,6 @@
|
|
1
|
-
|
2
|
-
# @private
|
3
|
-
module C
|
4
|
-
attach_function :LLVMParseBitcode, [:pointer, :buffer_out, :buffer_out], :int
|
5
|
-
attach_function :LLVMParseBitcodeInContext, [:pointer, :pointer, :buffer_out, :buffer_out], :int
|
6
|
-
attach_function :LLVMWriteBitcodeToFile, [:pointer, :string], :int
|
7
|
-
attach_function :LLVMWriteBitcodeToFD, [:pointer, :int, :int, :int], :int
|
8
|
-
end
|
1
|
+
require 'llvm/core/bitcode_ffi'
|
9
2
|
|
3
|
+
module LLVM
|
10
4
|
class Module
|
11
5
|
# Parse a module from a memory buffer
|
12
6
|
# @param [String, LLVM::MemoryBuffer] path_or_memory_buffer
|
@@ -18,7 +12,7 @@ module LLVM
|
|
18
12
|
end
|
19
13
|
FFI::MemoryPointer.new(:pointer) do |mod_ref|
|
20
14
|
FFI::MemoryPointer.new(:pointer) do |msg_ref|
|
21
|
-
status = C.
|
15
|
+
status = C.parse_bitcode(memory_buffer, mod_ref, msg_ref)
|
22
16
|
raise msg_ref.get_pointer(0).get_string(0) if status != 0
|
23
17
|
return from_ptr(mod_ref.get_pointer(0))
|
24
18
|
end
|
@@ -30,13 +24,13 @@ module LLVM
|
|
30
24
|
# @return [true, false] Success
|
31
25
|
def write_bitcode(path_or_io)
|
32
26
|
status = if path_or_io.respond_to?(:path)
|
33
|
-
C.
|
27
|
+
C.write_bitcode_to_file(self, path_or_io.path)
|
34
28
|
elsif path_or_io.respond_to?(:fileno)
|
35
|
-
C.
|
29
|
+
C.write_bitcode_to_fd(self, path_or_io.fileno, 0, 1)
|
36
30
|
elsif path_or_io.kind_of?(Integer)
|
37
|
-
C.
|
31
|
+
C.write_bitcode_to_fd(self, path_or_io, 0, 1)
|
38
32
|
else
|
39
|
-
C.
|
33
|
+
C.write_bitcode_to_file(self, path_or_io.to_str)
|
40
34
|
end
|
41
35
|
return status == 0
|
42
36
|
end
|
@@ -62,7 +56,7 @@ module LLVM
|
|
62
56
|
def self.from_file(path)
|
63
57
|
FFI::MemoryPointer.new(:pointer) do |buf_ref|
|
64
58
|
FFI::MemoryPointer.new(:pointer) do |msg_ref|
|
65
|
-
status = C.
|
59
|
+
status = C.create_memory_buffer_with_contents_of_file(path.to_str, buf_ref, msg_ref)
|
66
60
|
raise msg_ref.get_pointer(0).get_string(0) if status != 0
|
67
61
|
return new(buf_ref.get_pointer(0))
|
68
62
|
end
|
@@ -74,7 +68,7 @@ module LLVM
|
|
74
68
|
def self.from_stdin
|
75
69
|
FFI::Buffer.new(:pointer) do |buf_ref|
|
76
70
|
FFI::Buffer.new(:pointer) do |msg_ref|
|
77
|
-
status = C.
|
71
|
+
status = C.create_memory_buffer_with_stdin(buf_ref, msg_ref)
|
78
72
|
raise msg_ref.get_pointer(0).get_string(0) if status != 0
|
79
73
|
return new(buf_ref.get_pointer(0))
|
80
74
|
end
|
@@ -82,7 +76,9 @@ module LLVM
|
|
82
76
|
end
|
83
77
|
|
84
78
|
def dispose
|
85
|
-
|
79
|
+
return if @ptr.nil?
|
80
|
+
C.dispose_memory_buffer(@ptr)
|
81
|
+
@ptr = nil
|
86
82
|
end
|
87
83
|
end
|
88
84
|
end
|
@@ -0,0 +1,104 @@
|
|
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 'LLVM-3.0'
|
8
|
+
|
9
|
+
# (Not documented)
|
10
|
+
#
|
11
|
+
# @method parse_bitcode(mem_buf, out_module, out_message)
|
12
|
+
# @param [FFI::Pointer(MemoryBufferRef)] mem_buf
|
13
|
+
# @param [FFI::Pointer(*ModuleRef)] out_module
|
14
|
+
# @param [FFI::Pointer(**Char_S)] out_message
|
15
|
+
# @return [Integer]
|
16
|
+
# @scope class
|
17
|
+
attach_function :parse_bitcode, :LLVMParseBitcode, [:pointer, :pointer, :pointer], :int
|
18
|
+
|
19
|
+
# (Not documented)
|
20
|
+
#
|
21
|
+
# @method parse_bitcode_in_context(context_ref, mem_buf, out_module, out_message)
|
22
|
+
# @param [FFI::Pointer(ContextRef)] context_ref
|
23
|
+
# @param [FFI::Pointer(MemoryBufferRef)] mem_buf
|
24
|
+
# @param [FFI::Pointer(*ModuleRef)] out_module
|
25
|
+
# @param [FFI::Pointer(**Char_S)] out_message
|
26
|
+
# @return [Integer]
|
27
|
+
# @scope class
|
28
|
+
attach_function :parse_bitcode_in_context, :LLVMParseBitcodeInContext, [:pointer, :pointer, :pointer, :pointer], :int
|
29
|
+
|
30
|
+
# Reads a module from the specified path, returning via the OutMP parameter
|
31
|
+
# a module provider which performs lazy deserialization. Returns 0 on success.
|
32
|
+
# Optionally returns a human-readable error message via OutMessage.
|
33
|
+
#
|
34
|
+
# @method get_bitcode_module_in_context(context_ref, mem_buf, out_m, out_message)
|
35
|
+
# @param [FFI::Pointer(ContextRef)] context_ref
|
36
|
+
# @param [FFI::Pointer(MemoryBufferRef)] mem_buf
|
37
|
+
# @param [FFI::Pointer(*ModuleRef)] out_m
|
38
|
+
# @param [FFI::Pointer(**Char_S)] out_message
|
39
|
+
# @return [Integer]
|
40
|
+
# @scope class
|
41
|
+
attach_function :get_bitcode_module_in_context, :LLVMGetBitcodeModuleInContext, [:pointer, :pointer, :pointer, :pointer], :int
|
42
|
+
|
43
|
+
# (Not documented)
|
44
|
+
#
|
45
|
+
# @method get_bitcode_module(mem_buf, out_m, out_message)
|
46
|
+
# @param [FFI::Pointer(MemoryBufferRef)] mem_buf
|
47
|
+
# @param [FFI::Pointer(*ModuleRef)] out_m
|
48
|
+
# @param [FFI::Pointer(**Char_S)] out_message
|
49
|
+
# @return [Integer]
|
50
|
+
# @scope class
|
51
|
+
attach_function :get_bitcode_module, :LLVMGetBitcodeModule, [:pointer, :pointer, :pointer], :int
|
52
|
+
|
53
|
+
# Deprecated: Use LLVMGetBitcodeModuleInContext instead.
|
54
|
+
#
|
55
|
+
# @method get_bitcode_module_provider_in_context(context_ref, mem_buf, out_mp, out_message)
|
56
|
+
# @param [FFI::Pointer(ContextRef)] context_ref
|
57
|
+
# @param [FFI::Pointer(MemoryBufferRef)] mem_buf
|
58
|
+
# @param [FFI::Pointer(*ModuleProviderRef)] out_mp
|
59
|
+
# @param [FFI::Pointer(**Char_S)] out_message
|
60
|
+
# @return [Integer]
|
61
|
+
# @scope class
|
62
|
+
attach_function :get_bitcode_module_provider_in_context, :LLVMGetBitcodeModuleProviderInContext, [:pointer, :pointer, :pointer, :pointer], :int
|
63
|
+
|
64
|
+
# Deprecated: Use LLVMGetBitcodeModule instead.
|
65
|
+
#
|
66
|
+
# @method get_bitcode_module_provider(mem_buf, out_mp, out_message)
|
67
|
+
# @param [FFI::Pointer(MemoryBufferRef)] mem_buf
|
68
|
+
# @param [FFI::Pointer(*ModuleProviderRef)] out_mp
|
69
|
+
# @param [FFI::Pointer(**Char_S)] out_message
|
70
|
+
# @return [Integer]
|
71
|
+
# @scope class
|
72
|
+
attach_function :get_bitcode_module_provider, :LLVMGetBitcodeModuleProvider, [:pointer, :pointer, :pointer], :int
|
73
|
+
|
74
|
+
# (Not documented)
|
75
|
+
#
|
76
|
+
# @method write_bitcode_to_file(m, path)
|
77
|
+
# @param [FFI::Pointer(ModuleRef)] m
|
78
|
+
# @param [String] path
|
79
|
+
# @return [Integer]
|
80
|
+
# @scope class
|
81
|
+
attach_function :write_bitcode_to_file, :LLVMWriteBitcodeToFile, [:pointer, :string], :int
|
82
|
+
|
83
|
+
# Writes a module to an open file descriptor. Returns 0 on success.
|
84
|
+
#
|
85
|
+
# @method write_bitcode_to_fd(m, fd, should_close, unbuffered)
|
86
|
+
# @param [FFI::Pointer(ModuleRef)] m
|
87
|
+
# @param [Integer] fd
|
88
|
+
# @param [Integer] should_close
|
89
|
+
# @param [Integer] unbuffered
|
90
|
+
# @return [Integer]
|
91
|
+
# @scope class
|
92
|
+
attach_function :write_bitcode_to_fd, :LLVMWriteBitcodeToFD, [:pointer, :int, :int, :int], :int
|
93
|
+
|
94
|
+
# Deprecated for LLVMWriteBitcodeToFD. Writes a module to an open file
|
95
|
+
# descriptor. Returns 0 on success. Closes the Handle.
|
96
|
+
#
|
97
|
+
# @method write_bitcode_to_file_handle(m, handle)
|
98
|
+
# @param [FFI::Pointer(ModuleRef)] m
|
99
|
+
# @param [Integer] handle
|
100
|
+
# @return [Integer]
|
101
|
+
# @scope class
|
102
|
+
attach_function :write_bitcode_to_file_handle, :LLVMWriteBitcodeToFileHandle, [:pointer, :int], :int
|
103
|
+
|
104
|
+
end
|
data/lib/llvm/core/builder.rb
CHANGED
@@ -1,7 +1,14 @@
|
|
1
1
|
module LLVM
|
2
2
|
class Builder
|
3
|
+
# Important: Call #dispose to free backend memory after use.
|
3
4
|
def initialize
|
4
|
-
@ptr = C.
|
5
|
+
@ptr = C.create_builder()
|
6
|
+
end
|
7
|
+
|
8
|
+
def dispose
|
9
|
+
return if @ptr.nil?
|
10
|
+
C.dispose_builder(@ptr)
|
11
|
+
@ptr = nil
|
5
12
|
end
|
6
13
|
|
7
14
|
# @private
|
@@ -15,7 +22,7 @@ module LLVM
|
|
15
22
|
# @return [LLVM::Builder]
|
16
23
|
def position(block, instruction)
|
17
24
|
raise "Block must not be nil" if block.nil?
|
18
|
-
C.
|
25
|
+
C.position_builder(self, block, instruction)
|
19
26
|
self
|
20
27
|
end
|
21
28
|
|
@@ -24,7 +31,7 @@ module LLVM
|
|
24
31
|
# @return [LLVM::Builder]
|
25
32
|
def position_before(instruction)
|
26
33
|
raise "Instruction must not be nil" if instruction.nil?
|
27
|
-
C.
|
34
|
+
C.position_builder_before(self, instruction)
|
28
35
|
self
|
29
36
|
end
|
30
37
|
|
@@ -33,27 +40,27 @@ module LLVM
|
|
33
40
|
# @return [LLVM::Builder]
|
34
41
|
def position_at_end(block)
|
35
42
|
raise "Block must not be nil" if block.nil?
|
36
|
-
C.
|
43
|
+
C.position_builder_at_end(self, block)
|
37
44
|
self
|
38
45
|
end
|
39
46
|
|
40
47
|
# The BasicBlock at which the Builder is currently positioned.
|
41
48
|
# @return [LLVM::BasicBlock]
|
42
49
|
def insert_block
|
43
|
-
BasicBlock.from_ptr(C.
|
50
|
+
BasicBlock.from_ptr(C.get_insert_block(self))
|
44
51
|
end
|
45
52
|
|
46
53
|
# @return [LLVM::Instruction]
|
47
54
|
# @LLVMinst ret
|
48
55
|
def ret_void
|
49
|
-
Instruction.from_ptr(C.
|
56
|
+
Instruction.from_ptr(C.build_ret_void(self))
|
50
57
|
end
|
51
58
|
|
52
59
|
# @param [LLVM::Value] val The value to return
|
53
60
|
# @return [LLVM::Instruction]
|
54
61
|
# @LLVMinst ret
|
55
62
|
def ret(val)
|
56
|
-
Instruction.from_ptr(C.
|
63
|
+
Instruction.from_ptr(C.build_ret(self, val))
|
57
64
|
end
|
58
65
|
|
59
66
|
# Builds a ret instruction returning multiple values.
|
@@ -63,7 +70,7 @@ module LLVM
|
|
63
70
|
def aggregate_ret(*vals)
|
64
71
|
FFI::MemoryPointer.new(FFI.type_size(:pointer) * vals.size) do |vals_ptr|
|
65
72
|
vals_ptr.write_array_of_pointer(vals)
|
66
|
-
Instruction.from_ptr(C.
|
73
|
+
Instruction.from_ptr(C.build_aggregate_ret(self, vals_ptr, vals.size))
|
67
74
|
end
|
68
75
|
end
|
69
76
|
|
@@ -73,7 +80,7 @@ module LLVM
|
|
73
80
|
# @LLVMinst br
|
74
81
|
def br(block)
|
75
82
|
Instruction.from_ptr(
|
76
|
-
C.
|
83
|
+
C.build_br(self, block))
|
77
84
|
end
|
78
85
|
|
79
86
|
# Conditional branching (i.e. if)
|
@@ -84,7 +91,7 @@ module LLVM
|
|
84
91
|
# @LLVMinst br
|
85
92
|
def cond(cond, iftrue, iffalse)
|
86
93
|
Instruction.from_ptr(
|
87
|
-
C.
|
94
|
+
C.build_cond_br(self, cond, iftrue, iffalse))
|
88
95
|
end
|
89
96
|
|
90
97
|
# @LLVMinst switch
|
@@ -95,7 +102,7 @@ module LLVM
|
|
95
102
|
# to the corresponding basic block.
|
96
103
|
# @return [LLVM::Instruction]
|
97
104
|
def switch(val, default, cases)
|
98
|
-
inst = SwitchInst.from_ptr(C.
|
105
|
+
inst = SwitchInst.from_ptr(C.build_switch(self, val, default, cases.size))
|
99
106
|
cases.each do |(val, block)|
|
100
107
|
inst.add_case(val, block)
|
101
108
|
end
|
@@ -113,7 +120,7 @@ module LLVM
|
|
113
120
|
# @LLVMinst invoke
|
114
121
|
def invoke(fun, args, normal, exception, name = "")
|
115
122
|
Instruction.from_ptr(
|
116
|
-
C.
|
123
|
+
C.build_invoke(self,
|
117
124
|
fun, args, args.size, normal, exception, name))
|
118
125
|
end
|
119
126
|
|
@@ -122,7 +129,7 @@ module LLVM
|
|
122
129
|
# @return [LLVM::Instruction]
|
123
130
|
# @LLVMinst unreachable
|
124
131
|
def unreachable
|
125
|
-
Instruction.from_ptr(C.
|
132
|
+
Instruction.from_ptr(C.build_unreachable(self))
|
126
133
|
end
|
127
134
|
|
128
135
|
# @param [LLVM::Value] lhs Integer or vector of integers
|
@@ -131,7 +138,7 @@ module LLVM
|
|
131
138
|
# @return [LLVM::Instruction] The integer sum of the two operands
|
132
139
|
# @LLVMinst add
|
133
140
|
def add(lhs, rhs, name = "")
|
134
|
-
Instruction.from_ptr(C.
|
141
|
+
Instruction.from_ptr(C.build_add(self, lhs, rhs, name))
|
135
142
|
end
|
136
143
|
|
137
144
|
# No signed wrap addition.
|
@@ -141,7 +148,7 @@ module LLVM
|
|
141
148
|
# @return [LLVM::Instruction] The integer sum of the two operands
|
142
149
|
# @LLVMinst add
|
143
150
|
def nsw_add(lhs, rhs, name = "")
|
144
|
-
Instruction.from_ptr(C.
|
151
|
+
Instruction.from_ptr(C.build_nsw_add(self, lhs, rhs, name))
|
145
152
|
end
|
146
153
|
|
147
154
|
# @param [LLVM::Value] lhs Floating point or vector of floating points
|
@@ -150,7 +157,7 @@ module LLVM
|
|
150
157
|
# @return [LLVM::Instruction] The floating point sum of the two operands
|
151
158
|
# @LLVMinst fadd
|
152
159
|
def fadd(lhs, rhs, name = "")
|
153
|
-
Instruction.from_ptr(C.
|
160
|
+
Instruction.from_ptr(C.build_f_add(self, lhs, rhs, name))
|
154
161
|
end
|
155
162
|
|
156
163
|
# @param [LLVM::Value] lhs Integer or vector of integers
|
@@ -159,7 +166,7 @@ module LLVM
|
|
159
166
|
# @return [LLVM::Instruction] The integer difference of the two operands
|
160
167
|
# @LLVMinst sub
|
161
168
|
def sub(lhs, rhs, name = "")
|
162
|
-
Instruction.from_ptr(C.
|
169
|
+
Instruction.from_ptr(C.build_sub(self, lhs, rhs, name))
|
163
170
|
end
|
164
171
|
|
165
172
|
# @param [LLVM::Value] lhs Floating point or vector of floating points
|
@@ -169,7 +176,7 @@ module LLVM
|
|
169
176
|
# operands
|
170
177
|
# @LLVMinst fsub
|
171
178
|
def fsub(lhs, rhs, name = "")
|
172
|
-
Instruction.from_ptr(C.
|
179
|
+
Instruction.from_ptr(C.build_f_sub(self, lhs, rhs, name))
|
173
180
|
end
|
174
181
|
|
175
182
|
# @param [LLVM::Value] lhs Integer or vector of integers
|
@@ -178,7 +185,7 @@ module LLVM
|
|
178
185
|
# @return [LLVM::Instruction] The integer product of the two operands
|
179
186
|
# @LLVMinst mul
|
180
187
|
def mul(lhs, rhs, name = "")
|
181
|
-
Instruction.from_ptr(C.
|
188
|
+
Instruction.from_ptr(C.build_mul(self, lhs, rhs, name))
|
182
189
|
end
|
183
190
|
|
184
191
|
# @param [LLVM::Value] lhs Floating point or vector of floating points
|
@@ -188,7 +195,7 @@ module LLVM
|
|
188
195
|
# operands
|
189
196
|
# @LLVMinst fmul
|
190
197
|
def fmul(lhs, rhs, name = "")
|
191
|
-
Instruction.from_ptr(C.
|
198
|
+
Instruction.from_ptr(C.build_f_mul(self, lhs, rhs, name))
|
192
199
|
end
|
193
200
|
|
194
201
|
# Unsigned integer division
|
@@ -198,7 +205,7 @@ module LLVM
|
|
198
205
|
# @return [LLVM::Instruction] The integer quotient of the two operands
|
199
206
|
# @LLVMinst udiv
|
200
207
|
def udiv(lhs, rhs, name = "")
|
201
|
-
Instruction.from_ptr(C.
|
208
|
+
Instruction.from_ptr(C.build_u_div(self, lhs, rhs, name))
|
202
209
|
end
|
203
210
|
|
204
211
|
# Signed division
|
@@ -208,7 +215,7 @@ module LLVM
|
|
208
215
|
# @return [LLVM::Instruction] The integer quotient of the two operands
|
209
216
|
# @LLVMinst sdiv
|
210
217
|
def sdiv(lhs, rhs, name = "")
|
211
|
-
Instruction.from_ptr(C.
|
218
|
+
Instruction.from_ptr(C.build_s_div(self, lhs, rhs, name))
|
212
219
|
end
|
213
220
|
|
214
221
|
# Signed exact division
|
@@ -218,7 +225,7 @@ module LLVM
|
|
218
225
|
# @return [LLVM::Instruction] The integer quotient of the two operands
|
219
226
|
# @LLVMinst sdiv
|
220
227
|
def exact_sdiv(lhs, rhs, name = "")
|
221
|
-
Instruction.from_ptr(C.
|
228
|
+
Instruction.from_ptr(C.build_exact_s_div(self, lhs, rhs, name))
|
222
229
|
end
|
223
230
|
|
224
231
|
# @param [LLVM::Value] lhs Floating point or vector of floating points
|
@@ -228,7 +235,7 @@ module LLVM
|
|
228
235
|
# operands
|
229
236
|
# @LLVMinst fdiv
|
230
237
|
def fdiv(lhs, rhs, name = "")
|
231
|
-
Instruction.from_ptr(C.
|
238
|
+
Instruction.from_ptr(C.build_f_div(self, lhs, rhs, name))
|
232
239
|
end
|
233
240
|
|
234
241
|
# Unsigned remainder
|
@@ -238,7 +245,7 @@ module LLVM
|
|
238
245
|
# @return [LLVM::Instruction] The integer remainder
|
239
246
|
# @LLVMinst urem
|
240
247
|
def urem(lhs, rhs, name = "")
|
241
|
-
Instruction.from_ptr(C.
|
248
|
+
Instruction.from_ptr(C.build_u_rem(self, lhs, rhs, name))
|
242
249
|
end
|
243
250
|
|
244
251
|
# Signed remainder
|
@@ -248,7 +255,7 @@ module LLVM
|
|
248
255
|
# @return [LLVM::Instruction] The integer remainder
|
249
256
|
# @LLVMinst srem
|
250
257
|
def srem(lhs, rhs, name = "")
|
251
|
-
Instruction.from_ptr(C.
|
258
|
+
Instruction.from_ptr(C.build_s_rem(self, lhs, rhs, name))
|
252
259
|
end
|
253
260
|
|
254
261
|
# @param [LLVM::Value] lhs Floating point or vector of floating points
|
@@ -257,7 +264,7 @@ module LLVM
|
|
257
264
|
# @return [LLVM::Instruction] The floating point remainder
|
258
265
|
# @LLVMinst frem
|
259
266
|
def frem(lhs, rhs, name = "")
|
260
|
-
Instruction.from_ptr(C.
|
267
|
+
Instruction.from_ptr(C.build_f_rem(self, lhs, rhs, name))
|
261
268
|
end
|
262
269
|
|
263
270
|
# @param [LLVM::Value] lhs Integer or vector of integers
|
@@ -266,7 +273,7 @@ module LLVM
|
|
266
273
|
# @return [LLVM::Instruction] An integer instruction
|
267
274
|
# @LLVMinst shl
|
268
275
|
def shl(lhs, rhs, name = "")
|
269
|
-
Instruction.from_ptr(C.
|
276
|
+
Instruction.from_ptr(C.build_shl(self, lhs, rhs, name))
|
270
277
|
end
|
271
278
|
|
272
279
|
# Shifts right with zero fill.
|
@@ -276,7 +283,7 @@ module LLVM
|
|
276
283
|
# @return [LLVM::Instruction] An integer instruction
|
277
284
|
# @LLVMinst lshr
|
278
285
|
def lshr(lhs, rhs, name = "")
|
279
|
-
Instruction.from_ptr(C.
|
286
|
+
Instruction.from_ptr(C.build_l_shr(self, lhs, rhs, name))
|
280
287
|
end
|
281
288
|
|
282
289
|
# Arithmatic shift right.
|
@@ -286,7 +293,7 @@ module LLVM
|
|
286
293
|
# @return [LLVM::Instruction] An integer instruction
|
287
294
|
# @LLVMinst ashr
|
288
295
|
def ashr(lhs, rhs, name = "")
|
289
|
-
Instruction.from_ptr(C.
|
296
|
+
Instruction.from_ptr(C.build_a_shr(self, lhs, rhs, name))
|
290
297
|
end
|
291
298
|
|
292
299
|
# @param [LLVM::Value] lhs Integer or vector of integers
|
@@ -295,7 +302,7 @@ module LLVM
|
|
295
302
|
# @return [LLVM::Instruction] An integer instruction
|
296
303
|
# @LLVMinst and
|
297
304
|
def and(lhs, rhs, name = "")
|
298
|
-
Instruction.from_ptr(C.
|
305
|
+
Instruction.from_ptr(C.build_and(self, lhs, rhs, name))
|
299
306
|
end
|
300
307
|
|
301
308
|
# @param [LLVM::Value] lhs Integer or vector of integers
|
@@ -304,7 +311,7 @@ module LLVM
|
|
304
311
|
# @return [LLVM::Instruction] An integer instruction
|
305
312
|
# @LLVMinst or
|
306
313
|
def or(lhs, rhs, name = "")
|
307
|
-
Instruction.from_ptr(C.
|
314
|
+
Instruction.from_ptr(C.build_or(self, lhs, rhs, name))
|
308
315
|
end
|
309
316
|
|
310
317
|
# @param [LLVM::Value] lhs Integer or vector of integers
|
@@ -313,7 +320,7 @@ module LLVM
|
|
313
320
|
# @return [LLVM::Instruction] An integer instruction
|
314
321
|
# @LLVMinst xor
|
315
322
|
def xor(lhs, rhs, name = "")
|
316
|
-
Instruction.from_ptr(C.
|
323
|
+
Instruction.from_ptr(C.build_xor(self, lhs, rhs, name))
|
317
324
|
end
|
318
325
|
|
319
326
|
# Integer negation. Implemented as a shortcut to the equivalent sub
|
@@ -323,7 +330,7 @@ module LLVM
|
|
323
330
|
# @return [LLVM::Instruction] The negated operand
|
324
331
|
# @LLVMinst sub
|
325
332
|
def neg(arg, name = "")
|
326
|
-
Instruction.from_ptr(C.
|
333
|
+
Instruction.from_ptr(C.build_neg(self, arg, name))
|
327
334
|
end
|
328
335
|
|
329
336
|
# Boolean negation.
|
@@ -331,7 +338,7 @@ module LLVM
|
|
331
338
|
# @param [String] name The name of the result in LLVM IR
|
332
339
|
# @return [LLVM::Instruction] The negated operand
|
333
340
|
def not(arg, name = "")
|
334
|
-
Instruction.from_ptr(C.
|
341
|
+
Instruction.from_ptr(C.build_not(self, arg, name))
|
335
342
|
end
|
336
343
|
|
337
344
|
# @param [LLVM::Type, #type] ty The type or value whose type
|
@@ -339,7 +346,7 @@ module LLVM
|
|
339
346
|
# @param [String] name The name of the result in LLVM IR
|
340
347
|
# @return [LLVM::Instruction] A pointer to the malloced bytes
|
341
348
|
def malloc(ty, name = "")
|
342
|
-
Instruction.from_ptr(C.
|
349
|
+
Instruction.from_ptr(C.build_malloc(self, LLVM::Type(ty), name))
|
343
350
|
end
|
344
351
|
|
345
352
|
# @param [LLVM::Type, #type] ty The type or value whose type will be the
|
@@ -348,7 +355,7 @@ module LLVM
|
|
348
355
|
# @param [String] name The name of the result in LLVM IR
|
349
356
|
# @return [LLVM::Instruction] A pointer to the malloced array
|
350
357
|
def array_malloc(ty, sz, name = "")
|
351
|
-
Instruction.from_ptr(C.
|
358
|
+
Instruction.from_ptr(C.build_array_malloc(self, LLVM::Type(ty), sz, name))
|
352
359
|
end
|
353
360
|
|
354
361
|
# Stack allocation.
|
@@ -358,7 +365,7 @@ module LLVM
|
|
358
365
|
# @return [LLVM::Instruction] A pointer to the allocad bytes
|
359
366
|
# @LLVMinst alloca
|
360
367
|
def alloca(ty, name = "")
|
361
|
-
Instruction.from_ptr(C.
|
368
|
+
Instruction.from_ptr(C.build_alloca(self, LLVM::Type(ty), name))
|
362
369
|
end
|
363
370
|
|
364
371
|
# Array stack allocation
|
@@ -369,13 +376,13 @@ module LLVM
|
|
369
376
|
# @return [LLVM::Instruction] A pointer to the allocad array
|
370
377
|
# @LLVMinst alloca
|
371
378
|
def array_alloca(ty, sz, name = "")
|
372
|
-
Instruction.from_ptr(C.
|
379
|
+
Instruction.from_ptr(C.build_array_alloca(self, LLVM::Type(ty), sz, name))
|
373
380
|
end
|
374
381
|
|
375
382
|
# @param [LLVM::Value] ptr The pointer to be freed
|
376
383
|
# @return [LLVM::Instruction] The result of the free instruction
|
377
384
|
def free(ptr)
|
378
|
-
Instruction.from_ptr(C.
|
385
|
+
Instruction.from_ptr(C.build_free(self, ptr))
|
379
386
|
end
|
380
387
|
|
381
388
|
# Load the value of a given pointer
|
@@ -385,7 +392,7 @@ module LLVM
|
|
385
392
|
# a value of the pointer's type.
|
386
393
|
# @LLVMinst load
|
387
394
|
def load(ptr, name = "")
|
388
|
-
Instruction.from_ptr(C.
|
395
|
+
Instruction.from_ptr(C.build_load(self, ptr, name))
|
389
396
|
end
|
390
397
|
|
391
398
|
# Store a value at a given pointer
|
@@ -394,7 +401,7 @@ module LLVM
|
|
394
401
|
# @return [LLVM::Instruction] The result of the store operation
|
395
402
|
# @LLVMinst store
|
396
403
|
def store(val, ptr)
|
397
|
-
Instruction.from_ptr(C.
|
404
|
+
Instruction.from_ptr(C.build_store(self, val, ptr))
|
398
405
|
end
|
399
406
|
|
400
407
|
# Obtain a pointer to the element at the given indices
|
@@ -410,7 +417,7 @@ module LLVM
|
|
410
417
|
FFI::MemoryPointer.new(FFI.type_size(:pointer) * indices.size) do |indices_ptr|
|
411
418
|
indices_ptr.write_array_of_pointer(indices)
|
412
419
|
return Instruction.from_ptr(
|
413
|
-
C.
|
420
|
+
C.build_gep(self, ptr, indices_ptr, indices.size, name))
|
414
421
|
end
|
415
422
|
end
|
416
423
|
|
@@ -428,7 +435,7 @@ module LLVM
|
|
428
435
|
FFI::MemoryPointer.new(FFI.type_size(:pointer) * indices.size) do |indices_ptr|
|
429
436
|
indices_ptr.write_array_of_pointer(indices)
|
430
437
|
return Instruction.from_ptr(
|
431
|
-
C.
|
438
|
+
C.build_in_bounds_gep(self, ptr, indices_ptr, indices.size, name))
|
432
439
|
end
|
433
440
|
end
|
434
441
|
|
@@ -441,7 +448,7 @@ module LLVM
|
|
441
448
|
# @LLVMinst gep
|
442
449
|
# @see http://llvm.org/docs/GetElementPtr.html
|
443
450
|
def struct_gep(pointer, idx, name = "")
|
444
|
-
Instruction.from_ptr(C.
|
451
|
+
Instruction.from_ptr(C.build_struct_gep(self, pointer, idx, name))
|
445
452
|
end
|
446
453
|
|
447
454
|
# Creates a global string initialized to a given value.
|
@@ -449,7 +456,7 @@ module LLVM
|
|
449
456
|
# @param [Name] name Name of the result in LLVM IR
|
450
457
|
# @return [LLVM::Instruction] Reference to the global string
|
451
458
|
def global_string(string, name = "")
|
452
|
-
Instruction.from_ptr(C.
|
459
|
+
Instruction.from_ptr(C.build_global_string(self, string, name))
|
453
460
|
end
|
454
461
|
|
455
462
|
# Creates a pointer to a global string initialized to a given value.
|
@@ -457,7 +464,7 @@ module LLVM
|
|
457
464
|
# @param [String] name The name of the result in LLVM IR
|
458
465
|
# @return [LLVM::Instruction] Reference to the global string pointer
|
459
466
|
def global_string_pointer(string, name = "")
|
460
|
-
Instruction.from_ptr(C.
|
467
|
+
Instruction.from_ptr(C.build_global_string_ptr(self, string, name))
|
461
468
|
end
|
462
469
|
|
463
470
|
# Truncates its operand to the given type. The size of the value type must
|
@@ -469,7 +476,7 @@ module LLVM
|
|
469
476
|
# @return [LLVM::Instruction] The truncated value
|
470
477
|
# @LLVMinst trunc
|
471
478
|
def trunc(val, ty, name = "")
|
472
|
-
Instruction.from_ptr(C.
|
479
|
+
Instruction.from_ptr(C.build_trunc(self, val, LLVM::Type(ty), name))
|
473
480
|
end
|
474
481
|
|
475
482
|
# Zero extends its operand to the given type. The size of the value type
|
@@ -481,7 +488,7 @@ module LLVM
|
|
481
488
|
# @return [LLVM::Instruction] The extended value
|
482
489
|
# @LLVMinst zext
|
483
490
|
def zext(val, ty, name = "")
|
484
|
-
Instruction.from_ptr(C.
|
491
|
+
Instruction.from_ptr(C.build_z_ext(self, val, LLVM::Type(ty), name))
|
485
492
|
end
|
486
493
|
|
487
494
|
# Sign extension by copying the sign bit (highest order bit) of the value
|
@@ -493,7 +500,7 @@ module LLVM
|
|
493
500
|
# @return [LLVM::Instruction] The extended value
|
494
501
|
# @LLVMinst sext
|
495
502
|
def sext(val, ty, name = "")
|
496
|
-
Instruction.from_ptr(C.
|
503
|
+
Instruction.from_ptr(C.build_s_ext(self, val, LLVM::Type(ty), name))
|
497
504
|
end
|
498
505
|
|
499
506
|
# Convert a floating point to an unsigned integer
|
@@ -504,7 +511,7 @@ module LLVM
|
|
504
511
|
# @return [LLVM::Instruction] The converted value
|
505
512
|
# @LLVMinst fptoui
|
506
513
|
def fp2ui(val, ty, name = "")
|
507
|
-
Instruction.from_ptr(C.
|
514
|
+
Instruction.from_ptr(C.build_fp_to_ui(self, val, LLVM::Type(ty), name))
|
508
515
|
end
|
509
516
|
|
510
517
|
# Convert a floating point to a signed integer
|
@@ -515,7 +522,7 @@ module LLVM
|
|
515
522
|
# @return [LLVM::Instruction] The converted value
|
516
523
|
# @LLVMinst fptosi
|
517
524
|
def fp2si(val, ty, name = "")
|
518
|
-
Instruction.from_ptr(C.
|
525
|
+
Instruction.from_ptr(C.build_fp_to_si(self, val, LLVM::Type(ty), name))
|
519
526
|
end
|
520
527
|
|
521
528
|
# Convert an unsigned integer to a floating point
|
@@ -527,7 +534,7 @@ module LLVM
|
|
527
534
|
# @return [LLVM::Instruction] The converted value
|
528
535
|
# @LLVMinst uitofp
|
529
536
|
def ui2fp(val, ty, name = "")
|
530
|
-
Instruction.from_ptr(C.
|
537
|
+
Instruction.from_ptr(C.build_ui_to_fp(self, val, LLVM::Type(ty), name))
|
531
538
|
end
|
532
539
|
|
533
540
|
# Convert a signed integer to a floating point
|
@@ -539,7 +546,7 @@ module LLVM
|
|
539
546
|
# @return [LLVM::Instruction] The converted value
|
540
547
|
# @LLVMinst sitofp
|
541
548
|
def si2fp(val, ty, name = "")
|
542
|
-
Instruction.from_ptr(C.
|
549
|
+
Instruction.from_ptr(C.build_si_to_fp(self, val, LLVM::Type(ty), name))
|
543
550
|
end
|
544
551
|
|
545
552
|
# Truncate a floating point value
|
@@ -550,7 +557,7 @@ module LLVM
|
|
550
557
|
# @return [LLVM::Instruction] The truncated value
|
551
558
|
# @LLVMinst fptrunc
|
552
559
|
def fp_trunc(val, ty, name = "")
|
553
|
-
Instruction.from_ptr(C.
|
560
|
+
Instruction.from_ptr(C.build_fp_trunc(self, val, LLVM::Type(ty), name))
|
554
561
|
end
|
555
562
|
|
556
563
|
# Extend a floating point value
|
@@ -561,7 +568,7 @@ module LLVM
|
|
561
568
|
# @return [LLVM::Instruction] The extended value
|
562
569
|
# @LLVMinst fpext
|
563
570
|
def fp_ext(val, ty, name = "")
|
564
|
-
Instruction.from_ptr(C.
|
571
|
+
Instruction.from_ptr(C.build_fp_ext(self, val, LLVM::Type(ty), name))
|
565
572
|
end
|
566
573
|
|
567
574
|
# Cast a pointer to an int. Useful for pointer arithmetic.
|
@@ -572,7 +579,7 @@ module LLVM
|
|
572
579
|
# the pointer's address
|
573
580
|
# @LLVMinst ptrtoint
|
574
581
|
def ptr2int(val, ty, name = "")
|
575
|
-
Instruction.from_ptr(C.
|
582
|
+
Instruction.from_ptr(C.build_ptr_to_int(self, val, LLVM::Type(ty), name))
|
576
583
|
end
|
577
584
|
|
578
585
|
# Cast an int to a pointer
|
@@ -583,7 +590,7 @@ module LLVM
|
|
583
590
|
# held in val
|
584
591
|
# @LLVMinst inttoptr
|
585
592
|
def int2ptr(val, ty, name = "")
|
586
|
-
Instruction.from_ptr(C.
|
593
|
+
Instruction.from_ptr(C.build_int_to_ptr(self, val, LLVM::Type(ty), name))
|
587
594
|
end
|
588
595
|
|
589
596
|
# Cast a value to the given type without changing any bits
|
@@ -593,7 +600,7 @@ module LLVM
|
|
593
600
|
# @return [LLVM::Instruction] A value of the target type
|
594
601
|
# @LLVMinst bitcast
|
595
602
|
def bit_cast(val, ty, name = "")
|
596
|
-
Instruction.from_ptr(C.
|
603
|
+
Instruction.from_ptr(C.build_bit_cast(self, val, LLVM::Type(ty), name))
|
597
604
|
end
|
598
605
|
|
599
606
|
# @param [LLVM::Value] val
|
@@ -603,7 +610,7 @@ module LLVM
|
|
603
610
|
# @LLVMinst zext
|
604
611
|
# @LLVMinst bitcast
|
605
612
|
def zext_or_bit_cast(val, ty, name = "")
|
606
|
-
Instruction.from_ptr(C.
|
613
|
+
Instruction.from_ptr(C.build_z_ext_or_bit_cast(self, val, LLVM::Type(ty), name))
|
607
614
|
end
|
608
615
|
|
609
616
|
# @param [LLVM::Value] val
|
@@ -613,7 +620,7 @@ module LLVM
|
|
613
620
|
# @LLVMinst sext
|
614
621
|
# @LLVMinst bitcast
|
615
622
|
def sext_or_bit_cast(val, ty, name = "")
|
616
|
-
Instruction.from_ptr(C.
|
623
|
+
Instruction.from_ptr(C.build_s_ext_or_bit_cast(self, val, LLVM::Type(ty), name))
|
617
624
|
end
|
618
625
|
|
619
626
|
# @param [LLVM::Value] val
|
@@ -623,7 +630,7 @@ module LLVM
|
|
623
630
|
# @LLVMinst trunc
|
624
631
|
# @LLVMinst bitcast
|
625
632
|
def trunc_or_bit_cast(val, ty, name = "")
|
626
|
-
Instruction.from_ptr(C.
|
633
|
+
Instruction.from_ptr(C.build_trunc_or_bit_cast(self, val, LLVM::Type(ty), name))
|
627
634
|
end
|
628
635
|
|
629
636
|
# @param [LLVM::Value] val
|
@@ -631,7 +638,7 @@ module LLVM
|
|
631
638
|
# @param [String] name The name of the result in LLVM IR
|
632
639
|
# @return [LLVM::Instruction]
|
633
640
|
def pointer_cast(val, ty, name = "")
|
634
|
-
Instruction.from_ptr(C.
|
641
|
+
Instruction.from_ptr(C.build_pointer_cast(self, val, LLVM::Type(ty), name))
|
635
642
|
end
|
636
643
|
|
637
644
|
# @param [LLVM::Value] val
|
@@ -639,7 +646,7 @@ module LLVM
|
|
639
646
|
# @param [String] name The name of the result in LLVM IR
|
640
647
|
# @return [LLVM::Instruction]
|
641
648
|
def int_cast(val, ty, name = "")
|
642
|
-
Instruction.from_ptr(C.
|
649
|
+
Instruction.from_ptr(C.build_int_cast(self, val, LLVM::Type(ty), name))
|
643
650
|
end
|
644
651
|
|
645
652
|
# @param [LLVM::Value] val
|
@@ -647,7 +654,7 @@ module LLVM
|
|
647
654
|
# @param [String] name The name of the result in LLVM IR
|
648
655
|
# @return [LLVM::Instruction]
|
649
656
|
def fp_cast(val, ty, name = "")
|
650
|
-
Instruction.from_ptr(C.
|
657
|
+
Instruction.from_ptr(C.build_fp_cast(self, val, LLVM::Type(ty), name))
|
651
658
|
end
|
652
659
|
|
653
660
|
# Builds an icmp Instruction. Compares lhs to rhs (Instructions)
|
@@ -671,7 +678,7 @@ module LLVM
|
|
671
678
|
# @return [LLVM::Instruction] A boolean represented as i1
|
672
679
|
# @LLVMinst icmp
|
673
680
|
def icmp(pred, lhs, rhs, name = "")
|
674
|
-
Instruction.from_ptr(C.
|
681
|
+
Instruction.from_ptr(C.build_i_cmp(self, pred, lhs, rhs, name))
|
675
682
|
end
|
676
683
|
|
677
684
|
# Builds an fcmp Instruction. Compares lhs to rhs (Instructions) as Reals
|
@@ -701,7 +708,7 @@ module LLVM
|
|
701
708
|
# @return [LLVM::Instruction] A boolean represented as i1
|
702
709
|
# @LLVMinst fcmp
|
703
710
|
def fcmp(pred, lhs, rhs, name = "")
|
704
|
-
Instruction.from_ptr(C.
|
711
|
+
Instruction.from_ptr(C.build_f_cmp(self, pred, lhs, rhs, name))
|
705
712
|
end
|
706
713
|
|
707
714
|
# Build a Phi node of the given type with the given incoming branches
|
@@ -715,7 +722,7 @@ module LLVM
|
|
715
722
|
# @LLVMinst phi
|
716
723
|
def phi(ty, incoming, name = "")
|
717
724
|
|
718
|
-
phi = Phi.from_ptr(C.
|
725
|
+
phi = Phi.from_ptr(C.build_phi(self, LLVM::Type(ty), name))
|
719
726
|
phi.add_incoming(incoming)
|
720
727
|
phi
|
721
728
|
end
|
@@ -736,7 +743,7 @@ module LLVM
|
|
736
743
|
|
737
744
|
args_ptr = FFI::MemoryPointer.new(FFI.type_size(:pointer) * args.size)
|
738
745
|
args_ptr.write_array_of_pointer(args)
|
739
|
-
CallInst.from_ptr(C.
|
746
|
+
CallInst.from_ptr(C.build_call(self, fun, args_ptr, args.size, name))
|
740
747
|
end
|
741
748
|
|
742
749
|
# Return a value based on a condition. This differs from 'cond' in that
|
@@ -751,7 +758,7 @@ module LLVM
|
|
751
758
|
# _else
|
752
759
|
# @LLVMinst select
|
753
760
|
def select(_if, _then, _else, name = "")
|
754
|
-
Instruction.from_ptr(C.
|
761
|
+
Instruction.from_ptr(C.build_select(self, _if, _then, _else, name))
|
755
762
|
end
|
756
763
|
|
757
764
|
# Extract an element from a vector
|
@@ -762,7 +769,7 @@ module LLVM
|
|
762
769
|
# @return [LLVM::Instruction] The extracted element
|
763
770
|
# @LLVMinst extractelement
|
764
771
|
def extract_element(vector, idx, name = "")
|
765
|
-
Instruction.from_ptr(C.
|
772
|
+
Instruction.from_ptr(C.build_extract_element(self, vector, idx, name))
|
766
773
|
end
|
767
774
|
|
768
775
|
# Insert an element into a vector
|
@@ -773,7 +780,7 @@ module LLVM
|
|
773
780
|
# @return [LLVM::Instruction] A vector the same type as 'vector'
|
774
781
|
# @LLVMinst insertelement
|
775
782
|
def insert_element(vector, elem, idx, name = "")
|
776
|
-
Instruction.from_ptr(C.
|
783
|
+
Instruction.from_ptr(C.build_insert_element(self, vector, elem, idx, name))
|
777
784
|
end
|
778
785
|
|
779
786
|
# Shuffle two vectors according to a given mask
|
@@ -785,7 +792,7 @@ module LLVM
|
|
785
792
|
# @return [LLVM::Instruction] The shuffled vector
|
786
793
|
# @LLVMinst shufflevector
|
787
794
|
def shuffle_vector(vec1, vec2, mask, name = "")
|
788
|
-
Instruction.from_ptr(C.
|
795
|
+
Instruction.from_ptr(C.build_shuffle_vector(self, vec1, vec2, mask, name))
|
789
796
|
end
|
790
797
|
|
791
798
|
# Extract the value of a member field from an aggregate value
|
@@ -795,7 +802,7 @@ module LLVM
|
|
795
802
|
# @return [LLVM::Instruction] The extracted value
|
796
803
|
# @LLVMinst extractvalue
|
797
804
|
def extract_value(aggregate, idx, name = "")
|
798
|
-
Instruction.from_ptr(C.
|
805
|
+
Instruction.from_ptr(C.build_extract_value(self, aggregate, idx, name))
|
799
806
|
end
|
800
807
|
|
801
808
|
# Insert a value into an aggregate value's member field
|
@@ -806,7 +813,7 @@ module LLVM
|
|
806
813
|
# @return [LLVM::Instruction] An aggregate value of the same type as 'aggregate'
|
807
814
|
# @LLVMinst insertvalue
|
808
815
|
def insert_value(aggregate, elem, idx, name = "")
|
809
|
-
Instruction.from_ptr(C.
|
816
|
+
Instruction.from_ptr(C.build_insert_value(self, aggregate, elem, idx, name))
|
810
817
|
end
|
811
818
|
|
812
819
|
# Check if a value is null
|
@@ -814,7 +821,7 @@ module LLVM
|
|
814
821
|
# @param [String] name The name of the result in LLVM IR
|
815
822
|
# @return [LLVM::Instruction] An i1
|
816
823
|
def is_null(val, name = "")
|
817
|
-
Instruction.from_ptr(C.
|
824
|
+
Instruction.from_ptr(C.build_is_null(self, val, name))
|
818
825
|
end
|
819
826
|
|
820
827
|
# Check if a value is not null
|
@@ -822,7 +829,7 @@ module LLVM
|
|
822
829
|
# @param [String] name The name of the result in LLVM IR
|
823
830
|
# @return [LLVM::Instruction] An i1
|
824
831
|
def is_not_null(val, name = "")
|
825
|
-
Instruction.from_ptr(C.
|
832
|
+
Instruction.from_ptr(C.build_is_not_null(self, val, name))
|
826
833
|
end
|
827
834
|
|
828
835
|
# Calculate the difference between two pointers
|
@@ -832,13 +839,7 @@ module LLVM
|
|
832
839
|
# @return [LLVM::Instruction] The integer difference between the two
|
833
840
|
# pointers
|
834
841
|
def ptr_diff(lhs, rhs, name = "")
|
835
|
-
Instruction.from_ptr(C.
|
836
|
-
end
|
837
|
-
|
838
|
-
# Disposes the builder.
|
839
|
-
# @return nil
|
840
|
-
def dispose
|
841
|
-
C.LLVMDisposeBuilder(@ptr)
|
842
|
+
Instruction.from_ptr(C.build_ptr_diff(lhs, rhs, name))
|
842
843
|
end
|
843
844
|
end
|
844
845
|
end
|