aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-03-19 00:36:57 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-03-19 00:36:57 +0000
commitc0a55d12caff98504eace18b553bb111160a8131 (patch)
tree31215894100535e05b891263716ba5102df6c442
parent677e15ffee2ecc9c1c8f46fd77cab4b5afb59640 (diff)
Finish refactoring the tool selection logic.
The general pattern now is that Foobar::constructTool only creates tools defined in the tools::foobar namespace and then delegates to the parent. The remaining duplicated code is now in the tools themselves. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@177368 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Driver/ToolChain.h2
-rw-r--r--lib/Driver/ToolChain.cpp20
-rw-r--r--lib/Driver/ToolChains.cpp40
-rw-r--r--lib/Driver/ToolChains.h1
-rw-r--r--lib/Driver/WindowsToolChain.cpp13
5 files changed, 27 insertions, 49 deletions
diff --git a/include/clang/Driver/ToolChain.h b/include/clang/Driver/ToolChain.h
index 6abf85fe75..3733d45eeb 100644
--- a/include/clang/Driver/ToolChain.h
+++ b/include/clang/Driver/ToolChain.h
@@ -63,7 +63,7 @@ private:
protected:
ToolChain(const Driver &D, const llvm::Triple &T, const ArgList &Args);
- virtual Tool *constructTool(Action::ActionClass AC) const = 0;
+ virtual Tool *constructTool(Action::ActionClass AC) const;
/// \name Utilities for implementing subclasses.
///@{
diff --git a/lib/Driver/ToolChain.cpp b/lib/Driver/ToolChain.cpp
index 5322a6dae2..def3b3ddea 100644
--- a/lib/Driver/ToolChain.cpp
+++ b/lib/Driver/ToolChain.cpp
@@ -63,6 +63,26 @@ bool ToolChain::IsUnwindTablesDefault() const {
return false;
}
+Tool *ToolChain::constructTool(Action::ActionClass AC) const {
+ switch (AC) {
+ case Action::InputClass:
+ case Action::BindArchClass:
+ case Action::AssembleJobClass:
+ case Action::LinkJobClass:
+ case Action::LipoJobClass:
+ case Action::DsymutilJobClass:
+ case Action::VerifyJobClass:
+ llvm_unreachable("Invalid tool kind.");
+
+ case Action::CompileJobClass:
+ case Action::PrecompileJobClass:
+ case Action::PreprocessJobClass:
+ case Action::AnalyzeJobClass:
+ case Action::MigrateJobClass:
+ return new tools::Clang(*this);
+ }
+}
+
Tool &ToolChain::SelectTool(const JobAction &JA) const {
Action::ActionClass Key;
if (getDriver().ShouldUseClangCompiler(JA))
diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp
index 802d0ce244..0e29ba026d 100644
--- a/lib/Driver/ToolChains.cpp
+++ b/lib/Driver/ToolChains.cpp
@@ -174,15 +174,6 @@ void Generic_ELF::anchor() {}
Tool *Darwin::constructTool(Action::ActionClass AC) const {
switch (AC) {
- case Action::InputClass:
- case Action::BindArchClass:
- llvm_unreachable("Invalid tool kind.");
- case Action::PreprocessJobClass:
- case Action::AnalyzeJobClass:
- case Action::MigrateJobClass:
- case Action::PrecompileJobClass:
- case Action::CompileJobClass:
- return new tools::Clang(*this);
case Action::AssembleJobClass:
return new tools::darwin::Assemble(*this);
case Action::LinkJobClass:
@@ -193,6 +184,8 @@ Tool *Darwin::constructTool(Action::ActionClass AC) const {
return new tools::darwin::Dsymutil(*this);
case Action::VerifyJobClass:
return new tools::darwin::VerifyDebug(*this);
+ default:
+ return ToolChain::constructTool(AC);
}
}
@@ -1359,31 +1352,18 @@ Generic_GCC::~Generic_GCC() {
Tool *Generic_GCC::constructTool(Action::ActionClass AC) const {
switch (AC) {
- case Action::InputClass:
- case Action::BindArchClass:
- llvm_unreachable("Invalid tool kind.");
case Action::PreprocessJobClass:
return new tools::gcc::Preprocess(*this);
case Action::PrecompileJobClass:
return new tools::gcc::Precompile(*this);
- case Action::AnalyzeJobClass:
- case Action::MigrateJobClass:
- return new tools::Clang(*this);
case Action::CompileJobClass:
return new tools::gcc::Compile(*this);
case Action::AssembleJobClass:
return new tools::gcc::Assemble(*this);
case Action::LinkJobClass:
return new tools::gcc::Link(*this);
-
- // This is a bit ungeneric, but the only platform using a driver
- // driver is Darwin.
- case Action::LipoJobClass:
- return new tools::darwin::Lipo(*this);
- case Action::DsymutilJobClass:
- return new tools::darwin::Dsymutil(*this);
- case Action::VerifyJobClass:
- return new tools::darwin::VerifyDebug(*this);
+ default:
+ return ToolChain::constructTool(AC);
}
}
@@ -1518,7 +1498,6 @@ Tool *Hexagon_TC::constructTool(Action::ActionClass AC) const {
case Action::LinkJobClass:
return new tools::hexagon::Link(*this);
default:
- assert(false && "Unsupported action for Hexagon target.");
return Linux::constructTool(AC);
}
}
@@ -1637,17 +1616,6 @@ bool TCEToolChain::isPICDefaultForced() const {
return false;
}
-Tool *TCEToolChain::constructTool(Action::ActionClass AC) const {
- switch (AC) {
- case Action::PreprocessJobClass:
- return new tools::gcc::Preprocess(*this);
- case Action::AnalyzeJobClass:
- return new tools::Clang(*this);
- default:
- llvm_unreachable("Unsupported action for TCE target.");
- }
-}
-
/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
OpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h
index a2b84c92db..fb40a61b88 100644
--- a/lib/Driver/ToolChains.h
+++ b/lib/Driver/ToolChains.h
@@ -528,7 +528,6 @@ public:
const ArgList &Args);
~TCEToolChain();
- virtual Tool *constructTool(Action::ActionClass AC) const;
bool IsMathErrnoDefault() const;
bool isPICDefault() const;
bool isPICDefaultForced() const;
diff --git a/lib/Driver/WindowsToolChain.cpp b/lib/Driver/WindowsToolChain.cpp
index 0909c4c217..b3fdb35d4c 100644
--- a/lib/Driver/WindowsToolChain.cpp
+++ b/lib/Driver/WindowsToolChain.cpp
@@ -38,17 +38,6 @@ Windows::Windows(const Driver &D, const llvm::Triple& Triple,
Tool *Windows::constructTool(Action::ActionClass AC) const {
switch (AC) {
- case Action::InputClass:
- case Action::BindArchClass:
- case Action::LipoJobClass:
- case Action::DsymutilJobClass:
- case Action::VerifyJobClass:
- case Action::PreprocessJobClass:
- case Action::PrecompileJobClass:
- case Action::AnalyzeJobClass:
- case Action::MigrateJobClass:
- case Action::CompileJobClass:
- return new tools::Clang(*this);
case Action::AssembleJobClass:
if (getTriple().getEnvironment() == llvm::Triple::MachO)
return new tools::darwin::Assemble(*this);
@@ -56,6 +45,8 @@ Tool *Windows::constructTool(Action::ActionClass AC) const {
break;
case Action::LinkJobClass:
return new tools::visualstudio::Link(*this);
+ default:
+ return ToolChain::constructTool(AC);
}
}