From 486915f50140c253ad649bf5ac2f3eef0a0464b6 Mon Sep 17 00:00:00 2001 From: Quentin Carbonneaux Date: Sun, 25 Oct 2015 14:12:40 -0400 Subject: print memory references in IR dumps --- lisc/parse.c | 54 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/lisc/parse.c b/lisc/parse.c index aa311c4..8b6f697 100644 --- a/lisc/parse.c +++ b/lisc/parse.c @@ -796,9 +796,29 @@ parse(FILE *f, void data(Dat *), void func(Fn *)) } } +static void +printcon(Con *c, FILE *f) +{ + switch (c->type) { + case CUndef: + break; + case CAddr: + fprintf(f, "$%s", c->label); + if (c->val) + fprintf(f, "%+"PRIi64, c->val); + break; + case CNum: + fprintf(f, "%"PRIi64, c->val); + break; + } +} + static void printref(Ref r, Fn *fn, FILE *f) { + int i; + Mem *m; + switch (rtype(r)) { case RTmp: if (r.val < Tmp0) @@ -807,18 +827,7 @@ printref(Ref r, Fn *fn, FILE *f) fprintf(f, "%%%s", fn->tmp[r.val].name); break; case RCon: - switch (fn->con[r.val].type) { - case CAddr: - fprintf(f, "$%s", fn->con[r.val].label); - if (fn->con[r.val].val) - fprintf(f, "%+"PRIi64, fn->con[r.val].val); - break; - case CNum: - fprintf(f, "%"PRIi64, fn->con[r.val].val); - break; - case CUndef: - diag("printref: invalid constant"); - } + printcon(&fn->con[r.val], f); break; case RSlot: fprintf(f, "S%d", r.val); @@ -830,7 +839,26 @@ printref(Ref r, Fn *fn, FILE *f) fprintf(f, ":%s", typ[r.val & AMask].name); break; case RAMem: - fprintf(f, "[]"); + i = 0; + m = &fn->mem[r.val & AMask]; + fputc('[', f); + if (m->offset.type != CUndef) { + printcon(&m->offset, f); + i = 1; + } + if (!req(m->base, R)) { + if (i) + fprintf(f, " + "); + printref(m->base, fn, f); + i = 1; + } + if (!req(m->index, R)) { + if (i) + fprintf(f, " + "); + fprintf(f, "%d * ", m->scale); + printref(m->index, fn, f); + } + fputc(']', f); break; } } -- cgit 1.4.1