aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-26 18:13:07 +0200
committerlemon <lsof@mailbox.org>2022-08-26 18:13:07 +0200
commit475125eaba2852f88a4ee8d9be64c8b4964df3a9 (patch)
treeddf327b31f495e00e4246dd852056c95f75ed46d
parent5ba53665c99c01f407576406b4c619d180efd384 (diff)
array statics
-rw-r--r--src/llvm.cff28
1 files changed, 28 insertions, 0 deletions
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<i64, *Expr, I64Traits> = {};
+ 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");
}