Class: LLVM::Builder
- Inherits:
-
Object
- Object
- LLVM::Builder
- Defined in:
- lib/llvm/core/builder.rb
Instance Method Summary collapse
-
#add(lhs, rhs, name = "") ⇒ LLVM::Instruction
Integer addition.
-
#aggregate_ret(*vals) ⇒ LLVM::Instruction
Builds a ret instruction returning multiple values.
-
#alloca(ty, name = "") ⇒ LLVM::Instruction
Stack allocation.
-
#and(lhs, rhs, name = "") ⇒ LLVM::Instruction
An integer instruction.
-
#array_alloca(ty, sz, name = "") ⇒ LLVM::Instruction
Array stack allocation.
-
#array_malloc(ty, sz, name = "") ⇒ LLVM::Instruction
A pointer to the malloced array.
-
#ashr(lhs, rhs, name = "") ⇒ LLVM::Instruction
Arithmatic shift right.
-
#bit_cast(val, ty, name = "") ⇒ LLVM::Instruction
Cast a value to the given type without changing any bits.
-
#br(block) ⇒ LLVM::Instruction
Unconditional branching (i.e. goto).
-
#call(fun, *args) ⇒ Object
Builds a call Instruction.
- #call2(type, fun, *args) ⇒ Object
-
#cond(cond, iftrue, iffalse) ⇒ LLVM::Instruction
Conditional branching (i.e. if).
- #dispose ⇒ Object
-
#exact_sdiv(lhs, rhs, name = "") ⇒ LLVM::Instruction
Signed exact division.
-
#extract_element(vector, idx, name = "") ⇒ LLVM::Instruction
Extract an element from a vector.
-
#extract_value(aggregate, idx, name = "") ⇒ LLVM::Instruction
Extract the value of a member field from an aggregate value.
-
#fadd(lhs, rhs, name = "") ⇒ LLVM::Instruction
The floating point sum of the two operands.
-
#fcmp(pred, lhs, rhs, name = "") ⇒ LLVM::Instruction
Builds an fcmp Instruction.
-
#fdiv(lhs, rhs, name = "") ⇒ LLVM::Instruction
The floating point quotient of the two operands.
-
#fmul(lhs, rhs, name = "") ⇒ LLVM::Instruction
Floating point multiplication.
-
#fp2si(val, ty, name = "") ⇒ LLVM::Instruction
Convert a floating point to a signed integer.
-
#fp2ui(val, ty, name = "") ⇒ LLVM::Instruction
Convert a floating point to an unsigned integer.
- #fp_cast(val, ty, name = "") ⇒ LLVM::Instruction
-
#fp_ext(val, ty, name = "") ⇒ LLVM::Instruction
Extend a floating point value.
-
#fp_trunc(val, ty, name = "") ⇒ LLVM::Instruction
Truncate a floating point value.
-
#free(ptr) ⇒ LLVM::Instruction
The result of the free instruction.
-
#frem(lhs, rhs, name = "") ⇒ LLVM::Instruction
The floating point remainder.
-
#fsub(lhs, rhs, name = "") ⇒ LLVM::Instruction
The floating point difference of the two operands.
-
#gep(ptr, indices, name = "") ⇒ LLVM::Instruction
Obtain a pointer to the element at the given indices.
-
#gep2(type, ptr, indices, name) ⇒ LLVM::Instruction
Obtain a pointer to the element at the given indices.
-
#global_string(string, name = "") ⇒ LLVM::Instruction
Creates a global string initialized to a given value.
-
#global_string_pointer(string, name = "") ⇒ LLVM::Instruction
Creates a pointer to a global string initialized to a given value.
-
#ibr(addr, num_dests) ⇒ LLVM::Instruction
Indirect branching (i.e. computed goto).
-
#icmp(pred, lhs, rhs, name = "") ⇒ LLVM::Instruction
Builds an icmp Instruction.
-
#inbounds_gep(ptr, indices, name = "") ⇒ LLVM::Instruction
Builds a inbounds getelementptr instruction.
- #inbounds_gep2(type, ptr, indices, name = "") ⇒ Object
-
#initialize ⇒ Builder
constructor
Important: Call #dispose to free backend memory after use.
-
#insert_block ⇒ LLVM::BasicBlock
The BasicBlock at which the Builder is currently positioned.
-
#insert_element(vector, elem, idx, name = "") ⇒ LLVM::Instruction
Insert an element into a vector.
-
#insert_value(aggregate, elem, idx, name = "") ⇒ LLVM::Instruction
Insert a value into an aggregate value’s member field.
-
#int2ptr(val, ty, name = "") ⇒ LLVM::Instruction
Cast an int to a pointer.
- #int_cast(val, ty, name = "") ⇒ LLVM::Instruction
-
#invoke(fun, args, normal, exception, name = "") ⇒ LLVM::Instruction
Invoke a function which may potentially unwind.
- #invoke2(type, fun, args, normal, exception, name = "") ⇒ Object
-
#is_not_null(val, name = "") ⇒ LLVM::Instruction
Check if a value is not null.
-
#is_null(val, name = "") ⇒ LLVM::Instruction
Check if a value is null.
-
#load(ptr, name = "") ⇒ LLVM::Instruction
Load the value of a given pointer.
- #load2(type, ptr, name = "") ⇒ Object
-
#lshr(lhs, rhs, name = "") ⇒ LLVM::Instruction
Shifts right with zero fill.
-
#malloc(ty, name = "") ⇒ LLVM::Instruction
A pointer to the malloced bytes.
-
#mul(lhs, rhs, name = "") ⇒ LLVM::Instruction
Integer multiplication.
-
#neg(arg, name = "") ⇒ LLVM::Instruction
Integer negation.
-
#not(arg, name = "") ⇒ LLVM::Instruction
Boolean negation.
-
#nsw_add(lhs, rhs, name = "") ⇒ LLVM::Instruction
“No signed wrap” integer addition.
-
#nsw_mul(lhs, rhs, name = "") ⇒ LLVM::Instruction
“No signed wrap” integer multiplication.
-
#nsw_neg(arg, name = "") ⇒ LLVM::Instruction
“No signed wrap” integer negation.
-
#nsw_sub(lhs, rhs, name = "") ⇒ LLVM::Instruction
No signed wrap integer subtraction.
-
#nuw_add(lhs, rhs, name = "") ⇒ LLVM::Instruction
“No unsigned wrap” integer addition.
-
#nuw_mul(lhs, rhs, name = "") ⇒ LLVM::Instruction
“No unsigned wrap” integer multiplication.
-
#nuw_neg(arg, name = "") ⇒ LLVM::Instruction
“No unsigned wrap” integer negation.
-
#nuw_sub(lhs, rhs, name = "") ⇒ LLVM::Instruction
No unsigned wrap integer subtraction.
-
#or(lhs, rhs, name = "") ⇒ LLVM::Instruction
An integer instruction.
-
#phi(ty, incoming, name = "") ⇒ LLVM::Instruction
Build a Phi node of the given type with the given incoming branches.
- #pointer_cast(val, ty, name = "") ⇒ LLVM::Instruction
-
#position(block, instruction) ⇒ LLVM::Builder
Position the builder at the given Instruction within the given BasicBlock.
-
#position_at_end(block) ⇒ LLVM::Builder
Positions the builder at the end of the given BasicBlock.
-
#position_before(instruction) ⇒ LLVM::Builder
Positions the builder before the given Instruction.
-
#ptr2int(val, ty, name = "") ⇒ LLVM::Instruction
Cast a pointer to an int.
-
#ptr_diff(lhs, rhs, name = "") ⇒ LLVM::Instruction
Calculate the difference between two pointers.
- #ret(val = nil) ⇒ LLVM::Instruction
- #ret_void ⇒ LLVM::Instruction
-
#sdiv(lhs, rhs, name = "") ⇒ LLVM::Instruction
Signed division.
-
#select(_if, _then, _else, name = "") ⇒ LLVM::Instruction
Return a value based on a condition.
-
#sext(val, ty, name = "") ⇒ LLVM::Instruction
Sign extension by copying the sign bit (highest order bit) of the value until it reaches the bit size of the given type.
- #sext_or_bit_cast(val, ty, name = "") ⇒ LLVM::Instruction
-
#shl(lhs, rhs, name = "") ⇒ LLVM::Instruction
An integer instruction.
-
#shuffle_vector(vec1, vec2, mask, name = "") ⇒ LLVM::Instruction
Shuffle two vectors according to a given mask.
-
#si2fp(val, ty, name = "") ⇒ LLVM::Instruction
Convert a signed integer to a floating point.
-
#srem(lhs, rhs, name = "") ⇒ LLVM::Instruction
Signed remainder.
-
#store(val, ptr) ⇒ LLVM::Instruction
Store a value at a given pointer.
-
#struct_gep(ptr, idx, name = "") ⇒ LLVM::Instruction
Builds a struct getelementptr Instruction.
- #struct_gep2(type, ptr, idx, name) ⇒ Object
-
#sub(lhs, rhs, name = "") ⇒ LLVM::Instruction
Integer subtraction.
- #switch(val, default, cases) ⇒ LLVM::Instruction
- #to_ptr ⇒ Object
-
#trunc(val, ty, name = "") ⇒ LLVM::Instruction
Truncates its operand to the given type.
- #trunc_or_bit_cast(val, ty, name = "") ⇒ LLVM::Instruction
-
#udiv(lhs, rhs, name = "") ⇒ LLVM::Instruction
Unsigned integer division.
-
#ui2fp(val, ty, name = "") ⇒ LLVM::Instruction
Convert an unsigned integer to a floating point.
-
#unreachable ⇒ LLVM::Instruction
Generates an instruction with no defined semantics.
-
#unwind ⇒ Object
Builds an unwind Instruction.
-
#urem(lhs, rhs, name = "") ⇒ LLVM::Instruction
Unsigned remainder.
-
#xor(lhs, rhs, name = "") ⇒ LLVM::Instruction
An integer instruction.
-
#zext(val, ty, name = "") ⇒ LLVM::Instruction
Zero extends its operand to the given type.
- #zext_or_bit_cast(val, ty, name = "") ⇒ LLVM::Instruction
Constructor Details
#initialize ⇒ Builder
Important: Call #dispose to free backend memory after use.
6 7 8 |
# File 'lib/llvm/core/builder.rb', line 6 def initialize @ptr = C.create_builder() end |
Instance Method Details
#add(lhs, rhs, name = "") ⇒ LLVM::Instruction
Integer addition.
209 210 211 |
# File 'lib/llvm/core/builder.rb', line 209 def add(lhs, rhs, name = "") Instruction.from_ptr(C.build_add(self, lhs, rhs, name)) end |
#aggregate_ret(*vals) ⇒ LLVM::Instruction
Builds a ret instruction returning multiple values.
85 86 87 88 89 90 |
# File 'lib/llvm/core/builder.rb', line 85 def aggregate_ret(*vals) FFI::MemoryPointer.new(FFI.type_size(:pointer) * vals.size) do |vals_ptr| vals_ptr.write_array_of_pointer(vals) Instruction.from_ptr(C.build_aggregate_ret(self, vals_ptr, vals.size)) end end |
#alloca(ty, name = "") ⇒ LLVM::Instruction
Stack allocation.
507 508 509 |
# File 'lib/llvm/core/builder.rb', line 507 def alloca(ty, name = "") Instruction.from_ptr(C.build_alloca(self, LLVM::Type(ty), name)) end |
#and(lhs, rhs, name = "") ⇒ LLVM::Instruction
Returns An integer instruction.
426 427 428 |
# File 'lib/llvm/core/builder.rb', line 426 def and(lhs, rhs, name = "") Instruction.from_ptr(C.build_and(self, lhs, rhs, name)) end |
#array_alloca(ty, sz, name = "") ⇒ LLVM::Instruction
Array stack allocation
518 519 520 |
# File 'lib/llvm/core/builder.rb', line 518 def array_alloca(ty, sz, name = "") Instruction.from_ptr(C.build_array_alloca(self, LLVM::Type(ty), sz, name)) end |
#array_malloc(ty, sz, name = "") ⇒ LLVM::Instruction
Returns A pointer to the malloced array.
497 498 499 |
# File 'lib/llvm/core/builder.rb', line 497 def array_malloc(ty, sz, name = "") Instruction.from_ptr(C.build_array_malloc(self, LLVM::Type(ty), sz, name)) end |
#ashr(lhs, rhs, name = "") ⇒ LLVM::Instruction
Arithmatic shift right.
417 418 419 |
# File 'lib/llvm/core/builder.rb', line 417 def ashr(lhs, rhs, name = "") Instruction.from_ptr(C.build_a_shr(self, lhs, rhs, name)) end |
#bit_cast(val, ty, name = "") ⇒ LLVM::Instruction
Cast a value to the given type without changing any bits
791 792 793 |
# File 'lib/llvm/core/builder.rb', line 791 def bit_cast(val, ty, name = "") Instruction.from_ptr(C.build_bit_cast(self, val, LLVM::Type(ty), name)) end |
#br(block) ⇒ LLVM::Instruction
Unconditional branching (i.e. goto)
96 97 98 99 100 101 |
# File 'lib/llvm/core/builder.rb', line 96 def br(block) raise ArgumentError, "Trying to build LLVM br with non-block: #{block.inspect}" if !block.is_a?(LLVM::BasicBlock) Instruction.from_ptr( C.build_br(self, block)) end |
#call(fun, *args) ⇒ Object
Builds a call Instruction. Calls the given Function with the given args (Instructions).
925 926 927 |
# File 'lib/llvm/core/builder.rb', line 925 def call(fun, *args) call2(nil, fun, *args) end |
#call2(type, fun, *args) ⇒ Object
929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 |
# File 'lib/llvm/core/builder.rb', line 929 def call2(type, fun, *args) raise ArgumentError, "Trying to build LLVM call with non-function: #{fun.inspect}" if !fun.is_a?(LLVM::Function) type ||= fun.function_type must_be_type!(type) if args.last.kind_of? String name = args.pop else name = "" end args_ptr = FFI::MemoryPointer.new(FFI.type_size(:pointer) * args.size) args_ptr.write_array_of_pointer(args) ins = C.build_call2(self, type, fun, args_ptr, args.size, name) CallInst.from_ptr(ins) end |
#cond(cond, iftrue, iffalse) ⇒ LLVM::Instruction
Conditional branching (i.e. if)
119 120 121 122 123 124 125 126 127 128 |
# File 'lib/llvm/core/builder.rb', line 119 def cond(cond, iftrue, iffalse) raise ArgumentError, "Trying to build LLVM cond br with non-block (true branch): #{iftrue.inspect}" if !iftrue.is_a?(LLVM::BasicBlock) raise ArgumentError, "Trying to build LLVM cond br with non-block (false branch): #{iffalse.inspect}" if !iffalse.is_a?(LLVM::BasicBlock) cond2 = cond_condition(cond) Instruction.from_ptr( C.build_cond_br(self, cond2, iftrue, iffalse)) end |
#dispose ⇒ Object
10 11 12 13 14 |
# File 'lib/llvm/core/builder.rb', line 10 def dispose return if @ptr.nil? C.dispose_builder(@ptr) @ptr = nil end |
#exact_sdiv(lhs, rhs, name = "") ⇒ LLVM::Instruction
Signed exact division
349 350 351 |
# File 'lib/llvm/core/builder.rb', line 349 def exact_sdiv(lhs, rhs, name = "") Instruction.from_ptr(C.build_exact_s_div(self, lhs, rhs, name)) end |
#extract_element(vector, idx, name = "") ⇒ LLVM::Instruction
Extract an element from a vector
969 970 971 972 973 974 975 976 |
# File 'lib/llvm/core/builder.rb', line 969 def extract_element(vector, idx, name = "") error = element_error(vector, idx) raise ArgumentError, "Error building extract_element with #{error}" if error ins = C.build_extract_element(self, vector, idx, name) Instruction.from_ptr(ins) end |
#extract_value(aggregate, idx, name = "") ⇒ LLVM::Instruction
Extract the value of a member field from an aggregate value
1016 1017 1018 1019 1020 1021 1022 1023 |
# File 'lib/llvm/core/builder.rb', line 1016 def extract_value(aggregate, idx, name = "") error = value_error(aggregate, idx) raise ArgumentError, "Error building extract_value with #{error}" if error ins = C.build_extract_value(self, aggregate, idx, name) Instruction.from_ptr(ins) end |
#fadd(lhs, rhs, name = "") ⇒ LLVM::Instruction
Returns The floating point sum of the two operands.
238 239 240 |
# File 'lib/llvm/core/builder.rb', line 238 def fadd(lhs, rhs, name = "") Instruction.from_ptr(C.build_f_add(self, lhs, rhs, name)) end |
#fcmp(pred, lhs, rhs, name = "") ⇒ LLVM::Instruction
Builds an fcmp Instruction. Compares lhs to rhs (Instructions) as Reals using the given symbol predicate (pred):
:ord - ordered
:uno - unordered: isnan(X) | isnan(Y)
:oeq - ordered and equal to
:oeq - unordered and equal to
:one - ordered and not equal to
:one - unordered and not equal to
:ogt - ordered and greater than
:uge - unordered and greater than or equal to
:olt - ordered and less than
:ule - unordered and less than or equal to
:oge - ordered and greater than or equal to
:sge - unordered and greater than or equal to
:ole - ordered and less than or equal to
:sle - unordered and less than or equal to
:true - always true and folded
:false - always false and folded
899 900 901 |
# File 'lib/llvm/core/builder.rb', line 899 def fcmp(pred, lhs, rhs, name = "") Instruction.from_ptr(C.build_f_cmp(self, pred, lhs, rhs, name)) end |
#fdiv(lhs, rhs, name = "") ⇒ LLVM::Instruction
Returns The floating point quotient of the two operands.
359 360 361 |
# File 'lib/llvm/core/builder.rb', line 359 def fdiv(lhs, rhs, name = "") Instruction.from_ptr(C.build_f_div(self, lhs, rhs, name)) end |
#fmul(lhs, rhs, name = "") ⇒ LLVM::Instruction
Floating point multiplication
319 320 321 |
# File 'lib/llvm/core/builder.rb', line 319 def fmul(lhs, rhs, name = "") Instruction.from_ptr(C.build_f_mul(self, lhs, rhs, name)) end |
#fp2si(val, ty, name = "") ⇒ LLVM::Instruction
Convert a floating point to a signed integer
713 714 715 |
# File 'lib/llvm/core/builder.rb', line 713 def fp2si(val, ty, name = "") Instruction.from_ptr(C.build_fp_to_si(self, val, LLVM::Type(ty), name)) end |
#fp2ui(val, ty, name = "") ⇒ LLVM::Instruction
Convert a floating point to an unsigned integer
702 703 704 |
# File 'lib/llvm/core/builder.rb', line 702 def fp2ui(val, ty, name = "") Instruction.from_ptr(C.build_fp_to_ui(self, val, LLVM::Type(ty), name)) end |
#fp_cast(val, ty, name = "") ⇒ LLVM::Instruction
845 846 847 |
# File 'lib/llvm/core/builder.rb', line 845 def fp_cast(val, ty, name = "") Instruction.from_ptr(C.build_fp_cast(self, val, LLVM::Type(ty), name)) end |
#fp_ext(val, ty, name = "") ⇒ LLVM::Instruction
Extend a floating point value
759 760 761 |
# File 'lib/llvm/core/builder.rb', line 759 def fp_ext(val, ty, name = "") Instruction.from_ptr(C.build_fp_ext(self, val, LLVM::Type(ty), name)) end |
#fp_trunc(val, ty, name = "") ⇒ LLVM::Instruction
Truncate a floating point value
748 749 750 |
# File 'lib/llvm/core/builder.rb', line 748 def fp_trunc(val, ty, name = "") Instruction.from_ptr(C.build_fp_trunc(self, val, LLVM::Type(ty), name)) end |
#free(ptr) ⇒ LLVM::Instruction
Returns The result of the free instruction.
524 525 526 |
# File 'lib/llvm/core/builder.rb', line 524 def free(ptr) Instruction.from_ptr(C.build_free(self, ptr)) end |
#frem(lhs, rhs, name = "") ⇒ LLVM::Instruction
Returns The floating point remainder.
388 389 390 |
# File 'lib/llvm/core/builder.rb', line 388 def frem(lhs, rhs, name = "") Instruction.from_ptr(C.build_f_rem(self, lhs, rhs, name)) end |
#fsub(lhs, rhs, name = "") ⇒ LLVM::Instruction
Returns The floating point difference of the two operands.
278 279 280 |
# File 'lib/llvm/core/builder.rb', line 278 def fsub(lhs, rhs, name = "") Instruction.from_ptr(C.build_f_sub(self, lhs, rhs, name)) end |
#gep(ptr, indices, name = "") ⇒ LLVM::Instruction
Obtain a pointer to the element at the given indices
566 567 568 |
# File 'lib/llvm/core/builder.rb', line 566 def gep(ptr, indices, name = "") gep2(nil, ptr, indices, name) end |
#gep2(type, ptr, indices, name) ⇒ LLVM::Instruction
Obtain a pointer to the element at the given indices
579 580 581 582 583 584 585 586 587 588 589 590 591 |
# File 'lib/llvm/core/builder.rb', line 579 def gep2(type, ptr, indices, name) must_be_value!(ptr) type ||= must_infer_type!(ptr) must_be_type!(type) indices = Array(indices) FFI::MemoryPointer.new(FFI.type_size(:pointer) * indices.size) do |indices_ptr| indices_ptr.write_array_of_pointer(indices) ins = C.build_gep2(self, type, ptr, indices_ptr, indices.size, name) return Instruction.from_ptr(ins) end end |
#global_string(string, name = "") ⇒ LLVM::Instruction
Creates a global string initialized to a given value.
647 648 649 |
# File 'lib/llvm/core/builder.rb', line 647 def global_string(string, name = "") Instruction.from_ptr(C.build_global_string(self, string, name)) end |
#global_string_pointer(string, name = "") ⇒ LLVM::Instruction
Creates a pointer to a global string initialized to a given value.
655 656 657 |
# File 'lib/llvm/core/builder.rb', line 655 def global_string_pointer(string, name = "") Instruction.from_ptr(C.build_global_string_ptr(self, string, name)) end |
#ibr(addr, num_dests) ⇒ LLVM::Instruction
Indirect branching (i.e. computed goto)
108 109 110 111 |
# File 'lib/llvm/core/builder.rb', line 108 def ibr(addr, num_dests) IndirectBr.from_ptr( C.build_indirect_br(self, addr, num_dests)) end |
#icmp(pred, lhs, rhs, name = "") ⇒ LLVM::Instruction
Builds an icmp Instruction. Compares lhs to rhs (Instructions) using the given symbol predicate (pred):
:eq - equal to
:ne - not equal to
:ugt - unsigned greater than
:uge - unsigned greater than or equal to
:ult - unsigned less than
:ule - unsigned less than or equal to
:sgt - signed greater than
:sge - signed greater than or equal to
:slt - signed less than
:sle - signed less than or equal to
869 870 871 |
# File 'lib/llvm/core/builder.rb', line 869 def icmp(pred, lhs, rhs, name = "") Instruction.from_ptr(C.build_i_cmp(self, pred, lhs, rhs, name)) end |
#inbounds_gep(ptr, indices, name = "") ⇒ LLVM::Instruction
Builds a inbounds getelementptr instruction. If the indices are outside the allocated pointer the value is undefined.
602 603 604 |
# File 'lib/llvm/core/builder.rb', line 602 def inbounds_gep(ptr, indices, name = "") inbounds_gep2(nil, ptr, indices, name) end |
#inbounds_gep2(type, ptr, indices, name = "") ⇒ Object
606 607 608 609 610 611 612 613 614 615 616 617 618 |
# File 'lib/llvm/core/builder.rb', line 606 def inbounds_gep2(type, ptr, indices, name = "") must_be_value!(ptr) type = must_infer_type!(ptr) must_be_type!(type) indices = Array(indices) FFI::MemoryPointer.new(FFI.type_size(:pointer) * indices.size) do |indices_ptr| indices_ptr.write_array_of_pointer(indices) ins = C.build_inbounds_gep2(self, type, ptr, indices_ptr, indices.size, name) return Instruction.from_ptr(ins) end end |
#insert_block ⇒ LLVM::BasicBlock
The BasicBlock at which the Builder is currently positioned.
60 61 62 |
# File 'lib/llvm/core/builder.rb', line 60 def insert_block BasicBlock.from_ptr(C.get_insert_block(self)) end |
#insert_element(vector, elem, idx, name = "") ⇒ LLVM::Instruction
Insert an element into a vector
985 986 987 988 989 990 991 992 993 994 995 996 |
# File 'lib/llvm/core/builder.rb', line 985 def insert_element(vector, elem, idx, name = "") error = element_error(vector, idx) error ||= if !elem.is_a?(LLVM::Value) "elem: #{elem.inspect}" end raise ArgumentError, "Error building insert_element with #{error}" if error ins = C.build_insert_element(self, vector, elem, idx, name) Instruction.from_ptr(ins) end |
#insert_value(aggregate, elem, idx, name = "") ⇒ LLVM::Instruction
Insert a value into an aggregate value’s member field
1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 |
# File 'lib/llvm/core/builder.rb', line 1032 def insert_value(aggregate, elem, idx, name = "") error = value_error(aggregate, idx) error ||= if !elem.is_a?(LLVM::Value) "elem: #{elem.inspect}" end raise ArgumentError, "Error building insert_value with #{error}" if error ins = C.build_insert_value(self, aggregate, elem, idx, name) Instruction.from_ptr(ins) end |
#int2ptr(val, ty, name = "") ⇒ LLVM::Instruction
Cast an int to a pointer
781 782 783 |
# File 'lib/llvm/core/builder.rb', line 781 def int2ptr(val, ty, name = "") Instruction.from_ptr(C.build_int_to_ptr(self, val, LLVM::Type(ty), name)) end |
#int_cast(val, ty, name = "") ⇒ LLVM::Instruction
837 838 839 |
# File 'lib/llvm/core/builder.rb', line 837 def int_cast(val, ty, name = "") Instruction.from_ptr(C.build_int_cast(self, val, LLVM::Type(ty), name)) end |
#invoke(fun, args, normal, exception, name = "") ⇒ LLVM::Instruction
Invoke a function which may potentially unwind
171 172 173 |
# File 'lib/llvm/core/builder.rb', line 171 def invoke(fun, args, normal, exception, name = "") invoke2(nil, fun, args, normal, exception, name) end |
#invoke2(type, fun, args, normal, exception, name = "") ⇒ Object
175 176 177 178 179 180 181 182 183 184 185 186 187 |
# File 'lib/llvm/core/builder.rb', line 175 def invoke2(type, fun, args, normal, exception, name = "") raise ArgumentError, "Trying to build LLVM call with non-function: #{fun.inspect}" if !fun.is_a?(LLVM::Function) type ||= fun.return_type must_be_type!(type) s = args.size FFI::MemoryPointer.new(FFI.type_size(:pointer) * s) do |args_ptr| args_ptr.write_array_of_pointer(args) ins = C.build_invoke2(self, type, fun, args_ptr, s, normal, exception, name) return Instruction.from_ptr(ins) end end |
#is_not_null(val, name = "") ⇒ LLVM::Instruction
Check if a value is not null
1057 1058 1059 |
# File 'lib/llvm/core/builder.rb', line 1057 def is_not_null(val, name = "") Instruction.from_ptr(C.build_is_not_null(self, val, name)) end |
#is_null(val, name = "") ⇒ LLVM::Instruction
Check if a value is null
1049 1050 1051 |
# File 'lib/llvm/core/builder.rb', line 1049 def is_null(val, name = "") Instruction.from_ptr(C.build_is_null(self, val, name)) end |
#load(ptr, name = "") ⇒ LLVM::Instruction
Load the value of a given pointer
534 535 536 |
# File 'lib/llvm/core/builder.rb', line 534 def load(ptr, name = "") load2(nil, ptr, name) end |
#load2(type, ptr, name = "") ⇒ Object
538 539 540 541 542 543 544 545 546 |
# File 'lib/llvm/core/builder.rb', line 538 def load2(type, ptr, name = "") must_be_value!(ptr) type ||= infer_type(ptr) must_be_type!(type) load = C.build_load2(self, type, ptr, name) Instruction.from_ptr(load) end |
#lshr(lhs, rhs, name = "") ⇒ LLVM::Instruction
Shifts right with zero fill.
407 408 409 |
# File 'lib/llvm/core/builder.rb', line 407 def lshr(lhs, rhs, name = "") Instruction.from_ptr(C.build_l_shr(self, lhs, rhs, name)) end |
#malloc(ty, name = "") ⇒ LLVM::Instruction
Returns A pointer to the malloced bytes.
488 489 490 |
# File 'lib/llvm/core/builder.rb', line 488 def malloc(ty, name = "") Instruction.from_ptr(C.build_malloc(self, LLVM::Type(ty), name)) end |
#mul(lhs, rhs, name = "") ⇒ LLVM::Instruction
Integer multiplication.
288 289 290 |
# File 'lib/llvm/core/builder.rb', line 288 def mul(lhs, rhs, name = "") Instruction.from_ptr(C.build_mul(self, lhs, rhs, name)) end |
#neg(arg, name = "") ⇒ LLVM::Instruction
Integer negation. Implemented as a shortcut to the equivalent sub
instruction.
454 455 456 |
# File 'lib/llvm/core/builder.rb', line 454 def neg(arg, name = "") Instruction.from_ptr(C.build_neg(self, arg, name)) end |
#not(arg, name = "") ⇒ LLVM::Instruction
Boolean negation.
480 481 482 |
# File 'lib/llvm/core/builder.rb', line 480 def not(arg, name = "") Instruction.from_ptr(C.build_not(self, arg, name)) end |
#nsw_add(lhs, rhs, name = "") ⇒ LLVM::Instruction
“No signed wrap” integer addition.
219 220 221 |
# File 'lib/llvm/core/builder.rb', line 219 def nsw_add(lhs, rhs, name = "") Instruction.from_ptr(C.build_nsw_add(self, lhs, rhs, name)) end |
#nsw_mul(lhs, rhs, name = "") ⇒ LLVM::Instruction
“No signed wrap” integer multiplication.
298 299 300 |
# File 'lib/llvm/core/builder.rb', line 298 def nsw_mul(lhs, rhs, name = "") Instruction.from_ptr(C.build_nsw_mul(self, lhs, rhs, name)) end |
#nsw_neg(arg, name = "") ⇒ LLVM::Instruction
“No signed wrap” integer negation.
463 464 465 |
# File 'lib/llvm/core/builder.rb', line 463 def nsw_neg(arg, name = "") Instruction.from_ptr(C.build_nsw_neg(self, arg, name)) end |
#nsw_sub(lhs, rhs, name = "") ⇒ LLVM::Instruction
No signed wrap integer subtraction.
258 259 260 |
# File 'lib/llvm/core/builder.rb', line 258 def nsw_sub(lhs, rhs, name = "") Instruction.from_ptr(C.build_nsw_sub(self, lhs, rhs, name)) end |
#nuw_add(lhs, rhs, name = "") ⇒ LLVM::Instruction
“No unsigned wrap” integer addition.
229 230 231 |
# File 'lib/llvm/core/builder.rb', line 229 def nuw_add(lhs, rhs, name = "") Instruction.from_ptr(C.build_nuw_add(self, lhs, rhs, name)) end |
#nuw_mul(lhs, rhs, name = "") ⇒ LLVM::Instruction
“No unsigned wrap” integer multiplication.
308 309 310 |
# File 'lib/llvm/core/builder.rb', line 308 def nuw_mul(lhs, rhs, name = "") Instruction.from_ptr(C.build_nuw_mul(self, lhs, rhs, name)) end |
#nuw_neg(arg, name = "") ⇒ LLVM::Instruction
“No unsigned wrap” integer negation.
472 473 474 |
# File 'lib/llvm/core/builder.rb', line 472 def nuw_neg(arg, name = "") Instruction.from_ptr(C.build_nuw_neg(self, arg, name)) end |
#nuw_sub(lhs, rhs, name = "") ⇒ LLVM::Instruction
No unsigned wrap integer subtraction.
268 269 270 |
# File 'lib/llvm/core/builder.rb', line 268 def nuw_sub(lhs, rhs, name = "") Instruction.from_ptr(C.build_nuw_sub(self, lhs, rhs, name)) end |
#or(lhs, rhs, name = "") ⇒ LLVM::Instruction
Returns An integer instruction.
435 436 437 |
# File 'lib/llvm/core/builder.rb', line 435 def or(lhs, rhs, name = "") Instruction.from_ptr(C.build_or(self, lhs, rhs, name)) end |
#phi(ty, incoming, name = "") ⇒ LLVM::Instruction
Build a Phi node of the given type with the given incoming branches
912 913 914 915 916 |
# File 'lib/llvm/core/builder.rb', line 912 def phi(ty, incoming, name = "") phi = Phi.from_ptr(C.build_phi(self, LLVM::Type(ty), name)) phi.add_incoming(incoming) phi end |
#pointer_cast(val, ty, name = "") ⇒ LLVM::Instruction
829 830 831 |
# File 'lib/llvm/core/builder.rb', line 829 def pointer_cast(val, ty, name = "") Instruction.from_ptr(C.build_pointer_cast(self, val, LLVM::Type(ty), name)) end |
#position(block, instruction) ⇒ LLVM::Builder
Position the builder at the given Instruction within the given BasicBlock.
26 27 28 29 30 31 32 33 |
# File 'lib/llvm/core/builder.rb', line 26 def position(block, instruction) raise ArgumentError, "Block must be LLVM::BasicBlock" if !block.is_a?(LLVM::BasicBlock) raise ArgumentError, "Instruction must be LLVM::Instruction" if !instruction.is_a?(LLVM::Instruction) C.position_builder(self, block, instruction) self end |
#position_at_end(block) ⇒ LLVM::Builder
Positions the builder at the end of the given BasicBlock.
50 51 52 53 54 55 |
# File 'lib/llvm/core/builder.rb', line 50 def position_at_end(block) raise ArgumentError, "Block must be LLVM::BasicBlock" if !block.is_a?(LLVM::BasicBlock) C.position_builder_at_end(self, block) self end |
#position_before(instruction) ⇒ LLVM::Builder
Positions the builder before the given Instruction.
39 40 41 42 43 44 |
# File 'lib/llvm/core/builder.rb', line 39 def position_before(instruction) raise ArgumentError, "Instruction must be LLVM::Instruction" if !instruction.is_a?(LLVM::Instruction) C.position_builder_before(self, instruction) self end |
#ptr2int(val, ty, name = "") ⇒ LLVM::Instruction
Cast a pointer to an int. Useful for pointer arithmetic.
770 771 772 |
# File 'lib/llvm/core/builder.rb', line 770 def ptr2int(val, ty, name = "") Instruction.from_ptr(C.build_ptr_to_int(self, val, LLVM::Type(ty), name)) end |
#ptr_diff(lhs, rhs, name = "") ⇒ LLVM::Instruction
Calculate the difference between two pointers
1067 1068 1069 |
# File 'lib/llvm/core/builder.rb', line 1067 def ptr_diff(lhs, rhs, name = "") Instruction.from_ptr(C.build_ptr_diff(lhs, rhs, name)) end |
#ret(val = nil) ⇒ LLVM::Instruction
73 74 75 76 77 78 79 |
# File 'lib/llvm/core/builder.rb', line 73 def ret(val = nil) unless [LLVM::Value, NilClass].any? { |c| val.is_a?(c) } raise ArgumentError, "Trying to build LLVM ret with non-value: #{val.inspect}" end Instruction.from_ptr(C.build_ret(self, val)) end |
#ret_void ⇒ LLVM::Instruction
66 67 68 |
# File 'lib/llvm/core/builder.rb', line 66 def ret_void Instruction.from_ptr(C.build_ret_void(self)) end |
#sdiv(lhs, rhs, name = "") ⇒ LLVM::Instruction
Signed division
339 340 341 |
# File 'lib/llvm/core/builder.rb', line 339 def sdiv(lhs, rhs, name = "") Instruction.from_ptr(C.build_s_div(self, lhs, rhs, name)) end |
#select(_if, _then, _else, name = "") ⇒ LLVM::Instruction
Return a value based on a condition. This differs from ‘cond’ in that its operands are values rather than basic blocks. As a consequence, both arguments must be evaluated.
958 959 960 |
# File 'lib/llvm/core/builder.rb', line 958 def select(_if, _then, _else, name = "") Instruction.from_ptr(C.build_select(self, _if, _then, _else, name)) end |
#sext(val, ty, name = "") ⇒ LLVM::Instruction
Sign extension by copying the sign bit (highest order bit) of the value until it reaches the bit size of the given type.
691 692 693 |
# File 'lib/llvm/core/builder.rb', line 691 def sext(val, ty, name = "") Instruction.from_ptr(C.build_s_ext(self, val, LLVM::Type(ty), name)) end |
#sext_or_bit_cast(val, ty, name = "") ⇒ LLVM::Instruction
811 812 813 |
# File 'lib/llvm/core/builder.rb', line 811 def sext_or_bit_cast(val, ty, name = "") Instruction.from_ptr(C.build_s_ext_or_bit_cast(self, val, LLVM::Type(ty), name)) end |
#shl(lhs, rhs, name = "") ⇒ LLVM::Instruction
Returns An integer instruction.
397 398 399 |
# File 'lib/llvm/core/builder.rb', line 397 def shl(lhs, rhs, name = "") Instruction.from_ptr(C.build_shl(self, lhs, rhs, name)) end |
#shuffle_vector(vec1, vec2, mask, name = "") ⇒ LLVM::Instruction
Shuffle two vectors according to a given mask
1006 1007 1008 |
# File 'lib/llvm/core/builder.rb', line 1006 def shuffle_vector(vec1, vec2, mask, name = "") Instruction.from_ptr(C.build_shuffle_vector(self, vec1, vec2, mask, name)) end |
#si2fp(val, ty, name = "") ⇒ LLVM::Instruction
Convert a signed integer to a floating point
737 738 739 |
# File 'lib/llvm/core/builder.rb', line 737 def si2fp(val, ty, name = "") Instruction.from_ptr(C.build_si_to_fp(self, val, LLVM::Type(ty), name)) end |
#srem(lhs, rhs, name = "") ⇒ LLVM::Instruction
Signed remainder
379 380 381 |
# File 'lib/llvm/core/builder.rb', line 379 def srem(lhs, rhs, name = "") Instruction.from_ptr(C.build_s_rem(self, lhs, rhs, name)) end |
#store(val, ptr) ⇒ LLVM::Instruction
Store a value at a given pointer
553 554 555 556 |
# File 'lib/llvm/core/builder.rb', line 553 def store(val, ptr) raise "val must be a Value, got #{val.class.name}" unless Value === val Instruction.from_ptr(C.build_store(self, val, ptr)) end |
#struct_gep(ptr, idx, name = "") ⇒ LLVM::Instruction
Builds a struct getelementptr Instruction.
629 630 631 |
# File 'lib/llvm/core/builder.rb', line 629 def struct_gep(ptr, idx, name = "") struct_gep2(nil, ptr, idx, name) end |
#struct_gep2(type, ptr, idx, name) ⇒ Object
633 634 635 636 637 638 639 640 641 |
# File 'lib/llvm/core/builder.rb', line 633 def struct_gep2(type, ptr, idx, name) must_be_value!(ptr) type ||= must_infer_type!(ptr) must_be_type!(type) ins = C.build_struct_gep2(self, type, ptr, idx, name) Instruction.from_ptr(ins) end |
#sub(lhs, rhs, name = "") ⇒ LLVM::Instruction
Integer subtraction.
248 249 250 |
# File 'lib/llvm/core/builder.rb', line 248 def sub(lhs, rhs, name = "") Instruction.from_ptr(C.build_sub(self, lhs, rhs, name)) end |
#switch(val, default, cases) ⇒ LLVM::Instruction
154 155 156 157 158 159 160 |
# File 'lib/llvm/core/builder.rb', line 154 def switch(val, default, cases) inst = SwitchInst.from_ptr(C.build_switch(self, val, default, cases.size)) cases.each do |(c, block)| inst.add_case(c, block) end inst end |
#to_ptr ⇒ Object
17 18 19 |
# File 'lib/llvm/core/builder.rb', line 17 def to_ptr @ptr end |
#trunc(val, ty, name = "") ⇒ LLVM::Instruction
Truncates its operand to the given type. The size of the value type must be greater than the size of the target type.
667 668 669 |
# File 'lib/llvm/core/builder.rb', line 667 def trunc(val, ty, name = "") Instruction.from_ptr(C.build_trunc(self, val, LLVM::Type(ty), name)) end |
#trunc_or_bit_cast(val, ty, name = "") ⇒ LLVM::Instruction
821 822 823 |
# File 'lib/llvm/core/builder.rb', line 821 def trunc_or_bit_cast(val, ty, name = "") Instruction.from_ptr(C.build_trunc_or_bit_cast(self, val, LLVM::Type(ty), name)) end |
#udiv(lhs, rhs, name = "") ⇒ LLVM::Instruction
Unsigned integer division
329 330 331 |
# File 'lib/llvm/core/builder.rb', line 329 def udiv(lhs, rhs, name = "") Instruction.from_ptr(C.build_u_div(self, lhs, rhs, name)) end |
#ui2fp(val, ty, name = "") ⇒ LLVM::Instruction
Convert an unsigned integer to a floating point
725 726 727 |
# File 'lib/llvm/core/builder.rb', line 725 def ui2fp(val, ty, name = "") Instruction.from_ptr(C.build_ui_to_fp(self, val, LLVM::Type(ty), name)) end |
#unreachable ⇒ LLVM::Instruction
Generates an instruction with no defined semantics. Can be used to provide hints to the optimizer.
199 200 201 |
# File 'lib/llvm/core/builder.rb', line 199 def unreachable Instruction.from_ptr(C.build_unreachable(self)) end |
#unwind ⇒ Object
Builds an unwind Instruction.
191 192 193 |
# File 'lib/llvm/core/builder.rb', line 191 def unwind Instruction.from_ptr(C.build_unwind(self)) end |
#urem(lhs, rhs, name = "") ⇒ LLVM::Instruction
Unsigned remainder
369 370 371 |
# File 'lib/llvm/core/builder.rb', line 369 def urem(lhs, rhs, name = "") Instruction.from_ptr(C.build_u_rem(self, lhs, rhs, name)) end |
#xor(lhs, rhs, name = "") ⇒ LLVM::Instruction
Returns An integer instruction.
444 445 446 |
# File 'lib/llvm/core/builder.rb', line 444 def xor(lhs, rhs, name = "") Instruction.from_ptr(C.build_xor(self, lhs, rhs, name)) end |
#zext(val, ty, name = "") ⇒ LLVM::Instruction
Zero extends its operand to the given type. The size of the value type must be greater than the size of the target type.
679 680 681 |
# File 'lib/llvm/core/builder.rb', line 679 def zext(val, ty, name = "") Instruction.from_ptr(C.build_z_ext(self, val, LLVM::Type(ty), name)) end |
#zext_or_bit_cast(val, ty, name = "") ⇒ LLVM::Instruction
801 802 803 |
# File 'lib/llvm/core/builder.rb', line 801 def zext_or_bit_cast(val, ty, name = "") Instruction.from_ptr(C.build_z_ext_or_bit_cast(self, val, LLVM::Type(ty), name)) end |