qbe

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

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:
Mall.h | 2+-
Mamd64/isel.c | 4+++-
Mutil.c | 6++++--
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