Merge pull request #1481 from rbehrends/fix-stackscan2

Fix stack bottom initialization for non-main modules.
This commit is contained in:
Andreas Rumpf 2014-08-14 09:16:26 +02:00
commit d8f6a2adcb

View file

@ -949,12 +949,23 @@ proc genFilenames(m: BModule): PRope =
proc genMainProc(m: BModule) = proc genMainProc(m: BModule) =
const const
# The use of a volatile function pointer to call Pre/NimMainInner
# prevents inlining of the NimMainInner function and dependent
# functions, which might otherwise merge their stack frames.
PreMainBody = PreMainBody =
"\tsystemDatInit();$N" & "void PreMainInner() {$N" &
"\tsystemInit();$N" & "\tsystemInit();$N" &
"$1" & "$1" &
"$2" & "$2" &
"$3" "$3" &
"}$N$N" &
"void PreMain() {$N" &
"\tvoid (*volatile inner)();$N" &
"\tsystemDatInit();$N" &
"\tinner = PreMainInner;$N" &
"$4" &
"\t(*inner)();$N" &
"}$N$N"
MainProcs = MainProcs =
"\tNimMain();$N" "\tNimMain();$N"
@ -962,9 +973,6 @@ proc genMainProc(m: BModule) =
MainProcsWithResult = MainProcsWithResult =
MainProcs & "\treturn nim_program_result;$N" MainProcs & "\treturn nim_program_result;$N"
# The use of a volatile function pointer to call NimMainInner
# prevents inlining of the NimMainInner function and dependent
# functions, which might otherwise merge their stack frames.
NimMainBody = NimMainBody =
"N_CDECL(void, NimMainInner)(void) {$N" & "N_CDECL(void, NimMainInner)(void) {$N" &
"$1" & "$1" &
@ -1047,8 +1055,8 @@ proc genMainProc(m: BModule) =
platform.targetOS == osStandalone: "".toRope platform.targetOS == osStandalone: "".toRope
else: ropecg(m, "\t#initStackBottomWith((void *)&inner);$N") else: ropecg(m, "\t#initStackBottomWith((void *)&inner);$N")
inc(m.labels) inc(m.labels)
appcg(m, m.s[cfsProcs], "void PreMain() {$N" & PreMainBody & "}$N$N", [ appcg(m, m.s[cfsProcs], PreMainBody, [
mainDatInit, gBreakpoints, otherModsInit]) mainDatInit, gBreakpoints, otherModsInit, initStackBottomCall])
appcg(m, m.s[cfsProcs], nimMain, [mainModInit, initStackBottomCall, toRope(m.labels)]) appcg(m, m.s[cfsProcs], nimMain, [mainModInit, initStackBottomCall, toRope(m.labels)])
if optNoMain notin gGlobalOptions: if optNoMain notin gGlobalOptions: