@@ -199,6 +199,19 @@ static bool findXcodeClangPath(llvm::SmallVectorImpl<char> &path) {
199199 return !path.empty ();
200200}
201201
202+ static bool findXcodeClangLibPath (const Twine &libName,
203+ llvm::SmallVectorImpl<char > &path) {
204+ assert (path.empty ());
205+
206+ if (!findXcodeClangPath (path)) {
207+ return false ;
208+ }
209+ llvm::sys::path::remove_filename (path); // 'clang'
210+ llvm::sys::path::remove_filename (path); // 'bin'
211+ llvm::sys::path::append (path, " lib" , libName);
212+ return true ;
213+ }
214+
202215static void addVersionString (const ArgList &inputArgs, ArgStringList &arguments,
203216 unsigned major, unsigned minor, unsigned micro) {
204217 llvm::SmallString<8 > buf;
@@ -236,12 +249,15 @@ toolchains::Darwin::addLinkerInputArgs(InvocationInfo &II,
236249 Arguments.push_back (" -filelist" );
237250 Arguments.push_back (context.getTemporaryFilePath (" inputs" , " LinkFileList" ));
238251 II.FilelistInfos .push_back (
239- {Arguments.back (), file_types::TY_Object ,
252+ {Arguments.back (), context. OI . CompilerOutputType ,
240253 FilelistInfo::WhichFiles::InputJobsAndSourceInputActions});
241254 } else {
242255 addPrimaryInputsOfType (Arguments, context.Inputs , context.Args ,
243256 file_types::TY_Object);
257+ addPrimaryInputsOfType (Arguments, context.Inputs , context.Args ,
258+ file_types::TY_LLVM_BC);
244259 addInputsOfType (Arguments, context.InputActions , file_types::TY_Object);
260+ addInputsOfType (Arguments, context.InputActions , file_types::TY_LLVM_BC);
245261 }
246262
247263
@@ -271,11 +287,7 @@ static void findARCLiteLibPath(const toolchains::Darwin &TC,
271287 // If we don't have a 'lib/arc/' directory, find the "arclite" library
272288 // relative to the Clang in the active Xcode.
273289 ARCLiteLib.clear ();
274- if (findXcodeClangPath (ARCLiteLib)) {
275- llvm::sys::path::remove_filename (ARCLiteLib); // 'clang'
276- llvm::sys::path::remove_filename (ARCLiteLib); // 'bin'
277- llvm::sys::path::append (ARCLiteLib, " lib" , " arc" );
278- }
290+ findXcodeClangLibPath (" arc" , ARCLiteLib);
279291 }
280292}
281293
@@ -304,6 +316,15 @@ toolchains::Darwin::addArgsToLinkARCLite(ArgStringList &Arguments,
304316 }
305317}
306318
319+ void toolchains::Darwin::addLTOLibArgs (ArgStringList &Arguments,
320+ const JobContext &context) const {
321+ llvm::SmallString<128 > LTOLibPath;
322+ if (findXcodeClangLibPath (" libLTO.dylib" , LTOLibPath)) {
323+ Arguments.push_back (" -lto_library" );
324+ Arguments.push_back (context.Args .MakeArgString (LTOLibPath));
325+ }
326+ }
327+
307328void
308329toolchains::Darwin::addSanitizerArgs (ArgStringList &Arguments,
309330 const DynamicLinkJobAction &job,
@@ -705,6 +726,10 @@ toolchains::Darwin::constructInvocation(const DynamicLinkJobAction &job,
705726
706727 addArgsToLinkARCLite (Arguments, context);
707728
729+ if (job.shouldPerformLTO ()) {
730+ addLTOLibArgs (Arguments, context);
731+ }
732+
708733 for (const Arg *arg :
709734 context.Args .filtered (options::OPT_F, options::OPT_Fsystem)) {
710735 Arguments.push_back (" -F" );
@@ -777,14 +802,17 @@ toolchains::Darwin::constructInvocation(const StaticLinkJobAction &job,
777802 if (context.shouldUseInputFileList ()) {
778803 Arguments.push_back (" -filelist" );
779804 Arguments.push_back (context.getTemporaryFilePath (" inputs" , " LinkFileList" ));
780- II.FilelistInfos .push_back ({Arguments.back (), file_types::TY_Object ,
805+ II.FilelistInfos .push_back ({Arguments.back (), context. OI . CompilerOutputType ,
781806 FilelistInfo::WhichFiles::InputJobs});
782807 } else {
783808 addPrimaryInputsOfType (Arguments, context.Inputs , context.Args ,
784809 file_types::TY_Object);
810+ addPrimaryInputsOfType (Arguments, context.Inputs , context.Args ,
811+ file_types::TY_LLVM_BC);
785812 }
786813
787814 addInputsOfType (Arguments, context.InputActions , file_types::TY_Object);
815+ addInputsOfType (Arguments, context.InputActions , file_types::TY_LLVM_BC);
788816
789817 Arguments.push_back (" -o" );
790818
0 commit comments