rltk 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +21 -22
- data/lib/rltk/ast.rb +185 -118
- data/lib/rltk/cfg.rb +157 -103
- data/lib/rltk/cg/basic_block.rb +19 -19
- data/lib/rltk/cg/bindings.rb +16 -16
- data/lib/rltk/cg/builder.rb +129 -129
- data/lib/rltk/cg/context.rb +7 -7
- data/lib/rltk/cg/contractor.rb +7 -7
- data/lib/rltk/cg/execution_engine.rb +30 -30
- data/lib/rltk/cg/function.rb +37 -37
- data/lib/rltk/cg/generated_bindings.rb +3932 -3932
- data/lib/rltk/cg/generic_value.rb +17 -17
- data/lib/rltk/cg/instruction.rb +116 -116
- data/lib/rltk/cg/llvm.rb +22 -22
- data/lib/rltk/cg/memory_buffer.rb +7 -7
- data/lib/rltk/cg/module.rb +73 -73
- data/lib/rltk/cg/pass_manager.rb +35 -35
- data/lib/rltk/cg/target.rb +41 -41
- data/lib/rltk/cg/triple.rb +7 -7
- data/lib/rltk/cg/type.rb +75 -75
- data/lib/rltk/cg/value.rb +161 -161
- data/lib/rltk/lexer.rb +57 -57
- data/lib/rltk/lexers/calculator.rb +7 -7
- data/lib/rltk/lexers/ebnf.rb +5 -5
- data/lib/rltk/parser.rb +338 -295
- data/lib/rltk/parsers/infix_calc.rb +7 -7
- data/lib/rltk/parsers/postfix_calc.rb +3 -3
- data/lib/rltk/parsers/prefix_calc.rb +3 -3
- data/lib/rltk/token.rb +13 -13
- data/lib/rltk/version.rb +6 -6
- data/test/cg/tc_basic_block.rb +17 -17
- data/test/cg/tc_control_flow.rb +41 -41
- data/test/cg/tc_function.rb +4 -4
- data/test/cg/tc_generic_value.rb +3 -3
- data/test/cg/tc_instruction.rb +53 -53
- data/test/cg/tc_math.rb +12 -12
- data/test/cg/tc_module.rb +14 -14
- data/test/cg/tc_transforms.rb +11 -11
- data/test/cg/tc_type.rb +12 -12
- data/test/cg/tc_value.rb +35 -35
- data/test/cg/ts_cg.rb +5 -5
- data/test/tc_ast.rb +137 -60
- data/test/tc_cfg.rb +34 -34
- data/test/tc_lexer.rb +42 -42
- data/test/tc_parser.rb +250 -173
- data/test/tc_token.rb +2 -2
- data/test/ts_rltk.rb +8 -8
- metadata +84 -85
- data/lib/rltk/cg/old_generated_bindings.rb +0 -6152
data/lib/rltk/cg/basic_block.rb
CHANGED
@@ -23,7 +23,7 @@ module RLTK::CG
|
|
23
23
|
# BasicBlock.new or using the {Function::BasicBlockCollection#append}
|
24
24
|
# method.
|
25
25
|
class BasicBlock < Value
|
26
|
-
|
26
|
+
|
27
27
|
# Create a new BasicBlock object. The way the block is created is
|
28
28
|
# determined by the *overloaded* parameter. If it is a Function
|
29
29
|
# object then the new block is appended to the end of the function.
|
@@ -41,19 +41,19 @@ module RLTK::CG
|
|
41
41
|
# @param [Proc] block Block to be invoked by {#build}.
|
42
42
|
def initialize(overloaded, name = '', builder = nil, context = nil, *block_args, &block)
|
43
43
|
check_type(context, Context, 'context') if context
|
44
|
-
|
44
|
+
|
45
45
|
@ptr =
|
46
46
|
case overloaded
|
47
47
|
when FFI::Pointer
|
48
48
|
overloaded
|
49
|
-
|
49
|
+
|
50
50
|
when Function
|
51
51
|
if context
|
52
52
|
Bindings.append_basic_block_in_context(context, overloaded, name)
|
53
53
|
else
|
54
54
|
Bindings.append_basic_block(overloaded, name)
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
when BasicBlock
|
58
58
|
if context
|
59
59
|
Bindings.insert_basic_block_in_context(context, overloaded, name)
|
@@ -61,10 +61,10 @@ module RLTK::CG
|
|
61
61
|
Bindings.insert_basic_block(overloaded, name)
|
62
62
|
end
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
self.build(builder, *block_args, &block) if block
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
# Used to add instructions to a BasicBlock. The block given to this
|
69
69
|
# method is executed inside the context of a {Builder} object, either
|
70
70
|
# the one passed in the *builder* parameter or one created for this
|
@@ -85,7 +85,7 @@ module RLTK::CG
|
|
85
85
|
def build(builder = nil, *block_args, &block)
|
86
86
|
if builder then builder else Builder.new end.build(self, *block_args, &block)
|
87
87
|
end
|
88
|
-
|
88
|
+
|
89
89
|
# Creates a new BasicBlock inserted immediately before this block.
|
90
90
|
#
|
91
91
|
# @param [String] name Name of this BasicBlock.
|
@@ -95,36 +95,36 @@ module RLTK::CG
|
|
95
95
|
def insert_before(name = '', context = nil)
|
96
96
|
BasicBlock.new(self, name, context)
|
97
97
|
end
|
98
|
-
|
98
|
+
|
99
99
|
# @return [InstructionCollect] Collection of all instructions inside this BasicBlock.
|
100
100
|
def instructions
|
101
101
|
@instructions ||= InstructionCollection.new(self)
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
104
|
# @return [BasicBlock, nil] BasicBlock that occures immediately after this block or nil.
|
105
105
|
def next
|
106
106
|
if (ptr = Bindings.get_next_basic_block(@ptr)).null? then nil else BasicBlock.new(ptr) end
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
# @return [Function] Function object that this BasicBlock belongs to.
|
110
110
|
def parent
|
111
111
|
if (ptr = Bindings.get_basic_block_parent(@ptr)).null? then nil else Function.new(ptr) end
|
112
112
|
end
|
113
|
-
|
113
|
+
|
114
114
|
# @return [BasicBlock, nil] BasicBlock that occures immediately before this block or nil.
|
115
115
|
def previous
|
116
116
|
if (ptr = Bindings.get_previous_basic_block(@ptr)).null? then nil else BasicBlock.new(ptr) end
|
117
117
|
end
|
118
|
-
|
118
|
+
|
119
119
|
# This class is used to access all of the {Instruction Instructions} that have been added to a {BasicBlock}.
|
120
120
|
class InstructionCollection
|
121
121
|
include Enumerable
|
122
|
-
|
122
|
+
|
123
123
|
# @param [BasicBlock] bb BasicBlock this collection belongs to.
|
124
124
|
def initialize(bb)
|
125
125
|
@bb = bb
|
126
126
|
end
|
127
|
-
|
127
|
+
|
128
128
|
# Iterate over each {Instruction} in this collection.
|
129
129
|
#
|
130
130
|
# @yieldparam inst [Instruction]
|
@@ -132,22 +132,22 @@ module RLTK::CG
|
|
132
132
|
# @return [Enumerator] An Enumerator is returned if no block is given.
|
133
133
|
def each
|
134
134
|
return to_enum(:each) unless block_given?
|
135
|
-
|
135
|
+
|
136
136
|
inst = self.first
|
137
|
-
|
137
|
+
|
138
138
|
while inst
|
139
139
|
yield inst
|
140
140
|
inst = inst.next
|
141
141
|
end
|
142
|
-
|
142
|
+
|
143
143
|
self
|
144
144
|
end
|
145
|
-
|
145
|
+
|
146
146
|
# @return [Instruction] First instruction in this collection.
|
147
147
|
def first
|
148
148
|
if (ptr = Bindings.get_first_instruction(@bb)).null? then nil else Instruction.from_ptr(ptr) end
|
149
149
|
end
|
150
|
-
|
150
|
+
|
151
151
|
# @return [Instruction] Last instruction in this collection.
|
152
152
|
def last
|
153
153
|
if (ptr = Bindings.get_last_instruction(@bb)).null? then nil else Instruction.from_ptr(ptr) end
|
data/lib/rltk/cg/bindings.rb
CHANGED
@@ -27,7 +27,7 @@ require 'rltk/cg'
|
|
27
27
|
#######################
|
28
28
|
|
29
29
|
module RLTK::CG
|
30
|
-
|
30
|
+
|
31
31
|
# This module provides access to stored FFI::Pointer objects and allows a
|
32
32
|
# class to be passed directly into FFI methods. It also provides a
|
33
33
|
# pointer comparison method.
|
@@ -35,7 +35,7 @@ module RLTK::CG
|
|
35
35
|
# @return [FFI::Pointer]
|
36
36
|
attr_accessor :ptr
|
37
37
|
alias :to_ptr :ptr
|
38
|
-
|
38
|
+
|
39
39
|
# Compares one BindingClass object to another.
|
40
40
|
#
|
41
41
|
# @param [BindingClass] other Another BindingClass object to compare to.
|
@@ -45,23 +45,23 @@ module RLTK::CG
|
|
45
45
|
self.class == other.class and @ptr == other.ptr
|
46
46
|
end
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
# This module contains FFI bindings to LLVM.
|
50
50
|
module Bindings
|
51
51
|
extend FFI::Library
|
52
52
|
ffi_lib("LLVM-#{RLTK::LLVM_TARGET_VERSION}")
|
53
|
-
|
53
|
+
|
54
54
|
# Exception that is thrown when the LLVM target version does not
|
55
55
|
# match the version of LLVM present on the system.
|
56
56
|
class LibraryMismatch < Exception; end
|
57
|
-
|
57
|
+
|
58
58
|
# Require the generated bindings files while handling errors.
|
59
59
|
require 'rltk/cg/generated_bindings'
|
60
|
-
|
60
|
+
|
61
61
|
#############
|
62
62
|
# Constants #
|
63
63
|
#############
|
64
|
-
|
64
|
+
|
65
65
|
# List of architectures supported by LLVM.
|
66
66
|
ARCHS = [
|
67
67
|
:Alpha,
|
@@ -80,14 +80,14 @@ module RLTK::CG
|
|
80
80
|
:X86,
|
81
81
|
:XCore
|
82
82
|
]
|
83
|
-
|
83
|
+
|
84
84
|
# List of assembly parsers.
|
85
85
|
ASM_PARSERS = [
|
86
86
|
:ARM,
|
87
87
|
:MBLaze,
|
88
88
|
:X86
|
89
89
|
]
|
90
|
-
|
90
|
+
|
91
91
|
# List of assembly printers.
|
92
92
|
ASM_PRINTERS = [
|
93
93
|
:Alpha,
|
@@ -104,11 +104,11 @@ module RLTK::CG
|
|
104
104
|
:X86,
|
105
105
|
:XCore
|
106
106
|
]
|
107
|
-
|
107
|
+
|
108
108
|
###########
|
109
109
|
# Methods #
|
110
110
|
###########
|
111
|
-
|
111
|
+
|
112
112
|
# Converts a CamelCase string into an underscored string.
|
113
113
|
#
|
114
114
|
# @param [#to_s] name CamelCase string.
|
@@ -120,7 +120,7 @@ module RLTK::CG
|
|
120
120
|
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
121
121
|
downcase.to_sym
|
122
122
|
end
|
123
|
-
|
123
|
+
|
124
124
|
# A wrapper class for FFI::Library.attach_function
|
125
125
|
#
|
126
126
|
# @param [Symbol] func Function name.
|
@@ -129,21 +129,21 @@ module RLTK::CG
|
|
129
129
|
def self.add_binding(func, args, returns)
|
130
130
|
attach_function(get_bname(func.to_s[4..-1]), func, args, returns)
|
131
131
|
end
|
132
|
-
|
132
|
+
|
133
133
|
####################
|
134
134
|
# Missing Bindings #
|
135
135
|
####################
|
136
|
-
|
136
|
+
|
137
137
|
ARCHS.each do |arch|
|
138
138
|
add_binding("LLVMInitialize#{arch}Target", [], :void)
|
139
139
|
add_binding("LLVMInitialize#{arch}TargetInfo", [], :void)
|
140
140
|
add_binding("LLVMInitialize#{arch}TargetMC", [], :void)
|
141
141
|
end
|
142
|
-
|
142
|
+
|
143
143
|
ASM_PARSERS.each do |asm|
|
144
144
|
add_binding("LLVMInitialize#{asm}AsmParser", [], :void)
|
145
145
|
end
|
146
|
-
|
146
|
+
|
147
147
|
ASM_PRINTERS.each do |asm|
|
148
148
|
add_binding("LLVMInitialize#{asm}AsmPrinter", [], :void)
|
149
149
|
end
|
data/lib/rltk/cg/builder.rb
CHANGED
@@ -16,36 +16,36 @@ require 'rltk/cg/instruction'
|
|
16
16
|
#######################
|
17
17
|
|
18
18
|
module RLTK::CG
|
19
|
-
|
19
|
+
|
20
20
|
# This class is responsible for adding {Instruction Instructions} to {BasicBlock BasicBlocks}.
|
21
21
|
class Builder
|
22
22
|
include BindingClass
|
23
|
-
|
23
|
+
|
24
24
|
# The Proc object called by the garbage collector to free resources used by LLVM.
|
25
25
|
CLASS_FINALIZER = Proc.new { |id| Bindings.dispose_builder(ptr) if ptr = ObjectSpace._id2ref(id).ptr }
|
26
|
-
|
26
|
+
|
27
27
|
# @return [Builder] A global Builder object.
|
28
28
|
def self.global
|
29
29
|
@@global_builder ||= Builder.new
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
# Creates a new Builder object, optionally positioning it at the end
|
33
33
|
# of *block*. If a block is given it will be executed as if it was
|
34
34
|
# passed to the #build method.
|
35
35
|
#
|
36
36
|
# @param [BasicBlock, nil] bb BasicBlock used to position the Builder.
|
37
37
|
# @param [Array<Object>] block_args Arguments to be passed to *block*.
|
38
|
-
# @param [Proc, nil] block Block to execute in the context of this Builder.
|
38
|
+
# @param [Proc, nil] block Block to execute in the context of this Builder.
|
39
39
|
def initialize(bb = nil, *block_args, &block)
|
40
40
|
@ptr = Bindings.create_builder
|
41
|
-
|
41
|
+
|
42
42
|
# Define a finalizer to free the memory used by LLVM for this
|
43
43
|
# builder.
|
44
44
|
ObjectSpace.define_finalizer(self, CLASS_FINALIZER)
|
45
|
-
|
45
|
+
|
46
46
|
if block then self.build(bb, *block_args, &block) elsif bb then position_at_end(bb) end
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
# Executes a given block inside the context of this builder. If the
|
50
50
|
# *bb* parameter isn't nill, the Builder will be positioned at the
|
51
51
|
# end of the specified BasicBlock.
|
@@ -59,7 +59,7 @@ module RLTK::CG
|
|
59
59
|
self.position_at_end(bb) if bb
|
60
60
|
self.instance_exec(*block_args, &block)
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
# Build an instruction.
|
64
64
|
#
|
65
65
|
# @param [Symbol] inst Name of instruction building method.
|
@@ -70,7 +70,7 @@ module RLTK::CG
|
|
70
70
|
self.send(inst, *args)
|
71
71
|
end
|
72
72
|
alias :'<<' :build_inst
|
73
|
-
|
73
|
+
|
74
74
|
# Position the Builder after the given instruction.
|
75
75
|
#
|
76
76
|
# @param [BasicBlock] bb
|
@@ -81,7 +81,7 @@ module RLTK::CG
|
|
81
81
|
Bindings.position_builder(@ptr, bb, instruction) if check_type(bb, BasicBlock, 'bb')
|
82
82
|
self
|
83
83
|
end
|
84
|
-
|
84
|
+
|
85
85
|
# Position the Builder at the end of the given BasicBlock.
|
86
86
|
#
|
87
87
|
# @param [BasicBlock] bb
|
@@ -93,7 +93,7 @@ module RLTK::CG
|
|
93
93
|
end
|
94
94
|
alias :pae :position_at_end
|
95
95
|
alias :target :position_at_end
|
96
|
-
|
96
|
+
|
97
97
|
# Position the Builder before the given Instruction.
|
98
98
|
#
|
99
99
|
# @param [Instruction] instruction
|
@@ -103,21 +103,21 @@ module RLTK::CG
|
|
103
103
|
Bindings.position_builder_before(@ptr, instruction)
|
104
104
|
self
|
105
105
|
end
|
106
|
-
|
106
|
+
|
107
107
|
################################
|
108
108
|
# Instruction Building Methods #
|
109
109
|
################################
|
110
|
-
|
110
|
+
|
111
111
|
#################
|
112
112
|
# Miscellaneous #
|
113
113
|
#################
|
114
|
-
|
114
|
+
|
115
115
|
# @return [BasicBlock] BasicBlock the Builder is currently positioned on.
|
116
116
|
def current_block
|
117
117
|
BasicBlock.new(Bindings.get_insert_block(@ptr))
|
118
118
|
end
|
119
119
|
alias :insertion_block :current_block
|
120
|
-
|
120
|
+
|
121
121
|
# Generates an instruction with no defined semantics. Can be used to
|
122
122
|
# provide hints to the optimizer.
|
123
123
|
#
|
@@ -125,37 +125,37 @@ module RLTK::CG
|
|
125
125
|
def unreachable
|
126
126
|
UnreachableInst.new(Bindings.build_unreachable(@ptr))
|
127
127
|
end
|
128
|
-
|
128
|
+
|
129
129
|
###########
|
130
130
|
# Returns #
|
131
131
|
###########
|
132
|
-
|
132
|
+
|
133
133
|
# @param [Value] val The Value to return.
|
134
134
|
#
|
135
135
|
# @return [ReturnInst]
|
136
136
|
def ret(val)
|
137
137
|
ReturnInst.new(Bindings.build_ret(@ptr, val))
|
138
138
|
end
|
139
|
-
|
139
|
+
|
140
140
|
# @return [RetVoidInst]
|
141
141
|
def ret_void
|
142
142
|
ReturnVoidInst.new(Bindings.build_ret_void(@ptr))
|
143
143
|
end
|
144
|
-
|
144
|
+
|
145
145
|
# @return [RetAggregateInst]
|
146
146
|
def ret_aggregate(*vals)
|
147
147
|
vals = vals.first if vals.length == 1 and vals.first.instance_of?(::Array)
|
148
|
-
|
148
|
+
|
149
149
|
vals_ptr = FFI::MemoryPointer.new(:pointer, vals.length)
|
150
150
|
vals_ptr.write_array_of_pointer(vals)
|
151
|
-
|
151
|
+
|
152
152
|
ReturnAggregateInst.new(Bindings.build_aggregate_ret(@ptr, vals_ptr, vals.length))
|
153
153
|
end
|
154
|
-
|
154
|
+
|
155
155
|
################
|
156
156
|
# Control Flow #
|
157
157
|
################
|
158
|
-
|
158
|
+
|
159
159
|
# Unconditional branching.
|
160
160
|
#
|
161
161
|
# @param [BasicBlock] block Where to jump.
|
@@ -165,7 +165,7 @@ module RLTK::CG
|
|
165
165
|
BranchInst.new(Bindings.build_br(@ptr, block))
|
166
166
|
end
|
167
167
|
alias :br :branch
|
168
|
-
|
168
|
+
|
169
169
|
# Build an instruction that performs a function call.
|
170
170
|
#
|
171
171
|
# @param [Function] fun Function to call.
|
@@ -174,13 +174,13 @@ module RLTK::CG
|
|
174
174
|
# @return [CallInst]
|
175
175
|
def call(fun, *args)
|
176
176
|
name = if args.last.is_a?(String) then args.pop else '' end
|
177
|
-
|
177
|
+
|
178
178
|
args_ptr = FFI::MemoryPointer.new(:pointer, args.length)
|
179
179
|
args_ptr.write_array_of_pointer(args)
|
180
|
-
|
180
|
+
|
181
181
|
CallInst.new(Bindings.build_call(@ptr, fun, args_ptr, args.length, name))
|
182
182
|
end
|
183
|
-
|
183
|
+
|
184
184
|
# Conditional branching.
|
185
185
|
#
|
186
186
|
# @param [Value] val Condition value.
|
@@ -192,7 +192,7 @@ module RLTK::CG
|
|
192
192
|
CondBranchInst.new(Bindings.build_cond_br(@ptr, val, iftrue, iffalse))
|
193
193
|
end
|
194
194
|
alias :cond :cond_branch
|
195
|
-
|
195
|
+
|
196
196
|
# Extract an element from a vector.
|
197
197
|
#
|
198
198
|
# @param [Value] vector Vector from which to extract a value.
|
@@ -203,7 +203,7 @@ module RLTK::CG
|
|
203
203
|
def extract_element(vector, index, name = '')
|
204
204
|
ExtractElementInst.new(Bindings.build_extract_element(@ptr, vector, index, name))
|
205
205
|
end
|
206
|
-
|
206
|
+
|
207
207
|
# Extract the value of a member field from an aggregate value.
|
208
208
|
#
|
209
209
|
# @param [Value] aggregate An aggregate value.
|
@@ -214,7 +214,7 @@ module RLTK::CG
|
|
214
214
|
def extract_value(aggregate, index, name = '')
|
215
215
|
ExtractValueInst.new(Bindings.build_extract_value(@ptr, aggregate, index, name))
|
216
216
|
end
|
217
|
-
|
217
|
+
|
218
218
|
# Insert an element into a vector.
|
219
219
|
#
|
220
220
|
# @param [Value] vector Vector into which to insert the element.
|
@@ -226,7 +226,7 @@ module RLTK::CG
|
|
226
226
|
def insert_element(vector, element, index, name = '')
|
227
227
|
InsertElementInst.new(Bindings.build_insert_element(@ptr, vector, element, index, name))
|
228
228
|
end
|
229
|
-
|
229
|
+
|
230
230
|
# Insert a value into an aggregate value's member field.
|
231
231
|
#
|
232
232
|
# @param [Value] aggregate An aggregate value.
|
@@ -238,7 +238,7 @@ module RLTK::CG
|
|
238
238
|
def insert_value(aggregate, val, index, name = '')
|
239
239
|
InsertValueInst.new(Bindings.build_insert_value(@ptr, aggregate, val, index, name))
|
240
240
|
end
|
241
|
-
|
241
|
+
|
242
242
|
# Invoke a function which may potentially unwind.
|
243
243
|
#
|
244
244
|
# @param [Function] fun Function to invoke.
|
@@ -251,7 +251,7 @@ module RLTK::CG
|
|
251
251
|
def invoke(fun, args, normal, exception, name = '')
|
252
252
|
InvokeInst.new(Bindings.build_invoke(@ptr, fun, args, args.length, normal, exception, name))
|
253
253
|
end
|
254
|
-
|
254
|
+
|
255
255
|
# Build a Phi node of the given type with the given incoming
|
256
256
|
# branches.
|
257
257
|
#
|
@@ -267,7 +267,7 @@ module RLTK::CG
|
|
267
267
|
phi.incoming.add(incoming)
|
268
268
|
end
|
269
269
|
end
|
270
|
-
|
270
|
+
|
271
271
|
# Return a value based on a condition. This differs from *cond* in
|
272
272
|
# that its operands are values rather than basic blocks. As a
|
273
273
|
# consequence, both arguments must be evaluated.
|
@@ -282,7 +282,7 @@ module RLTK::CG
|
|
282
282
|
def select(if_val, then_val, else_val, name = '')
|
283
283
|
SelectInst.new(Bindings.build_select(@ptr, if_val, then_val, else_val, name))
|
284
284
|
end
|
285
|
-
|
285
|
+
|
286
286
|
# Shuffle two vectors according to a given mask.
|
287
287
|
#
|
288
288
|
# @param [Value] vec1 Vector
|
@@ -294,7 +294,7 @@ module RLTK::CG
|
|
294
294
|
def shuffle_vector(vec1, vec2, mask, name = '')
|
295
295
|
ShuffleVectorInst.new(Bindings.build_shuffle_vector(@ptr, vec1, vec2, mask, name))
|
296
296
|
end
|
297
|
-
|
297
|
+
|
298
298
|
# Select a value based on an incoming value.
|
299
299
|
# @param [Value] val Value to switch on.
|
300
300
|
# @param [BasicBlock] default Default case.
|
@@ -308,13 +308,13 @@ module RLTK::CG
|
|
308
308
|
cases.each { |val, block| inst.add_case(val, block) }
|
309
309
|
end
|
310
310
|
end
|
311
|
-
|
311
|
+
|
312
312
|
########
|
313
313
|
# Math #
|
314
314
|
########
|
315
|
-
|
315
|
+
|
316
316
|
# Addition
|
317
|
-
|
317
|
+
|
318
318
|
# @param [Value] lhs Integer or vector of integers.
|
319
319
|
# @param [Value] rhs Integer or vector of integers.
|
320
320
|
# @param [String] name Name of the result in LLVM IR.
|
@@ -323,7 +323,7 @@ module RLTK::CG
|
|
323
323
|
def add(lhs, rhs, name = '')
|
324
324
|
AddInst.new(Bindings.build_add(@ptr, lhs, rhs, name))
|
325
325
|
end
|
326
|
-
|
326
|
+
|
327
327
|
# @param [Value] lhs Floating point or vector of floating points.
|
328
328
|
# @param [Value] rhs Floating point or vector of floating points.
|
329
329
|
# @param [String] name Name of the result in LLVM IR.
|
@@ -332,7 +332,7 @@ module RLTK::CG
|
|
332
332
|
def fadd(lhs, rhs, name = '')
|
333
333
|
FAddInst.new(Bindings.build_f_add(@ptr, lhs, rhs, name))
|
334
334
|
end
|
335
|
-
|
335
|
+
|
336
336
|
# No signed wrap addition.
|
337
337
|
#
|
338
338
|
# @param [Value] lhs Integer or vector of integers.
|
@@ -343,7 +343,7 @@ module RLTK::CG
|
|
343
343
|
def nsw_add(lhs, rhs, name = '')
|
344
344
|
NSWAddInst.new(Bindings.build_nsw_add(@ptr, lhs, rhs, name))
|
345
345
|
end
|
346
|
-
|
346
|
+
|
347
347
|
# No unsigned wrap addition.
|
348
348
|
#
|
349
349
|
# @param [Value] lhs Integer or vector of integers.
|
@@ -354,9 +354,9 @@ module RLTK::CG
|
|
354
354
|
def nuw_add(lhs, rhs, name = '')
|
355
355
|
NUWAddInst.new(Bindings.build_nuw_add(@ptr, lhs, rhs, name))
|
356
356
|
end
|
357
|
-
|
357
|
+
|
358
358
|
# Subtraction
|
359
|
-
|
359
|
+
|
360
360
|
# @param [Value] lhs Integer or vector of integers.
|
361
361
|
# @param [Value] rhs Integer or vector of integers.
|
362
362
|
# @param [String] name Name of the result in LLVM IR.
|
@@ -365,7 +365,7 @@ module RLTK::CG
|
|
365
365
|
def sub(lhs, rhs, name = '')
|
366
366
|
SubInst.new(Bindings.build_sub(@ptr, lhs, rhs, name))
|
367
367
|
end
|
368
|
-
|
368
|
+
|
369
369
|
# @param [Value] lhs Floating point or vector of floating points.
|
370
370
|
# @param [Value] rhs Floating point or vector of floating points.
|
371
371
|
# @param [String] name Name of the result in LLVM IR.
|
@@ -374,7 +374,7 @@ module RLTK::CG
|
|
374
374
|
def fsub(lhs, rhs, name = '')
|
375
375
|
FSubInst.new(Bindings.build_f_sub(@ptr, lhs, rhs, name))
|
376
376
|
end
|
377
|
-
|
377
|
+
|
378
378
|
# No signed wrap subtraction.
|
379
379
|
#
|
380
380
|
# @param [Value] lhs Integer or vector of integers.
|
@@ -385,7 +385,7 @@ module RLTK::CG
|
|
385
385
|
def nsw_sub(lhs, rhs, name = '')
|
386
386
|
NSWSubInst.new(Bindings.build_nsw_sub(@ptr, lhs, rhs, name))
|
387
387
|
end
|
388
|
-
|
388
|
+
|
389
389
|
# No unsigned wrap subtraction.
|
390
390
|
#
|
391
391
|
# @param [Value] lhs Integer or vector of integers.
|
@@ -396,9 +396,9 @@ module RLTK::CG
|
|
396
396
|
def nuw_sub(lhs, rhs, name = '')
|
397
397
|
NUWSubInst.new(Bindings.build_nuw_sub(@ptr, lhs, rhs, name))
|
398
398
|
end
|
399
|
-
|
399
|
+
|
400
400
|
# Multiplication
|
401
|
-
|
401
|
+
|
402
402
|
# @param [Value] lhs Integer or vector of integers.
|
403
403
|
# @param [Value] rhs Integer or vector of integers.
|
404
404
|
# @param [String] name Name of the result in LLVM IR.
|
@@ -407,7 +407,7 @@ module RLTK::CG
|
|
407
407
|
def mul(lhs, rhs, name = '')
|
408
408
|
MulInst.new(Bindings.build_mul(@ptr, lhs, rhs, name))
|
409
409
|
end
|
410
|
-
|
410
|
+
|
411
411
|
# @param [Value] lhs Floating point or vector of floating points.
|
412
412
|
# @param [Value] rhs Floating point or vector of floating points.
|
413
413
|
# @param [String] name Name of the result in LLVM IR.
|
@@ -416,7 +416,7 @@ module RLTK::CG
|
|
416
416
|
def fmul(lhs, rhs, name = '')
|
417
417
|
FMulInst.new(Bindings.build_f_mul(@ptr, lhs, rhs, name))
|
418
418
|
end
|
419
|
-
|
419
|
+
|
420
420
|
# No signed wrap multiplication.
|
421
421
|
#
|
422
422
|
# @param [Value] lhs Integer or vector of integers.
|
@@ -427,7 +427,7 @@ module RLTK::CG
|
|
427
427
|
def nsw_mul(lhs, rhs, name = '')
|
428
428
|
NSWMulInst.new(Bindings.build_nsw_mul(@ptr, lhs, rhs, name))
|
429
429
|
end
|
430
|
-
|
430
|
+
|
431
431
|
# No unsigned wrap multiplication.
|
432
432
|
#
|
433
433
|
# @param [Value] lhs Integer or vector of integers.
|
@@ -438,9 +438,9 @@ module RLTK::CG
|
|
438
438
|
def nuw_mul(lhs, rhs, name = '')
|
439
439
|
NUWMulInst.new(Bindings.build_nuw_mul(@ptr, lhs, rhs, name))
|
440
440
|
end
|
441
|
-
|
441
|
+
|
442
442
|
# Division
|
443
|
-
|
443
|
+
|
444
444
|
# @param [Value] lhs Floating point or vector of floating points.
|
445
445
|
# @param [Value] rhs Floating point or vector of floating points.
|
446
446
|
# @param [String] name Name of the result in LLVM IR.
|
@@ -449,7 +449,7 @@ module RLTK::CG
|
|
449
449
|
def fdiv(lhs, rhs, name = '')
|
450
450
|
FDivInst.new(Bindings.build_f_div(@ptr, lhs, rhs, name))
|
451
451
|
end
|
452
|
-
|
452
|
+
|
453
453
|
# Signed integer division.
|
454
454
|
#
|
455
455
|
# @param [Value] lhs Integer or vector of integers.
|
@@ -460,7 +460,7 @@ module RLTK::CG
|
|
460
460
|
def sdiv(lhs, rhs, name = '')
|
461
461
|
SDivInst.new(Bindings.build_s_div(@ptr, lhs, rhs, name))
|
462
462
|
end
|
463
|
-
|
463
|
+
|
464
464
|
# Signed exact integer division.
|
465
465
|
#
|
466
466
|
# @param [Value] lhs Integer or vector of integers.
|
@@ -471,7 +471,7 @@ module RLTK::CG
|
|
471
471
|
def exact_sdiv(lhs, rhs, name = '')
|
472
472
|
ExactSDivInst.new(Bindings.build_exact_s_div(@ptr, lhs, rhs, name))
|
473
473
|
end
|
474
|
-
|
474
|
+
|
475
475
|
# Unsigned integer division.
|
476
476
|
#
|
477
477
|
# @param [Value] lhs Integer or vector of integers.
|
@@ -482,9 +482,9 @@ module RLTK::CG
|
|
482
482
|
def udiv(lhs, rhs, name = '')
|
483
483
|
UDivInst.new(Bindings.build_u_div(@ptr, lhs, rhs, name))
|
484
484
|
end
|
485
|
-
|
485
|
+
|
486
486
|
# Remainder
|
487
|
-
|
487
|
+
|
488
488
|
# @param [Value] lhs Floating point or vector of floating points.
|
489
489
|
# @param [Value] rhs Floating point or vector of floating points.
|
490
490
|
# @param [String] name Name of the result in LLVM IR.
|
@@ -493,7 +493,7 @@ module RLTK::CG
|
|
493
493
|
def frem(lhs, rhs, name = '')
|
494
494
|
FRemInst.new(Bindings.build_f_rem(@ptr, lhs, rhs, name))
|
495
495
|
end
|
496
|
-
|
496
|
+
|
497
497
|
# Signed remainder.
|
498
498
|
#
|
499
499
|
# @param [Value] lhs Integer or vector of integers.
|
@@ -504,7 +504,7 @@ module RLTK::CG
|
|
504
504
|
def srem(lhs, rhs, name = '')
|
505
505
|
SRemInst.new(Bindings.build_s_rem(@ptr, lhs, rhs, name))
|
506
506
|
end
|
507
|
-
|
507
|
+
|
508
508
|
# Unsigned remainder.
|
509
509
|
#
|
510
510
|
# @param [Value] lhs Integer or vector of integers.
|
@@ -515,9 +515,9 @@ module RLTK::CG
|
|
515
515
|
def urem(lhs, rhs, name = '')
|
516
516
|
URemInst.new(Bindings.build_u_rem(@ptr, lhs, rhs, name))
|
517
517
|
end
|
518
|
-
|
518
|
+
|
519
519
|
# Negation
|
520
|
-
|
520
|
+
|
521
521
|
# Integer negation. Implemented as a shortcut to the equivalent sub
|
522
522
|
# instruction.
|
523
523
|
#
|
@@ -528,7 +528,7 @@ module RLTK::CG
|
|
528
528
|
def neg(val, name = '')
|
529
529
|
NegInst.new(Bindings.build_neg(@ptr, val, name))
|
530
530
|
end
|
531
|
-
|
531
|
+
|
532
532
|
# Floating point negation. Implemented as a shortcut to the
|
533
533
|
# equivalent sub instruction.
|
534
534
|
#
|
@@ -539,7 +539,7 @@ module RLTK::CG
|
|
539
539
|
def fneg(val, name = '')
|
540
540
|
FNegInst.new(Bindings.build_f_neg(@ptr, val, name))
|
541
541
|
end
|
542
|
-
|
542
|
+
|
543
543
|
# No signed wrap integer negation. Implemented as a shortcut to the
|
544
544
|
# equivalent sub instruction.
|
545
545
|
#
|
@@ -550,7 +550,7 @@ module RLTK::CG
|
|
550
550
|
def nsw_neg(val, name = '')
|
551
551
|
NSWNegInst.new(Bindings.build_nsw_neg(@ptr, val, name))
|
552
552
|
end
|
553
|
-
|
553
|
+
|
554
554
|
# No unsigned wrap integer negation. Implemented as a shortcut to the
|
555
555
|
# equivalent sub instruction.
|
556
556
|
#
|
@@ -561,11 +561,11 @@ module RLTK::CG
|
|
561
561
|
def nuw_neg(val, name = '')
|
562
562
|
NUWNegInst.new(Bindings.build_nuw_neg(@ptr, val, name))
|
563
563
|
end
|
564
|
-
|
564
|
+
|
565
565
|
######################
|
566
566
|
# Bitwise Operations #
|
567
567
|
######################
|
568
|
-
|
568
|
+
|
569
569
|
# A wrapper method around the {#shift_left} and {#shift_right}
|
570
570
|
# methods.
|
571
571
|
#
|
@@ -582,7 +582,7 @@ module RLTK::CG
|
|
582
582
|
when :right then shift_right(lhs, rhs, mode, name)
|
583
583
|
end
|
584
584
|
end
|
585
|
-
|
585
|
+
|
586
586
|
# @param [Value] lhs Integer or vector of integers
|
587
587
|
# @param [Value] rhs Integer or vector of integers
|
588
588
|
# @param [String] name Name of the result in LLVM IR
|
@@ -592,7 +592,7 @@ module RLTK::CG
|
|
592
592
|
LeftShiftInst.new(Bindings.build_shl(@ptr, lhs, rhs, name))
|
593
593
|
end
|
594
594
|
alias :shl :shift_left
|
595
|
-
|
595
|
+
|
596
596
|
# A wrapper function around {#ashr} and {#lshr}.
|
597
597
|
#
|
598
598
|
# @param [Value] lhs Integer or vector of integers
|
@@ -605,9 +605,9 @@ module RLTK::CG
|
|
605
605
|
case mode
|
606
606
|
when :arithmetic then ashr(lhs, rhs, name)
|
607
607
|
when :logical then lshr(lhs, rhs, name)
|
608
|
-
end
|
608
|
+
end
|
609
609
|
end
|
610
|
-
|
610
|
+
|
611
611
|
# Arithmetic (sign extended) shift right.
|
612
612
|
#
|
613
613
|
# @param [Value] lhs Integer or vector of integers.
|
@@ -618,7 +618,7 @@ module RLTK::CG
|
|
618
618
|
def ashr(lhs, rhs, name = '')
|
619
619
|
ARightShiftInst.new(Bindings.build_a_shr(@ptr, lhs, rhs, name))
|
620
620
|
end
|
621
|
-
|
621
|
+
|
622
622
|
# Logical (zero fill) shift right.
|
623
623
|
#
|
624
624
|
# @param [Value] lhs Integer or vector of integers.
|
@@ -629,7 +629,7 @@ module RLTK::CG
|
|
629
629
|
def lshr(lhs, rhs, name = '')
|
630
630
|
LRightShiftInst.new(Bindings.build_l_shr(@ptr, lhs, rhs, name))
|
631
631
|
end
|
632
|
-
|
632
|
+
|
633
633
|
# @param [Value] lhs Integer or vector of integers.
|
634
634
|
# @param [Value] rhs Integer or vector of integers.
|
635
635
|
# @param [String] name Name of the result in LLVM IR.
|
@@ -638,7 +638,7 @@ module RLTK::CG
|
|
638
638
|
def and(lhs, rhs, name = '')
|
639
639
|
AndInst.new(Bindings.build_and(@ptr, lhs, rhs, name))
|
640
640
|
end
|
641
|
-
|
641
|
+
|
642
642
|
# @param [Value] lhs Integer or vector of integers.
|
643
643
|
# @param [Value] rhs Integer or vector of integers.
|
644
644
|
# @param [String] name Name of the result in LLVM IR.
|
@@ -647,7 +647,7 @@ module RLTK::CG
|
|
647
647
|
def or(lhs, rhs, name = '')
|
648
648
|
OrInst.new(Bindings.build_or(@ptr, lhs, rhs, name))
|
649
649
|
end
|
650
|
-
|
650
|
+
|
651
651
|
# @param [Value] lhs Integer or vector of integers.
|
652
652
|
# @param [Value] rhs Integer or vector of integers.
|
653
653
|
# @param [String] name Name of the result in LLVM IR.
|
@@ -656,7 +656,7 @@ module RLTK::CG
|
|
656
656
|
def xor(lhs, rhs, name = '')
|
657
657
|
XOrInst.new(Bindings.build_xor(@ptr, lhs, rhs, name))
|
658
658
|
end
|
659
|
-
|
659
|
+
|
660
660
|
# Boolean negation.
|
661
661
|
#
|
662
662
|
# @param [Value] val Integer or vector of integers.
|
@@ -666,11 +666,11 @@ module RLTK::CG
|
|
666
666
|
def not(val, name = '')
|
667
667
|
NotInst.new(Bindings.build_not(@ptr, val, name))
|
668
668
|
end
|
669
|
-
|
669
|
+
|
670
670
|
#####################
|
671
671
|
# Memory Management #
|
672
672
|
#####################
|
673
|
-
|
673
|
+
|
674
674
|
# Heap allocation.
|
675
675
|
#
|
676
676
|
# @param [Type] type Type or value whose type should be malloced.
|
@@ -680,7 +680,7 @@ module RLTK::CG
|
|
680
680
|
def malloc(type, name = '')
|
681
681
|
MallocInst.new(Bindings.build_malloc(@ptr, check_type(type), name))
|
682
682
|
end
|
683
|
-
|
683
|
+
|
684
684
|
# Heap array allocation.
|
685
685
|
#
|
686
686
|
# @param [Type] type Type or value whose type will be the element type of the malloced array.
|
@@ -691,7 +691,7 @@ module RLTK::CG
|
|
691
691
|
def array_malloc(type, size, name = '')
|
692
692
|
ArrayMallocInst.new(Bindings.build_array_malloc(@ptr, check_cg_type(type), size, name))
|
693
693
|
end
|
694
|
-
|
694
|
+
|
695
695
|
# Stack allocation.
|
696
696
|
#
|
697
697
|
# @param [Type] type Type or value whose type should be allocad.
|
@@ -701,7 +701,7 @@ module RLTK::CG
|
|
701
701
|
def alloca(type, name = '')
|
702
702
|
AllocaInst.new(Bindings.build_alloca(@ptr, check_cg_type(type), name))
|
703
703
|
end
|
704
|
-
|
704
|
+
|
705
705
|
# Stack array allocation.
|
706
706
|
#
|
707
707
|
# @param [Type] type Type or value whose type should be allocad.
|
@@ -712,14 +712,14 @@ module RLTK::CG
|
|
712
712
|
def array_alloca(type, size, name = '')
|
713
713
|
ArrayAllocaInst.new(Bindings.build_array_alloca(@ptr, check_cg_type(type), size, name))
|
714
714
|
end
|
715
|
-
|
715
|
+
|
716
716
|
# @param [LLVM::Value] ptr The pointer to be freed.
|
717
717
|
#
|
718
718
|
# @return [FreeInst] The result of the free instruction.
|
719
719
|
def free(ptr)
|
720
720
|
FreeInst.new(Bindings.build_free(@ptr, ptr))
|
721
721
|
end
|
722
|
-
|
722
|
+
|
723
723
|
# Load the value of a given pointer.
|
724
724
|
#
|
725
725
|
# @param [Value] ptr Pointer to be loaded.
|
@@ -729,7 +729,7 @@ module RLTK::CG
|
|
729
729
|
def load(ptr, name = '')
|
730
730
|
LoadInst.new(Bindings.build_load(@ptr, ptr, name))
|
731
731
|
end
|
732
|
-
|
732
|
+
|
733
733
|
# Store a value at a given pointer.
|
734
734
|
#
|
735
735
|
# @param [Value] val The value to be stored.
|
@@ -739,7 +739,7 @@ module RLTK::CG
|
|
739
739
|
def store(val, ptr)
|
740
740
|
StoreInst.new(Bindings.build_store(@ptr, val, ptr))
|
741
741
|
end
|
742
|
-
|
742
|
+
|
743
743
|
# Obtain a pointer to the element at the given indices.
|
744
744
|
#
|
745
745
|
# @param [Value] ptr Pointer to an aggregate value
|
@@ -750,14 +750,14 @@ module RLTK::CG
|
|
750
750
|
# @return [GetElementPtrInst] The resulting pointer.
|
751
751
|
def get_element_ptr(ptr, indices, name = '')
|
752
752
|
check_array_type(indices, Value, 'indices')
|
753
|
-
|
753
|
+
|
754
754
|
indices_ptr = FFI::MemoryPointer.new(:pointer, indices.length)
|
755
755
|
indices_ptr.write_array_of_pointer(indices)
|
756
|
-
|
756
|
+
|
757
757
|
GetElementPtrInst.new(Bindings.build_gep(@ptr, ptr, indices_ptr, indices.length, name))
|
758
758
|
end
|
759
759
|
alias :gep :get_element_ptr
|
760
|
-
|
760
|
+
|
761
761
|
# Builds a in-bounds getelementptr instruction. If the indices are
|
762
762
|
# outside the allocated pointer the value is undefined.
|
763
763
|
#
|
@@ -769,14 +769,14 @@ module RLTK::CG
|
|
769
769
|
# @return [InBoundsGEPInst] The resulting pointer.
|
770
770
|
def get_element_ptr_in_bounds(ptr, indices, name = '')
|
771
771
|
check_array_type(indices, Value, 'indices')
|
772
|
-
|
772
|
+
|
773
773
|
indices_ptr = FFI::MemoryPointer.new(:pointer, indices.length)
|
774
774
|
indices_ptr.write_array_of_pointer(indices)
|
775
|
-
|
775
|
+
|
776
776
|
InBoundsGEPInst.new(Bindings.build_in_bounds_gep(@ptr, ptr, indices_ptr, indices.length, name))
|
777
777
|
end
|
778
778
|
alias :inbounds_gep :get_element_ptr_in_bounds
|
779
|
-
|
779
|
+
|
780
780
|
# Builds a struct getelementptr instruction.
|
781
781
|
#
|
782
782
|
# @param [Value] ptr Pointer to a structure.
|
@@ -788,7 +788,7 @@ module RLTK::CG
|
|
788
788
|
StructGEPInst.new(Bindings.build_struct_gep(@ptr, ptr, index, name))
|
789
789
|
end
|
790
790
|
alias :struct_getp :struct_get_element_ptr
|
791
|
-
|
791
|
+
|
792
792
|
# Creates a global string initialized to a given value.
|
793
793
|
#
|
794
794
|
# @param [String] string String used by the initialize.
|
@@ -798,7 +798,7 @@ module RLTK::CG
|
|
798
798
|
def global_string(string, name = '')
|
799
799
|
GlobalStringInst.new(Bindings.build_global_string(@ptr, string, name))
|
800
800
|
end
|
801
|
-
|
801
|
+
|
802
802
|
# Creates a pointer to a global string initialized to a given value.
|
803
803
|
#
|
804
804
|
# @param [String] string String used by the initializer
|
@@ -808,11 +808,11 @@ module RLTK::CG
|
|
808
808
|
def gloabl_string_pointer(string, name = '')
|
809
809
|
GlobalStringPtrInst.new(Bindings.build_global_string_ptr(@ptr, string, name))
|
810
810
|
end
|
811
|
-
|
811
|
+
|
812
812
|
#######################
|
813
813
|
# Atomic Instructions #
|
814
814
|
#######################
|
815
|
-
|
815
|
+
|
816
816
|
# Create an atomic read/modify/write instruction.
|
817
817
|
#
|
818
818
|
# @see http://llvm.org/docs/LangRef.html#atomic-memory-ordering-constraints
|
@@ -827,11 +827,11 @@ module RLTK::CG
|
|
827
827
|
def atomic_rmw(op, addr, val, ordering, single_thread)
|
828
828
|
AtomicRMWInst.new(Bindings.build_atomic_rmw(@ptr, op, addr, val, ordering, single_thread.to_i))
|
829
829
|
end
|
830
|
-
|
830
|
+
|
831
831
|
###############################
|
832
832
|
# Type and Value Manipulation #
|
833
833
|
###############################
|
834
|
-
|
834
|
+
|
835
835
|
# Cast a value to a given address space.
|
836
836
|
#
|
837
837
|
# @param [Value] val Value to cast
|
@@ -842,7 +842,7 @@ module RLTK::CG
|
|
842
842
|
def addr_space_cast(val, type, name = '')
|
843
843
|
AddrSpaceCast.new(Bindings.addr_space_cast(@ptr, val, check_cg_type(type), name))
|
844
844
|
end
|
845
|
-
|
845
|
+
|
846
846
|
# Cast a value to the given type without changing any bits.
|
847
847
|
#
|
848
848
|
# @param [Value] val Value to cast
|
@@ -853,7 +853,7 @@ module RLTK::CG
|
|
853
853
|
def bitcast(val, type, name = '')
|
854
854
|
BitCastInst.new(Bindings.build_bit_cast(@ptr, val, check_cg_type(type), name))
|
855
855
|
end
|
856
|
-
|
856
|
+
|
857
857
|
# @param [Value] val Value to cast.
|
858
858
|
# @param [Type] type Target type.
|
859
859
|
# @param [String] name Name of the result in LLVM IR.
|
@@ -863,7 +863,7 @@ module RLTK::CG
|
|
863
863
|
FPCastInst.new(Bindings.build_fp_cast(@ptr, val, check_cg_type(type), name))
|
864
864
|
end
|
865
865
|
alias :fp_cast :floating_point_cast
|
866
|
-
|
866
|
+
|
867
867
|
# Extend a floating point value.
|
868
868
|
#
|
869
869
|
# @param [Value] val Floating point or vector of floating point.
|
@@ -876,7 +876,7 @@ module RLTK::CG
|
|
876
876
|
end
|
877
877
|
alias :fp_ext :floating_point_extend
|
878
878
|
alias :fp_extend :floating_point_extend
|
879
|
-
|
879
|
+
|
880
880
|
# Convert a floating point to a signed integer.
|
881
881
|
#
|
882
882
|
# @param [Value] val Floating point or vector of floating points to convert.
|
@@ -888,7 +888,7 @@ module RLTK::CG
|
|
888
888
|
FPToSIInst.new(Bindings.build_fp_to_si(@ptr, val, check_cg_type(type), name))
|
889
889
|
end
|
890
890
|
alias :fp2si :floating_point_to_signed_int
|
891
|
-
|
891
|
+
|
892
892
|
# Convert a floating point to an unsigned integer.
|
893
893
|
#
|
894
894
|
# @param [Value] val Floating point or vector of floating points to convert.
|
@@ -900,7 +900,7 @@ module RLTK::CG
|
|
900
900
|
FPToUIInst.new(Bindings.build_fp_to_ui(@ptr, val, check_cg_type(type), name))
|
901
901
|
end
|
902
902
|
alias :fp2ui :floating_point_to_unsigned_int
|
903
|
-
|
903
|
+
|
904
904
|
# Truncate a floating point value.
|
905
905
|
#
|
906
906
|
# @param [Value] val Floating point or vector of floating point.
|
@@ -913,7 +913,7 @@ module RLTK::CG
|
|
913
913
|
end
|
914
914
|
alias :fp_trunc :floating_point_truncate
|
915
915
|
alias :fp_truncate :floating_point_truncate
|
916
|
-
|
916
|
+
|
917
917
|
# Cast an int to a pointer.
|
918
918
|
#
|
919
919
|
# @param [Value] val An integer value.
|
@@ -925,7 +925,7 @@ module RLTK::CG
|
|
925
925
|
IntToPtrInst.new(Bindings.build_int_to_ptr(@ptr, val, check_cg_type(type), name))
|
926
926
|
end
|
927
927
|
alias :int2ptr :int_to_ptr
|
928
|
-
|
928
|
+
|
929
929
|
# @param [Value] val An integer value.
|
930
930
|
# @param [Type] type Integer or vector of integer target type.
|
931
931
|
# @param [String] name Name of the result in LLVM IR.
|
@@ -935,7 +935,7 @@ module RLTK::CG
|
|
935
935
|
IntCastInst.new(Bindings.build_int_cast(@ptr, val, check_cg_type(type), name))
|
936
936
|
end
|
937
937
|
alias :int_cast :integer_cast
|
938
|
-
|
938
|
+
|
939
939
|
# @param [Value] val A pointer value.
|
940
940
|
# @param [Type] type A pointer target type.
|
941
941
|
# @param [String] name Name of the result in LLVM IR.
|
@@ -944,7 +944,7 @@ module RLTK::CG
|
|
944
944
|
def ptr_cast(val, type, name = '')
|
945
945
|
PtrCastInst.new(Bindings.build_pointer_cast(@ptr, val, check_cg_type(type), name))
|
946
946
|
end
|
947
|
-
|
947
|
+
|
948
948
|
# Cast a pointer to an int. Useful for pointer arithmetic.
|
949
949
|
#
|
950
950
|
# @param [Value] val A pointer value.
|
@@ -956,32 +956,32 @@ module RLTK::CG
|
|
956
956
|
PtrToIntInst.new(Bindings.build_ptr_to_int(@ptr, val, check_cg_type(type), name))
|
957
957
|
end
|
958
958
|
alias :ptr2int :ptr_to_int
|
959
|
-
|
959
|
+
|
960
960
|
# Sign extension by copying the sign bit (highest order bit) of the
|
961
961
|
# value until it reaches the bit size of the given type.
|
962
962
|
#
|
963
963
|
# @param [Value] val Integer or vector of integers to be extended.
|
964
964
|
# @param [Type] type Integer or vector of integer type of greater size than the size of val.
|
965
965
|
# @param [String] name Name of the result in LLVM IR.
|
966
|
-
#
|
966
|
+
#
|
967
967
|
# @return [SignExtendInst] The extended value.
|
968
968
|
def sign_extend(val, type, name = '')
|
969
969
|
SignExtendInst.new(Bindings.build_s_ext(@ptr, val, check_cg_type(type), name))
|
970
970
|
end
|
971
971
|
alias :sext :sign_extend
|
972
|
-
|
972
|
+
|
973
973
|
# Sign extension or bitcast.
|
974
974
|
#
|
975
975
|
# @param [Value] val Integer or vector of integers to be extended.
|
976
976
|
# @param [Type] type Integer or vector of integer type of greater size than the size of val.
|
977
977
|
# @param [String] name Name of the result in LLVM IR.
|
978
|
-
#
|
978
|
+
#
|
979
979
|
# @return [SignExtendOrBitcastInst] The extended or cast value.
|
980
980
|
def sign_extend_or_bitcast(val, type, name = '')
|
981
981
|
SignExtendOrBitCastInst.new(Bindings.build_s_ext_or_bit_cast(@ptr, val, check_cg_type(type), name))
|
982
982
|
end
|
983
983
|
alias :sext_or_bitcast :sign_extend_or_bitcast
|
984
|
-
|
984
|
+
|
985
985
|
# Convert a signed integer to a floating point.
|
986
986
|
#
|
987
987
|
# @param [Value] val Signed integer or vector of signed integer to convert.
|
@@ -993,31 +993,31 @@ module RLTK::CG
|
|
993
993
|
SIToFPInst.new(Bindings.build_si_to_fp(@ptr, val, check_cg_type(type), name))
|
994
994
|
end
|
995
995
|
alias :si2fp :signed_int_to_floating_point
|
996
|
-
|
996
|
+
|
997
997
|
# Truncates its operand to the given type. The size of the value type
|
998
998
|
# must be greater than the size of the target type.
|
999
999
|
#
|
1000
1000
|
# @param [Value] val Integer or vector of integers to be truncated.
|
1001
1001
|
# @param [Type] type Integer or vector of integers of equal size to val.
|
1002
1002
|
# @param [String] name Name of the result in LLVM IR.
|
1003
|
-
#
|
1003
|
+
#
|
1004
1004
|
# @return [TruncateInst] The truncated value.
|
1005
1005
|
def truncate(val, type, name = '')
|
1006
1006
|
TruncateInst.new(Bindings.build_trunc(@ptr, val, check_cg_type(type), name))
|
1007
1007
|
end
|
1008
1008
|
alias :trunc :truncate
|
1009
|
-
|
1009
|
+
|
1010
1010
|
# Truncates or bitcast.
|
1011
1011
|
#
|
1012
1012
|
# @param [Value] val Integer or vector of integers to be truncated.
|
1013
1013
|
# @param [Type] type Integer or vector of integers of equal size to val.
|
1014
1014
|
# @param [String] name Name of the result in LLVM IR.
|
1015
|
-
#
|
1015
|
+
#
|
1016
1016
|
# @return [TruncateInst] The truncated or cast value.
|
1017
1017
|
def truncate_or_bitcast(val, type, name = '')
|
1018
1018
|
TruncateOrBitCastInst.new(Bindings.build_trunc_or_bit_cast(@ptr, val, check_cg_type(type), name))
|
1019
1019
|
end
|
1020
|
-
|
1020
|
+
|
1021
1021
|
# Convert an unsigned integer to a floating point.
|
1022
1022
|
#
|
1023
1023
|
# @param [Value] val Signed integer or vector of signed integer to convert.
|
@@ -1029,36 +1029,36 @@ module RLTK::CG
|
|
1029
1029
|
UIToFPInst.new(Bindings.build_ui_to_fp(@ptr, val, check_cg_type(type), name))
|
1030
1030
|
end
|
1031
1031
|
alias :ui2fp :unsigned_int_to_floating_point
|
1032
|
-
|
1032
|
+
|
1033
1033
|
# Zero extends its operand to the given type. The size of the value
|
1034
1034
|
# type must be greater than the size of the target type.
|
1035
1035
|
#
|
1036
1036
|
# @param [Value] val Integer or vector of integers to be extended.
|
1037
1037
|
# @param [Type] type Integer or vector of integer type of greater size than val.
|
1038
1038
|
# @param [String] name Name of the result in LLVM IR.
|
1039
|
-
#
|
1039
|
+
#
|
1040
1040
|
# @return [ZeroExtendInst] The extended value.
|
1041
1041
|
def zero_extend(val, type, name = '')
|
1042
1042
|
ZeroExtendInst.new(Bindings.build_z_ext(@ptr, val, check_cg_type(type), name))
|
1043
1043
|
end
|
1044
1044
|
alias :zext :zero_extend
|
1045
|
-
|
1045
|
+
|
1046
1046
|
# Zero extend or bitcast.
|
1047
1047
|
#
|
1048
1048
|
# @param [Value] val Integer or vector of integers to be extended.
|
1049
1049
|
# @param [Type] type Integer or vector of integer type of greater size than val.
|
1050
1050
|
# @param [String] name Name of the result in LLVM IR.
|
1051
|
-
#
|
1051
|
+
#
|
1052
1052
|
# @return [ZeroExtendInst] The extended or cast value.
|
1053
1053
|
def zero_extend_or_bitcast(val, type, name = '')
|
1054
1054
|
ZeroExtendOrBitCastInst.new(Bindings.build_z_ext_or_bit_cast(@ptr, val, check_cg_type(type), name))
|
1055
1055
|
end
|
1056
1056
|
alias :zext_or_bitcast :zero_extend_or_bitcast
|
1057
|
-
|
1057
|
+
|
1058
1058
|
###########################
|
1059
1059
|
# Comparison Instructions #
|
1060
1060
|
###########################
|
1061
|
-
|
1061
|
+
|
1062
1062
|
# Builds an icmp instruction. Compares lhs to rhs using the given
|
1063
1063
|
# symbol predicate.
|
1064
1064
|
#
|
@@ -1075,7 +1075,7 @@ module RLTK::CG
|
|
1075
1075
|
IntCmpInst.new(Bindings.build_i_cmp(@ptr, pred, lhs, rhs, name))
|
1076
1076
|
end
|
1077
1077
|
alias :icmp :int_comparison
|
1078
|
-
|
1078
|
+
|
1079
1079
|
# Builds an fcmp instruction. Compares lhs to rhs as reals using the
|
1080
1080
|
# given symbol predicate.
|
1081
1081
|
#
|
@@ -1092,7 +1092,7 @@ module RLTK::CG
|
|
1092
1092
|
FCmpInst.new(Bindings.build_f_cmp(@ptr, pred, lhs, rhs, name))
|
1093
1093
|
end
|
1094
1094
|
alias :fcmp :fp_comparison
|
1095
|
-
|
1095
|
+
|
1096
1096
|
# Calculate the difference between two pointers.
|
1097
1097
|
#
|
1098
1098
|
# @param [Value] lhs A pointer.
|
@@ -1103,7 +1103,7 @@ module RLTK::CG
|
|
1103
1103
|
def ptr_diff(lhs, rhs, name = '')
|
1104
1104
|
PtrDiffInst.new(Bindings.build_ptr_diff(lhs, rhs, name))
|
1105
1105
|
end
|
1106
|
-
|
1106
|
+
|
1107
1107
|
# Check if a value is not null.
|
1108
1108
|
#
|
1109
1109
|
# @param [Value] val Value to check.
|
@@ -1113,7 +1113,7 @@ module RLTK::CG
|
|
1113
1113
|
def is_not_null(val, name = '')
|
1114
1114
|
IsNotNullInst.new(Builder.build_is_not_null(@ptr, val, name))
|
1115
1115
|
end
|
1116
|
-
|
1116
|
+
|
1117
1117
|
# Check if a value is null.
|
1118
1118
|
#
|
1119
1119
|
# @param [Value] val Value to check.
|