• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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;
getTriple()112   const llvm::Triple &getTriple() const { return Triple; }
113 
getArch()114   llvm::Triple::ArchType getArch() const { return Triple.getArch(); }
getArchName()115   StringRef getArchName() const { return Triple.getArchName(); }
getPlatform()116   StringRef getPlatform() const { return Triple.getVendorName(); }
getOS()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 
getTripleString()126   std::string getTripleString() const {
127     return Triple.getTriple();
128   }
129 
getFilePaths()130   path_list &getFilePaths() { return FilePaths; }
getFilePaths()131   const path_list &getFilePaths() const { return FilePaths; }
132 
getProgramPaths()133   path_list &getProgramPaths() { return ProgramPaths; }
getProgramPaths()134   const path_list &getProgramPaths() const { return ProgramPaths; }
135 
getMultilibs()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 *
TranslateArgs(const llvm::opt::DerivedArgList & Args,const char * BoundArch)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.
printVerboseInfo(raw_ostream & OS)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.
IsBlocksDefault()183   virtual bool IsBlocksDefault() const { return false; }
184 
185   /// IsIntegratedAssemblerDefault - Does this tool chain enable -integrated-as
186   /// by default.
IsIntegratedAssemblerDefault()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.
IsMathErrnoDefault()193   virtual bool IsMathErrnoDefault() const { return true; }
194 
195   /// IsEncodeExtendedBlockSignatureDefault - Does this tool chain enable
196   /// -fencode-extended-block-signature by default.
IsEncodeExtendedBlockSignatureDefault()197   virtual bool IsEncodeExtendedBlockSignatureDefault() const { return false; }
198 
199   /// IsObjCNonFragileABIDefault - Does this tool chain set
200   /// -fobjc-nonfragile-abi by default.
IsObjCNonFragileABIDefault()201   virtual bool IsObjCNonFragileABIDefault() const { return false; }
202 
203   /// UseObjCMixedDispatchDefault - When using non-legacy dispatch, should the
204   /// mixed dispatch method be used?
UseObjCMixedDispatch()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).
GetDefaultStackProtectorLevel(bool KernelOrKext)209   virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const {
210     return 0;
211   }
212 
213   /// GetDefaultRuntimeLibType - Get the default runtime library variant to use.
GetDefaultRuntimeLibType()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.
SupportsProfiling()235   virtual bool SupportsProfiling() const { return true; }
236 
237   /// Does this tool chain support Objective-C garbage collection.
SupportsObjCGC()238   virtual bool SupportsObjCGC() const { return true; }
239 
240   /// Complain if this tool chain doesn't support Objective-C ARC.
CheckObjCARC()241   virtual void CheckObjCARC() const {}
242 
243   /// UseDwarfDebugFlags - Embed the compile options to clang into the Dwarf
244   /// compile unit information.
UseDwarfDebugFlags()245   virtual bool UseDwarfDebugFlags() const { return false; }
246 
247   /// UseSjLjExceptions - Does this tool chain use SjLj exceptions.
UseSjLjExceptions()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
hasBlocksRuntime()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