Nice!
On 30 September 2015 at 15:55, Bruno Cardoso Lopes via cfe-commits <cfe-commits@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@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits