ruby-llvm 2.9.0 → 2.9.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,24 +2,27 @@ module LLVM
2
2
  class Context
3
3
  private_class_method :new
4
4
 
5
- def initialize(ptr) # :nodoc:
5
+ # @private
6
+ def initialize(ptr)
6
7
  @ptr = ptr
7
8
  end
8
9
 
9
- def to_ptr # :nodoc:
10
+ # @private
11
+ def to_ptr
10
12
  @ptr
11
13
  end
12
14
 
13
- # Creates a new Context
15
+ # Creates a new Context.
14
16
  def self.create
15
17
  new(C.LLVMContextCreate())
16
18
  end
17
19
 
18
- # Obtains a reference to the global Context
20
+ # Obtains a reference to the global Context.
19
21
  def self.global
20
22
  new(C.LLVMGetGlobalContext())
21
23
  end
22
24
 
25
+ # Diposes the Context.
23
26
  def dispose
24
27
  C.LLVMContextDispose(@ptr)
25
28
  end
@@ -2,18 +2,22 @@ module LLVM
2
2
  class Module
3
3
  private_class_method :new
4
4
 
5
+ # @private
5
6
  def self.from_ptr(ptr)
6
7
  ptr.null? ? nil : new(ptr)
7
8
  end
8
9
 
9
- def initialize(ptr) # :nodoc:
10
+ # @private
11
+ def initialize(ptr)
10
12
  @ptr = ptr
11
13
  end
12
14
 
13
- def to_ptr # :nodoc:
15
+ # @private
16
+ def to_ptr
14
17
  @ptr
15
18
  end
16
19
 
20
+ # Checks if the module is equal to other.
17
21
  def ==(other)
18
22
  case other
19
23
  when LLVM::Module
@@ -23,14 +27,17 @@ module LLVM
23
27
  end
24
28
  end
25
29
 
30
+ # Checks if the module is equal to other.
26
31
  def eql?(other)
27
32
  other.instance_of?(self.class) && self == other
28
33
  end
29
34
 
35
+ # Creates a module with the given name.
30
36
  def self.create(name)
31
37
  new(C.LLVMModuleCreateWithName(name))
32
38
  end
33
39
 
40
+ # Returns a TypeCollection of all the Types in the module.
34
41
  def types
35
42
  @types ||= TypeCollection.new(self)
36
43
  end
@@ -40,26 +47,28 @@ module LLVM
40
47
  @module = mod
41
48
  end
42
49
 
50
+ # Adds the given Type to the collection with the given name (symbol or string).
43
51
  def add(name, type)
44
52
  C.LLVMAddTypeName(@module, name.to_s, type)
45
53
  end
46
54
 
55
+ # Returns the Type with the given name (symbol or string).
47
56
  def named(name)
48
- Type.from_ptr(C.LLVMGetTypeByName(@module, name))
57
+ Type.from_ptr(C.LLVMGetTypeByName(@module, name.to_s))
49
58
  end
50
59
 
60
+ # Returns the Type with the a name equal to key (symbol or string).
51
61
  def [](key)
52
- case key
53
- when String then named(key)
54
- when Symbol then named(key.to_s)
55
- end
62
+ named(key)
56
63
  end
57
64
 
65
+ # Adds the given Type to the collection with a name equal to key (symbol or string).
58
66
  def []=(key, type)
59
67
  add(key, type)
60
68
  end
61
69
  end
62
70
 
71
+ # Returns an Enumerable of all the GlobalVariables in the module.
63
72
  def globals
64
73
  @globals ||= GlobalCollection.new(self)
65
74
  end
@@ -71,38 +80,45 @@ module LLVM
71
80
  @module = mod
72
81
  end
73
82
 
83
+ # Adds a GlobalVariable with the given type and name to the collection (symbol or string).
74
84
  def add(ty, name)
75
- GlobalVariable.from_ptr(C.LLVMAddGlobal(@module, LLVM::Type(ty), name))
85
+ GlobalVariable.from_ptr(C.LLVMAddGlobal(@module, LLVM::Type(ty), name.to_s))
76
86
  end
77
87
 
88
+ # Returns the GlobalVariable with the given name (symbol or string).
78
89
  def named(name)
79
- GlobalValue.from_ptr(C.LLVMGetNamedGlobal(@module, name))
90
+ GlobalValue.from_ptr(C.LLVMGetNamedGlobal(@module, name.to_s))
80
91
  end
81
92
 
93
+ # Returns the first GlobalVariable in the collection.
82
94
  def first
83
95
  GlobalValue.from_ptr(C.LLVMGetFirstGlobal(@module))
84
96
  end
85
97
 
98
+ # Returns the last GlobalVariable in the collection.
86
99
  def last
87
100
  GlobalValue.from_ptr(C.LLVMGetLastGlobal(@module))
88
101
  end
