From e796314a24a6c887074c75ea4f1414fc19c35d80 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Fri, 16 Oct 2026 13:02:38 +0800 Subject: [PATCH] =?UTF-8?q?fix(gi):=20=E6=A8=A1=E5=9D=97=E7=BA=A7=E7=A9=BA?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E5=AD=97=E9=9D=A2=E9=87=8F=20=3D=20[]=20?= =?UTF-8?q?=E6=94=B9=E8=B5=B0=20zeroinitializer=20-=20=E4=BF=AE=E5=A4=A7?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E8=A2=AB=E9=80=90=E5=85=83=E7=B4=A0=E5=B1=95?= =?UTF-8?q?=E5=BC=80(=E5=85=83=E7=B4=A0=E8=BF=87=E5=A4=9A+=E6=B1=A0?= =?UTF-8?q?=E8=80=97=E5=B0=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/lib/core/Gen/TranslatorGenMixin.vp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/App/lib/core/Gen/TranslatorGenMixin.vp b/App/lib/core/Gen/TranslatorGenMixin.vp index fea52f2..ec6d3c9 100644 --- a/App/lib/core/Gen/TranslatorGenMixin.vp +++ b/App/lib/core/Gen/TranslatorGenMixin.vp @@ -762,12 +762,22 @@ novirtual class TranslatorGenMixin: viperlib.snprintf(init_buf, 48, "%lld", init_val) gv.Initializer = init_buf elif init_kind == 2: - # List literal -> array initializer [N x elem_ty] [elem_ty val0, ...] - arr_init: str = self._build_array_initializer_text(pool, var_ty, init_list_node) - if arr_init is not None: gv.Initializer = arr_init + # 空字面量 `= []`:整块清零 ⇒ 直接 zeroinitializer。 + # 若走下面的"逐元素展开",`[N]uint8` 这类大数组会生成**百万级**元素文本 + # (`[i8 0, i8 0, …]`)——既撞上 MLIR 侧上限(too many global array elements), + # 又让每个元素 ~5KB 的渲染开销把编译池吃光 + # (现场:n=1048576、src_head=[i8 0, i8 0, …]、[MEM] 池耗尽)。 + ln_c: ast.List* = ast.List*(init_list_node) + elts_c: list[ast.AST*]* = None + if ln_c is not None: elts_c = ln_c.elts + if init_list_node is None or elts_c is None or len(elts_c) == 0: + gv.Initializer = "zeroinitializer" else: - # Initializer build failed: error out (fail-fast) instead of falling back to zeroinitializer - self.Gen.TypeGenErr.fatal_error(node, f"failed to build the initializer of module-level variable '{var_name}'", "TypeError") + arr_init: str = self._build_array_initializer_text(pool, var_ty, init_list_node) + if arr_init is not None: gv.Initializer = arr_init + else: + # Initializer build failed: error out (fail-fast) instead of falling back + self.Gen.TypeGenErr.fatal_error(node, f"failed to build the initializer of module-level variable '{var_name}'", "TypeError") elif init_kind == 3: # String literal initializer: for array types (t.CArray[char, N]) use a byte-array # initializer (content + zero padding); a string-pointer GEP initializer would mismatch.