aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-09-01 07:44:52 +0200
committerlemon <lsof@mailbox.org>2022-09-01 07:44:52 +0200
commitd3398afe7283f572203a5986f9db72aa795a2714 (patch)
treea2daf413dca370e103fd369e636e6e85952a40f0 /src
parent8e85f9adcf63aefc0c8d1b825ad2d4a35584551d (diff)
static bitfield initializers
Diffstat (limited to 'src')
-rw-r--r--src/llvm.cff21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/llvm.cff b/src/llvm.cff
index b4ef10e..5bb39c5 100644
--- a/src/llvm.cff
+++ b/src/llvm.cff
@@ -1478,6 +1478,27 @@ fn gendata(ty *const Type, ex *Expr) void {
}
}
return;
+
+ case BitFIni ini;
+ if act == :type {
+ gen("%t", ex.ty);
+ return;
+ }
+
+ let acc u64 = 0;
+ foreach (fld, i, ini.flds) {
+ let ex = &ini.exs[i];
+ if !fold(ex) {
+ assert(#f, "er");
+ }
+ assert(ex.u.#tag == :BoolLit or ex.u.#tag == :IntLit, "bit field tag");
+ let n u64 = ex.u.#tag == :BoolLit ? as(u64)ex.u.BoolLit : ex.u.IntLit.u;
+ let mask = fld.size == 64 ? ~0u64 : ((1u64 << fld.size) - 1);
+ acc &= ~(mask << fld.off);
+ acc |= (n & mask) << fld.off;
+ }
+ gen("%I", acc);
+ return;
case else
assert(#f, "nyi static %d", ex.u.#tag);