diff options
author | Michael Forney <mforney@mforney.org> | 2024-04-27 14:29:02 -0700 |
---|---|---|
committer | Michael Forney <mforney@mforney.org> | 2024-04-27 14:29:02 -0700 |
commit | 487079af3d6f39b379f52f7e0ea6edec63587e5b (patch) | |
tree | 7c265c8a5097032794479435290e7b1e0975d243 | |
parent | 52c17530f2e2dbc61a3bf1d4950c8b9eaeab86de (diff) |
qbe: Add extra size for strict alignment with QBE instruction
With upcoming VLA support, the size might not be constant.
-rw-r--r-- | qbe.c | 7 | ||||
-rw-r--r-- | test/alignas-local-32.qbe | 11 | ||||
-rw-r--r-- | test/alignas-local-strict.c (renamed from test/alignas-local-32.c) | 0 | ||||
-rw-r--r-- | test/alignas-local-strict.qbe | 12 |
4 files changed, 15 insertions, 15 deletions
@@ -268,24 +268,23 @@ funcalloc(struct func *f, struct decl *d) enum instkind op; struct block *end; struct value *v; - unsigned long long size; int align; assert(!d->type->incomplete); assert(d->type->size > 0); end = f->end; f->end = f->start; - size = d->type->size; + v = mkintconst(d->type->size); align = d->u.obj.align; switch (align) { case 1: case 2: case 4: op = IALLOC4; break; case 8: op = IALLOC8; break; - default: size += align - 16; /* fallthrough */ + default: v = funcinst(f, IADD, ptrclass, v, mkintconst(align - 16)); /* fallthrough */ case 16: op = IALLOC16; break; } - v = funcinst(f, op, ptrclass, mkintconst(size), NULL); + v = funcinst(f, op, ptrclass, v, NULL); if (align > 16) { /* TODO: implement alloc32 in QBE and use that instead */ v = funcinst(f, IADD, ptrclass, v, mkintconst(align - 16)); diff --git a/test/alignas-local-32.qbe b/test/alignas-local-32.qbe deleted file mode 100644 index 53bfab3..0000000 --- a/test/alignas-local-32.qbe +++ /dev/null @@ -1,11 +0,0 @@ -export -function w $main() { -@start.1 - %.1 =l alloc16 17 - %.2 =l add %.1, 16 - %.3 =l and %.2, 18446744073709551584 -@body.2 - %.4 =l extsw 32 - %.5 =l urem %.3, %.4 - ret %.5 -} diff --git a/test/alignas-local-32.c b/test/alignas-local-strict.c index e390713..e390713 100644 --- a/test/alignas-local-32.c +++ b/test/alignas-local-strict.c diff --git a/test/alignas-local-strict.qbe b/test/alignas-local-strict.qbe new file mode 100644 index 0000000..8c725ff --- /dev/null +++ b/test/alignas-local-strict.qbe @@ -0,0 +1,12 @@ +export +function w $main() { +@start.1 + %.1 =l add 1, 16 + %.2 =l alloc16 %.1 + %.3 =l add %.2, 16 + %.4 =l and %.3, 18446744073709551584 +@body.2 + %.5 =l extsw 32 + %.6 =l urem %.4, %.5 + ret %.6 +} |