89
102
 
103
+ # Returns the next GlobalVariable in the collection after global.
90
104
  def next(global)
91
105
  GlobalValue.from_ptr(C.LLVMGetNextGlobal(global))
92
106
  end
93
107
 
108
+ # Returns the previous GlobalVariable in the collection before global.
94
109
  def previous(global)
95
110
  GlobalValue.from_ptr(C.LLVMGetPreviousGlobal(global))
96
111
  end
97
112
 
113
+ # Deletes the GlobalVariable from the collection.
98
114
  def delete(global)
99
115
  C.LLVMDeleteGlobal(global)
100
116
  end
101
117
 
118
+ # Returns the GlobalVariable with a name equal to key (symbol or string) or at key (integer).
102
119
  def [](key)
103
120
  case key
104
- when String then named(key)
105
- when Symbol then named(key.to_s)
121
+ when String, Symbol then named(key)
106
122
  when Integer then
107
123
  i = 0
108
124
  g = first
@@ -114,6 +130,7 @@ module LLVM
114
130
  end
115
131
  end
116
132
 
133
+ # Iterates through each GlobalVariable in the collection.
117
134
  def each
118
135
  g = first
119
136
  until g.nil?
@@ -123,6 +140,7 @@ module LLVM
123
140
  end
124
141
  end
125
142
 
143
+ # Returns a FunctionCollection of all the Functions in the module.
126
144
  def functions
127
145
  @functions ||= FunctionCollection.new(self)
128
146
  end
@@ -134,6 +152,7 @@ module LLVM
134
152
  @module = mod
135
153
  end
136
154
 
155
+ # Adds a Function with the given name (symbol or string) and args (Types).
137
156
  def add(name, *args)
138
157
  if args.first.kind_of? Type
139
158
  type = args.first
@@ -150,34 +169,40 @@ module LLVM
150
169
  function
151
170
  end
152
171
 
172
+ # Returns the Function with the given name (symbol or string).
153
173
  def named(name)
154
- Function.from_ptr(C.LLVMGetNamedFunction(@module, name))
174
+ Function.from_ptr(C.LLVMGetNamedFunction(@module, name.to_s))
155
175
  end
156
176
 
177
+ # Returns the first Function in the collection.
157
178
  def first
158
179
  Function.from_ptr(C.LLVMGetFirstFunction(@module))
159
180
  end
160
181
 
182
+ # Returns the last Function in the collection.
161
183
  def last
162
184
  Function.from_ptr(C.LLVMGetLastFunction(@module))
163
185
  end
164
186
 
187
+ # Returns the next Function in the collection after function.
165
188
  def next(function)
166
189
  Function.from_ptr(C.LLVMGetNextFunction(function))
167
190
  end
168
191
 
192
+ # Returns the previous Function in the collection before function.
169
193
  def previous(function)
170
194
  Function.from_ptr(C.LLVMGetPreviousFunction(function))
171
195
  end
172
196
 
197
+ # Deletes the Function from the collection.
173
198
  def delete(function)
174
199
  C.LLVMDeleteFunction(function)
175
200
  end
176
201
 
202
+ # Returns the Function with a name equal to key (symbol or string) or at key (integer).
177
203
  def [](key)
178
204
  case key
179
- when String then named(key)
180
- when Symbol then named(key.to_s)
205
+ when String, Symbol then named(key)
181
206
  when Integer
182
207
  i = 0
183
208
  f = first
@@ -189,6 +214,7 @@ module LLVM
189
214
  end
190
215
  end
191
216
 
217
+ # Iterates through each Function in the collection.
192
218
  def each
193
219
  f = first
194
220
  until f.nil?
@@ -198,11 +224,12 @@ module LLVM
198
224
  end
199
225
  end
200
226
 
201
- # Print the module's IR to stdout
227
+ # Print the module's IR to stdout.
202
228
  def dump
203
229
  C.LLVMDumpModule(self)
204
230
  end
205
231
 
232
+ # Dispose the module.
206
233
  def dispose
207
234
  C.LLVMDisposeModule(@ptr)
208
235
  end
@@ -2,6 +2,7 @@ module LLVM
2
2
  # The PassManager runs a queue of passes on a module. See
3
3
  # http://llvm.org/docs/Passes.html for the list of available passes.
4
4
  class PassManager
5
+ # Creates a new pass manager on the given ExecutionEngine.
5
6
  def initialize(execution_engine)
6
7
  ptr = C.LLVMCreatePassManager()
