[llvm] 22ada55 - [dsymutil] Also detect external downloadable toolchains (#93872)
via llvm-commits
llvm-commits at lists.llvm.org
Thu May 30 13:21:01 PDT 2024
Author: Adrian Prantl
Date: 2024-05-30T13:20:57-07:00
New Revision: 22ada554d5123717d163fea5a2a8d87020b332fe
URL: https://github.com/llvm/llvm-project/commit/22ada554d5123717d163fea5a2a8d87020b332fe
DIFF: https://github.com/llvm/llvm-project/commit/22ada554d5123717d163fea5a2a8d87020b332fe.diff
LOG: [dsymutil] Also detect external downloadable toolchains (#93872)
and reject them when copying Swift interface files, since they can live
outside of DEVELOPER_DIR.
Added:
Modified:
llvm/include/llvm/DWARFLinker/Utils.h
llvm/lib/DWARFLinker/Classic/DWARFLinker.cpp
llvm/lib/DWARFLinker/Parallel/DWARFLinkerCompileUnit.cpp
llvm/unittests/DWARFLinkerParallel/DWARFLinkerTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/DWARFLinker/Utils.h b/llvm/include/llvm/DWARFLinker/Utils.h
index 8bc22a0eadf16..8bf5ea1025a1e 100644
--- a/llvm/include/llvm/DWARFLinker/Utils.h
+++ b/llvm/include/llvm/DWARFLinker/Utils.h
@@ -39,7 +39,6 @@ inline Error finiteLoop(function_ref<Expected<bool>()> Iteration,
/// Make a best effort to guess the
/// Xcode.app/Contents/Developer path from an SDK path.
inline StringRef guessDeveloperDir(StringRef SysRoot) {
- SmallString<128> Result;
// Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
auto it = sys::path::rbegin(SysRoot);
auto end = sys::path::rend(SysRoot);
@@ -74,6 +73,28 @@ inline StringRef guessDeveloperDir(StringRef SysRoot) {
return {};
}
+/// Make a best effort to determine whether Path is inside a toolchain.
+inline bool isInToolchainDir(StringRef Path) {
+ // Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-05-15-a.xctoolchain/usr/lib/swift/macosx/_StringProcessing.swiftmodule/arm64-apple-macos.private.swiftinterface
+ for (auto it = sys::path::rbegin(Path), end = sys::path::rend(Path);
+ it != end; ++it) {
+ if (it->ends_with(".xctoolchain")) {
+ ++it;
+ if (it == end)
+ return false;
+ if (*it != "Toolchains")
+ return false;
+ ++it;
+ if (it == end)
+ return false;
+ if (*it != "Developer")
+ return false;
+ return true;
+ }
+ }
+ return false;
+}
+
inline bool isPathAbsoluteOnWindowsOrPosix(const Twine &Path) {
// Debug info can contain paths from any OS, not necessarily
// an OS we're currently running on. Moreover
diff erent compilation units can
diff --git a/llvm/lib/DWARFLinker/Classic/DWARFLinker.cpp b/llvm/lib/DWARFLinker/Classic/DWARFLinker.cpp
index 84bbdfb5c3947..2544d97eaafd0 100644
--- a/llvm/lib/DWARFLinker/Classic/DWARFLinker.cpp
+++ b/llvm/lib/DWARFLinker/Classic/DWARFLinker.cpp
@@ -204,6 +204,8 @@ static void analyzeImportedModule(
StringRef DeveloperDir = guessDeveloperDir(SysRoot);
if (!DeveloperDir.empty() && Path.starts_with(DeveloperDir))
return;
+ if (isInToolchainDir(Path))
+ return;
std::optional<const char *> Name =
dwarf::toString(DIE.find(dwarf::DW_AT_name));
if (!Name)
diff --git a/llvm/lib/DWARFLinker/Parallel/DWARFLinkerCompileUnit.cpp b/llvm/lib/DWARFLinker/Parallel/DWARFLinkerCompileUnit.cpp
index b50ea9ab49c1b..8a7313628b992 100644
--- a/llvm/lib/DWARFLinker/Parallel/DWARFLinkerCompileUnit.cpp
+++ b/llvm/lib/DWARFLinker/Parallel/DWARFLinkerCompileUnit.cpp
@@ -273,6 +273,8 @@ void CompileUnit::analyzeImportedModule(const DWARFDebugInfoEntry *DieEntry) {
StringRef DeveloperDir = guessDeveloperDir(SysRoot);
if (!DeveloperDir.empty() && Path.starts_with(DeveloperDir))
return;
+ if (isInToolchainDir(Path))
+ return;
if (std::optional<DWARFFormValue> Val = find(DieEntry, dwarf::DW_AT_name)) {
Expected<const char *> Name = Val->getAsCString();
if (!Name) {
diff --git a/llvm/unittests/DWARFLinkerParallel/DWARFLinkerTest.cpp b/llvm/unittests/DWARFLinkerParallel/DWARFLinkerTest.cpp
index 6439bf2cbc5f8..50c91396d6a1c 100644
--- a/llvm/unittests/DWARFLinkerParallel/DWARFLinkerTest.cpp
+++ b/llvm/unittests/DWARFLinkerParallel/DWARFLinkerTest.cpp
@@ -24,6 +24,12 @@ TEST(DWARFLinker, PathTest) {
"/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.4.sdk"),
DEVELOPER_DIR);
EXPECT_EQ(guessDeveloperDir(DEVELOPER_DIR "/SDKs/MacOSX.sdk"), DEVELOPER_DIR);
+ EXPECT_TRUE(
+ isInToolchainDir("/Library/Developer/Toolchains/"
+ "swift-DEVELOPMENT-SNAPSHOT-2024-05-15-a.xctoolchain/"
+ "usr/lib/swift/macosx/_StringProcessing.swiftmodule/"
+ "arm64-apple-macos.private.swiftinterface"));
+ EXPECT_FALSE(isInToolchainDir("/Foo/not-an.xctoolchain/Bar/Baz"));
}
} // anonymous namespace
More information about the llvm-commits
mailing list