Index: include/clang/Frontend/ASTUnit.h =================================================================== --- include/clang/Frontend/ASTUnit.h +++ include/clang/Frontend/ASTUnit.h @@ -185,6 +185,12 @@ /// some number of calls. unsigned PreambleRebuildCounter; + /// \brief Cache pairs "filename - source location" + /// + /// This cache is used when loading preambule to increase performance + /// of that loading + std::map SrcLocCache; + public: class PreambleData { const FileEntry *File; Index: lib/Frontend/ASTUnit.cpp =================================================================== --- lib/Frontend/ASTUnit.cpp +++ lib/Frontend/ASTUnit.cpp @@ -1148,6 +1148,8 @@ if (SavedMainFileBuffer) TranslateStoredDiagnostics(getFileManager(), getSourceManager(), PreambleDiagnostics, StoredDiagnostics); + else + SrcLocCache.clear(); if (!Act->Execute()) goto error; @@ -2579,8 +2581,7 @@ SmallVector Result; Result.reserve(Diags.size()); - const FileEntry *PreviousFE = nullptr; - FileID FID; + for (const StandaloneDiagnostic &SD : Diags) { // Rebuild the StoredDiagnostic. if (SD.Filename.empty()) @@ -2588,11 +2589,17 @@ const FileEntry *FE = FileMgr.getFile(SD.Filename); if (!FE) continue; - if (FE != PreviousFE) { + FileID FID; + SourceLocation FileLoc; + auto ItFileID = SrcLocCache.find(SD.Filename); + if (ItFileID == SrcLocCache.end()) { FID = SrcMgr.translateFile(FE); - PreviousFE = FE; + FileLoc = SrcMgr.getLocForStartOfFile(FID); + SrcLocCache.insert(std::make_pair(SD.Filename, FileLoc)); + } else { + FileLoc = ItFileID->second; } - SourceLocation FileLoc = SrcMgr.getLocForStartOfFile(FID); + if (FileLoc.isInvalid()) continue; SourceLocation L = FileLoc.getLocWithOffset(SD.LocOffset);