ToolChains.h revision 985b825eea7387be10478de0430815ed6a673326
183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar//===--- ToolChains.h - ToolChain Implementations ---------------*- C++ -*-===//
283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar//
383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar//                     The LLVM Compiler Infrastructure
483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar//
583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar// This file is distributed under the University of Illinois Open Source
683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar// License. See LICENSE.TXT for details.
783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar//
883b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar//===----------------------------------------------------------------------===//
983b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
1083b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#ifndef CLANG_LIB_DRIVER_TOOLCHAINS_H_
1183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#define CLANG_LIB_DRIVER_TOOLCHAINS_H_
1283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
13670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "clang/Driver/Action.h"
1483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#include "clang/Driver/ToolChain.h"
1583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
16670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "llvm/ADT/DenseMap.h"
1783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#include "llvm/Support/Compiler.h"
1883b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
19670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "Tools.h"
20670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar
2183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarnamespace clang {
2283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarnamespace driver {
23985b825eea7387be10478de0430815ed6a673326Daniel Dunbarnamespace toolchains {
2483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
25670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar  /// Generic_GCC - A tool chain using the 'gcc' command to perform
26670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar  /// all subcommands; this relies on gcc translating the majority of
27670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar  /// command line options.
28985b825eea7387be10478de0430815ed6a673326Daniel Dunbarclass VISIBILITY_HIDDEN Generic_GCC : public ToolChain {
29670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar  mutable llvm::DenseMap<unsigned, Tool*> Tools;
30670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar
3183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarpublic:
3283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar  Generic_GCC(const HostInfo &Host, const char *Arch, const char *Platform,
33670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar              const char *OS) : ToolChain(Host, Arch, Platform, OS) {}
3483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
3583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar  virtual ArgList *TranslateArgs(ArgList &Args) const { return &Args; }
3683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
3783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const {
38670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar    Action::ActionClass Key;
39670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar    if (ShouldUseClangCompiler(C, JA))
40670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar      Key = Action::AnalyzeJobClass;
41670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar    else
42670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar      Key = JA.getKind();
43670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar
44670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar    Tool *&T = Tools[Key];
45670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar    if (!T) {
46670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar      switch (Key) {
47670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar      default:
48670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar        assert(0 && "Invalid tool kind.");
49670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar      case Action::PreprocessJobClass:
50670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar        T = new tools::GCC_Preprocess(*this); break;
51670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar      case Action::PrecompileJobClass:
52670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar        T = new tools::GCC_Precompile(*this); break;
53670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar      case Action::AnalyzeJobClass:
54670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar        T = new tools::Clang(*this); break;
55670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar      case Action::CompileJobClass:
56670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar        T = new tools::GCC_Compile(*this); break;
57670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar      case Action::AssembleJobClass:
58670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar        T = new tools::GCC_Assemble(*this); break;
59670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar      case Action::LinkJobClass:
60670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar        T = new tools::GCC_Assemble(*this); break;
61670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar      }
62670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar    }
63670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar
64670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar    return *T;
6583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar  }
6683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
6783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar  virtual bool IsMathErrnoDefault() const { return true; }
6883b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
6983b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar  virtual bool IsUnwindTablesDefault() const {
7083b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar    // FIXME: Gross; we should probably have some separate target definition,
7183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar    // possibly even reusing the one in clang.
7283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar    return getArchName() == "x86_64";
7383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar  }
7483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
7583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar  virtual const char *GetDefaultRelocationModel() const {
7683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar    return "static";
7783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar  }
7883b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
7983b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar  virtual const char *GetForcedPicModel() const {
8083b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar    return 0;
8183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar  }
8283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar};
8383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
8483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace toolchains
8583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace driver
8683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace clang
8783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
8883b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#endif
89