[clang-tools-extra] b0abc9d - [clang] NFCI: Use `FileEntryRef` in `ASTReader::GetHeaderFileInfo()`
Jan Svoboda via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 29 09:07:20 PDT 2023
Author: Jan Svoboda
Date: 2023-09-29T09:07:13-07:00
New Revision: b0abc9dd44271815b3ae1ad5d009a1ca83e0fdca
URL: https://github.com/llvm/llvm-project/commit/b0abc9dd44271815b3ae1ad5d009a1ca83e0fdca
DIFF: https://github.com/llvm/llvm-project/commit/b0abc9dd44271815b3ae1ad5d009a1ca83e0fdca.diff
LOG: [clang] NFCI: Use `FileEntryRef` in `ASTReader::GetHeaderFileInfo()`
This is the `ASTReader` counterpart to PR #67383.
Added:
Modified:
clang-tools-extra/clangd/IncludeCleaner.cpp
clang-tools-extra/clangd/ParsedAST.cpp
clang-tools-extra/clangd/Preamble.cpp
clang-tools-extra/clangd/unittests/ParsedASTTests.cpp
clang-tools-extra/include-cleaner/lib/Record.cpp
clang/include/clang/Lex/HeaderSearch.h
clang/include/clang/Lex/Preprocessor.h
clang/include/clang/Serialization/ASTReader.h
clang/include/clang/Tooling/Inclusions/HeaderAnalysis.h
clang/lib/Frontend/FrontendAction.cpp
clang/lib/Lex/HeaderSearch.cpp
clang/lib/Lex/PPDirectives.cpp
clang/lib/Lex/PPLexerChange.cpp
clang/lib/Lex/PPMacroExpansion.cpp
clang/lib/Lex/Pragma.cpp
clang/lib/Lex/Preprocessor.cpp
clang/lib/Sema/SemaDecl.cpp
clang/lib/Serialization/ASTReader.cpp
clang/lib/Serialization/ASTReaderInternals.h
clang/lib/Tooling/Inclusions/HeaderAnalysis.cpp
clang/tools/libclang/Indexing.cpp
clang/unittests/Frontend/ASTUnitTest.cpp
clang/unittests/Tooling/HeaderAnalysisTest.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/IncludeCleaner.cpp b/clang-tools-extra/clangd/IncludeCleaner.cpp
index a299347e8c0c3e6..b0a3c290bad6604 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 3f6c0eaebac6c41..d033d29e901fa88 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 8084e9644b426fc..f181c7befec156a 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 c850d6ed2c0dcd7..0348348450453ea 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 4e96e8eb208b7da..7a8e10a9c675496 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 6dbca6eec07fef3..a212eea7cfd0cb9 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<std::pair<const FileEntry *, DirectoryEntryRef>> Includers,
+ ArrayRef<std::pair<OptionalFileEntryRef, DirectoryEntryRef>> Includers,
SmallVectorImpl<char> *SearchPath, SmallVectorImpl<char> *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 2b10ea91bde7794..ab6c3c68a94e477 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 dc1eb21c27801fe..2e6b30dde60418e 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 84d90c44de07049..34ec2d80d06af49 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 <optional>
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 2da1a89b39ba4ba..60eac0c6d353048 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<std::pair<const FileEntry *, DirectoryEntryRef>, 1> CWD;
- CWD.push_back({nullptr, *Dir});
+ SmallVector<std::pair<OptionalFileEntryRef, DirectoryEntryRef>, 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 e54a19ebfdbb8f5..4c8b64a374b47d5 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<std::pair<const FileEntry *, DirectoryEntryRef>> Includers,
+ ArrayRef<std::pair<OptionalFileEntryRef, DirectoryEntryRef>> Includers,
SmallVectorImpl<char> *SearchPath, SmallVectorImpl<char> *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 c3a191b09cb2fa0..7899bfa1c4f5842 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<std::pair<const FileEntry *, DirectoryEntryRef>, 16> Includers;
+ SmallVector<std::pair<OptionalFileEntryRef, DirectoryEntryRef>, 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 811a760420e0a2d..b8575e1adfc5b3f 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<IdentifierInfo*>(ControllingMacro)))
MI->setUsedForHeaderGuard(true);
diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp
index ec6a084f228f32d..b371f8cf7a9c072 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 85543ed3f987511..58da4410dee64a4 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 6dfe7c0ccc50b33..95e6a7a3771e516 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 7d92e93188610c0..9c2f1e83ed3fbe9 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 c2937402eac393c..7fbebd51f457993 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<HeaderFileInfo> 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<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
diff --git a/clang/lib/Serialization/ASTReaderInternals.h b/clang/lib/Serialization/ASTReaderInternals.h
index b906cc6c58a2405..25a46ddabcb7078 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<unsigned, unsigned>
diff --git a/clang/lib/Tooling/Inclusions/HeaderAnalysis.cpp b/clang/lib/Tooling/Inclusions/HeaderAnalysis.cpp
index f83e19f10cbab50..036a995e4a2ec17 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 9288cabfaae6964..17d393ef8084258 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 64fc240852edec4..d513d1e766db8e0 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 623957c3ba237fa..d91e50eda91164f 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) {
More information about the cfe-commits
mailing list