aboutsummaryrefslogtreecommitdiff
path: root/parse.c
diff options
context:
space:
mode:
authorQuentin Carbonneaux <[email protected]>2022-12-18 17:35:19 +0100
committerQuentin Carbonneaux <[email protected]>2022-12-25 16:37:33 +0100
commit5e9726946dcb9248dbd34ded1bdd4f7af8dc2d31 (patch)
tree9842f9837784911e386357af18b08a2ca1b69896 /parse.c
parentc5cd65261e05029889450ca27050785504164853 (diff)
new UNDEF Ref
Crashing loads of uninitialized memory proved to be a problem when implementing unions using qbe. This patch introduces a new UNDEF Ref to represent data that is known to be uninitialized. Optimization passes can make use of it to eliminate some code. In the last compilation stages, UNDEF is treated as the constant 0xdeaddead.
Diffstat (limited to 'parse.c')
-rw-r--r--parse.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/parse.c b/parse.c
index 68488a2..aed9427 100644
--- a/parse.c
+++ b/parse.c
@@ -867,7 +867,7 @@ parsefn(Lnk *lnk)
curi = insb;
curf = alloc(sizeof *curf);
curf->ntmp = 0;
- curf->ncon = 1; /* first constant must be 0 */
+ curf->ncon = 2;
curf->tmp = vnew(curf->ntmp, sizeof curf->tmp[0], PFn);
curf->con = vnew(curf->ncon, sizeof curf->con[0], PFn);
for (i=0; i<Tmp0; ++i)
@@ -876,6 +876,8 @@ parsefn(Lnk *lnk)
else
newtmp(0, Kl, curf);
curf->con[0].type = CBits;
+ curf->con[0].bits.i = 0xdeaddead; /* UNDEF */
+ curf->con[1].type = CBits;
curf->lnk = *lnk;
blink = &curf->start;
curf->retty = Kx;
@@ -1230,7 +1232,10 @@ printref(Ref r, Fn *fn, FILE *f)
fprintf(f, "%%%s", fn->tmp[r.val].name);
break;
case RCon:
- printcon(&fn->con[r.val], f);
+ if (req(r, UNDEF))
+ fprintf(f, "UNDEF");
+ else
+ printcon(&fn->con[r.val], f);
break;
case RSlot:
fprintf(f, "S%d", rsval(r));