summary refs log tree commit diff stats
path: root/compiler/passes.nim
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/passes.nim')
-rwxr-xr-xcompiler/passes.nim26
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)