You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
void emit_code(Function *fn) {
// Assign an offset from RBP to each local variable.
int off = 0;
for (int i = 0; i < fn->lvars->len; i++) {
Var *var = fn->lvars->data[i];
off += var->ty->size;
off = roundup(off, var->ty->align); // (*)
var->offset = -off;
}
...
At the point (*), var->ty->ailgn may be 0. In such case, roundup() returns 0 regardless of off value and it causes the accumulation of the offset to break.
An example of the fix:
diff --git a/gen_x86.c b/gen_x86.c
index 5453e01..5aa2989 100644
--- a/gen_x86.c
+++ b/gen_x86.c
@@ -184,7 +184,8 @@ void emit_code(Function *fn) {
for (int i = 0; i < fn->lvars->len; i++) {
Var *var = fn->lvars->data[i];
off += var->ty->size;
- off = roundup(off, var->ty->align);
+ if (var->ty->ty != FUNC)
+ off = roundup(off, var->ty->align);
var->offset = -off;
}
diff --git a/util.c b/util.c
index a4d30d0..7bf0c5b 100644
--- a/util.c
+++ b/util.c
@@ -129,6 +129,7 @@ char *sb_get(StringBuilder *sb) {
}
int roundup(int x, int align) {
+ assert(align != 0);
return (x + align - 1) & ~(align - 1);
}
The text was updated successfully, but these errors were encountered:
At the point
(*)
,var->ty->ailgn
may be 0. In such case,roundup()
returns 0 regardless ofoff
value and it causes the accumulation of the offset to break.An example of the fix:
The text was updated successfully, but these errors were encountered: