r248932 - [DarwinDriver] Use -lto_library to specify the path for libLTO.dylib

Rafael EspĂ­ndola via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 30 13:14:55 PDT 2015


Nice!

On 30 September 2015 at 15:55, Bruno Cardoso Lopes via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Author: bruno
> Date: Wed Sep 30 14:55:07 2015
> New Revision: 248932
>
> URL: http://llvm.org/viewvc/llvm-project?rev=248932&view=rev
> Log:
> [DarwinDriver] Use -lto_library to specify the path for libLTO.dylib
>
> Usually, when using LTO with a clang installation newer than the
> system's one, there's a libLTO.dylib version mismatch and LTO fails. One
> solution to this is to make ld point to the right libLTO.dylib by
> changing DYLD_LIBRARY_PATH.
>
> However, ld64 supports specifying the complete path to the desired
> libLTO.dylib through the -lto_library option. This commit adds support
> for the clang driver to use this option whenever it's capable of finding
> a libLTO.dylib in clang's installed library directory. This way, we
> don't need to rely on DYLD_LIBRARY_PATH nor get caught by version
> mismatches.
>
> Differential Revision: http://reviews.llvm.org/D13117
>
> rdar://problem/7363476
>
> Modified:
>     cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td
>     cfe/trunk/lib/Driver/Tools.cpp
>     cfe/trunk/test/Driver/darwin-ld.c
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=248932&r1=248931&r2=248932&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td Wed Sep 30 14:55:07 2015
> @@ -117,6 +117,7 @@ def err_drv_optimization_remark_pattern
>  def err_drv_no_neon_modifier : Error<"[no]neon is not accepted as modifier, please use [no]simd instead">;
>
>  def warn_O4_is_O3 : Warning<"-O4 is equivalent to -O3">, InGroup<Deprecated>;
> +def warn_lto_libpath : Warning<"libLTO.dylib relative to clang installed dir not found; using 'ld' default search path instead">;
>  def warn_drv_optimization_value : Warning<"optimization level '%0' is not supported; using '%1%2' instead">,
>    InGroup<InvalidCommandLineArgument>;
>  def warn_ignored_gcc_optimization : Warning<"optimization flag '%0' is not supported">,
>
> Modified: cfe/trunk/lib/Driver/Tools.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=248932&r1=248931&r2=248932&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Driver/Tools.cpp (original)
> +++ cfe/trunk/lib/Driver/Tools.cpp Wed Sep 30 14:55:07 2015
> @@ -6551,15 +6551,34 @@ void darwin::Linker::AddLinkArgs(Compila
>                     options::OPT_fno_application_extension, false))
>      CmdArgs.push_back("-application_extension");
>
> -  // If we are using LTO, then automatically create a temporary file path for
> -  // the linker to use, so that it's lifetime will extend past a possible
> -  // dsymutil step.
> -  if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
> -    const char *TmpPath = C.getArgs().MakeArgString(
> -        D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
> -    C.addTempFile(TmpPath);
> -    CmdArgs.push_back("-object_path_lto");
> -    CmdArgs.push_back(TmpPath);
> +  if (D.IsUsingLTO(Args)) {
> +    // If we are using LTO, then automatically create a temporary file path for
> +    // the linker to use, so that it's lifetime will extend past a possible
> +    // dsymutil step.
> +    if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
> +      const char *TmpPath = C.getArgs().MakeArgString(
> +          D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
> +      C.addTempFile(TmpPath);
> +      CmdArgs.push_back("-object_path_lto");
> +      CmdArgs.push_back(TmpPath);
> +    }
> +
> +    // Use -lto_library option to specify the libLTO.dylib path. Try to find
> +    // it in clang installed libraries. If not found, the option is not used
> +    // and 'ld' will use its default mechanism to search for libLTO.dylib.
> +    if (Version[0] >= 133) {
> +      // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
> +      StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
> +      SmallString<128> LibLTOPath(P);
> +      llvm::sys::path::append(LibLTOPath, "lib");
> +      llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
> +      if (llvm::sys::fs::exists(LibLTOPath)) {
> +        CmdArgs.push_back("-lto_library");
> +        CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
> +      } else {
> +        D.Diag(diag::warn_lto_libpath);
> +      }
> +    }
>    }
>
>    // Derived from the "link" spec.
>
> Modified: cfe/trunk/test/Driver/darwin-ld.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/darwin-ld.c?rev=248932&r1=248931&r2=248932&view=diff
> ==============================================================================
> --- cfe/trunk/test/Driver/darwin-ld.c (original)
> +++ cfe/trunk/test/Driver/darwin-ld.c Wed Sep 30 14:55:07 2015
> @@ -110,6 +110,21 @@
>  // LINK_OBJECT_LTO_PATH: {{ld(.exe)?"}}
>  // LINK_OBJECT_LTO_PATH: "-object_path_lto"
>
> +// RUN: %clang -target x86_64-apple-darwin10 -### %s \
> +// RUN:   -mlinker-version=133 -flto 2> %t.log
> +// RUN: cat %t.log
> +// RUN: FileCheck -check-prefix=LINK_LTOLIB_PATH %s < %t.log
> +//
> +// LINK_LTOLIB_PATH: {{ld(.exe)?"}}
> +// LINK_LTOLIB_PATH: "-lto_library"
> +
> +// RUN: %clang -target x86_64-apple-darwin10 -### %s \
> +// RUN:   -ccc-install-dir %S/dummytestdir -mlinker-version=133 -flto 2> %t.log
> +// RUN: cat %t.log
> +// RUN: FileCheck -check-prefix=LINK_LTOLIB_PATH_WRN %s < %t.log
> +//
> +// LINK_LTOLIB_PATH_WRN: warning: libLTO.dylib relative to clang installed dir not found; using 'ld' default search path instead
> +
>  // RUN: %clang -target x86_64-apple-darwin10 -### %t.o \
>  // RUN:   -force_load a -force_load b 2> %t.log
>  // RUN: cat %t.log
>
>
> _______________________________________________
> 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