From 3b2000fcac25bdb190d0db6fb1b706dc42ee605c Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Tue, 2 Oct 2012 18:02:50 +0000 Subject: [PATCH] During LTO, we call 'dsymutil' when we compile source files. This necessitates clang specifying a temporary file that it later cleans up so that it can survive the linking stage. However, when we compile object files during LTO we don't call 'dsymutil'. That's done at a different stage (if at all). We rely upon the linker to specify a unique name for the temporary file it generates. llvm-svn: 165028 --- clang/lib/Driver/Tools.cpp | 19 ++++++++++++++++--- clang/lib/Driver/Tools.h | 3 ++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 97b3c4e..86781cc 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -4175,9 +4175,22 @@ void darwin::DarwinTool::AddDarwinArch(const ArgList &Args, CmdArgs.push_back("-force_cpusubtype_ALL"); } +bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const { + // We only need to generate a temp path for LTO if we aren't compiling object + // files. When compiling source files, we run 'dsymutil' after linking. We + // don't run 'dsymutil' when compiling object files. + for (InputInfoList::const_iterator + it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) + if (it->getType() != types::TY_Object) + return true; + + return false; +} + void darwin::Link::AddLinkArgs(Compilation &C, const ArgList &Args, - ArgStringList &CmdArgs) const { + ArgStringList &CmdArgs, + const InputInfoList &Inputs) const { const Driver &D = getToolChain().getDriver(); const toolchains::Darwin &DarwinTC = getDarwinToolChain(); @@ -4216,7 +4229,7 @@ void darwin::Link::AddLinkArgs(Compilation &C, // 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)) { + 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); @@ -4403,7 +4416,7 @@ void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, // I'm not sure why this particular decomposition exists in gcc, but // we follow suite for ease of comparison. - AddLinkArgs(C, Args, CmdArgs); + AddLinkArgs(C, Args, CmdArgs, Inputs); Args.AddAllArgs(CmdArgs, options::OPT_d_Flag); Args.AddAllArgs(CmdArgs, options::OPT_s); diff --git a/clang/lib/Driver/Tools.h b/clang/lib/Driver/Tools.h index 999c57a..9d0778b 100644 --- a/clang/lib/Driver/Tools.h +++ b/clang/lib/Driver/Tools.h @@ -288,8 +288,9 @@ namespace darwin { }; class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool { + bool NeedsTempPath(const InputInfoList &Inputs) const; void AddLinkArgs(Compilation &C, const ArgList &Args, - ArgStringList &CmdArgs) const; + ArgStringList &CmdArgs, const InputInfoList &Inputs) const; public: Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {} -- 2.7.4