10 #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_H
11 #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_H
18 #include "llvm/ADT/DenseMap.h"
19 #include "llvm/ADT/Optional.h"
20 #include "llvm/Support/Compiler.h"
26 namespace toolchains {
61 static GCCVersion Parse(StringRef VersionText);
62 bool isOlderThan(
int RHSMajor,
int RHSMinor,
int RHSPatch,
63 StringRef RHSPatchSuffix = StringRef())
const;
80 llvm::Triple GCCTriple;
83 std::string GCCInstallPath;
84 std::string GCCParentLibPath;
96 std::set<std::string> CandidateGCCInstallPaths;
103 void init(
const Driver &D,
const llvm::Triple &TargetTriple,
104 const llvm::opt::ArgList &Args);
110 const llvm::Triple &
getTriple()
const {
return GCCTriple; }
126 bool getBiarchSibling(
Multilib &M)
const;
132 void print(raw_ostream &OS)
const;
136 CollectLibDirsAndTriples(
const llvm::Triple &TargetTriple,
137 const llvm::Triple &BiarchTriple,
143 void ScanLibDirForGCCTriple(
const llvm::Triple &TargetArch,
144 const llvm::opt::ArgList &Args,
145 const std::string &LibDir,
146 StringRef CandidateTriple,
147 bool NeedsBiarchSuffix =
false);
155 const llvm::opt::ArgList &Args);
158 void printVerboseInfo(raw_ostream &OS)
const override;
160 bool IsUnwindTablesDefault()
const override;
161 bool isPICDefault()
const override;
162 bool isPIEDefault()
const override;
163 bool isPICDefaultForced()
const override;
164 bool IsIntegratedAssemblerDefault()
const override;
168 Tool *buildAssembler()
const override;
169 Tool *buildLinker()
const override;
183 mutable std::unique_ptr<tools::gcc::Preprocessor>
Preprocess;
184 mutable std::unique_ptr<tools::gcc::Compiler>
Compile;
189 Tool *buildAssembler()
const override;
190 Tool *buildLinker()
const override;
194 mutable std::unique_ptr<tools::darwin::Lipo> Lipo;
195 mutable std::unique_ptr<tools::darwin::Dsymutil> Dsymutil;
196 mutable std::unique_ptr<tools::darwin::VerifyDebug> VerifyDebug;
200 const llvm::opt::ArgList &Args);
208 StringRef getMachOArchName(
const llvm::opt::ArgList &Args)
const;
212 llvm::opt::ArgStringList &CmdArgs)
const {}
215 virtual void AddLinkRuntimeLibArgs(
const llvm::opt::ArgList &Args,
216 llvm::opt::ArgStringList &CmdArgs)
const;
219 llvm::opt::ArgStringList &CmdArgs)
const {
223 llvm::opt::ArgStringList &CmdArgs)
const {}
232 void AddLinkRuntimeLib(
const llvm::opt::ArgList &Args,
233 llvm::opt::ArgStringList &CmdArgs,
234 StringRef DarwinLibName,
bool AlwaysLink =
false,
235 bool IsEmbedded =
false,
bool AddRPath =
false)
const;
240 llvm::opt::ArgStringList &CmdArgs)
const {
248 std::string ComputeEffectiveClangTriple(
const llvm::opt::ArgList &Args,
251 types::ID LookupTypeForExtension(
const char *Ext)
const override;
253 bool HasNativeLLVMSupport()
const override;
255 llvm::opt::DerivedArgList *
256 TranslateArgs(
const llvm::opt::DerivedArgList &Args,
257 const char *BoundArch)
const override;
275 return getTriple().getArch() != llvm::Triple::x86;
280 bool IsUnwindTablesDefault()
const override;
286 bool isPICDefault()
const override;
287 bool isPIEDefault()
const override;
288 bool isPICDefaultForced()
const override;
290 bool SupportsProfiling()
const override;
294 bool UseDwarfDebugFlags()
const override;
319 void AddDeploymentTarget(llvm::opt::DerivedArgList &Args)
const;
323 const llvm::opt::ArgList &Args);
326 std::string ComputeEffectiveClangTriple(
const llvm::opt::ArgList &Args,
332 void addMinVersionArgs(
const llvm::opt::ArgList &Args,
333 llvm::opt::ArgStringList &CmdArgs)
const override;
335 void addStartObjectFileArgs(
const llvm::opt::ArgList &Args,
336 llvm::opt::ArgStringList &CmdArgs)
const override;
339 return !isTargetIPhoneOS() || isIPhoneOSVersionLT(6, 0);
342 void addProfileRTLibs(
const llvm::opt::ArgList &Args,
343 llvm::opt::ArgStringList &CmdArgs)
const override;
353 unsigned Micro)
const {
356 if (TargetInitialized && TargetPlatform == Platform &&
360 assert(!TargetInitialized &&
"Target already initialized!");
361 TargetInitialized =
true;
362 TargetPlatform = Platform;
367 assert(TargetInitialized &&
"Target not initialized!");
368 return TargetPlatform == IPhoneOS;
372 assert(TargetInitialized &&
"Target not initialized!");
373 return TargetPlatform == IPhoneOSSimulator;
377 assert(TargetInitialized &&
"Target not initialized!");
378 return isTargetIPhoneOS() || isTargetIOSSimulator();
382 assert(TargetInitialized &&
"Target not initialized!");
383 return TargetPlatform == MacOS;
389 assert(TargetInitialized &&
"Target not initialized!");
390 return TargetVersion;
394 unsigned V2 = 0)
const {
395 assert(isTargetIOSBased() &&
"Unexpected call for non iOS target!");
400 assert(isTargetMacOS() &&
"Unexpected call for non OS X target!");
414 llvm::opt::DerivedArgList *
415 TranslateArgs(
const llvm::opt::DerivedArgList &Args,
416 const char *BoundArch)
const override;
418 ObjCRuntime getDefaultObjCRuntime(
bool isNonFragile)
const override;
419 bool hasBlocksRuntime()
const override;
425 return !(isTargetMacOS() && isMacosxVersionLT(10, 6));
431 if (isTargetIOSBased())
433 else if (isTargetMacOS() && !isMacosxVersionLT(10, 6))
435 else if (isTargetMacOS() && !isMacosxVersionLT(10, 5) && !KernelOrKext)
441 bool SupportsObjCGC()
const override;
443 void CheckObjCARC()
const override;
445 bool UseSjLjExceptions()
const override;
454 const llvm::opt::ArgList &Args);
459 void AddLinkRuntimeLibArgs(
const llvm::opt::ArgList &Args,
460 llvm::opt::ArgStringList &CmdArgs)
const override;
462 void AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
463 llvm::opt::ArgStringList &CmdArgs)
const override;
465 void AddCCKextLibArgs(
const llvm::opt::ArgList &Args,
466 llvm::opt::ArgStringList &CmdArgs)
const override;
468 void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args)
const override;
470 void AddLinkARCArgs(
const llvm::opt::ArgList &Args,
471 llvm::opt::ArgStringList &CmdArgs)
const override;
475 void AddLinkSanitizerLibArgs(
const llvm::opt::ArgList &Args,
476 llvm::opt::ArgStringList &CmdArgs,
477 StringRef Sanitizer)
const;
481 virtual void anchor();
485 const llvm::opt::ArgList &Args)
488 void addClangTargetOptions(
const llvm::opt::ArgList &DriverArgs,
489 llvm::opt::ArgStringList &CC1Args)
const override;
495 const llvm::opt::ArgList &Args);
505 void AddClangCXXStdlibIncludeArgs(
506 const llvm::opt::ArgList &DriverArgs,
507 llvm::opt::ArgStringList &CC1Args)
const override;
508 void AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
509 llvm::opt::ArgStringList &CmdArgs)
const override;
514 Tool *buildLinker()
const override;
520 const llvm::opt::ArgList &Args);
525 Tool *buildAssembler()
const override;
526 Tool *buildLinker()
const override;
532 const llvm::opt::ArgList &Args);
534 bool IsIntegratedAssemblerDefault()
const override;
535 bool IsUnwindTablesDefault()
const override;
536 bool isPICDefault()
const override;
537 bool isPIEDefault()
const override;
538 bool isPICDefaultForced()
const override;
539 bool UseSEHExceptions()
const;
542 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
543 llvm::opt::ArgStringList &CC1Args)
const override;
544 void AddClangCXXStdlibIncludeArgs(
545 const llvm::opt::ArgList &DriverArgs,
546 llvm::opt::ArgStringList &CC1Args)
const override;
550 Tool *buildLinker()
const override;
551 Tool *buildAssembler()
const override;
555 std::string GccLibDir;
558 mutable std::unique_ptr<tools::gcc::Preprocessor>
Preprocessor;
559 mutable std::unique_ptr<tools::gcc::Compiler> Compiler;
560 void findGccLibDir();
566 const llvm::opt::ArgList &Args);
577 Tool *buildAssembler()
const override;
578 Tool *buildLinker()
const override;
584 const llvm::opt::ArgList &Args);
589 CXXStdlibType GetCXXStdlibType(
const llvm::opt::ArgList &Args)
const override;
590 void AddClangCXXStdlibIncludeArgs(
591 const llvm::opt::ArgList &DriverArgs,
592 llvm::opt::ArgStringList &CC1Args)
const override;
593 void AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
594 llvm::opt::ArgStringList &CmdArgs)
const override;
600 Tool *buildAssembler()
const override;
601 Tool *buildLinker()
const override;
607 const llvm::opt::ArgList &Args);
608 bool HasNativeLLVMSupport()
const override;
613 CXXStdlibType GetCXXStdlibType(
const llvm::opt::ArgList &Args)
const override;
614 void AddClangCXXStdlibIncludeArgs(
615 const llvm::opt::ArgList &DriverArgs,
616 llvm::opt::ArgStringList &CC1Args)
const override;
618 bool UseSjLjExceptions()
const override;
619 bool isPIEDefault()
const override;
623 Tool *buildAssembler()
const override;
624 Tool *buildLinker()
const override;
630 const llvm::opt::ArgList &Args);
635 CXXStdlibType GetCXXStdlibType(
const llvm::opt::ArgList &Args)
const override;
637 void AddClangCXXStdlibIncludeArgs(
638 const llvm::opt::ArgList &DriverArgs,
639 llvm::opt::ArgStringList &CC1Args)
const override;
643 Tool *buildAssembler()
const override;
644 Tool *buildLinker()
const override;
650 const llvm::opt::ArgList &Args);
653 Tool *buildAssembler()
const override;
654 Tool *buildLinker()
const override;
660 const llvm::opt::ArgList &Args);
665 Tool *buildAssembler()
const override;
666 Tool *buildLinker()
const override;
672 const llvm::opt::ArgList &Args);
674 bool HasNativeLLVMSupport()
const override;
677 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
678 llvm::opt::ArgStringList &CC1Args)
const override;
679 void AddClangCXXStdlibIncludeArgs(
680 const llvm::opt::ArgList &DriverArgs,
681 llvm::opt::ArgStringList &CC1Args)
const override;
682 bool isPIEDefault()
const override;
689 Tool *buildAssembler()
const override;
690 Tool *buildLinker()
const override;
693 static bool addLibStdCXXIncludePaths(Twine
Base, Twine Suffix,
695 StringRef GCCMultiarchTriple,
696 StringRef TargetMultiarchTriple,
698 const llvm::opt::ArgList &DriverArgs,
699 llvm::opt::ArgStringList &CC1Args);
701 std::string computeSysRoot()
const;
707 const llvm::opt::ArgList &Args);
709 llvm::opt::DerivedArgList *
710 TranslateArgs(
const llvm::opt::DerivedArgList &Args,
711 const char *BoundArch)
const override;
712 void addClangTargetOptions(
const llvm::opt::ArgList &DriverArgs,
713 llvm::opt::ArgStringList &CC1Args)
const override;
719 Tool *buildAssembler()
const override;
720 Tool *buildLinker()
const override;
724 const llvm::opt::ArgList &Args);
728 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
729 llvm::opt::ArgStringList &CC1Args)
const override;
730 void AddClangCXXStdlibIncludeArgs(
731 const llvm::opt::ArgList &DriverArgs,
732 llvm::opt::ArgStringList &CC1Args)
const override;
733 CXXStdlibType GetCXXStdlibType(
const llvm::opt::ArgList &Args)
const override;
737 static std::string GetGnuDir(
const std::string &InstalledDir,
738 const llvm::opt::ArgList &Args);
740 static StringRef GetTargetCPU(
const llvm::opt::ArgList &Args);
742 static const char *GetSmallDataThreshold(
const llvm::opt::ArgList &Args);
744 static bool UsesG0(
const char *smallDataThreshold);
750 const llvm::opt::ArgList &Args);
753 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
754 llvm::opt::ArgStringList &CC1Args)
const override;
755 void AddClangCXXStdlibIncludeArgs(
756 const llvm::opt::ArgList &DriverArgs,
757 llvm::opt::ArgStringList &CC1Args)
const override;
759 CXXStdlibType GetCXXStdlibType(
const llvm::opt::ArgList &Args)
const override;
761 void AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
762 llvm::opt::ArgStringList &CmdArgs)
const override;
765 return getTriple().getArch() == llvm::Triple::mipsel;
773 std::string ComputeEffectiveClangTriple(
const llvm::opt::ArgList &Args,
778 Tool *buildLinker()
const override;
779 Tool *buildAssembler()
const override;
782 std::string NaClArmMacrosPath;
790 const llvm::opt::ArgList &Args);
793 bool IsMathErrnoDefault()
const override;
794 bool isPICDefault()
const override;
795 bool isPIEDefault()
const override;
796 bool isPICDefaultForced()
const override;
802 const llvm::opt::ArgList &Args);
804 bool IsIntegratedAssemblerDefault()
const override;
805 bool IsUnwindTablesDefault()
const override;
806 bool isPICDefault()
const override;
807 bool isPIEDefault()
const override;
808 bool isPICDefaultForced()
const override;
811 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
812 llvm::opt::ArgStringList &CC1Args)
const override;
813 void AddClangCXXStdlibIncludeArgs(
814 const llvm::opt::ArgList &DriverArgs,
815 llvm::opt::ArgStringList &CC1Args)
const override;
817 bool getWindowsSDKDir(std::string &path,
int &major,
int &minor)
const;
818 bool getWindowsSDKLibraryPath(std::string &path)
const;
819 bool getVisualStudioInstallDir(std::string &path)
const;
820 bool getVisualStudioBinariesFolder(
const char *clangProgramPath,
821 std::string &path)
const;
823 std::string ComputeEffectiveClangTriple(
const llvm::opt::ArgList &Args,
828 void AddSystemIncludeWithSubfolder(
const llvm::opt::ArgList &DriverArgs,
829 llvm::opt::ArgStringList &CC1Args,
830 const std::string &folder,
831 const char *subfolder)
const;
833 Tool *buildLinker()
const override;
834 Tool *buildAssembler()
const override;
840 const llvm::opt::ArgList &Args);
843 bool IsUnwindTablesDefault()
const override;
844 bool isPICDefault()
const override;
845 bool isPIEDefault()
const override;
846 bool isPICDefaultForced()
const override;
853 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
854 llvm::opt::ArgStringList &CC1Args)
const override;
855 void AddClangCXXStdlibIncludeArgs(
856 const llvm::opt::ArgList &DriverArgs,
857 llvm::opt::ArgStringList &CC1Args)
const override;
858 void AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
859 llvm::opt::ArgStringList &CmdArgs)
const override;
862 Tool *buildLinker()
const override;
863 Tool *buildAssembler()
const override;
869 const llvm::opt::ArgList &Args);
872 Tool *buildAssembler()
const override;
873 Tool *buildLinker()
const override;
876 bool isPICDefault()
const override;
877 bool isPIEDefault()
const override;
878 bool isPICDefaultForced()
const override;
879 bool SupportsProfiling()
const override;
880 bool hasBlocksRuntime()
const override;
882 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
883 llvm::opt::ArgStringList &CC1Args)
const override;
884 void addClangTargetOptions(
const llvm::opt::ArgList &DriverArgs,
885 llvm::opt::ArgStringList &CC1Args)
const override;
886 void AddClangCXXStdlibIncludeArgs(
887 const llvm::opt::ArgList &DriverArgs,
888 llvm::opt::ArgStringList &CC1Args)
const override;
889 void AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
890 llvm::opt::ArgStringList &CmdArgs)
const override;
899 const llvm::opt::ArgList &Args);
902 virtual Tool *SelectTool(
const JobAction &JA)
const override;
906 Tool *buildAssembler()
const override;
907 Tool *buildLinker()
const override;
910 mutable std::unique_ptr<Tool> Compiler;
911 mutable std::unique_ptr<Tool> Assembler;
Represents a version number in the form major[.minor[.subminor[.build]]].
The basic abstraction for the target Objective-C runtime.
Defines the clang::VersionTuple class, which represents a version in the form major[.minor[.subminor]].
Engages in a tight little dance with the lexer to efficiently preprocess tokens.