diff options
Diffstat (limited to 'compiler/passes.nim')
-rwxr-xr-x | compiler/passes.nim | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/compiler/passes.nim b/compiler/passes.nim index d5aeb50d1..1ce5ad2d3 100755 --- a/compiler/passes.nim +++ b/compiler/passes.nim @@ -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) |