[llvm] [dsymutil] Also detect external downloadable toolchains (PR #93872)
Adrian Prantl via llvm-commits
llvm-commits at lists.llvm.org
Thu May 30 13:18:01 PDT 2024
https://github.com/adrian-prantl updated https://github.com/llvm/llvm-project/pull/93872
>From 011d8ecf0f2e9293297dc91c28cf7886c4416cf8 Mon Sep 17 00:00:00 2001
From: Adrian Prantl <aprantl at apple.com>
Date: Thu, 30 May 2024 13:11:20 -0700
Subject: [PATCH] [dsymutil] Also detect external downloadable toolchains
and reject them when copying Swift interface files, since they can
live outside of DEVELOPER_DIR.
---
llvm/include/llvm/DWARFLinker/Utils.h | 23 ++++++++++++++++++-
llvm/lib/DWARFLinker/Classic/DWARFLinker.cpp | 2 ++
.../Parallel/DWARFLinkerCompileUnit.cpp | 2 ++
.../DWARFLinkerParallel/DWARFLinkerTest.cpp | 6 +++++
4 files changed, 32 insertions(+), 1 deletion(-)
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 different 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