diff --git a/compiler/ccgcalls.nim b/compiler/ccgcalls.nim index 242e9f5cf4..948f43ee16 100644 --- a/compiler/ccgcalls.nim +++ b/compiler/ccgcalls.nim @@ -249,13 +249,15 @@ proc openArrayLoc(p: BProc, formalType: PType, n: PNode): Rope = else: internalError(p.config, "openArrayLoc: " & typeToString(a.t)) proc withTmpIfNeeded(p: BProc, a: TLoc, needsTmp: bool): TLoc = - if needsTmp and a.lode.typ != nil: - var tmp: TLoc - getTemp(p, a.lode.typ, tmp, needsInit=false) - genAssignment(p, tmp, a, {}) - tmp + # Bug https://github.com/status-im/nimbus-eth2/issues/1549 + # Aliasing is preferred over stack overflows. + # Also don't regress for non ARC-builds, too risky. + if needsTmp and a.lode.typ != nil and p.config.selectedGC in {gcArc, gcOrc} and + getSize(p.config, a.lode.typ) < 1024: + getTemp(p, a.lode.typ, result, needsInit=false) + genAssignment(p, result, a, {}) else: - a + result = a proc genArgStringToCString(p: BProc, n: PNode, needsTmp: bool): Rope {.inline.} = var a: TLoc diff --git a/compiler/cgen.nim b/compiler/cgen.nim index 77fdde3132..ac977b32b2 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -471,6 +471,14 @@ proc getTemp(p: BProc, t: PType, result: var TLoc; needsInit=false) = result.storage = OnStack result.flags = {} constructLoc(p, result, not needsInit) + when false: + # XXX Introduce a compiler switch in order to detect these easily. + if getSize(p.config, t) > 1024 * 1024: + if p.prc != nil: + echo "ENORMOUS TEMPORARY! ", p.config $ p.prc.info + else: + echo "ENORMOUS TEMPORARY! ", p.config $ p.lastLineInfo + writeStackTrace() proc getTempCpp(p: BProc, t: PType, result: var TLoc; value: Rope) = inc(p.labels) diff --git a/tests/ccgbugs/targ_lefttoright.nim b/tests/ccgbugs/targ_lefttoright.nim index b107b23279..a49b877391 100644 --- a/tests/ccgbugs/targ_lefttoright.nim +++ b/tests/ccgbugs/targ_lefttoright.nim @@ -16,6 +16,7 @@ discard """ 2,2 1,2 ''' + cmd: "nim c --gc:orc $file" """ template test =