From: Erik Verbruggen Date: Thu, 16 Feb 2017 09:49:30 +0000 (+0000) Subject: Cache FileID when translating diagnostics in PCH files X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4d1aae348f60dd2e46d3fab6ee89294583fd2684;p=clang Cache FileID when translating diagnostics in PCH files Modules/preambles/PCH files can contain diagnostics, which, when used, are added to the current ASTUnit. For that to work, they are translated to use the current FileManager's FileIDs. When the entry is not the main file, all local source locations will be checked by a linear search. Now this is a problem, when there are lots of diagnostics (say, 25000) and lots of local source locations (say, 440000), and end up taking seconds when using such a preamble. The fix is to cache the last FileID, because many subsequent diagnostics refer to the same file. This reduces the time spent in ASTUnit::TranslateStoredDiagnostics from seconds to a few milliseconds for files with many slocs/diagnostics. This fixes PR31353. Differential Revision: https://reviews.llvm.org/D29755 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@295301 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index 12b78ea3cd..db19804d5f 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/lib/Frontend/ASTUnit.cpp @@ -2541,6 +2541,8 @@ void ASTUnit::TranslateStoredDiagnostics( SmallVector Result; Result.reserve(Diags.size()); + const FileEntry *PreviousFE = nullptr; + FileID FID; for (const StandaloneDiagnostic &SD : Diags) { // Rebuild the StoredDiagnostic. if (SD.Filename.empty()) @@ -2548,7 +2550,10 @@ void ASTUnit::TranslateStoredDiagnostics( const FileEntry *FE = FileMgr.getFile(SD.Filename); if (!FE) continue; - FileID FID = SrcMgr.translateFile(FE); + if (FE != PreviousFE) { + FID = SrcMgr.translateFile(FE); + PreviousFE = FE; + } SourceLocation FileLoc = SrcMgr.getLocForStartOfFile(FID); if (FileLoc.isInvalid()) continue;