• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===--- Tools.h - Tool 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_TOOLS_H_
11 #define CLANG_LIB_DRIVER_TOOLS_H_
12 
13 #include "clang/Driver/Tool.h"
14 #include "clang/Driver/Types.h"
15 #include "clang/Driver/Util.h"
16 #include "llvm/ADT/Triple.h"
17 #include "llvm/Option/Option.h"
18 #include "llvm/Support/Compiler.h"
19 
20 namespace clang {
21   class ObjCRuntime;
22 
23 namespace driver {
24   class Driver;
25 
26 namespace toolchains {
27   class Darwin;
28 }
29 
30 namespace tools {
31 using llvm::opt::ArgStringList;
32 
33   /// \brief Clang compiler tool.
34   class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
35   public:
36     static const char *getBaseInputName(const llvm::opt::ArgList &Args,
37                                         const InputInfoList &Inputs);
38     static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
39                                         const InputInfoList &Inputs);
40     static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
41                                              const InputInfoList &Inputs);
42 
43   private:
44     void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
45                                  const Driver &D,
46                                  const llvm::opt::ArgList &Args,
47                                  llvm::opt::ArgStringList &CmdArgs,
48                                  const InputInfo &Output,
49                                  const InputInfoList &Inputs) const;
50 
51     void AddARMTargetArgs(const llvm::opt::ArgList &Args,
52                           llvm::opt::ArgStringList &CmdArgs,
53                           bool KernelOrKext) const;
54     void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
55                            llvm::opt::ArgStringList &CmdArgs) const;
56     void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
57                           llvm::opt::ArgStringList &CmdArgs) const;
58     void AddR600TargetArgs(const llvm::opt::ArgList &Args,
59                            llvm::opt::ArgStringList &CmdArgs) const;
60     void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
61                             llvm::opt::ArgStringList &CmdArgs) const;
62     void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
63                               llvm::opt::ArgStringList &CmdArgs) const;
64     void AddX86TargetArgs(const llvm::opt::ArgList &Args,
65                           llvm::opt::ArgStringList &CmdArgs) const;
66     void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
67                               llvm::opt::ArgStringList &CmdArgs) const;
68     void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
69                               llvm::opt::ArgStringList &CmdArgs) const;
70 
71     enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
72 
73     ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
74                                    llvm::opt::ArgStringList &cmdArgs,
75                                    RewriteKind rewrite) const;
76 
77   public:
Clang(const ToolChain & TC)78     Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
79 
hasGoodDiagnostics()80     virtual bool hasGoodDiagnostics() const { return true; }
hasIntegratedAssembler()81     virtual bool hasIntegratedAssembler() const { return true; }
hasIntegratedCPP()82     virtual bool hasIntegratedCPP() const { return true; }
83 
84     virtual void ConstructJob(Compilation &C, const JobAction &JA,
85                               const InputInfo &Output,
86                               const InputInfoList &Inputs,
87                               const llvm::opt::ArgList &TCArgs,
88                               const char *LinkingOutput) const;
89   };
90 
91   /// \brief Clang integrated assembler tool.
92   class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
93     void AddARMTargetArgs(const llvm::opt::ArgList &Args,
94                           llvm::opt::ArgStringList &CmdArgs) const;
95     void AddX86TargetArgs(const llvm::opt::ArgList &Args,
96                           llvm::opt::ArgStringList &CmdArgs) const;
97 
98   public:
ClangAs(const ToolChain & TC)99     ClangAs(const ToolChain &TC) : Tool("clang::as",
100                                         "clang integrated assembler", TC) {}
101 
hasGoodDiagnostics()102     virtual bool hasGoodDiagnostics() const { return true; }
hasIntegratedAssembler()103     virtual bool hasIntegratedAssembler() const { return false; }
hasIntegratedCPP()104     virtual bool hasIntegratedCPP() const { return false; }
105 
106     virtual void ConstructJob(Compilation &C, const JobAction &JA,
107                               const InputInfo &Output,
108                               const InputInfoList &Inputs,
109                               const llvm::opt::ArgList &TCArgs,
110                               const char *LinkingOutput) const;
111   };
112 
113   /// gcc - Generic GCC tool implementations.
114 namespace gcc {
115   class LLVM_LIBRARY_VISIBILITY Common : public Tool {
116   public:
Common(const char * Name,const char * ShortName,const ToolChain & TC)117     Common(const char *Name, const char *ShortName,
118            const ToolChain &TC) : Tool(Name, ShortName, TC) {}
119 
120     virtual void ConstructJob(Compilation &C, const JobAction &JA,
121                               const InputInfo &Output,
122                               const InputInfoList &Inputs,
123                               const llvm::opt::ArgList &TCArgs,
124                               const char *LinkingOutput) const;
125 
126     /// RenderExtraToolArgs - Render any arguments necessary to force
127     /// the particular tool mode.
128     virtual void
129         RenderExtraToolArgs(const JobAction &JA,
130                             llvm::opt::ArgStringList &CmdArgs) const = 0;
131   };
132 
133   class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
134   public:
Preprocess(const ToolChain & TC)135     Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
136                                              "gcc preprocessor", TC) {}
137 
hasGoodDiagnostics()138     virtual bool hasGoodDiagnostics() const { return true; }
hasIntegratedCPP()139     virtual bool hasIntegratedCPP() const { return false; }
140 
141     virtual void RenderExtraToolArgs(const JobAction &JA,
142                                      llvm::opt::ArgStringList &CmdArgs) const;
143   };
144 
145   class LLVM_LIBRARY_VISIBILITY Precompile : public Common  {
146   public:
Precompile(const ToolChain & TC)147     Precompile(const ToolChain &TC) : Common("gcc::Precompile",
148                                              "gcc precompile", TC) {}
149 
hasGoodDiagnostics()150     virtual bool hasGoodDiagnostics() const { return true; }
hasIntegratedCPP()151     virtual bool hasIntegratedCPP() const { return true; }
152 
153     virtual void RenderExtraToolArgs(const JobAction &JA,
154                                      llvm::opt::ArgStringList &CmdArgs) const;
155   };
156 
157   class LLVM_LIBRARY_VISIBILITY Compile : public Common  {
158   public:
Compile(const ToolChain & TC)159     Compile(const ToolChain &TC) : Common("gcc::Compile",
160                                           "gcc frontend", TC) {}
161 
hasGoodDiagnostics()162     virtual bool hasGoodDiagnostics() const { return true; }
hasIntegratedCPP()163     virtual bool hasIntegratedCPP() const { return true; }
164 
165     virtual void RenderExtraToolArgs(const JobAction &JA,
166                                      llvm::opt::ArgStringList &CmdArgs) const;
167   };
168 
169   class LLVM_LIBRARY_VISIBILITY Assemble : public Common  {
170   public:
Assemble(const ToolChain & TC)171     Assemble(const ToolChain &TC) : Common("gcc::Assemble",
172                                            "assembler (via gcc)", TC) {}
173 
hasIntegratedCPP()174     virtual bool hasIntegratedCPP() const { return false; }
175 
176     virtual void RenderExtraToolArgs(const JobAction &JA,
177                                      llvm::opt::ArgStringList &CmdArgs) const;
178   };
179 
180   class LLVM_LIBRARY_VISIBILITY Link : public Common  {
181   public:
Link(const ToolChain & TC)182     Link(const ToolChain &TC) : Common("gcc::Link",
183                                        "linker (via gcc)", TC) {}
184 
hasIntegratedCPP()185     virtual bool hasIntegratedCPP() const { return false; }
isLinkJob()186     virtual bool isLinkJob() const { return true; }
187 
188     virtual void RenderExtraToolArgs(const JobAction &JA,
189                                      llvm::opt::ArgStringList &CmdArgs) const;
190   };
191 } // end namespace gcc
192 
193 namespace hexagon {
194   // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
195   // We simply use "clang -cc1" for those actions.
196   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
197   public:
Assemble(const ToolChain & TC)198     Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
199       "hexagon-as", TC) {}
200 
hasIntegratedCPP()201     virtual bool hasIntegratedCPP() const { return false; }
202 
203     virtual void RenderExtraToolArgs(const JobAction &JA,
204                                      llvm::opt::ArgStringList &CmdArgs) const;
205     virtual void ConstructJob(Compilation &C, const JobAction &JA,
206                               const InputInfo &Output,
207                               const InputInfoList &Inputs,
208                               const llvm::opt::ArgList &TCArgs,
209                               const char *LinkingOutput) const;
210   };
211 
212   class LLVM_LIBRARY_VISIBILITY Link : public Tool {
213   public:
Link(const ToolChain & TC)214     Link(const ToolChain &TC) : Tool("hexagon::Link",
215       "hexagon-ld", TC) {}
216 
hasIntegratedCPP()217     virtual bool hasIntegratedCPP() const { return false; }
isLinkJob()218     virtual bool isLinkJob() const { return true; }
219 
220     virtual void RenderExtraToolArgs(const JobAction &JA,
221                                      llvm::opt::ArgStringList &CmdArgs) const;
222     virtual void ConstructJob(Compilation &C, const JobAction &JA,
223                               const InputInfo &Output,
224                               const InputInfoList &Inputs,
225                               const llvm::opt::ArgList &TCArgs,
226                               const char *LinkingOutput) const;
227   };
228 } // end namespace hexagon.
229 
230 
231 namespace darwin {
232   llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str);
233 
234   class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
235     virtual void anchor();
236   protected:
237     void AddDarwinArch(const llvm::opt::ArgList &Args,
238                        llvm::opt::ArgStringList &CmdArgs) const;
239 
getDarwinToolChain()240     const toolchains::Darwin &getDarwinToolChain() const {
241       return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
242     }
243 
244   public:
DarwinTool(const char * Name,const char * ShortName,const ToolChain & TC)245     DarwinTool(const char *Name, const char *ShortName,
246                const ToolChain &TC) : Tool(Name, ShortName, TC) {}
247   };
248 
249   class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool  {
250   public:
Assemble(const ToolChain & TC)251     Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
252                                                "assembler", TC) {}
253 
hasIntegratedCPP()254     virtual bool hasIntegratedCPP() const { return false; }
255 
256     virtual void ConstructJob(Compilation &C, const JobAction &JA,
257                               const InputInfo &Output,
258                               const InputInfoList &Inputs,
259                               const llvm::opt::ArgList &TCArgs,
260                               const char *LinkingOutput) const;
261   };
262 
263   class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool  {
264     bool NeedsTempPath(const InputInfoList &Inputs) const;
265     void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
266                      llvm::opt::ArgStringList &CmdArgs,
267                      const InputInfoList &Inputs) const;
268 
269   public:
Link(const ToolChain & TC)270     Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
271 
hasIntegratedCPP()272     virtual bool hasIntegratedCPP() const { return false; }
isLinkJob()273     virtual bool isLinkJob() const { return true; }
274 
275     virtual void ConstructJob(Compilation &C, const JobAction &JA,
276                               const InputInfo &Output,
277                               const InputInfoList &Inputs,
278                               const llvm::opt::ArgList &TCArgs,
279                               const char *LinkingOutput) const;
280   };
281 
282   class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool  {
283   public:
Lipo(const ToolChain & TC)284     Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
285 
hasIntegratedCPP()286     virtual bool hasIntegratedCPP() const { return false; }
287 
288     virtual void ConstructJob(Compilation &C, const JobAction &JA,
289                               const InputInfo &Output,
290                               const InputInfoList &Inputs,
291                               const llvm::opt::ArgList &TCArgs,
292                               const char *LinkingOutput) const;
293   };
294 
295   class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool  {
296   public:
Dsymutil(const ToolChain & TC)297     Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
298                                                "dsymutil", TC) {}
299 
hasIntegratedCPP()300     virtual bool hasIntegratedCPP() const { return false; }
isDsymutilJob()301     virtual bool isDsymutilJob() const { return true; }
302 
303     virtual void ConstructJob(Compilation &C, const JobAction &JA,
304                               const InputInfo &Output,
305                               const InputInfoList &Inputs,
306                               const llvm::opt::ArgList &TCArgs,
307                               const char *LinkingOutput) const;
308   };
309 
310   class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool  {
311   public:
VerifyDebug(const ToolChain & TC)312     VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
313                                                   "dwarfdump", TC) {}
314 
hasIntegratedCPP()315     virtual bool hasIntegratedCPP() const { return false; }
316 
317     virtual void ConstructJob(Compilation &C, const JobAction &JA,
318                               const InputInfo &Output,
319                               const InputInfoList &Inputs,
320                               const llvm::opt::ArgList &TCArgs,
321                               const char *LinkingOutput) const;
322   };
323 
324 }
325 
326   /// openbsd -- Directly call GNU Binutils assembler and linker
327 namespace openbsd {
328   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
329   public:
Assemble(const ToolChain & TC)330     Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
331                                          TC) {}
332 
hasIntegratedCPP()333     virtual bool hasIntegratedCPP() const { return false; }
334 
335     virtual void ConstructJob(Compilation &C, const JobAction &JA,
336                               const InputInfo &Output,
337                               const InputInfoList &Inputs,
338                               const llvm::opt::ArgList &TCArgs,
339                               const char *LinkingOutput) const;
340   };
341   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
342   public:
Link(const ToolChain & TC)343     Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
344 
hasIntegratedCPP()345     virtual bool hasIntegratedCPP() const { return false; }
isLinkJob()346     virtual bool isLinkJob() const { return true; }
347 
348     virtual void ConstructJob(Compilation &C, const JobAction &JA,
349                               const InputInfo &Output,
350                               const InputInfoList &Inputs,
351                               const llvm::opt::ArgList &TCArgs,
352                               const char *LinkingOutput) const;
353   };
354 } // end namespace openbsd
355 
356   /// bitrig -- Directly call GNU Binutils assembler and linker
357 namespace bitrig {
358   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
359   public:
Assemble(const ToolChain & TC)360     Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
361                                          TC) {}
362 
hasIntegratedCPP()363     virtual bool hasIntegratedCPP() const { return false; }
364 
365     virtual void ConstructJob(Compilation &C, const JobAction &JA,
366                               const InputInfo &Output,
367                               const InputInfoList &Inputs,
368                               const llvm::opt::ArgList &TCArgs,
369                               const char *LinkingOutput) const;
370   };
371   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
372   public:
Link(const ToolChain & TC)373     Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
374 
hasIntegratedCPP()375     virtual bool hasIntegratedCPP() const { return false; }
isLinkJob()376     virtual bool isLinkJob() const { return true; }
377 
378     virtual void ConstructJob(Compilation &C, const JobAction &JA,
379                               const InputInfo &Output,
380                               const InputInfoList &Inputs,
381                               const llvm::opt::ArgList &TCArgs,
382                               const char *LinkingOutput) const;
383   };
384 } // end namespace bitrig
385 
386   /// freebsd -- Directly call GNU Binutils assembler and linker
387 namespace freebsd {
388   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
389   public:
Assemble(const ToolChain & TC)390     Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
391                                          TC) {}
392 
hasIntegratedCPP()393     virtual bool hasIntegratedCPP() const { return false; }
394 
395     virtual void ConstructJob(Compilation &C, const JobAction &JA,
396                               const InputInfo &Output,
397                               const InputInfoList &Inputs,
398                               const llvm::opt::ArgList &TCArgs,
399                               const char *LinkingOutput) const;
400   };
401   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
402   public:
Link(const ToolChain & TC)403     Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
404 
hasIntegratedCPP()405     virtual bool hasIntegratedCPP() const { return false; }
isLinkJob()406     virtual bool isLinkJob() const { return true; }
407 
408     virtual void ConstructJob(Compilation &C, const JobAction &JA,
409                               const InputInfo &Output,
410                               const InputInfoList &Inputs,
411                               const llvm::opt::ArgList &TCArgs,
412                               const char *LinkingOutput) const;
413   };
414 } // end namespace freebsd
415 
416   /// netbsd -- Directly call GNU Binutils assembler and linker
417 namespace netbsd {
418   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
419 
420   public:
Assemble(const ToolChain & TC)421     Assemble(const ToolChain &TC)
422       : Tool("netbsd::Assemble", "assembler", TC) {}
423 
hasIntegratedCPP()424     virtual bool hasIntegratedCPP() const { return false; }
425 
426     virtual void ConstructJob(Compilation &C, const JobAction &JA,
427                               const InputInfo &Output,
428                               const InputInfoList &Inputs,
429                               const llvm::opt::ArgList &TCArgs,
430                               const char *LinkingOutput) const;
431   };
432   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
433 
434   public:
Link(const ToolChain & TC)435     Link(const ToolChain &TC)
436       : Tool("netbsd::Link", "linker", TC) {}
437 
hasIntegratedCPP()438     virtual bool hasIntegratedCPP() const { return false; }
isLinkJob()439     virtual bool isLinkJob() const { return true; }
440 
441     virtual void ConstructJob(Compilation &C, const JobAction &JA,
442                               const InputInfo &Output,
443                               const InputInfoList &Inputs,
444                               const llvm::opt::ArgList &TCArgs,
445                               const char *LinkingOutput) const;
446   };
447 } // end namespace netbsd
448 
449   /// Directly call GNU Binutils' assembler and linker.
450 namespace gnutools {
451   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
452   public:
Assemble(const ToolChain & TC)453     Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {}
454 
hasIntegratedCPP()455     virtual bool hasIntegratedCPP() const { return false; }
456 
457     virtual void ConstructJob(Compilation &C, const JobAction &JA,
458                               const InputInfo &Output,
459                               const InputInfoList &Inputs,
460                               const llvm::opt::ArgList &TCArgs,
461                               const char *LinkingOutput) const;
462   };
463   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
464   public:
Link(const ToolChain & TC)465     Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {}
466 
hasIntegratedCPP()467     virtual bool hasIntegratedCPP() const { return false; }
isLinkJob()468     virtual bool isLinkJob() const { return true; }
469 
470     virtual void ConstructJob(Compilation &C, const JobAction &JA,
471                               const InputInfo &Output,
472                               const InputInfoList &Inputs,
473                               const llvm::opt::ArgList &TCArgs,
474                               const char *LinkingOutput) const;
475   };
476 }
477   /// minix -- Directly call GNU Binutils assembler and linker
478 namespace minix {
479   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
480   public:
Assemble(const ToolChain & TC)481     Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
482                                          TC) {}
483 
hasIntegratedCPP()484     virtual bool hasIntegratedCPP() const { return false; }
485 
486     virtual void ConstructJob(Compilation &C, const JobAction &JA,
487                               const InputInfo &Output,
488                               const InputInfoList &Inputs,
489                               const llvm::opt::ArgList &TCArgs,
490                               const char *LinkingOutput) const;
491   };
492   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
493   public:
Link(const ToolChain & TC)494     Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
495 
hasIntegratedCPP()496     virtual bool hasIntegratedCPP() const { return false; }
isLinkJob()497     virtual bool isLinkJob() const { return true; }
498 
499     virtual void ConstructJob(Compilation &C, const JobAction &JA,
500                               const InputInfo &Output,
501                               const InputInfoList &Inputs,
502                               const llvm::opt::ArgList &TCArgs,
503                               const char *LinkingOutput) const;
504   };
505 } // end namespace minix
506 
507   /// solaris -- Directly call Solaris assembler and linker
508 namespace solaris {
509   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
510   public:
Assemble(const ToolChain & TC)511     Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
512                                          TC) {}
513 
hasIntegratedCPP()514     virtual bool hasIntegratedCPP() const { return false; }
515 
516     virtual void ConstructJob(Compilation &C, const JobAction &JA,
517                               const InputInfo &Output,
518                               const InputInfoList &Inputs,
519                               const llvm::opt::ArgList &TCArgs,
520                               const char *LinkingOutput) const;
521   };
522   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
523   public:
Link(const ToolChain & TC)524     Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
525 
hasIntegratedCPP()526     virtual bool hasIntegratedCPP() const { return false; }
isLinkJob()527     virtual bool isLinkJob() const { return true; }
528 
529     virtual void ConstructJob(Compilation &C, const JobAction &JA,
530                               const InputInfo &Output,
531                               const InputInfoList &Inputs,
532                               const llvm::opt::ArgList &TCArgs,
533                               const char *LinkingOutput) const;
534   };
535 } // end namespace solaris
536 
537   /// auroraux -- Directly call GNU Binutils assembler and linker
538 namespace auroraux {
539   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
540   public:
Assemble(const ToolChain & TC)541     Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
542                                          TC) {}
543 
hasIntegratedCPP()544     virtual bool hasIntegratedCPP() const { return false; }
545 
546     virtual void ConstructJob(Compilation &C, const JobAction &JA,
547                               const InputInfo &Output,
548                               const InputInfoList &Inputs,
549                               const llvm::opt::ArgList &TCArgs,
550                               const char *LinkingOutput) const;
551   };
552   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
553   public:
Link(const ToolChain & TC)554     Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
555 
hasIntegratedCPP()556     virtual bool hasIntegratedCPP() const { return false; }
isLinkJob()557     virtual bool isLinkJob() const { return true; }
558 
559     virtual void ConstructJob(Compilation &C, const JobAction &JA,
560                               const InputInfo &Output,
561                               const InputInfoList &Inputs,
562                               const llvm::opt::ArgList &TCArgs,
563                               const char *LinkingOutput) const;
564   };
565 } // end namespace auroraux
566 
567   /// dragonfly -- Directly call GNU Binutils assembler and linker
568 namespace dragonfly {
569   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
570   public:
Assemble(const ToolChain & TC)571     Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
572                                          TC) {}
573 
hasIntegratedCPP()574     virtual bool hasIntegratedCPP() const { return false; }
575 
576     virtual void ConstructJob(Compilation &C, const JobAction &JA,
577                               const InputInfo &Output,
578                               const InputInfoList &Inputs,
579                               const llvm::opt::ArgList &TCArgs,
580                               const char *LinkingOutput) const;
581   };
582   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
583   public:
Link(const ToolChain & TC)584     Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
585 
hasIntegratedCPP()586     virtual bool hasIntegratedCPP() const { return false; }
isLinkJob()587     virtual bool isLinkJob() const { return true; }
588 
589     virtual void ConstructJob(Compilation &C, const JobAction &JA,
590                               const InputInfo &Output,
591                               const InputInfoList &Inputs,
592                               const llvm::opt::ArgList &TCArgs,
593                               const char *LinkingOutput) const;
594   };
595 } // end namespace dragonfly
596 
597   /// Visual studio tools.
598 namespace visualstudio {
599   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
600   public:
Link(const ToolChain & TC)601     Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
602 
hasIntegratedCPP()603     virtual bool hasIntegratedCPP() const { return false; }
isLinkJob()604     virtual bool isLinkJob() const { return true; }
605 
606     virtual void ConstructJob(Compilation &C, const JobAction &JA,
607                               const InputInfo &Output,
608                               const InputInfoList &Inputs,
609                               const llvm::opt::ArgList &TCArgs,
610                               const char *LinkingOutput) const;
611   };
612 } // end namespace visualstudio
613 
614 } // end namespace toolchains
615 } // end namespace driver
616 } // end namespace clang
617 
618 #endif // CLANG_LIB_DRIVER_TOOLS_H_
619