58 const llvm::Triple &Triple, StringRef &PlatformName,
59 VersionTuple &PlatformMinVersion) {
63 Builder.defineMacro(
"__STDC_NO_THREADS__");
66 VersionTuple OsVersion;
67 if (Triple.isMacOSX()) {
68 Triple.getMacOSXVersion(OsVersion);
69 PlatformName =
"macos";
71 OsVersion = Triple.getOSVersion();
72 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
73 if (PlatformName ==
"ios" && Triple.isMacCatalystEnvironment())
74 PlatformName =
"maccatalyst";
80 if (PlatformName ==
"win32") {
81 PlatformMinVersion = OsVersion;
85 assert(OsVersion < VersionTuple(100) &&
"Invalid version!");
87 if (Triple.isMacOSX() && OsVersion < VersionTuple(10, 10)) {
88 Str[0] =
'0' + (OsVersion.getMajor() / 10);
89 Str[1] =
'0' + (OsVersion.getMajor() % 10);
90 Str[2] =
'0' + std::min(OsVersion.getMinor().value_or(0), 9U);
91 Str[3] =
'0' + std::min(OsVersion.getSubminor().value_or(0), 9U);
93 }
else if (!Triple.isMacOSX() && OsVersion.getMajor() < 10) {
94 Str[0] =
'0' + OsVersion.getMajor();
95 Str[1] =
'0' + (OsVersion.getMinor().value_or(0) / 10);
96 Str[2] =
'0' + (OsVersion.getMinor().value_or(0) % 10);
97 Str[3] =
'0' + (OsVersion.getSubminor().value_or(0) / 10);
98 Str[4] =
'0' + (OsVersion.getSubminor().value_or(0) % 10);
102 Str[0] =
'0' + (OsVersion.getMajor() / 10);
103 Str[1] =
'0' + (OsVersion.getMajor() % 10);
104 Str[2] =
'0' + (OsVersion.getMinor().value_or(0) / 10);
105 Str[3] =
'0' + (OsVersion.getMinor().value_or(0) % 10);
106 Str[4] =
'0' + (OsVersion.getSubminor().value_or(0) / 10);
107 Str[5] =
'0' + (OsVersion.getSubminor().value_or(0) % 10);
112 if (Triple.isTvOS()) {
113 Builder.defineMacro(
"__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
114 }
else if (Triple.isiOS()) {
115 Builder.defineMacro(
"__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
116 }
else if (Triple.isWatchOS()) {
117 Builder.defineMacro(
"__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
118 }
else if (Triple.isDriverKit()) {
119 assert(OsVersion.getMinor().value_or(0) < 100 &&
120 OsVersion.getSubminor().value_or(0) < 100 &&
"Invalid version!");
121 Builder.defineMacro(
"__ENVIRONMENT_DRIVERKIT_VERSION_MIN_REQUIRED__", Str);
122 }
else if (Triple.isMacOSX()) {
123 Builder.defineMacro(
"__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
126 if (Triple.isOSDarwin()) {
129 assert(OsVersion.getMinor().value_or(0) < 100 &&
130 OsVersion.getSubminor().value_or(0) < 100 &&
"Invalid version!");
131 Builder.defineMacro(
"__ENVIRONMENT_OS_VERSION_MIN_REQUIRED__", Str);
134 PlatformMinVersion = OsVersion;
151 if (Opts.CPlusPlus) {
153 Builder.defineMacro(
"_CPPRTTI");
155 if (Opts.CXXExceptions)
156 Builder.defineMacro(
"_CPPUNWIND");
160 Builder.defineMacro(
"__BOOL_DEFINED");
162 if (!Opts.CharIsSigned)
163 Builder.defineMacro(
"_CHAR_UNSIGNED");
168 Builder.defineMacro(
"_M_FP_CONTRACT");
175 Builder.defineMacro(
"_M_FP_EXCEPT");
188 const bool any_imprecise_flags = Opts.FastMath || Opts.UnsafeFPMath ||
189 Opts.AllowFPReassoc || Opts.NoHonorNaNs ||
190 Opts.NoHonorInfs || Opts.NoSignedZero ||
191 Opts.AllowRecip || Opts.ApproxFunc;
199 LangOptions::RoundingMode::NearestTiesToEven) {
200 if (any_imprecise_flags) {
201 Builder.defineMacro(
"_M_FP_FAST");
203 Builder.defineMacro(
"_M_FP_PRECISE");
206 LangOptions::RoundingMode::Dynamic) {
210 Builder.defineMacro(
"_M_FP_STRICT");
215 if (Opts.POSIXThreads)
216 Builder.defineMacro(
"_MT");
218 if (Opts.MSCompatibilityVersion) {
219 Builder.defineMacro(
"_MSC_VER",
220 Twine(Opts.MSCompatibilityVersion / 100000));
221 Builder.defineMacro(
"_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
223 Builder.defineMacro(
"_MSC_BUILD", Twine(1));
225 Builder.defineMacro(
"_CRT_USE_BUILTIN_OFFSETOF", Twine(1));
228 Builder.defineMacro(
"_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
231 if (Opts.CPlusPlus26)
233 Builder.defineMacro(
"_MSVC_LANG",
"202400L");
234 else if (Opts.CPlusPlus23)
235 Builder.defineMacro(
"_MSVC_LANG",
"202302L");
236 else if (Opts.CPlusPlus20)
237 Builder.defineMacro(
"_MSVC_LANG",
"202002L");
238 else if (Opts.CPlusPlus17)
239 Builder.defineMacro(
"_MSVC_LANG",
"201703L");
240 else if (Opts.CPlusPlus14)
241 Builder.defineMacro(
"_MSVC_LANG",
"201402L");
245 Builder.defineMacro(
"_MSVC_CONSTEXPR_ATTRIBUTE");
248 if (Opts.MicrosoftExt) {
249 Builder.defineMacro(
"_MSC_EXTENSIONS");
251 if (Opts.CPlusPlus11) {
252 Builder.defineMacro(
"_RVALUE_REFERENCES_V2_SUPPORTED");
253 Builder.defineMacro(
"_RVALUE_REFERENCES_SUPPORTED");
254 Builder.defineMacro(
"_NATIVE_NULLPTR_SUPPORTED");
258 if (!Opts.MSVolatile)
259 Builder.defineMacro(
"_ISO_VOLATILE");
262 Builder.defineMacro(
"_KERNEL_MODE");
264 Builder.defineMacro(
"_INTEGRAL_MAX_BITS",
"64");
268 Builder.defineMacro(
"__STDC_NO_THREADS__");
275 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.