summary refs log blame commit diff stats
path: root/compiler/passaux.nim
blob: 1ee6023c88db7a1f617b71bd658226fadbe6e339 (plain) (tree)
1
2
3
4
5
6
7
8
9


                               
                                         




                                                   
                                       

       
                                                      
 







                                                                 



                                                                              
                                                      
  
                             




                                                 

                                                            
                                                           



                                                                      


                                                                       
                                                             


        
                             


                          
#
#
#           The Nimrod Compiler
#        (c) Copyright 2012 Andreas Rumpf
#
#    See the file "copying.txt", included in this
#    distribution, for details about the copyright.
#

## implements some little helper passes

import 
  strutils, ast, astalgo, passes, msgs, options, idgen

proc verboseOpen(s: PSym, filename: string): PPassContext = 
  #MessageOut('compiling ' + s.name.s);
  result = nil                # we don't need a context
  if gVerbosity > 0: rawMessage(hintProcessing, s.name.s)
  
proc verboseProcess(context: PPassContext, n: PNode): PNode = 
  result = n
  if context != nil: InternalError("logpass: context is not nil")
  if gVerbosity == 3: 
    # system.nim deactivates all hints, for verbosity:3 we want the processing
    # messages nonetheless, so we activate them again unconditionally:
    incl(msgs.gNotes, hintProcessing)
    Message(n.info, hintProcessing, $idgen.gBackendId)
  
proc verbosePass*(): TPass = 
  initPass(result)
  result.open = verboseOpen
  result.process = verboseProcess

proc cleanUp(c: PPassContext, n: PNode): PNode = 
  result = n                  
  # we cannot clean up if dead code elimination is activated
  if optDeadCodeElim in gGlobalOptions or n == nil: return 
  case n.kind
  of nkStmtList: 
    for i in countup(0, sonsLen(n) - 1): discard cleanup(c, n.sons[i])
  of nkProcDef, nkMethodDef: 
    if n.sons[namePos].kind == nkSym: 
      var s = n.sons[namePos].sym
      if sfDeadCodeElim notin getModule(s).flags and not astNeeded(s): 
        s.ast.sons[bodyPos] = ast.emptyNode # free the memory
  else: 
    nil

proc cleanupPass*(): TPass = 
  initPass(result)
  result.process = cleanUp
  result.close = cleanUp