14 #include "llvm/ADT/StringRef.h" 16 using namespace clang;
23 const llvm::Triple &Triple, StringRef &PlatformName,
24 VersionTuple &PlatformMinVersion) {
37 Builder.
defineMacro(
"__weak",
"__attribute__((objc_gc(weak)))");
47 if (Opts.POSIXThreads)
51 unsigned Maj, Min, Rev;
52 if (Triple.isMacOSX()) {
53 Triple.getMacOSXVersion(Maj, Min, Rev);
54 PlatformName =
"macos";
56 Triple.getOSVersion(Maj, Min, Rev);
57 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
63 if (PlatformName ==
"win32") {
64 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
70 assert(Maj < 100 && Min < 100 && Rev < 100 &&
"Invalid version!");
74 Str[1] =
'0' + (Min / 10);
75 Str[2] =
'0' + (Min % 10);
76 Str[3] =
'0' + (Rev / 10);
77 Str[4] =
'0' + (Rev % 10);
81 Str[0] =
'0' + (Maj / 10);
82 Str[1] =
'0' + (Maj % 10);
83 Str[2] =
'0' + (Min / 10);
84 Str[3] =
'0' + (Min % 10);
85 Str[4] =
'0' + (Rev / 10);
86 Str[5] =
'0' + (Rev % 10);
90 Builder.
defineMacro(
"__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
92 Builder.
defineMacro(
"__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
95 }
else if (Triple.isWatchOS()) {
96 assert(Maj < 10 && Min < 100 && Rev < 100 &&
"Invalid version!");
99 Str[1] =
'0' + (Min / 10);
100 Str[2] =
'0' + (Min % 10);
101 Str[3] =
'0' + (Rev / 10);
102 Str[4] =
'0' + (Rev % 10);
104 Builder.
defineMacro(
"__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
105 }
else if (Triple.isMacOSX()) {
110 assert(Maj < 100 && Min < 100 && Rev < 100 &&
"Invalid version!");
112 if (Maj < 10 || (Maj == 10 && Min < 10)) {
113 Str[0] =
'0' + (Maj / 10);
114 Str[1] =
'0' + (Maj % 10);
120 Str[0] =
'0' + (Maj / 10);
121 Str[1] =
'0' + (Maj % 10);
122 Str[2] =
'0' + (Min / 10);
123 Str[3] =
'0' + (Min % 10);
124 Str[4] =
'0' + (Rev / 10);
125 Str[5] =
'0' + (Rev % 10);
128 Builder.
defineMacro(
"__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
132 if (Triple.isOSDarwin())
135 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
142 if (Triple.isArch64Bit()) {
152 if (Opts.CPlusPlus) {
156 if (Opts.CXXExceptions)
163 if (!Opts.CharIsSigned)
168 if (Opts.POSIXThreads)
171 if (Opts.MSCompatibilityVersion) {
173 Twine(Opts.MSCompatibilityVersion / 100000));
174 Builder.
defineMacro(
"_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
179 Builder.
defineMacro(
"_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
182 if (Opts.CPlusPlus2a)
184 else if (Opts.CPlusPlus17)
186 else if (Opts.CPlusPlus14)
191 if (Opts.MicrosoftExt) {
194 if (Opts.CPlusPlus11) {
195 Builder.
defineMacro(
"_RVALUE_REFERENCES_V2_SUPPORTED");
196 Builder.
defineMacro(
"_RVALUE_REFERENCES_SUPPORTED");
207 if (Triple.isArch64Bit())
209 if (Triple.isWindowsGNUEnvironment())
211 else if (Triple.isKnownWindowsMSVCEnvironment() ||
212 (Triple.isWindowsItaniumEnvironment() && Opts.MSVCCompat))
void DefineStd(MacroBuilder &Builder, StringRef MacroName, const LangOptions &Opts)
DefineStd - Define a macro name and standard variants.
Defines the clang::MacroBuilder utility class.
bool isCompatibleWithMSVC(MSVCMajorVersion MajorVersion) const
SanitizerSet Sanitize
Set of enabled sanitizers.
static void addVisualCDefines(const LangOptions &Opts, MacroBuilder &Builder)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
static void addMinGWDefines(const llvm::Triple &Triple, const LangOptions &Opts, MacroBuilder &Builder)
void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder)
void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts, const llvm::Triple &Triple, StringRef &PlatformName, VersionTuple &PlatformMinVersion)
Dataflow Directional Tag Classes.
void addWindowsDefines(const llvm::Triple &Triple, const LangOptions &Opts, MacroBuilder &Builder)
__DEVICE__ int min(int __a, int __b)
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.
void defineMacro(const Twine &Name, const Twine &Value="1")
Append a #define line for macro of the form "\#define Name Value\n".