Home | History | Annotate | Download | only in Driver
      1 //===--- ToolChain.h - Collections of tools for one platform ----*- 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_DRIVER_TOOLCHAIN_H_
     11 #define CLANG_DRIVER_TOOLCHAIN_H_
     12 
     13 #include "clang/Driver/Action.h"
     14 #include "clang/Driver/Multilib.h"
     15 #include "clang/Driver/Types.h"
     16 #include "clang/Driver/Util.h"
     17 #include "llvm/ADT/SmallVector.h"
     18 #include "llvm/ADT/Triple.h"
     19 #include "llvm/Support/Path.h"
     20 #include <memory>
     21 #include <string>
     22 
     23 namespace llvm {
     24 namespace opt {
     25   class ArgList;
     26   class DerivedArgList;
     27   class InputArgList;
     28 }
     29 }
     30 
     31 namespace clang {
     32   class ObjCRuntime;
     33 
     34 namespace driver {
     35   class Compilation;
     36   class Driver;
     37   class JobAction;
     38   class SanitizerArgs;
     39   class Tool;
     40 
     41 /// ToolChain - Access to tools for a single platform.
     42 class ToolChain {
     43 public:
     44   typedef SmallVector<std::string, 4> path_list;
     45 
     46   enum CXXStdlibType {
     47     CST_Libcxx,
     48     CST_Libstdcxx
     49   };
     50 
     51   enum RuntimeLibType {
     52     RLT_CompilerRT,
     53     RLT_Libgcc
     54   };
     55 
     56 private:
     57   const Driver &D;
     58   const llvm::Triple Triple;
     59   const llvm::opt::ArgList &Args;
     60 
     61   /// The list of toolchain specific path prefixes to search for
     62   /// files.
     63   path_list FilePaths;
     64 
     65   /// The list of toolchain specific path prefixes to search for
     66   /// programs.
     67   path_list ProgramPaths;
     68 
     69   mutable std::unique_ptr<Tool> Clang;
     70   mutable std::unique_ptr<Tool> Assemble;
     71   mutable std::unique_ptr<Tool> Link;
     72   Tool *getClang() const;
     73   Tool *getAssemble() const;
     74   Tool *getLink() const;
     75   Tool *getClangAs() const;
     76 
     77   mutable std::unique_ptr<SanitizerArgs> SanitizerArguments;
     78 
     79 protected:
     80   MultilibSet Multilibs;
     81 
     82   ToolChain(const Driver &D, const llvm::Triple &T,
     83             const llvm::opt::ArgList &Args);
     84 
     85   virtual Tool *buildAssembler() const;
     86   virtual Tool *buildLinker() const;
     87   virtual Tool *getTool(Action::ActionClass AC) const;
     88 
     89   /// \name Utilities for implementing subclasses.
     90   ///@{
     91   static void addSystemInclude(const llvm::opt::ArgList &DriverArgs,
     92                                llvm::opt::ArgStringList &CC1Args,
     93                                const Twine &Path);
     94   static void addExternCSystemInclude(const llvm::opt::ArgList &DriverArgs,
     95                                       llvm::opt::ArgStringList &CC1Args,
     96                                       const Twine &Path);
     97   static void
     98       addExternCSystemIncludeIfExists(const llvm::opt::ArgList &DriverArgs,
     99                                       llvm::opt::ArgStringList &CC1Args,
    100                                       const Twine &Path);
    101   static void addSystemIncludes(const llvm::opt::ArgList &DriverArgs,
    102                                 llvm::opt::ArgStringList &CC1Args,
    103                                 ArrayRef<StringRef> Paths);
    104   ///@}
    105 
    106 public:
    107   virtual ~ToolChain();
    108 
    109   // Accessors
    110 
    111   const Driver &getDriver() const;
    112   const llvm::Triple &getTriple() const { return Triple; }
    113 
    114   llvm::Triple::ArchType getArch() const { return Triple.getArch(); }
    115   StringRef getArchName() const { return Triple.getArchName(); }
    116   StringRef getPlatform() const { return Triple.getVendorName(); }
    117   StringRef getOS() const { return Triple.getOSName(); }
    118 
    119   /// \brief Returns true if the toolchain is targeting a non-native architecture.
    120   bool isCrossCompiling() const;
    121 
    122   /// \brief Provide the default architecture name (as expected by -arch) for
    123   /// this toolchain. Note t
    124   std::string getDefaultUniversalArchName() const;
    125 
    126   std::string getTripleString() const {
    127     return Triple.getTriple();
    128   }
    129 
    130   path_list &getFilePaths() { return FilePaths; }
    131   const path_list &getFilePaths() const { return FilePaths; }
    132 
    133   path_list &getProgramPaths() { return ProgramPaths; }
    134   const path_list &getProgramPaths() const { return ProgramPaths; }
    135 
    136   const MultilibSet &getMultilibs() const { return Multilibs; }
    137 
    138   const SanitizerArgs& getSanitizerArgs() const;
    139 
    140   // Tool access.
    141 
    142   /// TranslateArgs - Create a new derived argument list for any argument
    143   /// translations this ToolChain may wish to perform, or 0 if no tool chain
    144   /// specific translations are needed.
    145   ///
    146   /// \param BoundArch - The bound architecture name, or 0.
    147   virtual llvm::opt::DerivedArgList *
    148   TranslateArgs(const llvm::opt::DerivedArgList &Args,
    149                 const char *BoundArch) const {
    150     return nullptr;
    151   }
    152 
    153   /// Choose a tool to use to handle the action \p JA.
    154   Tool *SelectTool(const JobAction &JA) const;
    155 
    156   // Helper methods
    157 
    158   std::string GetFilePath(const char *Name) const;
    159   std::string GetProgramPath(const char *Name) const;
    160 
    161   /// Returns the linker path, respecting the -fuse-ld= argument to determine
    162   /// the linker suffix or name.
    163   std::string GetLinkerPath() const;
    164 
    165   /// \brief Dispatch to the specific toolchain for verbose printing.
    166   ///
    167   /// This is used when handling the verbose option to print detailed,
    168   /// toolchain-specific information useful for understanding the behavior of
    169   /// the driver on a specific platform.
    170   virtual void printVerboseInfo(raw_ostream &OS) const {};
    171 
    172   // Platform defaults information
    173 
    174   /// HasNativeLTOLinker - Check whether the linker and related tools have
    175   /// native LLVM support.
    176   virtual bool HasNativeLLVMSupport() const;
    177 
    178   /// LookupTypeForExtension - Return the default language type to use for the
    179   /// given extension.
    180   virtual types::ID LookupTypeForExtension(const char *Ext) const;
    181 
    182   /// IsBlocksDefault - Does this tool chain enable -fblocks by default.
    183   virtual bool IsBlocksDefault() const { return false; }
    184 
    185   /// IsIntegratedAssemblerDefault - Does this tool chain enable -integrated-as
    186   /// by default.
    187   virtual bool IsIntegratedAssemblerDefault() const { return false; }
    188 
    189   /// \brief Check if the toolchain should use the integrated assembler.
    190   bool useIntegratedAs() const;
    191 
    192   /// IsMathErrnoDefault - Does this tool chain use -fmath-errno by default.
    193   virtual bool IsMathErrnoDefault() const { return true; }
    194 
    195   /// IsEncodeExtendedBlockSignatureDefault - Does this tool chain enable
    196   /// -fencode-extended-block-signature by default.
    197   virtual bool IsEncodeExtendedBlockSignatureDefault() const { return false; }
    198 
    199   /// IsObjCNonFragileABIDefault - Does this tool chain set
    200   /// -fobjc-nonfragile-abi by default.
    201   virtual bool IsObjCNonFragileABIDefault() const { return false; }
    202 
    203   /// UseObjCMixedDispatchDefault - When using non-legacy dispatch, should the
    204   /// mixed dispatch method be used?
    205   virtual bool UseObjCMixedDispatch() const { return false; }
    206 
    207   /// GetDefaultStackProtectorLevel - Get the default stack protector level for
    208   /// this tool chain (0=off, 1=on, 2=strong, 3=all).
    209   virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const {
    210     return 0;
    211   }
    212 
    213   /// GetDefaultRuntimeLibType - Get the default runtime library variant to use.
    214   virtual RuntimeLibType GetDefaultRuntimeLibType() const {
    215     return ToolChain::RLT_Libgcc;
    216   }
    217 
    218   /// IsUnwindTablesDefault - Does this tool chain use -funwind-tables
    219   /// by default.
    220   virtual bool IsUnwindTablesDefault() const;
    221 
    222   /// \brief Test whether this toolchain defaults to PIC.
    223   virtual bool isPICDefault() const = 0;
    224 
    225   /// \brief Test whether this toolchain defaults to PIE.
    226   virtual bool isPIEDefault() const = 0;
    227 
    228   /// \brief Tests whether this toolchain forces its default for PIC, PIE or
    229   /// non-PIC.  If this returns true, any PIC related flags should be ignored
    230   /// and instead the results of \c isPICDefault() and \c isPIEDefault() are
    231   /// used exclusively.
    232   virtual bool isPICDefaultForced() const = 0;
    233 
    234   /// SupportsProfiling - Does this tool chain support -pg.
    235   virtual bool SupportsProfiling() const { return true; }
    236 
    237   /// Does this tool chain support Objective-C garbage collection.
    238   virtual bool SupportsObjCGC() const { return true; }
    239 
    240   /// Complain if this tool chain doesn't support Objective-C ARC.
    241   virtual void CheckObjCARC() const {}
    242 
    243   /// UseDwarfDebugFlags - Embed the compile options to clang into the Dwarf
    244   /// compile unit information.
    245   virtual bool UseDwarfDebugFlags() const { return false; }
    246 
    247   /// UseSjLjExceptions - Does this tool chain use SjLj exceptions.
    248   virtual bool UseSjLjExceptions() const { return false; }
    249 
    250   /// ComputeLLVMTriple - Return the LLVM target triple to use, after taking
    251   /// command line arguments into account.
    252   virtual std::string
    253   ComputeLLVMTriple(const llvm::opt::ArgList &Args,
    254                     types::ID InputType = types::TY_INVALID) const;
    255 
    256   /// ComputeEffectiveClangTriple - Return the Clang triple to use for this
    257   /// target, which may take into account the command line arguments. For
    258   /// example, on Darwin the -mmacosx-version-min= command line argument (which
    259   /// sets the deployment target) determines the version in the triple passed to
    260   /// Clang.
    261   virtual std::string ComputeEffectiveClangTriple(
    262       const llvm::opt::ArgList &Args,
    263       types::ID InputType = types::TY_INVALID) const;
    264 
    265   /// getDefaultObjCRuntime - Return the default Objective-C runtime
    266   /// for this platform.
    267   ///
    268   /// FIXME: this really belongs on some sort of DeploymentTarget abstraction
    269   virtual ObjCRuntime getDefaultObjCRuntime(bool isNonFragile) const;
    270 
    271   /// hasBlocksRuntime - Given that the user is compiling with
    272   /// -fblocks, does this tool chain guarantee the existence of a
    273   /// blocks runtime?
    274   ///
    275   /// FIXME: this really belongs on some sort of DeploymentTarget abstraction
    276   virtual bool hasBlocksRuntime() const { return true; }
    277 
    278   /// \brief Add the clang cc1 arguments for system include paths.
    279   ///
    280   /// This routine is responsible for adding the necessary cc1 arguments to
    281   /// include headers from standard system header directories.
    282   virtual void
    283   AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
    284                             llvm::opt::ArgStringList &CC1Args) const;
    285 
    286   /// \brief Add options that need to be passed to cc1 for this target.
    287   virtual void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
    288                                      llvm::opt::ArgStringList &CC1Args) const;
    289 
    290   /// \brief Add warning options that need to be passed to cc1 for this target.
    291   virtual void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const;
    292 
    293   // GetRuntimeLibType - Determine the runtime library type to use with the
    294   // given compilation arguments.
    295   virtual RuntimeLibType
    296   GetRuntimeLibType(const llvm::opt::ArgList &Args) const;
    297 
    298   // GetCXXStdlibType - Determine the C++ standard library type to use with the
    299   // given compilation arguments.
    300   virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const;
    301 
    302   /// AddClangCXXStdlibIncludeArgs - Add the clang -cc1 level arguments to set
    303   /// the include paths to use for the given C++ standard library type.
    304   virtual void
    305   AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
    306                                llvm::opt::ArgStringList &CC1Args) const;
    307 
    308   /// AddCXXStdlibLibArgs - Add the system specific linker arguments to use
    309   /// for the given C++ standard library type.
    310   virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
    311                                    llvm::opt::ArgStringList &CmdArgs) const;
    312 
    313   /// AddCCKextLibArgs - Add the system specific linker arguments to use
    314   /// for kernel extensions (Darwin-specific).
    315   virtual void AddCCKextLibArgs(const llvm::opt::ArgList &Args,
    316                                 llvm::opt::ArgStringList &CmdArgs) const;
    317 
    318   /// AddFastMathRuntimeIfAvailable - If a runtime library exists that sets
    319   /// global flags for unsafe floating point math, add it and return true.
    320   ///
    321   /// This checks for presence of the -Ofast, -ffast-math or -funsafe-math flags.
    322   virtual bool
    323   AddFastMathRuntimeIfAvailable(const llvm::opt::ArgList &Args,
    324                                 llvm::opt::ArgStringList &CmdArgs) const;
    325 };
    326 
    327 } // end namespace driver
    328 } // end namespace clang
    329 
    330 #endif
    331