diff options
-rw-r--r-- | compiler/ccgcalls.nim | 14 | ||||
-rw-r--r-- | compiler/cgen.nim | 8 | ||||
-rw-r--r-- | tests/ccgbugs/targ_lefttoright.nim | 1 |
3 files changed, 17 insertions, 6 deletions
diff --git a/compiler/ccgcalls.nim b/compiler/ccgcalls.nim index 242e9f5cf..948f43ee1 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 c2a31b775..15b85097c 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 b107b2327..a49b87739 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 = |