From d3398afe7283f572203a5986f9db72aa795a2714 Mon Sep 17 00:00:00 2001 From: lemon Date: Thu, 1 Sep 2022 07:44:52 +0200 Subject: static bitfield initializers --- src/llvm.cff | 21 +++++++++++++++++++++ test/2.cff | 4 ++++ 2 files changed, 25 insertions(+) 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); diff --git a/test/2.cff b/test/2.cff index deb300c..43fc148 100644 --- a/test/2.cff +++ b/test/2.cff @@ -17,4 +17,8 @@ extern fn main() int { foo.num *= 10; printf("0x%X: %d, %d, %d\n", foo.#raw, foo.tag, foo.flag, foo.num += 532); let long = "abcd" "defg"; + + static const foop Foo = {7,#t,3, .tag: 9}; + printf("0x%X: %d, %d, %d\n", foop.#raw, foop.tag, foop.flag, foop.num); + } -- cgit v1.2.3