7
8
  C.LLVMAddTargetData(
@@ -9,7 +10,8 @@ module LLVM
9
10
  @ptr = ptr
10
11
  end
11
12
 
12
- def to_ptr # :nodoc:
13
+ # @private
14
+ def to_ptr
13
15
  @ptr
14
16
  end
15
17
 
@@ -24,16 +26,19 @@ module LLVM
24
26
  def do_finalization
25
27
  end
26
28
 
29
+ # Runs the passes on the given module.
27
30
  def run(mod)
28
31
  C.LLVMRunPassManager(self, mod)
29
32
  end
30
33
 
34
+ # Disposes the pass manager.
31
35
  def dispose
32
36
  C.LLVMDisposePassManager(self)
33
37
  end
34
38
  end
35
39
 
36
40
  class FunctionPassManager < PassManager
41
+ # Creates a new pass manager on the given ExecutionEngine and Module.
37
42
  def initialize(execution_engine, mod)
38
43
  ptr = C.LLVMCreateFunctionPassManagerForModule(mod)
39
44
  C.LLVMAddTargetData(
@@ -49,6 +54,7 @@ module LLVM
49
54
  C.LLVMFinalizeFunctionPassManager(self) != 0
50
55
  end
51
56
 
57
+ # Runs the passes on the given function.
52
58
  def run(fn)
53
59
  C.LLVMRunFunctionPassManager(self, fn)
54
60
  end
@@ -2,11 +2,13 @@ module LLVM
2
2
  class Type
3
3
  private_class_method :new
4
4
 
5
- def initialize(ptr) # :nodoc:
5
+ # @private
6
+ def initialize(ptr)
6
7
  @ptr = ptr
7
8
  end
8
9
 
9
- def to_ptr # :nodoc:
10
+ # @private
11
+ def to_ptr
10
12
  @ptr
11
13
  end
12
14
 
@@ -20,14 +22,17 @@ module LLVM
20
22
  end
21
23
  end
22
24
 
25
+ # Checks if the type is equal to other.
23
26
  def eql?(other)
24
27
  other.instance_of?(self.class) && self == other
25
28
  end
26
29
 
30
+ # Returns a symbol representation of the types kind (ex. :pointer, :vector, :array.)
27
31
  def kind
28
- C.LLVMGetTypeKind(self)
32
+ C.LLVMGetTypeKind(self)
29
33
  end
30
34
 
35
+ # Returns the size of the type.
31
36
  def size
32
37
  Int64.from_ptr(C.LLVMSizeOf(self))
33
38
  end
@@ -36,6 +41,7 @@ module LLVM
36
41
  Int64.from_ptr(C.LLVMAlignOf(self))
37
42
  end
38
43
 
44
+ # Returns the type of this types elements (works only for Pointer, Vector, and Array types.)
39
45
  def element_type
40
46
  case self.kind
41
47
  when :pointer, :vector, :array
@@ -43,14 +49,17 @@ module LLVM
43
49
  end
44
50
  end
45
51
 
52
+ # Returns a null pointer ConstantExpr of this type.
46
53
  def null_pointer
47
54
  ConstantExpr.from_ptr(C.LLVMConstPointerNull(self))
48
55
  end
49
56
 
57
+ # Returns a null ConstantExpr of this type.
50
58
  def null
51
59
  ConstantExpr.from_ptr(C.LLVMConstNull(self))
52
60
  end
53
61
 
62
+ # Creates a pointer type with this type and the given address space.
54
63
  def pointer(address_space = 0)
55
64
  Type.pointer(self, address_space)
56
65
  end
@@ -59,18 +68,23 @@ module LLVM
59
68
  ptr.null? ? nil : new(ptr)
60
69
  end
61
70
 
71
+ # Creates an array type of Type with the given size.
62
72
  def self.array(ty, sz = 0)
63
73
  from_ptr(C.LLVMArrayType(LLVM::Type(ty), sz))
64
74
  end
65
75
 
76
+ # Creates the pointer type of Type with the given address space.
66
77
  def self.pointer(ty, address_space = 0)
67
78
  from_ptr(C.LLVMPointerType(LLVM::Type(ty), address_space))
68
79
  end
69
80
 
81
+ # Creates a vector type of Type with the given element count.
70
82
  def self.vector(ty, element_count)
71
83
  from_ptr(C.LLVMVectorType(LLVM::Type(ty), element_count))
72
84
  end
73
85
 
86
+ # Creates a function type. Takes an array of argument Types and the result Type. The only option is <tt>:varargs</tt>,
87
+ # which when set to true makes the function type take a variable number of args.
74
88
  def self.function(arg_types, result_type, options = {})
75
89
  arg_types.map! { |ty| LLVM::Type(ty) }
76
90
  arg_types_ptr = FFI::MemoryPointer.new(FFI.type_size(:pointer) * arg_types.size)
@@ -78,6 +92,7 @@ module LLVM
78
92
  from_ptr(C.LLVMFunctionType(LLVM::Type(result_type), arg_types_ptr, arg_types.size, options[:varargs] ? 1 : 0))
79
93
  end
80
94
 
95
+ # Creates a struct type with the given array of element types.
81
96
  def self.struct(elt_types, is_packed)
82
97
  elt_types.map! { |ty| LLVM::Type(ty) }
83
98
  elt_types_ptr = FFI::MemoryPointer.new(FFI.type_size(:pointer) * elt_types.size)
@@ -85,10 +100,12 @@ module LLVM
85
100
  from_ptr(C.LLVMStructType(elt_types_ptr, elt_types.size, is_packed ? 1 : 0))
86
101
  end
87
102
 
103
+ # Creates a void type.
88
104
  def self.void
89
105
  from_ptr(C.LLVMVoidType)
90
106
  end
91
107
 
108
+ # Creates an opaque type.
92
109
  def self.opaque
93
110
  from_ptr(C.LLVMOpaqueType)
94
111
  end
@@ -105,6 +122,7 @@ module LLVM
105
122
  end
106
123
  end
107
124
 
125
+ # Creates a Type from the given object.
108
126
  def LLVM.Type(ty)
109
127
  case ty
110
128
  when LLVM::Type then ty
@@ -112,26 +130,32 @@ module LLVM
112
130
  end
113
131
  end
114
132
 
133
+ # Shortcut to Type.array.
115
134
  def LLVM.Array(ty, sz = 0)
116
135
  LLVM::Type.array(ty, sz)
117
136
  end
118
137
 
138
+ # Shortcut to Type.pointer.
119
139
  def LLVM.Pointer(ty)
120
140
  LLVM::Type.pointer(ty)
121
141
  end
122
142
 
143
+ # Shortcut to Type.vector.
123
144
  def LLVM.Vector(ty, sz)
124
145
  LLVM::Type.vector(ty, sz)
125
146
  end
126
147
 
148
+ # Shortcut to Type.function.
127
149
  def LLVM.Function(argtypes, rettype, options = {})
128
150
  LLVM::Type.function(argtypes, rettype, options)
129
151
  end
130
152
 
153
+ # Shortcut to Type.struct.
131
154
  def LLVM.Struct(*elt_types)
132
155
  LLVM::Type.struct(elt_types, false)
133
156
  end
134
157
 
158
+ # Shortcut to Type.void.
135
159
  def LLVM.Void
136
160
  LLVM::Type.void
137
161
  end
@@ -1,19 +1,23 @@
1
1
  module LLVM
2
2
  class Value
3
+ # @private
3
4
  def self.from_ptr(ptr)
4
5
  new(ptr) unless ptr.null?
5
6
  end
6
7
 
7
8
  private_class_method :new
8
9
 
10
+ # @private
9
11
  def initialize(ptr)
10
12
  @ptr = ptr
11
13
  end
12
14
 
13
- def to_ptr # :nodoc:
15
+ # @private
16
+ def to_ptr
14
17
  @ptr
15
18
  end
16
19
 
20
+ # Checks if the value is equal to other.
17
21
  def ==(other)
18
22
  case other
19
23
  when LLVM::Value
@@ -23,10 +27,12 @@ module LLVM
23
27
  end
24
28
  end
25
29
 
30
+ # Checks if the value is equal to other.
26
31
  def eql?(other)
27
32
  other.instance_of?(self.class) && self == other
28
33
  end
29
34
 
35
+ # Returns the Value type. This is abstract and is overidden by its subclasses.
30
36
  def self.type
31
37
  raise NotImplementedError, "#{self.name}.type() is abstract."
32
38
  end
@@ -35,23 +41,28 @@ module LLVM
35
41
  type.to_ptr
36
42
  end
37
43
 
44
+ # Returns the value's type.
38
45
  def type
39
46
  Type.from_ptr(C.LLVMTypeOf(self))
40
47
  end
41
48
 
49
+ # Returns the value's name.
42
50
  def name
43
51
  C.LLVMGetValueName(self)
44
52
  end
45
53
 
54
+ # Sets the value's name to str.
46
55
  def name=(str)
47
56
  C.LLVMSetValueName(self, str)
48
57
  str
49
58
  end
50
59
 
60
+ # Print the value's IR to stdout.
51
61
  def dump
52
62
  C.LLVMDumpValue(self)
53
63
  end
54
64
 
65
+ # Returns whether the value is constant.
55
66
  def constant?
56
67
  case C.LLVMIsConstant(self)
57
68
  when 0 then false
@@ -59,6 +70,7 @@ module LLVM
59
70
  end
60
71
  end
61
72
 
73
+ # Returns whether the value is null.
62
74
  def null?
63
75
  case C.LLVMIsNull(self)
64
76
  when 0 then false
@@ -66,6 +78,7 @@ module LLVM
66
78
  end
67
79
  end
68
80
 
81
+ # Returns whether the value is undefined.
69
82
  def undefined?
70
83
  case C.LLVMIsUndef(self)
71
84
  when 0 then false
@@ -73,6 +86,7 @@ module LLVM
73
86
  end
74
87
  end
75
88
 
89
+ # Adds attr to this value's attributes.
76
90
  def add_attribute(attr)
77
91
  C.LLVMAddAttribute(self, attr)
78
92
  end
@@ -82,10 +96,12 @@ module LLVM
82
96
  end
83
97
 
84
98
  class BasicBlock < Value
99
+ # Creates a basic block for the given function with the given name.
85
100
  def self.create(fun = nil, name = "")
86
101
  self.from_ptr(C.LLVMAppendBasicBlock(fun, name))
87
102
  end
88
103
 
104
+ # Build the basic block with the given builder. Creates a new one if nil. Yields the builder.
89
105
  def build(builder = nil)
90
106
  if builder.nil?
91
107
  builder = Builder.create
@@ -99,16 +115,19 @@ module LLVM
99
115
  builder.dispose if islocal
100
116
  end
101
117
 
118
+ # Returns the parent of this basic block (a Function).
102
119
  def parent
103
120
  fp = C.LLVMGetBasicBlockParent(self)
104
121
  LLVM::Function.from_ptr(fp) unless fp.null?
105
122
  end
106
123
 
124
+ # Returns the next basic block in the sequence.
107
125
  def next
108
126
  ptr = C.LLVMGetNextBasicBlock(self)
109
127
  BasicBlock.from_ptr(ptr) unless ptr.null?
110
128
  end
111
129
 
130
+ # Returns the previous basic block in the sequence.
112
131
  def previous
113
132
  ptr = C.LLVMGetPreviousBasicBlock(self)
114
133
  BasicBlock.from_ptr(ptr) unless ptr.null?
@@ -122,10 +141,12 @@ module LLVM
122
141
  instructions.last
123
142
  end
124
143
 
144
+ # Returns an Enumerable of the Instructions in the current block.
125
145
  def instructions
126
146
  @instructions ||= InstructionCollection.new(self)
127
147
  end
128
148
 
149
+ # @private
129
150
  class InstructionCollection
130
151
  include Enumerable
131
152
 
@@ -133,6 +154,7 @@ module LLVM
133
154
  @block = block
134
155
  end
135
156
 
157
+ # Iterates through each Instruction in the collection.
136
158
  def each
137
159
  return to_enum :each unless block_given?
138
160
  inst, last = first, last
@@ -146,11 +168,13 @@ module LLVM
146
168
  self
147
169
  end
148
170
 
171
+ # Returns the first Instruction in the collection.
149
172
  def first
150
173
  ptr = C.LLVMGetFirstInstruction(@block)
151
174
  LLVM::Instruction.from_ptr(ptr) unless ptr.null?
152
175
  end
153
176
 
177
+ # Returns the last Instruction in the collection.
154
178
  def last
155
179
  ptr = C.LLVMGetLastInstruction(@block)
156
180
  LLVM::Instruction.from_ptr(ptr) unless ptr.null?
@@ -159,10 +183,12 @@ module LLVM
159
183
  end
160
184
 
161
185
  class User < Value
186
+ # Returns an Enumerable of the operands in this user.
162
187
  def operands
163
188
  @operand_collection ||= OperandCollection.new(self)
164
189
  end
165
190
 
191
+ # @private
166
192
  class OperandCollection
167
193
  include Enumerable
168
194
 
@@ -170,19 +196,23 @@ module LLVM
170
196
  @user = user
171
197
  end
172
198
 
199
+ # Get a reference to an operand by index.
173
200
  def [](i)
174
201
  ptr = C.LLVMGetOperand(@user, i)
175
202
  Value.from_ptr(ptr) unless ptr.null?
176
203
  end
177
204
 
205
+ # Set or replace an operand by index.
178
206
  def []=(i, v)
179
207
  C.LLVMSetOperand(@user, i, v)
180
208
  end
181
209
 
210
+ # Returns the number of operands in the collection.
182
211
  def size
183
212
  C.LLVMGetNumOperands(@user)
184
213
  end
185
214
 
215
+ # Iterates through each operand in the collection.
186
216
  def each
187
217
  return to_enum :each unless block_given?
188
218
  0.upto(size-1) { |i| yield self[i] }
@@ -192,22 +222,28 @@ module LLVM
192
222
  end
193
223
 
194
224
  class Constant < User
195
- def self.null
225
+ # Creates a null constant of Type.
226
+ def self.null(type)
196
227
  from_ptr(C.LLVMConstNull(type))
197
228
  end
198
229
 
199
- def self.undef
230
+ # Creates a undefined constant of Type.
231
+ def self.undef(type)
200
232
  from_ptr(C.LLVMGetUndef(type))
201
233
  end
202
234
 
203
- def self.null_ptr
235
+ # Creates a null pointer constant of Type.
236
+ def self.null_ptr(type)
204
237
  from_ptr(C.LLVMConstPointerNull(type))
205
238
  end
206
239
 
240
+ # Bitcast this constant to Type.
207
241
  def bitcast_to(type)
208
242
  ConstantExpr.from_ptr(C.LLVMConstBitCast(self, type))
209
243
  end
210
244
 
245
+ # Returns the element pointer at the given indices of the constant.
246
+ # For more information on gep go to: http://llvm.org/docs/GetElementPtr.html
211
247
  def gep(*indices)
212
248
  indices = Array(indices)
213
249
  FFI::MemoryPointer.new(FFI.type_size(:pointer) * indices.size) do |indices_ptr|
@@ -255,6 +291,7 @@ module LLVM
255
291
  from_ptr(C.LLVMConstAllOnes(type))
256
292
  end
257
293
 
294
+ # Creates a ConstantInt from an integer.
258
295
  def self.from_i(n, signed = true)
259
296
  from_ptr(C.LLVMConstInt(type, n, signed ? 1 : 0))
260
297
  end
@@ -263,72 +300,100 @@ module LLVM
263
300
  from_ptr(C.LLVMConstIntOfString(type, str, radix))
264
301
  end
265
302
 
303
+ # Negation.
266
304
  def -@
267
305
  self.class.from_ptr(C.LLVMConstNeg(self))
268
306
  end
269
307
 
308
+ # Boolean negation.
270
309
  def not
271
310
  self.class.from_ptr(C.LLVMConstNot(self))
272
311
  end
273
312
 
313
+ # Addition.
274
314
  def +(rhs)
275
315
  self.class.from_ptr(C.LLVMConstAdd(self, rhs))
276
316
  end
277
317
 
318
+ # "No signed wrap" addition. See
319
+ # http://llvm.org/docs/LangRef.html#i_add for discusison.
278
320
  def nsw_add(rhs)
279
321
  self.class.from_ptr(C.LLVMConstNSWAdd(self, rhs))
280
322
  end
281
323
 
324
+ # Multiplication.
282
325
  def *(rhs)
283
326
  self.class.from_ptr(C.LLVMConstMul(self, rhs))
284
327
  end
285
328
 
329
+ # Unsigned division.
286
330
  def udiv(rhs)
287
331
  self.class.from_ptr(C.LLVMConstUDiv(self, rhs))
288
332
  end
289
333
 
334
+ # Signed division.
290
335
  def /(rhs)
291
336
  self.class.from_ptr(C.LLVMConstSDiv(self, rhs))
292
337
  end
293
338
 
339
+ # Unsigned remainder.
294
340
  def urem(rhs)
295
341
  self.class.from_ptr(C.LLVMConstURem(self, rhs))
296
342
  end
297
343
 
344
+ # Signed remainder.
298
345
  def rem(rhs)
299
346
  self.class.from_ptr(C.LLVMConstSRem(self, rhs))
300
347
  end
301
348
 
302
- def and(rhs) # Ruby's && cannot be overloaded
349
+ # Integer AND.
350
+ def and(rhs)
303
351
  self.class.from_ptr(C.LLVMConstAnd(self, rhs))
304
352
  end
305
353
 
306
- def or(rhs) # Nor is ||.
354
+ # Integer OR.
355
+ def or(rhs)
307
356
  self.class.from_ptr(C.LLVMConstOr(self, rhs))
308
357
  end
309
358
 
310
- def xor(rhs) # Nor is ||.
359
+ # Integer XOR.
360
+ def xor(rhs)
311
361
  self.class.from_ptr(C.LLVMConstXor(self, rhs))
312
362
  end
313
363
 
364
+ # Integer comparison using the predicate specified via the first parameter.
365
+ # Predicate can be any of:
366
+ # :eq - equal to
367
+ # :ne - not equal to
368
+ # :ugt - unsigned greater than
369
+ # :uge - unsigned greater than or equal to
370
+ # :ult - unsigned less than
371
+ # :ule - unsigned less than or equal to
372
+ # :sgt - signed greater than
373
+ # :sge - signed greater than or equal to
374
+ # :slt - signed less than
375
+ # :sle - signed less than or equal to
314
376
  def icmp(pred, rhs)
315
377
  self.class.from_ptr(C.LLVMConstICmp(pred, self, rhs))
316
378
  end
317
379
 
380
+ # Shift left.
318
381
  def <<(bits)
319
- self.class.from_ptr(C.LLVMConstShl(self, rhs))
382
+ self.class.from_ptr(C.LLVMConstShl(self, bits))
320
383
  end
321
384
 
385
+ # Shift right.
322
386
  def >>(bits)
323
- self.class.from_ptr(C.LLVMConstLShr(self, rhs))
387
+ self.class.from_ptr(C.LLVMConstLShr(self, bits))
324
388
  end
325
389
 
390
+ # Arithmatic shift right.
326
391
  def ashr(bits)
327
- self.class.from_ptr(C.LLVMConstAShr(self, rhs))
392
+ self.class.from_ptr(C.LLVMConstAShr(self, bits))
328
393
  end
329
394
  end
330
395
 
331
- def LLVM.const_missing(const) # :nodoc:
396
+ def LLVM.const_missing(const)
332
397
  case const.to_s
333
398
  when /Int(\d+)/
334
399
  width = $1.to_i
@@ -349,6 +414,7 @@ module LLVM
349
414
  # Native integer type
350
415
  ::LLVM::Int = const_get("Int#{NATIVE_INT_SIZE}")
351
416
 
417
+ # Creates a LLVM Int (subclass of ConstantInt) at the NATIVE_INT_SIZE from a integer (val).
352
418
  def LLVM.Int(val)
353
419
  case val
354
420
  when LLVM::ConstantInt then val
@@ -357,45 +423,71 @@ module LLVM
357
423
  end
358
424
 
359
425
  class ConstantReal < Constant
426
+ # Creates a ConstantReal from a float of Type.
360
427
  def self.from_f(n)
361
428
  from_ptr(C.LLVMConstReal(type, n))
362
429
  end
363
430
 
364
- def self.parse(str)
431
+ def self.parse(type, str)
365
432
  from_ptr(C.LLVMConstRealOfString(type, str))
366
433
  end
367
434
 
435
+ # Negation.
368
436
  def -@
369
437
  self.class.from_ptr(C.LLVMConstFNeg(self))
370
438
  end
371
439
 
440
+ # Returns the result of adding this ConstantReal to rhs.
372
441
  def +(rhs)
373
442
  self.class.from_ptr(C.LLVMConstFAdd(self, rhs))
374
443
  end
375
444
 
445
+ # Returns the result of multiplying this ConstantReal by rhs.
376
446
  def *(rhs)
377
447
  self.class.from_ptr(C.LLVMConstFMul(self, rhs))
378
448
  end
379
449
 
450
+ # Returns the result of dividing this ConstantReal by rhs.
380
451
  def /(rhs)
381
452
  self.class.from_ptr(C.LLVMConstFDiv(self, rhs))
382
453
  end
383
454
 
455
+ # Remainder.
384
456
  def rem(rhs)
385
457
  self.class.from_ptr(C.LLVMConstFRem(self, rhs))
386
458
  end
387
459
 
460
+ # Floating point comparison using the predicate specified via the first
461
+ # parameter. Predicate can be any of:
462
+ # :ord - ordered
463
+ # :uno - unordered: isnan(X) | isnan(Y)
464
+ # :oeq - ordered and equal to
465
+ # :oeq - unordered and equal to
466
+ # :one - ordered and not equal to
467
+ # :one - unordered and not equal to
468
+ # :ogt - ordered and greater than
469
+ # :uge - unordered and greater than or equal to
470
+ # :olt - ordered and less than
471
+ # :ule - unordered and less than or equal to
472
+ # :oge - ordered and greater than or equal to
473
+ # :sge - unordered and greater than or equal to
474
+ # :ole - ordered and less than or equal to
475
+ # :sle - unordered and less than or equal to
476
+ # :true - always true
477
+ # :false- always false
388
478
  def fcmp(pred, rhs)
389
479
  self.class.from_ptr(C.LLMVConstFCmp(pred, self, rhs))
390
480
  end
391
481
  end
392
482
 
393
483
  class Float < ConstantReal
484
+ # Return a Type representation of the float.
394
485
  def self.type
395
486
  Type.from_ptr(C.LLVMFloatType)
396
487
  end
397
488
  end
398
489
 
490
+ # Create a LLVM::Float from a Ruby Float (val).
399
491
  def LLVM.Float(val)
400
492
  Float.from_f(val)
401
493
  end
@@ -485,23 +577,28 @@ module LLVM
485
577
  end
486
578
 
487
579
  class Function < GlobalValue
580
+ # Sets the function's calling convention and returns it.
488
581
  def call_conv=(conv)
489
582
  C.LLVMSetFunctionCallConv(self, conv)
490
583
  conv
491
584
  end
492
585
 
586
+ # Adds the given attribute to the function.
493
587
  def add_attribute(attr)
494
588
  C.LLVMAddFunctionAttr(self, attr)
495
589
  end
496
590
 
591
+ # Removes the given attribute from the function.
497
592
  def remove_attribute(attr)
498
593
  C.LLVMRemoveFunctionAttr(self, attr)
499
594
  end
500
595
 
596
+ # Returns an Enumerable of the BasicBlocks in this function.
501
597
  def basic_blocks
502
598
  @basic_block_collection ||= BasicBlockCollection.new(self)
503
599
  end
504
600
 
601
+ # @private
505
602
  class BasicBlockCollection
506
603
  include Enumerable
507
604
 
@@ -509,10 +606,12 @@ module LLVM
509
606
  @fun = fun
510
607
  end
511
608
 
609
+ # Returns the number of BasicBlocks in the collection.
512
610
  def size
513
611
  C.LLVMCountBasicBlocks(@fun)
514
612
  end
515
613
 
614
+ # Iterates through each BasicBlock in the collection.
516
615
  def each
517
616
  return to_enum :each unless block_given?
518
617
 
@@ -525,44 +624,54 @@ module LLVM
525
624
  self
526
625
  end
527
626
 
627
+ # Adds a BasicBlock with the given name to the end of the collection.
528
628
  def append(name = "")
529
629
  BasicBlock.create(@fun, name)
530
630
  end
531
631
 
632
+ # Returns the entry BasicBlock in the collection. This is the block the
633
+ # function starts on.
532
634
  def entry
533
635
  BasicBlock.from_ptr(C.LLVMGetEntryBasicBlock(@fun))
534
636
  end
535
637
 
638
+ # Returns the first BasicBlock in the collection.
536
639
  def first
537
640
  ptr = C.LLVMGetFirstBasicBlock(@fun)
538
641
  BasicBlock.from_ptr(ptr) unless ptr.null?
539
642
  end
540
643
 
644
+ # Returns the last BasicBlock in the collection.
541
645
  def last
542
646
  ptr = C.LLVMGetLastBasicBlock(@fun)
543
647
  BasicBlock.from_ptr(ptr) unless ptr.null?
544
648
  end
545
649
  end
546
650
 
651
+ # Returns an Enumerable of the parameters in the function.
547
652
  def params
548
653
  @parameter_collection ||= ParameterCollection.new(self)
549
654
  end
550
655
 
656
+ # @private
551
657
  class ParameterCollection
552
658
  def initialize(fun)
553
659
  @fun = fun
554
660
  end
555
661
 
662
+ # Returns a Value representation of the parameter at the given index.
556
663
  def [](i)
557
664
  Value.from_ptr(C.LLVMGetParam(@fun, i))
558
665
  end
559
666
 
667
+ # Returns the number of paramters in the collection.
560
668
  def size
561
669
  C.LLVMCountParams(@fun)
562
670
  end
563
671
 
564
672
  include Enumerable
565
673
 
674
+ # Iteraters through each parameter in the collection.
566
675
  def each
567
676
  return to_enum :each unless block_given?
568
677
  0.upto(size-1) { |i| yield self[i] }
@@ -596,16 +705,19 @@ module LLVM
596
705
  end
597
706
 
598
707
  class Instruction < User
708
+ # Returns the parent of the instruction (a BasicBlock).
599
709
  def parent
600
710
  ptr = C.LLVMGetInstructionParent(self)
601
711
  LLVM::BasicBlock.from_ptr(ptr) unless ptr.null?
602
712
  end
603
713
 
714
+ # Returns the next instruction after this one.
604
715
  def next
605
716
  ptr = C.LLVMGetNextInstruction(self)
606
717
  LLVM::Instruction.from_ptr(ptr) unless ptr.null?
607
718
  end
608
719
 
720
+ # Returns the previous instruction before this one.
609
721
  def previous
610
722
  ptr = C.LLVMGetPreviousInstruction(self)
611
723
  LLVM::Instruction.from_ptr(ptr) unless ptr.null?
@@ -613,19 +725,21 @@ module LLVM
613
725
  end
614
726
 
615
727
  class CallInst < Instruction
728
+ # Sets the call convention to conv.
616
729
  def call_conv=(conv)
617
730
  C.LLVMSetInstructionCallConv(self, conv)
618
731
  conv
619
732
  end
620
733
 
734
+ # Returns the call insatnce's call convention.
621
735
  def call_conv
622
736
  C.LLVMGetInstructionCallConv(self)
623
737
  end
624
738
  end
625
739
 
626
740
  class Phi < Instruction
627
- # Add incoming branches to a phi node by passing an alternating list
628
- # of resulting values and basic blocks. e.g.
741
+ # Add incoming branches to a phi node by passing an alternating list of
742
+ # resulting values and BasicBlocks. e.g.
629
743
  # phi.add_incoming(val1, block1, val2, block2, ...)
630
744
  def add_incoming(*incoming)
631
745
  vals, blocks = [], []
@@ -651,8 +765,8 @@ module LLVM
651
765
  end
652
766
 
653
767
  class SwitchInst < Instruction
654
- # Adds a case to a switch instruction. First the value to match on,
655
- # then the basic block.
768
+ # Adds a case to a switch instruction. First the value to match on, then
769
+ # the basic block.
656
770
  def add_case(val, block)
657
771
  C.LLVMAddCase(self, val, block)
658
772
  end