aboutsummaryrefslogtreecommitdiff
path: root/src/llvm.cff
diff options
context:
space:
mode:
Diffstat (limited to 'src/llvm.cff')
-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);