]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - contrib/llvm/tools/clang/lib/Driver/ToolChains.h
Copy head to stable/9 as part of 9.0-RELEASE release cycle.
[FreeBSD/stable/9.git] / contrib / llvm / tools / clang / lib / Driver / ToolChains.h
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