bugfixes for ROD file generation; nimcache dir is now flat
This commit is contained in:
parent
69e0acb761
commit
7ebaf44897
12 changed files with 104 additions and 75 deletions
|
|
@ -16,7 +16,14 @@ import
|
|||
nimsets, syntaxes, times, rodread, semthreads, idgen
|
||||
|
||||
type
|
||||
TPassComm* = object {.pure.} ## communication object between passes
|
||||
optimizers*: TSymSeq ## filled by semantic pass; used in HLO
|
||||
PPassComm* = ref TPassComm
|
||||
|
||||
TPassContext* = object of TObject # the pass's context
|
||||
comm*: PPassComm
|
||||
fromCache*: bool # true if created by "openCached"
|
||||
|
||||
PPassContext* = ref TPassContext
|
||||
TPass* = tuple[
|
||||
open: proc (module: PSym, filename: string): PPassContext,
|
||||
|
|
@ -78,17 +85,28 @@ proc registerPass(p: TPass) =
|
|||
gPasses[gPassesLen] = p
|
||||
inc(gPassesLen)
|
||||
|
||||
proc newPassComm(): PPassComm =
|
||||
new(result)
|
||||
result.optimizers = @[]
|
||||
|
||||
proc openPasses(a: var TPassContextArray, module: PSym, filename: string) =
|
||||
var comm = newPassComm()
|
||||
for i in countup(0, gPassesLen - 1):
|
||||
if not isNil(gPasses[i].open): a[i] = gPasses[i].open(module, filename)
|
||||
if not isNil(gPasses[i].open):
|
||||
a[i] = gPasses[i].open(module, filename)
|
||||
if a[i] != nil: a[i].comm = comm
|
||||
else: a[i] = nil
|
||||
|
||||
proc openPassesCached(a: var TPassContextArray, module: PSym, filename: string,
|
||||
rd: PRodReader) =
|
||||
var comm = newPassComm()
|
||||
for i in countup(0, gPassesLen - 1):
|
||||
if not isNil(gPasses[i].openCached):
|
||||
a[i] = gPasses[i].openCached(module, filename, rd)
|
||||
else:
|
||||
if a[i] != nil:
|
||||
a[i].comm = comm
|
||||
a[i].fromCache = true
|
||||
else:
|
||||
a[i] = nil
|
||||
|
||||
proc closePasses(a: var TPassContextArray) =
|
||||
|
|
@ -110,7 +128,7 @@ proc processTopLevelStmtCached(n: PNode, a: var TPassContextArray) =
|
|||
if not isNil(gPasses[i].openCached): m = gPasses[i].process(a[i], m)
|
||||
|
||||
proc closePassesCached(a: var TPassContextArray) =
|
||||
var m = ast.emptyNode
|
||||
var m: PNode = nil
|
||||
for i in countup(0, gPassesLen - 1):
|
||||
if not isNil(gPasses[i].openCached) and not isNil(gPasses[i].close):
|
||||
m = gPasses[i].close(a[i], m)
|
||||
|
|
@ -144,7 +162,7 @@ proc processModule(module: PSym, filename: string, stream: PLLStream,
|
|||
IDsynchronizationPoint(1000)
|
||||
else:
|
||||
openPassesCached(a, module, filename, rd)
|
||||
var n = loadInitSection(rd) #MessageOut('init section' + renderTree(n));
|
||||
var n = loadInitSection(rd)
|
||||
for i in countup(0, sonsLen(n) - 1): processTopLevelStmtCached(n.sons[i], a)
|
||||
closePassesCached(a)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue