diff options
| -rw-r--r-- | src/llvm.cff | 28 |
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 = {}; |