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