Index: clang/include/clang/Basic/SourceManager.h =================================================================== --- clang/include/clang/Basic/SourceManager.h +++ clang/include/clang/Basic/SourceManager.h @@ -35,6 +35,7 @@ #define LLVM_CLANG_BASIC_SOURCEMANAGER_H #include "clang/Basic/Diagnostic.h" +#include "clang/Basic/FileManager.h" #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/BitVector.h" @@ -59,9 +60,6 @@ class ASTReader; class ASTWriter; -class FileManager; -class FileEntry; -class FileEntryRef; class LineTableInfo; class SourceManager; @@ -706,6 +704,9 @@ /// The file ID for the main source file of the translation unit. FileID MainFileID; + /// The file entry for the main source file. + Optional> CachedMainFileEntry; + /// The file ID for the precompiled preamble there is one. FileID PreambleFileID; @@ -813,6 +814,9 @@ MainFileID = FID; } + /// Returns true when the given FileEntry corresponds to the main file. + bool isMainFile(FileEntryRef SourceFile); + /// Set the file ID for the precompiled preamble. void setPreambleFileID(FileID Preamble) { assert(PreambleFileID.isInvalid() && "PreambleFileID already set!"); Index: clang/lib/Basic/SourceManager.cpp =================================================================== --- clang/lib/Basic/SourceManager.cpp +++ clang/lib/Basic/SourceManager.cpp @@ -373,6 +373,7 @@ void SourceManager::clearIDTables() { MainFileID = FileID(); + CachedMainFileEntry = Optional>(); LocalSLocEntryTable.clear(); LoadedSLocEntryTable.clear(); SLocEntryLoaded.clear(); @@ -389,6 +390,15 @@ createExpansionLoc(SourceLocation(), SourceLocation(), SourceLocation(), 1); } +bool SourceManager::isMainFile(FileEntryRef SourceFile) { + assert(MainFileID.isValid() && "expected initialized SourceManager"); + if (!CachedMainFileEntry) + *CachedMainFileEntry = getFileEntryRefForID(MainFileID); + if (!*CachedMainFileEntry) + return false; + return (*CachedMainFileEntry)->getUID() == SourceFile.getUID(); +} + void SourceManager::initializeForReplay(const SourceManager &Old) { assert(MainFileID.isInvalid() && "expected uninitialized SourceManager"); Index: clang/lib/Lex/PPDirectives.cpp =================================================================== --- clang/lib/Lex/PPDirectives.cpp +++ clang/lib/Lex/PPDirectives.cpp @@ -2054,8 +2054,7 @@ // some directives (e.g. #endif of a header guard) will never be seen. // Since this will lead to confusing errors, avoid the inclusion. if (Action == Enter && File && PreambleConditionalStack.isRecording() && - SourceMgr.translateFile(&File->getFileEntry()) == - SourceMgr.getMainFileID()) { + SourceMgr.isMainFile(*File)) { Diag(FilenameTok.getLocation(), diag::err_pp_including_mainfile_in_preamble); return {ImportAction::None};