r339807 - Refactor Darwin driver to refer to runtimes by component
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 17 04:52:55 PDT 2018
Oh, and maybe the driver should diagnose if -mmacosx-version-min= is
set too low?
On Fri, Aug 17, 2018 at 12:38 PM, Hans Wennborg <hans at chromium.org> wrote:
> Just a heads up that this broke the Chromium build on Mac:
> https://crbug.com/874997
>
> Apparently we have some target that explicitly targets 10.5. I don't
> know if that's really necessary, but the fact that we ran into this at
> all suggests others will too, so maybe this change warrants a release
> notes entry.
>
> Thanks,
> Hans
>
> On Wed, Aug 15, 2018 at 10:09 PM, Chris Bieneman via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>> Author: cbieneman
>> Date: Wed Aug 15 13:09:38 2018
>> New Revision: 339807
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=339807&view=rev
>> Log:
>> Refactor Darwin driver to refer to runtimes by component
>>
>> Summary:
>> In r335809, Petr Hosek lays out support for what he calls the multiarch
>> runtimes layout. This new way of laying out the directories for runtime
>> libraries is workable for all platforms. Petr did some of the common
>> infrastructure and made it work for Linux and Fuscia. This patch is a
>> cleanup to the Darwin and MachO drivers to serve as a step toward
>> supporting it in Darwin.
>>
>> This patch does primarily two things:
>> (1) Changes the APIs for how the Darwin driver refers to compiler-rt
>> libraries to use the component names, similar to how Linux and Fuscia do
>>
>> (2) Removes some legacy functionality for supporting macOS versions
>> before 10.6. This functionality is effectively dead code because in
>> r339277, the support was removed from compiler-rt for generating the 10.4
>> runtime support library, and Xcode 10 (currently in beta) removes
>> libgcc_s.10.4 and libgcc_s.10.5 from the macOS SDK.
>>
>> With this patch landed a subsequent patch can modify
>> MachO::AddLinkRuntimeLib to support the multiarch runtimes layout.
>>
>> Worth noting: None of the removed functionality was actually covered in
>> the test suite. So no test case updates are required.
>>
>> Reviewers: phosek, bruno, arphaman
>>
>> Reviewed By: phosek, arphaman
>>
>> Subscribers: cfe-commits
>>
>> Differential Revision: https://reviews.llvm.org/D50618
>>
>> Modified:
>> cfe/trunk/lib/Driver/ToolChains/Darwin.cpp
>> cfe/trunk/lib/Driver/ToolChains/Darwin.h
>>
>> Modified: cfe/trunk/lib/Driver/ToolChains/Darwin.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Darwin.cpp?rev=339807&r1=339806&r2=339807&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/ToolChains/Darwin.cpp (original)
>> +++ cfe/trunk/lib/Driver/ToolChains/Darwin.cpp Wed Aug 15 13:09:38 2018
>> @@ -908,8 +908,17 @@ unsigned DarwinClang::GetDefaultDwarfVer
>> }
>>
>> void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
>> - StringRef DarwinLibName,
>> - RuntimeLinkOptions Opts) const {
>> + StringRef Component, RuntimeLinkOptions Opts,
>> + bool IsShared) const {
>> + SmallString<64> DarwinLibName = StringRef("libclang_rt.");
>> + // an Darwin the builtins compomnent is not in the library name
>> + if (Component != "builtins") {
>> + DarwinLibName += Component;
>> + if (!(Opts & RLO_IsEmbedded))
>> + DarwinLibName += "_";
>> + }
>> + DarwinLibName += getOSLibraryNameSuffix();
>> + DarwinLibName += IsShared ? "_dynamic.dylib" : ".a";
>> SmallString<128> Dir(getDriver().ResourceDir);
>> llvm::sys::path::append(
>> Dir, "lib", (Opts & RLO_IsEmbedded) ? "macho_embedded" : "darwin");
>> @@ -1013,10 +1022,8 @@ void Darwin::addProfileRTLibs(const ArgL
>> ArgStringList &CmdArgs) const {
>> if (!needsProfileRT(Args)) return;
>>
>> - AddLinkRuntimeLib(
>> - Args, CmdArgs,
>> - (Twine("libclang_rt.profile_") + getOSLibraryNameSuffix() + ".a").str(),
>> - RuntimeLinkOptions(RLO_AlwaysLink | RLO_FirstLink));
>> + AddLinkRuntimeLib(Args, CmdArgs, "profile",
>> + RuntimeLinkOptions(RLO_AlwaysLink | RLO_FirstLink));
>>
>> // If we have a symbol export directive and we're linking in the profile
>> // runtime, automatically export symbols necessary to implement some of the
>> @@ -1033,12 +1040,7 @@ void DarwinClang::AddLinkSanitizerLibArg
>> StringRef Sanitizer,
>> bool Shared) const {
>> auto RLO = RuntimeLinkOptions(RLO_AlwaysLink | (Shared ? RLO_AddRPath : 0U));
>> - AddLinkRuntimeLib(Args, CmdArgs,
>> - (Twine("libclang_rt.") + Sanitizer + "_" +
>> - getOSLibraryNameSuffix() +
>> - (Shared ? "_dynamic.dylib" : ".a"))
>> - .str(),
>> - RLO);
>> + AddLinkRuntimeLib(Args, CmdArgs, Sanitizer, RLO, Shared);
>> }
>>
>> ToolChain::RuntimeLibType DarwinClang::GetRuntimeLibType(
>> @@ -1092,10 +1094,7 @@ void DarwinClang::AddLinkRuntimeLibArgs(
>> AddCXXStdlibLibArgs(Args, CmdArgs);
>> }
>> if (Sanitize.needsStatsRt()) {
>> - StringRef OS = isTargetMacOS() ? "osx" : "iossim";
>> - AddLinkRuntimeLib(Args, CmdArgs,
>> - (Twine("libclang_rt.stats_client_") + OS + ".a").str(),
>> - RLO_AlwaysLink);
>> + AddLinkRuntimeLib(Args, CmdArgs, "stats_client", RLO_AlwaysLink);
>> AddLinkSanitizerLibArgs(Args, CmdArgs, "stats");
>> }
>> if (Sanitize.needsEsanRt())
>> @@ -1106,52 +1105,15 @@ void DarwinClang::AddLinkRuntimeLibArgs(
>> CmdArgs.push_back("-lSystem");
>>
>> // Select the dynamic runtime library and the target specific static library.
>> - if (isTargetWatchOSBased()) {
>> - // We currently always need a static runtime library for watchOS.
>> - AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.watchos.a");
>> - } else if (isTargetTvOSBased()) {
>> - // We currently always need a static runtime library for tvOS.
>> - AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.tvos.a");
>> - } else if (isTargetIOSBased()) {
>> + if (isTargetIOSBased()) {
>> // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
>> // it never went into the SDK.
>> // Linking against libgcc_s.1 isn't needed for iOS 5.0+
>> if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
>> getTriple().getArch() != llvm::Triple::aarch64)
>> CmdArgs.push_back("-lgcc_s.1");
>> -
>> - // We currently always need a static runtime library for iOS.
>> - AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
>> - } else {
>> - assert(isTargetMacOS() && "unexpected non MacOS platform");
>> - // The dynamic runtime library was merged with libSystem for 10.6 and
>> - // beyond; only 10.4 and 10.5 need an additional runtime library.
>> - if (isMacosxVersionLT(10, 5))
>> - CmdArgs.push_back("-lgcc_s.10.4");
>> - else if (isMacosxVersionLT(10, 6))
>> - CmdArgs.push_back("-lgcc_s.10.5");
>> -
>> - // Originally for OS X, we thought we would only need a static runtime
>> - // library when targeting 10.4, to provide versions of the static functions
>> - // which were omitted from 10.4.dylib. This led to the creation of the 10.4
>> - // builtins library.
>> - //
>> - // Unfortunately, that turned out to not be true, because Darwin system
>> - // headers can still use eprintf on i386, and it is not exported from
>> - // libSystem. Therefore, we still must provide a runtime library just for
>> - // the tiny tiny handful of projects that *might* use that symbol.
>> - //
>> - // Then over time, we figured out it was useful to add more things to the
>> - // runtime so we created libclang_rt.osx.a to provide new functions when
>> - // deploying to old OS builds, and for a long time we had both eprintf and
>> - // osx builtin libraries. Which just seems excessive. So with PR 28855, we
>> - // are removing the eprintf library and expecting eprintf to be provided by
>> - // the OS X builtins library.
>> - if (isMacosxVersionLT(10, 5))
>> - AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
>> - else
>> - AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
>> }
>> + AddLinkRuntimeLib(Args, CmdArgs, "builtins");
>> }
>>
>> /// Returns the most appropriate macOS target version for the current process.
>> @@ -1992,12 +1954,12 @@ void MachO::AddLinkRuntimeLibArgs(const
>> // Embedded targets are simple at the moment, not supporting sanitizers and
>> // with different libraries for each member of the product { static, PIC } x
>> // { hard-float, soft-float }
>> - llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
>> + llvm::SmallString<32> CompilerRT = StringRef("");
>> CompilerRT +=
>> (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
>> ? "hard"
>> : "soft";
>> - CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
>> + CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic" : "_static";
>>
>> AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, RLO_IsEmbedded);
>> }
>> @@ -2126,7 +2088,7 @@ llvm::ExceptionHandling Darwin::GetExcep
>>
>> // Only watchOS uses the new DWARF/Compact unwinding method.
>> llvm::Triple Triple(ComputeLLVMTriple(Args));
>> - if(Triple.isWatchABI())
>> + if (Triple.isWatchABI())
>> return llvm::ExceptionHandling::DwarfCFI;
>>
>> return llvm::ExceptionHandling::SjLj;
>> @@ -2263,8 +2225,7 @@ void Darwin::addStartObjectFileArgs(cons
>> }
>>
>> if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
>> - !isTargetWatchOS() &&
>> - isMacosxVersionLT(10, 5)) {
>> + !isTargetWatchOS() && isMacosxVersionLT(10, 5)) {
>> const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
>> CmdArgs.push_back(Str);
>> }
>>
>> Modified: cfe/trunk/lib/Driver/ToolChains/Darwin.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Darwin.h?rev=339807&r1=339806&r2=339807&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/ToolChains/Darwin.h (original)
>> +++ cfe/trunk/lib/Driver/ToolChains/Darwin.h Wed Aug 15 13:09:38 2018
>> @@ -189,9 +189,9 @@ public:
>>
>> /// Add a runtime library to the list of items to link.
>> void AddLinkRuntimeLib(const llvm::opt::ArgList &Args,
>> - llvm::opt::ArgStringList &CmdArgs,
>> - StringRef DarwinLibName,
>> - RuntimeLinkOptions Opts = RuntimeLinkOptions()) const;
>> + llvm::opt::ArgStringList &CmdArgs, StringRef Component,
>> + RuntimeLinkOptions Opts = RuntimeLinkOptions(),
>> + bool IsShared = false) const;
>>
>> /// Add any profiling runtime libraries that are needed. This is essentially a
>> /// MachO specific version of addProfileRT in Tools.cpp.
>> @@ -252,6 +252,8 @@ public:
>> return llvm::ExceptionHandling::None;
>> }
>>
>> + virtual StringRef getOSLibraryNameSuffix() const { return ""; }
>> +
>> /// }
>> };
>>
>> @@ -418,7 +420,7 @@ protected:
>> Action::OffloadKind DeviceOffloadKind) const override;
>>
>> StringRef getPlatformFamily() const;
>> - StringRef getOSLibraryNameSuffix() const;
>> + StringRef getOSLibraryNameSuffix() const override;
>>
>> public:
>> static StringRef getSDKName(StringRef isysroot);
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list