when running in -E mode on multiple files, there is no reason to accumulate 
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
diff --git a/Driver/clang.cpp b/Driver/clang.cpp
index 4ef7400..6016b9a 100644
--- a/Driver/clang.cpp
+++ b/Driver/clang.cpp
@@ -770,6 +770,7 @@
                              TextDiagnostics &OurDiagnosticClient,
                              HeaderSearch &HeaderInfo,
                              const LangOptions &LangInfo) {
+  bool ClearSourceMgr = false;
   switch (ProgAction) {
   default:
     fprintf(stderr, "Unexpected program action!\n");
@@ -783,6 +784,7 @@
       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 @@
     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 @@
     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>
diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h
index 414b178..f06a6fb 100644
--- a/include/clang/Basic/SourceManager.h
+++ b/include/clang/Basic/SourceManager.h
@@ -158,6 +158,11 @@
   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.