@@ -321,10 +321,29 @@ toolchains::Darwin::addArgsToLinkARCLite(ArgStringList &Arguments,
321321
322322void toolchains::Darwin::addLTOLibArgs (ArgStringList &Arguments,
323323 const JobContext &context) const {
324- llvm::SmallString< 128 > LTOLibPath;
325- if ( findXcodeClangLibPath ( " libLTO.dylib " , LTOLibPath)) {
324+ if (!context. OI . LibLTOPath . empty ()) {
325+ // Check for user-specified LTO library.
326326 Arguments.push_back (" -lto_library" );
327- Arguments.push_back (context.Args .MakeArgString (LTOLibPath));
327+ Arguments.push_back (context.Args .MakeArgString (context.OI .LibLTOPath ));
328+ } else {
329+ // Check for relative libLTO.dylib. This would be the expected behavior in an
330+ // Xcode toolchain.
331+ StringRef P = llvm::sys::path::parent_path (getDriver ().getSwiftProgramPath ());
332+ llvm::SmallString<128 > LibLTOPath (P);
333+ llvm::sys::path::remove_filename (LibLTOPath); // Remove '/bin'
334+ llvm::sys::path::append (LibLTOPath, " lib" );
335+ llvm::sys::path::append (LibLTOPath, " libLTO.dylib" );
336+ if (llvm::sys::fs::exists (LibLTOPath)) {
337+ Arguments.push_back (" -lto_library" );
338+ Arguments.push_back (context.Args .MakeArgString (LibLTOPath));
339+ } else {
340+ // Use libLTO.dylib from the default toolchain if a relative one does not exist.
341+ llvm::SmallString<128 > LibLTOPath;
342+ if (findXcodeClangLibPath (" libLTO.dylib" , LibLTOPath)) {
343+ Arguments.push_back (" -lto_library" );
344+ Arguments.push_back (context.Args .MakeArgString (LibLTOPath));
345+ }
346+ }
328347 }
329348}
330349
0 commit comments