57 const llvm::Triple &Triple, StringRef &PlatformName,
58 VersionTuple &PlatformMinVersion) {
62 Builder.defineMacro(
"__STDC_NO_THREADS__");
65 VersionTuple OsVersion;
66 if (Triple.isMacOSX()) {
67 Triple.getMacOSXVersion(OsVersion);
68 PlatformName =
"macos";
70 OsVersion = Triple.getOSVersion();
71 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
72 if (PlatformName ==
"ios" && Triple.isMacCatalystEnvironment())
73 PlatformName =
"maccatalyst";
79 if (PlatformName ==
"win32") {
80 PlatformMinVersion = OsVersion;
84 assert(OsVersion < VersionTuple(100) &&
"Invalid version!");
86 if (Triple.isMacOSX() && OsVersion < VersionTuple(10, 10)) {
87 Str[0] =
'0' + (OsVersion.getMajor() / 10);
88 Str[1] =
'0' + (OsVersion.getMajor() % 10);
89 Str[2] =
'0' + std::min(OsVersion.getMinor().value_or(0), 9U);
90 Str[3] =
'0' + std::min(OsVersion.getSubminor().value_or(0), 9U);
92 }
else if (!Triple.isMacOSX() && OsVersion.getMajor() < 10) {
93 Str[0] =
'0' + OsVersion.getMajor();
94 Str[1] =
'0' + (OsVersion.getMinor().value_or(0) / 10);
95 Str[2] =
'0' + (OsVersion.getMinor().value_or(0) % 10);
96 Str[3] =
'0' + (OsVersion.getSubminor().value_or(0) / 10);
97 Str[4] =
'0' + (OsVersion.getSubminor().value_or(0) % 10);
101 Str[0] =
'0' + (OsVersion.getMajor() / 10);
102 Str[1] =
'0' + (OsVersion.getMajor() % 10);
103 Str[2] =
'0' + (OsVersion.getMinor().value_or(0) / 10);
104 Str[3] =
'0' + (OsVersion.getMinor().value_or(0) % 10);
105 Str[4] =
'0' + (OsVersion.getSubminor().value_or(0) / 10);
106 Str[5] =
'0' + (OsVersion.getSubminor().value_or(0) % 10);
111 if (Triple.isTvOS()) {
112 Builder.defineMacro(
"__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
113 }
else if (Triple.isiOS()) {
114 Builder.defineMacro(
"__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
115 }
else if (Triple.isWatchOS()) {
116 Builder.defineMacro(
"__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
117 }
else if (Triple.isDriverKit()) {
118 assert(OsVersion.getMinor().value_or(0) < 100 &&
119 OsVersion.getSubminor().value_or(0) < 100 &&
"Invalid version!");
120 Builder.defineMacro(
"__ENVIRONMENT_DRIVERKIT_VERSION_MIN_REQUIRED__", Str);
121 }
else if (Triple.isMacOSX()) {
122 Builder.defineMacro(
"__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
125 if (Triple.isOSDarwin()) {
128 assert(OsVersion.getMinor().value_or(0) < 100 &&
129 OsVersion.getSubminor().value_or(0) < 100 &&
"Invalid version!");
130 Builder.defineMacro(
"__ENVIRONMENT_OS_VERSION_MIN_REQUIRED__", Str);
133 PlatformMinVersion = OsVersion;
150 if (Opts.CPlusPlus) {
152 Builder.defineMacro(
"_CPPRTTI");
154 if (Opts.CXXExceptions)
155 Builder.defineMacro(
"_CPPUNWIND");
159 Builder.defineMacro(
"__BOOL_DEFINED");
161 if (!Opts.CharIsSigned)
162 Builder.defineMacro(
"_CHAR_UNSIGNED");
167 Builder.defineMacro(
"_M_FP_CONTRACT");
174 Builder.defineMacro(
"_M_FP_EXCEPT");
187 const bool any_imprecise_flags = Opts.FastMath || Opts.UnsafeFPMath ||
188 Opts.AllowFPReassoc || Opts.NoHonorNaNs ||
189 Opts.NoHonorInfs || Opts.NoSignedZero ||
190 Opts.AllowRecip || Opts.ApproxFunc;
198 LangOptions::RoundingMode::NearestTiesToEven) {
199 if (any_imprecise_flags) {
200 Builder.defineMacro(
"_M_FP_FAST");
202 Builder.defineMacro(
"_M_FP_PRECISE");
205 LangOptions::RoundingMode::Dynamic) {
209 Builder.defineMacro(
"_M_FP_STRICT");
214 if (Opts.POSIXThreads)
215 Builder.defineMacro(
"_MT");
217 if (Opts.MSCompatibilityVersion) {
218 Builder.defineMacro(
"_MSC_VER",
219 Twine(Opts.MSCompatibilityVersion / 100000));
220 Builder.defineMacro(
"_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
222 Builder.defineMacro(
"_MSC_BUILD", Twine(1));
224 Builder.defineMacro(
"_CRT_USE_BUILTIN_OFFSETOF", Twine(1));
227 Builder.defineMacro(
"_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
230 if (Opts.CPlusPlus26)
232 Builder.defineMacro(
"_MSVC_LANG",
"202400L");
233 else if (Opts.CPlusPlus23)
234 Builder.defineMacro(
"_MSVC_LANG",
"202302L");
235 else if (Opts.CPlusPlus20)
236 Builder.defineMacro(
"_MSVC_LANG",
"202002L");
237 else if (Opts.CPlusPlus17)
238 Builder.defineMacro(
"_MSVC_LANG",
"201703L");
239 else if (Opts.CPlusPlus14)
240 Builder.defineMacro(
"_MSVC_LANG",
"201402L");
244 Builder.defineMacro(
"_MSVC_CONSTEXPR_ATTRIBUTE");
247 if (Opts.MicrosoftExt) {
248 Builder.defineMacro(
"_MSC_EXTENSIONS");
250 if (Opts.CPlusPlus11) {
251 Builder.defineMacro(
"_RVALUE_REFERENCES_V2_SUPPORTED");
252 Builder.defineMacro(
"_RVALUE_REFERENCES_SUPPORTED");
253 Builder.defineMacro(
"_NATIVE_NULLPTR_SUPPORTED");
257 if (!Opts.MSVolatile)
258 Builder.defineMacro(
"_ISO_VOLATILE");
261 Builder.defineMacro(
"_KERNEL_MODE");
263 Builder.defineMacro(
"_INTEGRAL_MAX_BITS",
"64");
267 Builder.defineMacro(
"__STDC_NO_THREADS__");
274 Builder.defineMacro(
"_MSVC_EXECUTION_CHARACTER_SET",
"65001");
LLVM_LIBRARY_VISIBILITY void DefineStd(clang::MacroBuilder &Builder, llvm::StringRef MacroName, const clang::LangOptions &Opts)
Define a macro name and standard variants.