@@ -202,6 +202,19 @@ static bool findXcodeClangPath(llvm::SmallVectorImpl<char> &path) {
202202 return !path.empty ();
203203}
204204
205+ static bool findXcodeClangLibPath (const Twine &libName,
206+ llvm::SmallVectorImpl<char > &path) {
207+ assert (path.empty ());
208+
209+ if (!findXcodeClangPath (path)) {
210+ return false ;
211+ }
212+ llvm::sys::path::remove_filename (path); // 'clang'
213+ llvm::sys::path::remove_filename (path); // 'bin'
214+ llvm::sys::path::append (path, " lib" , libName);
215+ return true ;
216+ }
217+
205218static void addVersionString (const ArgList &inputArgs, ArgStringList &arguments,
206219 unsigned major, unsigned minor, unsigned micro) {
207220 llvm::SmallString<8 > buf;
@@ -239,12 +252,15 @@ toolchains::Darwin::addLinkerInputArgs(InvocationInfo &II,
239252 Arguments.push_back (" -filelist" );
240253 Arguments.push_back (context.getTemporaryFilePath (" inputs" , " LinkFileList" ));
241254 II.FilelistInfos .push_back (
242- {Arguments.back (), file_types::TY_Object ,
255+ {Arguments.back (), context. OI . CompilerOutputType ,
243256 FilelistInfo::WhichFiles::InputJobsAndSourceInputActions});
244257 } else {
245258 addPrimaryInputsOfType (Arguments, context.Inputs , context.Args ,
246259 file_types::TY_Object);
260+ addPrimaryInputsOfType (Arguments, context.Inputs , context.Args ,
261+ file_types::TY_LLVM_BC);
247262 addInputsOfType (Arguments, context.InputActions , file_types::TY_Object);
263+ addInputsOfType (Arguments, context.InputActions , file_types::TY_LLVM_BC);
248264 }
249265
250266
@@ -274,11 +290,7 @@ static void findARCLiteLibPath(const toolchains::Darwin &TC,
274290 // If we don't have a 'lib/arc/' directory, find the "arclite" library
275291 // relative to the Clang in the active Xcode.
276292 ARCLiteLib.clear ();
277- if (findXcodeClangPath (ARCLiteLib)) {
278- llvm::sys::path::remove_filename (ARCLiteLib); // 'clang'
279- llvm::sys::path::remove_filename (ARCLiteLib); // 'bin'
280- llvm::sys::path::append (ARCLiteLib, " lib" , " arc" );
281- }
293+ findXcodeClangLibPath (" arc" , ARCLiteLib);
282294 }
283295}
284296
@@ -307,6 +319,15 @@ toolchains::Darwin::addArgsToLinkARCLite(ArgStringList &Arguments,
307319 }
308320}
309321
322+ void toolchains::Darwin::addLTOLibArgs (ArgStringList &Arguments,
323+ const JobContext &context) const {
324+ llvm::SmallString<128 > LTOLibPath;
325+ if (findXcodeClangLibPath (" libLTO.dylib" , LTOLibPath)) {
326+ Arguments.push_back (" -lto_library" );
327+ Arguments.push_back (context.Args .MakeArgString (LTOLibPath));
328+ }
329+ }
330+
310331void
311332toolchains::Darwin::addSanitizerArgs (ArgStringList &Arguments,
312333 const DynamicLinkJobAction &job,
@@ -761,6 +782,10 @@ toolchains::Darwin::constructInvocation(const DynamicLinkJobAction &job,
761782
762783 addArgsToLinkARCLite (Arguments, context);
763784
785+ if (job.shouldPerformLTO ()) {
786+ addLTOLibArgs (Arguments, context);
787+ }
788+
764789 for (const Arg *arg :
765790 context.Args .filtered (options::OPT_F, options::OPT_Fsystem)) {
766791 Arguments.push_back (" -F" );
@@ -828,14 +853,17 @@ toolchains::Darwin::constructInvocation(const StaticLinkJobAction &job,
828853 if (context.shouldUseInputFileList ()) {
829854 Arguments.push_back (" -filelist" );
830855 Arguments.push_back (context.getTemporaryFilePath (" inputs" , " LinkFileList" ));
831- II.FilelistInfos .push_back ({Arguments.back (), file_types::TY_Object ,
856+ II.FilelistInfos .push_back ({Arguments.back (), context. OI . CompilerOutputType ,
832857 FilelistInfo::WhichFiles::InputJobs});
833858 } else {
834859 addPrimaryInputsOfType (Arguments, context.Inputs , context.Args ,
835860 file_types::TY_Object);
861+ addPrimaryInputsOfType (Arguments, context.Inputs , context.Args ,
862+ file_types::TY_LLVM_BC);
836863 }
837864
838865 addInputsOfType (Arguments, context.InputActions , file_types::TY_Object);
866+ addInputsOfType (Arguments, context.InputActions , file_types::TY_LLVM_BC);
839867
840868 Arguments.push_back (" -o" );
841869
0 commit comments