10b57cec5SDimitry Andric //===--- InitPreprocessor.cpp - PP initialization code. ---------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file implements the clang::InitializePreprocessor function. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #include "clang/Basic/FileManager.h" 14bdd1243dSDimitry Andric #include "clang/Basic/HLSLRuntime.h" 150b57cec5SDimitry Andric #include "clang/Basic/MacroBuilder.h" 160b57cec5SDimitry Andric #include "clang/Basic/SourceManager.h" 170b57cec5SDimitry Andric #include "clang/Basic/SyncScope.h" 180b57cec5SDimitry Andric #include "clang/Basic/TargetInfo.h" 190b57cec5SDimitry Andric #include "clang/Basic/Version.h" 200b57cec5SDimitry Andric #include "clang/Frontend/FrontendDiagnostic.h" 210b57cec5SDimitry Andric #include "clang/Frontend/FrontendOptions.h" 220b57cec5SDimitry Andric #include "clang/Frontend/Utils.h" 230b57cec5SDimitry Andric #include "clang/Lex/HeaderSearch.h" 240b57cec5SDimitry Andric #include "clang/Lex/Preprocessor.h" 250b57cec5SDimitry Andric #include "clang/Lex/PreprocessorOptions.h" 260b57cec5SDimitry Andric #include "clang/Serialization/ASTReader.h" 270b57cec5SDimitry Andric #include "llvm/ADT/APFloat.h" 28a7dea167SDimitry Andric #include "llvm/IR/DataLayout.h" 291fd87a68SDimitry Andric #include "llvm/IR/DerivedTypes.h" 300b57cec5SDimitry Andric using namespace clang; 310b57cec5SDimitry Andric 320b57cec5SDimitry Andric static bool MacroBodyEndsInBackslash(StringRef MacroBody) { 330b57cec5SDimitry Andric while (!MacroBody.empty() && isWhitespace(MacroBody.back())) 340b57cec5SDimitry Andric MacroBody = MacroBody.drop_back(); 350b57cec5SDimitry Andric return !MacroBody.empty() && MacroBody.back() == '\\'; 360b57cec5SDimitry Andric } 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric // Append a #define line to Buf for Macro. Macro should be of the form XXX, 390b57cec5SDimitry Andric // in which case we emit "#define XXX 1" or "XXX=Y z W" in which case we emit 400b57cec5SDimitry Andric // "#define XXX Y z W". To get a #define with no value, use "XXX=". 410b57cec5SDimitry Andric static void DefineBuiltinMacro(MacroBuilder &Builder, StringRef Macro, 420b57cec5SDimitry Andric DiagnosticsEngine &Diags) { 430b57cec5SDimitry Andric std::pair<StringRef, StringRef> MacroPair = Macro.split('='); 440b57cec5SDimitry Andric StringRef MacroName = MacroPair.first; 450b57cec5SDimitry Andric StringRef MacroBody = MacroPair.second; 460b57cec5SDimitry Andric if (MacroName.size() != Macro.size()) { 470b57cec5SDimitry Andric // Per GCC -D semantics, the macro ends at \n if it exists. 480b57cec5SDimitry Andric StringRef::size_type End = MacroBody.find_first_of("\n\r"); 490b57cec5SDimitry Andric if (End != StringRef::npos) 500b57cec5SDimitry Andric Diags.Report(diag::warn_fe_macro_contains_embedded_newline) 510b57cec5SDimitry Andric << MacroName; 520b57cec5SDimitry Andric MacroBody = MacroBody.substr(0, End); 530b57cec5SDimitry Andric // We handle macro bodies which end in a backslash by appending an extra 540b57cec5SDimitry Andric // backslash+newline. This makes sure we don't accidentally treat the 550b57cec5SDimitry Andric // backslash as a line continuation marker. 560b57cec5SDimitry Andric if (MacroBodyEndsInBackslash(MacroBody)) 570b57cec5SDimitry Andric Builder.defineMacro(MacroName, Twine(MacroBody) + "\\\n"); 580b57cec5SDimitry Andric else 590b57cec5SDimitry Andric Builder.defineMacro(MacroName, MacroBody); 600b57cec5SDimitry Andric } else { 610b57cec5SDimitry Andric // Push "macroname 1". 620b57cec5SDimitry Andric Builder.defineMacro(Macro); 630b57cec5SDimitry Andric } 640b57cec5SDimitry Andric } 650b57cec5SDimitry Andric 660b57cec5SDimitry Andric /// AddImplicitInclude - Add an implicit \#include of the specified file to the 670b57cec5SDimitry Andric /// predefines buffer. 680b57cec5SDimitry Andric /// As these includes are generated by -include arguments the header search 690b57cec5SDimitry Andric /// logic is going to search relatively to the current working directory. 700b57cec5SDimitry Andric static void AddImplicitInclude(MacroBuilder &Builder, StringRef File) { 710b57cec5SDimitry Andric Builder.append(Twine("#include \"") + File + "\""); 720b57cec5SDimitry Andric } 730b57cec5SDimitry Andric 740b57cec5SDimitry Andric static void AddImplicitIncludeMacros(MacroBuilder &Builder, StringRef File) { 750b57cec5SDimitry Andric Builder.append(Twine("#__include_macros \"") + File + "\""); 760b57cec5SDimitry Andric // Marker token to stop the __include_macros fetch loop. 770b57cec5SDimitry Andric Builder.append("##"); // ##? 780b57cec5SDimitry Andric } 790b57cec5SDimitry Andric 800b57cec5SDimitry Andric /// Add an implicit \#include using the original file used to generate 810b57cec5SDimitry Andric /// a PCH file. 820b57cec5SDimitry Andric static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, 830b57cec5SDimitry Andric const PCHContainerReader &PCHContainerRdr, 840b57cec5SDimitry Andric StringRef ImplicitIncludePCH) { 855ffd83dbSDimitry Andric std::string OriginalFile = ASTReader::getOriginalSourceFile( 865ffd83dbSDimitry Andric std::string(ImplicitIncludePCH), PP.getFileManager(), PCHContainerRdr, 875ffd83dbSDimitry Andric PP.getDiagnostics()); 880b57cec5SDimitry Andric if (OriginalFile.empty()) 890b57cec5SDimitry Andric return; 900b57cec5SDimitry Andric 910b57cec5SDimitry Andric AddImplicitInclude(Builder, OriginalFile); 920b57cec5SDimitry Andric } 930b57cec5SDimitry Andric 940b57cec5SDimitry Andric /// PickFP - This is used to pick a value based on the FP semantics of the 950b57cec5SDimitry Andric /// specified FP model. 960b57cec5SDimitry Andric template <typename T> 970b57cec5SDimitry Andric static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, 980b57cec5SDimitry Andric T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, 990b57cec5SDimitry Andric T IEEEQuadVal) { 1000b57cec5SDimitry Andric if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf()) 1010b57cec5SDimitry Andric return IEEEHalfVal; 1020b57cec5SDimitry Andric if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle()) 1030b57cec5SDimitry Andric return IEEESingleVal; 1040b57cec5SDimitry Andric if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEdouble()) 1050b57cec5SDimitry Andric return IEEEDoubleVal; 1060b57cec5SDimitry Andric if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::x87DoubleExtended()) 1070b57cec5SDimitry Andric return X87DoubleExtendedVal; 1080b57cec5SDimitry Andric if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble()) 1090b57cec5SDimitry Andric return PPCDoubleDoubleVal; 1100b57cec5SDimitry Andric assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad()); 1110b57cec5SDimitry Andric return IEEEQuadVal; 1120b57cec5SDimitry Andric } 1130b57cec5SDimitry Andric 1140b57cec5SDimitry Andric static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, 1150b57cec5SDimitry Andric const llvm::fltSemantics *Sem, StringRef Ext) { 1160fca6ea1SDimitry Andric const char *DenormMin, *NormMax, *Epsilon, *Max, *Min; 1170fca6ea1SDimitry Andric NormMax = PickFP(Sem, "6.5504e+4", "3.40282347e+38", 1180fca6ea1SDimitry Andric "1.7976931348623157e+308", "1.18973149535723176502e+4932", 1190fca6ea1SDimitry Andric "8.98846567431157953864652595394501e+307", 1200fca6ea1SDimitry Andric "1.18973149535723176508575932662800702e+4932"); 1210b57cec5SDimitry Andric DenormMin = PickFP(Sem, "5.9604644775390625e-8", "1.40129846e-45", 1220b57cec5SDimitry Andric "4.9406564584124654e-324", "3.64519953188247460253e-4951", 1230b57cec5SDimitry Andric "4.94065645841246544176568792868221e-324", 1240b57cec5SDimitry Andric "6.47517511943802511092443895822764655e-4966"); 1250b57cec5SDimitry Andric int Digits = PickFP(Sem, 3, 6, 15, 18, 31, 33); 1260b57cec5SDimitry Andric int DecimalDigits = PickFP(Sem, 5, 9, 17, 21, 33, 36); 1270b57cec5SDimitry Andric Epsilon = PickFP(Sem, "9.765625e-4", "1.19209290e-7", 1280b57cec5SDimitry Andric "2.2204460492503131e-16", "1.08420217248550443401e-19", 1290b57cec5SDimitry Andric "4.94065645841246544176568792868221e-324", 1300b57cec5SDimitry Andric "1.92592994438723585305597794258492732e-34"); 1310b57cec5SDimitry Andric int MantissaDigits = PickFP(Sem, 11, 24, 53, 64, 106, 113); 1320b57cec5SDimitry Andric int Min10Exp = PickFP(Sem, -4, -37, -307, -4931, -291, -4931); 1330b57cec5SDimitry Andric int Max10Exp = PickFP(Sem, 4, 38, 308, 4932, 308, 4932); 1340b57cec5SDimitry Andric int MinExp = PickFP(Sem, -13, -125, -1021, -16381, -968, -16381); 1350b57cec5SDimitry Andric int MaxExp = PickFP(Sem, 16, 128, 1024, 16384, 1024, 16384); 1360b57cec5SDimitry Andric Min = PickFP(Sem, "6.103515625e-5", "1.17549435e-38", "2.2250738585072014e-308", 1370b57cec5SDimitry Andric "3.36210314311209350626e-4932", 1380b57cec5SDimitry Andric "2.00416836000897277799610805135016e-292", 1390b57cec5SDimitry Andric "3.36210314311209350626267781732175260e-4932"); 1400b57cec5SDimitry Andric Max = PickFP(Sem, "6.5504e+4", "3.40282347e+38", "1.7976931348623157e+308", 1410b57cec5SDimitry Andric "1.18973149535723176502e+4932", 1420b57cec5SDimitry Andric "1.79769313486231580793728971405301e+308", 1430b57cec5SDimitry Andric "1.18973149535723176508575932662800702e+4932"); 1440b57cec5SDimitry Andric 1450b57cec5SDimitry Andric SmallString<32> DefPrefix; 1460b57cec5SDimitry Andric DefPrefix = "__"; 1470b57cec5SDimitry Andric DefPrefix += Prefix; 1480b57cec5SDimitry Andric DefPrefix += "_"; 1490b57cec5SDimitry Andric 1500b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "DENORM_MIN__", Twine(DenormMin)+Ext); 1510fca6ea1SDimitry Andric Builder.defineMacro(DefPrefix + "NORM_MAX__", Twine(NormMax)+Ext); 1520b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "HAS_DENORM__"); 1530b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "DIG__", Twine(Digits)); 1540b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "DECIMAL_DIG__", Twine(DecimalDigits)); 1550b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "EPSILON__", Twine(Epsilon)+Ext); 1560b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "HAS_INFINITY__"); 1570b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "HAS_QUIET_NAN__"); 1580b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "MANT_DIG__", Twine(MantissaDigits)); 1590b57cec5SDimitry Andric 1600b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "MAX_10_EXP__", Twine(Max10Exp)); 1610b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "MAX_EXP__", Twine(MaxExp)); 1620b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "MAX__", Twine(Max)+Ext); 1630b57cec5SDimitry Andric 1640b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "MIN_10_EXP__","("+Twine(Min10Exp)+")"); 1650b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "MIN_EXP__", "("+Twine(MinExp)+")"); 1660b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "MIN__", Twine(Min)+Ext); 1670b57cec5SDimitry Andric } 1680b57cec5SDimitry Andric 1690b57cec5SDimitry Andric 1700b57cec5SDimitry Andric /// DefineTypeSize - Emit a macro to the predefines buffer that declares a macro 1710b57cec5SDimitry Andric /// named MacroName with the max value for a type with width 'TypeWidth' a 1720b57cec5SDimitry Andric /// signedness of 'isSigned' and with a value suffix of 'ValSuffix' (e.g. LL). 1730b57cec5SDimitry Andric static void DefineTypeSize(const Twine &MacroName, unsigned TypeWidth, 1740b57cec5SDimitry Andric StringRef ValSuffix, bool isSigned, 1750b57cec5SDimitry Andric MacroBuilder &Builder) { 1760b57cec5SDimitry Andric llvm::APInt MaxVal = isSigned ? llvm::APInt::getSignedMaxValue(TypeWidth) 1770b57cec5SDimitry Andric : llvm::APInt::getMaxValue(TypeWidth); 178fe6060f1SDimitry Andric Builder.defineMacro(MacroName, toString(MaxVal, 10, isSigned) + ValSuffix); 1790b57cec5SDimitry Andric } 1800b57cec5SDimitry Andric 1810b57cec5SDimitry Andric /// DefineTypeSize - An overloaded helper that uses TargetInfo to determine 1820b57cec5SDimitry Andric /// the width, suffix, and signedness of the given type 1830b57cec5SDimitry Andric static void DefineTypeSize(const Twine &MacroName, TargetInfo::IntType Ty, 1840b57cec5SDimitry Andric const TargetInfo &TI, MacroBuilder &Builder) { 1850b57cec5SDimitry Andric DefineTypeSize(MacroName, TI.getTypeWidth(Ty), TI.getTypeConstantSuffix(Ty), 1860b57cec5SDimitry Andric TI.isTypeSigned(Ty), Builder); 1870b57cec5SDimitry Andric } 1880b57cec5SDimitry Andric 1890fca6ea1SDimitry Andric static void DefineFmt(const LangOptions &LangOpts, const Twine &Prefix, 1900fca6ea1SDimitry Andric TargetInfo::IntType Ty, const TargetInfo &TI, 1910fca6ea1SDimitry Andric MacroBuilder &Builder) { 1920b57cec5SDimitry Andric StringRef FmtModifier = TI.getTypeFormatModifier(Ty); 1930fca6ea1SDimitry Andric auto Emitter = [&](char Fmt) { 1940fca6ea1SDimitry Andric Builder.defineMacro(Prefix + "_FMT" + Twine(Fmt) + "__", 1950fca6ea1SDimitry Andric Twine("\"") + FmtModifier + Twine(Fmt) + "\""); 1960fca6ea1SDimitry Andric }; 1970fca6ea1SDimitry Andric bool IsSigned = TI.isTypeSigned(Ty); 1980fca6ea1SDimitry Andric llvm::for_each(StringRef(IsSigned ? "di" : "ouxX"), Emitter); 1990fca6ea1SDimitry Andric 2000fca6ea1SDimitry Andric // C23 added the b and B modifiers for printing binary output of unsigned 2010fca6ea1SDimitry Andric // integers. Conditionally define those if compiling in C23 mode. 2020fca6ea1SDimitry Andric if (LangOpts.C23 && !IsSigned) 2030fca6ea1SDimitry Andric llvm::for_each(StringRef("bB"), Emitter); 2040b57cec5SDimitry Andric } 2050b57cec5SDimitry Andric 2060b57cec5SDimitry Andric static void DefineType(const Twine &MacroName, TargetInfo::IntType Ty, 2070b57cec5SDimitry Andric MacroBuilder &Builder) { 2080b57cec5SDimitry Andric Builder.defineMacro(MacroName, TargetInfo::getTypeName(Ty)); 2090b57cec5SDimitry Andric } 2100b57cec5SDimitry Andric 21104eeddc0SDimitry Andric static void DefineTypeWidth(const Twine &MacroName, TargetInfo::IntType Ty, 2120b57cec5SDimitry Andric const TargetInfo &TI, MacroBuilder &Builder) { 2130b57cec5SDimitry Andric Builder.defineMacro(MacroName, Twine(TI.getTypeWidth(Ty))); 2140b57cec5SDimitry Andric } 2150b57cec5SDimitry Andric 2160b57cec5SDimitry Andric static void DefineTypeSizeof(StringRef MacroName, unsigned BitWidth, 2170b57cec5SDimitry Andric const TargetInfo &TI, MacroBuilder &Builder) { 2180b57cec5SDimitry Andric Builder.defineMacro(MacroName, 2190b57cec5SDimitry Andric Twine(BitWidth / TI.getCharWidth())); 2200b57cec5SDimitry Andric } 2210b57cec5SDimitry Andric 22204eeddc0SDimitry Andric // This will generate a macro based on the prefix with `_MAX__` as the suffix 22304eeddc0SDimitry Andric // for the max value representable for the type, and a macro with a `_WIDTH__` 22404eeddc0SDimitry Andric // suffix for the width of the type. 22504eeddc0SDimitry Andric static void DefineTypeSizeAndWidth(const Twine &Prefix, TargetInfo::IntType Ty, 22604eeddc0SDimitry Andric const TargetInfo &TI, 22704eeddc0SDimitry Andric MacroBuilder &Builder) { 22804eeddc0SDimitry Andric DefineTypeSize(Prefix + "_MAX__", Ty, TI, Builder); 22904eeddc0SDimitry Andric DefineTypeWidth(Prefix + "_WIDTH__", Ty, TI, Builder); 23004eeddc0SDimitry Andric } 23104eeddc0SDimitry Andric 2320fca6ea1SDimitry Andric static void DefineExactWidthIntType(const LangOptions &LangOpts, 2330fca6ea1SDimitry Andric TargetInfo::IntType Ty, 2340b57cec5SDimitry Andric const TargetInfo &TI, 2350b57cec5SDimitry Andric MacroBuilder &Builder) { 2360b57cec5SDimitry Andric int TypeWidth = TI.getTypeWidth(Ty); 2370b57cec5SDimitry Andric bool IsSigned = TI.isTypeSigned(Ty); 2380b57cec5SDimitry Andric 2390b57cec5SDimitry Andric // Use the target specified int64 type, when appropriate, so that [u]int64_t 2400b57cec5SDimitry Andric // ends up being defined in terms of the correct type. 2410b57cec5SDimitry Andric if (TypeWidth == 64) 2420b57cec5SDimitry Andric Ty = IsSigned ? TI.getInt64Type() : TI.getUInt64Type(); 2430b57cec5SDimitry Andric 244fe6060f1SDimitry Andric // Use the target specified int16 type when appropriate. Some MCU targets 245fe6060f1SDimitry Andric // (such as AVR) have definition of [u]int16_t to [un]signed int. 246fe6060f1SDimitry Andric if (TypeWidth == 16) 247fe6060f1SDimitry Andric Ty = IsSigned ? TI.getInt16Type() : TI.getUInt16Type(); 248fe6060f1SDimitry Andric 2490b57cec5SDimitry Andric const char *Prefix = IsSigned ? "__INT" : "__UINT"; 2500b57cec5SDimitry Andric 2510b57cec5SDimitry Andric DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder); 2520fca6ea1SDimitry Andric DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder); 2530b57cec5SDimitry Andric 2540b57cec5SDimitry Andric StringRef ConstSuffix(TI.getTypeConstantSuffix(Ty)); 2550b57cec5SDimitry Andric Builder.defineMacro(Prefix + Twine(TypeWidth) + "_C_SUFFIX__", ConstSuffix); 2560b57cec5SDimitry Andric } 2570b57cec5SDimitry Andric 2580b57cec5SDimitry Andric static void DefineExactWidthIntTypeSize(TargetInfo::IntType Ty, 2590b57cec5SDimitry Andric const TargetInfo &TI, 2600b57cec5SDimitry Andric MacroBuilder &Builder) { 2610b57cec5SDimitry Andric int TypeWidth = TI.getTypeWidth(Ty); 2620b57cec5SDimitry Andric bool IsSigned = TI.isTypeSigned(Ty); 2630b57cec5SDimitry Andric 2640b57cec5SDimitry Andric // Use the target specified int64 type, when appropriate, so that [u]int64_t 2650b57cec5SDimitry Andric // ends up being defined in terms of the correct type. 2660b57cec5SDimitry Andric if (TypeWidth == 64) 2670b57cec5SDimitry Andric Ty = IsSigned ? TI.getInt64Type() : TI.getUInt64Type(); 2680b57cec5SDimitry Andric 26904eeddc0SDimitry Andric // We don't need to define a _WIDTH macro for the exact-width types because 27004eeddc0SDimitry Andric // we already know the width. 2710b57cec5SDimitry Andric const char *Prefix = IsSigned ? "__INT" : "__UINT"; 2720b57cec5SDimitry Andric DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder); 2730b57cec5SDimitry Andric } 2740b57cec5SDimitry Andric 2750fca6ea1SDimitry Andric static void DefineLeastWidthIntType(const LangOptions &LangOpts, 2760fca6ea1SDimitry Andric unsigned TypeWidth, bool IsSigned, 2770b57cec5SDimitry Andric const TargetInfo &TI, 2780b57cec5SDimitry Andric MacroBuilder &Builder) { 2790b57cec5SDimitry Andric TargetInfo::IntType Ty = TI.getLeastIntTypeByWidth(TypeWidth, IsSigned); 2800b57cec5SDimitry Andric if (Ty == TargetInfo::NoInt) 2810b57cec5SDimitry Andric return; 2820b57cec5SDimitry Andric 2830b57cec5SDimitry Andric const char *Prefix = IsSigned ? "__INT_LEAST" : "__UINT_LEAST"; 2840b57cec5SDimitry Andric DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder); 28504eeddc0SDimitry Andric // We only want the *_WIDTH macro for the signed types to avoid too many 28604eeddc0SDimitry Andric // predefined macros (the unsigned width and the signed width are identical.) 28704eeddc0SDimitry Andric if (IsSigned) 28804eeddc0SDimitry Andric DefineTypeSizeAndWidth(Prefix + Twine(TypeWidth), Ty, TI, Builder); 28904eeddc0SDimitry Andric else 2900b57cec5SDimitry Andric DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder); 2910fca6ea1SDimitry Andric DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder); 2920b57cec5SDimitry Andric } 2930b57cec5SDimitry Andric 2940fca6ea1SDimitry Andric static void DefineFastIntType(const LangOptions &LangOpts, unsigned TypeWidth, 2950fca6ea1SDimitry Andric bool IsSigned, const TargetInfo &TI, 2960fca6ea1SDimitry Andric MacroBuilder &Builder) { 2970b57cec5SDimitry Andric // stdint.h currently defines the fast int types as equivalent to the least 2980b57cec5SDimitry Andric // types. 2990b57cec5SDimitry Andric TargetInfo::IntType Ty = TI.getLeastIntTypeByWidth(TypeWidth, IsSigned); 3000b57cec5SDimitry Andric if (Ty == TargetInfo::NoInt) 3010b57cec5SDimitry Andric return; 3020b57cec5SDimitry Andric 3030b57cec5SDimitry Andric const char *Prefix = IsSigned ? "__INT_FAST" : "__UINT_FAST"; 3040b57cec5SDimitry Andric DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder); 30504eeddc0SDimitry Andric // We only want the *_WIDTH macro for the signed types to avoid too many 30604eeddc0SDimitry Andric // predefined macros (the unsigned width and the signed width are identical.) 30704eeddc0SDimitry Andric if (IsSigned) 30804eeddc0SDimitry Andric DefineTypeSizeAndWidth(Prefix + Twine(TypeWidth), Ty, TI, Builder); 30904eeddc0SDimitry Andric else 3100b57cec5SDimitry Andric DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder); 3110fca6ea1SDimitry Andric DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder); 3120b57cec5SDimitry Andric } 3130b57cec5SDimitry Andric 3140b57cec5SDimitry Andric 3150b57cec5SDimitry Andric /// Get the value the ATOMIC_*_LOCK_FREE macro should have for a type with 3160b57cec5SDimitry Andric /// the specified properties. 317bdd1243dSDimitry Andric static const char *getLockFreeValue(unsigned TypeWidth, const TargetInfo &TI) { 3180b57cec5SDimitry Andric // Fully-aligned, power-of-2 sizes no larger than the inline 3190b57cec5SDimitry Andric // width will be inlined as lock-free operations. 320fcaf7f86SDimitry Andric // Note: we do not need to check alignment since _Atomic(T) is always 321fcaf7f86SDimitry Andric // appropriately-aligned in clang. 322bdd1243dSDimitry Andric if (TI.hasBuiltinAtomic(TypeWidth, TypeWidth)) 3230b57cec5SDimitry Andric return "2"; // "always lock free" 3240b57cec5SDimitry Andric // We cannot be certain what operations the lib calls might be 3250b57cec5SDimitry Andric // able to implement as lock-free on future processors. 3260b57cec5SDimitry Andric return "1"; // "sometimes lock free" 3270b57cec5SDimitry Andric } 3280b57cec5SDimitry Andric 3290b57cec5SDimitry Andric /// Add definitions required for a smooth interaction between 3300b57cec5SDimitry Andric /// Objective-C++ automated reference counting and libstdc++ (4.2). 3310b57cec5SDimitry Andric static void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts, 3320b57cec5SDimitry Andric MacroBuilder &Builder) { 3330b57cec5SDimitry Andric Builder.defineMacro("_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR"); 3340b57cec5SDimitry Andric 3350b57cec5SDimitry Andric std::string Result; 3360b57cec5SDimitry Andric { 3370b57cec5SDimitry Andric // Provide specializations for the __is_scalar type trait so that 3380b57cec5SDimitry Andric // lifetime-qualified objects are not considered "scalar" types, which 3390b57cec5SDimitry Andric // libstdc++ uses as an indicator of the presence of trivial copy, assign, 3400b57cec5SDimitry Andric // default-construct, and destruct semantics (none of which hold for 3410b57cec5SDimitry Andric // lifetime-qualified objects in ARC). 3420b57cec5SDimitry Andric llvm::raw_string_ostream Out(Result); 3430b57cec5SDimitry Andric 3440b57cec5SDimitry Andric Out << "namespace std {\n" 3450b57cec5SDimitry Andric << "\n" 3460b57cec5SDimitry Andric << "struct __true_type;\n" 3470b57cec5SDimitry Andric << "struct __false_type;\n" 3480b57cec5SDimitry Andric << "\n"; 3490b57cec5SDimitry Andric 3500b57cec5SDimitry Andric Out << "template<typename _Tp> struct __is_scalar;\n" 3510b57cec5SDimitry Andric << "\n"; 3520b57cec5SDimitry Andric 3530b57cec5SDimitry Andric if (LangOpts.ObjCAutoRefCount) { 3540b57cec5SDimitry Andric Out << "template<typename _Tp>\n" 3550b57cec5SDimitry Andric << "struct __is_scalar<__attribute__((objc_ownership(strong))) _Tp> {\n" 3560b57cec5SDimitry Andric << " enum { __value = 0 };\n" 3570b57cec5SDimitry Andric << " typedef __false_type __type;\n" 3580b57cec5SDimitry Andric << "};\n" 3590b57cec5SDimitry Andric << "\n"; 3600b57cec5SDimitry Andric } 3610b57cec5SDimitry Andric 3620b57cec5SDimitry Andric if (LangOpts.ObjCWeak) { 3630b57cec5SDimitry Andric Out << "template<typename _Tp>\n" 3640b57cec5SDimitry Andric << "struct __is_scalar<__attribute__((objc_ownership(weak))) _Tp> {\n" 3650b57cec5SDimitry Andric << " enum { __value = 0 };\n" 3660b57cec5SDimitry Andric << " typedef __false_type __type;\n" 3670b57cec5SDimitry Andric << "};\n" 3680b57cec5SDimitry Andric << "\n"; 3690b57cec5SDimitry Andric } 3700b57cec5SDimitry Andric 3710b57cec5SDimitry Andric if (LangOpts.ObjCAutoRefCount) { 3720b57cec5SDimitry Andric Out << "template<typename _Tp>\n" 3730b57cec5SDimitry Andric << "struct __is_scalar<__attribute__((objc_ownership(autoreleasing)))" 3740b57cec5SDimitry Andric << " _Tp> {\n" 3750b57cec5SDimitry Andric << " enum { __value = 0 };\n" 3760b57cec5SDimitry Andric << " typedef __false_type __type;\n" 3770b57cec5SDimitry Andric << "};\n" 3780b57cec5SDimitry Andric << "\n"; 3790b57cec5SDimitry Andric } 3800b57cec5SDimitry Andric 3810b57cec5SDimitry Andric Out << "}\n"; 3820b57cec5SDimitry Andric } 3830b57cec5SDimitry Andric Builder.append(Result); 3840b57cec5SDimitry Andric } 3850b57cec5SDimitry Andric 3860b57cec5SDimitry Andric static void InitializeStandardPredefinedMacros(const TargetInfo &TI, 3870b57cec5SDimitry Andric const LangOptions &LangOpts, 3880b57cec5SDimitry Andric const FrontendOptions &FEOpts, 3890b57cec5SDimitry Andric MacroBuilder &Builder) { 39081ad6265SDimitry Andric if (LangOpts.HLSL) { 39181ad6265SDimitry Andric Builder.defineMacro("__hlsl_clang"); 39281ad6265SDimitry Andric // HLSL Version 39381ad6265SDimitry Andric Builder.defineMacro("__HLSL_VERSION", 39481ad6265SDimitry Andric Twine((unsigned)LangOpts.getHLSLVersion())); 39581ad6265SDimitry Andric 39681ad6265SDimitry Andric if (LangOpts.NativeHalfType) 3970fca6ea1SDimitry Andric Builder.defineMacro("__HLSL_ENABLE_16_BIT", "1"); 39881ad6265SDimitry Andric 39981ad6265SDimitry Andric // Shader target information 40081ad6265SDimitry Andric // "enums" for shader stages 40181ad6265SDimitry Andric Builder.defineMacro("__SHADER_STAGE_VERTEX", 40281ad6265SDimitry Andric Twine((uint32_t)ShaderStage::Vertex)); 40381ad6265SDimitry Andric Builder.defineMacro("__SHADER_STAGE_PIXEL", 40481ad6265SDimitry Andric Twine((uint32_t)ShaderStage::Pixel)); 40581ad6265SDimitry Andric Builder.defineMacro("__SHADER_STAGE_GEOMETRY", 40681ad6265SDimitry Andric Twine((uint32_t)ShaderStage::Geometry)); 40781ad6265SDimitry Andric Builder.defineMacro("__SHADER_STAGE_HULL", 40881ad6265SDimitry Andric Twine((uint32_t)ShaderStage::Hull)); 40981ad6265SDimitry Andric Builder.defineMacro("__SHADER_STAGE_DOMAIN", 41081ad6265SDimitry Andric Twine((uint32_t)ShaderStage::Domain)); 41181ad6265SDimitry Andric Builder.defineMacro("__SHADER_STAGE_COMPUTE", 41281ad6265SDimitry Andric Twine((uint32_t)ShaderStage::Compute)); 41381ad6265SDimitry Andric Builder.defineMacro("__SHADER_STAGE_AMPLIFICATION", 41481ad6265SDimitry Andric Twine((uint32_t)ShaderStage::Amplification)); 41581ad6265SDimitry Andric Builder.defineMacro("__SHADER_STAGE_MESH", 41681ad6265SDimitry Andric Twine((uint32_t)ShaderStage::Mesh)); 41781ad6265SDimitry Andric Builder.defineMacro("__SHADER_STAGE_LIBRARY", 41881ad6265SDimitry Andric Twine((uint32_t)ShaderStage::Library)); 41981ad6265SDimitry Andric // The current shader stage itself 420bdd1243dSDimitry Andric uint32_t StageInteger = static_cast<uint32_t>( 421bdd1243dSDimitry Andric hlsl::getStageFromEnvironment(TI.getTriple().getEnvironment())); 42281ad6265SDimitry Andric 42381ad6265SDimitry Andric Builder.defineMacro("__SHADER_TARGET_STAGE", Twine(StageInteger)); 42481ad6265SDimitry Andric // Add target versions 42581ad6265SDimitry Andric if (TI.getTriple().getOS() == llvm::Triple::ShaderModel) { 42681ad6265SDimitry Andric VersionTuple Version = TI.getTriple().getOSVersion(); 42781ad6265SDimitry Andric Builder.defineMacro("__SHADER_TARGET_MAJOR", Twine(Version.getMajor())); 42881ad6265SDimitry Andric unsigned Minor = Version.getMinor().value_or(0); 42981ad6265SDimitry Andric Builder.defineMacro("__SHADER_TARGET_MINOR", Twine(Minor)); 43081ad6265SDimitry Andric } 43181ad6265SDimitry Andric return; 43281ad6265SDimitry Andric } 43347395794SDimitry Andric // C++ [cpp.predefined]p1: 43447395794SDimitry Andric // The following macro names shall be defined by the implementation: 43547395794SDimitry Andric 43647395794SDimitry Andric // -- __STDC__ 43747395794SDimitry Andric // [C++] Whether __STDC__ is predefined and if so, what its value is, 43847395794SDimitry Andric // are implementation-defined. 43947395794SDimitry Andric // (Removed in C++20.) 4400fca6ea1SDimitry Andric if ((!LangOpts.MSVCCompat || LangOpts.MSVCEnableStdcMacro) && 4410fca6ea1SDimitry Andric !LangOpts.TraditionalCPP) 4420b57cec5SDimitry Andric Builder.defineMacro("__STDC__"); 44347395794SDimitry Andric // -- __STDC_HOSTED__ 44447395794SDimitry Andric // The integer literal 1 if the implementation is a hosted 44547395794SDimitry Andric // implementation or the integer literal 0 if it is not. 4460b57cec5SDimitry Andric if (LangOpts.Freestanding) 4470b57cec5SDimitry Andric Builder.defineMacro("__STDC_HOSTED__", "0"); 4480b57cec5SDimitry Andric else 4490b57cec5SDimitry Andric Builder.defineMacro("__STDC_HOSTED__"); 4500b57cec5SDimitry Andric 45147395794SDimitry Andric // -- __STDC_VERSION__ 45247395794SDimitry Andric // [C++] Whether __STDC_VERSION__ is predefined and if so, what its 45347395794SDimitry Andric // value is, are implementation-defined. 45447395794SDimitry Andric // (Removed in C++20.) 4550b57cec5SDimitry Andric if (!LangOpts.CPlusPlus) { 4560fca6ea1SDimitry Andric if (LangOpts.C2y) 4570fca6ea1SDimitry Andric Builder.defineMacro("__STDC_VERSION__", "202400L"); 4580fca6ea1SDimitry Andric else if (LangOpts.C23) 4595f757f3fSDimitry Andric Builder.defineMacro("__STDC_VERSION__", "202311L"); 460349cc55cSDimitry Andric else if (LangOpts.C17) 4610b57cec5SDimitry Andric Builder.defineMacro("__STDC_VERSION__", "201710L"); 4620b57cec5SDimitry Andric else if (LangOpts.C11) 4630b57cec5SDimitry Andric Builder.defineMacro("__STDC_VERSION__", "201112L"); 4640b57cec5SDimitry Andric else if (LangOpts.C99) 4650b57cec5SDimitry Andric Builder.defineMacro("__STDC_VERSION__", "199901L"); 4660b57cec5SDimitry Andric else if (!LangOpts.GNUMode && LangOpts.Digraphs) 4670b57cec5SDimitry Andric Builder.defineMacro("__STDC_VERSION__", "199409L"); 4680b57cec5SDimitry Andric } else { 46947395794SDimitry Andric // -- __cplusplus 47006c3fb27SDimitry Andric if (LangOpts.CPlusPlus26) 47106c3fb27SDimitry Andric // FIXME: Use correct value for C++26. 47206c3fb27SDimitry Andric Builder.defineMacro("__cplusplus", "202400L"); 47306c3fb27SDimitry Andric else if (LangOpts.CPlusPlus23) 47406c3fb27SDimitry Andric Builder.defineMacro("__cplusplus", "202302L"); 47547395794SDimitry Andric // [C++20] The integer literal 202002L. 476e8d8bef9SDimitry Andric else if (LangOpts.CPlusPlus20) 47747395794SDimitry Andric Builder.defineMacro("__cplusplus", "202002L"); 47847395794SDimitry Andric // [C++17] The integer literal 201703L. 4790b57cec5SDimitry Andric else if (LangOpts.CPlusPlus17) 4800b57cec5SDimitry Andric Builder.defineMacro("__cplusplus", "201703L"); 48147395794SDimitry Andric // [C++14] The name __cplusplus is defined to the value 201402L when 48247395794SDimitry Andric // compiling a C++ translation unit. 4830b57cec5SDimitry Andric else if (LangOpts.CPlusPlus14) 4840b57cec5SDimitry Andric Builder.defineMacro("__cplusplus", "201402L"); 48547395794SDimitry Andric // [C++11] The name __cplusplus is defined to the value 201103L when 48647395794SDimitry Andric // compiling a C++ translation unit. 4870b57cec5SDimitry Andric else if (LangOpts.CPlusPlus11) 4880b57cec5SDimitry Andric Builder.defineMacro("__cplusplus", "201103L"); 48947395794SDimitry Andric // [C++03] The name __cplusplus is defined to the value 199711L when 49047395794SDimitry Andric // compiling a C++ translation unit. 4910b57cec5SDimitry Andric else 4920b57cec5SDimitry Andric Builder.defineMacro("__cplusplus", "199711L"); 4930b57cec5SDimitry Andric 49447395794SDimitry Andric // -- __STDCPP_DEFAULT_NEW_ALIGNMENT__ 49547395794SDimitry Andric // [C++17] An integer literal of type std::size_t whose value is the 49647395794SDimitry Andric // alignment guaranteed by a call to operator new(std::size_t) 4970b57cec5SDimitry Andric // 4980b57cec5SDimitry Andric // We provide this in all language modes, since it seems generally useful. 4990b57cec5SDimitry Andric Builder.defineMacro("__STDCPP_DEFAULT_NEW_ALIGNMENT__", 5000b57cec5SDimitry Andric Twine(TI.getNewAlign() / TI.getCharWidth()) + 5010b57cec5SDimitry Andric TI.getTypeConstantSuffix(TI.getSizeType())); 502e8d8bef9SDimitry Andric 503e8d8bef9SDimitry Andric // -- __STDCPP_THREADS__ 504e8d8bef9SDimitry Andric // Defined, and has the value integer literal 1, if and only if a 505e8d8bef9SDimitry Andric // program can have more than one thread of execution. 506e8d8bef9SDimitry Andric if (LangOpts.getThreadModel() == LangOptions::ThreadModelKind::POSIX) 507e8d8bef9SDimitry Andric Builder.defineMacro("__STDCPP_THREADS__", "1"); 5080b57cec5SDimitry Andric } 5090b57cec5SDimitry Andric 5100b57cec5SDimitry Andric // In C11 these are environment macros. In C++11 they are only defined 5110b57cec5SDimitry Andric // as part of <cuchar>. To prevent breakage when mixing C and C++ 5120b57cec5SDimitry Andric // code, define these macros unconditionally. We can define them 5130b57cec5SDimitry Andric // unconditionally, as Clang always uses UTF-16 and UTF-32 for 16-bit 5140b57cec5SDimitry Andric // and 32-bit character literals. 5150b57cec5SDimitry Andric Builder.defineMacro("__STDC_UTF_16__", "1"); 5160b57cec5SDimitry Andric Builder.defineMacro("__STDC_UTF_32__", "1"); 5170b57cec5SDimitry Andric 5180fca6ea1SDimitry Andric // __has_embed definitions 5190fca6ea1SDimitry Andric Builder.defineMacro("__STDC_EMBED_NOT_FOUND__", 5200fca6ea1SDimitry Andric llvm::itostr(static_cast<int>(EmbedResult::NotFound))); 5210fca6ea1SDimitry Andric Builder.defineMacro("__STDC_EMBED_FOUND__", 5220fca6ea1SDimitry Andric llvm::itostr(static_cast<int>(EmbedResult::Found))); 5230fca6ea1SDimitry Andric Builder.defineMacro("__STDC_EMBED_EMPTY__", 5240fca6ea1SDimitry Andric llvm::itostr(static_cast<int>(EmbedResult::Empty))); 5250fca6ea1SDimitry Andric 5260b57cec5SDimitry Andric if (LangOpts.ObjC) 5270b57cec5SDimitry Andric Builder.defineMacro("__OBJC__"); 5280b57cec5SDimitry Andric 5290b57cec5SDimitry Andric // OpenCL v1.0/1.1 s6.9, v1.2/2.0 s6.10: Preprocessor Directives and Macros. 5300b57cec5SDimitry Andric if (LangOpts.OpenCL) { 5310b57cec5SDimitry Andric if (LangOpts.CPlusPlus) { 532349cc55cSDimitry Andric switch (LangOpts.OpenCLCPlusPlusVersion) { 533349cc55cSDimitry Andric case 100: 5340b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_CPP_VERSION__", "100"); 535349cc55cSDimitry Andric break; 536349cc55cSDimitry Andric case 202100: 537349cc55cSDimitry Andric Builder.defineMacro("__OPENCL_CPP_VERSION__", "202100"); 538349cc55cSDimitry Andric break; 539349cc55cSDimitry Andric default: 5400b57cec5SDimitry Andric llvm_unreachable("Unsupported C++ version for OpenCL"); 541349cc55cSDimitry Andric } 5420b57cec5SDimitry Andric Builder.defineMacro("__CL_CPP_VERSION_1_0__", "100"); 543349cc55cSDimitry Andric Builder.defineMacro("__CL_CPP_VERSION_2021__", "202100"); 5440b57cec5SDimitry Andric } else { 5450b57cec5SDimitry Andric // OpenCL v1.0 and v1.1 do not have a predefined macro to indicate the 5460b57cec5SDimitry Andric // language standard with which the program is compiled. __OPENCL_VERSION__ 5470b57cec5SDimitry Andric // is for the OpenCL version supported by the OpenCL device, which is not 5480b57cec5SDimitry Andric // necessarily the language standard with which the program is compiled. 5490b57cec5SDimitry Andric // A shared OpenCL header file requires a macro to indicate the language 5500b57cec5SDimitry Andric // standard. As a workaround, __OPENCL_C_VERSION__ is defined for 5510b57cec5SDimitry Andric // OpenCL v1.0 and v1.1. 5520b57cec5SDimitry Andric switch (LangOpts.OpenCLVersion) { 5530b57cec5SDimitry Andric case 100: 5540b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_C_VERSION__", "100"); 5550b57cec5SDimitry Andric break; 5560b57cec5SDimitry Andric case 110: 5570b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_C_VERSION__", "110"); 5580b57cec5SDimitry Andric break; 5590b57cec5SDimitry Andric case 120: 5600b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_C_VERSION__", "120"); 5610b57cec5SDimitry Andric break; 5620b57cec5SDimitry Andric case 200: 5630b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_C_VERSION__", "200"); 5640b57cec5SDimitry Andric break; 565e8d8bef9SDimitry Andric case 300: 566e8d8bef9SDimitry Andric Builder.defineMacro("__OPENCL_C_VERSION__", "300"); 567e8d8bef9SDimitry Andric break; 5680b57cec5SDimitry Andric default: 5690b57cec5SDimitry Andric llvm_unreachable("Unsupported OpenCL version"); 5700b57cec5SDimitry Andric } 5710b57cec5SDimitry Andric } 5720b57cec5SDimitry Andric Builder.defineMacro("CL_VERSION_1_0", "100"); 5730b57cec5SDimitry Andric Builder.defineMacro("CL_VERSION_1_1", "110"); 5740b57cec5SDimitry Andric Builder.defineMacro("CL_VERSION_1_2", "120"); 5750b57cec5SDimitry Andric Builder.defineMacro("CL_VERSION_2_0", "200"); 576e8d8bef9SDimitry Andric Builder.defineMacro("CL_VERSION_3_0", "300"); 5770b57cec5SDimitry Andric 5780b57cec5SDimitry Andric if (TI.isLittleEndian()) 5790b57cec5SDimitry Andric Builder.defineMacro("__ENDIAN_LITTLE__"); 5800b57cec5SDimitry Andric 5810b57cec5SDimitry Andric if (LangOpts.FastRelaxedMath) 5820b57cec5SDimitry Andric Builder.defineMacro("__FAST_RELAXED_MATH__"); 5830b57cec5SDimitry Andric } 5845ffd83dbSDimitry Andric 585fe6060f1SDimitry Andric if (LangOpts.SYCLIsDevice || LangOpts.SYCLIsHost) { 5865ffd83dbSDimitry Andric // SYCL Version is set to a value when building SYCL applications 587e8d8bef9SDimitry Andric if (LangOpts.getSYCLVersion() == LangOptions::SYCL_2017) 5885ffd83dbSDimitry Andric Builder.defineMacro("CL_SYCL_LANGUAGE_VERSION", "121"); 589fe6060f1SDimitry Andric else if (LangOpts.getSYCLVersion() == LangOptions::SYCL_2020) 590fe6060f1SDimitry Andric Builder.defineMacro("SYCL_LANGUAGE_VERSION", "202001"); 5915ffd83dbSDimitry Andric } 5925ffd83dbSDimitry Andric 5930b57cec5SDimitry Andric // Not "standard" per se, but available even with the -undef flag. 5940b57cec5SDimitry Andric if (LangOpts.AsmPreprocessor) 5950b57cec5SDimitry Andric Builder.defineMacro("__ASSEMBLER__"); 5960eae32dcSDimitry Andric if (LangOpts.CUDA) { 5970eae32dcSDimitry Andric if (LangOpts.GPURelocatableDeviceCode) 5980eae32dcSDimitry Andric Builder.defineMacro("__CLANG_RDC__"); 5990eae32dcSDimitry Andric if (!LangOpts.HIP) 6000b57cec5SDimitry Andric Builder.defineMacro("__CUDA__"); 60106c3fb27SDimitry Andric if (LangOpts.GPUDefaultStream == 60206c3fb27SDimitry Andric LangOptions::GPUDefaultStreamKind::PerThread) 60306c3fb27SDimitry Andric Builder.defineMacro("CUDA_API_PER_THREAD_DEFAULT_STREAM"); 6040eae32dcSDimitry Andric } 6050b57cec5SDimitry Andric if (LangOpts.HIP) { 6060b57cec5SDimitry Andric Builder.defineMacro("__HIP__"); 6070b57cec5SDimitry Andric Builder.defineMacro("__HIPCC__"); 6084824e7fdSDimitry Andric Builder.defineMacro("__HIP_MEMORY_SCOPE_SINGLETHREAD", "1"); 6094824e7fdSDimitry Andric Builder.defineMacro("__HIP_MEMORY_SCOPE_WAVEFRONT", "2"); 6104824e7fdSDimitry Andric Builder.defineMacro("__HIP_MEMORY_SCOPE_WORKGROUP", "3"); 6114824e7fdSDimitry Andric Builder.defineMacro("__HIP_MEMORY_SCOPE_AGENT", "4"); 6124824e7fdSDimitry Andric Builder.defineMacro("__HIP_MEMORY_SCOPE_SYSTEM", "5"); 6135f757f3fSDimitry Andric if (LangOpts.HIPStdPar) { 6145f757f3fSDimitry Andric Builder.defineMacro("__HIPSTDPAR__"); 6155f757f3fSDimitry Andric if (LangOpts.HIPStdParInterposeAlloc) 6165f757f3fSDimitry Andric Builder.defineMacro("__HIPSTDPAR_INTERPOSE_ALLOC__"); 6175f757f3fSDimitry Andric } 61806c3fb27SDimitry Andric if (LangOpts.CUDAIsDevice) { 6190b57cec5SDimitry Andric Builder.defineMacro("__HIP_DEVICE_COMPILE__"); 62006c3fb27SDimitry Andric if (!TI.hasHIPImageSupport()) { 62106c3fb27SDimitry Andric Builder.defineMacro("__HIP_NO_IMAGE_SUPPORT__", "1"); 62206c3fb27SDimitry Andric // Deprecated. 62306c3fb27SDimitry Andric Builder.defineMacro("__HIP_NO_IMAGE_SUPPORT", "1"); 62406c3fb27SDimitry Andric } 62506c3fb27SDimitry Andric } 62681ad6265SDimitry Andric if (LangOpts.GPUDefaultStream == 62706c3fb27SDimitry Andric LangOptions::GPUDefaultStreamKind::PerThread) { 62806c3fb27SDimitry Andric Builder.defineMacro("__HIP_API_PER_THREAD_DEFAULT_STREAM__"); 62906c3fb27SDimitry Andric // Deprecated. 63081ad6265SDimitry Andric Builder.defineMacro("HIP_API_PER_THREAD_DEFAULT_STREAM"); 6310b57cec5SDimitry Andric } 6320b57cec5SDimitry Andric } 6335f757f3fSDimitry Andric 6345f757f3fSDimitry Andric if (LangOpts.OpenACC) { 6355f757f3fSDimitry Andric // FIXME: When we have full support for OpenACC, we should set this to the 6365f757f3fSDimitry Andric // version we support. Until then, set as '1' by default, but provide a 6375f757f3fSDimitry Andric // temporary mechanism for users to override this so real-world examples can 6385f757f3fSDimitry Andric // be tested against. 6395f757f3fSDimitry Andric if (!LangOpts.OpenACCMacroOverride.empty()) 6405f757f3fSDimitry Andric Builder.defineMacro("_OPENACC", LangOpts.OpenACCMacroOverride); 6415f757f3fSDimitry Andric else 6425f757f3fSDimitry Andric Builder.defineMacro("_OPENACC", "1"); 6435f757f3fSDimitry Andric } 64406c3fb27SDimitry Andric } 6450b57cec5SDimitry Andric 6460b57cec5SDimitry Andric /// Initialize the predefined C++ language feature test macros defined in 6470b57cec5SDimitry Andric /// ISO/IEC JTC1/SC22/WG21 (C++) SD-6: "SG10 Feature Test Recommendations". 6480b57cec5SDimitry Andric static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts, 6490b57cec5SDimitry Andric MacroBuilder &Builder) { 6500b57cec5SDimitry Andric // C++98 features. 6510b57cec5SDimitry Andric if (LangOpts.RTTI) 6520b57cec5SDimitry Andric Builder.defineMacro("__cpp_rtti", "199711L"); 6530b57cec5SDimitry Andric if (LangOpts.CXXExceptions) 6540b57cec5SDimitry Andric Builder.defineMacro("__cpp_exceptions", "199711L"); 6550b57cec5SDimitry Andric 6560b57cec5SDimitry Andric // C++11 features. 6570b57cec5SDimitry Andric if (LangOpts.CPlusPlus11) { 6580b57cec5SDimitry Andric Builder.defineMacro("__cpp_unicode_characters", "200704L"); 6590b57cec5SDimitry Andric Builder.defineMacro("__cpp_raw_strings", "200710L"); 6600b57cec5SDimitry Andric Builder.defineMacro("__cpp_unicode_literals", "200710L"); 6610b57cec5SDimitry Andric Builder.defineMacro("__cpp_user_defined_literals", "200809L"); 6620b57cec5SDimitry Andric Builder.defineMacro("__cpp_lambdas", "200907L"); 66306c3fb27SDimitry Andric Builder.defineMacro("__cpp_constexpr", LangOpts.CPlusPlus26 ? "202306L" 66406c3fb27SDimitry Andric : LangOpts.CPlusPlus23 ? "202211L" 66581ad6265SDimitry Andric : LangOpts.CPlusPlus20 ? "201907L" 66681ad6265SDimitry Andric : LangOpts.CPlusPlus17 ? "201603L" 66781ad6265SDimitry Andric : LangOpts.CPlusPlus14 ? "201304L" 66881ad6265SDimitry Andric : "200704"); 669480093f4SDimitry Andric Builder.defineMacro("__cpp_constexpr_in_decltype", "201711L"); 6700b57cec5SDimitry Andric Builder.defineMacro("__cpp_range_based_for", 6710fca6ea1SDimitry Andric LangOpts.CPlusPlus23 ? "202211L" 6720fca6ea1SDimitry Andric : LangOpts.CPlusPlus17 ? "201603L" 6730fca6ea1SDimitry Andric : "200907"); 67406c3fb27SDimitry Andric Builder.defineMacro("__cpp_static_assert", LangOpts.CPlusPlus26 ? "202306L" 67506c3fb27SDimitry Andric : LangOpts.CPlusPlus17 67606c3fb27SDimitry Andric ? "201411L" 67706c3fb27SDimitry Andric : "200410"); 6780b57cec5SDimitry Andric Builder.defineMacro("__cpp_decltype", "200707L"); 6790b57cec5SDimitry Andric Builder.defineMacro("__cpp_attributes", "200809L"); 6800b57cec5SDimitry Andric Builder.defineMacro("__cpp_rvalue_references", "200610L"); 6810b57cec5SDimitry Andric Builder.defineMacro("__cpp_variadic_templates", "200704L"); 6820b57cec5SDimitry Andric Builder.defineMacro("__cpp_initializer_lists", "200806L"); 6830b57cec5SDimitry Andric Builder.defineMacro("__cpp_delegating_constructors", "200604L"); 6840b57cec5SDimitry Andric Builder.defineMacro("__cpp_nsdmi", "200809L"); 6850b57cec5SDimitry Andric Builder.defineMacro("__cpp_inheriting_constructors", "201511L"); 6860b57cec5SDimitry Andric Builder.defineMacro("__cpp_ref_qualifiers", "200710L"); 6870b57cec5SDimitry Andric Builder.defineMacro("__cpp_alias_templates", "200704L"); 6880b57cec5SDimitry Andric } 6890b57cec5SDimitry Andric if (LangOpts.ThreadsafeStatics) 6900b57cec5SDimitry Andric Builder.defineMacro("__cpp_threadsafe_static_init", "200806L"); 6910b57cec5SDimitry Andric 6920b57cec5SDimitry Andric // C++14 features. 6930b57cec5SDimitry Andric if (LangOpts.CPlusPlus14) { 6940b57cec5SDimitry Andric Builder.defineMacro("__cpp_binary_literals", "201304L"); 6950b57cec5SDimitry Andric Builder.defineMacro("__cpp_digit_separators", "201309L"); 696480093f4SDimitry Andric Builder.defineMacro("__cpp_init_captures", 6975ffd83dbSDimitry Andric LangOpts.CPlusPlus20 ? "201803L" : "201304L"); 698480093f4SDimitry Andric Builder.defineMacro("__cpp_generic_lambdas", 6995ffd83dbSDimitry Andric LangOpts.CPlusPlus20 ? "201707L" : "201304L"); 7000b57cec5SDimitry Andric Builder.defineMacro("__cpp_decltype_auto", "201304L"); 7010b57cec5SDimitry Andric Builder.defineMacro("__cpp_return_type_deduction", "201304L"); 7020b57cec5SDimitry Andric Builder.defineMacro("__cpp_aggregate_nsdmi", "201304L"); 7030b57cec5SDimitry Andric Builder.defineMacro("__cpp_variable_templates", "201304L"); 7040b57cec5SDimitry Andric } 7050b57cec5SDimitry Andric if (LangOpts.SizedDeallocation) 7060b57cec5SDimitry Andric Builder.defineMacro("__cpp_sized_deallocation", "201309L"); 7070b57cec5SDimitry Andric 7080b57cec5SDimitry Andric // C++17 features. 7090b57cec5SDimitry Andric if (LangOpts.CPlusPlus17) { 7100b57cec5SDimitry Andric Builder.defineMacro("__cpp_hex_float", "201603L"); 7110b57cec5SDimitry Andric Builder.defineMacro("__cpp_inline_variables", "201606L"); 7120b57cec5SDimitry Andric Builder.defineMacro("__cpp_noexcept_function_type", "201510L"); 7130b57cec5SDimitry Andric Builder.defineMacro("__cpp_capture_star_this", "201603L"); 7140b57cec5SDimitry Andric Builder.defineMacro("__cpp_if_constexpr", "201606L"); 715480093f4SDimitry Andric Builder.defineMacro("__cpp_deduction_guides", "201703L"); // (not latest) 7160b57cec5SDimitry Andric Builder.defineMacro("__cpp_template_auto", "201606L"); // (old name) 7170b57cec5SDimitry Andric Builder.defineMacro("__cpp_namespace_attributes", "201411L"); 7180b57cec5SDimitry Andric Builder.defineMacro("__cpp_enumerator_attributes", "201411L"); 7190b57cec5SDimitry Andric Builder.defineMacro("__cpp_nested_namespace_definitions", "201411L"); 7200b57cec5SDimitry Andric Builder.defineMacro("__cpp_variadic_using", "201611L"); 7210b57cec5SDimitry Andric Builder.defineMacro("__cpp_aggregate_bases", "201603L"); 7220fca6ea1SDimitry Andric Builder.defineMacro("__cpp_structured_bindings", "202403L"); 723480093f4SDimitry Andric Builder.defineMacro("__cpp_nontype_template_args", 724d409305fSDimitry Andric "201411L"); // (not latest) 7250b57cec5SDimitry Andric Builder.defineMacro("__cpp_fold_expressions", "201603L"); 7260b57cec5SDimitry Andric Builder.defineMacro("__cpp_guaranteed_copy_elision", "201606L"); 7270b57cec5SDimitry Andric Builder.defineMacro("__cpp_nontype_template_parameter_auto", "201606L"); 7280b57cec5SDimitry Andric } 7290b57cec5SDimitry Andric if (LangOpts.AlignedAllocation && !LangOpts.AlignedAllocationUnavailable) 7300b57cec5SDimitry Andric Builder.defineMacro("__cpp_aligned_new", "201606L"); 7310b57cec5SDimitry Andric if (LangOpts.RelaxedTemplateTemplateArgs) 7320b57cec5SDimitry Andric Builder.defineMacro("__cpp_template_template_args", "201611L"); 7330b57cec5SDimitry Andric 7340b57cec5SDimitry Andric // C++20 features. 7355ffd83dbSDimitry Andric if (LangOpts.CPlusPlus20) { 736bdd1243dSDimitry Andric Builder.defineMacro("__cpp_aggregate_paren_init", "201902L"); 737bdd1243dSDimitry Andric 7380fca6ea1SDimitry Andric Builder.defineMacro("__cpp_concepts", "202002"); 7390b57cec5SDimitry Andric Builder.defineMacro("__cpp_conditional_explicit", "201806L"); 74006c3fb27SDimitry Andric Builder.defineMacro("__cpp_consteval", "202211L"); 741a7dea167SDimitry Andric Builder.defineMacro("__cpp_constexpr_dynamic_alloc", "201907L"); 742a7dea167SDimitry Andric Builder.defineMacro("__cpp_constinit", "201907L"); 743349cc55cSDimitry Andric Builder.defineMacro("__cpp_impl_coroutine", "201902L"); 744480093f4SDimitry Andric Builder.defineMacro("__cpp_designated_initializers", "201707L"); 745480093f4SDimitry Andric Builder.defineMacro("__cpp_impl_three_way_comparison", "201907L"); 746480093f4SDimitry Andric //Builder.defineMacro("__cpp_modules", "201907L"); 747fe6060f1SDimitry Andric Builder.defineMacro("__cpp_using_enum", "201907L"); 748fe6060f1SDimitry Andric } 74906c3fb27SDimitry Andric // C++23 features. 75006c3fb27SDimitry Andric if (LangOpts.CPlusPlus23) { 7510fca6ea1SDimitry Andric Builder.defineMacro("__cpp_implicit_move", "202207L"); 752fe6060f1SDimitry Andric Builder.defineMacro("__cpp_size_t_suffix", "202011L"); 753349cc55cSDimitry Andric Builder.defineMacro("__cpp_if_consteval", "202106L"); 754bdd1243dSDimitry Andric Builder.defineMacro("__cpp_multidimensional_subscript", "202211L"); 7557a6dacacSDimitry Andric Builder.defineMacro("__cpp_auto_cast", "202110L"); 756a7dea167SDimitry Andric } 757bdd1243dSDimitry Andric 75806c3fb27SDimitry Andric // We provide those C++23 features as extensions in earlier language modes, so 759bdd1243dSDimitry Andric // we also define their feature test macros. 760bdd1243dSDimitry Andric if (LangOpts.CPlusPlus11) 761bdd1243dSDimitry Andric Builder.defineMacro("__cpp_static_call_operator", "202207L"); 762bdd1243dSDimitry Andric Builder.defineMacro("__cpp_named_character_escapes", "202207L"); 7635f757f3fSDimitry Andric Builder.defineMacro("__cpp_placeholder_variables", "202306L"); 764bdd1243dSDimitry Andric 7650fca6ea1SDimitry Andric // C++26 features supported in earlier language modes. 766*62987288SDimitry Andric Builder.defineMacro("__cpp_pack_indexing", "202311L"); 7670fca6ea1SDimitry Andric Builder.defineMacro("__cpp_deleted_function", "202403L"); 7680fca6ea1SDimitry Andric 7690b57cec5SDimitry Andric if (LangOpts.Char8) 770bdd1243dSDimitry Andric Builder.defineMacro("__cpp_char8_t", "202207L"); 7710b57cec5SDimitry Andric Builder.defineMacro("__cpp_impl_destroying_delete", "201806L"); 7720b57cec5SDimitry Andric } 7730b57cec5SDimitry Andric 774fe6060f1SDimitry Andric /// InitializeOpenCLFeatureTestMacros - Define OpenCL macros based on target 775fe6060f1SDimitry Andric /// settings and language version 776fe6060f1SDimitry Andric void InitializeOpenCLFeatureTestMacros(const TargetInfo &TI, 777fe6060f1SDimitry Andric const LangOptions &Opts, 778fe6060f1SDimitry Andric MacroBuilder &Builder) { 779fe6060f1SDimitry Andric const llvm::StringMap<bool> &OpenCLFeaturesMap = TI.getSupportedOpenCLOpts(); 780fe6060f1SDimitry Andric // FIXME: OpenCL options which affect language semantics/syntax 781fe6060f1SDimitry Andric // should be moved into LangOptions. 782fe6060f1SDimitry Andric auto defineOpenCLExtMacro = [&](llvm::StringRef Name, auto... OptArgs) { 783fe6060f1SDimitry Andric // Check if extension is supported by target and is available in this 784fe6060f1SDimitry Andric // OpenCL version 785fe6060f1SDimitry Andric if (TI.hasFeatureEnabled(OpenCLFeaturesMap, Name) && 786fe6060f1SDimitry Andric OpenCLOptions::isOpenCLOptionAvailableIn(Opts, OptArgs...)) 787fe6060f1SDimitry Andric Builder.defineMacro(Name); 788fe6060f1SDimitry Andric }; 789fe6060f1SDimitry Andric #define OPENCL_GENERIC_EXTENSION(Ext, ...) \ 790fe6060f1SDimitry Andric defineOpenCLExtMacro(#Ext, __VA_ARGS__); 791fe6060f1SDimitry Andric #include "clang/Basic/OpenCLExtensions.def" 792fe6060f1SDimitry Andric 793fe6060f1SDimitry Andric // Assume compiling for FULL profile 794fe6060f1SDimitry Andric Builder.defineMacro("__opencl_c_int64"); 795fe6060f1SDimitry Andric } 796fe6060f1SDimitry Andric 7970fca6ea1SDimitry Andric llvm::SmallString<32> ConstructFixedPointLiteral(llvm::APFixedPoint Val, 7980fca6ea1SDimitry Andric llvm::StringRef Suffix) { 7990fca6ea1SDimitry Andric if (Val.isSigned() && Val == llvm::APFixedPoint::getMin(Val.getSemantics())) { 8000fca6ea1SDimitry Andric // When representing the min value of a signed fixed point type in source 8010fca6ea1SDimitry Andric // code, we cannot simply write `-<lowest value>`. For example, the min 8020fca6ea1SDimitry Andric // value of a `short _Fract` cannot be written as `-1.0hr`. This is because 8030fca6ea1SDimitry Andric // the parser will read this (and really any negative numerical literal) as 8040fca6ea1SDimitry Andric // a UnaryOperator that owns a FixedPointLiteral with a positive value 8050fca6ea1SDimitry Andric // rather than just a FixedPointLiteral with a negative value. Compiling 8060fca6ea1SDimitry Andric // `-1.0hr` results in an overflow to the maximal value of that fixed point 8070fca6ea1SDimitry Andric // type. The correct way to represent a signed min value is to instead split 8080fca6ea1SDimitry Andric // it into two halves, like `(-0.5hr-0.5hr)` which is what the standard 8090fca6ea1SDimitry Andric // defines SFRACT_MIN as. 8100fca6ea1SDimitry Andric llvm::SmallString<32> Literal; 8110fca6ea1SDimitry Andric Literal.push_back('('); 8120fca6ea1SDimitry Andric llvm::SmallString<32> HalfStr = 8130fca6ea1SDimitry Andric ConstructFixedPointLiteral(Val.shr(1), Suffix); 8140fca6ea1SDimitry Andric Literal += HalfStr; 8150fca6ea1SDimitry Andric Literal += HalfStr; 8160fca6ea1SDimitry Andric Literal.push_back(')'); 8170fca6ea1SDimitry Andric return Literal; 8180fca6ea1SDimitry Andric } 8190fca6ea1SDimitry Andric 8200fca6ea1SDimitry Andric llvm::SmallString<32> Str(Val.toString()); 8210fca6ea1SDimitry Andric Str += Suffix; 8220fca6ea1SDimitry Andric return Str; 8230fca6ea1SDimitry Andric } 8240fca6ea1SDimitry Andric 8250fca6ea1SDimitry Andric void DefineFixedPointMacros(const TargetInfo &TI, MacroBuilder &Builder, 8260fca6ea1SDimitry Andric llvm::StringRef TypeName, llvm::StringRef Suffix, 8270fca6ea1SDimitry Andric unsigned Width, unsigned Scale, bool Signed) { 8280fca6ea1SDimitry Andric // Saturation doesn't affect the size or scale of a fixed point type, so we 8290fca6ea1SDimitry Andric // don't need it here. 8300fca6ea1SDimitry Andric llvm::FixedPointSemantics FXSema( 8310fca6ea1SDimitry Andric Width, Scale, Signed, /*IsSaturated=*/false, 8320fca6ea1SDimitry Andric !Signed && TI.doUnsignedFixedPointTypesHavePadding()); 8330fca6ea1SDimitry Andric llvm::SmallString<32> MacroPrefix("__"); 8340fca6ea1SDimitry Andric MacroPrefix += TypeName; 8350fca6ea1SDimitry Andric Builder.defineMacro(MacroPrefix + "_EPSILON__", 8360fca6ea1SDimitry Andric ConstructFixedPointLiteral( 8370fca6ea1SDimitry Andric llvm::APFixedPoint::getEpsilon(FXSema), Suffix)); 8380fca6ea1SDimitry Andric Builder.defineMacro(MacroPrefix + "_FBIT__", Twine(Scale)); 8390fca6ea1SDimitry Andric Builder.defineMacro( 8400fca6ea1SDimitry Andric MacroPrefix + "_MAX__", 8410fca6ea1SDimitry Andric ConstructFixedPointLiteral(llvm::APFixedPoint::getMax(FXSema), Suffix)); 8420fca6ea1SDimitry Andric 8430fca6ea1SDimitry Andric // ISO/IEC TR 18037:2008 doesn't specify MIN macros for unsigned types since 8440fca6ea1SDimitry Andric // they're all just zero. 8450fca6ea1SDimitry Andric if (Signed) 8460fca6ea1SDimitry Andric Builder.defineMacro( 8470fca6ea1SDimitry Andric MacroPrefix + "_MIN__", 8480fca6ea1SDimitry Andric ConstructFixedPointLiteral(llvm::APFixedPoint::getMin(FXSema), Suffix)); 8490fca6ea1SDimitry Andric } 8500fca6ea1SDimitry Andric 8510b57cec5SDimitry Andric static void InitializePredefinedMacros(const TargetInfo &TI, 8520b57cec5SDimitry Andric const LangOptions &LangOpts, 8530b57cec5SDimitry Andric const FrontendOptions &FEOpts, 854a7dea167SDimitry Andric const PreprocessorOptions &PPOpts, 8550b57cec5SDimitry Andric MacroBuilder &Builder) { 8560b57cec5SDimitry Andric // Compiler version introspection macros. 8570b57cec5SDimitry Andric Builder.defineMacro("__llvm__"); // LLVM Backend 8580b57cec5SDimitry Andric Builder.defineMacro("__clang__"); // Clang Frontend 8590b57cec5SDimitry Andric #define TOSTR2(X) #X 8600b57cec5SDimitry Andric #define TOSTR(X) TOSTR2(X) 8610b57cec5SDimitry Andric Builder.defineMacro("__clang_major__", TOSTR(CLANG_VERSION_MAJOR)); 8620b57cec5SDimitry Andric Builder.defineMacro("__clang_minor__", TOSTR(CLANG_VERSION_MINOR)); 8630b57cec5SDimitry Andric Builder.defineMacro("__clang_patchlevel__", TOSTR(CLANG_VERSION_PATCHLEVEL)); 8640b57cec5SDimitry Andric #undef TOSTR 8650b57cec5SDimitry Andric #undef TOSTR2 8660b57cec5SDimitry Andric Builder.defineMacro("__clang_version__", 8670b57cec5SDimitry Andric "\"" CLANG_VERSION_STRING " " 8680b57cec5SDimitry Andric + getClangFullRepositoryVersion() + "\""); 869a7dea167SDimitry Andric 870a7dea167SDimitry Andric if (LangOpts.GNUCVersion != 0) { 871a7dea167SDimitry Andric // Major, minor, patch, are given two decimal places each, so 4.2.1 becomes 872a7dea167SDimitry Andric // 40201. 873a7dea167SDimitry Andric unsigned GNUCMajor = LangOpts.GNUCVersion / 100 / 100; 874a7dea167SDimitry Andric unsigned GNUCMinor = LangOpts.GNUCVersion / 100 % 100; 875a7dea167SDimitry Andric unsigned GNUCPatch = LangOpts.GNUCVersion % 100; 876a7dea167SDimitry Andric Builder.defineMacro("__GNUC__", Twine(GNUCMajor)); 877a7dea167SDimitry Andric Builder.defineMacro("__GNUC_MINOR__", Twine(GNUCMinor)); 878a7dea167SDimitry Andric Builder.defineMacro("__GNUC_PATCHLEVEL__", Twine(GNUCPatch)); 8790b57cec5SDimitry Andric Builder.defineMacro("__GXX_ABI_VERSION", "1002"); 880a7dea167SDimitry Andric 881a7dea167SDimitry Andric if (LangOpts.CPlusPlus) { 882a7dea167SDimitry Andric Builder.defineMacro("__GNUG__", Twine(GNUCMajor)); 883a7dea167SDimitry Andric Builder.defineMacro("__GXX_WEAK__"); 884a7dea167SDimitry Andric } 8850b57cec5SDimitry Andric } 8860b57cec5SDimitry Andric 8870b57cec5SDimitry Andric // Define macros for the C11 / C++11 memory orderings 8880b57cec5SDimitry Andric Builder.defineMacro("__ATOMIC_RELAXED", "0"); 8890b57cec5SDimitry Andric Builder.defineMacro("__ATOMIC_CONSUME", "1"); 8900b57cec5SDimitry Andric Builder.defineMacro("__ATOMIC_ACQUIRE", "2"); 8910b57cec5SDimitry Andric Builder.defineMacro("__ATOMIC_RELEASE", "3"); 8920b57cec5SDimitry Andric Builder.defineMacro("__ATOMIC_ACQ_REL", "4"); 8930b57cec5SDimitry Andric Builder.defineMacro("__ATOMIC_SEQ_CST", "5"); 8940b57cec5SDimitry Andric 8955f757f3fSDimitry Andric // Define macros for the clang atomic scopes. 8965f757f3fSDimitry Andric Builder.defineMacro("__MEMORY_SCOPE_SYSTEM", "0"); 8975f757f3fSDimitry Andric Builder.defineMacro("__MEMORY_SCOPE_DEVICE", "1"); 8985f757f3fSDimitry Andric Builder.defineMacro("__MEMORY_SCOPE_WRKGRP", "2"); 8995f757f3fSDimitry Andric Builder.defineMacro("__MEMORY_SCOPE_WVFRNT", "3"); 9005f757f3fSDimitry Andric Builder.defineMacro("__MEMORY_SCOPE_SINGLE", "4"); 9015f757f3fSDimitry Andric 9020b57cec5SDimitry Andric // Define macros for the OpenCL memory scope. 9030b57cec5SDimitry Andric // The values should match AtomicScopeOpenCLModel::ID enum. 9040b57cec5SDimitry Andric static_assert( 9050b57cec5SDimitry Andric static_cast<unsigned>(AtomicScopeOpenCLModel::WorkGroup) == 1 && 9060b57cec5SDimitry Andric static_cast<unsigned>(AtomicScopeOpenCLModel::Device) == 2 && 9070b57cec5SDimitry Andric static_cast<unsigned>(AtomicScopeOpenCLModel::AllSVMDevices) == 3 && 9080b57cec5SDimitry Andric static_cast<unsigned>(AtomicScopeOpenCLModel::SubGroup) == 4, 9090b57cec5SDimitry Andric "Invalid OpenCL memory scope enum definition"); 9100b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_MEMORY_SCOPE_WORK_ITEM", "0"); 9110b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_MEMORY_SCOPE_WORK_GROUP", "1"); 9120b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_MEMORY_SCOPE_DEVICE", "2"); 9130b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES", "3"); 9140b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_MEMORY_SCOPE_SUB_GROUP", "4"); 9150b57cec5SDimitry Andric 91606c3fb27SDimitry Andric // Define macros for floating-point data classes, used in __builtin_isfpclass. 91706c3fb27SDimitry Andric Builder.defineMacro("__FPCLASS_SNAN", "0x0001"); 91806c3fb27SDimitry Andric Builder.defineMacro("__FPCLASS_QNAN", "0x0002"); 91906c3fb27SDimitry Andric Builder.defineMacro("__FPCLASS_NEGINF", "0x0004"); 92006c3fb27SDimitry Andric Builder.defineMacro("__FPCLASS_NEGNORMAL", "0x0008"); 92106c3fb27SDimitry Andric Builder.defineMacro("__FPCLASS_NEGSUBNORMAL", "0x0010"); 92206c3fb27SDimitry Andric Builder.defineMacro("__FPCLASS_NEGZERO", "0x0020"); 92306c3fb27SDimitry Andric Builder.defineMacro("__FPCLASS_POSZERO", "0x0040"); 92406c3fb27SDimitry Andric Builder.defineMacro("__FPCLASS_POSSUBNORMAL", "0x0080"); 92506c3fb27SDimitry Andric Builder.defineMacro("__FPCLASS_POSNORMAL", "0x0100"); 92606c3fb27SDimitry Andric Builder.defineMacro("__FPCLASS_POSINF", "0x0200"); 92706c3fb27SDimitry Andric 9280b57cec5SDimitry Andric // Support for #pragma redefine_extname (Sun compatibility) 9290b57cec5SDimitry Andric Builder.defineMacro("__PRAGMA_REDEFINE_EXTNAME", "1"); 9300b57cec5SDimitry Andric 9310b57cec5SDimitry Andric // Previously this macro was set to a string aiming to achieve compatibility 9320b57cec5SDimitry Andric // with GCC 4.2.1. Now, just return the full Clang version 9330b57cec5SDimitry Andric Builder.defineMacro("__VERSION__", "\"" + 9340b57cec5SDimitry Andric Twine(getClangFullCPPVersion()) + "\""); 9350b57cec5SDimitry Andric 9360b57cec5SDimitry Andric // Initialize language-specific preprocessor defines. 9370b57cec5SDimitry Andric 9380b57cec5SDimitry Andric // Standard conforming mode? 9390b57cec5SDimitry Andric if (!LangOpts.GNUMode && !LangOpts.MSVCCompat) 9400b57cec5SDimitry Andric Builder.defineMacro("__STRICT_ANSI__"); 9410b57cec5SDimitry Andric 942a7dea167SDimitry Andric if (LangOpts.GNUCVersion && LangOpts.CPlusPlus11) 9430b57cec5SDimitry Andric Builder.defineMacro("__GXX_EXPERIMENTAL_CXX0X__"); 9440b57cec5SDimitry Andric 9450fca6ea1SDimitry Andric if (TI.getTriple().isWindowsGNUEnvironment()) { 9460fca6ea1SDimitry Andric // Set ABI defining macros for libstdc++ for MinGW, where the 9470fca6ea1SDimitry Andric // default in libstdc++ differs from the defaults for this target. 9480fca6ea1SDimitry Andric Builder.defineMacro("__GXX_TYPEINFO_EQUALITY_INLINE", "0"); 9490fca6ea1SDimitry Andric } 9500fca6ea1SDimitry Andric 9510b57cec5SDimitry Andric if (LangOpts.ObjC) { 9520b57cec5SDimitry Andric if (LangOpts.ObjCRuntime.isNonFragile()) { 9530b57cec5SDimitry Andric Builder.defineMacro("__OBJC2__"); 9540b57cec5SDimitry Andric 9550b57cec5SDimitry Andric if (LangOpts.ObjCExceptions) 9560b57cec5SDimitry Andric Builder.defineMacro("OBJC_ZEROCOST_EXCEPTIONS"); 9570b57cec5SDimitry Andric } 9580b57cec5SDimitry Andric 9590b57cec5SDimitry Andric if (LangOpts.getGC() != LangOptions::NonGC) 9600b57cec5SDimitry Andric Builder.defineMacro("__OBJC_GC__"); 9610b57cec5SDimitry Andric 9620b57cec5SDimitry Andric if (LangOpts.ObjCRuntime.isNeXTFamily()) 9630b57cec5SDimitry Andric Builder.defineMacro("__NEXT_RUNTIME__"); 9640b57cec5SDimitry Andric 9650b57cec5SDimitry Andric if (LangOpts.ObjCRuntime.getKind() == ObjCRuntime::GNUstep) { 9660b57cec5SDimitry Andric auto version = LangOpts.ObjCRuntime.getVersion(); 9670b57cec5SDimitry Andric std::string versionString = "1"; 9680b57cec5SDimitry Andric // Don't rely on the tuple argument, because we can be asked to target 9690b57cec5SDimitry Andric // later ABIs than we actually support, so clamp these values to those 9700b57cec5SDimitry Andric // currently supported 9710b57cec5SDimitry Andric if (version >= VersionTuple(2, 0)) 9720b57cec5SDimitry Andric Builder.defineMacro("__OBJC_GNUSTEP_RUNTIME_ABI__", "20"); 9730b57cec5SDimitry Andric else 97481ad6265SDimitry Andric Builder.defineMacro( 97581ad6265SDimitry Andric "__OBJC_GNUSTEP_RUNTIME_ABI__", 97681ad6265SDimitry Andric "1" + Twine(std::min(8U, version.getMinor().value_or(0)))); 9770b57cec5SDimitry Andric } 9780b57cec5SDimitry Andric 9790b57cec5SDimitry Andric if (LangOpts.ObjCRuntime.getKind() == ObjCRuntime::ObjFW) { 9800b57cec5SDimitry Andric VersionTuple tuple = LangOpts.ObjCRuntime.getVersion(); 981fcaf7f86SDimitry Andric unsigned minor = tuple.getMinor().value_or(0); 982fcaf7f86SDimitry Andric unsigned subminor = tuple.getSubminor().value_or(0); 9830b57cec5SDimitry Andric Builder.defineMacro("__OBJFW_RUNTIME_ABI__", 9840b57cec5SDimitry Andric Twine(tuple.getMajor() * 10000 + minor * 100 + 9850b57cec5SDimitry Andric subminor)); 9860b57cec5SDimitry Andric } 9870b57cec5SDimitry Andric 9880b57cec5SDimitry Andric Builder.defineMacro("IBOutlet", "__attribute__((iboutlet))"); 9890b57cec5SDimitry Andric Builder.defineMacro("IBOutletCollection(ClassName)", 9900b57cec5SDimitry Andric "__attribute__((iboutletcollection(ClassName)))"); 9910b57cec5SDimitry Andric Builder.defineMacro("IBAction", "void)__attribute__((ibaction)"); 9920b57cec5SDimitry Andric Builder.defineMacro("IBInspectable", ""); 9930b57cec5SDimitry Andric Builder.defineMacro("IB_DESIGNABLE", ""); 9940b57cec5SDimitry Andric } 9950b57cec5SDimitry Andric 9960b57cec5SDimitry Andric // Define a macro that describes the Objective-C boolean type even for C 9970b57cec5SDimitry Andric // and C++ since BOOL can be used from non Objective-C code. 9980b57cec5SDimitry Andric Builder.defineMacro("__OBJC_BOOL_IS_BOOL", 9990b57cec5SDimitry Andric Twine(TI.useSignedCharForObjCBool() ? "0" : "1")); 10000b57cec5SDimitry Andric 10010b57cec5SDimitry Andric if (LangOpts.CPlusPlus) 10020b57cec5SDimitry Andric InitializeCPlusPlusFeatureTestMacros(LangOpts, Builder); 10030b57cec5SDimitry Andric 10040b57cec5SDimitry Andric // darwin_constant_cfstrings controls this. This is also dependent 10050b57cec5SDimitry Andric // on other things like the runtime I believe. This is set even for C code. 10060b57cec5SDimitry Andric if (!LangOpts.NoConstantCFStrings) 10070b57cec5SDimitry Andric Builder.defineMacro("__CONSTANT_CFSTRINGS__"); 10080b57cec5SDimitry Andric 10090b57cec5SDimitry Andric if (LangOpts.ObjC) 10100b57cec5SDimitry Andric Builder.defineMacro("OBJC_NEW_PROPERTIES"); 10110b57cec5SDimitry Andric 10120b57cec5SDimitry Andric if (LangOpts.PascalStrings) 10130b57cec5SDimitry Andric Builder.defineMacro("__PASCAL_STRINGS__"); 10140b57cec5SDimitry Andric 10150b57cec5SDimitry Andric if (LangOpts.Blocks) { 10160b57cec5SDimitry Andric Builder.defineMacro("__block", "__attribute__((__blocks__(byref)))"); 10170b57cec5SDimitry Andric Builder.defineMacro("__BLOCKS__"); 10180b57cec5SDimitry Andric } 10190b57cec5SDimitry Andric 10200b57cec5SDimitry Andric if (!LangOpts.MSVCCompat && LangOpts.Exceptions) 10210b57cec5SDimitry Andric Builder.defineMacro("__EXCEPTIONS"); 1022a7dea167SDimitry Andric if (LangOpts.GNUCVersion && LangOpts.RTTI) 10230b57cec5SDimitry Andric Builder.defineMacro("__GXX_RTTI"); 10240b57cec5SDimitry Andric 1025e8d8bef9SDimitry Andric if (LangOpts.hasSjLjExceptions()) 10260b57cec5SDimitry Andric Builder.defineMacro("__USING_SJLJ_EXCEPTIONS__"); 1027e8d8bef9SDimitry Andric else if (LangOpts.hasSEHExceptions()) 10280b57cec5SDimitry Andric Builder.defineMacro("__SEH__"); 1029e8d8bef9SDimitry Andric else if (LangOpts.hasDWARFExceptions() && 10300b57cec5SDimitry Andric (TI.getTriple().isThumb() || TI.getTriple().isARM())) 10310b57cec5SDimitry Andric Builder.defineMacro("__ARM_DWARF_EH__"); 10320fca6ea1SDimitry Andric else if (LangOpts.hasWasmExceptions() && TI.getTriple().isWasm()) 10330fca6ea1SDimitry Andric Builder.defineMacro("__WASM_EXCEPTIONS__"); 10340b57cec5SDimitry Andric 10350b57cec5SDimitry Andric if (LangOpts.Deprecated) 10360b57cec5SDimitry Andric Builder.defineMacro("__DEPRECATED"); 10370b57cec5SDimitry Andric 1038a7dea167SDimitry Andric if (!LangOpts.MSVCCompat && LangOpts.CPlusPlus) 10390b57cec5SDimitry Andric Builder.defineMacro("__private_extern__", "extern"); 10400b57cec5SDimitry Andric 10410b57cec5SDimitry Andric if (LangOpts.MicrosoftExt) { 10420b57cec5SDimitry Andric if (LangOpts.WChar) { 10430b57cec5SDimitry Andric // wchar_t supported as a keyword. 10440b57cec5SDimitry Andric Builder.defineMacro("_WCHAR_T_DEFINED"); 10450b57cec5SDimitry Andric Builder.defineMacro("_NATIVE_WCHAR_T_DEFINED"); 10460b57cec5SDimitry Andric } 10470b57cec5SDimitry Andric } 10480b57cec5SDimitry Andric 1049fe6060f1SDimitry Andric // Macros to help identify the narrow and wide character sets 1050fe6060f1SDimitry Andric // FIXME: clang currently ignores -fexec-charset=. If this changes, 1051fe6060f1SDimitry Andric // then this may need to be updated. 1052fe6060f1SDimitry Andric Builder.defineMacro("__clang_literal_encoding__", "\"UTF-8\""); 1053fe6060f1SDimitry Andric if (TI.getTypeWidth(TI.getWCharType()) >= 32) { 1054fe6060f1SDimitry Andric // FIXME: 32-bit wchar_t signals UTF-32. This may change 1055fe6060f1SDimitry Andric // if -fwide-exec-charset= is ever supported. 1056fe6060f1SDimitry Andric Builder.defineMacro("__clang_wide_literal_encoding__", "\"UTF-32\""); 1057fe6060f1SDimitry Andric } else { 1058fe6060f1SDimitry Andric // FIXME: Less-than 32-bit wchar_t generally means UTF-16 1059fe6060f1SDimitry Andric // (e.g., Windows, 32-bit IBM). This may need to be 1060fe6060f1SDimitry Andric // updated if -fwide-exec-charset= is ever supported. 1061fe6060f1SDimitry Andric Builder.defineMacro("__clang_wide_literal_encoding__", "\"UTF-16\""); 1062fe6060f1SDimitry Andric } 1063fe6060f1SDimitry Andric 10640b57cec5SDimitry Andric if (LangOpts.Optimize) 10650b57cec5SDimitry Andric Builder.defineMacro("__OPTIMIZE__"); 10660b57cec5SDimitry Andric if (LangOpts.OptimizeSize) 10670b57cec5SDimitry Andric Builder.defineMacro("__OPTIMIZE_SIZE__"); 10680b57cec5SDimitry Andric 10690b57cec5SDimitry Andric if (LangOpts.FastMath) 10700b57cec5SDimitry Andric Builder.defineMacro("__FAST_MATH__"); 10710b57cec5SDimitry Andric 10720b57cec5SDimitry Andric // Initialize target-specific preprocessor defines. 10730b57cec5SDimitry Andric 10740b57cec5SDimitry Andric // __BYTE_ORDER__ was added in GCC 4.6. It's analogous 10750b57cec5SDimitry Andric // to the macro __BYTE_ORDER (no trailing underscores) 10760b57cec5SDimitry Andric // from glibc's <endian.h> header. 10770b57cec5SDimitry Andric // We don't support the PDP-11 as a target, but include 10780b57cec5SDimitry Andric // the define so it can still be compared against. 10790b57cec5SDimitry Andric Builder.defineMacro("__ORDER_LITTLE_ENDIAN__", "1234"); 10800b57cec5SDimitry Andric Builder.defineMacro("__ORDER_BIG_ENDIAN__", "4321"); 10810b57cec5SDimitry Andric Builder.defineMacro("__ORDER_PDP_ENDIAN__", "3412"); 10820b57cec5SDimitry Andric if (TI.isBigEndian()) { 10830b57cec5SDimitry Andric Builder.defineMacro("__BYTE_ORDER__", "__ORDER_BIG_ENDIAN__"); 10840b57cec5SDimitry Andric Builder.defineMacro("__BIG_ENDIAN__"); 10850b57cec5SDimitry Andric } else { 10860b57cec5SDimitry Andric Builder.defineMacro("__BYTE_ORDER__", "__ORDER_LITTLE_ENDIAN__"); 10870b57cec5SDimitry Andric Builder.defineMacro("__LITTLE_ENDIAN__"); 10880b57cec5SDimitry Andric } 10890b57cec5SDimitry Andric 1090bdd1243dSDimitry Andric if (TI.getPointerWidth(LangAS::Default) == 64 && TI.getLongWidth() == 64 && 1091bdd1243dSDimitry Andric TI.getIntWidth() == 32) { 10920b57cec5SDimitry Andric Builder.defineMacro("_LP64"); 10930b57cec5SDimitry Andric Builder.defineMacro("__LP64__"); 10940b57cec5SDimitry Andric } 10950b57cec5SDimitry Andric 1096bdd1243dSDimitry Andric if (TI.getPointerWidth(LangAS::Default) == 32 && TI.getLongWidth() == 32 && 1097bdd1243dSDimitry Andric TI.getIntWidth() == 32) { 10980b57cec5SDimitry Andric Builder.defineMacro("_ILP32"); 10990b57cec5SDimitry Andric Builder.defineMacro("__ILP32__"); 11000b57cec5SDimitry Andric } 11010b57cec5SDimitry Andric 11020b57cec5SDimitry Andric // Define type sizing macros based on the target properties. 11030b57cec5SDimitry Andric assert(TI.getCharWidth() == 8 && "Only support 8-bit char so far"); 11040b57cec5SDimitry Andric Builder.defineMacro("__CHAR_BIT__", Twine(TI.getCharWidth())); 11050b57cec5SDimitry Andric 110604eeddc0SDimitry Andric Builder.defineMacro("__BOOL_WIDTH__", Twine(TI.getBoolWidth())); 110704eeddc0SDimitry Andric Builder.defineMacro("__SHRT_WIDTH__", Twine(TI.getShortWidth())); 110804eeddc0SDimitry Andric Builder.defineMacro("__INT_WIDTH__", Twine(TI.getIntWidth())); 110904eeddc0SDimitry Andric Builder.defineMacro("__LONG_WIDTH__", Twine(TI.getLongWidth())); 111004eeddc0SDimitry Andric Builder.defineMacro("__LLONG_WIDTH__", Twine(TI.getLongLongWidth())); 111104eeddc0SDimitry Andric 11121fd87a68SDimitry Andric size_t BitIntMaxWidth = TI.getMaxBitIntWidth(); 11131fd87a68SDimitry Andric assert(BitIntMaxWidth <= llvm::IntegerType::MAX_INT_BITS && 11141fd87a68SDimitry Andric "Target defined a max bit width larger than LLVM can support!"); 11151fd87a68SDimitry Andric assert(BitIntMaxWidth >= TI.getLongLongWidth() && 11161fd87a68SDimitry Andric "Target defined a max bit width smaller than the C standard allows!"); 11171fd87a68SDimitry Andric Builder.defineMacro("__BITINT_MAXWIDTH__", Twine(BitIntMaxWidth)); 11181fd87a68SDimitry Andric 11190b57cec5SDimitry Andric DefineTypeSize("__SCHAR_MAX__", TargetInfo::SignedChar, TI, Builder); 11200b57cec5SDimitry Andric DefineTypeSize("__SHRT_MAX__", TargetInfo::SignedShort, TI, Builder); 11210b57cec5SDimitry Andric DefineTypeSize("__INT_MAX__", TargetInfo::SignedInt, TI, Builder); 11220b57cec5SDimitry Andric DefineTypeSize("__LONG_MAX__", TargetInfo::SignedLong, TI, Builder); 11230b57cec5SDimitry Andric DefineTypeSize("__LONG_LONG_MAX__", TargetInfo::SignedLongLong, TI, Builder); 112404eeddc0SDimitry Andric DefineTypeSizeAndWidth("__WCHAR", TI.getWCharType(), TI, Builder); 112504eeddc0SDimitry Andric DefineTypeSizeAndWidth("__WINT", TI.getWIntType(), TI, Builder); 112604eeddc0SDimitry Andric DefineTypeSizeAndWidth("__INTMAX", TI.getIntMaxType(), TI, Builder); 112704eeddc0SDimitry Andric DefineTypeSizeAndWidth("__SIZE", TI.getSizeType(), TI, Builder); 11280b57cec5SDimitry Andric 112904eeddc0SDimitry Andric DefineTypeSizeAndWidth("__UINTMAX", TI.getUIntMaxType(), TI, Builder); 1130bdd1243dSDimitry Andric DefineTypeSizeAndWidth("__PTRDIFF", TI.getPtrDiffType(LangAS::Default), TI, 1131bdd1243dSDimitry Andric Builder); 113204eeddc0SDimitry Andric DefineTypeSizeAndWidth("__INTPTR", TI.getIntPtrType(), TI, Builder); 113304eeddc0SDimitry Andric DefineTypeSizeAndWidth("__UINTPTR", TI.getUIntPtrType(), TI, Builder); 11340b57cec5SDimitry Andric 11350b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_DOUBLE__", TI.getDoubleWidth(), TI, Builder); 11360b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_FLOAT__", TI.getFloatWidth(), TI, Builder); 11370b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_INT__", TI.getIntWidth(), TI, Builder); 11380b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_LONG__", TI.getLongWidth(), TI, Builder); 11390b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_LONG_DOUBLE__",TI.getLongDoubleWidth(),TI,Builder); 11400b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_LONG_LONG__", TI.getLongLongWidth(), TI, Builder); 1141bdd1243dSDimitry Andric DefineTypeSizeof("__SIZEOF_POINTER__", TI.getPointerWidth(LangAS::Default), 1142bdd1243dSDimitry Andric TI, Builder); 11430b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_SHORT__", TI.getShortWidth(), TI, Builder); 11440b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_PTRDIFF_T__", 1145bdd1243dSDimitry Andric TI.getTypeWidth(TI.getPtrDiffType(LangAS::Default)), TI, 1146bdd1243dSDimitry Andric Builder); 11470b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_SIZE_T__", 11480b57cec5SDimitry Andric TI.getTypeWidth(TI.getSizeType()), TI, Builder); 11490b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_WCHAR_T__", 11500b57cec5SDimitry Andric TI.getTypeWidth(TI.getWCharType()), TI, Builder); 11510b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_WINT_T__", 11520b57cec5SDimitry Andric TI.getTypeWidth(TI.getWIntType()), TI, Builder); 11530b57cec5SDimitry Andric if (TI.hasInt128Type()) 11540b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_INT128__", 128, TI, Builder); 11550b57cec5SDimitry Andric 11560b57cec5SDimitry Andric DefineType("__INTMAX_TYPE__", TI.getIntMaxType(), Builder); 11570fca6ea1SDimitry Andric DefineFmt(LangOpts, "__INTMAX", TI.getIntMaxType(), TI, Builder); 11580b57cec5SDimitry Andric Builder.defineMacro("__INTMAX_C_SUFFIX__", 11590b57cec5SDimitry Andric TI.getTypeConstantSuffix(TI.getIntMaxType())); 11600b57cec5SDimitry Andric DefineType("__UINTMAX_TYPE__", TI.getUIntMaxType(), Builder); 11610fca6ea1SDimitry Andric DefineFmt(LangOpts, "__UINTMAX", TI.getUIntMaxType(), TI, Builder); 11620b57cec5SDimitry Andric Builder.defineMacro("__UINTMAX_C_SUFFIX__", 11630b57cec5SDimitry Andric TI.getTypeConstantSuffix(TI.getUIntMaxType())); 1164bdd1243dSDimitry Andric DefineType("__PTRDIFF_TYPE__", TI.getPtrDiffType(LangAS::Default), Builder); 11650fca6ea1SDimitry Andric DefineFmt(LangOpts, "__PTRDIFF", TI.getPtrDiffType(LangAS::Default), TI, 11660fca6ea1SDimitry Andric Builder); 11670b57cec5SDimitry Andric DefineType("__INTPTR_TYPE__", TI.getIntPtrType(), Builder); 11680fca6ea1SDimitry Andric DefineFmt(LangOpts, "__INTPTR", TI.getIntPtrType(), TI, Builder); 11690b57cec5SDimitry Andric DefineType("__SIZE_TYPE__", TI.getSizeType(), Builder); 11700fca6ea1SDimitry Andric DefineFmt(LangOpts, "__SIZE", TI.getSizeType(), TI, Builder); 11710b57cec5SDimitry Andric DefineType("__WCHAR_TYPE__", TI.getWCharType(), Builder); 11720b57cec5SDimitry Andric DefineType("__WINT_TYPE__", TI.getWIntType(), Builder); 117304eeddc0SDimitry Andric DefineTypeSizeAndWidth("__SIG_ATOMIC", TI.getSigAtomicType(), TI, Builder); 11740fca6ea1SDimitry Andric if (LangOpts.C23) 11750fca6ea1SDimitry Andric DefineType("__CHAR8_TYPE__", TI.UnsignedChar, Builder); 11760b57cec5SDimitry Andric DefineType("__CHAR16_TYPE__", TI.getChar16Type(), Builder); 11770b57cec5SDimitry Andric DefineType("__CHAR32_TYPE__", TI.getChar32Type(), Builder); 11780b57cec5SDimitry Andric 11790b57cec5SDimitry Andric DefineType("__UINTPTR_TYPE__", TI.getUIntPtrType(), Builder); 11800fca6ea1SDimitry Andric DefineFmt(LangOpts, "__UINTPTR", TI.getUIntPtrType(), TI, Builder); 118104eeddc0SDimitry Andric 118204eeddc0SDimitry Andric // The C standard requires the width of uintptr_t and intptr_t to be the same, 118304eeddc0SDimitry Andric // per 7.20.2.4p1. Same for intmax_t and uintmax_t, per 7.20.2.5p1. 118404eeddc0SDimitry Andric assert(TI.getTypeWidth(TI.getUIntPtrType()) == 118504eeddc0SDimitry Andric TI.getTypeWidth(TI.getIntPtrType()) && 118604eeddc0SDimitry Andric "uintptr_t and intptr_t have different widths?"); 118704eeddc0SDimitry Andric assert(TI.getTypeWidth(TI.getUIntMaxType()) == 118804eeddc0SDimitry Andric TI.getTypeWidth(TI.getIntMaxType()) && 118904eeddc0SDimitry Andric "uintmax_t and intmax_t have different widths?"); 11900b57cec5SDimitry Andric 11910fca6ea1SDimitry Andric if (LangOpts.FixedPoint) { 11920fca6ea1SDimitry Andric // Each unsigned type has the same width as their signed type. 11930fca6ea1SDimitry Andric DefineFixedPointMacros(TI, Builder, "SFRACT", "HR", TI.getShortFractWidth(), 11940fca6ea1SDimitry Andric TI.getShortFractScale(), /*Signed=*/true); 11950fca6ea1SDimitry Andric DefineFixedPointMacros(TI, Builder, "USFRACT", "UHR", 11960fca6ea1SDimitry Andric TI.getShortFractWidth(), 11970fca6ea1SDimitry Andric TI.getUnsignedShortFractScale(), /*Signed=*/false); 11980fca6ea1SDimitry Andric DefineFixedPointMacros(TI, Builder, "FRACT", "R", TI.getFractWidth(), 11990fca6ea1SDimitry Andric TI.getFractScale(), /*Signed=*/true); 12000fca6ea1SDimitry Andric DefineFixedPointMacros(TI, Builder, "UFRACT", "UR", TI.getFractWidth(), 12010fca6ea1SDimitry Andric TI.getUnsignedFractScale(), /*Signed=*/false); 12020fca6ea1SDimitry Andric DefineFixedPointMacros(TI, Builder, "LFRACT", "LR", TI.getLongFractWidth(), 12030fca6ea1SDimitry Andric TI.getLongFractScale(), /*Signed=*/true); 12040fca6ea1SDimitry Andric DefineFixedPointMacros(TI, Builder, "ULFRACT", "ULR", 12050fca6ea1SDimitry Andric TI.getLongFractWidth(), 12060fca6ea1SDimitry Andric TI.getUnsignedLongFractScale(), /*Signed=*/false); 12070fca6ea1SDimitry Andric DefineFixedPointMacros(TI, Builder, "SACCUM", "HK", TI.getShortAccumWidth(), 12080fca6ea1SDimitry Andric TI.getShortAccumScale(), /*Signed=*/true); 12090fca6ea1SDimitry Andric DefineFixedPointMacros(TI, Builder, "USACCUM", "UHK", 12100fca6ea1SDimitry Andric TI.getShortAccumWidth(), 12110fca6ea1SDimitry Andric TI.getUnsignedShortAccumScale(), /*Signed=*/false); 12120fca6ea1SDimitry Andric DefineFixedPointMacros(TI, Builder, "ACCUM", "K", TI.getAccumWidth(), 12130fca6ea1SDimitry Andric TI.getAccumScale(), /*Signed=*/true); 12140fca6ea1SDimitry Andric DefineFixedPointMacros(TI, Builder, "UACCUM", "UK", TI.getAccumWidth(), 12150fca6ea1SDimitry Andric TI.getUnsignedAccumScale(), /*Signed=*/false); 12160fca6ea1SDimitry Andric DefineFixedPointMacros(TI, Builder, "LACCUM", "LK", TI.getLongAccumWidth(), 12170fca6ea1SDimitry Andric TI.getLongAccumScale(), /*Signed=*/true); 12180fca6ea1SDimitry Andric DefineFixedPointMacros(TI, Builder, "ULACCUM", "ULK", 12190fca6ea1SDimitry Andric TI.getLongAccumWidth(), 12200fca6ea1SDimitry Andric TI.getUnsignedLongAccumScale(), /*Signed=*/false); 12210fca6ea1SDimitry Andric 12220fca6ea1SDimitry Andric Builder.defineMacro("__SACCUM_IBIT__", Twine(TI.getShortAccumIBits())); 12230fca6ea1SDimitry Andric Builder.defineMacro("__USACCUM_IBIT__", 12240fca6ea1SDimitry Andric Twine(TI.getUnsignedShortAccumIBits())); 12250fca6ea1SDimitry Andric Builder.defineMacro("__ACCUM_IBIT__", Twine(TI.getAccumIBits())); 12260fca6ea1SDimitry Andric Builder.defineMacro("__UACCUM_IBIT__", Twine(TI.getUnsignedAccumIBits())); 12270fca6ea1SDimitry Andric Builder.defineMacro("__LACCUM_IBIT__", Twine(TI.getLongAccumIBits())); 12280fca6ea1SDimitry Andric Builder.defineMacro("__ULACCUM_IBIT__", 12290fca6ea1SDimitry Andric Twine(TI.getUnsignedLongAccumIBits())); 12300fca6ea1SDimitry Andric } 12310fca6ea1SDimitry Andric 12320b57cec5SDimitry Andric if (TI.hasFloat16Type()) 12330b57cec5SDimitry Andric DefineFloatMacros(Builder, "FLT16", &TI.getHalfFormat(), "F16"); 12340b57cec5SDimitry Andric DefineFloatMacros(Builder, "FLT", &TI.getFloatFormat(), "F"); 12350b57cec5SDimitry Andric DefineFloatMacros(Builder, "DBL", &TI.getDoubleFormat(), ""); 12360b57cec5SDimitry Andric DefineFloatMacros(Builder, "LDBL", &TI.getLongDoubleFormat(), "L"); 12370b57cec5SDimitry Andric 12380b57cec5SDimitry Andric // Define a __POINTER_WIDTH__ macro for stdint.h. 12390b57cec5SDimitry Andric Builder.defineMacro("__POINTER_WIDTH__", 1240bdd1243dSDimitry Andric Twine((int)TI.getPointerWidth(LangAS::Default))); 12410b57cec5SDimitry Andric 12420b57cec5SDimitry Andric // Define __BIGGEST_ALIGNMENT__ to be compatible with gcc. 12430b57cec5SDimitry Andric Builder.defineMacro("__BIGGEST_ALIGNMENT__", 12440b57cec5SDimitry Andric Twine(TI.getSuitableAlign() / TI.getCharWidth()) ); 12450b57cec5SDimitry Andric 12460b57cec5SDimitry Andric if (!LangOpts.CharIsSigned) 12470b57cec5SDimitry Andric Builder.defineMacro("__CHAR_UNSIGNED__"); 12480b57cec5SDimitry Andric 12490b57cec5SDimitry Andric if (!TargetInfo::isTypeSigned(TI.getWCharType())) 12500b57cec5SDimitry Andric Builder.defineMacro("__WCHAR_UNSIGNED__"); 12510b57cec5SDimitry Andric 12520b57cec5SDimitry Andric if (!TargetInfo::isTypeSigned(TI.getWIntType())) 12530b57cec5SDimitry Andric Builder.defineMacro("__WINT_UNSIGNED__"); 12540b57cec5SDimitry Andric 12550b57cec5SDimitry Andric // Define exact-width integer types for stdint.h 12560fca6ea1SDimitry Andric DefineExactWidthIntType(LangOpts, TargetInfo::SignedChar, TI, Builder); 12570b57cec5SDimitry Andric 12580b57cec5SDimitry Andric if (TI.getShortWidth() > TI.getCharWidth()) 12590fca6ea1SDimitry Andric DefineExactWidthIntType(LangOpts, TargetInfo::SignedShort, TI, Builder); 12600b57cec5SDimitry Andric 12610b57cec5SDimitry Andric if (TI.getIntWidth() > TI.getShortWidth()) 12620fca6ea1SDimitry Andric DefineExactWidthIntType(LangOpts, TargetInfo::SignedInt, TI, Builder); 12630b57cec5SDimitry Andric 12640b57cec5SDimitry Andric if (TI.getLongWidth() > TI.getIntWidth()) 12650fca6ea1SDimitry Andric DefineExactWidthIntType(LangOpts, TargetInfo::SignedLong, TI, Builder); 12660b57cec5SDimitry Andric 12670b57cec5SDimitry Andric if (TI.getLongLongWidth() > TI.getLongWidth()) 12680fca6ea1SDimitry Andric DefineExactWidthIntType(LangOpts, TargetInfo::SignedLongLong, TI, Builder); 12690b57cec5SDimitry Andric 12700fca6ea1SDimitry Andric DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedChar, TI, Builder); 12710b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::UnsignedChar, TI, Builder); 12720b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::SignedChar, TI, Builder); 12730b57cec5SDimitry Andric 12740b57cec5SDimitry Andric if (TI.getShortWidth() > TI.getCharWidth()) { 12750fca6ea1SDimitry Andric DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedShort, TI, Builder); 12760b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::UnsignedShort, TI, Builder); 12770b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::SignedShort, TI, Builder); 12780b57cec5SDimitry Andric } 12790b57cec5SDimitry Andric 12800b57cec5SDimitry Andric if (TI.getIntWidth() > TI.getShortWidth()) { 12810fca6ea1SDimitry Andric DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedInt, TI, Builder); 12820b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::UnsignedInt, TI, Builder); 12830b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::SignedInt, TI, Builder); 12840b57cec5SDimitry Andric } 12850b57cec5SDimitry Andric 12860b57cec5SDimitry Andric if (TI.getLongWidth() > TI.getIntWidth()) { 12870fca6ea1SDimitry Andric DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedLong, TI, Builder); 12880b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::UnsignedLong, TI, Builder); 12890b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::SignedLong, TI, Builder); 12900b57cec5SDimitry Andric } 12910b57cec5SDimitry Andric 12920b57cec5SDimitry Andric if (TI.getLongLongWidth() > TI.getLongWidth()) { 12930fca6ea1SDimitry Andric DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedLongLong, TI, 12940fca6ea1SDimitry Andric Builder); 12950b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::UnsignedLongLong, TI, Builder); 12960b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::SignedLongLong, TI, Builder); 12970b57cec5SDimitry Andric } 12980b57cec5SDimitry Andric 12990fca6ea1SDimitry Andric DefineLeastWidthIntType(LangOpts, 8, true, TI, Builder); 13000fca6ea1SDimitry Andric DefineLeastWidthIntType(LangOpts, 8, false, TI, Builder); 13010fca6ea1SDimitry Andric DefineLeastWidthIntType(LangOpts, 16, true, TI, Builder); 13020fca6ea1SDimitry Andric DefineLeastWidthIntType(LangOpts, 16, false, TI, Builder); 13030fca6ea1SDimitry Andric DefineLeastWidthIntType(LangOpts, 32, true, TI, Builder); 13040fca6ea1SDimitry Andric DefineLeastWidthIntType(LangOpts, 32, false, TI, Builder); 13050fca6ea1SDimitry Andric DefineLeastWidthIntType(LangOpts, 64, true, TI, Builder); 13060fca6ea1SDimitry Andric DefineLeastWidthIntType(LangOpts, 64, false, TI, Builder); 13070b57cec5SDimitry Andric 13080fca6ea1SDimitry Andric DefineFastIntType(LangOpts, 8, true, TI, Builder); 13090fca6ea1SDimitry Andric DefineFastIntType(LangOpts, 8, false, TI, Builder); 13100fca6ea1SDimitry Andric DefineFastIntType(LangOpts, 16, true, TI, Builder); 13110fca6ea1SDimitry Andric DefineFastIntType(LangOpts, 16, false, TI, Builder); 13120fca6ea1SDimitry Andric DefineFastIntType(LangOpts, 32, true, TI, Builder); 13130fca6ea1SDimitry Andric DefineFastIntType(LangOpts, 32, false, TI, Builder); 13140fca6ea1SDimitry Andric DefineFastIntType(LangOpts, 64, true, TI, Builder); 13150fca6ea1SDimitry Andric DefineFastIntType(LangOpts, 64, false, TI, Builder); 13160b57cec5SDimitry Andric 1317fe6060f1SDimitry Andric Builder.defineMacro("__USER_LABEL_PREFIX__", TI.getUserLabelPrefix()); 13180b57cec5SDimitry Andric 131904eeddc0SDimitry Andric if (!LangOpts.MathErrno) 132004eeddc0SDimitry Andric Builder.defineMacro("__NO_MATH_ERRNO__"); 132104eeddc0SDimitry Andric 13220b57cec5SDimitry Andric if (LangOpts.FastMath || LangOpts.FiniteMathOnly) 13230b57cec5SDimitry Andric Builder.defineMacro("__FINITE_MATH_ONLY__", "1"); 13240b57cec5SDimitry Andric else 13250b57cec5SDimitry Andric Builder.defineMacro("__FINITE_MATH_ONLY__", "0"); 13260b57cec5SDimitry Andric 1327a7dea167SDimitry Andric if (LangOpts.GNUCVersion) { 13280b57cec5SDimitry Andric if (LangOpts.GNUInline || LangOpts.CPlusPlus) 13290b57cec5SDimitry Andric Builder.defineMacro("__GNUC_GNU_INLINE__"); 13300b57cec5SDimitry Andric else 13310b57cec5SDimitry Andric Builder.defineMacro("__GNUC_STDC_INLINE__"); 13320b57cec5SDimitry Andric 13330b57cec5SDimitry Andric // The value written by __atomic_test_and_set. 13340b57cec5SDimitry Andric // FIXME: This is target-dependent. 13350b57cec5SDimitry Andric Builder.defineMacro("__GCC_ATOMIC_TEST_AND_SET_TRUEVAL", "1"); 13360b57cec5SDimitry Andric } 13370b57cec5SDimitry Andric 13380fca6ea1SDimitry Andric // GCC defines these macros in both C and C++ modes despite them being needed 13390fca6ea1SDimitry Andric // mostly for STL implementations in C++. 13400fca6ea1SDimitry Andric auto [Destructive, Constructive] = TI.hardwareInterferenceSizes(); 13410fca6ea1SDimitry Andric Builder.defineMacro("__GCC_DESTRUCTIVE_SIZE", Twine(Destructive)); 13420fca6ea1SDimitry Andric Builder.defineMacro("__GCC_CONSTRUCTIVE_SIZE", Twine(Constructive)); 13430fca6ea1SDimitry Andric // We need to use push_macro to allow users to redefine these macros from the 13440fca6ea1SDimitry Andric // command line with -D and not issue a -Wmacro-redefined warning. 13450fca6ea1SDimitry Andric Builder.append("#pragma push_macro(\"__GCC_DESTRUCTIVE_SIZE\")"); 13460fca6ea1SDimitry Andric Builder.append("#pragma push_macro(\"__GCC_CONSTRUCTIVE_SIZE\")"); 13470fca6ea1SDimitry Andric 13480b57cec5SDimitry Andric auto addLockFreeMacros = [&](const llvm::Twine &Prefix) { 13490b57cec5SDimitry Andric // Used by libc++ and libstdc++ to implement ATOMIC_<foo>_LOCK_FREE. 13500b57cec5SDimitry Andric #define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \ 13510b57cec5SDimitry Andric Builder.defineMacro(Prefix + #TYPE "_LOCK_FREE", \ 1352bdd1243dSDimitry Andric getLockFreeValue(TI.get##Type##Width(), TI)); 13530b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(BOOL, Bool); 13540b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(CHAR, Char); 13550fca6ea1SDimitry Andric // char8_t has the same representation / width as unsigned 13560fca6ea1SDimitry Andric // char in C++ and is a typedef for unsigned char in C23 13570fca6ea1SDimitry Andric if (LangOpts.Char8 || LangOpts.C23) 13580fca6ea1SDimitry Andric DEFINE_LOCK_FREE_MACRO(CHAR8_T, Char); 13590b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(CHAR16_T, Char16); 13600b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(CHAR32_T, Char32); 13610b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(WCHAR_T, WChar); 13620b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(SHORT, Short); 13630b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(INT, Int); 13640b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(LONG, Long); 13650b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(LLONG, LongLong); 1366bdd1243dSDimitry Andric Builder.defineMacro( 1367bdd1243dSDimitry Andric Prefix + "POINTER_LOCK_FREE", 1368bdd1243dSDimitry Andric getLockFreeValue(TI.getPointerWidth(LangAS::Default), TI)); 13690b57cec5SDimitry Andric #undef DEFINE_LOCK_FREE_MACRO 13700b57cec5SDimitry Andric }; 13710b57cec5SDimitry Andric addLockFreeMacros("__CLANG_ATOMIC_"); 1372a7dea167SDimitry Andric if (LangOpts.GNUCVersion) 13730b57cec5SDimitry Andric addLockFreeMacros("__GCC_ATOMIC_"); 13740b57cec5SDimitry Andric 13750b57cec5SDimitry Andric if (LangOpts.NoInlineDefine) 13760b57cec5SDimitry Andric Builder.defineMacro("__NO_INLINE__"); 13770b57cec5SDimitry Andric 13780b57cec5SDimitry Andric if (unsigned PICLevel = LangOpts.PICLevel) { 13790b57cec5SDimitry Andric Builder.defineMacro("__PIC__", Twine(PICLevel)); 13800b57cec5SDimitry Andric Builder.defineMacro("__pic__", Twine(PICLevel)); 13810b57cec5SDimitry Andric if (LangOpts.PIE) { 13820b57cec5SDimitry Andric Builder.defineMacro("__PIE__", Twine(PICLevel)); 13830b57cec5SDimitry Andric Builder.defineMacro("__pie__", Twine(PICLevel)); 13840b57cec5SDimitry Andric } 13850b57cec5SDimitry Andric } 13860b57cec5SDimitry Andric 13870b57cec5SDimitry Andric // Macros to control C99 numerics and <float.h> 13880b57cec5SDimitry Andric Builder.defineMacro("__FLT_RADIX__", "2"); 13890b57cec5SDimitry Andric Builder.defineMacro("__DECIMAL_DIG__", "__LDBL_DECIMAL_DIG__"); 13900b57cec5SDimitry Andric 13910b57cec5SDimitry Andric if (LangOpts.getStackProtector() == LangOptions::SSPOn) 13920b57cec5SDimitry Andric Builder.defineMacro("__SSP__"); 13930b57cec5SDimitry Andric else if (LangOpts.getStackProtector() == LangOptions::SSPStrong) 13940b57cec5SDimitry Andric Builder.defineMacro("__SSP_STRONG__", "2"); 13950b57cec5SDimitry Andric else if (LangOpts.getStackProtector() == LangOptions::SSPReq) 13960b57cec5SDimitry Andric Builder.defineMacro("__SSP_ALL__", "3"); 13970b57cec5SDimitry Andric 1398a7dea167SDimitry Andric if (PPOpts.SetUpStaticAnalyzer) 13990b57cec5SDimitry Andric Builder.defineMacro("__clang_analyzer__"); 14000b57cec5SDimitry Andric 14010b57cec5SDimitry Andric if (LangOpts.FastRelaxedMath) 14020b57cec5SDimitry Andric Builder.defineMacro("__FAST_RELAXED_MATH__"); 14030b57cec5SDimitry Andric 14040b57cec5SDimitry Andric if (FEOpts.ProgramAction == frontend::RewriteObjC || 14050b57cec5SDimitry Andric LangOpts.getGC() != LangOptions::NonGC) { 14060b57cec5SDimitry Andric Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))"); 14070b57cec5SDimitry Andric Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))"); 14080b57cec5SDimitry Andric Builder.defineMacro("__autoreleasing", ""); 14090b57cec5SDimitry Andric Builder.defineMacro("__unsafe_unretained", ""); 14100b57cec5SDimitry Andric } else if (LangOpts.ObjC) { 14110b57cec5SDimitry Andric Builder.defineMacro("__weak", "__attribute__((objc_ownership(weak)))"); 14120b57cec5SDimitry Andric Builder.defineMacro("__strong", "__attribute__((objc_ownership(strong)))"); 14130b57cec5SDimitry Andric Builder.defineMacro("__autoreleasing", 14140b57cec5SDimitry Andric "__attribute__((objc_ownership(autoreleasing)))"); 14150b57cec5SDimitry Andric Builder.defineMacro("__unsafe_unretained", 14160b57cec5SDimitry Andric "__attribute__((objc_ownership(none)))"); 14170b57cec5SDimitry Andric } 14180b57cec5SDimitry Andric 14190b57cec5SDimitry Andric // On Darwin, there are __double_underscored variants of the type 14200b57cec5SDimitry Andric // nullability qualifiers. 14210b57cec5SDimitry Andric if (TI.getTriple().isOSDarwin()) { 14220b57cec5SDimitry Andric Builder.defineMacro("__nonnull", "_Nonnull"); 14230b57cec5SDimitry Andric Builder.defineMacro("__null_unspecified", "_Null_unspecified"); 14240b57cec5SDimitry Andric Builder.defineMacro("__nullable", "_Nullable"); 14250b57cec5SDimitry Andric } 14260b57cec5SDimitry Andric 14270b57cec5SDimitry Andric // Add a macro to differentiate between regular iOS/tvOS/watchOS targets and 14280b57cec5SDimitry Andric // the corresponding simulator targets. 14290b57cec5SDimitry Andric if (TI.getTriple().isOSDarwin() && TI.getTriple().isSimulatorEnvironment()) 14300b57cec5SDimitry Andric Builder.defineMacro("__APPLE_EMBEDDED_SIMULATOR__", "1"); 14310b57cec5SDimitry Andric 14320b57cec5SDimitry Andric // OpenMP definition 14330b57cec5SDimitry Andric // OpenMP 2.2: 14340b57cec5SDimitry Andric // In implementations that support a preprocessor, the _OPENMP 14350b57cec5SDimitry Andric // macro name is defined to have the decimal value yyyymm where 14360b57cec5SDimitry Andric // yyyy and mm are the year and the month designations of the 14370b57cec5SDimitry Andric // version of the OpenMP API that the implementation support. 14380b57cec5SDimitry Andric if (!LangOpts.OpenMPSimd) { 14390b57cec5SDimitry Andric switch (LangOpts.OpenMP) { 14400b57cec5SDimitry Andric case 0: 14410b57cec5SDimitry Andric break; 1442a7dea167SDimitry Andric case 31: 1443a7dea167SDimitry Andric Builder.defineMacro("_OPENMP", "201107"); 1444a7dea167SDimitry Andric break; 14450b57cec5SDimitry Andric case 40: 14460b57cec5SDimitry Andric Builder.defineMacro("_OPENMP", "201307"); 14470b57cec5SDimitry Andric break; 14485ffd83dbSDimitry Andric case 45: 14495ffd83dbSDimitry Andric Builder.defineMacro("_OPENMP", "201511"); 14500b57cec5SDimitry Andric break; 145106c3fb27SDimitry Andric case 50: 145206c3fb27SDimitry Andric Builder.defineMacro("_OPENMP", "201811"); 1453349cc55cSDimitry Andric break; 1454349cc55cSDimitry Andric case 52: 1455349cc55cSDimitry Andric Builder.defineMacro("_OPENMP", "202111"); 1456349cc55cSDimitry Andric break; 145706c3fb27SDimitry Andric default: // case 51: 145806c3fb27SDimitry Andric // Default version is OpenMP 5.1 145906c3fb27SDimitry Andric Builder.defineMacro("_OPENMP", "202011"); 14600b57cec5SDimitry Andric break; 14610b57cec5SDimitry Andric } 14620b57cec5SDimitry Andric } 14630b57cec5SDimitry Andric 14640b57cec5SDimitry Andric // CUDA device path compilaton 14650b57cec5SDimitry Andric if (LangOpts.CUDAIsDevice && !LangOpts.HIP) { 14660b57cec5SDimitry Andric // The CUDA_ARCH value is set for the GPU target specified in the NVPTX 14670b57cec5SDimitry Andric // backend's target defines. 14680b57cec5SDimitry Andric Builder.defineMacro("__CUDA_ARCH__"); 14690b57cec5SDimitry Andric } 14700b57cec5SDimitry Andric 14715f757f3fSDimitry Andric // We need to communicate this to our CUDA/HIP header wrapper, which in turn 14725f757f3fSDimitry Andric // informs the proper CUDA/HIP headers of this choice. 14735f757f3fSDimitry Andric if (LangOpts.GPUDeviceApproxTranscendentals) 14745f757f3fSDimitry Andric Builder.defineMacro("__CLANG_GPU_APPROX_TRANSCENDENTALS__"); 14750b57cec5SDimitry Andric 14760b57cec5SDimitry Andric // Define a macro indicating that the source file is being compiled with a 14770b57cec5SDimitry Andric // SYCL device compiler which doesn't produce host binary. 14780b57cec5SDimitry Andric if (LangOpts.SYCLIsDevice) { 14790b57cec5SDimitry Andric Builder.defineMacro("__SYCL_DEVICE_ONLY__", "1"); 14800b57cec5SDimitry Andric } 14810b57cec5SDimitry Andric 14820b57cec5SDimitry Andric // OpenCL definitions. 14830b57cec5SDimitry Andric if (LangOpts.OpenCL) { 1484fe6060f1SDimitry Andric InitializeOpenCLFeatureTestMacros(TI, LangOpts, Builder); 14850b57cec5SDimitry Andric 1486349cc55cSDimitry Andric if (TI.getTriple().isSPIR() || TI.getTriple().isSPIRV()) 14870b57cec5SDimitry Andric Builder.defineMacro("__IMAGE_SUPPORT__"); 14880b57cec5SDimitry Andric } 14890b57cec5SDimitry Andric 14900b57cec5SDimitry Andric if (TI.hasInt128Type() && LangOpts.CPlusPlus && LangOpts.GNUMode) { 14910b57cec5SDimitry Andric // For each extended integer type, g++ defines a macro mapping the 14920b57cec5SDimitry Andric // index of the type (0 in this case) in some list of extended types 14930b57cec5SDimitry Andric // to the type. 14940b57cec5SDimitry Andric Builder.defineMacro("__GLIBCXX_TYPE_INT_N_0", "__int128"); 14950b57cec5SDimitry Andric Builder.defineMacro("__GLIBCXX_BITSIZE_INT_N_0", "128"); 14960b57cec5SDimitry Andric } 14970b57cec5SDimitry Andric 149806c3fb27SDimitry Andric // ELF targets define __ELF__ 149906c3fb27SDimitry Andric if (TI.getTriple().isOSBinFormatELF()) 150006c3fb27SDimitry Andric Builder.defineMacro("__ELF__"); 150106c3fb27SDimitry Andric 15025f757f3fSDimitry Andric // Target OS macro definitions. 15035f757f3fSDimitry Andric if (PPOpts.DefineTargetOSMacros) { 15045f757f3fSDimitry Andric const llvm::Triple &Triple = TI.getTriple(); 15055f757f3fSDimitry Andric #define TARGET_OS(Name, Predicate) \ 15065f757f3fSDimitry Andric Builder.defineMacro(#Name, (Predicate) ? "1" : "0"); 15075f757f3fSDimitry Andric #include "clang/Basic/TargetOSMacros.def" 15085f757f3fSDimitry Andric #undef TARGET_OS 15095f757f3fSDimitry Andric } 15105f757f3fSDimitry Andric 15110b57cec5SDimitry Andric // Get other target #defines. 15120b57cec5SDimitry Andric TI.getTargetDefines(LangOpts, Builder); 15130b57cec5SDimitry Andric } 15140b57cec5SDimitry Andric 15157a6dacacSDimitry Andric static void InitializePGOProfileMacros(const CodeGenOptions &CodeGenOpts, 15167a6dacacSDimitry Andric MacroBuilder &Builder) { 15177a6dacacSDimitry Andric if (CodeGenOpts.hasProfileInstr()) 15187a6dacacSDimitry Andric Builder.defineMacro("__LLVM_INSTR_PROFILE_GENERATE"); 15197a6dacacSDimitry Andric 15207a6dacacSDimitry Andric if (CodeGenOpts.hasProfileIRUse() || CodeGenOpts.hasProfileClangUse()) 15217a6dacacSDimitry Andric Builder.defineMacro("__LLVM_INSTR_PROFILE_USE"); 15227a6dacacSDimitry Andric } 15237a6dacacSDimitry Andric 15240b57cec5SDimitry Andric /// InitializePreprocessor - Initialize the preprocessor getting it and the 1525bdd1243dSDimitry Andric /// environment ready to process a single file. 15267a6dacacSDimitry Andric void clang::InitializePreprocessor(Preprocessor &PP, 15277a6dacacSDimitry Andric const PreprocessorOptions &InitOpts, 15280b57cec5SDimitry Andric const PCHContainerReader &PCHContainerRdr, 15297a6dacacSDimitry Andric const FrontendOptions &FEOpts, 15307a6dacacSDimitry Andric const CodeGenOptions &CodeGenOpts) { 15310b57cec5SDimitry Andric const LangOptions &LangOpts = PP.getLangOpts(); 15320b57cec5SDimitry Andric std::string PredefineBuffer; 15330b57cec5SDimitry Andric PredefineBuffer.reserve(4080); 15340b57cec5SDimitry Andric llvm::raw_string_ostream Predefines(PredefineBuffer); 15350b57cec5SDimitry Andric MacroBuilder Builder(Predefines); 15360b57cec5SDimitry Andric 153706c3fb27SDimitry Andric // Emit line markers for various builtin sections of the file. The 3 here 153806c3fb27SDimitry Andric // marks <built-in> as being a system header, which suppresses warnings when 153906c3fb27SDimitry Andric // the same macro is defined multiple times. 15400b57cec5SDimitry Andric Builder.append("# 1 \"<built-in>\" 3"); 15410b57cec5SDimitry Andric 15420b57cec5SDimitry Andric // Install things like __POWERPC__, __GNUC__, etc into the macro table. 15430b57cec5SDimitry Andric if (InitOpts.UsePredefines) { 15440b57cec5SDimitry Andric // FIXME: This will create multiple definitions for most of the predefined 15450b57cec5SDimitry Andric // macros. This is not the right way to handle this. 154606c3fb27SDimitry Andric if ((LangOpts.CUDA || LangOpts.OpenMPIsTargetDevice || 154706c3fb27SDimitry Andric LangOpts.SYCLIsDevice) && 1548480093f4SDimitry Andric PP.getAuxTargetInfo()) 15490b57cec5SDimitry Andric InitializePredefinedMacros(*PP.getAuxTargetInfo(), LangOpts, FEOpts, 1550a7dea167SDimitry Andric PP.getPreprocessorOpts(), Builder); 15510b57cec5SDimitry Andric 1552a7dea167SDimitry Andric InitializePredefinedMacros(PP.getTargetInfo(), LangOpts, FEOpts, 1553a7dea167SDimitry Andric PP.getPreprocessorOpts(), Builder); 15540b57cec5SDimitry Andric 15550b57cec5SDimitry Andric // Install definitions to make Objective-C++ ARC work well with various 15560b57cec5SDimitry Andric // C++ Standard Library implementations. 15570b57cec5SDimitry Andric if (LangOpts.ObjC && LangOpts.CPlusPlus && 15580b57cec5SDimitry Andric (LangOpts.ObjCAutoRefCount || LangOpts.ObjCWeak)) { 15590b57cec5SDimitry Andric switch (InitOpts.ObjCXXARCStandardLibrary) { 15600b57cec5SDimitry Andric case ARCXX_nolib: 15610b57cec5SDimitry Andric case ARCXX_libcxx: 15620b57cec5SDimitry Andric break; 15630b57cec5SDimitry Andric 15640b57cec5SDimitry Andric case ARCXX_libstdcxx: 15650b57cec5SDimitry Andric AddObjCXXARCLibstdcxxDefines(LangOpts, Builder); 15660b57cec5SDimitry Andric break; 15670b57cec5SDimitry Andric } 15680b57cec5SDimitry Andric } 15690b57cec5SDimitry Andric } 15700b57cec5SDimitry Andric 15710b57cec5SDimitry Andric // Even with predefines off, some macros are still predefined. 15720b57cec5SDimitry Andric // These should all be defined in the preprocessor according to the 15730b57cec5SDimitry Andric // current language configuration. 15740b57cec5SDimitry Andric InitializeStandardPredefinedMacros(PP.getTargetInfo(), PP.getLangOpts(), 15750b57cec5SDimitry Andric FEOpts, Builder); 15760b57cec5SDimitry Andric 15777a6dacacSDimitry Andric // The PGO instrumentation profile macros are driven by options 15787a6dacacSDimitry Andric // -fprofile[-instr]-generate/-fcs-profile-generate/-fprofile[-instr]-use, 15797a6dacacSDimitry Andric // hence they are not guarded by InitOpts.UsePredefines. 15807a6dacacSDimitry Andric InitializePGOProfileMacros(CodeGenOpts, Builder); 15817a6dacacSDimitry Andric 15820b57cec5SDimitry Andric // Add on the predefines from the driver. Wrap in a #line directive to report 15830b57cec5SDimitry Andric // that they come from the command line. 15840b57cec5SDimitry Andric Builder.append("# 1 \"<command line>\" 1"); 15850b57cec5SDimitry Andric 15860b57cec5SDimitry Andric // Process #define's and #undef's in the order they are given. 15870b57cec5SDimitry Andric for (unsigned i = 0, e = InitOpts.Macros.size(); i != e; ++i) { 15880b57cec5SDimitry Andric if (InitOpts.Macros[i].second) // isUndef 15890b57cec5SDimitry Andric Builder.undefineMacro(InitOpts.Macros[i].first); 15900b57cec5SDimitry Andric else 15910b57cec5SDimitry Andric DefineBuiltinMacro(Builder, InitOpts.Macros[i].first, 15920b57cec5SDimitry Andric PP.getDiagnostics()); 15930b57cec5SDimitry Andric } 15940b57cec5SDimitry Andric 15950b57cec5SDimitry Andric // Exit the command line and go back to <built-in> (2 is LC_LEAVE). 15960b57cec5SDimitry Andric Builder.append("# 1 \"<built-in>\" 2"); 15970b57cec5SDimitry Andric 15980b57cec5SDimitry Andric // If -imacros are specified, include them now. These are processed before 15990b57cec5SDimitry Andric // any -include directives. 16000b57cec5SDimitry Andric for (unsigned i = 0, e = InitOpts.MacroIncludes.size(); i != e; ++i) 16010b57cec5SDimitry Andric AddImplicitIncludeMacros(Builder, InitOpts.MacroIncludes[i]); 16020b57cec5SDimitry Andric 16030b57cec5SDimitry Andric // Process -include-pch/-include-pth directives. 16040b57cec5SDimitry Andric if (!InitOpts.ImplicitPCHInclude.empty()) 16050b57cec5SDimitry Andric AddImplicitIncludePCH(Builder, PP, PCHContainerRdr, 16060b57cec5SDimitry Andric InitOpts.ImplicitPCHInclude); 16070b57cec5SDimitry Andric 16080b57cec5SDimitry Andric // Process -include directives. 16090b57cec5SDimitry Andric for (unsigned i = 0, e = InitOpts.Includes.size(); i != e; ++i) { 16100b57cec5SDimitry Andric const std::string &Path = InitOpts.Includes[i]; 16110b57cec5SDimitry Andric AddImplicitInclude(Builder, Path); 16120b57cec5SDimitry Andric } 16130b57cec5SDimitry Andric 16140b57cec5SDimitry Andric // Instruct the preprocessor to skip the preamble. 16150b57cec5SDimitry Andric PP.setSkipMainFilePreamble(InitOpts.PrecompiledPreambleBytes.first, 16160b57cec5SDimitry Andric InitOpts.PrecompiledPreambleBytes.second); 16170b57cec5SDimitry Andric 16180b57cec5SDimitry Andric // Copy PredefinedBuffer into the Preprocessor. 161981ad6265SDimitry Andric PP.setPredefines(std::move(PredefineBuffer)); 16200b57cec5SDimitry Andric } 1621