summary refs log tree commit diff stats
path: root/compiler/ic/cbackend.nim
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2021-04-09 06:59:25 +0200
committerGitHub <noreply@github.com>2021-04-09 06:59:25 +0200
commit13b958eb45a3569acaa18f9381d28b8f37d42057 (patch)
tree846e4636e86ca13657646b8bdc9e92513e22fdc5 /compiler/ic/cbackend.nim
parente4b64eee894ddbf41935d3b8aeed1448cd2b5e46 (diff)
downloadNim-13b958eb45a3569acaa18f9381d28b8f37d42057.tar.gz
IC: added basic test case for methods (#17679)
* IC: added basic test case for methods

* IC: better methods test
Diffstat (limited to 'compiler/ic/cbackend.nim')
-rw-r--r--compiler/ic/cbackend.nim31
1 files changed, 26 insertions, 5 deletions
diff --git a/compiler/ic/cbackend.nim b/compiler/ic/cbackend.nim
index 9282ac466..2f3910b32 100644
--- a/compiler/ic/cbackend.nim
+++ b/compiler/ic/cbackend.nim
@@ -30,12 +30,16 @@ proc unpackTree(g: ModuleGraph; thisModule: int;
   var decoder = initPackedDecoder(g.config, g.cache)
   result = loadNodes(decoder, g.packed, thisModule, tree, n)
 
-proc generateCodeForModule(g: ModuleGraph; m: var LoadedModule; alive: var AliveSyms) =
+proc setupBackendModule(g: ModuleGraph; m: var LoadedModule) =
   if g.backend == nil:
     g.backend = cgendata.newModuleList(g)
-
+  assert g.backend != nil
   var bmod = cgen.newModule(BModuleList(g.backend), m.module, g.config)
   bmod.idgen = idgenFromLoadedModule(m)
+
+proc generateCodeForModule(g: ModuleGraph; m: var LoadedModule; alive: var AliveSyms) =
+  var bmod = BModuleList(g.backend).modules[m.module.position]
+  assert bmod != nil
   bmod.flags.incl useAliveDataFromDce
   bmod.alive = move alive[m.module.position]
 
@@ -118,6 +122,8 @@ proc generateCode*(g: ModuleGraph) =
     for i in 0..high(g.packed):
       echo i, " is of status ", g.packed[i].status, " ", toFullPath(g.config, FileIndex(i))
 
+  # First pass: Setup all the backend modules for all the modules that have
+  # changed:
   for i in 0..high(g.packed):
     # case statement here to enforce exhaustive checks.
     case g.packed[i].status
@@ -126,15 +132,30 @@ proc generateCode*(g: ModuleGraph) =
     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)
+      setupBackendModule(g, g.packed[i])
     of loaded:
       # Even though this module didn't change, DCE might trigger a change.
       # Consider this case: Module A uses symbol S from B and B does not use
       # S itself. A is then edited not to use S either. Thus we have to
       # recompile B in order to remove S from the final result.
       if aliveSymsChanged(g.config, g.packed[i].module.position, alive):
+        g.packed[i].loadedButAliveSetChanged = true
+        setupBackendModule(g, g.packed[i])
+
+  # Second pass: Code generation.
+  for i in 0..high(g.packed):
+    # 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:
+      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)