From 475125eaba2852f88a4ee8d9be64c8b4964df3a9 Mon Sep 17 00:00:00 2001 From: lemon Date: Fri, 26 Aug 2022 18:13:07 +0200 Subject: array statics --- src/llvm.cff | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/llvm.cff b/src/llvm.cff index 16abb93..8ff32ba 100644 --- a/src/llvm.cff +++ b/src/llvm.cff @@ -1163,6 +1163,11 @@ extern fn llvm_genfn(externp bool, name *const u8, f *Fn) void { gen("}\n"); } +struct I64Traits { + fn hash(x i64) u32 { return x ^ 7; } + fn eq(a i64, b i64) bool { return a == b; } +} + fn gendata(ty *const Type, ex *Expr) void { fold(ex); switch ex.u { @@ -1178,6 +1183,29 @@ fn gendata(ty *const Type, ex *Expr) void { strs->push(s); return gen("@.str.%z", strs.len - 1); } + case ArrIni ini; + assert(ty->is(:Arr), "not arr arr ini"); + + let map Map = {}; + defer map->clear(); + foreach (idx, i, ini.idxs) { + map->put(idx, &ini.exs[i]); + } + gen("[ "); + for let i = 0i64; i < ty.u.Arr.length; ++i { + gen("%t ", ty.u.Arr.child); + let ex **Expr = map->get(i); + if ex { + gendata(ty.u.Arr.child, *ex); + } else { + gen("zeroinitializer"); + } + if i < ty.u.Arr.length - 1 { + gen(", "); + } + } + gen(" ]"); + return; } assert(#f, "bad static"); } -- cgit v1.2.3