aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-25 10:49:24 +0200
committerlemon <lsof@mailbox.org>2022-08-25 10:49:24 +0200
commitf49ee40f689e86d7dc09bb9cc2d978b365a2df8b (patch)
tree1def031d071bf5ba7753b84284245dfa044035e7
parent128c854f4ecb5f158cce3d91bb266ab000f27d4b (diff)
aligns fix
-rw-r--r--src/llvm.cff3
-rw-r--r--src/parse.cff7
2 files changed, 5 insertions, 5 deletions
diff --git a/src/llvm.cff b/src/llvm.cff
index 81fe056..a81bea4 100644
--- a/src/llvm.cff
+++ b/src/llvm.cff
@@ -231,7 +231,8 @@ fn genaddr(f *Fn, ex *Expr) Value {
case Dot dot;
let lhs = dot.lhs.ty->is(:Ptr) ? genexpr(f, dot.lhs) : genaddr(f, dot.lhs);
- assert(dot.fld.off % dot.fld.ty.align == 0, "field align");
+ assert(dot.fld.off % dot.fld.ty.align == 0, "field align %s %zu %zu",
+ dot.fld.name, dot.fld.off, dot.fld.ty.align);
let idx int #?;
if dot.lhs.ty->is(:Ptr) {
idx = dot.fld - dot.lhs.ty.u.Ptr.u.Agg.flds.#ptr;
diff --git a/src/parse.cff b/src/parse.cff
index dc3cad3..85d9de5 100644
--- a/src/parse.cff
+++ b/src/parse.cff
@@ -739,15 +739,13 @@ fn parseagg(P *Parser, loc Loc, kind AggKind, name *const u8, retdecl **Decl) *c
havedecls = #t;
break;
}
- let off = size;
+ let off = kind == :Struct ? size : 0;
let name = (tok = lexexpects(P, :ident, "field name")).u.ident;
let type *const Type = #null;
if !(kind == :EUnion and lexpeek(P).t == ',') {
type = parsetype(P);
- if f0align < 0 {
- f0align = type.align;
- }
+ f0align = MAX(type.align, f0align);
}
if type != #null and !completetype(type) {
err(P, tok.loc, "field `%s' is of incomplete type (%t)", name, type);
@@ -758,6 +756,7 @@ fn parseagg(P *Parser, loc Loc, kind AggKind, name *const u8, retdecl **Decl) *c
size = kind == :Struct ? off + type.size
: MAX(size, type.size);
}
+ efmt("%s\t %s\t off %z\n", agg.name ?? "?", name, off);
flds->push({ name, type, off });
if !lexmatch(P, #null, ',') {