qbe

Internal scc patchset buffer for QBE
Log | Files | Refs | README | LICENSE

commit 486915f50140c253ad649bf5ac2f3eef0a0464b6
parent d1f048bc9c8eacc5fb34ce39346de8f5388a201b
Author: Quentin Carbonneaux <quentin.carbonneaux@yale.edu>
Date:   Sun, 25 Oct 2015 14:12:40 -0400

print memory references in IR dumps

Diffstat:
Mlisc/parse.c | 54+++++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 41 insertions(+), 13 deletions(-)

diff --git a/lisc/parse.c b/lisc/parse.c @@ -797,8 +797,28 @@ 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; } }