Home | History | Annotate | Download | only in Driver
      1 //===--- ToolChains.h - ToolChain Implementations ---------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef CLANG_LIB_DRIVER_TOOLCHAINS_H_
     11 #define CLANG_LIB_DRIVER_TOOLCHAINS_H_
     12 
     13 #include "clang/Driver/Action.h"
     14 #include "clang/Driver/ToolChain.h"
     15 
     16 #include "llvm/ADT/DenseMap.h"
     17 #include "llvm/Support/Compiler.h"
     18 
     19 #include "Tools.h"
     20 
     21 namespace clang {
     22 namespace driver {
     23 namespace toolchains {
     24 
     25 /// Generic_GCC - A tool chain using the 'gcc' command to perform
     26 /// all subcommands; this relies on gcc translating the majority of
     27 /// command line options.
     28 class LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain {
     29 protected:
     30   mutable llvm::DenseMap<unsigned, Tool*> Tools;
     31 
     32 public:
     33   Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple);
     34   ~Generic_GCC();
     35 
     36   virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
     37                            const ActionList &Inputs) const;
     38 
     39   virtual bool IsUnwindTablesDefault() const;
     40   virtual const char *GetDefaultRelocationModel() const;
     41   virtual const char *GetForcedPicModel() const;
     42 };
     43 
     44 /// Darwin - The base Darwin tool chain.
     45 class LLVM_LIBRARY_VISIBILITY Darwin : public ToolChain {
     46 public:
     47   /// The host version.
     48   unsigned DarwinVersion[3];
     49 
     50 private:
     51   mutable llvm::DenseMap<unsigned, Tool*> Tools;
     52 
     53   /// Whether the information on the target has been initialized.
     54   //
     55   // FIXME: This should be eliminated. What we want to do is make this part of
     56   // the "default target for arguments" selection process, once we get out of
     57   // the argument translation business.
     58   mutable bool TargetInitialized;
     59 
     60   // FIXME: Remove this once there is a proper way to detect an ARC runtime
     61   // for the simulator.
     62  public:
     63   mutable enum {
     64     ARCSimulator_None,
     65     ARCSimulator_HasARCRuntime,
     66     ARCSimulator_NoARCRuntime
     67   } ARCRuntimeForSimulator;
     68 
     69 private:
     70   /// Whether we are targeting iPhoneOS target.
     71   mutable bool TargetIsIPhoneOS;
     72 
     73   /// Whether we are targeting the iPhoneOS simulator target.
     74   mutable bool TargetIsIPhoneOSSimulator;
     75 
     76   /// The OS version we are targeting.
     77   mutable unsigned TargetVersion[3];
     78 
     79   /// The default macosx-version-min of this tool chain; empty until
     80   /// initialized.
     81   std::string MacosxVersionMin;
     82 
     83   bool hasARCRuntime() const;
     84 
     85 private:
     86   void AddDeploymentTarget(DerivedArgList &Args) const;
     87 
     88 public:
     89   Darwin(const HostInfo &Host, const llvm::Triple& Triple);
     90   ~Darwin();
     91 
     92   std::string ComputeEffectiveClangTriple(const ArgList &Args) const;
     93 
     94   /// @name Darwin Specific Toolchain API
     95   /// {
     96 
     97   // FIXME: Eliminate these ...Target functions and derive separate tool chains
     98   // for these targets and put version in constructor.
     99   void setTarget(bool IsIPhoneOS, unsigned Major, unsigned Minor,
    100                  unsigned Micro, bool IsIOSSim) const {
    101     assert((!IsIOSSim || IsIPhoneOS) && "Unexpected deployment target!");
    102 
    103     // FIXME: For now, allow reinitialization as long as values don't
    104     // change. This will go away when we move away from argument translation.
    105     if (TargetInitialized && TargetIsIPhoneOS == IsIPhoneOS &&
    106         TargetIsIPhoneOSSimulator == IsIOSSim &&
    107         TargetVersion[0] == Major && TargetVersion[1] == Minor &&
    108         TargetVersion[2] == Micro)
    109       return;
    110 
    111     assert(!TargetInitialized && "Target already initialized!");
    112     TargetInitialized = true;
    113     TargetIsIPhoneOS = IsIPhoneOS;
    114     TargetIsIPhoneOSSimulator = IsIOSSim;
    115     TargetVersion[0] = Major;
    116     TargetVersion[1] = Minor;
    117     TargetVersion[2] = Micro;
    118   }
    119 
    120   bool isTargetIPhoneOS() const {
    121     assert(TargetInitialized && "Target not initialized!");
    122     return TargetIsIPhoneOS;
    123   }
    124 
    125   bool isTargetIOSSimulator() const {
    126     assert(TargetInitialized && "Target not initialized!");
    127     return TargetIsIPhoneOSSimulator;
    128   }
    129 
    130   bool isTargetInitialized() const { return TargetInitialized; }
    131 
    132   void getTargetVersion(unsigned (&Res)[3]) const {
    133     assert(TargetInitialized && "Target not initialized!");
    134     Res[0] = TargetVersion[0];
    135     Res[1] = TargetVersion[1];
    136     Res[2] = TargetVersion[2];
    137   }
    138 
    139   /// getDarwinArchName - Get the "Darwin" arch name for a particular compiler
    140   /// invocation. For example, Darwin treats different ARM variations as
    141   /// distinct architectures.
    142   llvm::StringRef getDarwinArchName(const ArgList &Args) const;
    143 
    144   static bool isVersionLT(unsigned (&A)[3], unsigned (&B)[3]) {
    145     for (unsigned i=0; i < 3; ++i) {
    146       if (A[i] > B[i]) return false;
    147       if (A[i] < B[i]) return true;
    148     }
    149     return false;
    150   }
    151 
    152   bool isIPhoneOSVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const {
    153     assert(isTargetIPhoneOS() && "Unexpected call for OS X target!");
    154     unsigned B[3] = { V0, V1, V2 };
    155     return isVersionLT(TargetVersion, B);
    156   }
    157 
    158   bool isMacosxVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const {
    159     assert(!isTargetIPhoneOS() && "Unexpected call for iPhoneOS target!");
    160     unsigned B[3] = { V0, V1, V2 };
    161     return isVersionLT(TargetVersion, B);
    162   }
    163 
    164   /// AddLinkSearchPathArgs - Add the linker search paths to \arg CmdArgs.
    165   ///
    166   /// \param Args - The input argument list.
    167   /// \param CmdArgs [out] - The command argument list to append the paths
    168   /// (prefixed by -L) to.
    169   virtual void AddLinkSearchPathArgs(const ArgList &Args,
    170                                      ArgStringList &CmdArgs) const = 0;
    171 
    172   /// AddLinkARCArgs - Add the linker arguments to link the ARC runtime library.
    173   virtual void AddLinkARCArgs(const ArgList &Args,
    174                               ArgStringList &CmdArgs) const = 0;
    175 
    176   /// AddLinkRuntimeLibArgs - Add the linker arguments to link the compiler
    177   /// runtime library.
    178   virtual void AddLinkRuntimeLibArgs(const ArgList &Args,
    179                                      ArgStringList &CmdArgs) const = 0;
    180 
    181   /// }
    182   /// @name ToolChain Implementation
    183   /// {
    184 
    185   virtual types::ID LookupTypeForExtension(const char *Ext) const;
    186 
    187   virtual bool HasNativeLLVMSupport() const;
    188 
    189   virtual void configureObjCRuntime(ObjCRuntime &runtime) const;
    190 
    191   virtual DerivedArgList *TranslateArgs(const DerivedArgList &Args,
    192                                         const char *BoundArch) const;
    193 
    194   virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
    195                            const ActionList &Inputs) const;
    196 
    197   virtual bool IsBlocksDefault() const {
    198     // Always allow blocks on Darwin; users interested in versioning are
    199     // expected to use /usr/include/Blocks.h.
    200     return true;
    201   }
    202   virtual bool IsIntegratedAssemblerDefault() const {
    203 #ifdef DISABLE_DEFAULT_INTEGRATED_ASSEMBLER
    204     return false;
    205 #else
    206     // Default integrated assembler to on for x86.
    207     return (getTriple().getArch() == llvm::Triple::x86 ||
    208             getTriple().getArch() == llvm::Triple::x86_64);
    209 #endif
    210   }
    211   virtual bool IsStrictAliasingDefault() const {
    212 #ifdef DISABLE_DEFAULT_STRICT_ALIASING
    213     return false;
    214 #else
    215     return ToolChain::IsStrictAliasingDefault();
    216 #endif
    217   }
    218 
    219   virtual bool IsObjCDefaultSynthPropertiesDefault() const {
    220     return false;
    221   }
    222 
    223   virtual bool IsObjCNonFragileABIDefault() const {
    224     // Non-fragile ABI is default for everything but i386.
    225     return getTriple().getArch() != llvm::Triple::x86;
    226   }
    227   virtual bool IsObjCLegacyDispatchDefault() const {
    228     // This is only used with the non-fragile ABI.
    229 
    230     // Legacy dispatch is used everywhere except on x86_64.
    231     return getTriple().getArch() != llvm::Triple::x86_64;
    232   }
    233   virtual bool UseObjCMixedDispatch() const {
    234     // This is only used with the non-fragile ABI and non-legacy dispatch.
    235 
    236     // Mixed dispatch is used everywhere except OS X before 10.6.
    237     return !(!isTargetIPhoneOS() && isMacosxVersionLT(10, 6));
    238   }
    239   virtual bool IsUnwindTablesDefault() const;
    240   virtual unsigned GetDefaultStackProtectorLevel() const {
    241     // Stack protectors default to on for 10.6 and beyond.
    242     return !isTargetIPhoneOS() && !isMacosxVersionLT(10, 6);
    243   }
    244   virtual const char *GetDefaultRelocationModel() const;
    245   virtual const char *GetForcedPicModel() const;
    246 
    247   virtual bool SupportsProfiling() const;
    248 
    249   virtual bool SupportsObjCGC() const;
    250 
    251   virtual bool UseDwarfDebugFlags() const;
    252 
    253   virtual bool UseSjLjExceptions() const;
    254 
    255   /// }
    256 };
    257 
    258 /// DarwinClang - The Darwin toolchain used by Clang.
    259 class LLVM_LIBRARY_VISIBILITY DarwinClang : public Darwin {
    260 public:
    261   DarwinClang(const HostInfo &Host, const llvm::Triple& Triple);
    262 
    263   /// @name Darwin ToolChain Implementation
    264   /// {
    265 
    266   virtual void AddLinkSearchPathArgs(const ArgList &Args,
    267                                     ArgStringList &CmdArgs) const;
    268 
    269   virtual void AddLinkRuntimeLibArgs(const ArgList &Args,
    270                                      ArgStringList &CmdArgs) const;
    271   void AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
    272                          const char *DarwinStaticLib) const;
    273 
    274   virtual void AddCXXStdlibLibArgs(const ArgList &Args,
    275                                    ArgStringList &CmdArgs) const;
    276 
    277   virtual void AddCCKextLibArgs(const ArgList &Args,
    278                                 ArgStringList &CmdArgs) const;
    279 
    280   virtual void AddLinkARCArgs(const ArgList &Args,
    281                               ArgStringList &CmdArgs) const;
    282   /// }
    283 };
    284 
    285 /// Darwin_Generic_GCC - Generic Darwin tool chain using gcc.
    286 class LLVM_LIBRARY_VISIBILITY Darwin_Generic_GCC : public Generic_GCC {
    287 public:
    288   Darwin_Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple)
    289     : Generic_GCC(Host, Triple) {}
    290 
    291   std::string ComputeEffectiveClangTriple(const ArgList &Args) const;
    292 
    293   virtual const char *GetDefaultRelocationModel() const { return "pic"; }
    294 };
    295 
    296 class LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC {
    297  public:
    298   Generic_ELF(const HostInfo &Host, const llvm::Triple& Triple)
    299     : Generic_GCC(Host, Triple) {}
    300 
    301   virtual bool IsIntegratedAssemblerDefault() const {
    302     // Default integrated assembler to on for x86.
    303     return (getTriple().getArch() == llvm::Triple::x86 ||
    304             getTriple().getArch() == llvm::Triple::x86_64);
    305   }
    306 };
    307 
    308 class LLVM_LIBRARY_VISIBILITY AuroraUX : public Generic_GCC {
    309 public:
    310   AuroraUX(const HostInfo &Host, const llvm::Triple& Triple);
    311 
    312   virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
    313                            const ActionList &Inputs) const;
    314 };
    315 
    316 class LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF {
    317 public:
    318   OpenBSD(const HostInfo &Host, const llvm::Triple& Triple);
    319 
    320   virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
    321                            const ActionList &Inputs) const;
    322 };
    323 
    324 class LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF {
    325 public:
    326   FreeBSD(const HostInfo &Host, const llvm::Triple& Triple);
    327 
    328   virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
    329                            const ActionList &Inputs) const;
    330 };
    331 
    332 class LLVM_LIBRARY_VISIBILITY NetBSD : public Generic_ELF {
    333   const llvm::Triple ToolTriple;
    334 
    335 public:
    336   NetBSD(const HostInfo &Host, const llvm::Triple& Triple,
    337          const llvm::Triple& ToolTriple);
    338 
    339   virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
    340                            const ActionList &Inputs) const;
    341 };
    342 
    343 class LLVM_LIBRARY_VISIBILITY Minix : public Generic_GCC {
    344 public:
    345   Minix(const HostInfo &Host, const llvm::Triple& Triple);
    346 
    347   virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
    348                            const ActionList &Inputs) const;
    349 };
    350 
    351 class LLVM_LIBRARY_VISIBILITY DragonFly : public Generic_ELF {
    352 public:
    353   DragonFly(const HostInfo &Host, const llvm::Triple& Triple);
    354 
    355   virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
    356                            const ActionList &Inputs) const;
    357 };
    358 
    359 class LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF {
    360 public:
    361   Linux(const HostInfo &Host, const llvm::Triple& Triple);
    362 
    363   virtual bool HasNativeLLVMSupport() const;
    364 
    365   virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
    366                            const ActionList &Inputs) const;
    367 
    368   std::string Linker;
    369   std::vector<std::string> ExtraOpts;
    370 };
    371 
    372 
    373 /// TCEToolChain - A tool chain using the llvm bitcode tools to perform
    374 /// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
    375 class LLVM_LIBRARY_VISIBILITY TCEToolChain : public ToolChain {
    376 public:
    377   TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple);
    378   ~TCEToolChain();
    379 
    380   virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
    381                            const ActionList &Inputs) const;
    382   bool IsMathErrnoDefault() const;
    383   bool IsUnwindTablesDefault() const;
    384   const char* GetDefaultRelocationModel() const;
    385   const char* GetForcedPicModel() const;
    386 
    387 private:
    388   mutable llvm::DenseMap<unsigned, Tool*> Tools;
    389 
    390 };
    391 
    392 class LLVM_LIBRARY_VISIBILITY Windows : public ToolChain {
    393   mutable llvm::DenseMap<unsigned, Tool*> Tools;
    394 
    395 public:
    396   Windows(const HostInfo &Host, const llvm::Triple& Triple);
    397 
    398   virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
    399                            const ActionList &Inputs) const;
    400 
    401   virtual bool IsIntegratedAssemblerDefault() const;
    402   virtual bool IsUnwindTablesDefault() const;
    403   virtual const char *GetDefaultRelocationModel() const;
    404   virtual const char *GetForcedPicModel() const;
    405 };
    406 
    407 } // end namespace toolchains
    408 } // end namespace driver
    409 } // end namespace clang
    410 
    411 #endif
    412