From 6e0f25483b1a801cd1155ea89c2b725feab16332 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Fri, 4 Jun 2010 18:28:36 +0000 Subject: [PATCH] Driver: Add an explicit dsymutil action. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@105474 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Driver/Action.h | 13 ++++++++++++- lib/Driver/Action.cpp | 5 +++++ lib/Driver/ToolChains.cpp | 4 ++++ lib/Driver/Tools.cpp | 20 ++++++++++++++++++++ lib/Driver/Tools.h | 17 +++++++++++++++++ 5 files changed, 58 insertions(+), 1 deletion(-) diff --git a/include/clang/Driver/Action.h b/include/clang/Driver/Action.h index ab3162a047..4b45c98313 100644 --- a/include/clang/Driver/Action.h +++ b/include/clang/Driver/Action.h @@ -51,9 +51,10 @@ public: AssembleJobClass, LinkJobClass, LipoJobClass, + DsymutilJobClass, JobClassFirst=PreprocessJobClass, - JobClassLast=LipoJobClass + JobClassLast=DsymutilJobClass }; static const char *getClassName(ActionClass AC); @@ -211,6 +212,16 @@ public: static bool classof(const LipoJobAction *) { return true; } }; +class DsymutilJobAction : public JobAction { +public: + DsymutilJobAction(ActionList &Inputs, types::ID Type); + + static bool classof(const Action *A) { + return A->getKind() == DsymutilJobClass; + } + static bool classof(const DsymutilJobAction *) { return true; } +}; + } // end namespace driver } // end namespace clang diff --git a/lib/Driver/Action.cpp b/lib/Driver/Action.cpp index b9a3306d53..f34971bfa0 100644 --- a/lib/Driver/Action.cpp +++ b/lib/Driver/Action.cpp @@ -30,6 +30,7 @@ const char *Action::getClassName(ActionClass AC) { case AssembleJobClass: return "assembler"; case LinkJobClass: return "linker"; case LipoJobClass: return "lipo"; + case DsymutilJobClass: return "dsymutil"; } assert(0 && "invalid class"); @@ -79,3 +80,7 @@ LinkJobAction::LinkJobAction(ActionList &Inputs, types::ID Type) LipoJobAction::LipoJobAction(ActionList &Inputs, types::ID Type) : JobAction(LipoJobClass, Inputs, Type) { } + +DsymutilJobAction::DsymutilJobAction(ActionList &Inputs, types::ID Type) + : JobAction(DsymutilJobClass, Inputs, Type) { +} diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index abb55b07d1..92c7d793f9 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -225,6 +225,8 @@ Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA) const { T = new tools::darwin::Link(*this); break; case Action::LipoJobClass: T = new tools::darwin::Lipo(*this); break; + case Action::DsymutilJobClass: + T = new tools::darwin::Dsymutil(*this); break; } } @@ -740,6 +742,8 @@ Tool &Generic_GCC::SelectTool(const Compilation &C, // driver is Darwin. case Action::LipoJobClass: T = new tools::darwin::Lipo(*this); break; + case Action::DsymutilJobClass: + T = new tools::darwin::Dsymutil(*this); break; } } diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 0d6cb30205..518debce93 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -2603,6 +2603,26 @@ void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); } +void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA, + Job &Dest, const InputInfo &Output, + const InputInfoList &Inputs, + const ArgList &Args, + const char *LinkingOutput) const { + ArgStringList CmdArgs; + + assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); + const InputInfo &Input = Inputs[0]; + assert(Input.isFilename() && "Unexpected dsymutil input."); + CmdArgs.push_back(Input.getFilename()); + + CmdArgs.push_back("-o"); + CmdArgs.push_back(Output.getFilename()); + + const char *Exec = + Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil")); + Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); +} + void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA, Job &Dest, const InputInfo &Output, const InputInfoList &Inputs, diff --git a/lib/Driver/Tools.h b/lib/Driver/Tools.h index d5e98dd24c..606007d2df 100644 --- a/lib/Driver/Tools.h +++ b/lib/Driver/Tools.h @@ -288,6 +288,23 @@ namespace darwin { const ArgList &TCArgs, const char *LinkingOutput) const; }; + + class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool { + public: + Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil", + "dsymutil", TC) {} + + virtual bool acceptsPipedInput() const { return false; } + virtual bool canPipeOutput() const { return false; } + virtual bool hasIntegratedCPP() const { return false; } + + virtual void ConstructJob(Compilation &C, const JobAction &JA, + Job &Dest, + const InputInfo &Output, + const InputInfoList &Inputs, + const ArgList &TCArgs, + const char *LinkingOutput) const; + }; } /// openbsd -- Directly call GNU Binutils assembler and linker -- 2.49.0