IC: fixes a long standing bug about DCE set computations (#17763)
This commit is contained in:
parent
42c6eec4ef
commit
c7b77829fe
1 changed files with 33 additions and 25 deletions
|
|
@ -104,14 +104,35 @@ proc aliveSymsChanged(config: ConfigRef; position: int; alive: AliveSyms): bool
|
||||||
let oldAsSet = toPackedSet[int32](oldData)
|
let oldAsSet = toPackedSet[int32](oldData)
|
||||||
let newAsSet = toPackedSet[int32](s)
|
let newAsSet = toPackedSet[int32](s)
|
||||||
echo "set of live symbols changed ", asymFile.changeFileExt("rod"), " ", position, " ", f2.err
|
echo "set of live symbols changed ", asymFile.changeFileExt("rod"), " ", position, " ", f2.err
|
||||||
echo "in old but not in new ", oldAsSet.difference(newAsSet)
|
echo "in old but not in new ", oldAsSet.difference(newAsSet), " number of entries in old ", oldAsSet.len
|
||||||
echo "in new but not in old ", newAsSet.difference(oldAsSet)
|
echo "in new but not in old ", newAsSet.difference(oldAsSet), " number of entries in new ", newAsSet.len
|
||||||
|
#if execShellCmd(getAppFilename() & " rod " & quoteShell(asymFile.changeFileExt("rod"))) != 0:
|
||||||
if execShellCmd(getAppFilename() & " rod " & quoteShell(asymFile.changeFileExt("rod"))) != 0:
|
# echo "command failed"
|
||||||
echo "command failed"
|
|
||||||
result = true
|
result = true
|
||||||
storeAliveSymsImpl(asymFile, s)
|
storeAliveSymsImpl(asymFile, s)
|
||||||
|
|
||||||
|
proc genPackedModule(g: ModuleGraph, i: int; alive: var AliveSyms) =
|
||||||
|
# case statement here to enforce exhaustive checks.
|
||||||
|
case g.packed[i].status
|
||||||
|
of undefined:
|
||||||
|
discard "nothing to do"
|
||||||
|
of loading, stored:
|
||||||
|
assert false
|
||||||
|
of storing, outdated:
|
||||||
|
storeAliveSyms(g.config, g.packed[i].module.position, alive)
|
||||||
|
generateCodeForModule(g, g.packed[i], alive)
|
||||||
|
closeRodFile(g, g.packed[i].module)
|
||||||
|
of loaded:
|
||||||
|
if g.packed[i].loadedButAliveSetChanged:
|
||||||
|
generateCodeForModule(g, g.packed[i], alive)
|
||||||
|
else:
|
||||||
|
addFileToLink(g.config, g.packed[i].module)
|
||||||
|
replayTypeInfo(g, g.packed[i], FileIndex(i))
|
||||||
|
|
||||||
|
if g.backend == nil:
|
||||||
|
g.backend = cgendata.newModuleList(g)
|
||||||
|
registerInitProcs(BModuleList(g.backend), g.packed[i].module, g.packed[i].fromDisk.backendFlags)
|
||||||
|
|
||||||
proc generateCode*(g: ModuleGraph) =
|
proc generateCode*(g: ModuleGraph) =
|
||||||
## The single entry point, generate C(++) code for the entire
|
## The single entry point, generate C(++) code for the entire
|
||||||
## Nim program aka `ModuleGraph`.
|
## Nim program aka `ModuleGraph`.
|
||||||
|
|
@ -143,24 +164,11 @@ proc generateCode*(g: ModuleGraph) =
|
||||||
setupBackendModule(g, g.packed[i])
|
setupBackendModule(g, g.packed[i])
|
||||||
|
|
||||||
# Second pass: Code generation.
|
# Second pass: Code generation.
|
||||||
|
let mainModuleIdx = g.config.projectMainIdx2.int
|
||||||
|
# We need to generate the main module last, because only then
|
||||||
|
# all init procs have been registered:
|
||||||
for i in 0..high(g.packed):
|
for i in 0..high(g.packed):
|
||||||
# case statement here to enforce exhaustive checks.
|
if i != mainModuleIdx:
|
||||||
case g.packed[i].status
|
genPackedModule(g, i, alive)
|
||||||
of undefined:
|
if mainModuleIdx >= 0:
|
||||||
discard "nothing to do"
|
genPackedModule(g, mainModuleIdx, alive)
|
||||||
of loading, stored:
|
|
||||||
assert false
|
|
||||||
of storing, outdated:
|
|
||||||
generateCodeForModule(g, g.packed[i], alive)
|
|
||||||
closeRodFile(g, g.packed[i].module)
|
|
||||||
storeAliveSyms(g.config, g.packed[i].module.position, alive)
|
|
||||||
of loaded:
|
|
||||||
if g.packed[i].loadedButAliveSetChanged:
|
|
||||||
generateCodeForModule(g, g.packed[i], alive)
|
|
||||||
else:
|
|
||||||
addFileToLink(g.config, g.packed[i].module)
|
|
||||||
replayTypeInfo(g, g.packed[i], FileIndex(i))
|
|
||||||
|
|
||||||
if g.backend == nil:
|
|
||||||
g.backend = cgendata.newModuleList(g)
|
|
||||||
registerInitProcs(BModuleList(g.backend), g.packed[i].module, g.packed[i].fromDisk.backendFlags)
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue