diff options
author | Juan M Gómez <info@jmgomez.me> | 2023-05-23 19:10:24 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-23 20:10:24 +0200 |
commit | bdccc9fef93d6598ec453a19152c4e98539f783f (patch) | |
tree | 3ad3b8dcc388f3f0411c7928d010e06da6b96186 | |
parent | 125207019338d50acd810133350e9be84a1da35b (diff) | |
download | Nim-bdccc9fef93d6598ec453a19152c4e98539f783f.tar.gz |
small refactor in preparation to fix #21889 (#21892)
-rw-r--r-- | compiler/cgen.nim | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/compiler/cgen.nim b/compiler/cgen.nim index 0e6e02c7a..4b2d4fe09 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -623,6 +623,27 @@ proc treatGlobalDifferentlyForHCR(m: BModule, s: PSym): bool = # and s.owner.kind == skModule # owner isn't always a module (global pragma on local var) # and s.loc.k == locGlobalVar # loc isn't always initialized when this proc is used +proc genGlobalVarDecl(p: BProc, n: PNode; td, value: Rope; decl: var Rope) = + let s = n.sym + if s.constraint.isNil: + if s.kind in {skLet, skVar, skField, skForVar} and s.alignment > 0: + decl.addf "NIM_ALIGN($1) ", [rope(s.alignment)] + if p.hcrOn: decl.add("static ") + elif sfImportc in s.flags: decl.add("extern ") + elif lfExportLib in s.loc.flags: decl.add("N_LIB_EXPORT_VAR ") + else: decl.add("N_LIB_PRIVATE ") + if s.kind == skLet and value != "": decl.add("NIM_CONST ") + decl.add(td) + if p.hcrOn: decl.add("*") + if sfRegister in s.flags: decl.add(" register") + if sfVolatile in s.flags: decl.add(" volatile") + if sfNoalias in s.flags: decl.add(" NIM_NOALIAS") + else: + if value != "": + decl = runtimeFormat(s.cgDeclFrmt & " = $#;$n", [td, s.loc.r, value]) + else: + decl = runtimeFormat(s.cgDeclFrmt & ";$n", [td, s.loc.r]) + proc assignGlobalVar(p: BProc, n: PNode; value: Rope) = let s = n.sym if s.loc.k == locNone: @@ -649,19 +670,8 @@ proc assignGlobalVar(p: BProc, n: PNode; value: Rope) = else: var decl: Rope = "" var td = getTypeDesc(p.module, s.loc.t, dkVar) + genGlobalVarDecl(p, n, td, value, decl) if s.constraint.isNil: - if s.kind in {skLet, skVar, skField, skForVar} and s.alignment > 0: - decl.addf "NIM_ALIGN($1) ", [rope(s.alignment)] - if p.hcrOn: decl.add("static ") - elif sfImportc in s.flags: decl.add("extern ") - elif lfExportLib in s.loc.flags: decl.add("N_LIB_EXPORT_VAR ") - else: decl.add("N_LIB_PRIVATE ") - if s.kind == skLet and value != "": decl.add("NIM_CONST ") - decl.add(td) - if p.hcrOn: decl.add("*") - if sfRegister in s.flags: decl.add(" register") - if sfVolatile in s.flags: decl.add(" volatile") - if sfNoalias in s.flags: decl.add(" NIM_NOALIAS") if value != "": if p.module.compileToCpp and value.startsWith "{{}": # TODO: taking this branch, re"\{\{\}(,\s\{\})*\}" might be emitted, resulting in @@ -682,11 +692,7 @@ proc assignGlobalVar(p: BProc, n: PNode; value: Rope) = decl.addf(" $1 = $2;$n", [s.loc.r, value]) else: decl.addf(" $1;$n", [s.loc.r]) - else: - if value != "": - decl = runtimeFormat(s.cgDeclFrmt & " = $#;$n", [td, s.loc.r, value]) - else: - decl = runtimeFormat(s.cgDeclFrmt & ";$n", [td, s.loc.r]) + p.module.s[cfsVars].add(decl) if p.withinLoop > 0 and value == "": # fixes tests/run/tzeroarray: |