rltk3 3.0.2

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.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/AUTHORS +1 -0
  3. data/LICENSE +27 -0
  4. data/README.md +852 -0
  5. data/Rakefile +197 -0
  6. data/lib/rltk/ast.rb +573 -0
  7. data/lib/rltk/cfg.rb +683 -0
  8. data/lib/rltk/cg/basic_block.rb +157 -0
  9. data/lib/rltk/cg/bindings.rb +151 -0
  10. data/lib/rltk/cg/builder.rb +1127 -0
  11. data/lib/rltk/cg/context.rb +48 -0
  12. data/lib/rltk/cg/contractor.rb +51 -0
  13. data/lib/rltk/cg/execution_engine.rb +194 -0
  14. data/lib/rltk/cg/function.rb +237 -0
  15. data/lib/rltk/cg/generated_bindings.rb +8118 -0
  16. data/lib/rltk/cg/generic_value.rb +95 -0
  17. data/lib/rltk/cg/instruction.rb +519 -0
  18. data/lib/rltk/cg/llvm.rb +150 -0
  19. data/lib/rltk/cg/memory_buffer.rb +75 -0
  20. data/lib/rltk/cg/module.rb +451 -0
  21. data/lib/rltk/cg/pass_manager.rb +252 -0
  22. data/lib/rltk/cg/support.rb +29 -0
  23. data/lib/rltk/cg/target.rb +230 -0
  24. data/lib/rltk/cg/triple.rb +58 -0
  25. data/lib/rltk/cg/type.rb +554 -0
  26. data/lib/rltk/cg/value.rb +1272 -0
  27. data/lib/rltk/cg.rb +32 -0
  28. data/lib/rltk/lexer.rb +372 -0
  29. data/lib/rltk/lexers/calculator.rb +44 -0
  30. data/lib/rltk/lexers/ebnf.rb +38 -0
  31. data/lib/rltk/parser.rb +1702 -0
  32. data/lib/rltk/parsers/infix_calc.rb +43 -0
  33. data/lib/rltk/parsers/postfix_calc.rb +34 -0
  34. data/lib/rltk/parsers/prefix_calc.rb +34 -0
  35. data/lib/rltk/token.rb +90 -0
  36. data/lib/rltk/version.rb +11 -0
  37. data/lib/rltk.rb +16 -0
  38. data/test/cg/tc_basic_block.rb +83 -0
  39. data/test/cg/tc_control_flow.rb +191 -0
  40. data/test/cg/tc_function.rb +54 -0
  41. data/test/cg/tc_generic_value.rb +33 -0
  42. data/test/cg/tc_instruction.rb +256 -0
  43. data/test/cg/tc_llvm.rb +25 -0
  44. data/test/cg/tc_math.rb +88 -0
  45. data/test/cg/tc_module.rb +89 -0
  46. data/test/cg/tc_transforms.rb +68 -0
  47. data/test/cg/tc_type.rb +69 -0
  48. data/test/cg/tc_value.rb +151 -0
  49. data/test/cg/ts_cg.rb +23 -0
  50. data/test/tc_ast.rb +332 -0
  51. data/test/tc_cfg.rb +164 -0
  52. data/test/tc_lexer.rb +216 -0
  53. data/test/tc_parser.rb +711 -0
  54. data/test/tc_token.rb +34 -0
  55. data/test/ts_rltk.rb +47 -0
  56. metadata +317 -0
