diff --git a/clang-tools-extra/clangd/IncludeCleaner.cpp b/clang-tools-extra/clangd/IncludeCleaner.cpp index a299347e8c0c3..b0a3c290bad66 100644 --- a/clang-tools-extra/clangd/IncludeCleaner.cpp +++ b/clang-tools-extra/clangd/IncludeCleaner.cpp @@ -102,7 +102,7 @@ bool mayConsiderUnused(const Inclusion &Inc, ParsedAST &AST, // Headers without include guards have side effects and are not // self-contained, skip them. if (!AST.getPreprocessor().getHeaderSearchInfo().isFileMultipleIncludeGuarded( - &FE->getFileEntry())) { + *FE)) { dlog("{0} doesn't have header guard and will not be considered unused", FE->getName()); return false; diff --git a/clang-tools-extra/clangd/ParsedAST.cpp b/clang-tools-extra/clangd/ParsedAST.cpp index 3f6c0eaebac6c..d033d29e901fa 100644 --- a/clang-tools-extra/clangd/ParsedAST.cpp +++ b/clang-tools-extra/clangd/ParsedAST.cpp @@ -499,8 +499,8 @@ ParsedAST::build(llvm::StringRef Filename, const ParseInputs &Inputs, // (The rest of HeaderFileInfo is not relevant for our purposes). if (Preamble && Preamble->MainIsIncludeGuarded) { const SourceManager &SM = Clang->getSourceManager(); - const FileEntry *MainFE = SM.getFileEntryForID(SM.getMainFileID()); - Clang->getPreprocessor().getHeaderSearchInfo().MarkFileIncludeOnce(MainFE); + OptionalFileEntryRef MainFE = SM.getFileEntryRefForID(SM.getMainFileID()); + Clang->getPreprocessor().getHeaderSearchInfo().MarkFileIncludeOnce(*MainFE); } // Set up ClangTidy. Must happen after BeginSourceFile() so ASTContext exists. diff --git a/clang-tools-extra/clangd/Preamble.cpp b/clang-tools-extra/clangd/Preamble.cpp index 8084e9644b426..f181c7befec15 100644 --- a/clang-tools-extra/clangd/Preamble.cpp +++ b/clang-tools-extra/clangd/Preamble.cpp @@ -122,10 +122,10 @@ class CppFilePreambleCallbacks : public PreambleCallbacks { CapturedCtx.emplace(CI); const SourceManager &SM = CI.getSourceManager(); - const FileEntry *MainFE = SM.getFileEntryForID(SM.getMainFileID()); + OptionalFileEntryRef MainFE = SM.getFileEntryRefForID(SM.getMainFileID()); IsMainFileIncludeGuarded = CI.getPreprocessor().getHeaderSearchInfo().isFileMultipleIncludeGuarded( - MainFE); + *MainFE); if (Stats) { const ASTContext &AST = CI.getASTContext(); diff --git a/clang-tools-extra/clangd/unittests/ParsedASTTests.cpp b/clang-tools-extra/clangd/unittests/ParsedASTTests.cpp index c850d6ed2c0dc..0348348450453 100644 --- a/clang-tools-extra/clangd/unittests/ParsedASTTests.cpp +++ b/clang-tools-extra/clangd/unittests/ParsedASTTests.cpp @@ -465,10 +465,10 @@ std::string once(llvm::StringRef Code) { bool mainIsGuarded(const ParsedAST &AST) { const auto &SM = AST.getSourceManager(); - const FileEntry *MainFE = SM.getFileEntryForID(SM.getMainFileID()); + OptionalFileEntryRef MainFE = SM.getFileEntryRefForID(SM.getMainFileID()); return AST.getPreprocessor() .getHeaderSearchInfo() - .isFileMultipleIncludeGuarded(MainFE); + .isFileMultipleIncludeGuarded(*MainFE); } MATCHER_P(diag, Desc, "") { diff --git a/clang-tools-extra/include-cleaner/lib/Record.cpp b/clang-tools-extra/include-cleaner/lib/Record.cpp index 4e96e8eb208b7..7a8e10a9c6754 100644 --- a/clang-tools-extra/include-cleaner/lib/Record.cpp +++ b/clang-tools-extra/include-cleaner/lib/Record.cpp @@ -188,8 +188,8 @@ class PragmaIncludes::RecordPragma : public PPCallbacks, public CommentHandler { if (Reason == PPCallbacks::ExitFile) { // At file exit time HeaderSearchInfo is valid and can be used to // determine whether the file was a self-contained header or not. - if (const FileEntry *FE = SM.getFileEntryForID(PrevFID)) { - if (tooling::isSelfContainedHeader(FE, SM, HeaderInfo)) + if (OptionalFileEntryRef FE = SM.getFileEntryRefForID(PrevFID)) { + if (tooling::isSelfContainedHeader(*FE, SM, HeaderInfo)) Out->NonSelfContainedFiles.erase(FE->getUniqueID()); else Out->NonSelfContainedFiles.insert(FE->getUniqueID()); diff --git a/clang/include/clang/Lex/HeaderSearch.h b/clang/include/clang/Lex/HeaderSearch.h index 6dbca6eec07fe..a212eea7cfd0c 100644 --- a/clang/include/clang/Lex/HeaderSearch.h +++ b/clang/include/clang/Lex/HeaderSearch.h @@ -139,7 +139,7 @@ class ExternalHeaderFileInfoSource { /// \returns Header file information for the given file entry, with the /// \c External bit set. If the file entry is not known, return a /// default-constructed \c HeaderFileInfo. - virtual HeaderFileInfo GetHeaderFileInfo(const FileEntry *FE) = 0; + virtual HeaderFileInfo GetHeaderFileInfo(FileEntryRef FE) = 0; }; /// This structure is used to record entries in our framework cache. @@ -487,7 +487,7 @@ class HeaderSearch { OptionalFileEntryRef LookupFile( StringRef Filename, SourceLocation IncludeLoc, bool isAngled, ConstSearchDirIterator FromDir, ConstSearchDirIterator *CurDir, - ArrayRef> Includers, + ArrayRef> Includers, SmallVectorImpl *SearchPath, SmallVectorImpl *RelativePath, Module *RequestingModule, ModuleMap::KnownHeader *SuggestedModule, bool *IsMapped, bool *IsFrameworkFound, bool SkipCache = false, @@ -522,33 +522,32 @@ class HeaderSearch { /// Return whether the specified file is a normal header, /// a system header, or a C++ friendly system header. - SrcMgr::CharacteristicKind getFileDirFlavor(const FileEntry *File) { + SrcMgr::CharacteristicKind getFileDirFlavor(FileEntryRef File) { return (SrcMgr::CharacteristicKind)getFileInfo(File).DirInfo; } /// Mark the specified file as a "once only" file due to /// \#pragma once. - void MarkFileIncludeOnce(const FileEntry *File) { + void MarkFileIncludeOnce(FileEntryRef File) { HeaderFileInfo &FI = getFileInfo(File); FI.isPragmaOnce = true; } /// Mark the specified file as a system header, e.g. due to /// \#pragma GCC system_header. - void MarkFileSystemHeader(const FileEntry *File) { + void MarkFileSystemHeader(FileEntryRef File) { getFileInfo(File).DirInfo = SrcMgr::C_System; } /// Mark the specified file as part of a module. - void MarkFileModuleHeader(const FileEntry *FE, - ModuleMap::ModuleHeaderRole Role, + void MarkFileModuleHeader(FileEntryRef FE, ModuleMap::ModuleHeaderRole Role, bool isCompilingModuleHeader); /// Mark the specified file as having a controlling macro. /// /// This is used by the multiple-include optimization to eliminate /// no-op \#includes. - void SetFileControllingMacro(const FileEntry *File, + void SetFileControllingMacro(FileEntryRef File, const IdentifierInfo *ControllingMacro) { getFileInfo(File).ControllingMacro = ControllingMacro; } @@ -558,10 +557,10 @@ class HeaderSearch { /// macro. /// /// This routine does not consider the effect of \#import - bool isFileMultipleIncludeGuarded(const FileEntry *File) const; + bool isFileMultipleIncludeGuarded(FileEntryRef File) const; /// Determine whether the given file is known to have ever been \#imported. - bool hasFileBeenImported(const FileEntry *File) const { + bool hasFileBeenImported(FileEntryRef File) const { const HeaderFileInfo *FI = getExistingFileInfo(File); return FI && FI->isImport; } @@ -806,13 +805,13 @@ class HeaderSearch { /// Return the HeaderFileInfo structure for the specified FileEntry, /// in preparation for updating it in some way. - HeaderFileInfo &getFileInfo(const FileEntry *FE); + HeaderFileInfo &getFileInfo(FileEntryRef FE); /// Return the HeaderFileInfo structure for the specified FileEntry, /// if it has ever been filled in. /// \param WantExternal Whether the caller wants purely-external header file /// info (where \p External is true). - const HeaderFileInfo *getExistingFileInfo(const FileEntry *FE, + const HeaderFileInfo *getExistingFileInfo(FileEntryRef FE, bool WantExternal = true) const; SearchDirIterator search_dir_begin() { return {*this, 0}; } diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h index 2b10ea91bde77..ab6c3c68a94e4 100644 --- a/clang/include/clang/Lex/Preprocessor.h +++ b/clang/include/clang/Lex/Preprocessor.h @@ -1483,13 +1483,13 @@ class Preprocessor { /// Mark the file as included. /// Returns true if this is the first time the file was included. - bool markIncluded(const FileEntry *File) { + bool markIncluded(FileEntryRef File) { HeaderInfo.getFileInfo(File); return IncludedFiles.insert(File).second; } /// Return true if this header has already been included. - bool alreadyIncluded(const FileEntry *File) const { + bool alreadyIncluded(FileEntryRef File) const { HeaderInfo.getFileInfo(File); return IncludedFiles.count(File); } diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index dc1eb21c27801..2e6b30dde6041 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -1821,7 +1821,7 @@ class ASTReader SourceRange ReadSkippedRange(unsigned Index) override; /// Read the header file information for the given file entry. - HeaderFileInfo GetHeaderFileInfo(const FileEntry *FE) override; + HeaderFileInfo GetHeaderFileInfo(FileEntryRef FE) override; void ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag); diff --git a/clang/include/clang/Tooling/Inclusions/HeaderAnalysis.h b/clang/include/clang/Tooling/Inclusions/HeaderAnalysis.h index 84d90c44de070..34ec2d80d06af 100644 --- a/clang/include/clang/Tooling/Inclusions/HeaderAnalysis.h +++ b/clang/include/clang/Tooling/Inclusions/HeaderAnalysis.h @@ -9,11 +9,11 @@ #ifndef LLVM_CLANG_TOOLING_INCLUSIONS_HEADER_ANALYSIS_H #define LLVM_CLANG_TOOLING_INCLUSIONS_HEADER_ANALYSIS_H +#include "clang/Basic/FileEntry.h" #include "llvm/ADT/StringRef.h" #include namespace clang { -class FileEntry; class SourceManager; class HeaderSearch; @@ -27,7 +27,7 @@ namespace tooling { /// /// This function can be expensive as it may scan the source code to find out /// dont-include-me pattern heuristically. -bool isSelfContainedHeader(const FileEntry *FE, const SourceManager &SM, +bool isSelfContainedHeader(FileEntryRef FE, const SourceManager &SM, const HeaderSearch &HeaderInfo); /// This scans the given source code to see if it contains #import(s). diff --git a/clang/lib/Frontend/FrontendAction.cpp b/clang/lib/Frontend/FrontendAction.cpp index 2da1a89b39ba4..60eac0c6d3530 100644 --- a/clang/lib/Frontend/FrontendAction.cpp +++ b/clang/lib/Frontend/FrontendAction.cpp @@ -830,8 +830,8 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI, HeaderSearch &HS = CI.getPreprocessor().getHeaderSearchInfo(); // Relative searches begin from CWD. auto Dir = CI.getFileManager().getOptionalDirectoryRef("."); - SmallVector, 1> CWD; - CWD.push_back({nullptr, *Dir}); + SmallVector, 1> CWD; + CWD.push_back({std::nullopt, *Dir}); OptionalFileEntryRef FE = HS.LookupFile(FileName, SourceLocation(), /*Angled*/ Input.getKind().getHeaderUnitKind() == diff --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp index e54a19ebfdbb8..4c8b64a374b47 100644 --- a/clang/lib/Lex/HeaderSearch.cpp +++ b/clang/lib/Lex/HeaderSearch.cpp @@ -862,7 +862,7 @@ diagnoseFrameworkInclude(DiagnosticsEngine &Diags, SourceLocation IncludeLoc, OptionalFileEntryRef HeaderSearch::LookupFile( StringRef Filename, SourceLocation IncludeLoc, bool isAngled, ConstSearchDirIterator FromDir, ConstSearchDirIterator *CurDirArg, - ArrayRef> Includers, + ArrayRef> Includers, SmallVectorImpl *SearchPath, SmallVectorImpl *RelativePath, Module *RequestingModule, ModuleMap::KnownHeader *SuggestedModule, bool *IsMapped, bool *IsFrameworkFound, bool SkipCache, @@ -913,7 +913,7 @@ OptionalFileEntryRef HeaderSearch::LookupFile( SmallString<1024> TmpDir; bool First = true; for (const auto &IncluderAndDir : Includers) { - const FileEntry *Includer = IncluderAndDir.first; + OptionalFileEntryRef Includer = IncluderAndDir.first; // Concatenate the requested file onto the directory. TmpDir = IncluderAndDir.second.getName(); @@ -927,7 +927,7 @@ OptionalFileEntryRef HeaderSearch::LookupFile( // from a module build. We should treat this as a system header if we're // building a [system] module. bool IncluderIsSystemHeader = - Includer ? getFileInfo(Includer).DirInfo != SrcMgr::C_User : + Includer ? getFileInfo(*Includer).DirInfo != SrcMgr::C_User : BuildSystemModule; if (OptionalFileEntryRef FE = getFileAndSuggestModule( TmpDir, IncludeLoc, IncluderAndDir.second, IncluderIsSystemHeader, @@ -943,12 +943,12 @@ OptionalFileEntryRef HeaderSearch::LookupFile( // Note that we only use one of FromHFI/ToHFI at once, due to potential // reallocation of the underlying vector potentially making the first // reference binding dangling. - HeaderFileInfo &FromHFI = getFileInfo(Includer); + HeaderFileInfo &FromHFI = getFileInfo(*Includer); unsigned DirInfo = FromHFI.DirInfo; bool IndexHeaderMapHeader = FromHFI.IndexHeaderMapHeader; StringRef Framework = FromHFI.Framework; - HeaderFileInfo &ToHFI = getFileInfo(&FE->getFileEntry()); + HeaderFileInfo &ToHFI = getFileInfo(*FE); ToHFI.DirInfo = DirInfo; ToHFI.IndexHeaderMapHeader = IndexHeaderMapHeader; ToHFI.Framework = Framework; @@ -1071,11 +1071,10 @@ OptionalFileEntryRef HeaderSearch::LookupFile( CurDir = It; - const auto FE = &File->getFileEntry(); - IncludeNames[FE] = Filename; + IncludeNames[*File] = Filename; // This file is a system header or C++ unfriendly if the dir is. - HeaderFileInfo &HFI = getFileInfo(FE); + HeaderFileInfo &HFI = getFileInfo(*File); HFI.DirInfo = CurDir->getDirCharacteristic(); // If the directory characteristic is User but this framework was @@ -1134,7 +1133,7 @@ OptionalFileEntryRef HeaderSearch::LookupFile( // "Foo" is the name of the framework in which the including header was found. if (!Includers.empty() && Includers.front().first && !isAngled && !Filename.contains('/')) { - HeaderFileInfo &IncludingHFI = getFileInfo(Includers.front().first); + HeaderFileInfo &IncludingHFI = getFileInfo(*Includers.front().first); if (IncludingHFI.IndexHeaderMapHeader) { SmallString<128> ScratchFilename; ScratchFilename += IncludingHFI.Framework; @@ -1272,7 +1271,7 @@ OptionalFileEntryRef HeaderSearch::LookupSubframeworkHeader( // getFileInfo could resize the vector and we don't want to rely on order // of evaluation. unsigned DirInfo = getFileInfo(ContextFileEnt).DirInfo; - getFileInfo(&File->getFileEntry()).DirInfo = DirInfo; + getFileInfo(*File).DirInfo = DirInfo; FrameworkName.pop_back(); // remove the trailing '/' if (!findUsableModuleForFrameworkHeader(*File, FrameworkName, @@ -1313,11 +1312,11 @@ static void mergeHeaderFileInfo(HeaderFileInfo &HFI, /// getFileInfo - Return the HeaderFileInfo structure for the specified /// FileEntry. -HeaderFileInfo &HeaderSearch::getFileInfo(const FileEntry *FE) { - if (FE->getUID() >= FileInfo.size()) - FileInfo.resize(FE->getUID() + 1); +HeaderFileInfo &HeaderSearch::getFileInfo(FileEntryRef FE) { + if (FE.getUID() >= FileInfo.size()) + FileInfo.resize(FE.getUID() + 1); - HeaderFileInfo *HFI = &FileInfo[FE->getUID()]; + HeaderFileInfo *HFI = &FileInfo[FE.getUID()]; // FIXME: Use a generation count to check whether this is really up to date. if (ExternalSource && !HFI->Resolved) { auto ExternalHFI = ExternalSource->GetHeaderFileInfo(FE); @@ -1336,19 +1335,18 @@ HeaderFileInfo &HeaderSearch::getFileInfo(const FileEntry *FE) { } const HeaderFileInfo * -HeaderSearch::getExistingFileInfo(const FileEntry *FE, - bool WantExternal) const { +HeaderSearch::getExistingFileInfo(FileEntryRef FE, bool WantExternal) const { // If we have an external source, ensure we have the latest information. // FIXME: Use a generation count to check whether this is really up to date. HeaderFileInfo *HFI; if (ExternalSource) { - if (FE->getUID() >= FileInfo.size()) { + if (FE.getUID() >= FileInfo.size()) { if (!WantExternal) return nullptr; - FileInfo.resize(FE->getUID() + 1); + FileInfo.resize(FE.getUID() + 1); } - HFI = &FileInfo[FE->getUID()]; + HFI = &FileInfo[FE.getUID()]; if (!WantExternal && (!HFI->IsValid || HFI->External)) return nullptr; if (!HFI->Resolved) { @@ -1359,10 +1357,10 @@ HeaderSearch::getExistingFileInfo(const FileEntry *FE, mergeHeaderFileInfo(*HFI, ExternalHFI); } } - } else if (FE->getUID() >= FileInfo.size()) { + } else if (FE.getUID() >= FileInfo.size()) { return nullptr; } else { - HFI = &FileInfo[FE->getUID()]; + HFI = &FileInfo[FE.getUID()]; } if (!HFI->IsValid || (HFI->External && !WantExternal)) @@ -1371,7 +1369,7 @@ HeaderSearch::getExistingFileInfo(const FileEntry *FE, return HFI; } -bool HeaderSearch::isFileMultipleIncludeGuarded(const FileEntry *File) const { +bool HeaderSearch::isFileMultipleIncludeGuarded(FileEntryRef File) const { // Check if we've entered this file and found an include guard or #pragma // once. Note that we dor't check for #import, because that's not a property // of the file itself. @@ -1381,7 +1379,7 @@ bool HeaderSearch::isFileMultipleIncludeGuarded(const FileEntry *File) const { return false; } -void HeaderSearch::MarkFileModuleHeader(const FileEntry *FE, +void HeaderSearch::MarkFileModuleHeader(FileEntryRef FE, ModuleMap::ModuleHeaderRole Role, bool isCompilingModuleHeader) { bool isModularHeader = ModuleMap::isModular(Role); diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp index c3a191b09cb2f..7899bfa1c4f58 100644 --- a/clang/lib/Lex/PPDirectives.cpp +++ b/clang/lib/Lex/PPDirectives.cpp @@ -961,7 +961,7 @@ OptionalFileEntryRef Preprocessor::LookupFile( // If the header lookup mechanism may be relative to the current inclusion // stack, record the parent #includes. - SmallVector, 16> Includers; + SmallVector, 16> Includers; bool BuildSystemModule = false; if (!FromDir && !FromFile) { FileID FID = getCurrentFileLexer()->getFileID(); @@ -981,7 +981,7 @@ OptionalFileEntryRef Preprocessor::LookupFile( // map file. if (!FileEnt) { if (FID == SourceMgr.getMainFileID() && MainFileDir) { - Includers.push_back(std::make_pair(nullptr, *MainFileDir)); + Includers.push_back(std::make_pair(std::nullopt, *MainFileDir)); BuildSystemModule = getCurrentModule()->IsSystem; } else if ((FileEnt = SourceMgr.getFileEntryRefForID( SourceMgr.getMainFileID()))) { @@ -2325,8 +2325,7 @@ Preprocessor::ImportAction Preprocessor::HandleHeaderIncludeOrImport( SrcMgr::CharacteristicKind FileCharacter = SourceMgr.getFileCharacteristic(FilenameTok.getLocation()); if (File) - FileCharacter = std::max(HeaderInfo.getFileDirFlavor(&File->getFileEntry()), - FileCharacter); + FileCharacter = std::max(HeaderInfo.getFileDirFlavor(*File), FileCharacter); // If this is a '#import' or an import-declaration, don't re-enter the file. // diff --git a/clang/lib/Lex/PPLexerChange.cpp b/clang/lib/Lex/PPLexerChange.cpp index 811a760420e0a..b8575e1adfc5b 100644 --- a/clang/lib/Lex/PPLexerChange.cpp +++ b/clang/lib/Lex/PPLexerChange.cpp @@ -366,8 +366,8 @@ bool Preprocessor::HandleEndOfFile(Token &Result, bool isEndOfMacro) { if (const IdentifierInfo *ControllingMacro = CurPPLexer->MIOpt.GetControllingMacroAtEndOfFile()) { // Okay, this has a controlling macro, remember in HeaderFileInfo. - if (const FileEntry *FE = CurPPLexer->getFileEntry()) { - HeaderInfo.SetFileControllingMacro(FE, ControllingMacro); + if (OptionalFileEntryRef FE = CurPPLexer->getFileEntry()) { + HeaderInfo.SetFileControllingMacro(*FE, ControllingMacro); if (MacroInfo *MI = getMacroInfo(const_cast(ControllingMacro))) MI->setUsedForHeaderGuard(true); diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp index ec6a084f228f3..b371f8cf7a9c0 100644 --- a/clang/lib/Lex/PPMacroExpansion.cpp +++ b/clang/lib/Lex/PPMacroExpansion.cpp @@ -1256,8 +1256,7 @@ static bool EvaluateHasIncludeCommon(Token &Tok, IdentifierInfo *II, if (PPCallbacks *Callbacks = PP.getPPCallbacks()) { SrcMgr::CharacteristicKind FileType = SrcMgr::C_User; if (File) - FileType = - PP.getHeaderSearchInfo().getFileDirFlavor(&File->getFileEntry()); + FileType = PP.getHeaderSearchInfo().getFileDirFlavor(*File); Callbacks->HasInclude(FilenameLoc, Filename, isAngled, File, FileType); } diff --git a/clang/lib/Lex/Pragma.cpp b/clang/lib/Lex/Pragma.cpp index 85543ed3f9875..58da4410dee64 100644 --- a/clang/lib/Lex/Pragma.cpp +++ b/clang/lib/Lex/Pragma.cpp @@ -426,7 +426,7 @@ void Preprocessor::HandlePragmaOnce(Token &OnceTok) { // Get the current file lexer we're looking at. Ignore _Pragma 'files' etc. // Mark the file as a once-only file now. - HeaderInfo.MarkFileIncludeOnce(getCurrentFileLexer()->getFileEntry()); + HeaderInfo.MarkFileIncludeOnce(*getCurrentFileLexer()->getFileEntry()); } void Preprocessor::HandlePragmaMark(Token &MarkTok) { @@ -491,7 +491,7 @@ void Preprocessor::HandlePragmaSystemHeader(Token &SysHeaderTok) { PreprocessorLexer *TheLexer = getCurrentFileLexer(); // Mark the file as a system header. - HeaderInfo.MarkFileSystemHeader(TheLexer->getFileEntry()); + HeaderInfo.MarkFileSystemHeader(*TheLexer->getFileEntry()); PresumedLoc PLoc = SourceMgr.getPresumedLoc(SysHeaderTok.getLocation()); if (PLoc.isInvalid()) diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp index 6dfe7c0ccc50b..95e6a7a3771e5 100644 --- a/clang/lib/Lex/Preprocessor.cpp +++ b/clang/lib/Lex/Preprocessor.cpp @@ -562,8 +562,8 @@ void Preprocessor::EnterMainSourceFile() { // Tell the header info that the main file was entered. If the file is later // #imported, it won't be re-entered. - if (const FileEntry *FE = SourceMgr.getFileEntryForID(MainFileID)) - markIncluded(FE); + if (OptionalFileEntryRef FE = SourceMgr.getFileEntryRefForID(MainFileID)) + markIncluded(*FE); } // Preprocess Predefines to populate the initial preprocessor state. diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 7d92e93188610..9c2f1e83ed3fb 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -4785,7 +4785,7 @@ void Sema::notePreviousDefinition(const NamedDecl *Old, SourceLocation New) { auto FNewDecLoc = SrcMgr.getDecomposedLoc(New); auto FOldDecLoc = SrcMgr.getDecomposedLoc(Old->getLocation()); auto *FNew = SrcMgr.getFileEntryForID(FNewDecLoc.first); - auto *FOld = SrcMgr.getFileEntryForID(FOldDecLoc.first); + auto FOld = SrcMgr.getFileEntryRefForID(FOldDecLoc.first); auto &HSI = PP.getHeaderSearchInfo(); StringRef HdrFilename = SrcMgr.getFilename(SrcMgr.getSpellingLoc(Old->getLocation())); @@ -4823,7 +4823,7 @@ void Sema::notePreviousDefinition(const NamedDecl *Old, SourceLocation New) { EmittedDiag |= noteFromModuleOrInclude(getCurrentModule(), NewIncLoc); // If the header has no guards, emit a note suggesting one. - if (FOld && !HSI.isFileMultipleIncludeGuarded(FOld)) + if (FOld && !HSI.isFileMultipleIncludeGuarded(*FOld)) Diag(Old->getLocation(), diag::note_use_ifdef_guards); if (EmittedDiag) diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index c2937402eac39..7fbebd51f4579 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -1907,10 +1907,10 @@ unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) { } HeaderFileInfoTrait::internal_key_type -HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) { - internal_key_type ikey = {FE->getSize(), - M.HasTimestamps ? FE->getModificationTime() : 0, - FE->getName(), /*Imported*/ false}; +HeaderFileInfoTrait::GetInternalKey(external_key_type FE) { + internal_key_type ikey = {FE.getSize(), + M.HasTimestamps ? FE.getModificationTime() : 0, + FE.getName(), /*Imported*/ false}; return ikey; } @@ -6399,11 +6399,11 @@ namespace { /// Visitor used to search for information about a header file. class HeaderFileInfoVisitor { - const FileEntry *FE; + FileEntryRef FE; std::optional HFI; public: - explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {} + explicit HeaderFileInfoVisitor(FileEntryRef FE) : FE(FE) {} bool operator()(ModuleFile &M) { HeaderFileInfoLookupTable *Table @@ -6425,7 +6425,7 @@ namespace { } // namespace -HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { +HeaderFileInfo ASTReader::GetHeaderFileInfo(FileEntryRef FE) { HeaderFileInfoVisitor Visitor(FE); ModuleMgr.visit(Visitor); if (std::optional HFI = Visitor.getHeaderFileInfo()) diff --git a/clang/lib/Serialization/ASTReaderInternals.h b/clang/lib/Serialization/ASTReaderInternals.h index b906cc6c58a24..25a46ddabcb70 100644 --- a/clang/lib/Serialization/ASTReaderInternals.h +++ b/clang/lib/Serialization/ASTReaderInternals.h @@ -247,7 +247,7 @@ class HeaderFileInfoTrait { const char *FrameworkStrings; public: - using external_key_type = const FileEntry *; + using external_key_type = FileEntryRef; struct internal_key_type { off_t Size; @@ -267,7 +267,7 @@ class HeaderFileInfoTrait { : Reader(Reader), M(M), HS(HS), FrameworkStrings(FrameworkStrings) {} static hash_value_type ComputeHash(internal_key_ref ikey); - internal_key_type GetInternalKey(const FileEntry *FE); + internal_key_type GetInternalKey(external_key_type ekey); bool EqualKey(internal_key_ref a, internal_key_ref b); static std::pair diff --git a/clang/lib/Tooling/Inclusions/HeaderAnalysis.cpp b/clang/lib/Tooling/Inclusions/HeaderAnalysis.cpp index f83e19f10cbab..036a995e4a2ec 100644 --- a/clang/lib/Tooling/Inclusions/HeaderAnalysis.cpp +++ b/clang/lib/Tooling/Inclusions/HeaderAnalysis.cpp @@ -66,9 +66,8 @@ llvm::StringRef getFileContents(const FileEntry *FE, const SourceManager &SM) { } // namespace -bool isSelfContainedHeader(const FileEntry *FE, const SourceManager &SM, +bool isSelfContainedHeader(FileEntryRef FE, const SourceManager &SM, const HeaderSearch &HeaderInfo) { - assert(FE); if (!HeaderInfo.isFileMultipleIncludeGuarded(FE) && !HeaderInfo.hasFileBeenImported(FE) && // Any header that contains #imports is supposed to be #import'd so no diff --git a/clang/tools/libclang/Indexing.cpp b/clang/tools/libclang/Indexing.cpp index 9288cabfaae69..17d393ef80842 100644 --- a/clang/tools/libclang/Indexing.cpp +++ b/clang/tools/libclang/Indexing.cpp @@ -171,9 +171,7 @@ class ParsedSrcLocationsTracker { /// /// Can provide false-negative in case the location was parsed after this /// instance had been constructed. - bool hasAlredyBeenParsed(SourceLocation Loc, FileID FID, - const FileEntry *FE) { - assert(FE); + bool hasAlredyBeenParsed(SourceLocation Loc, FileID FID, FileEntryRef FE) { PPRegion region = getRegion(Loc, FID, FE); if (region.isInvalid()) return false; @@ -199,12 +197,11 @@ class ParsedSrcLocationsTracker { } private: - PPRegion getRegion(SourceLocation Loc, FileID FID, const FileEntry *FE) { - assert(FE); + PPRegion getRegion(SourceLocation Loc, FileID FID, FileEntryRef FE) { auto Bail = [this, FE]() { if (isParsedOnceInclude(FE)) { - const llvm::sys::fs::UniqueID &ID = FE->getUniqueID(); - return PPRegion(ID, 0, FE->getModificationTime()); + const llvm::sys::fs::UniqueID &ID = FE.getUniqueID(); + return PPRegion(ID, 0, FE.getModificationTime()); } return PPRegion(); }; @@ -222,11 +219,11 @@ class ParsedSrcLocationsTracker { if (RegionFID != FID) return Bail(); - const llvm::sys::fs::UniqueID &ID = FE->getUniqueID(); - return PPRegion(ID, RegionOffset, FE->getModificationTime()); + const llvm::sys::fs::UniqueID &ID = FE.getUniqueID(); + return PPRegion(ID, RegionOffset, FE.getModificationTime()); } - bool isParsedOnceInclude(const FileEntry *FE) { + bool isParsedOnceInclude(FileEntryRef FE) { return PP.getHeaderSearchInfo().isFileMultipleIncludeGuarded(FE) || PP.getHeaderSearchInfo().hasFileBeenImported(FE); } @@ -396,11 +393,11 @@ class IndexingFrontendAction : public ASTFrontendAction { // Don't skip bodies from main files; this may be revisited. if (SM.getMainFileID() == FID) return false; - const FileEntry *FE = SM.getFileEntryForID(FID); + OptionalFileEntryRef FE = SM.getFileEntryRefForID(FID); if (!FE) return false; - return ParsedLocsTracker->hasAlredyBeenParsed(Loc, FID, FE); + return ParsedLocsTracker->hasAlredyBeenParsed(Loc, FID, *FE); } TranslationUnitKind getTranslationUnitKind() override { diff --git a/clang/unittests/Frontend/ASTUnitTest.cpp b/clang/unittests/Frontend/ASTUnitTest.cpp index 64fc240852ede..d513d1e766db8 100644 --- a/clang/unittests/Frontend/ASTUnitTest.cpp +++ b/clang/unittests/Frontend/ASTUnitTest.cpp @@ -151,8 +151,8 @@ TEST_F(ASTUnitTest, ModuleTextualHeader) { auto File = AU->getFileManager().getFileRef("Textual.h", false, false); ASSERT_TRUE(bool(File)); // Verify that we do not crash here. - EXPECT_TRUE(AU->getPreprocessor().getHeaderSearchInfo().getExistingFileInfo( - &File->getFileEntry())); + EXPECT_TRUE( + AU->getPreprocessor().getHeaderSearchInfo().getExistingFileInfo(*File)); } TEST_F(ASTUnitTest, LoadFromCommandLineEarlyError) { diff --git a/clang/unittests/Tooling/HeaderAnalysisTest.cpp b/clang/unittests/Tooling/HeaderAnalysisTest.cpp index 623957c3ba237..d91e50eda9116 100644 --- a/clang/unittests/Tooling/HeaderAnalysisTest.cpp +++ b/clang/unittests/Tooling/HeaderAnalysisTest.cpp @@ -52,14 +52,18 @@ TEST(HeaderAnalysisTest, IsSelfContained) { const auto &SM = AST.sourceManager(); auto &FM = SM.getFileManager(); auto &HI = AST.preprocessor().getHeaderSearchInfo(); - EXPECT_TRUE(isSelfContainedHeader(FM.getFile("headerguard.h").get(), SM, HI)); - EXPECT_TRUE(isSelfContainedHeader(FM.getFile("pragmaonce.h").get(), SM, HI)); - EXPECT_TRUE(isSelfContainedHeader(FM.getFile("imported.h").get(), SM, HI)); EXPECT_TRUE( - isSelfContainedHeader(SM.getFileEntryForID(SM.getMainFileID()), SM, HI)); + isSelfContainedHeader(*FM.getOptionalFileRef("headerguard.h"), SM, HI)); + EXPECT_TRUE( + isSelfContainedHeader(*FM.getOptionalFileRef("pragmaonce.h"), SM, HI)); + EXPECT_TRUE( + isSelfContainedHeader(*FM.getOptionalFileRef("imported.h"), SM, HI)); + EXPECT_TRUE(isSelfContainedHeader( + *SM.getFileEntryRefForID(SM.getMainFileID()), SM, HI)); - EXPECT_FALSE(isSelfContainedHeader(FM.getFile("unguarded.h").get(), SM, HI)); - EXPECT_FALSE(isSelfContainedHeader(FM.getFile("bad.h").get(), SM, HI)); + EXPECT_FALSE( + isSelfContainedHeader(*FM.getOptionalFileRef("unguarded.h"), SM, HI)); + EXPECT_FALSE(isSelfContainedHeader(*FM.getOptionalFileRef("bad.h"), SM, HI)); } TEST(HeaderAnalysisTest, CodeContainsImports) {