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;
84 std::string GCCInstallPath;
85 std::string GCCParentLibPath;
97 std::set<std::string> CandidateGCCInstallPaths;
104 void init(
const llvm::Triple &TargetTriple,
const llvm::opt::ArgList &Args,
111 const llvm::Triple &
getTriple()
const {
return GCCTriple; }
127 bool getBiarchSibling(
Multilib &M)
const;
133 void print(raw_ostream &OS)
const;
137 CollectLibDirsAndTriples(
const llvm::Triple &TargetTriple,
138 const llvm::Triple &BiarchTriple,
144 void ScanLibDirForGCCTriple(
const llvm::Triple &TargetArch,
145 const llvm::opt::ArgList &Args,
146 const std::string &LibDir,
147 StringRef CandidateTriple,
148 bool NeedsBiarchSuffix =
false);
150 void scanLibDirForGCCTripleSolaris(
const llvm::Triple &TargetArch,
151 const llvm::opt::ArgList &Args,
152 const std::string &LibDir,
153 StringRef CandidateTriple,
154 bool NeedsBiarchSuffix =
false);
165 std::string CudaInstallPath;
166 std::string CudaLibPath;
167 std::string CudaLibDevicePath;
168 std::string CudaIncludePath;
169 llvm::StringMap<std::string> CudaLibDeviceMap;
173 void init(
const llvm::Triple &TargetTriple,
const llvm::opt::ArgList &Args);
178 void print(raw_ostream &OS)
const;
190 return CudaLibDeviceMap.lookup(Gpu);
198 const llvm::opt::ArgList &Args);
201 void printVerboseInfo(raw_ostream &OS)
const override;
203 bool IsUnwindTablesDefault()
const override;
204 bool isPICDefault()
const override;
205 bool isPIEDefault()
const override;
206 bool isPICDefaultForced()
const override;
207 bool IsIntegratedAssemblerDefault()
const override;
211 Tool *buildAssembler()
const override;
212 Tool *buildLinker()
const override;
223 bool addLibStdCXXIncludePaths(Twine
Base, Twine Suffix, StringRef GCCTriple,
224 StringRef GCCMultiarchTriple,
225 StringRef TargetMultiarchTriple,
227 const llvm::opt::ArgList &DriverArgs,
228 llvm::opt::ArgStringList &CC1Args)
const;
233 mutable std::unique_ptr<tools::gcc::Preprocessor>
Preprocess;
234 mutable std::unique_ptr<tools::gcc::Compiler>
Compile;
239 Tool *buildAssembler()
const override;
240 Tool *buildLinker()
const override;
244 mutable std::unique_ptr<tools::darwin::Lipo> Lipo;
245 mutable std::unique_ptr<tools::darwin::Dsymutil> Dsymutil;
246 mutable std::unique_ptr<tools::darwin::VerifyDebug> VerifyDebug;
250 const llvm::opt::ArgList &Args);
258 StringRef getMachOArchName(
const llvm::opt::ArgList &Args)
const;
262 llvm::opt::ArgStringList &CmdArgs)
const {}
265 virtual void AddLinkRuntimeLibArgs(
const llvm::opt::ArgList &Args,
266 llvm::opt::ArgStringList &CmdArgs)
const;
269 llvm::opt::ArgStringList &CmdArgs)
const {
273 llvm::opt::ArgStringList &CmdArgs)
const {}
282 void AddLinkRuntimeLib(
const llvm::opt::ArgList &Args,
283 llvm::opt::ArgStringList &CmdArgs,
284 StringRef DarwinLibName,
bool AlwaysLink =
false,
285 bool IsEmbedded =
false,
bool AddRPath =
false)
const;
290 llvm::opt::ArgStringList &CmdArgs)
const override {
298 std::string ComputeEffectiveClangTriple(
const llvm::opt::ArgList &Args,
301 types::ID LookupTypeForExtension(
const char *Ext)
const override;
303 bool HasNativeLLVMSupport()
const override;
305 llvm::opt::DerivedArgList *
306 TranslateArgs(
const llvm::opt::DerivedArgList &Args,
307 const char *BoundArch)
const override;
325 return getTriple().getArch() != llvm::Triple::x86;
330 bool IsUnwindTablesDefault()
const override;
336 bool isPICDefault()
const override;
337 bool isPIEDefault()
const override;
338 bool isPICDefaultForced()
const override;
340 bool SupportsProfiling()
const override;
344 bool UseDwarfDebugFlags()
const override;
379 void AddDeploymentTarget(llvm::opt::DerivedArgList &Args)
const;
383 const llvm::opt::ArgList &Args);
386 std::string ComputeEffectiveClangTriple(
const llvm::opt::ArgList &Args,
392 void addMinVersionArgs(
const llvm::opt::ArgList &Args,
393 llvm::opt::ArgStringList &CmdArgs)
const override;
395 void addStartObjectFileArgs(
const llvm::opt::ArgList &Args,
396 llvm::opt::ArgStringList &CmdArgs)
const override;
399 return (!(isTargetIPhoneOS() && !isIPhoneOSVersionLT(6, 0)) &&
403 void addProfileRTLibs(
const llvm::opt::ArgList &Args,
404 llvm::opt::ArgStringList &CmdArgs)
const override;
414 unsigned Micro)
const {
417 if (TargetInitialized && TargetPlatform == Platform &&
421 assert(!TargetInitialized &&
"Target already initialized!");
422 TargetInitialized =
true;
423 TargetPlatform = Platform;
428 assert(TargetInitialized &&
"Target not initialized!");
429 return TargetPlatform == IPhoneOS || TargetPlatform == TvOS;
433 assert(TargetInitialized &&
"Target not initialized!");
434 return TargetPlatform == IPhoneOSSimulator ||
435 TargetPlatform == TvOSSimulator;
439 assert(TargetInitialized &&
"Target not initialized!");
440 return isTargetIPhoneOS() || isTargetIOSSimulator();
444 assert(TargetInitialized &&
"Target not initialized!");
445 return TargetPlatform == TvOS;
449 assert(TargetInitialized &&
"Target not initialized!");
450 return TargetPlatform == TvOSSimulator;
454 assert(TargetInitialized &&
"Target not initialized!");
455 return TargetPlatform == TvOS || TargetPlatform == TvOSSimulator;
459 assert(TargetInitialized &&
"Target not initialized!");
460 return TargetPlatform == WatchOS;
464 assert(TargetInitialized &&
"Target not initialized!");
465 return TargetPlatform == WatchOSSimulator;
469 assert(TargetInitialized &&
"Target not initialized!");
470 return TargetPlatform == WatchOS || TargetPlatform == WatchOSSimulator;
474 assert(TargetInitialized &&
"Target not initialized!");
475 return TargetPlatform == MacOS;
481 assert(TargetInitialized &&
"Target not initialized!");
482 return TargetVersion;
486 unsigned V2 = 0)
const {
487 assert(isTargetIOSBased() &&
"Unexpected call for non iOS target!");
492 assert(isTargetMacOS() &&
"Unexpected call for non OS X target!");
506 llvm::opt::DerivedArgList *
507 TranslateArgs(
const llvm::opt::DerivedArgList &Args,
508 const char *BoundArch)
const override;
510 ObjCRuntime getDefaultObjCRuntime(
bool isNonFragile)
const override;
511 bool hasBlocksRuntime()
const override;
517 return !(isTargetMacOS() && isMacosxVersionLT(10, 6));
523 if (isTargetIOSBased() || isTargetWatchOSBased())
525 else if (isTargetMacOS() && !isMacosxVersionLT(10, 6))
527 else if (isTargetMacOS() && !isMacosxVersionLT(10, 5) && !KernelOrKext)
533 bool SupportsObjCGC()
const override;
535 void CheckObjCARC()
const override;
537 bool UseSjLjExceptions(
const llvm::opt::ArgList &Args)
const override;
546 const llvm::opt::ArgList &Args);
551 void AddLinkRuntimeLibArgs(
const llvm::opt::ArgList &Args,
552 llvm::opt::ArgStringList &CmdArgs)
const override;
554 void AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
555 llvm::opt::ArgStringList &CmdArgs)
const override;
557 void AddCCKextLibArgs(
const llvm::opt::ArgList &Args,
558 llvm::opt::ArgStringList &CmdArgs)
const override;
560 void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args)
const override;
562 void AddLinkARCArgs(
const llvm::opt::ArgList &Args,
563 llvm::opt::ArgStringList &CmdArgs)
const override;
570 return llvm::DebuggerKind::LLDB;
576 void AddLinkSanitizerLibArgs(
const llvm::opt::ArgList &Args,
577 llvm::opt::ArgStringList &CmdArgs,
578 StringRef Sanitizer)
const;
582 virtual void anchor();
586 const llvm::opt::ArgList &Args)
589 void addClangTargetOptions(
const llvm::opt::ArgList &DriverArgs,
590 llvm::opt::ArgStringList &CC1Args)
const override;
596 const llvm::opt::ArgList &Args);
606 void AddClangCXXStdlibIncludeArgs(
607 const llvm::opt::ArgList &DriverArgs,
608 llvm::opt::ArgStringList &CC1Args)
const override;
609 void AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
610 llvm::opt::ArgStringList &CmdArgs)
const override;
615 Tool *buildLinker()
const override;
621 const llvm::opt::ArgList &Args);
625 void AddClangCXXStdlibIncludeArgs(
626 const llvm::opt::ArgList &DriverArgs,
627 llvm::opt::ArgStringList &CC1Args)
const override;
632 Tool *buildAssembler()
const override;
633 Tool *buildLinker()
const override;
639 const llvm::opt::ArgList &Args);
641 bool IsIntegratedAssemblerDefault()
const override;
642 bool IsUnwindTablesDefault()
const override;
643 bool isPICDefault()
const override;
644 bool isPIEDefault()
const override;
645 bool isPICDefaultForced()
const override;
646 bool UseSEHExceptions()
const;
649 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
650 llvm::opt::ArgStringList &CC1Args)
const override;
651 void AddClangCXXStdlibIncludeArgs(
652 const llvm::opt::ArgList &DriverArgs,
653 llvm::opt::ArgStringList &CC1Args)
const override;
657 Tool *buildLinker()
const override;
658 Tool *buildAssembler()
const override;
662 std::string GccLibDir;
665 mutable std::unique_ptr<tools::gcc::Preprocessor>
Preprocessor;
666 mutable std::unique_ptr<tools::gcc::Compiler> Compiler;
667 void findGccLibDir();
673 const llvm::opt::ArgList &Args);
685 Tool *buildAssembler()
const override;
686 Tool *buildLinker()
const override;
692 const llvm::opt::ArgList &Args);
697 CXXStdlibType GetCXXStdlibType(
const llvm::opt::ArgList &Args)
const override;
698 void AddClangCXXStdlibIncludeArgs(
699 const llvm::opt::ArgList &DriverArgs,
700 llvm::opt::ArgStringList &CC1Args)
const override;
701 void AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
702 llvm::opt::ArgStringList &CmdArgs)
const override;
708 Tool *buildAssembler()
const override;
709 Tool *buildLinker()
const override;
715 const llvm::opt::ArgList &Args);
716 bool HasNativeLLVMSupport()
const override;
721 CXXStdlibType GetCXXStdlibType(
const llvm::opt::ArgList &Args)
const override;
722 void AddClangCXXStdlibIncludeArgs(
723 const llvm::opt::ArgList &DriverArgs,
724 llvm::opt::ArgStringList &CC1Args)
const override;
725 void AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
726 llvm::opt::ArgStringList &CmdArgs)
const override;
728 bool UseSjLjExceptions(
const llvm::opt::ArgList &Args)
const override;
729 bool isPIEDefault()
const override;
737 Tool *buildAssembler()
const override;
738 Tool *buildLinker()
const override;
744 const llvm::opt::ArgList &Args);
749 CXXStdlibType GetCXXStdlibType(
const llvm::opt::ArgList &Args)
const override;
751 void AddClangCXXStdlibIncludeArgs(
752 const llvm::opt::ArgList &DriverArgs,
753 llvm::opt::ArgStringList &CC1Args)
const override;
757 Tool *buildAssembler()
const override;
758 Tool *buildLinker()
const override;
764 const llvm::opt::ArgList &Args);
767 Tool *buildAssembler()
const override;
768 Tool *buildLinker()
const override;
774 const llvm::opt::ArgList &Args);
779 Tool *buildAssembler()
const override;
780 Tool *buildLinker()
const override;
786 const llvm::opt::ArgList &Args);
788 bool HasNativeLLVMSupport()
const override;
791 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
792 llvm::opt::ArgStringList &CC1Args)
const override;
793 void AddClangCXXStdlibIncludeArgs(
794 const llvm::opt::ArgList &DriverArgs,
795 llvm::opt::ArgStringList &CC1Args)
const override;
796 void AddCudaIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
797 llvm::opt::ArgStringList &CC1Args)
const override;
798 bool isPIEDefault()
const override;
800 void addProfileRTLibs(
const llvm::opt::ArgList &Args,
801 llvm::opt::ArgStringList &CmdArgs)
const override;
802 virtual std::string computeSysRoot()
const;
807 Tool *buildAssembler()
const override;
808 Tool *buildLinker()
const override;
814 const llvm::opt::ArgList &Args);
816 llvm::opt::DerivedArgList *
817 TranslateArgs(
const llvm::opt::DerivedArgList &Args,
818 const char *BoundArch)
const override;
819 void addClangTargetOptions(
const llvm::opt::ArgList &DriverArgs,
820 llvm::opt::ArgStringList &CC1Args)
const override;
825 Tool *buildLinker()
const override;
829 const llvm::opt::ArgList &Args);
832 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
833 llvm::opt::ArgStringList &CC1Args)
const override;
835 CXXStdlibType GetCXXStdlibType(
const llvm::opt::ArgList &Args)
const override;
837 void AddClangCXXStdlibIncludeArgs(
838 const llvm::opt::ArgList &DriverArgs,
839 llvm::opt::ArgStringList &CC1Args)
const override;
841 void AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
842 llvm::opt::ArgStringList &CmdArgs)
const override;
844 std::string
getCompilerRT(
const llvm::opt::ArgList &Args, StringRef Component,
845 bool Shared =
false)
const override;
847 std::string computeSysRoot()
const override;
850 return GCCInstallation.isValid() ? RuntimeLibType::RLT_Libgcc
851 : RuntimeLibType::RLT_CompilerRT;
856 std::string LibSuffix;
862 Tool *buildAssembler()
const override;
863 Tool *buildLinker()
const override;
867 const llvm::opt::ArgList &Args);
871 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
872 llvm::opt::ArgStringList &CC1Args)
const override;
873 void AddClangCXXStdlibIncludeArgs(
874 const llvm::opt::ArgList &DriverArgs,
875 llvm::opt::ArgStringList &CC1Args)
const override;
876 CXXStdlibType GetCXXStdlibType(
const llvm::opt::ArgList &Args)
const override;
883 std::string getHexagonTargetDir(
884 const std::string &InstalledDir,
886 void getHexagonLibraryPaths(
const llvm::opt::ArgList &Args,
889 static const StringRef GetDefaultCPU();
890 static const StringRef GetTargetCPUVersion(
const llvm::opt::ArgList &Args);
893 const llvm::opt::ArgList &Args);
898 Tool *buildLinker()
const override;
902 const llvm::opt::ArgList &Args);
909 const llvm::opt::ArgList &Args);
912 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
913 llvm::opt::ArgStringList &CC1Args)
const override;
914 void AddClangCXXStdlibIncludeArgs(
915 const llvm::opt::ArgList &DriverArgs,
916 llvm::opt::ArgStringList &CC1Args)
const override;
918 CXXStdlibType GetCXXStdlibType(
const llvm::opt::ArgList &Args)
const override;
920 void AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
921 llvm::opt::ArgStringList &CmdArgs)
const override;
924 return getTriple().getArch() == llvm::Triple::mipsel;
932 std::string ComputeEffectiveClangTriple(
const llvm::opt::ArgList &Args,
936 Tool *buildLinker()
const override;
937 Tool *buildAssembler()
const override;
940 std::string NaClArmMacrosPath;
948 const llvm::opt::ArgList &Args);
951 bool IsMathErrnoDefault()
const override;
952 bool isPICDefault()
const override;
953 bool isPIEDefault()
const override;
954 bool isPICDefaultForced()
const override;
960 const llvm::opt::ArgList &Args);
962 llvm::opt::DerivedArgList *
963 TranslateArgs(
const llvm::opt::DerivedArgList &Args,
964 const char *BoundArch)
const override;
966 bool IsIntegratedAssemblerDefault()
const override;
967 bool IsUnwindTablesDefault()
const override;
968 bool isPICDefault()
const override;
969 bool isPIEDefault()
const override;
970 bool isPICDefaultForced()
const override;
973 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
974 llvm::opt::ArgStringList &CC1Args)
const override;
975 void AddClangCXXStdlibIncludeArgs(
976 const llvm::opt::ArgList &DriverArgs,
977 llvm::opt::ArgStringList &CC1Args)
const override;
979 bool getWindowsSDKDir(std::string &path,
int &major,
980 std::string &windowsSDKIncludeVersion,
981 std::string &windowsSDKLibVersion)
const;
982 bool getWindowsSDKLibraryPath(std::string &path)
const;
984 bool useUniversalCRT(std::string &visualStudioDir)
const;
985 bool getUniversalCRTSdkDir(std::string &path, std::string &ucrtVersion)
const;
986 bool getUniversalCRTLibraryPath(std::string &path)
const;
987 bool getVisualStudioInstallDir(std::string &path)
const;
988 bool getVisualStudioBinariesFolder(
const char *clangProgramPath,
989 std::string &path)
const;
991 std::string ComputeEffectiveClangTriple(
const llvm::opt::ArgList &Args,
996 void AddSystemIncludeWithSubfolder(
const llvm::opt::ArgList &DriverArgs,
997 llvm::opt::ArgStringList &CC1Args,
998 const std::string &folder,
999 const Twine &subfolder1,
1000 const Twine &subfolder2 =
"",
1001 const Twine &subfolder3 =
"")
const;
1003 Tool *buildLinker()
const override;
1004 Tool *buildAssembler()
const override;
1010 const llvm::opt::ArgList &Args);
1013 bool IsUnwindTablesDefault()
const override;
1014 bool isPICDefault()
const override;
1015 bool isPIEDefault()
const override;
1016 bool isPICDefaultForced()
const override;
1023 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
1024 llvm::opt::ArgStringList &CC1Args)
const override;
1025 void AddClangCXXStdlibIncludeArgs(
1026 const llvm::opt::ArgList &DriverArgs,
1027 llvm::opt::ArgStringList &CC1Args)
const override;
1028 void AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
1029 llvm::opt::ArgStringList &CmdArgs)
const override;
1034 Tool *buildLinker()
const override;
1035 Tool *buildAssembler()
const override;
1041 const llvm::opt::ArgList &Args);
1044 Tool *buildAssembler()
const override;
1045 Tool *buildLinker()
const override;
1048 bool isPICDefault()
const override;
1049 bool isPIEDefault()
const override;
1050 bool isPICDefaultForced()
const override;
1051 bool SupportsProfiling()
const override;
1052 bool hasBlocksRuntime()
const override;
1054 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
1055 llvm::opt::ArgStringList &CC1Args)
const override;
1056 void addClangTargetOptions(
const llvm::opt::ArgList &DriverArgs,
1057 llvm::opt::ArgStringList &CC1Args)
const override;
1058 void AddClangCXXStdlibIncludeArgs(
1059 const llvm::opt::ArgList &DriverArgs,
1060 llvm::opt::ArgStringList &CC1Args)
const override;
1061 void AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
1062 llvm::opt::ArgStringList &CmdArgs)
const override;
1070 const llvm::opt::ArgList &Args);
1074 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
1075 llvm::opt::ArgStringList &CC1Args)
const override;
1076 void AddClangCXXStdlibIncludeArgs(
1077 const llvm::opt::ArgList &DriverArgs,
1078 llvm::opt::ArgStringList &CC1Args)
const override;
1083 Tool *buildLinker()
const override;
1085 return T.getArch() == llvm::Triple::shave;
1089 mutable std::unique_ptr<Tool> Compiler;
1090 mutable std::unique_ptr<Tool> Assembler;
1096 const llvm::opt::ArgList &Args);
1099 bool IsMathErrnoDefault()
const override;
1100 bool IsObjCNonFragileABIDefault()
const override;
1101 bool UseObjCMixedDispatch()
const override;
1102 bool isPICDefault()
const override;
1103 bool isPIEDefault()
const override;
1104 bool isPICDefaultForced()
const override;
1105 bool IsIntegratedAssemblerDefault()
const override;
1106 bool hasBlocksRuntime()
const override;
1107 bool SupportsObjCGC()
const override;
1108 bool SupportsProfiling()
const override;
1109 bool HasNativeLLVMSupport()
const override;
1110 void addClangTargetOptions(
const llvm::opt::ArgList &DriverArgs,
1111 llvm::opt::ArgStringList &CC1Args)
const override;
1113 Tool *buildLinker()
const override;
1119 const llvm::opt::ArgList &Args);
1123 bool HasNativeLLVMSupport()
const override;
1124 bool isPICDefault()
const override;
1131 return llvm::DebuggerKind::SCE;
1137 Tool *buildAssembler()
const override;
1138 Tool *buildLinker()
const override;
1145 #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_H
Represents a version number in the form major[.minor[.subminor[.build]]].
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
This corresponds to a single GCC Multilib, or a segment of one controlled by a command line flag...
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.