[PATCH] D13117: [DarwinDriver] Use -lto_library to specify the path for libLTO.dylib
Duncan P. N. Exon Smith via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 23 15:06:09 PDT 2015
The code LGTM, but there ought to be a way to add a LIT test for this.
Looking for -object_path_lto, I found this:
--
// RUN: %clang -target x86_64-apple-darwin10 -### %s \
// RUN: -mlinker-version=117 -flto 2> %t.log
// RUN: cat %t.log
// RUN: FileCheck -check-prefix=LINK_OBJECT_LTO_PATH %s < %t.log
//
// LINK_OBJECT_LTO_PATH: {{ld(.exe)?"}}
// LINK_OBJECT_LTO_PATH: "-object_path_lto"
--
in test/Driver/darwin-ld.c. Can you add a similar test there?
> On 2015-Sep-23, at 13:56, Bruno Cardoso Lopes <bruno.cardoso at gmail.com> wrote:
>
> bruno created this revision.
> bruno added a reviewer: dexonsmith.
> bruno added subscribers: cfe-commits, kledzik, bob.wilson.
> bruno set the repository for this revision to rL LLVM.
>
> Usually, when using LTO with a clang installation newer than the system 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 patch 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.
>
> Repository:
> rL LLVM
>
> http://reviews.llvm.org/D13117
>
> Files:
> include/clang/Basic/DiagnosticDriverKinds.td
> lib/Driver/Tools.cpp
>
> Index: lib/Driver/Tools.cpp
> ===================================================================
> --- lib/Driver/Tools.cpp
> +++ lib/Driver/Tools.cpp
> @@ -6501,15 +6501,34 @@
> 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.
> Index: include/clang/Basic/DiagnosticDriverKinds.td
> ===================================================================
> --- include/clang/Basic/DiagnosticDriverKinds.td
> +++ include/clang/Basic/DiagnosticDriverKinds.td
> @@ -117,6 +117,7 @@
> 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">,
>
>
> <D13117.35547.patch>
More information about the cfe-commits
mailing list