summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/clang/Driver/Tool.h11
-rw-r--r--lib/Driver/Tool.cpp3
-rw-r--r--lib/Driver/ToolChains.h40
3 files changed, 48 insertions, 6 deletions
diff --git a/include/clang/Driver/Tool.h b/include/clang/Driver/Tool.h
index 0e3fc4189b..28db064258 100644
--- a/include/clang/Driver/Tool.h
+++ b/include/clang/Driver/Tool.h
@@ -12,15 +12,20 @@
namespace clang {
namespace driver {
-
+ class ToolChain;
+
/// Tool - Information on a specific compilation tool.
class Tool {
-protected:
- Tool();
+ const ToolChain &TheToolChain;
+
+public:
+ Tool(const ToolChain &TC);
public:
virtual ~Tool();
+ const ToolChain &getToolChain() const { return TheToolChain; }
+
virtual bool acceptsPipedInput() const = 0;
virtual bool canPipeOutput() const = 0;
virtual bool hasIntegratedCPP() const = 0;
diff --git a/lib/Driver/Tool.cpp b/lib/Driver/Tool.cpp
index 52c047b8dd..090418e3be 100644
--- a/lib/Driver/Tool.cpp
+++ b/lib/Driver/Tool.cpp
@@ -11,5 +11,8 @@
using namespace clang::driver;
+Tool::Tool(const ToolChain &TC) : TheToolChain(TC) {
+}
+
Tool::~Tool() {
}
diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h
index a8360af359..be476d78ed 100644
--- a/lib/Driver/ToolChains.h
+++ b/lib/Driver/ToolChains.h
@@ -10,24 +10,58 @@
#ifndef CLANG_LIB_DRIVER_TOOLCHAINS_H_
#define CLANG_LIB_DRIVER_TOOLCHAINS_H_
+#include "clang/Driver/Action.h"
#include "clang/Driver/ToolChain.h"
+#include "llvm/ADT/DenseMap.h"
#include "llvm/Support/Compiler.h"
+#include "Tools.h"
+
namespace clang {
namespace driver {
namespace toolchains VISIBILITY_HIDDEN {
+ /// Generic_GCC - A tool chain using the 'gcc' command to perform
+ /// all subcommands; this relies on gcc translating the majority of
+ /// command line options.
class Generic_GCC : public ToolChain {
+ mutable llvm::DenseMap<unsigned, Tool*> Tools;
+
public:
Generic_GCC(const HostInfo &Host, const char *Arch, const char *Platform,
- const char *OS) : ToolChain(Host, Arch, Platform, OS) {
- }
+ const char *OS) : ToolChain(Host, Arch, Platform, OS) {}
virtual ArgList *TranslateArgs(ArgList &Args) const { return &Args; }
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const {
- return *((Tool*) 0);
+ Action::ActionClass Key;
+ if (ShouldUseClangCompiler(C, JA))
+ Key = Action::AnalyzeJobClass;
+ else
+ Key = JA.getKind();
+
+ Tool *&T = Tools[Key];
+ if (!T) {
+ switch (Key) {
+ default:
+ assert(0 && "Invalid tool kind.");
+ case Action::PreprocessJobClass:
+ T = new tools::GCC_Preprocess(*this); break;
+ case Action::PrecompileJobClass:
+ T = new tools::GCC_Precompile(*this); break;
+ case Action::AnalyzeJobClass:
+ T = new tools::Clang(*this); break;
+ case Action::CompileJobClass:
+ T = new tools::GCC_Compile(*this); break;
+ case Action::AssembleJobClass:
+ T = new tools::GCC_Assemble(*this); break;
+ case Action::LinkJobClass:
+ T = new tools::GCC_Assemble(*this); break;
+ }
+ }
+
+ return *T;
}
virtual bool IsMathErrnoDefault() const { return true; }