From 90a57be9d1cf811ba26c09d6c8ac9f27067a5f85 Mon Sep 17 00:00:00 2001 From: lemon Date: Thu, 25 Aug 2022 11:26:13 +0200 Subject: slen, sptr, complete method type stuff --- src/llvm.cff | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'src/llvm.cff') 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); -- cgit v1.2.3