diff options
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | src/llvm.cff | 13 |
2 files changed, 9 insertions, 6 deletions
@@ -37,6 +37,6 @@ build/%.o: %.cff @echo -e '\e[1mCFFC\e[0m' '\e[32m'"$<"'\e[0m' '->' '\e[34m'"$@"'\e[0m' $V$(CFFC) $< -o $@.ll $Vset -euo pipefail;\ - (opt -Oz -opaque-pointers $@.ll | llc --relocation-model=pic -opaque-pointers | as - -o $@) || ($(RM) $@; false) + (opt -O0 -opaque-pointers $@.ll | llc --relocation-model=dynamic-no-pic -opaque-pointers | as - -o $@) || ($(RM) $@; false) diff --git a/src/llvm.cff b/src/llvm.cff index 789db91..def9346 100644 --- a/src/llvm.cff +++ b/src/llvm.cff @@ -572,7 +572,8 @@ fn genexpr(f *Fn, ex *Expr) Value { let $l = gentmp(ty_isize, "ptrtoint ptr %v to %t", &lhs, ty_isize); let $r = gentmp(ty_isize, "ptrtoint ptr %v to %t", &rhs, ty_isize); let $diff = gentmp(ty_isize, "sub %t %v, %v", ty_isize, &$l, &$r); - let $res = gentmp(ty_isize, "sdiv %t %v, %v", ty_isize, &$l, &$r); + let $res = gentmp(ty_isize, "sdiv %t %v, %z", ty_isize, &$diff, + lhs.ty.u.Ptr == ty_void ? 1 : lhs.ty.u.Ptr.size); return $res; } else { assert(#f, "bad sub"); @@ -619,7 +620,6 @@ fn genexpr(f *Fn, ex *Expr) Value { case '='; let ref = genref(f, b.lhs); let rhs = convert(f, b.lhs.ty, b.rhs); - gen("; %t\n",b.lhs.ty); genstore(f, ref, rhs); return genload(f, ref); // load again because value could have overflowed when storing it @@ -1080,18 +1080,21 @@ fn genstmt(f *Fn, block *Block, st *Stmt) void { case For loop; genblock(f, loop.ini); - gen("\tbr label %%Cont%d\n", loop.id); - gen("Cont%d:", loop.id); + gen("\tbr label %%Test%d\n", loop.id); + gen("Test%d:", loop.id); nop(); let test = llvmbool(f, &loop.test); gen("\tbr i1 %v, label %%Next%d, label %%Brk%d\n", &test, loop.id, loop.id); gen("Next%d:", loop.id); nop(); genblock(f, loop.body); + gen("\tbr label %%Cont%d\n", loop.id); + gen("Cont%d:", loop.id); + nop(); if !loop.next->empty() { genexpr(f, &loop.next.Some); } - gen("\tbr label %%Cont%d\n", loop.id); + gen("\tbr label %%Test%d\n", loop.id); gen("Brk%d:",loop.id); nop(); |