NimMain/NimPreMain calls are now only volatile when it makes sense. (#20882)
This commit is contained in:
parent
27d9c67352
commit
fc37554795
1 changed files with 31 additions and 49 deletions
|
|
@ -211,6 +211,10 @@ macro ropecg(m: BModule, frmt: static[FormatStr], args: untyped): Rope =
|
||||||
let ident = args[j-1]
|
let ident = args[j-1]
|
||||||
flushStrLit()
|
flushStrLit()
|
||||||
result.add newCall(formatValue, resVar, newCall(ident"cgsymValue", m, ident))
|
result.add newCall(formatValue, resVar, newCall(ident"cgsymValue", m, ident))
|
||||||
|
elif frmt[i] == '#' and frmt[i+1] == '#':
|
||||||
|
inc(i, 2)
|
||||||
|
strLit.add("#")
|
||||||
|
|
||||||
var start = i
|
var start = i
|
||||||
while i < frmt.len:
|
while i < frmt.len:
|
||||||
if frmt[i] != '$' and frmt[i] != '#': inc(i)
|
if frmt[i] != '$' and frmt[i] != '#': inc(i)
|
||||||
|
|
@ -1413,24 +1417,21 @@ proc genMainProc(m: BModule) =
|
||||||
# prevents inlining of the NimMainInner function and dependent
|
# prevents inlining of the NimMainInner function and dependent
|
||||||
# functions, which might otherwise merge their stack frames.
|
# functions, which might otherwise merge their stack frames.
|
||||||
|
|
||||||
PreMainVolatileBody =
|
PreMainBody = "$N" &
|
||||||
"\tvoid (*volatile inner)(void);$N" &
|
|
||||||
"\tinner = $3PreMainInner;$N" &
|
|
||||||
"$1" &
|
|
||||||
"\t(*inner)();$N"
|
|
||||||
|
|
||||||
PreMainNonVolatileBody =
|
|
||||||
"$1" &
|
|
||||||
"\t$3PreMainInner();$N"
|
|
||||||
|
|
||||||
PreMainBodyStart = "$N" &
|
|
||||||
"N_LIB_PRIVATE void $3PreMainInner(void) {$N" &
|
"N_LIB_PRIVATE void $3PreMainInner(void) {$N" &
|
||||||
"$2" &
|
"$2" &
|
||||||
"}$N$N" &
|
"}$N$N" &
|
||||||
"$4" &
|
"$4" &
|
||||||
"N_LIB_PRIVATE void $3PreMain(void) {$N"
|
"N_LIB_PRIVATE void $3PreMain(void) {$N" &
|
||||||
|
"\t##if $5$N" & # 1 for volatile call, 0 for non-volatile
|
||||||
PreMainBodyEnd =
|
"\tvoid (*volatile inner)(void);$N" &
|
||||||
|
"\tinner = $3PreMainInner;$N" &
|
||||||
|
"$1" &
|
||||||
|
"\t(*inner)();$N" &
|
||||||
|
"\t##else$N" &
|
||||||
|
"$1" &
|
||||||
|
"\t$3PreMainInner();$N" &
|
||||||
|
"\t##endif$N" &
|
||||||
"}$N$N"
|
"}$N$N"
|
||||||
|
|
||||||
MainProcs =
|
MainProcs =
|
||||||
|
|
@ -1443,32 +1444,23 @@ proc genMainProc(m: BModule) =
|
||||||
"$1" &
|
"$1" &
|
||||||
"}$N$N"
|
"}$N$N"
|
||||||
|
|
||||||
NimMainVolatileBody =
|
NimMainProc =
|
||||||
|
"N_CDECL(void, $5NimMain)(void) {$N" &
|
||||||
|
"\t##if $6$N" & # 1 for volatile call, 0 for non-volatile
|
||||||
"\tvoid (*volatile inner)(void);$N" &
|
"\tvoid (*volatile inner)(void);$N" &
|
||||||
"$4" &
|
"$4" &
|
||||||
"\tinner = $5NimMainInner;$N" &
|
"\tinner = $5NimMainInner;$N" &
|
||||||
"$2" &
|
"$2" &
|
||||||
"\t(*inner)();$N"
|
"\t(*inner)();$N" &
|
||||||
|
"\t##else$N" &
|
||||||
NimMainNonVolatileBody =
|
|
||||||
"$4" &
|
"$4" &
|
||||||
"$2" &
|
"$2" &
|
||||||
"\t$5NimMainInner();$N"
|
"\t$5NimMainInner();$N" &
|
||||||
|
"\t##endif$N" &
|
||||||
NimMainProcStart =
|
|
||||||
"N_CDECL(void, $5NimMain)(void) {$N"
|
|
||||||
|
|
||||||
NimMainProcEnd =
|
|
||||||
"}$N$N"
|
"}$N$N"
|
||||||
|
|
||||||
NimMainProc = NimMainProcStart & NimMainVolatileBody & NimMainProcEnd
|
|
||||||
|
|
||||||
NimSlimMainProc = NimMainProcStart & NimMainNonVolatileBody & NimMainProcEnd
|
|
||||||
|
|
||||||
NimMainBody = NimMainInner & NimMainProc
|
NimMainBody = NimMainInner & NimMainProc
|
||||||
|
|
||||||
NimSlimMainBody = NimMainInner & NimSlimMainProc
|
|
||||||
|
|
||||||
PosixCMain =
|
PosixCMain =
|
||||||
"int main(int argc, char** args, char** env) {$N" &
|
"int main(int argc, char** args, char** env) {$N" &
|
||||||
"\tcmdLine = args;$N" &
|
"\tcmdLine = args;$N" &
|
||||||
|
|
@ -1532,42 +1524,32 @@ proc genMainProc(m: BModule) =
|
||||||
if m.config.target.targetOS == osStandalone or m.config.selectedGC in {gcNone, gcArc, gcOrc}: "".rope
|
if m.config.target.targetOS == osStandalone or m.config.selectedGC in {gcNone, gcArc, gcOrc}: "".rope
|
||||||
else: ropecg(m, "\t#initStackBottomWith((void *)&inner);$N", [])
|
else: ropecg(m, "\t#initStackBottomWith((void *)&inner);$N", [])
|
||||||
inc(m.labels)
|
inc(m.labels)
|
||||||
if m.config.selectedGC notin {gcNone, gcArc, gcOrc}:
|
|
||||||
appcg(m, m.s[cfsProcs], PreMainBodyStart & PreMainVolatileBody & PreMainBodyEnd, [m.g.mainDatInit, m.g.otherModsInit, m.config.nimMainPrefix, posixCmdLine])
|
let isVolatile = if m.config.selectedGC notin {gcNone, gcArc, gcOrc}: "1" else: "0"
|
||||||
else:
|
appcg(m, m.s[cfsProcs], PreMainBody, [m.g.mainDatInit, m.g.otherModsInit, m.config.nimMainPrefix, posixCmdLine, isVolatile])
|
||||||
appcg(m, m.s[cfsProcs], PreMainBodyStart & PreMainNonVolatileBody & PreMainBodyEnd, [m.g.mainDatInit, m.g.otherModsInit, m.config.nimMainPrefix, posixCmdLine])
|
|
||||||
|
|
||||||
if m.config.target.targetOS == osWindows and
|
if m.config.target.targetOS == osWindows and
|
||||||
m.config.globalOptions * {optGenGuiApp, optGenDynLib} != {}:
|
m.config.globalOptions * {optGenGuiApp, optGenDynLib} != {}:
|
||||||
if optGenGuiApp in m.config.globalOptions:
|
if optGenGuiApp in m.config.globalOptions:
|
||||||
const nimMain = WinNimMain
|
const nimMain = WinNimMain
|
||||||
appcg(m, m.s[cfsProcs], nimMain,
|
appcg(m, m.s[cfsProcs], nimMain,
|
||||||
[m.g.mainModInit, initStackBottomCall, m.labels, preMainCode, m.config.nimMainPrefix])
|
[m.g.mainModInit, initStackBottomCall, m.labels, preMainCode, m.config.nimMainPrefix, isVolatile])
|
||||||
else:
|
else:
|
||||||
const nimMain = WinNimDllMain
|
const nimMain = WinNimDllMain
|
||||||
appcg(m, m.s[cfsProcs], nimMain,
|
appcg(m, m.s[cfsProcs], nimMain,
|
||||||
[m.g.mainModInit, initStackBottomCall, m.labels, preMainCode, m.config.nimMainPrefix])
|
[m.g.mainModInit, initStackBottomCall, m.labels, preMainCode, m.config.nimMainPrefix, isVolatile])
|
||||||
elif m.config.target.targetOS == osGenode:
|
elif m.config.target.targetOS == osGenode:
|
||||||
const nimMain = GenodeNimMain
|
const nimMain = GenodeNimMain
|
||||||
appcg(m, m.s[cfsProcs], nimMain,
|
appcg(m, m.s[cfsProcs], nimMain,
|
||||||
[m.g.mainModInit, initStackBottomCall, m.labels, preMainCode, m.config.nimMainPrefix])
|
[m.g.mainModInit, initStackBottomCall, m.labels, preMainCode, m.config.nimMainPrefix, isVolatile])
|
||||||
elif optGenDynLib in m.config.globalOptions:
|
elif optGenDynLib in m.config.globalOptions:
|
||||||
const nimMain = PosixNimDllMain
|
const nimMain = PosixNimDllMain
|
||||||
appcg(m, m.s[cfsProcs], nimMain,
|
appcg(m, m.s[cfsProcs], nimMain,
|
||||||
[m.g.mainModInit, initStackBottomCall, m.labels, preMainCode, m.config.nimMainPrefix])
|
[m.g.mainModInit, initStackBottomCall, m.labels, preMainCode, m.config.nimMainPrefix, isVolatile])
|
||||||
elif m.config.target.targetOS == osStandalone:
|
else:
|
||||||
const nimMain = NimMainBody
|
const nimMain = NimMainBody
|
||||||
appcg(m, m.s[cfsProcs], nimMain,
|
appcg(m, m.s[cfsProcs], nimMain,
|
||||||
[m.g.mainModInit, initStackBottomCall, m.labels, preMainCode, m.config.nimMainPrefix])
|
[m.g.mainModInit, initStackBottomCall, m.labels, preMainCode, m.config.nimMainPrefix, isVolatile])
|
||||||
else:
|
|
||||||
if m.config.selectedGC notin {gcNone, gcArc, gcOrc}:
|
|
||||||
const nimMain = NimMainBody
|
|
||||||
appcg(m, m.s[cfsProcs], nimMain,
|
|
||||||
[m.g.mainModInit, initStackBottomCall, m.labels, preMainCode, m.config.nimMainPrefix])
|
|
||||||
else:
|
|
||||||
const nimMain = NimSlimMainBody
|
|
||||||
appcg(m, m.s[cfsProcs], nimMain,
|
|
||||||
[m.g.mainModInit, initStackBottomCall, m.labels, preMainCode, m.config.nimMainPrefix])
|
|
||||||
|
|
||||||
if optNoMain notin m.config.globalOptions:
|
if optNoMain notin m.config.globalOptions:
|
||||||
if m.config.cppCustomNamespace.len > 0:
|
if m.config.cppCustomNamespace.len > 0:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue