[PATCH] D111468: [clang] Capture Framework when HeaderSearch is resolved via headermap
Cyndy Ishida via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 8 16:06:18 PDT 2021
cishida created this revision.
cishida added reviewers: dexonsmith, ributzka.
cishida requested review of this revision.
Herald added a project: clang.
When building frameworks, headermaps responsible for mapping angle-included headers to their source file location are passed via
`-I` and not `-index-header-map`. However, `-index-header-map` is only used for indexing purposes and not during most builds.
This patch holds on to the framework's name in HeaderFileInfo as this is retrieveable for cases outside of IndexHeaderMaps and
still represents the framework that is being built.
resolves: rdar://84046893
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D111468
Files:
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
@@ -18,6 +18,7 @@
#include "clang/Lex/HeaderSearch.h"
#include "clang/Lex/HeaderSearchOptions.h"
#include "clang/Serialization/InMemoryModuleCache.h"
+#include "llvm/Support/MemoryBuffer.h"
#include "gtest/gtest.h"
namespace clang {
@@ -47,7 +48,8 @@
}
void addHeaderMap(llvm::StringRef Filename,
- std::unique_ptr<llvm::MemoryBuffer> Buf) {
+ std::unique_ptr<llvm::MemoryBuffer> Buf,
+ bool isAngled = false) {
VFS->addFile(Filename, 0, std::move(Buf), /*User=*/None, /*Group=*/None,
llvm::sys::fs::file_type::regular_file);
auto FE = FileMgr.getFile(Filename, true);
@@ -56,9 +58,10 @@
// Test class supports only one HMap at a time.
assert(!HMap);
HMap = HeaderMap::Create(*FE, FileMgr);
+ HMap->dump();
auto DL =
DirectoryLookup(HMap.get(), SrcMgr::C_User, /*isFramework=*/false);
- Search.AddSearchPath(DL, /*isAngled=*/false);
+ Search.AddSearchPath(DL, isAngled);
}
IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> VFS;
@@ -179,5 +182,38 @@
"d.h");
}
+TEST_F(HeaderSearchTest, HeaderMapFrameworkLookup) {
+ typedef NullTerminatedFile<test::HMapFileMock<4, 128>, char> FileTy;
+ FileTy File;
+ File.init();
+
+ test::HMapFileMockMaker<FileTy> Maker(File);
+ auto a = Maker.addString("Foo/Foo.h");
+ auto b = Maker.addString("/tmp/Sources/Foo/Headers/");
+ auto c = Maker.addString("Foo.h");
+ Maker.addBucket("Foo/Foo.h", a, b, c);
+ addHeaderMap("product-headers.hmap", File.getBuffer(), /*isAngled=*/true);
+
+ StringRef HeaderName = "/tmp/Sources/Foo/Headers/Foo.h";
+ VFS->addFile(
+ HeaderName, 0, llvm::MemoryBuffer::getMemBufferCopy("", HeaderName),
+ /*User=*/None, /*Group=*/None, llvm::sys::fs::file_type::regular_file);
+
+ const DirectoryLookup *CurDir = nullptr;
+ auto FoundFile = Search.LookupFile(
+ "Foo/Foo.h", SourceLocation(), /*isAngled=*/true, /*FromDir=*/nullptr,
+ CurDir, /*Includers=*/{}, /*SearchPath=*/nullptr,
+ /*RelativePath=*/nullptr, /*RequestingModule=*/nullptr,
+ /*SuggestedModule=*/nullptr, /*IsMapped=*/nullptr,
+ /*IsFrameworkFound=*/nullptr);
+
+ EXPECT_TRUE(FoundFile.hasValue());
+ auto FE = FoundFile.getValue();
+ auto FI = Search.getExistingFileInfo(FE);
+ EXPECT_TRUE(FI);
+ EXPECT_TRUE(FI->IsValid);
+ EXPECT_EQ(FI->Framework.str(), "Foo");
+}
+
} // namespace
} // namespace clang
Index: clang/lib/Lex/HeaderSearch.cpp
===================================================================
--- clang/lib/Lex/HeaderSearch.cpp
+++ clang/lib/Lex/HeaderSearch.cpp
@@ -964,13 +964,13 @@
// If this file is found in a header map and uses the framework style of
// includes, then this header is part of a framework we're building.
- if (CurDir->isIndexHeaderMap()) {
+ if (CurDir->isHeaderMap() && isAngled) {
size_t SlashPos = Filename.find('/');
- if (SlashPos != StringRef::npos) {
+ if (SlashPos != StringRef::npos)
+ HFI.Framework =
+ getUniqueFrameworkName(StringRef(Filename.begin(), SlashPos));
+ if (CurDir->isIndexHeaderMap())
HFI.IndexHeaderMapHeader = 1;
- HFI.Framework = getUniqueFrameworkName(StringRef(Filename.begin(),
- SlashPos));
- }
}
if (checkMSVCHeaderSearch(Diags, MSFE ? &MSFE->getFileEntry() : nullptr,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D111468.378373.patch
Type: text/x-patch
Size: 3645 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20211008/4812aa3d/attachment-0001.bin>
More information about the cfe-commits
mailing list