aboutsummaryrefslogtreecommitdiff
path: root/src/llvm.cff
diff options
context:
space:
mode:
Diffstat (limited to 'src/llvm.cff')
-rw-r--r--src/llvm.cff28
1 files changed, 19 insertions, 9 deletions
diff --git a/src/llvm.cff b/src/llvm.cff
index 1e9eb03..c2a7fef 100644
--- a/src/llvm.cff
+++ b/src/llvm.cff
@@ -473,7 +473,9 @@ fn convert(f *Fn, to *const Type, ex *Expr) Value {
return t1;
case to->is(:Ptr) and from->is(:Ptr);
- return genexpr(f, ex);
+ let r = genexpr(f, ex);
+ let tmp = gentmp(to, "bitcast ptr %v to ptr", &r);
+ return tmp;
case to->is(:Slice) and from->is(:Slice);
return genexpr(f, ex);
@@ -538,12 +540,12 @@ fn genexpr(f *Fn, ex *Expr) Value {
} else if lhs.ty->is(:Ptr) {
let $t = mktmp(type);
gen("\t%v = getelementptr %t, %t %v, %t %v\n",
- &$t, lhs.ty.u.Ptr, lhs.ty, &lhs, rhs.ty, &rhs);
+ &$t, lhs.ty.u.Ptr == ty_void ? ty_i8 : lhs.ty.u.Ptr, lhs.ty, &lhs, rhs.ty, &rhs);
res = $t;
} else if rhs.ty->is(:Ptr) {
let $t = mktmp(type);
gen("\t%v = getelementptr %t, %t %v, %t %v\n",
- &$t, rhs.ty.u.Ptr, rhs.ty, &rhs, rhs.ty, &lhs);
+ &$t, rhs.ty.u.Ptr == ty_void ? ty_i8 : rhs.ty.u.Ptr, rhs.ty, &rhs, rhs.ty, &lhs);
res = $t;
} else {
assert(#f, "bad ad");
@@ -699,7 +701,7 @@ fn genexpr(f *Fn, ex *Expr) Value {
gen("OrF%d: ", id);
let rhs = genexpr(f, b.rhs);
gen("\tstore %t %v, %t %v\n", ex.ty, &rhs, tmpvar.ty, &tmpvar);
- gen("\tbr label %%OrT%d\n", &cnd, id, id);
+ gen("\tbr label %%OrT%d\n", id);
gen("OrT%d: ", id);
gen("\t%v = load %t, %t %v\n", &res, ex.ty, tmpvar.ty, &tmpvar);
return res;
@@ -761,7 +763,8 @@ fn genexpr(f *Fn, ex *Expr) Value {
let val = mktmp(ex.ty);
let var = genload(f, ref);
if ex.ty->is(:Ptr) {
- gen("\t%v = getelementptr %t, %t %v, i32 %v\n", &val, ex.ty.u.Ptr, ex.ty, &var, &one);
+ gen("\t%v = getelementptr %t, %t %v, i32 %v\n", &val,
+ ex.ty.u.Ptr->is(:Void) ? ty_i8 : ex.ty.u.Ptr, ex.ty, &var, &one);
} else {
gen("\t%v = add %t %v, %v\n", &val, ex.ty, &var, &one);
}
@@ -774,7 +777,8 @@ fn genexpr(f *Fn, ex *Expr) Value {
let val = mktmp(ex.ty);
let var = genload(f, ref);
if ex.ty->is(:Ptr) {
- gen("\t%v = getelementptr %t, %t %v, i32 %v\n", &val, ex.ty.u.Ptr, ex.ty, &var, &one);
+ gen("\t%v = getelementptr %t, %t %v, i32 %v\n", &val,
+ ex.ty.u.Ptr->is(:Void) ? ty_i8 : ex.ty.u.Ptr, ex.ty, &var, &one);
} else {
gen("\t%v = add %t %v, %v\n", &val, ex.ty, &var, &one);
}
@@ -946,7 +950,8 @@ fn genexpr(f *Fn, ex *Expr) Value {
return res;
case VaStart ap;
- // gen("\tcall void @llvm.va_start(ptr %v)\n", genref(f, ap).Addr);
+ let ap = genref(f, ap).Addr;
+ gen("\tcall void @llvm.va_start(ptr %v)\n", &ap);
return nop();
case VaArg ap;
@@ -954,7 +959,8 @@ fn genexpr(f *Fn, ex *Expr) Value {
return gentmp(ex.ty, "va_arg ptr %v, %t", &ap, ex.ty);
case VaEnd ap;
- // gen("\tcall void @llvm.va_end(ptr %v)\n", genref(f, ap).Addr);
+ let ap = genref(f, ap).Addr;
+ gen("\tcall void @llvm.va_end(ptr %v)\n", &ap);
return nop();
case Stmt block;
@@ -1082,7 +1088,11 @@ fn genstmt(f *Fn, block *Block, st *Stmt) void {
case Some *e;
let retty = f.ty.u.Fn.ret;
let it = convert(f, retty, e);
- gen("\tret %t %v\n", retty, &it);
+ if retty->is(:Void) {
+ gen("\tret void\n");
+ } else {
+ gen("\tret %t %v\n", retty, &it);
+ }
}
case ISwitch *sw;
static swid int = {};