diff options
Diffstat (limited to 'src/llvm.cff')
| -rw-r--r-- | src/llvm.cff | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/llvm.cff b/src/llvm.cff index a81bea4..ba4b556 100644 --- a/src/llvm.cff +++ b/src/llvm.cff @@ -281,6 +281,8 @@ fn genaddr(f *Fn, ex *Expr) Value { fn convert(f *Fn, to *const Type, ex *Expr) Value { to = unconstify(to); let from = unconstify(ex.ty); + if to->is(:Enum) { to = to.u.Enum.intty; } + if from->is(:Enum) { from = from.u.Enum.intty; } defmacro cvt(inst) [ (do let t = mktmp(to), @@ -366,6 +368,7 @@ fn convert(f *Fn, to *const Type, ex *Expr) Value { return genexpr(f, ex); case else + efmt("%t %t\n",from,to); assert(#f, "convert"); } } @@ -657,6 +660,18 @@ fn genexpr(f *Fn, ex *Expr) Value { gen("\t%v = load %t, %t %v\n", tmp, ex.ty, addr.ty, addr); return tmp; + case SPtr sl; + let sl = genexpr(f, sl); + let ptr = mktmp(mkptrtype(sl.ty.u.Slice)); + gen("\t%v = extractvalue %t %v, 0\n", ptr, sl.ty, sl); + return ptr; + + case SLen sl; + let sl = genexpr(f, sl); + let len = mktmp(ty_usize); + gen("\t%v = extractvalue %t %v, 1\n", len, sl.ty, sl); + return len; + case EUTag; let tmp = mktmp(ex.ty); let addr = genaddr(f, ex); |