ref: 55689b41f0e746d20e0af174c8075ca29669a6f7
parent: d5b01a9692531e3c30ca659022574bdd5be0ac77
author: Ori Bernstein <[email protected]>
date: Sat Jul 28 16:00:54 EDT 2012
Align values.
--- a/8/simp.c
+++ b/8/simp.c
@@ -202,6 +202,19 @@
return s;
}
+static size_t min(size_t a, size_t b)
+{
+ if (a < b)
+ return a;
+ else
+ return b;
+}
+
+static size_t align(size_t sz, size_t align)
+{
+ return (sz + align - 1) & ~(align - 1);
+}
+
size_t tysize(Type *t)
{
size_t sz;
@@ -251,7 +264,7 @@
break;
case Tystruct:
for (i = 0; i < t->nmemb; i++)
- sz += size(t->sdecls[i]);
+ sz += align(size(t->sdecls[i]), Wordsz);
return sz;
break;
case Tyunion:
@@ -259,7 +272,7 @@
for (i = 0; i < t->nmemb; i++)
if (t->udecls[i]->etype)
sz = max(sz, tysize(t->udecls[i]->etype) + Wordsz);
- return sz;
+ return align(sz, Wordsz);
break;
case Tybad: case Tyvar: case Typaram: case Tyname: case Ntypes:
die("Type %s does not have size; why did it get down to here?", tystr(t));
@@ -1057,6 +1070,7 @@
{
assert(n->type == Ndecl);
s->stksz += size(n);
+ s->stksz = align(s->stksz, min(size(n), Wordsz));
if (debug)
printf("declare %s:%s(%zd) at %zd\n", declname(n), tystr(decltype(n)), n->decl.did, s->stksz);
htput(s->locs, n, (void*)s->stksz);
@@ -1065,6 +1079,7 @@
static void declarearg(Simp *s, Node *n)
{
assert(n->type == Ndecl);
+ s->argsz = align(s->argsz, min(size(n), Wordsz));
if (debug)
printf("declare %s(%zd) at %zd\n", declname(n), n->decl.did, -(s->argsz + 8));
htput(s->locs, n, (void*)-(s->argsz + 8));