aboutsummaryrefslogtreecommitdiff
path: root/src/llvm.cff
diff options
context:
space:
mode:
Diffstat (limited to 'src/llvm.cff')
-rw-r--r--src/llvm.cff15
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);