MODULE = LLVM PACKAGE = LLVM::Builder
#define BIN_OP(FN) FN(self, lhs, rhs, SvPVbyte_nolen(result))
Builder
new(class)
SV *class
CODE:
Builder bld = LLVMCreateBuilder();
RETVAL = bld;
OUTPUT: RETVAL
void
position_at_end(self, blk)
Builder self
BasicBlock blk
CODE:
LLVMPositionBuilderAtEnd(self, blk);
# Terminators
Value
ret(self, v)
Builder self
Value v
CODE:
RETVAL = LLVMBuildRet(self, v);
OUTPUT: RETVAL
Value
ret_void(self)
Builder self
CODE:
RETVAL = LLVMBuildRetVoid(self);
OUTPUT: RETVAL
Value
br(self, dest)
Builder self
BasicBlock dest
CODE:
RETVAL = LLVMBuildBr(self, dest);
OUTPUT: RETVAL
Value
cond(self, cond, th, el)
Builder self
Value cond
BasicBlock th
BasicBlock el
CODE:
RETVAL = LLVMBuildCondBr(self, cond, th, el);
OUTPUT: RETVAL
void
unreachable(self)
Builder self
CODE:
LLVMBuildUnreachable(self);
# Binary operations
Value
add(self, lhs, rhs, result)
Builder self
Value lhs
Value rhs
SV *result
CODE:
RETVAL = BIN_OP(LLVMBuildAdd);
OUTPUT: RETVAL
Value
fadd(self, lhs, rhs, result)
Builder self
Value lhs
Value rhs
SV *result
CODE:
RETVAL = BIN_OP(LLVMBuildFAdd);
OUTPUT: RETVAL
Value
mul(self, lhs, rhs, result)
Builder self
Value lhs
Value rhs
SV *result
CODE:
RETVAL = BIN_OP(LLVMBuildMul);
OUTPUT: RETVAL
Value
fmul(self, lhs, rhs, result)
Builder self
Value lhs
Value rhs
SV *result
CODE:
RETVAL = BIN_OP(LLVMBuildFMul);
OUTPUT: RETVAL
Value
sub(self, lhs, rhs, result)
Builder self
Value lhs
Value rhs
SV *result
CODE:
RETVAL = BIN_OP(LLVMBuildSub);
OUTPUT: RETVAL
Value
fsub(self, lhs, rhs, result)
Builder self
Value lhs
Value rhs
SV *result
CODE:
RETVAL = BIN_OP(LLVMBuildFSub);
OUTPUT: RETVAL
Value
udiv(self, lhs, rhs, result)
Builder self
Value lhs
Value rhs
SV *result
CODE:
RETVAL = BIN_OP(LLVMBuildUDiv);
OUTPUT: RETVAL
Value
sdiv(self, lhs, rhs, result)
Builder self
Value lhs
Value rhs
SV *result
CODE:
RETVAL = BIN_OP(LLVMBuildSDiv);
OUTPUT: RETVAL
Value
fdiv(self, lhs, rhs, result)
Builder self
Value lhs
Value rhs
SV *result
CODE:
RETVAL = BIN_OP(LLVMBuildFDiv);
OUTPUT: RETVAL
# Binary bitwise operations
Value
shl(self, lhs, rhs, result)
Builder self
Value lhs
Value rhs
SV *result
CODE:
RETVAL = BIN_OP(LLVMBuildShl);
OUTPUT: RETVAL
Value
lshr(self, lhs, rhs, result)
Builder self
Value lhs
Value rhs
SV *result
CODE:
RETVAL = BIN_OP(LLVMBuildLShr);
OUTPUT: RETVAL
Value
ashr(self, lhs, rhs, result)
Builder self
Value lhs
Value rhs
SV *result
CODE:
RETVAL = BIN_OP(LLVMBuildAShr);
OUTPUT: RETVAL
Value
and(self, lhs, rhs, result)
Builder self
Value lhs
Value rhs
SV *result
CODE:
RETVAL = BIN_OP(LLVMBuildAnd);
OUTPUT: RETVAL
Value
or(self, lhs, rhs, result)
Builder self
Value lhs
Value rhs
SV *result
CODE:
RETVAL = BIN_OP(LLVMBuildOr);
OUTPUT: RETVAL
Value
xor(self, lhs, rhs, result)
Builder self
Value lhs
Value rhs
SV *result
CODE:
RETVAL = BIN_OP(LLVMBuildXor);
OUTPUT: RETVAL
# Conversion
Value
trunc(self, value, out, result)
Builder self
Value value
Type out
SV *result
CODE:
RETVAL = LLVMBuildTrunc(
self, value, out, SvPVbyte_nolen(result)
);
OUTPUT: RETVAL
# Misc
Value
icmp(self, pred, lhs, rhs, result)
Builder self
SV *pred
Value lhs
Value rhs
SV *result
CODE:
LLVMIntPredicate ipred;
char *spred = SvPVbyte_nolen(pred);
if (strncmp(spred, "eq", 2) == 0)
ipred = LLVMIntEQ;
else if (strncmp(spred, "ne", 2) == 0)
ipred = LLVMIntNE;
else if (strncmp(spred, "ugt", 3) == 0)
ipred = LLVMIntUGT;
else if (strncmp(spred, "uge", 3) == 0)
ipred = LLVMIntUGE;
else if (strncmp(spred, "ult", 3) == 0)
ipred = LLVMIntULT;
else if (strncmp(spred, "ule", 3) == 0)
ipred = LLVMIntULE;
else if (strncmp(spred, "sgt", 3) == 0)
ipred = LLVMIntSGT;
else if (strncmp(spred, "sge", 3) == 0)
ipred = LLVMIntSGE;
else if (strncmp(spred, "slt", 3) == 0)
ipred = LLVMIntSLT;
else if (strncmp(spred, "sge", 3) == 0)
ipred = LLVMIntSGE;
else
Perl_croak(aTHX_ "invalid predicate '%s'\n", spred);
RETVAL = LLVMBuildICmp(
self, ipred, lhs, rhs, SvPVbyte_nolen(result)
);
OUTPUT: RETVAL
Value
fcmp(self, pred, lhs, rhs, result)
Builder self
SV *pred
Value lhs
Value rhs
SV *result
CODE:
LLVMRealPredicate rpred;
char *spred = SvPVbyte_nolen(pred);
if (strncmp(spred, "false", 5) == 0)
rpred = LLVMRealPredicateFalse;
else if (strncmp(spred, "oeq", 3) == 0)
rpred = LLVMRealOEQ;
else if (strncmp(spred, "ogt", 3) == 0)
rpred = LLVMRealOGT;
else if (strncmp(spred, "oge", 3) == 0)
rpred = LLVMRealOGE;
else if (strncmp(spred, "olt", 3) == 0)
rpred = LLVMRealOLT;
else if (strncmp(spred, "ole", 3) == 0)
rpred = LLVMRealOLE;
else if (strncmp(spred, "one", 3) == 0)
rpred = LLVMRealONE;
else if (strncmp(spred, "ord", 3) == 0)
rpred = LLVMRealORD;
else if (strncmp(spred, "uno", 3) == 0)
rpred = LLVMRealUNO;
else if (strncmp(spred, "ueq", 3) == 0)
rpred = LLVMRealUEQ;
else if (strncmp(spred, "ugt", 3) == 0)
rpred = LLVMRealUGT;
else if (strncmp(spred, "uge", 3) == 0)
rpred = LLVMRealUGE;
else if (strncmp(spred, "ult", 3) == 0)
rpred = LLVMRealULT;
else if (strncmp(spred, "ule", 3) == 0)
rpred = LLVMRealULE;
else if (strncmp(spred, "une", 3) == 0)
rpred = LLVMRealUNE;
if (strncmp(spred, "true", 4) == 0)
rpred = LLVMRealPredicateTrue;
else
Perl_croak(aTHX_ "invalid predicate '%s'\n", spred);
RETVAL = LLVMBuildFCmp(
self, rpred, lhs, rhs, SvPVbyte_nolen(result)
);
OUTPUT: RETVAL
Value
call(self, func, result, ...)
Builder self
Value func
SV *result
CODE:
int i;
const char *name = SvPVbyte_nolen(result);
Value *params = malloc(sizeof(Value) * (items - 3));
for (i = 3; i < items; i++) {
Value param;
SV *arg = ST(i);
if (sv_isobject(arg) &&
sv_derived_from(arg, "LLVM::Value"))
param = INT2PTR(Value, SvIV((SV *) SvRV(arg)));
else
Perl_croak(aTHX_
"arg is not of type LLVM::Value");
params[i - 3] = param;
}
RETVAL = LLVMBuildCall(self, func, params, (items - 3), name);
OUTPUT: RETVAL
Value
select(self, cond, th, el, result)
Builder self
Value cond
Value th
Value el
SV *result
CODE:
const char *name = SvPVbyte_nolen(result);
RETVAL = LLVMBuildSelect(self, cond, th, el, name);
OUTPUT: RETVAL
void
DESTROY(self)
Builder self
CODE:
LLVMDisposeBuilder(self);