]> granicus.if.org Git - clang/commitdiff
when running in -E mode on multiple files, there is no reason to accumulate
authorChris Lattner <sabre@nondot.org>
Sun, 22 Jul 2007 06:05:44 +0000 (06:05 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 22 Jul 2007 06:05:44 +0000 (06:05 +0000)
fileid's and macroid's across files.  Clearing between files keeps the tables
smaller and slightly speeds up compilation.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40383 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/clang.cpp
include/clang/Basic/SourceManager.h

index 4ef7400c343ab5e9925d471b057105ae31975014..6016b9a50afa4b9c985e4208e2a868a0dd0ee183 100644 (file)
@@ -770,6 +770,7 @@ static void ProcessInputFile(Preprocessor &PP, unsigned MainFileID,
                              TextDiagnostics &OurDiagnosticClient,
                              HeaderSearch &HeaderInfo,
                              const LangOptions &LangInfo) {
+  bool ClearSourceMgr = false;
   switch (ProgAction) {
   default:
     fprintf(stderr, "Unexpected program action!\n");
@@ -783,6 +784,7 @@ static void ProcessInputFile(Preprocessor &PP, unsigned MainFileID,
       PP.DumpToken(Tok, true);
       fprintf(stderr, "\n");
     } while (Tok.getKind() != tok::eof);
+    ClearSourceMgr = true;
     break;
   }
   case RunPreprocessorOnly: {        // Just lex as fast as we can, no output.
@@ -792,19 +794,23 @@ static void ProcessInputFile(Preprocessor &PP, unsigned MainFileID,
     do {
       PP.Lex(Tok);
     } while (Tok.getKind() != tok::eof);
+    ClearSourceMgr = true;
     break;
   }
     
   case PrintPreprocessedInput:       // -E mode.
     DoPrintPreprocessedInput(MainFileID, PP, LangInfo);
+    ClearSourceMgr = true;
     break;
     
   case ParseNoop:                    // -parse-noop
     ParseFile(PP, new MinimalAction(), MainFileID);
+    ClearSourceMgr = true;
     break;
     
   case ParsePrintCallbacks:
     ParseFile(PP, CreatePrintParserActionsAction(), MainFileID);
+    ClearSourceMgr = true;
     break;
   case ParseSyntaxOnly:              // -fsyntax-only
   case ParseAST:
@@ -826,8 +832,17 @@ static void ProcessInputFile(Preprocessor &PP, unsigned MainFileID,
     PP.PrintStats();
     PP.getIdentifierTable().PrintStats();
     HeaderInfo.PrintStats();
+    if (ClearSourceMgr)
+      SourceMgr.PrintStats();
     fprintf(stderr, "\n");
   }
+
+  // For a multi-file compilation, some things are ok with nuking the source 
+  // manager tables, other require stable fileid/macroid's across multiple
+  // files.
+  if (ClearSourceMgr) {
+    SourceMgr.clearIDTables();
+  }
 }
 
 static llvm::cl::list<std::string>
index 414b1789a750ab5730db52857891009aec699759..f06a6fbf54a79b2d99a6e99091f9a466403bcd98 100644 (file)
@@ -158,6 +158,11 @@ public:
   SourceManager() {}
   ~SourceManager();
   
+  void clearIDTables() {
+    FileIDs.clear();
+    MacroIDs.clear();
+  }
+  
   /// createFileID - Create a new FileID that represents the specified file
   /// being #included from the specified IncludePosition.  This returns 0 on
   /// error and translates NULL into standard input.