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