commit 3da3815a674c922c520e013b30eb96c7491a5e85
parent 98cd2e817616fff14622b8e514fc88b378a100ef
Author: Quentin Carbonneaux <quentin@c9x.me>
Date: Fri, 30 Jul 2021 00:11:27 +0200
err when an address contains a sum $a+$b (afl)
Reported by Alessandro Mantovani.
These addresses are likely bogus, but
they triggered an unwarranted assertion
failure. We now raise a civilized error.
Diffstat:
3 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/all.h b/all.h
@@ -433,7 +433,7 @@ int phicls(int, Tmp *);
Ref newtmp(char *, int, Fn *);
void chuse(Ref, int, Fn *);
Ref getcon(int64_t, Fn *);
-void addcon(Con *, Con *);
+int addcon(Con *, Con *);
void blit(Ref, uint, Ref, uint, Fn *);
void dumpts(BSet *, Tmp *, FILE *);
diff --git a/amd64/isel.c b/amd64/isel.c
@@ -512,7 +512,9 @@ amatch(Addr *a, Ref r, int n, ANum *ai, Fn *fn)
Ref al, ar;
if (rtype(r) == RCon) {
- addcon(&a->offset, &fn->con[r.val]);
+ if (!addcon(&a->offset, &fn->con[r.val]))
+ err("unlikely sum of $%s and $%s",
+ str(a->offset.label), str(fn->con[r.val].label));
return 1;
}
assert(rtype(r) == RTmp);
diff --git a/util.c b/util.c
@@ -362,19 +362,21 @@ getcon(int64_t val, Fn *fn)
return CON(c);
}
-void
+int
addcon(Con *c0, Con *c1)
{
if (c0->type == CUndef)
*c0 = *c1;
else {
if (c1->type == CAddr) {
- assert(c0->type != CAddr && "adding two addresses");
+ if (c0->type == CAddr)
+ return 0;
c0->type = CAddr;
c0->label = c1->label;
}
c0->bits.i += c1->bits.i;
}
+ return 1;
}
void