diff options
| author | 2022-08-25 11:26:13 +0200 | |
|---|---|---|
| committer | 2022-08-25 11:26:13 +0200 | |
| commit | 90a57be9d1cf811ba26c09d6c8ac9f27067a5f85 (patch) | |
| tree | 088b271b50d9d39e6cc2ef82c5726a401d486447 /src/llvm.cff | |
| parent | f49ee40f689e86d7dc09bb9cc2d978b365a2df8b (diff) | |
slen, sptr, complete method type stuff
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); |