diff options
author | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2015-10-25 14:12:40 -0400 |
---|---|---|
committer | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2015-10-30 13:20:42 -0400 |
commit | 486915f50140c253ad649bf5ac2f3eef0a0464b6 (patch) | |
tree | 33aaa092f982822feecadc6f64fa6af4fadf08ee | |
parent | d1f048bc9c8eacc5fb34ce39346de8f5388a201b (diff) | |
download | roux-486915f50140c253ad649bf5ac2f3eef0a0464b6.tar.gz |
print memory references in IR dumps
-rw-r--r-- | lisc/parse.c | 54 |
1 files 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 @@ -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; } } |