From 2ca24f83c35b253593b5aa8775d37923c8383149 Mon Sep 17 00:00:00 2001 From: lemon Date: Sat, 3 Jun 2023 21:51:28 +0200 Subject: abi lowering pass --- irdump.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) (limited to 'irdump.c') diff --git a/irdump.c b/irdump.c index 6e84838..4ff3f61 100644 --- a/irdump.c +++ b/irdump.c @@ -22,10 +22,10 @@ prityp(union irtype typ) } } -static const char *builtinname[] = { +static const char *intrinname[] = { "?\??", #define _(b,...) #b, -#include "builtin.def" +#include "intrin.def" #undef _ }; @@ -35,9 +35,9 @@ dumpref(enum op o, union ref ref) struct xcon *con; switch (ref.t) { case RTMP: efmt("%%%d", ref.idx); break; - case RARG: efmt("%%arg%d", ref.idx); break; + case RPARAM: efmt("%%param%d", ref.idx); break; case RICON: - if (o == Obuiltin) efmt("\"%s\"", builtinname[ref.i]); + if (o == Ointrin) efmt("\"%s\"", intrinname[ref.i]); else efmt("%d", ref.i); break; case RXCON: @@ -53,10 +53,14 @@ dumpref(enum op o, union ref ref) } break; case RMORE: - if (o == Ocall || o == Obuiltin) { + if (o == Ocall || o == Ointrin) { struct call *call = &calltab.p[ref.idx]; + if (call->sret) { + efmt("sret "); + prityp(call->typs[call->narg]); + } for (int i = 0; i < call->narg; ++i) { - if (i > 0) efmt(", "); + if (i > 0 || call->sret) efmt(", "); if (call->vararg == i) efmt("..., "); prityp(call->typs[i]); @@ -142,18 +146,24 @@ irdump(struct function *fn, const char *fname) struct block *blk; efmt("function %s : %ty\n", fname, fn->fnty); - if (fn->abiarg) { - efmt("abi args: ("); + if (fn->abiarg || fn->retty.t != TYVOID) { + efmt("abi: ("); for (int i = 0; i < fn->nabiarg; ++i) { if (i > 0) efmt(", "); if (fn->abiarg[i].reg != -1) { - efmt("%%%ls", mctarg->rnames[fn->abiarg[i].reg]); + efmt("%ls", mctarg->rnames[fn->abiarg[i].reg]); } else { prityp(fn->abiarg[i].ty); efmt(" "); } } - efmt(")\n"); + efmt(")"); + if (fn->retty.t != TYVOID) { + efmt(" -> %ls", mctarg->rnames[fn->abiret[0].reg]); + if (fn->nabiret > 1) + efmt(", %ls", mctarg->rnames[fn->abiret[1].reg]); + } + efmt("\n"); } blk = fn->entry; do { -- cgit v1.2.3