aboutsummaryrefslogtreecommitdiff
path: root/src/llvm.cff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-25 11:26:13 +0200
committerlemon <lsof@mailbox.org>2022-08-25 11:26:13 +0200
commit90a57be9d1cf811ba26c09d6c8ac9f27067a5f85 (patch)
tree088b271b50d9d39e6cc2ef82c5726a401d486447 /src/llvm.cff
parentf49ee40f689e86d7dc09bb9cc2d978b365a2df8b (diff)
slen, sptr, complete method type stuff
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);