https://github.com/cyndyishida created https://github.com/llvm/llvm-project/pull/118543
* Use the centralized API to add `SubFrameworks` for driverkit targets. >From 764bf57ac39fddef74d45d16fffc14035bbbff72 Mon Sep 17 00:00:00 2001 From: Cyndy Ishida <cyndy_ish...@apple.com> Date: Tue, 3 Dec 2024 11:15:37 -0800 Subject: [PATCH] [Clang][Darwin] Centralize framework search paths for headers & libraries. * Use the centralized API to add `SubFrameworks` for driverkit targets. --- clang/include/clang/Basic/DarwinSDKInfo.h | 13 ++++++++++- clang/lib/Basic/DarwinSDKInfo.cpp | 20 +++++++++++++++++ clang/lib/Driver/ToolChains/Darwin.cpp | 27 +++++++++-------------- clang/lib/Lex/InitHeaderSearch.cpp | 11 +++++---- clang/test/Driver/driverkit-path.c | 3 +++ 5 files changed, 51 insertions(+), 23 deletions(-) diff --git a/clang/include/clang/Basic/DarwinSDKInfo.h b/clang/include/clang/Basic/DarwinSDKInfo.h index db20b968a898ea..87c0a2abb2432c 100644 --- a/clang/include/clang/Basic/DarwinSDKInfo.h +++ b/clang/include/clang/Basic/DarwinSDKInfo.h @@ -1,4 +1,4 @@ -//===--- DarwinSDKInfo.h - SDK Information parser for darwin ----*- C++ -*-===// +//===--- DarwinSDKInfo.h - SDK Information for darwin -----------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -192,6 +192,17 @@ class DarwinSDKInfo { Expected<std::optional<DarwinSDKInfo>> parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath); +/// Get the system platform prefix for the active target triple. +StringRef getSystemPrefix(const llvm::Triple &T); + +using KnownSystemPaths = std::array<std::string, 2>; + +/// Compute and get the common system search paths for header frontend and +/// library linker searching. +/// +/// \param T The active target triple to determine platform specific paths. +KnownSystemPaths getCommonSystemPaths(llvm::Triple T); + } // end namespace clang #endif // LLVM_CLANG_BASIC_DARWINSDKINFO_H diff --git a/clang/lib/Basic/DarwinSDKInfo.cpp b/clang/lib/Basic/DarwinSDKInfo.cpp index 00aa5f9e63cd3f..914ce0a554008a 100644 --- a/clang/lib/Basic/DarwinSDKInfo.cpp +++ b/clang/lib/Basic/DarwinSDKInfo.cpp @@ -150,3 +150,23 @@ clang::parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath) { return llvm::make_error<llvm::StringError>("invalid SDKSettings.json", llvm::inconvertibleErrorCode()); } + +// For certain platforms/environments almost all resources (e.g., headers) are +// located in sub-directories, e.g., for DriverKit they live in +// <SYSROOT>/System/DriverKit/usr/include (instead of <SYSROOT>/usr/include). +StringRef clang::getSystemPrefix(const llvm::Triple &T) { + if (T.isDriverKit()) + return "/System/DriverKit"; + return ""; +} + +KnownSystemPaths clang::getCommonSystemPaths(llvm::Triple T) { + KnownSystemPaths CommonSysPaths = {"/System/Library/Frameworks", + "/System/Library/SubFrameworks"}; + + const StringRef Prefix = getSystemPrefix(T); + for (std::string &SysPath : CommonSysPaths) + SysPath = (Prefix + SysPath).str(); + + return CommonSysPaths; +} diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 87380869f6fdab..cadfbcba9afaa6 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -11,6 +11,7 @@ #include "Arch/ARM.h" #include "CommonArgs.h" #include "clang/Basic/AlignedAllocation.h" +#include "clang/Basic/DarwinSDKInfo.h" #include "clang/Basic/ObjCRuntime.h" #include "clang/Config/config.h" #include "clang/Driver/Compilation.h" @@ -564,8 +565,6 @@ static void renderRemarksOptions(const ArgList &Args, ArgStringList &CmdArgs, } } -static void AppendPlatformPrefix(SmallString<128> &Path, const llvm::Triple &T); - void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, @@ -811,16 +810,22 @@ void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA, if (NonStandardSearchPath) { if (auto *Sysroot = Args.getLastArg(options::OPT_isysroot)) { - auto AddSearchPath = [&](StringRef Flag, StringRef SearchPath) { + auto AddSearchPath = [&](StringRef Flag, StringRef SearchPath, + bool HasPrefix = false) { SmallString<128> P(Sysroot->getValue()); - AppendPlatformPrefix(P, Triple); + if (!HasPrefix) + P.append(getSystemPrefix(Triple)); llvm::sys::path::append(P, SearchPath); if (getToolChain().getVFS().exists(P)) { CmdArgs.push_back(Args.MakeArgString(Flag + P)); } }; + AddSearchPath("-L", "/usr/lib"); - AddSearchPath("-F", "/System/Library/Frameworks"); + for (const StringRef Path : getCommonSystemPaths(Triple)) { + if (Path.contains("Framework")) + AddSearchPath("-F", Path, /*HasPrefix=*/true); + } } } } @@ -2463,16 +2468,6 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { } } -// For certain platforms/environments almost all resources (e.g., headers) are -// located in sub-directories, e.g., for DriverKit they live in -// <SYSROOT>/System/DriverKit/usr/include (instead of <SYSROOT>/usr/include). -static void AppendPlatformPrefix(SmallString<128> &Path, - const llvm::Triple &T) { - if (T.isDriverKit()) { - llvm::sys::path::append(Path, "System", "DriverKit"); - } -} - // Returns the effective sysroot from either -isysroot or --sysroot, plus the // platform prefix (if any). llvm::SmallString<128> @@ -2484,7 +2479,7 @@ DarwinClang::GetEffectiveSysroot(const llvm::opt::ArgList &DriverArgs) const { Path = getDriver().SysRoot; if (hasEffectiveTriple()) { - AppendPlatformPrefix(Path, getEffectiveTriple()); + Path.append(getSystemPrefix(getEffectiveTriple())); } return Path; } diff --git a/clang/lib/Lex/InitHeaderSearch.cpp b/clang/lib/Lex/InitHeaderSearch.cpp index ea02f5dfb62644..d73eb47faf98bc 100644 --- a/clang/lib/Lex/InitHeaderSearch.cpp +++ b/clang/lib/Lex/InitHeaderSearch.cpp @@ -10,6 +10,7 @@ // //===----------------------------------------------------------------------===// +#include "clang/Basic/DarwinSDKInfo.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/LangOptions.h" #include "clang/Config/config.h" // C_INCLUDE_DIRS @@ -339,13 +340,11 @@ void InitHeaderSearch::AddDefaultIncludePaths( if (triple.isOSDarwin()) { if (HSOpts.UseStandardSystemIncludes) { // Add the default framework include paths on Darwin. - if (triple.isDriverKit()) { - AddPath("/System/DriverKit/System/Library/Frameworks", System, true); - } else { - AddPath("/System/Library/Frameworks", System, true); - AddPath("/System/Library/SubFrameworks", System, true); + for (const StringRef Path : getCommonSystemPaths(triple)) + AddPath(Path, System, true); + + if (!triple.isDriverKit()) AddPath("/Library/Frameworks", System, true); - } } return; } diff --git a/clang/test/Driver/driverkit-path.c b/clang/test/Driver/driverkit-path.c index 3caae382d65bb3..8e87cd5cccf549 100644 --- a/clang/test/Driver/driverkit-path.c +++ b/clang/test/Driver/driverkit-path.c @@ -18,9 +18,11 @@ int main() { return 0; } // LD64-OLD: "-isysroot" "[[PATH:[^"]*]]Inputs/DriverKit19.0.sdk" // LD64-OLD: "-L[[PATH]]Inputs/DriverKit19.0.sdk/System/DriverKit/usr/lib" // LD64-OLD: "-F[[PATH]]Inputs/DriverKit19.0.sdk/System/DriverKit/System/Library/Frameworks" +// LD64-OLD: "-F[[PATH]]Inputs/DriverKit19.0.sdk/System/DriverKit/System/Library/SubFrameworks" // LD64-NEW: "-isysroot" "[[PATH:[^"]*]]Inputs/DriverKit19.0.sdk" // LD64-NEW-NOT: "-L[[PATH]]Inputs/DriverKit19.0.sdk/System/DriverKit/usr/lib" // LD64-NEW-NOT: "-F[[PATH]]Inputs/DriverKit19.0.sdk/System/DriverKit/System/Library/Frameworks" +// LD64-NEW-NOT: "-F[[PATH]]Inputs/DriverKit19.0.sdk/System/DriverKit/System/Library/SubFrameworks" // RUN: %clang %s -target x86_64-apple-driverkit19.0 -isysroot %S/Inputs/DriverKit19.0.sdk -E -v -x c++ 2>&1 | FileCheck %s --check-prefix=INC @@ -31,3 +33,4 @@ int main() { return 0; } // INC: /lib{{(64)?}}/clang/{{[^/ ]+}}/include // INC: [[PATH]]/System/DriverKit/usr/include // INC: [[PATH]]/System/DriverKit/System/Library/Frameworks (framework directory) +// INC: [[PATH]]/System/DriverKit/System/Library/SubFrameworks (framework directory) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits