From: Chris Lattner Date: Sun, 22 Jul 2007 06:05:44 +0000 (+0000) Subject: when running in -E mode on multiple files, there is no reason to accumulate X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bd24776a825a18a59067c68a9d32f2d22e4cbf79;p=clang 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 4ef7400c34..6016b9a50a 100644 --- a/Driver/clang.cpp +++ b/Driver/clang.cpp @@ -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 diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h index 414b1789a7..f06a6fbf54 100644 --- a/include/clang/Basic/SourceManager.h +++ b/include/clang/Basic/SourceManager.h @@ -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.