@@ -0,0 +1,1127 @@
1
+ # Author: Chris Wailes <chris.wailes@gmail.com>
2
+ # Project: Ruby Language Toolkit
3
+ # Date: 2012/03/20
4
+ # Description: This file defines the Builder class.
5
+
6
+ ############
7
+ # Requires #
8
+ ############
9
+
10
+ # Ruby Language Toolkit
11
+ require 'rltk/cg/bindings'
12
+ require 'rltk/cg/instruction'
13
+
14
+ #######################
15
+ # Classes and Modules #
16
+ #######################
17
+
18
+ module RLTK::CG
19
+
20
+ # This class is responsible for adding {Instruction Instructions} to {BasicBlock BasicBlocks}.
21
+ class Builder
22
+ include BindingClass
23
+
24
+ # The Proc object called by the garbage collector to free resources used by LLVM.
25
+ CLASS_FINALIZER = Proc.new { |id| Bindings.dispose_builder(ptr) if ptr = ObjectSpace._id2ref(id).ptr }
26
+
27
+ # @return [Builder] A global Builder object.
28
+ def self.global
29
+ @@global_builder ||= Builder.new
30
+ end
31
+
32
+ # Creates a new Builder object, optionally positioning it at the end
33
+ # of *block*. If a block is given it will be executed as if it was
34
+ # passed to the #build method.
35
+ #
36
+ # @param [BasicBlock, nil] bb BasicBlock used to position the Builder.
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.
39
+ def initialize(bb = nil, *block_args, &block)
40
+ @ptr = Bindings.create_builder
41
+
42
+ # Define a finalizer to free the memory used by LLVM for this
43
+ # builder.
44
+ ObjectSpace.define_finalizer(self, CLASS_FINALIZER)
45
+
46
+ if block then self.build(bb, *block_args, &block) elsif bb then position_at_end(bb) end
47
+ end
48
+
49
+ # Executes a given block inside the context of this builder. If the
50
+ # *bb* parameter isn't nill, the Builder will be positioned at the
51
+ # end of the specified BasicBlock.
52
+ #
53
+ # @param [BasicBlock] bb Optional BasicBlock used to position the Builder.
54
+ # @param [Array<Object>] block_args Arguments to be passed to *block*.
55
+ # @param [Proc] block Block to execute in the context of this Builder.
56
+ #
57
+ # @return [Object] The result of evaluating *block* in the context of this Builder.
58
+ def build(bb = nil, *block_args, &block)
59
+ self.position_at_end(bb) if bb
60
+ self.instance_exec(*block_args, &block)
61
+ end
62
+
63
+ # Build an instruction.
64
+ #
65
+ # @param [Symbol] inst Name of instruction building method.
66
+ # @param [Array<Object>] args Arguments to be passed to building method.
67
+ #
68
+ # @return [Instruction] Build instruction.
69
+ def build_inst(inst, *args)
70
+ self.send(inst, *args)
71
+ end
72
+ alias :'<<' :build_inst
73
+
74
+ # Position the Builder after the given instruction.
75
+ #
76
+ # @param [BasicBlock] bb
77
+ # @param [Instruction] instruction
78
+ #
79
+ # @return [Builder] self
80
+ def position(bb, instruction)
81
+ Bindings.position_builder(@ptr, bb, instruction) if check_type(bb, BasicBlock, 'bb')
82
+ self
83
+ end
84
+
85
+ # Position the Builder at the end of the given BasicBlock.
86
+ #
87
+ # @param [BasicBlock] bb
88
+ #
89
+ # @return [Bulder] self
90
+ def position_at_end(bb)
91
+ Bindings.position_builder_at_end(@ptr, bb) if check_type(bb, BasicBlock, 'bb')
92
+ self
93
+ end
94
+ alias :pae :position_at_end
95
+ alias :target :position_at_end
96
+
97
+ # Position the Builder before the given Instruction.
98
+ #
99
+ # @param [Instruction] instruction
100
+ #
101
+ # @return [Builder] self
102
+ def position_before(instruction)
103
+ Bindings.position_builder_before(@ptr, instruction)
104
+ self
105
+ end
106
+
107
+ ################################
108
+ # Instruction Building Methods #
109
+ ################################
110
+
111
+ #################
112
+ # Miscellaneous #
113
+ #################
114
+
115
+ # @return [BasicBlock] BasicBlock the Builder is currently positioned on.
116
+ def current_block
117
+ BasicBlock.new(Bindings.get_insert_block(@ptr))
118
+ end
119
+ alias :insertion_block :current_block
120
+
121
+ # Generates an instruction with no defined semantics. Can be used to
122
+ # provide hints to the optimizer.
123
+ #
124
+ # @return [UnreachableInst]
125
+ def unreachable
126
+ UnreachableInst.new(Bindings.build_unreachable(@ptr))
127
+ end
128
+
129
+ ###########
130
+ # Returns #
131
+ ###########
132
+
133
+ # @param [Value] val The Value to return.
134
+ #
135
+ # @return [ReturnInst]
136
+ def ret(val)
137
+ ReturnInst.new(Bindings.build_ret(@ptr, val))
138
+ end
139
+
140
+ # @return [RetVoidInst]
141
+ def ret_void
142
+ ReturnVoidInst.new(Bindings.build_ret_void(@ptr))
143
+ end
144
+
145
+ # @return [RetAggregateInst]
146
+ def ret_aggregate(*vals)
147
+ vals = vals.first if vals.length == 1 and vals.first.instance_of?(::Array)
148
+
149
+ vals_ptr = FFI::MemoryPointer.new(:pointer, vals.length)
150
+ vals_ptr.write_array_of_pointer(vals)
151
+
152
+ ReturnAggregateInst.new(Bindings.build_aggregate_ret(@ptr, vals_ptr, vals.length))
153
+ end
154
+
155
+ ################
156
+ # Control Flow #
157
+ ################
158
+
159
+ # Unconditional branching.
160
+ #
161
+ # @param [BasicBlock] block Where to jump.
162
+ #
163
+ # @return [BranchInst]
164
+ def branch(block)
165
+ BranchInst.new(Bindings.build_br(@ptr, block))
166
+ end
167
+ alias :br :branch
168
+
169
+ # Build an instruction that performs a function call.
170
+ #
171
+ # @param [Function] fun Function to call.
172
+ # @param [Array<Value>] args Arguments to pass to function.
173
+ #
174
+ # @return [CallInst]
175
+ def call(fun, *args)
176
+ name = if args.last.is_a?(String) then args.pop else '' end
177
+
178
+ args_ptr = FFI::MemoryPointer.new(:pointer, args.length)
179
+ args_ptr.write_array_of_pointer(args)
180
+
181
+ CallInst.new(Bindings.build_call(@ptr, fun, args_ptr, args.length, name))
182
+ end
183
+
184
+ # Conditional branching.
185
+ #
186
+ # @param [Value] val Condition value.
187
+ # @param [BasicBlock] iffalse Where to jump if condition is true.
188
+ # @param [BasicBlock] iftrue Where to jump if condition is false.
189
+ #
190
+ # @return [CondBranchInst]
191
+ def cond_branch(val, iftrue, iffalse)
192
+ CondBranchInst.new(Bindings.build_cond_br(@ptr, val, iftrue, iffalse))
193
+ end
194
+ alias :cond :cond_branch
195
+
196
+ # Extract an element from a vector.
197
+ #
198
+ # @param [Value] vector Vector from which to extract a value.
199
+ # @param [Value] index Index of the element to extract, an unsigned integer.
200
+ # @param [String] name Value of the result in LLVM IR.
201
+ #
202
+ # @return [ExtractElementInst] The extracted element.
203
+ def extract_element(vector, index, name = '')
204
+ ExtractElementInst.new(Bindings.build_extract_element(@ptr, vector, index, name))
205
+ end
206
+
207
+ # Extract the value of a member field from an aggregate value.
208
+ #
209
+ # @param [Value] aggregate An aggregate value.
210
+ # @param [Value] index Index of the member to extract.
211
+ # @param [String] name Name of the result in LLVM IR.
212
+ #
213
+ # @return [ExtractValueInst] The extracted value.
214
+ def extract_value(aggregate, index, name = '')
215
+ ExtractValueInst.new(Bindings.build_extract_value(@ptr, aggregate, index, name))
216
+ end
217
+
218
+ # Insert an element into a vector.
219
+ #
220
+ # @param [Value] vector Vector into which to insert the element.
221
+ # @param [Value] element Element to be inserted into the vector.
222
+ # @param [Value] index Index at which to insert the element.
223
+ # @param [String] name Name of the result in LLVM IR.
224
+ #
225
+ # @return [InsertElementInst] A vector the same type as *vector*.
226
+ def insert_element(vector, element, index, name = '')
227
+ InsertElementInst.new(Bindings.build_insert_element(@ptr, vector, element, index, name))
228
+ end
229
+
230
+ # Insert a value into an aggregate value's member field.
231
+ #
232
+ # @param [Value] aggregate An aggregate value.
233
+ # @param [Value] val Value to insert into *aggregate*.
234
+ # @param [Value] index Index at which to insert the value.
235
+ # @param [String] name Name of the result in LLVM IR.
236
+ #
237
+ # @return [InsertValueInst] An aggregate value of the same type as *aggregate*.
238
+ def insert_value(aggregate, val, index, name = '')
239
+ InsertValueInst.new(Bindings.build_insert_value(@ptr, aggregate, val, index, name))
240
+ end
241
+
242
+ # Invoke a function which may potentially unwind.
243
+ #
244
+ # @param [Function] fun Function to invoke.
245
+ # @param [Array<Value>] args Arguments passed to fun.
246
+ # @param [BasicBlock] normal Where to jump if fun does not unwind.
247
+ # @param [BasicBlock] exception Where to jump if fun unwinds.
248
+ # @param [String] name Name of the result in LLVM IR.
249
+ #
250
+ # @return [InvokeInst] The value returned by *fun*, unless an unwind instruction occurs.
251
+ def invoke(fun, args, normal, exception, name = '')
252
+ InvokeInst.new(Bindings.build_invoke(@ptr, fun, args, args.length, normal, exception, name))
253
+ end
254
+
255
+ # Build a Phi node of the given type with the given incoming
256
+ # branches.
257
+ #
258
+ # @param [Type] type Specifies the result type.
259
+ # @param [Hash{BasicBlock => Value}] incoming A hash mapping basic blocks to a
260
+ # corresponding value. If the phi node is jumped to from a given basic block,
261
+ # the phi instruction takes on its corresponding value.
262
+ # @param [String] name Name of the result in LLVM IR.
263
+ #
264
+ # @return [PhiInst] The phi node.
265
+ def phi(type, incoming, name = '')
266
+ PhiInst.new(Bindings.build_phi(@ptr, check_cg_type(type), name)).tap do |phi|
267
+ phi.incoming.add(incoming)
268
+ end
269
+ end
270
+
271
+ # Return a value based on a condition. This differs from *cond* in
272
+ # that its operands are values rather than basic blocks. As a
273
+ # consequence, both arguments must be evaluated.
274
+ #
275
+ # @param [Value] if_val An Int1 or a vector of Int1.
276
+ # @param [Value] then_val Value or vector of the same arity as *if_val*.
277
+ # @param [Value] else_val Value or vector of values of the same arity
278
+ # as *if_val*, and of the same type as *then_val*.
279
+ # @param [String] name Name of the result in LLVM IR.
280
+ #
281
+ # @return [SelectInst] An instruction representing either *then_val* or *else_val*.
282
+ def select(if_val, then_val, else_val, name = '')
283
+ SelectInst.new(Bindings.build_select(@ptr, if_val, then_val, else_val, name))
284
+ end
285
+
286
+ # Shuffle two vectors according to a given mask.
287
+ #
288
+ # @param [Value] vec1 Vector
289
+ # @param [Value] vec2 Vector of the same type and arity as *vec1*.
290
+ # @param [Value] mask Vector of Int1 of the same arity as *vec1* and *vec2*.
291
+ # @param [String] name Name of the result in LLVM IR.
292
+ #
293
+ # @return [ShuffleVectorInst] The shuffled vector.
294
+ def shuffle_vector(vec1, vec2, mask, name = '')
295
+ ShuffleVectorInst.new(Bindings.build_shuffle_vector(@ptr, vec1, vec2, mask, name))
296
+ end
297
+
298
+ # Select a value based on an incoming value.
299
+ # @param [Value] val Value to switch on.
300
+ # @param [BasicBlock] default Default case.
301
+ # @param [Hash{Value => BasicBlock}] cases Hash mapping values
302
+ # to basic blocks. When a value is matched, control will jump to
303
+ # the corresponding basic block.
304
+ #
305
+ # @return [SwitchInst]
306
+ def switch(val, default, cases)
307
+ SwitchInst.new(Bindings.build_switch(@ptr, val, default, cases.size)).tap do |inst|
308
+ cases.each { |val, block| inst.add_case(val, block) }
309
+ end
310
+ end
311
+
312
+ ########
313
+ # Math #
314
+ ########
315
+
316
+ # Addition
317
+
318
+ # @param [Value] lhs Integer or vector of integers.
319
+ # @param [Value] rhs Integer or vector of integers.
320
+ # @param [String] name Name of the result in LLVM IR.
321
+ #
322
+ # @return [AddInst] The integer sum of the two operands.
323
+ def add(lhs, rhs, name = '')
324
+ AddInst.new(Bindings.build_add(@ptr, lhs, rhs, name))
325
+ end
326
+
327
+ # @param [Value] lhs Floating point or vector of floating points.
328
+ # @param [Value] rhs Floating point or vector of floating points.
329
+ # @param [String] name Name of the result in LLVM IR.
330
+ #
331
+ # @return [FAddInst] The floating point sum of the two operands.
332
+ def fadd(lhs, rhs, name = '')
333
+ FAddInst.new(Bindings.build_f_add(@ptr, lhs, rhs, name))
334
+ end
335
+
336
+ # No signed wrap addition.
337
+ #
338
+ # @param [Value] lhs Integer or vector of integers.
339
+ # @param [Value] rhs Integer or vector of integers.
340
+ # @param [String] name Name of the result in LLVM IR.
341
+ #
342
+ # @return [NSWAddInst] The integer sum of the two operands.
343
+ def nsw_add(lhs, rhs, name = '')
344
+ NSWAddInst.new(Bindings.build_nsw_add(@ptr, lhs, rhs, name))
345
+ end
346
+
347
+ # No unsigned wrap addition.
348
+ #
349
+ # @param [Value] lhs Integer or vector of integers.
350
+ # @param [Value] rhs Integer or vector of integers.
351
+ # @param [String] name Name of the result in LLVM IR.
352
+ #
353
+ # @return [NSWAddInst] The integer sum of the two operands.
354
+ def nuw_add(lhs, rhs, name = '')
355
+ NUWAddInst.new(Bindings.build_nuw_add(@ptr, lhs, rhs, name))
356
+ end
357
+
358
+ # Subtraction
359
+
360
+ # @param [Value] lhs Integer or vector of integers.
361
+ # @param [Value] rhs Integer or vector of integers.
362
+ # @param [String] name Name of the result in LLVM IR.
363
+ #
364
+ # @return [SubInst] The integer difference of the two operands.
365
+ def sub(lhs, rhs, name = '')
366
+ SubInst.new(Bindings.build_sub(@ptr, lhs, rhs, name))
367
+ end
368
+
369
+ # @param [Value] lhs Floating point or vector of floating points.
370
+ # @param [Value] rhs Floating point or vector of floating points.
371
+ # @param [String] name Name of the result in LLVM IR.
372
+ #
373
+ # @return [FSubInst] The floating point difference of the two operands.
374
+ def fsub(lhs, rhs, name = '')
375
+ FSubInst.new(Bindings.build_f_sub(@ptr, lhs, rhs, name))
376
+ end
377
+
378
+ # No signed wrap subtraction.
379
+ #
380
+ # @param [Value] lhs Integer or vector of integers.
381
+ # @param [Value] rhs Integer or vector of integers.
382
+ # @param [String] name Name of the result in LLVM IR.
383
+ #
384
+ # @return [SubInst] The integer difference of the two operands.
385
+ def nsw_sub(lhs, rhs, name = '')
386
+ NSWSubInst.new(Bindings.build_nsw_sub(@ptr, lhs, rhs, name))
387
+ end
388
+
389
+ # No unsigned wrap subtraction.
390
+ #
391
+ # @param [Value] lhs Integer or vector of integers.
392
+ # @param [Value] rhs Integer or vector of integers.
393
+ # @param [String] name Name of the result in LLVM IR.
394
+ #
395
+ # @return [SubInst] The integer difference of the two operands.
396
+ def nuw_sub(lhs, rhs, name = '')
397
+ NUWSubInst.new(Bindings.build_nuw_sub(@ptr, lhs, rhs, name))
398
+ end
399
+
400
+ # Multiplication
401
+
402
+ # @param [Value] lhs Integer or vector of integers.
403
+ # @param [Value] rhs Integer or vector of integers.
404
+ # @param [String] name Name of the result in LLVM IR.
405
+ #
406
+ # @return [MulInst] The integer product of the two operands.
407
+ def mul(lhs, rhs, name = '')
408
+ MulInst.new(Bindings.build_mul(@ptr, lhs, rhs, name))
409
+ end
410
+
411
+ # @param [Value] lhs Floating point or vector of floating points.
412
+ # @param [Value] rhs Floating point or vector of floating points.
413
+ # @param [String] name Name of the result in LLVM IR.
414
+ #
415
+ # @return [FMulInst] The floating point product of the two operands.
416
+ def fmul(lhs, rhs, name = '')
417
+ FMulInst.new(Bindings.build_f_mul(@ptr, lhs, rhs, name))
418
+ end
419
+
420
+ # No signed wrap multiplication.
421
+ #
422
+ # @param [Value] lhs Integer or vector of integers.
423
+ # @param [Value] rhs Integer or vector of integers.
424
+ # @param [String] name Name of the result in LLVM IR.
425
+ #
426
+ # @return [MulInst] The integer product of the two operands.
427
+ def nsw_mul(lhs, rhs, name = '')
428
+ NSWMulInst.new(Bindings.build_nsw_mul(@ptr, lhs, rhs, name))
429
+ end
430
+
431
+ # No unsigned wrap multiplication.
432
+ #
433
+ # @param [Value] lhs Integer or vector of integers.
434
+ # @param [Value] rhs Integer or vector of integers.
435
+ # @param [String] name Name of the result in LLVM IR.
436
+ #
437
+ # @return [MulInst] The integer product of the two operands.
438
+ def nuw_mul(lhs, rhs, name = '')
439
+ NUWMulInst.new(Bindings.build_nuw_mul(@ptr, lhs, rhs, name))
440
+ end
441
+
442
+ # Division
443
+
444
+ # @param [Value] lhs Floating point or vector of floating points.
445
+ # @param [Value] rhs Floating point or vector of floating points.
446
+ # @param [String] name Name of the result in LLVM IR.
447
+ #
448
+ # @return [FDivInst] The floating point quotient of the two operands.
449
+ def fdiv(lhs, rhs, name = '')
450
+ FDivInst.new(Bindings.build_f_div(@ptr, lhs, rhs, name))
451
+ end
452
+
453
+ # Signed integer division.
454
+ #
455
+ # @param [Value] lhs Integer or vector of integers.
456
+ # @param [Value] rhs Integer or vector of integers.
457
+ # @param [String] name Name of the result in LLVM IR.
458
+ #
459
+ # @return [SDivInst] The integer quotient of the two operands.
460
+ def sdiv(lhs, rhs, name = '')
461
+ SDivInst.new(Bindings.build_s_div(@ptr, lhs, rhs, name))
462
+ end
463
+
464
+ # Signed exact integer division.
465
+ #
466
+ # @param [Value] lhs Integer or vector of integers.
467
+ # @param [Value] rhs Integer or vector of integers.
468
+ # @param [String] name Name of the result in LLVM IR.
469
+ #
470
+ # @return [SDivInst] The integer quotient of the two operands.
471
+ def exact_sdiv(lhs, rhs, name = '')
472
+ ExactSDivInst.new(Bindings.build_exact_s_div(@ptr, lhs, rhs, name))
473
+ end
474
+
475
+ # Unsigned integer division.
476
+ #
477
+ # @param [Value] lhs Integer or vector of integers.
478
+ # @param [Value] rhs Integer or vector of integers.
479
+ # @param [String] name Name of the result in LLVM IR.
480
+ #
481
+ # @return [SDivInst] The integer quotient of the two operands.
482
+ def udiv(lhs, rhs, name = '')
483
+ UDivInst.new(Bindings.build_u_div(@ptr, lhs, rhs, name))
484
+ end
485
+
486
+ # Remainder
487
+
488
+ # @param [Value] lhs Floating point or vector of floating points.
489
+ # @param [Value] rhs Floating point or vector of floating points.
490
+ # @param [String] name Name of the result in LLVM IR.
491
+ #
492
+ # @return [FRemInst] The floating point remainder.
493
+ def frem(lhs, rhs, name = '')
494
+ FRemInst.new(Bindings.build_f_rem(@ptr, lhs, rhs, name))
495
+ end
496
+
497
+ # Signed remainder.
498
+ #
499
+ # @param [Value] lhs Integer or vector of integers.
500
+ # @param [Value] rhs Integer or vector of integers.
501
+ # @param [String] name Name of the result in LLVM IR.
502
+ #
503
+ # @return [SRemInst] The integer remainder.
504
+ def srem(lhs, rhs, name = '')
505
+ SRemInst.new(Bindings.build_s_rem(@ptr, lhs, rhs, name))
506
+ end
507
+
508
+ # Unsigned remainder.
509
+ #
510
+ # @param [Value] lhs Integer or vector of integers.
511
+ # @param [Value] rhs Integer or vector of integers.
512
+ # @param [String] name Name of the result in LLVM IR.
513
+ #
514
+ # @return [SRemInst] The integer remainder.
515
+ def urem(lhs, rhs, name = '')
516
+ URemInst.new(Bindings.build_u_rem(@ptr, lhs, rhs, name))
517
+ end
518
+
519
+ # Negation
520
+
521
+ # Integer negation. Implemented as a shortcut to the equivalent sub
522
+ # instruction.
523
+ #
524
+ # @param [Value] val Integer or vector of integers.
525
+ # @param [String] name Name of the result in LLVM IR.
526
+ #
527
+ # @return [NegInst] The negated operand.
528
+ def neg(val, name = '')
529
+ NegInst.new(Bindings.build_neg(@ptr, val, name))
530
+ end
531
+
532
+ # Floating point negation. Implemented as a shortcut to the
533
+ # equivalent sub instruction.
534
+ #
535
+ # @param [Value] val Floating point or vector of floating points.
536
+ # @param [String] name Name of the result in LLVM IR.
537
+ #
538
+ # @return [NegInst] The negated operand.
539
+ def fneg(val, name = '')
540
+ FNegInst.new(Bindings.build_f_neg(@ptr, val, name))
541
+ end
542
+
543
+ # No signed wrap integer negation. Implemented as a shortcut to the
544
+ # equivalent sub instruction.
545
+ #
546
+ # @param [Value] val Integer or vector of integers.
547
+ # @param [String] name Name of the result in LLVM IR.
548
+ #
549
+ # @return [NegInst] The negated operand.
550
+ def nsw_neg(val, name = '')
551
+ NSWNegInst.new(Bindings.build_nsw_neg(@ptr, val, name))
552
+ end
553
+
554
+ # No unsigned wrap integer negation. Implemented as a shortcut to the
555
+ # equivalent sub instruction.
556
+ #
557
+ # @param [Value] val Integer or vector of integers.
558
+ # @param [String] name Name of the result in LLVM IR.
559
+ #
560
+ # @return [NegInst] The negated operand.
561
+ def nuw_neg(val, name = '')
562
+ NUWNegInst.new(Bindings.build_nuw_neg(@ptr, val, name))
563
+ end
564
+
565
+ ######################
566
+ # Bitwise Operations #
567
+ ######################
568
+
569
+ # A wrapper method around the {#shift_left} and {#shift_right}
570
+ # methods.
571
+ #
572
+ # @param [:left, :right] dir The direction to shift.
573
+ # @param [Value] lhs Integer or vector of integers.
574
+ # @param [Value] rhs Integer or vector of integers.
575
+ # @param [:arithmetic, :logical] mode Shift mode for right shifts.
576
+ # @param [String] name Name of the result in LLVM IR.
577
+ #
578
+ # @return [LeftShiftInst, ARightShiftInst, LRightShiftInst] An integer instruction.
579
+ def shift(dir, lhs, rhs, mode = :arithmetic, name = '')
580
+ case dir
581
+ when :left then shift_left(lhs, rhs, name)
582
+ when :right then shift_right(lhs, rhs, mode, name)
583
+ end
584
+ end
585
+
586
+ # @param [Value] lhs Integer or vector of integers
587
+ # @param [Value] rhs Integer or vector of integers
588
+ # @param [String] name Name of the result in LLVM IR
589
+ #
590
+ # @return [LeftShiftInst] An integer instruction.
591
+ def shift_left(lhs, rhs, name = '')
592
+ LeftShiftInst.new(Bindings.build_shl(@ptr, lhs, rhs, name))
593
+ end
594
+ alias :shl :shift_left
595
+
596
+ # A wrapper function around {#ashr} and {#lshr}.
597
+ #
598
+ # @param [Value] lhs Integer or vector of integers
599
+ # @param [Value] rhs Integer or vector of integers
600
+ # @param [:arithmetic, :logical] mode The filling mode.
601
+ # @param [String] name Name of the result in LLVM IR
602
+ #
603
+ # @return [LeftShiftInst] An integer instruction.
604
+ def shift_right(lhs, rhs, mode = :arithmetic, name = '')
605
+ case mode
606
+ when :arithmetic then ashr(lhs, rhs, name)
607
+ when :logical then lshr(lhs, rhs, name)
608
+ end
609
+ end
610
+
611
+ # Arithmetic (sign extended) shift right.
612
+ #
613
+ # @param [Value] lhs Integer or vector of integers.
614
+ # @param [Value] rhs Integer or vector of integers.
615
+ # @param [String] name Name of the result in LLVM IR.
616
+ #
617
+ # @return [ARightShiftInst] An integer instruction.
618
+ def ashr(lhs, rhs, name = '')
619
+ ARightShiftInst.new(Bindings.build_a_shr(@ptr, lhs, rhs, name))
620
+ end
621
+
622
+ # Logical (zero fill) shift right.
623
+ #
624
+ # @param [Value] lhs Integer or vector of integers.
625
+ # @param [Value] rhs Integer or vector of integers.
626
+ # @param [String] name Name of the result in LLVM IR.
627
+ #
628
+ # @return [ARightShiftInst] An integer instruction.
629
+ def lshr(lhs, rhs, name = '')
630
+ LRightShiftInst.new(Bindings.build_l_shr(@ptr, lhs, rhs, name))
631
+ end
632
+
633
+ # @param [Value] lhs Integer or vector of integers.
634
+ # @param [Value] rhs Integer or vector of integers.
635
+ # @param [String] name Name of the result in LLVM IR.
636
+ #
637
+ # @return [AndInst] An integer instruction.
638
+ def and(lhs, rhs, name = '')
639
+ AndInst.new(Bindings.build_and(@ptr, lhs, rhs, name))
640
+ end
641
+
642
+ # @param [Value] lhs Integer or vector of integers.
643
+ # @param [Value] rhs Integer or vector of integers.
644
+ # @param [String] name Name of the result in LLVM IR.
645
+ #
646
+ # @return [OrInst] An integer instruction.
647
+ def or(lhs, rhs, name = '')
648
+ OrInst.new(Bindings.build_or(@ptr, lhs, rhs, name))
649
+ end
650
+
651
+ # @param [Value] lhs Integer or vector of integers.
652
+ # @param [Value] rhs Integer or vector of integers.
653
+ # @param [String] name Name of the result in LLVM IR.
654
+ #
655
+ # @return [XOrInst] An integer instruction.
656
+ def xor(lhs, rhs, name = '')
657
+ XOrInst.new(Bindings.build_xor(@ptr, lhs, rhs, name))
658
+ end
659
+
660
+ # Boolean negation.
661
+ #
662
+ # @param [Value] val Integer or vector of integers.
663
+ # @param [String] name Name of the result in LLVM IR.
664
+ #
665
+ # @return [NotInst] An integer instruction.
666
+ def not(val, name = '')
667
+ NotInst.new(Bindings.build_not(@ptr, val, name))
668
+ end
669
+
670
+ #####################
671
+ # Memory Management #
672
+ #####################
673
+
674
+ # Heap allocation.
675
+ #
676
+ # @param [Type] type Type or value whose type should be malloced.
677
+ # @param [String] name Name of the result in LLVM IR.
678
+ #
679
+ # @return [MallocInst] A pointer to the malloced bytes.
680
+ def malloc(type, name = '')
681
+ MallocInst.new(Bindings.build_malloc(@ptr, check_type(type), name))
682
+ end
683
+
684
+ # Heap array allocation.
685
+ #
686
+ # @param [Type] type Type or value whose type will be the element type of the malloced array.
687
+ # @param [Value] size Unsigned integer representing size of the array.
688
+ # @param [String] name Name of the result in LLVM IR.
689
+ #
690
+ # @return [ArrayMallocInst] A pointer to the malloced array
691
+ def array_malloc(type, size, name = '')
692
+ ArrayMallocInst.new(Bindings.build_array_malloc(@ptr, check_cg_type(type), size, name))
693
+ end
694
+
695
+ # Stack allocation.
696
+ #
697
+ # @param [Type] type Type or value whose type should be allocad.
698
+ # @param [String] name Name of the result in LLVM IR.
699
+ #
700
+ # @return [AllocaInst] A pointer to the allocad bytes.
701
+ def alloca(type, name = '')
702
+ AllocaInst.new(Bindings.build_alloca(@ptr, check_cg_type(type), name))
703
+ end
704
+
705
+ # Stack array allocation.
706
+ #
707
+ # @param [Type] type Type or value whose type should be allocad.
708
+ # @param [Value] size Unsigned integer representing size of the array.
709
+ # @param [String] name Name of the result in LLVM IR.
710
+ #
711
+ # @return [ArrayAllocaInst] A pointer to the allocad bytes.
712
+ def array_alloca(type, size, name = '')
713
+ ArrayAllocaInst.new(Bindings.build_array_alloca(@ptr, check_cg_type(type), size, name))
714
+ end
715
+
716
+ # @param [LLVM::Value] ptr The pointer to be freed.
717
+ #
718
+ # @return [FreeInst] The result of the free instruction.
719
+ def free(ptr)
720
+ FreeInst.new(Bindings.build_free(@ptr, ptr))
721
+ end
722
+
723
+ # Load the value of a given pointer.
724
+ #
725
+ # @param [Value] ptr Pointer to be loaded.
726
+ # @param [String] name Name of the result in LLVM IR.
727
+ #
728
+ # @return [LoadInst] The result of the load operation. Represents a value of the pointer's type.
729
+ def load(ptr, name = '')
730
+ LoadInst.new(Bindings.build_load(@ptr, ptr, name))
731
+ end
732
+
733
+ # Store a value at a given pointer.
734
+ #
735
+ # @param [Value] val The value to be stored.
736
+ # @param [Value] ptr Pointer to the same type as val.
737
+ #
738
+ # @return [StoreInst] The result of the store operation.
739
+ def store(val, ptr)
740
+ StoreInst.new(Bindings.build_store(@ptr, val, ptr))
741
+ end
742
+
743
+ # Obtain a pointer to the element at the given indices.
744
+ #
745
+ # @param [Value] ptr Pointer to an aggregate value
746
+ # @param [Array<Value>] indices Ruby array of Value representing
747
+ # indices into the aggregate.
748
+ # @param [String] name The name of the result in LLVM IR.
749
+ #
750
+ # @return [GetElementPtrInst] The resulting pointer.
751
+ def get_element_ptr(ptr, indices, name = '')
752
+ check_array_type(indices, Value, 'indices')
753
+
754
+ indices_ptr = FFI::MemoryPointer.new(:pointer, indices.length)
755
+ indices_ptr.write_array_of_pointer(indices)
756
+
757
+ GetElementPtrInst.new(Bindings.build_gep(@ptr, ptr, indices_ptr, indices.length, name))
758
+ end
759
+ alias :gep :get_element_ptr
760
+
761
+ # Builds a in-bounds getelementptr instruction. If the indices are
762
+ # outside the allocated pointer the value is undefined.
763
+ #
764
+ # @param [Value] ptr Pointer to an aggregate value
765
+ # @param [Array<Value>] indices Ruby array of Value representing
766
+ # indices into the aggregate.
767
+ # @param [String] name The name of the result in LLVM IR.
768
+ #
769
+ # @return [InBoundsGEPInst] The resulting pointer.
770
+ def get_element_ptr_in_bounds(ptr, indices, name = '')
771
+ check_array_type(indices, Value, 'indices')
772
+
773
+ indices_ptr = FFI::MemoryPointer.new(:pointer, indices.length)
774
+ indices_ptr.write_array_of_pointer(indices)
775
+
776
+ InBoundsGEPInst.new(Bindings.build_in_bounds_gep(@ptr, ptr, indices_ptr, indices.length, name))
777
+ end
778
+ alias :inbounds_gep :get_element_ptr_in_bounds
779
+
780
+ # Builds a struct getelementptr instruction.
781
+ #
782
+ # @param [Value] ptr Pointer to a structure.
783
+ # @param [Value] index Unsigned integer representing the index of a structure member.
784
+ # @param [String] name Name of the result in LLVM IR.
785
+ #
786
+ # @return [StructGEPInst] The resulting pointer.
787
+ def struct_get_element_ptr(ptr, index, name = '')
788
+ StructGEPInst.new(Bindings.build_struct_gep(@ptr, ptr, index, name))
789
+ end
790
+ alias :struct_getp :struct_get_element_ptr
791
+
792
+ # Creates a global string initialized to a given value.
793
+ #
794
+ # @param [String] string String used by the initialize.
795
+ # @param [String] name Name of the result in LLVM IR.
796
+ #
797
+ # @return [GlobalStringInst] Reference to the global string.
798
+ def global_string(string, name = '')
799
+ GlobalStringInst.new(Bindings.build_global_string(@ptr, string, name))
800
+ end
801
+
802
+ # Creates a pointer to a global string initialized to a given value.
803
+ #
804
+ # @param [String] string String used by the initializer
805
+ # @param [String] name Name of the result in LLVM IR
806
+ #
807
+ # @return [GlobalStringPtrInst] Reference to the global string pointer.
808
+ def gloabl_string_pointer(string, name = '')
809
+ GlobalStringPtrInst.new(Bindings.build_global_string_ptr(@ptr, string, name))
810
+ end
811
+
812
+ #######################
813
+ # Atomic Instructions #
814
+ #######################
815
+
816
+ # Create an atomic read/modify/write instruction.
817
+ #
818
+ # @see http://llvm.org/docs/LangRef.html#atomic-memory-ordering-constraints
819
+ #
820
+ # @param [Symbol from _enum_atomic_rmw_bin_op_] op Operation to perform
821
+ # @param [OpaqueValue] addr Address to modify
822
+ # @param [OpaqueValue] val Value to test
823
+ # @param [Symbol from _enum_atomic_ordering_] ordering Memory ordering constraints
824
+ # @param [Boolean] single_thread Synchronize with single thread or all threads
825
+ #
826
+ # @return [AtomicRMWInst]
827
+ def atomic_rmw(op, addr, val, ordering, single_thread)
828
+ AtomicRMWInst.new(Bindings.build_atomic_rmw(@ptr, op, addr, val, ordering, single_thread.to_i))
829
+ end
830
+
831
+ ###############################
832
+ # Type and Value Manipulation #
833
+ ###############################
834
+
835
+ # Cast a value to a given address space.
836
+ #
837
+ # @param [Value] val Value to cast
838
+ # @param [Type] type Target type
839
+ # @param [String] name Name of the result in LLVM IR
840
+ #
841
+ # @return [AddrSpaceCastInst]
842
+ def addr_space_cast(val, type, name = '')
843
+ AddrSpaceCast.new(Bindings.addr_space_cast(@ptr, val, check_cg_type(type), name))
844
+ end
845
+
846
+ # Cast a value to the given type without changing any bits.
847
+ #
848
+ # @param [Value] val Value to cast
849
+ # @param [Type] type Target type
850
+ # @param [String] name Name of the result in LLVM IR
851
+ #
852
+ # @return [BitCastInst] A value of the target type.
853
+ def bitcast(val, type, name = '')
854
+ BitCastInst.new(Bindings.build_bit_cast(@ptr, val, check_cg_type(type), name))
855
+ end
856
+
857
+ # @param [Value] val Value to cast.
858
+ # @param [Type] type Target type.
859
+ # @param [String] name Name of the result in LLVM IR.
860
+ #
861
+ # @return [FPCastInst] A value of the target type.
862
+ def floating_point_cast(val, type, name = '')
863
+ FPCastInst.new(Bindings.build_fp_cast(@ptr, val, check_cg_type(type), name))
864
+ end
865
+ alias :fp_cast :floating_point_cast
866
+
867
+ # Extend a floating point value.
868
+ #
869
+ # @param [Value] val Floating point or vector of floating point.
870
+ # @param [Type] type Floating point or vector of floating point type of greater size than val's type.
871
+ # @param [String] name Name of the result in LLVM IR.
872
+ #
873
+ # @return [FPExtendInst] The extended value.
874
+ def floating_point_extend(val, type, name = '')
875
+ FPExtendInst.new(Bindings.build_fp_ext(@ptr, val, check_cg_type(type), name))
876
+ end
877
+ alias :fp_ext :floating_point_extend
878
+ alias :fp_extend :floating_point_extend
879
+
880
+ # Convert a floating point to a signed integer.
881
+ #
882
+ # @param [Value] val Floating point or vector of floating points to convert.
883
+ # @param [Type] type Integer or vector of integer target type.
884
+ # @param [String] name Name of the result in LLVM IR.
885
+ #
886
+ # @return [FPToSIInst] The converted value.
887
+ def floating_point_to_signed_int(val, type, name = '')
888
+ FPToSIInst.new(Bindings.build_fp_to_si(@ptr, val, check_cg_type(type), name))
889
+ end
890
+ alias :fp2si :floating_point_to_signed_int
891
+
892
+ # Convert a floating point to an unsigned integer.
893
+ #
894
+ # @param [Value] val Floating point or vector of floating points to convert.
895
+ # @param [Type] type Integer or vector of integer target type.
896
+ # @param [String] name Name of the result in LLVM IR.
897
+ #
898
+ # @return [FPToSIInst] The converted value.
899
+ def floating_point_to_unsigned_int(val, type, name = '')
900
+ FPToUIInst.new(Bindings.build_fp_to_ui(@ptr, val, check_cg_type(type), name))
901
+ end
902
+ alias :fp2ui :floating_point_to_unsigned_int
903
+
904
+ # Truncate a floating point value.
905
+ #
906
+ # @param [Value] val Floating point or vector of floating point.
907
+ # @param [Type] type Floating point or vector of floating point type of lesser size than val's type.
908
+ # @param [String] name Name of the result in LLVM IR.
909
+ #
910
+ # @return [LLVM::Instruction] The truncated value
911
+ def floating_point_truncate(val, type, name = '')
912
+ FPTruncInst.new(Bindings.build_fp_trunc(@ptr, val, check_cg_type(type), name))
913
+ end
914
+ alias :fp_trunc :floating_point_truncate
915
+ alias :fp_truncate :floating_point_truncate
916
+
917
+ # Cast an int to a pointer.
918
+ #
919
+ # @param [Value] val An integer value.
920
+ # @param [Type] type A pointer type.
921
+ # @param [String] name Name of the result in LLVM IR.
922
+ #
923
+ # @return [IntToPtrInst] A pointer of the given type and the address held in val.
924
+ def int_to_ptr(val, type, name = '')
925
+ IntToPtrInst.new(Bindings.build_int_to_ptr(@ptr, val, check_cg_type(type), name))
926
+ end
927
+ alias :int2ptr :int_to_ptr
928
+
929
+ # @param [Value] val An integer value.
930
+ # @param [Type] type Integer or vector of integer target type.
931
+ # @param [String] name Name of the result in LLVM IR.
932
+ #
933
+ # @return [IntCastInst]
934
+ def integer_cast(val, type, name = '')
935
+ IntCastInst.new(Bindings.build_int_cast(@ptr, val, check_cg_type(type), name))
936
+ end
937
+ alias :int_cast :integer_cast
938
+
939
+ # @param [Value] val A pointer value.
940
+ # @param [Type] type A pointer target type.
941
+ # @param [String] name Name of the result in LLVM IR.
942
+ #
943
+ # @return [PtrCastInst]
944
+ def ptr_cast(val, type, name = '')
945
+ PtrCastInst.new(Bindings.build_pointer_cast(@ptr, val, check_cg_type(type), name))
946
+ end
947
+
948
+ # Cast a pointer to an int. Useful for pointer arithmetic.
949
+ #
950
+ # @param [Value] val A pointer value.
951
+ # @param [Type] type An integer type.
952
+ # @param [String] name Name of the result in LLVM IR.
953
+ #
954
+ # @return [PtrToIntInst] An integer of the given type representing the pointer's address.
955
+ def ptr_to_int(val, type, name = '')
956
+ PtrToIntInst.new(Bindings.build_ptr_to_int(@ptr, val, check_cg_type(type), name))
957
+ end
958
+ alias :ptr2int :ptr_to_int
959
+
960
+ # Sign extension by copying the sign bit (highest order bit) of the
961
+ # value until it reaches the bit size of the given type.
962
+ #
963
+ # @param [Value] val Integer or vector of integers to be extended.
964
+ # @param [Type] type Integer or vector of integer type of greater size than the size of val.
965
+ # @param [String] name Name of the result in LLVM IR.
966
+ #
967
+ # @return [SignExtendInst] The extended value.
968
+ def sign_extend(val, type, name = '')
969
+ SignExtendInst.new(Bindings.build_s_ext(@ptr, val, check_cg_type(type), name))
970
+ end
971
+ alias :sext :sign_extend
972
+
973
+ # Sign extension or bitcast.
974
+ #
975
+ # @param [Value] val Integer or vector of integers to be extended.
976
+ # @param [Type] type Integer or vector of integer type of greater size than the size of val.
977
+ # @param [String] name Name of the result in LLVM IR.
978
+ #
979
+ # @return [SignExtendOrBitcastInst] The extended or cast value.
980
+ def sign_extend_or_bitcast(val, type, name = '')
981
+ SignExtendOrBitCastInst.new(Bindings.build_s_ext_or_bit_cast(@ptr, val, check_cg_type(type), name))
982
+ end
983
+ alias :sext_or_bitcast :sign_extend_or_bitcast
984
+
985
+ # Convert a signed integer to a floating point.
986
+ #
987
+ # @param [Value] val Signed integer or vector of signed integer to convert.
988
+ # @param [Type] type Floating point or vector of floating point target type.
989
+ # @param [String] name Name of the result in LLVM IR.
990
+ #
991
+ # @return [SIToFPInst] The converted value.
992
+ def signed_int_to_floating_point(val, type, name = '')
993
+ SIToFPInst.new(Bindings.build_si_to_fp(@ptr, val, check_cg_type(type), name))
994
+ end
995
+ alias :si2fp :signed_int_to_floating_point
996
+
997
+ # Truncates its operand to the given type. The size of the value type
998
+ # must be greater than the size of the target type.
999
+ #
1000
+ # @param [Value] val Integer or vector of integers to be truncated.
1001
+ # @param [Type] type Integer or vector of integers of equal size to val.
1002
+ # @param [String] name Name of the result in LLVM IR.
1003
+ #
1004
+ # @return [TruncateInst] The truncated value.
1005
+ def truncate(val, type, name = '')
1006
+ TruncateInst.new(Bindings.build_trunc(@ptr, val, check_cg_type(type), name))
1007
+ end
1008
+ alias :trunc :truncate
1009
+
1010
+ # Truncates or bitcast.
1011
+ #
1012
+ # @param [Value] val Integer or vector of integers to be truncated.
1013
+ # @param [Type] type Integer or vector of integers of equal size to val.
1014
+ # @param [String] name Name of the result in LLVM IR.
1015
+ #
1016
+ # @return [TruncateInst] The truncated or cast value.
1017
+ def truncate_or_bitcast(val, type, name = '')
1018
+ TruncateOrBitCastInst.new(Bindings.build_trunc_or_bit_cast(@ptr, val, check_cg_type(type), name))
1019
+ end
1020
+
1021
+ # Convert an unsigned integer to a floating point.
1022
+ #
1023
+ # @param [Value] val Signed integer or vector of signed integer to convert.
1024
+ # @param [Type] type Floating point or vector of floating point target type.
1025
+ # @param [String] name Name of the result in LLVM IR.
1026
+ #
1027
+ # @return [SIToFPInst] The converted value.
1028
+ def unsigned_int_to_floating_point(val, type, name = '')
1029
+ UIToFPInst.new(Bindings.build_ui_to_fp(@ptr, val, check_cg_type(type), name))
1030
+ end
1031
+ alias :ui2fp :unsigned_int_to_floating_point
1032
+
1033
+ # Zero extends its operand to the given type. The size of the value
1034
+ # type must be greater than the size of the target type.
1035
+ #
1036
+ # @param [Value] val Integer or vector of integers to be extended.
1037
+ # @param [Type] type Integer or vector of integer type of greater size than val.
1038
+ # @param [String] name Name of the result in LLVM IR.
1039
+ #
1040
+ # @return [ZeroExtendInst] The extended value.
1041
+ def zero_extend(val, type, name = '')
1042
+ ZeroExtendInst.new(Bindings.build_z_ext(@ptr, val, check_cg_type(type), name))
1043
+ end
1044
+ alias :zext :zero_extend
1045
+
1046
+ # Zero extend or bitcast.
1047
+ #
1048
+ # @param [Value] val Integer or vector of integers to be extended.
1049
+ # @param [Type] type Integer or vector of integer type of greater size than val.
1050
+ # @param [String] name Name of the result in LLVM IR.
1051
+ #
1052
+ # @return [ZeroExtendInst] The extended or cast value.
1053
+ def zero_extend_or_bitcast(val, type, name = '')
1054
+ ZeroExtendOrBitCastInst.new(Bindings.build_z_ext_or_bit_cast(@ptr, val, check_cg_type(type), name))
1055
+ end
1056
+ alias :zext_or_bitcast :zero_extend_or_bitcast
1057
+
1058
+ ###########################
1059
+ # Comparison Instructions #
1060
+ ###########################
1061
+
1062
+ # Builds an icmp instruction. Compares lhs to rhs using the given
1063
+ # symbol predicate.
1064
+ #
1065
+ # @see Bindings._enum_int_predicate_
1066
+ # @LLVMInst icmp
1067
+ #
1068
+ # @param [Symbol] pred An integer predicate.
1069
+ # @param [Value] lhs Left hand side of the comparison, of integer or pointer type.
1070
+ # @param [Value] rhs Right hand side of the comparison, of the same type as lhs.
1071
+ # @param [String] name Name of the result in LLVM IR.
1072
+ #
1073
+ # @return [IntCmpInst] A Boolean represented as Int1.
1074
+ def int_comparison(pred, lhs, rhs, name = '')
1075
+ IntCmpInst.new(Bindings.build_i_cmp(@ptr, pred, lhs, rhs, name))
1076
+ end
1077
+ alias :icmp :int_comparison
1078
+
1079
+ # Builds an fcmp instruction. Compares lhs to rhs as reals using the
1080
+ # given symbol predicate.
1081
+ #
1082
+ # @see Bindings._enum_real_predicate_
1083
+ # @LLVMInst fcmp
1084
+ #
1085
+ # @param [Symbol] pred A real predicate.
1086
+ # @param [Value] lhs Left hand side of the comparison, of floating point type.
1087
+ # @param [Value] rhs Right hand side of the comparison, of the same type as lhs.
1088
+ # @param [String] name Name of the result in LLVM IR.
1089
+ #
1090
+ # @return [FCmpInst] A Boolean represented as an Int1.
1091
+ def fp_comparison(pred, lhs, rhs, name = '')
1092
+ FCmpInst.new(Bindings.build_f_cmp(@ptr, pred, lhs, rhs, name))
1093
+ end
1094
+ alias :fcmp :fp_comparison
1095
+
1096
+ # Calculate the difference between two pointers.
1097
+ #
1098
+ # @param [Value] lhs A pointer.
1099
+ # @param [Value] rhs A pointer.
1100
+ # @param [String] name Name of the result in LLVM IR.
1101
+ #
1102
+ # @return [PtrDiffInst] The integer difference between the two pointers.
1103
+ def ptr_diff(lhs, rhs, name = '')
1104
+ PtrDiffInst.new(Bindings.build_ptr_diff(lhs, rhs, name))
1105
+ end
1106
+
1107
+ # Check if a value is not null.
1108
+ #
1109
+ # @param [Value] val Value to check.
1110
+ # @param [String] name Name of the result in LLVM IR.
1111
+ #
1112
+ # @return [LLVM::Instruction] A Boolean represented as an Int1.
1113
+ def is_not_null(val, name = '')
1114
+ IsNotNullInst.new(Builder.build_is_not_null(@ptr, val, name))
1115
+ end
1116
+
1117
+ # Check if a value is null.
1118
+ #
1119
+ # @param [Value] val Value to check.
1120
+ # @param [String] name Name of the result in LLVM IR.
1121
+ #
1122
+ # @return [LLVM::Instruction] A Boolean represented as an Int1.
1123
+ def is_null(val, name = '')
1124
+ IsNullInst.new(Bindings.build_is_null(@ptr, val, name))
1125
+ end
1126
+ end
1127
+ end