[PATCH] D124638: [clang] Track how headers get included generally during lookup time
Cyndy Ishida via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed May 4 09:58:28 PDT 2022
This revision was automatically updated to reflect the committed changes.
Closed by commit rGb6c67c3c6789: [clang] Track how headers get included generally during lookup time (authored by cishida).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D124638/new/
https://reviews.llvm.org/D124638
Files:
clang/include/clang/Lex/HeaderSearch.h
clang/lib/Lex/HeaderSearch.cpp
clang/unittests/Lex/HeaderSearchTest.cpp
Index: clang/unittests/Lex/HeaderSearchTest.cpp
===================================================================
--- clang/unittests/Lex/HeaderSearchTest.cpp
+++ clang/unittests/Lex/HeaderSearchTest.cpp
@@ -207,6 +207,7 @@
EXPECT_TRUE(FI);
EXPECT_TRUE(FI->IsValid);
EXPECT_EQ(FI->Framework.str(), "Foo");
+ EXPECT_EQ(Search.getIncludeNameForHeader(FE), "Foo/Foo.h");
}
// Helper struct with null terminator character to make MemoryBuffer happy.
@@ -275,6 +276,7 @@
EXPECT_TRUE(FI);
EXPECT_TRUE(FI->IsValid);
EXPECT_EQ(FI->Framework.str(), "Foo");
+ EXPECT_EQ(Search.getIncludeNameForHeader(FE), "Foo/Foo.h");
}
} // namespace
Index: clang/lib/Lex/HeaderSearch.cpp
===================================================================
--- clang/lib/Lex/HeaderSearch.cpp
+++ clang/lib/Lex/HeaderSearch.cpp
@@ -1030,8 +1030,11 @@
CurDir = It;
+ const auto FE = &File->getFileEntry();
+ IncludeNames[FE] = Filename;
+
// This file is a system header or C++ unfriendly if the dir is.
- HeaderFileInfo &HFI = getFileInfo(&File->getFileEntry());
+ HeaderFileInfo &HFI = getFileInfo(FE);
HFI.DirInfo = CurDir->getDirCharacteristic();
// If the directory characteristic is User but this framework was
@@ -1460,6 +1463,13 @@
return FrameworkNames.insert(Framework).first->first();
}
+StringRef HeaderSearch::getIncludeNameForHeader(const FileEntry *File) const {
+ auto It = IncludeNames.find(File);
+ if (It == IncludeNames.end())
+ return {};
+ return It->second;
+}
+
bool HeaderSearch::hasModuleMap(StringRef FileName,
const DirectoryEntry *Root,
bool IsSystem) {
Index: clang/include/clang/Lex/HeaderSearch.h
===================================================================
--- clang/include/clang/Lex/HeaderSearch.h
+++ clang/include/clang/Lex/HeaderSearch.h
@@ -20,6 +20,7 @@
#include "clang/Lex/ModuleMap.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSet.h"
@@ -314,6 +315,9 @@
/// whether they were valid or not.
llvm::DenseMap<const FileEntry *, bool> LoadedModuleMaps;
+ // A map of discovered headers with their associated include file name.
+ llvm::DenseMap<const FileEntry *, llvm::SmallString<64>> IncludeNames;
+
/// Uniqued set of framework names, which is used to track which
/// headers were included as framework headers.
llvm::StringSet<llvm::BumpPtrAllocator> FrameworkNames;
@@ -823,6 +827,13 @@
/// Retrieve a uniqued framework name.
StringRef getUniqueFrameworkName(StringRef Framework);
+ /// Retrieve the include name for the header.
+ ///
+ /// \param File The entry for a given header.
+ /// \returns The name of how the file was included when the header's location
+ /// was resolved.
+ StringRef getIncludeNameForHeader(const FileEntry *File) const;
+
/// Suggest a path by which the specified file could be found, for use in
/// diagnostics to suggest a #include. Returned path will only contain forward
/// slashes as separators. MainFile is the absolute path of the file that we
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D124638.427050.patch
Type: text/x-patch
Size: 3243 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220504/71273187/attachment.bin>
More information about the cfe-commits
mailing list