]> granicus.if.org Git - clang/commitdiff
Driver: Sketch Tool and ToolChain classes.
authorDaniel Dunbar <daniel@zuster.org>
Mon, 16 Mar 2009 05:25:36 +0000 (05:25 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Mon, 16 Mar 2009 05:25:36 +0000 (05:25 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67036 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Driver/Driver.h
include/clang/Driver/Tool.h [new file with mode: 0644]
include/clang/Driver/ToolChain.h [new file with mode: 0644]
lib/Driver/Driver.cpp
lib/Driver/Tool.cpp [new file with mode: 0644]
lib/Driver/ToolChain.cpp [new file with mode: 0644]

index 33d17ef1003b0e77e9d84b7b06c5f8b21795a80e..bad26d729680bd7f9cc5575a6584cc538c7abe37 100644 (file)
@@ -155,13 +155,21 @@ public:
   void PrintActions(const ArgList &Args, const ActionList &Actions) const;
 
   /// GetFilePath - Lookup \arg Name in the list of file search paths.
+  ///
+  /// \arg TC - Use the provided tool chain for additional information
+  /// on directories to search, or the DefaultToolChain if not
+  /// provided.
   // FIXME: This should be in CompilationInfo.
-  llvm::sys::Path GetFilePath(const char *Name) const;
+  llvm::sys::Path GetFilePath(const char *Name, const ToolChain *TC=0) const;
 
   /// GetProgramPath - Lookup \arg Name in the list of program search
   /// paths.
+  ///
+  /// \arg TC - Use the provided tool chain for additional information
+  /// on directories to search, or the DefaultToolChain if not
+  /// provided.
   // FIXME: This should be in CompilationInfo.
-  llvm::sys::Path GetProgramPath(const char *Name) const;
+  llvm::sys::Path GetProgramPath(const char *Name, const ToolChain *TC=0) const;
 
   /// HandleImmediateArgs - Handle any arguments which should be
   /// treated before building actions or binding tools.
diff --git a/include/clang/Driver/Tool.h b/include/clang/Driver/Tool.h
new file mode 100644 (file)
index 0000000..0e3fc41
--- /dev/null
@@ -0,0 +1,32 @@
+//===--- Tool.h - Compilation Tools -----------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CLANG_DRIVER_TOOL_H_
+#define CLANG_DRIVER_TOOL_H_
+
+namespace clang {
+namespace driver {
+
+/// Tool - Information on a specific compilation tool.
+class Tool {
+protected:
+  Tool();
+
+public:
+  virtual ~Tool();
+
+  virtual bool acceptsPipedInput() const = 0;
+  virtual bool canPipeOutput() const = 0;
+  virtual bool hasIntegratedCPP() const = 0;
+};
+
+} // end namespace driver
+} // end namespace clang
+
+#endif
diff --git a/include/clang/Driver/ToolChain.h b/include/clang/Driver/ToolChain.h
new file mode 100644 (file)
index 0000000..b90aa27
--- /dev/null
@@ -0,0 +1,84 @@
+//===--- ToolChain.h - Collections of tools for one platform ----*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CLANG_DRIVER_TOOLCHAIN_H_
+#define CLANG_DRIVER_TOOLCHAIN_H_
+
+#include "llvm/System/Path.h"
+#include <string>
+
+namespace clang {
+namespace driver {
+  class ArgList;
+  class Compilation;
+  class Driver;
+  class JobAction;
+  class Tool;
+
+/// ToolChain - Access to tools for a single platform.
+class ToolChain {
+  Driver &TheDriver;
+
+  std::string Arch, Platform, OS;
+
+protected:
+  ToolChain(Driver &D, const char *_Arch, const char *_Platform, 
+            const char *_OS);
+
+public:
+  virtual ~ToolChain();
+
+  // Accessors
+
+  const std::string &getArchName() const { return Arch; }
+  const std::string &getPlatform() const { return Platform; }
+  const std::string &getOS() const { return OS; }
+
+  // Tool access.
+
+  /// TranslateArgs - Create a new derived argument list for any
+  /// argument translations this ToolChain may wish to perform.
+  virtual ArgList *TranslateArgs(const ArgList &Args) const = 0;
+
+  /// SelectTool - Choose a tool to use to handle the action \arg JA.
+  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const = 0;
+
+  // Helper methods
+
+  llvm::sys::Path GetFilePath(const Compilation &C, const char *Name) const;
+  llvm::sys::Path GetProgramPath(const Compilation &C, const char *Name) const;
+
+  /// ShouldUseClangCompilar - Should the clang compiler be used to
+  /// handle this action.
+  bool ShouldUseClangCompiler(const Compilation &C, const JobAction &JA) const;
+
+  // Platform defaults information
+
+  /// IsMathErrnoDefault - Does this tool chain set -fmath-errno by
+  /// default.
+  virtual bool IsMathErrnoDefault() const = 0;
+
+  /// IsUnwindTablesDefault - Does this tool chain use -funwind-tables
+  /// by default.
+  virtual bool IsUnwindTablesDefault() const = 0;
+
+  /// GetDefaultRelocationModel - Return the LLVM name of the default
+  /// relocation model for this tool chain.
+  virtual const char *GetDefaultRelocationModel() const = 0;
+
+  /// GetForcedPicModel - Return the LLVM name of the forced PIC model
+  /// for this tool chain, or 0 if this tool chain does not force a
+  /// particular PIC mode.
+  virtual const char *GetForcedPicModel() const = 0;
+};
+
+} // end namespace driver
+} // end namespace clang
+
+#endif
index d5b337b707eec0c225b5606afadbffe3546d073a..60dd45cd53d39232e1aee6ac84596332d003e1aa 100644 (file)
@@ -582,13 +582,19 @@ Compilation *Driver::BuildJobs(const ArgList &Args,
   return 0;
 }
 
-llvm::sys::Path Driver::GetFilePath(const char *Name) const {
+llvm::sys::Path Driver::GetFilePath(const char *Name,
+                                    const ToolChain *TC) const {
   // FIXME: Implement.
+  if (!TC) TC = DefaultToolChain;
+
   return llvm::sys::Path(Name);
 }
 
-llvm::sys::Path Driver::GetProgramPath(const char *Name) const {
+llvm::sys::Path Driver::GetProgramPath(const char *Name, 
+                                       const ToolChain *TC) const {
   // FIXME: Implement.
+  if (!TC) TC = DefaultToolChain;
+
   return llvm::sys::Path(Name);
 }
 
diff --git a/lib/Driver/Tool.cpp b/lib/Driver/Tool.cpp
new file mode 100644 (file)
index 0000000..52c047b
--- /dev/null
@@ -0,0 +1,15 @@
+//===--- Tool.cpp - Compilation Tools -----------------------------------*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/Driver/Tool.h"
+
+using namespace clang::driver;
+
+Tool::~Tool() {
+}
diff --git a/lib/Driver/ToolChain.cpp b/lib/Driver/ToolChain.cpp
new file mode 100644 (file)
index 0000000..ff4e97b
--- /dev/null
@@ -0,0 +1,62 @@
+//===--- ToolChain.cpp - Collections of tools for one platform ----------*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/Driver/ToolChain.h"
+
+#include "clang/Driver/Action.h"
+#include "clang/Driver/Driver.h"
+
+using namespace clang::driver;
+
+ToolChain::ToolChain(Driver &_TheDriver, const char *_Arch, 
+                     const char *_Platform, const char *_OS) 
+  : TheDriver(_TheDriver), Arch(_Arch), Platform(_Platform), OS(_OS) {
+}
+
+ToolChain::~ToolChain() {
+}
+
+llvm::sys::Path ToolChain::GetFilePath(const Compilation &C, 
+                                       const char *Name) const {
+  return TheDriver.GetFilePath(Name, this);
+  
+}
+
+llvm::sys::Path ToolChain::GetProgramPath(const Compilation &C, 
+                                          const char *Name) const {
+  return TheDriver.GetProgramPath(Name, this);
+}
+
+bool ToolChain::ShouldUseClangCompiler(const Compilation &C, 
+                                       const JobAction &JA) const {
+  // Check if user requested no clang, or clang doesn't understand
+  // this type (we only handle single inputs for now).
+  if (TheDriver.CCCNoClang || JA.size() != 1 || 
+      !types::isAcceptedByClang((*JA.begin())->getType()))
+    return false;
+
+  // Otherwise make sure this is an action clang undertands.
+  if (isa<PreprocessJobAction>(JA)) {
+    if (TheDriver.CCCNoClangCPP)
+      return false;
+  } else if (!isa<PrecompileJobAction>(JA) && !isa<CompileJobAction>(JA))
+    return false;
+
+  // Avoid CXX if the user requested.
+  if (TheDriver.CCCNoClangCXX && types::isCXX((*JA.begin())->getType()))
+    return false;
+
+  // Finally, don't use clang if this isn't one of the user specified
+  // archs to build.
+  if (!TheDriver.CCCClangArchs.empty() && 
+      TheDriver.CCCClangArchs.count(getArchName()))
+    return false;
+
+  return true;
+}