Path: blob/main/contrib/llvm-project/clang/lib/Frontend/InitPreprocessor.cpp
35232 views
//===--- InitPreprocessor.cpp - PP initialization code. ---------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file implements the clang::InitializePreprocessor function.9//10//===----------------------------------------------------------------------===//1112#include "clang/Basic/FileManager.h"13#include "clang/Basic/HLSLRuntime.h"14#include "clang/Basic/MacroBuilder.h"15#include "clang/Basic/SourceManager.h"16#include "clang/Basic/SyncScope.h"17#include "clang/Basic/TargetInfo.h"18#include "clang/Basic/Version.h"19#include "clang/Frontend/FrontendDiagnostic.h"20#include "clang/Frontend/FrontendOptions.h"21#include "clang/Frontend/Utils.h"22#include "clang/Lex/HeaderSearch.h"23#include "clang/Lex/Preprocessor.h"24#include "clang/Lex/PreprocessorOptions.h"25#include "clang/Serialization/ASTReader.h"26#include "llvm/ADT/APFloat.h"27#include "llvm/IR/DataLayout.h"28#include "llvm/IR/DerivedTypes.h"29using namespace clang;3031static bool MacroBodyEndsInBackslash(StringRef MacroBody) {32while (!MacroBody.empty() && isWhitespace(MacroBody.back()))33MacroBody = MacroBody.drop_back();34return !MacroBody.empty() && MacroBody.back() == '\\';35}3637// Append a #define line to Buf for Macro. Macro should be of the form XXX,38// in which case we emit "#define XXX 1" or "XXX=Y z W" in which case we emit39// "#define XXX Y z W". To get a #define with no value, use "XXX=".40static void DefineBuiltinMacro(MacroBuilder &Builder, StringRef Macro,41DiagnosticsEngine &Diags) {42std::pair<StringRef, StringRef> MacroPair = Macro.split('=');43StringRef MacroName = MacroPair.first;44StringRef MacroBody = MacroPair.second;45if (MacroName.size() != Macro.size()) {46// Per GCC -D semantics, the macro ends at \n if it exists.47StringRef::size_type End = MacroBody.find_first_of("\n\r");48if (End != StringRef::npos)49Diags.Report(diag::warn_fe_macro_contains_embedded_newline)50<< MacroName;51MacroBody = MacroBody.substr(0, End);52// We handle macro bodies which end in a backslash by appending an extra53// backslash+newline. This makes sure we don't accidentally treat the54// backslash as a line continuation marker.55if (MacroBodyEndsInBackslash(MacroBody))56Builder.defineMacro(MacroName, Twine(MacroBody) + "\\\n");57else58Builder.defineMacro(MacroName, MacroBody);59} else {60// Push "macroname 1".61Builder.defineMacro(Macro);62}63}6465/// AddImplicitInclude - Add an implicit \#include of the specified file to the66/// predefines buffer.67/// As these includes are generated by -include arguments the header search68/// logic is going to search relatively to the current working directory.69static void AddImplicitInclude(MacroBuilder &Builder, StringRef File) {70Builder.append(Twine("#include \"") + File + "\"");71}7273static void AddImplicitIncludeMacros(MacroBuilder &Builder, StringRef File) {74Builder.append(Twine("#__include_macros \"") + File + "\"");75// Marker token to stop the __include_macros fetch loop.76Builder.append("##"); // ##?77}7879/// Add an implicit \#include using the original file used to generate80/// a PCH file.81static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP,82const PCHContainerReader &PCHContainerRdr,83StringRef ImplicitIncludePCH) {84std::string OriginalFile = ASTReader::getOriginalSourceFile(85std::string(ImplicitIncludePCH), PP.getFileManager(), PCHContainerRdr,86PP.getDiagnostics());87if (OriginalFile.empty())88return;8990AddImplicitInclude(Builder, OriginalFile);91}9293/// PickFP - This is used to pick a value based on the FP semantics of the94/// specified FP model.95template <typename T>96static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal,97T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal,98T IEEEQuadVal) {99if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf())100return IEEEHalfVal;101if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle())102return IEEESingleVal;103if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEdouble())104return IEEEDoubleVal;105if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::x87DoubleExtended())106return X87DoubleExtendedVal;107if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble())108return PPCDoubleDoubleVal;109assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad());110return IEEEQuadVal;111}112113static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,114const llvm::fltSemantics *Sem, StringRef Ext) {115const char *DenormMin, *NormMax, *Epsilon, *Max, *Min;116NormMax = PickFP(Sem, "6.5504e+4", "3.40282347e+38",117"1.7976931348623157e+308", "1.18973149535723176502e+4932",118"8.98846567431157953864652595394501e+307",119"1.18973149535723176508575932662800702e+4932");120DenormMin = PickFP(Sem, "5.9604644775390625e-8", "1.40129846e-45",121"4.9406564584124654e-324", "3.64519953188247460253e-4951",122"4.94065645841246544176568792868221e-324",123"6.47517511943802511092443895822764655e-4966");124int Digits = PickFP(Sem, 3, 6, 15, 18, 31, 33);125int DecimalDigits = PickFP(Sem, 5, 9, 17, 21, 33, 36);126Epsilon = PickFP(Sem, "9.765625e-4", "1.19209290e-7",127"2.2204460492503131e-16", "1.08420217248550443401e-19",128"4.94065645841246544176568792868221e-324",129"1.92592994438723585305597794258492732e-34");130int MantissaDigits = PickFP(Sem, 11, 24, 53, 64, 106, 113);131int Min10Exp = PickFP(Sem, -4, -37, -307, -4931, -291, -4931);132int Max10Exp = PickFP(Sem, 4, 38, 308, 4932, 308, 4932);133int MinExp = PickFP(Sem, -13, -125, -1021, -16381, -968, -16381);134int MaxExp = PickFP(Sem, 16, 128, 1024, 16384, 1024, 16384);135Min = PickFP(Sem, "6.103515625e-5", "1.17549435e-38", "2.2250738585072014e-308",136"3.36210314311209350626e-4932",137"2.00416836000897277799610805135016e-292",138"3.36210314311209350626267781732175260e-4932");139Max = PickFP(Sem, "6.5504e+4", "3.40282347e+38", "1.7976931348623157e+308",140"1.18973149535723176502e+4932",141"1.79769313486231580793728971405301e+308",142"1.18973149535723176508575932662800702e+4932");143144SmallString<32> DefPrefix;145DefPrefix = "__";146DefPrefix += Prefix;147DefPrefix += "_";148149Builder.defineMacro(DefPrefix + "DENORM_MIN__", Twine(DenormMin)+Ext);150Builder.defineMacro(DefPrefix + "NORM_MAX__", Twine(NormMax)+Ext);151Builder.defineMacro(DefPrefix + "HAS_DENORM__");152Builder.defineMacro(DefPrefix + "DIG__", Twine(Digits));153Builder.defineMacro(DefPrefix + "DECIMAL_DIG__", Twine(DecimalDigits));154Builder.defineMacro(DefPrefix + "EPSILON__", Twine(Epsilon)+Ext);155Builder.defineMacro(DefPrefix + "HAS_INFINITY__");156Builder.defineMacro(DefPrefix + "HAS_QUIET_NAN__");157Builder.defineMacro(DefPrefix + "MANT_DIG__", Twine(MantissaDigits));158159Builder.defineMacro(DefPrefix + "MAX_10_EXP__", Twine(Max10Exp));160Builder.defineMacro(DefPrefix + "MAX_EXP__", Twine(MaxExp));161Builder.defineMacro(DefPrefix + "MAX__", Twine(Max)+Ext);162163Builder.defineMacro(DefPrefix + "MIN_10_EXP__","("+Twine(Min10Exp)+")");164Builder.defineMacro(DefPrefix + "MIN_EXP__", "("+Twine(MinExp)+")");165Builder.defineMacro(DefPrefix + "MIN__", Twine(Min)+Ext);166}167168169/// DefineTypeSize - Emit a macro to the predefines buffer that declares a macro170/// named MacroName with the max value for a type with width 'TypeWidth' a171/// signedness of 'isSigned' and with a value suffix of 'ValSuffix' (e.g. LL).172static void DefineTypeSize(const Twine &MacroName, unsigned TypeWidth,173StringRef ValSuffix, bool isSigned,174MacroBuilder &Builder) {175llvm::APInt MaxVal = isSigned ? llvm::APInt::getSignedMaxValue(TypeWidth)176: llvm::APInt::getMaxValue(TypeWidth);177Builder.defineMacro(MacroName, toString(MaxVal, 10, isSigned) + ValSuffix);178}179180/// DefineTypeSize - An overloaded helper that uses TargetInfo to determine181/// the width, suffix, and signedness of the given type182static void DefineTypeSize(const Twine &MacroName, TargetInfo::IntType Ty,183const TargetInfo &TI, MacroBuilder &Builder) {184DefineTypeSize(MacroName, TI.getTypeWidth(Ty), TI.getTypeConstantSuffix(Ty),185TI.isTypeSigned(Ty), Builder);186}187188static void DefineFmt(const LangOptions &LangOpts, const Twine &Prefix,189TargetInfo::IntType Ty, const TargetInfo &TI,190MacroBuilder &Builder) {191StringRef FmtModifier = TI.getTypeFormatModifier(Ty);192auto Emitter = [&](char Fmt) {193Builder.defineMacro(Prefix + "_FMT" + Twine(Fmt) + "__",194Twine("\"") + FmtModifier + Twine(Fmt) + "\"");195};196bool IsSigned = TI.isTypeSigned(Ty);197llvm::for_each(StringRef(IsSigned ? "di" : "ouxX"), Emitter);198199// C23 added the b and B modifiers for printing binary output of unsigned200// integers. Conditionally define those if compiling in C23 mode.201if (LangOpts.C23 && !IsSigned)202llvm::for_each(StringRef("bB"), Emitter);203}204205static void DefineType(const Twine &MacroName, TargetInfo::IntType Ty,206MacroBuilder &Builder) {207Builder.defineMacro(MacroName, TargetInfo::getTypeName(Ty));208}209210static void DefineTypeWidth(const Twine &MacroName, TargetInfo::IntType Ty,211const TargetInfo &TI, MacroBuilder &Builder) {212Builder.defineMacro(MacroName, Twine(TI.getTypeWidth(Ty)));213}214215static void DefineTypeSizeof(StringRef MacroName, unsigned BitWidth,216const TargetInfo &TI, MacroBuilder &Builder) {217Builder.defineMacro(MacroName,218Twine(BitWidth / TI.getCharWidth()));219}220221// This will generate a macro based on the prefix with `_MAX__` as the suffix222// for the max value representable for the type, and a macro with a `_WIDTH__`223// suffix for the width of the type.224static void DefineTypeSizeAndWidth(const Twine &Prefix, TargetInfo::IntType Ty,225const TargetInfo &TI,226MacroBuilder &Builder) {227DefineTypeSize(Prefix + "_MAX__", Ty, TI, Builder);228DefineTypeWidth(Prefix + "_WIDTH__", Ty, TI, Builder);229}230231static void DefineExactWidthIntType(const LangOptions &LangOpts,232TargetInfo::IntType Ty,233const TargetInfo &TI,234MacroBuilder &Builder) {235int TypeWidth = TI.getTypeWidth(Ty);236bool IsSigned = TI.isTypeSigned(Ty);237238// Use the target specified int64 type, when appropriate, so that [u]int64_t239// ends up being defined in terms of the correct type.240if (TypeWidth == 64)241Ty = IsSigned ? TI.getInt64Type() : TI.getUInt64Type();242243// Use the target specified int16 type when appropriate. Some MCU targets244// (such as AVR) have definition of [u]int16_t to [un]signed int.245if (TypeWidth == 16)246Ty = IsSigned ? TI.getInt16Type() : TI.getUInt16Type();247248const char *Prefix = IsSigned ? "__INT" : "__UINT";249250DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder);251DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);252253StringRef ConstSuffix(TI.getTypeConstantSuffix(Ty));254Builder.defineMacro(Prefix + Twine(TypeWidth) + "_C_SUFFIX__", ConstSuffix);255}256257static void DefineExactWidthIntTypeSize(TargetInfo::IntType Ty,258const TargetInfo &TI,259MacroBuilder &Builder) {260int TypeWidth = TI.getTypeWidth(Ty);261bool IsSigned = TI.isTypeSigned(Ty);262263// Use the target specified int64 type, when appropriate, so that [u]int64_t264// ends up being defined in terms of the correct type.265if (TypeWidth == 64)266Ty = IsSigned ? TI.getInt64Type() : TI.getUInt64Type();267268// We don't need to define a _WIDTH macro for the exact-width types because269// we already know the width.270const char *Prefix = IsSigned ? "__INT" : "__UINT";271DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder);272}273274static void DefineLeastWidthIntType(const LangOptions &LangOpts,275unsigned TypeWidth, bool IsSigned,276const TargetInfo &TI,277MacroBuilder &Builder) {278TargetInfo::IntType Ty = TI.getLeastIntTypeByWidth(TypeWidth, IsSigned);279if (Ty == TargetInfo::NoInt)280return;281282const char *Prefix = IsSigned ? "__INT_LEAST" : "__UINT_LEAST";283DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder);284// We only want the *_WIDTH macro for the signed types to avoid too many285// predefined macros (the unsigned width and the signed width are identical.)286if (IsSigned)287DefineTypeSizeAndWidth(Prefix + Twine(TypeWidth), Ty, TI, Builder);288else289DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder);290DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);291}292293static void DefineFastIntType(const LangOptions &LangOpts, unsigned TypeWidth,294bool IsSigned, const TargetInfo &TI,295MacroBuilder &Builder) {296// stdint.h currently defines the fast int types as equivalent to the least297// types.298TargetInfo::IntType Ty = TI.getLeastIntTypeByWidth(TypeWidth, IsSigned);299if (Ty == TargetInfo::NoInt)300return;301302const char *Prefix = IsSigned ? "__INT_FAST" : "__UINT_FAST";303DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder);304// We only want the *_WIDTH macro for the signed types to avoid too many305// predefined macros (the unsigned width and the signed width are identical.)306if (IsSigned)307DefineTypeSizeAndWidth(Prefix + Twine(TypeWidth), Ty, TI, Builder);308else309DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder);310DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);311}312313314/// Get the value the ATOMIC_*_LOCK_FREE macro should have for a type with315/// the specified properties.316static const char *getLockFreeValue(unsigned TypeWidth, const TargetInfo &TI) {317// Fully-aligned, power-of-2 sizes no larger than the inline318// width will be inlined as lock-free operations.319// Note: we do not need to check alignment since _Atomic(T) is always320// appropriately-aligned in clang.321if (TI.hasBuiltinAtomic(TypeWidth, TypeWidth))322return "2"; // "always lock free"323// We cannot be certain what operations the lib calls might be324// able to implement as lock-free on future processors.325return "1"; // "sometimes lock free"326}327328/// Add definitions required for a smooth interaction between329/// Objective-C++ automated reference counting and libstdc++ (4.2).330static void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts,331MacroBuilder &Builder) {332Builder.defineMacro("_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR");333334std::string Result;335{336// Provide specializations for the __is_scalar type trait so that337// lifetime-qualified objects are not considered "scalar" types, which338// libstdc++ uses as an indicator of the presence of trivial copy, assign,339// default-construct, and destruct semantics (none of which hold for340// lifetime-qualified objects in ARC).341llvm::raw_string_ostream Out(Result);342343Out << "namespace std {\n"344<< "\n"345<< "struct __true_type;\n"346<< "struct __false_type;\n"347<< "\n";348349Out << "template<typename _Tp> struct __is_scalar;\n"350<< "\n";351352if (LangOpts.ObjCAutoRefCount) {353Out << "template<typename _Tp>\n"354<< "struct __is_scalar<__attribute__((objc_ownership(strong))) _Tp> {\n"355<< " enum { __value = 0 };\n"356<< " typedef __false_type __type;\n"357<< "};\n"358<< "\n";359}360361if (LangOpts.ObjCWeak) {362Out << "template<typename _Tp>\n"363<< "struct __is_scalar<__attribute__((objc_ownership(weak))) _Tp> {\n"364<< " enum { __value = 0 };\n"365<< " typedef __false_type __type;\n"366<< "};\n"367<< "\n";368}369370if (LangOpts.ObjCAutoRefCount) {371Out << "template<typename _Tp>\n"372<< "struct __is_scalar<__attribute__((objc_ownership(autoreleasing)))"373<< " _Tp> {\n"374<< " enum { __value = 0 };\n"375<< " typedef __false_type __type;\n"376<< "};\n"377<< "\n";378}379380Out << "}\n";381}382Builder.append(Result);383}384385static void InitializeStandardPredefinedMacros(const TargetInfo &TI,386const LangOptions &LangOpts,387const FrontendOptions &FEOpts,388MacroBuilder &Builder) {389if (LangOpts.HLSL) {390Builder.defineMacro("__hlsl_clang");391// HLSL Version392Builder.defineMacro("__HLSL_VERSION",393Twine((unsigned)LangOpts.getHLSLVersion()));394395if (LangOpts.NativeHalfType)396Builder.defineMacro("__HLSL_ENABLE_16_BIT", "1");397398// Shader target information399// "enums" for shader stages400Builder.defineMacro("__SHADER_STAGE_VERTEX",401Twine((uint32_t)ShaderStage::Vertex));402Builder.defineMacro("__SHADER_STAGE_PIXEL",403Twine((uint32_t)ShaderStage::Pixel));404Builder.defineMacro("__SHADER_STAGE_GEOMETRY",405Twine((uint32_t)ShaderStage::Geometry));406Builder.defineMacro("__SHADER_STAGE_HULL",407Twine((uint32_t)ShaderStage::Hull));408Builder.defineMacro("__SHADER_STAGE_DOMAIN",409Twine((uint32_t)ShaderStage::Domain));410Builder.defineMacro("__SHADER_STAGE_COMPUTE",411Twine((uint32_t)ShaderStage::Compute));412Builder.defineMacro("__SHADER_STAGE_AMPLIFICATION",413Twine((uint32_t)ShaderStage::Amplification));414Builder.defineMacro("__SHADER_STAGE_MESH",415Twine((uint32_t)ShaderStage::Mesh));416Builder.defineMacro("__SHADER_STAGE_LIBRARY",417Twine((uint32_t)ShaderStage::Library));418// The current shader stage itself419uint32_t StageInteger = static_cast<uint32_t>(420hlsl::getStageFromEnvironment(TI.getTriple().getEnvironment()));421422Builder.defineMacro("__SHADER_TARGET_STAGE", Twine(StageInteger));423// Add target versions424if (TI.getTriple().getOS() == llvm::Triple::ShaderModel) {425VersionTuple Version = TI.getTriple().getOSVersion();426Builder.defineMacro("__SHADER_TARGET_MAJOR", Twine(Version.getMajor()));427unsigned Minor = Version.getMinor().value_or(0);428Builder.defineMacro("__SHADER_TARGET_MINOR", Twine(Minor));429}430return;431}432// C++ [cpp.predefined]p1:433// The following macro names shall be defined by the implementation:434435// -- __STDC__436// [C++] Whether __STDC__ is predefined and if so, what its value is,437// are implementation-defined.438// (Removed in C++20.)439if ((!LangOpts.MSVCCompat || LangOpts.MSVCEnableStdcMacro) &&440!LangOpts.TraditionalCPP)441Builder.defineMacro("__STDC__");442// -- __STDC_HOSTED__443// The integer literal 1 if the implementation is a hosted444// implementation or the integer literal 0 if it is not.445if (LangOpts.Freestanding)446Builder.defineMacro("__STDC_HOSTED__", "0");447else448Builder.defineMacro("__STDC_HOSTED__");449450// -- __STDC_VERSION__451// [C++] Whether __STDC_VERSION__ is predefined and if so, what its452// value is, are implementation-defined.453// (Removed in C++20.)454if (!LangOpts.CPlusPlus) {455if (LangOpts.C2y)456Builder.defineMacro("__STDC_VERSION__", "202400L");457else if (LangOpts.C23)458Builder.defineMacro("__STDC_VERSION__", "202311L");459else if (LangOpts.C17)460Builder.defineMacro("__STDC_VERSION__", "201710L");461else if (LangOpts.C11)462Builder.defineMacro("__STDC_VERSION__", "201112L");463else if (LangOpts.C99)464Builder.defineMacro("__STDC_VERSION__", "199901L");465else if (!LangOpts.GNUMode && LangOpts.Digraphs)466Builder.defineMacro("__STDC_VERSION__", "199409L");467} else {468// -- __cplusplus469if (LangOpts.CPlusPlus26)470// FIXME: Use correct value for C++26.471Builder.defineMacro("__cplusplus", "202400L");472else if (LangOpts.CPlusPlus23)473Builder.defineMacro("__cplusplus", "202302L");474// [C++20] The integer literal 202002L.475else if (LangOpts.CPlusPlus20)476Builder.defineMacro("__cplusplus", "202002L");477// [C++17] The integer literal 201703L.478else if (LangOpts.CPlusPlus17)479Builder.defineMacro("__cplusplus", "201703L");480// [C++14] The name __cplusplus is defined to the value 201402L when481// compiling a C++ translation unit.482else if (LangOpts.CPlusPlus14)483Builder.defineMacro("__cplusplus", "201402L");484// [C++11] The name __cplusplus is defined to the value 201103L when485// compiling a C++ translation unit.486else if (LangOpts.CPlusPlus11)487Builder.defineMacro("__cplusplus", "201103L");488// [C++03] The name __cplusplus is defined to the value 199711L when489// compiling a C++ translation unit.490else491Builder.defineMacro("__cplusplus", "199711L");492493// -- __STDCPP_DEFAULT_NEW_ALIGNMENT__494// [C++17] An integer literal of type std::size_t whose value is the495// alignment guaranteed by a call to operator new(std::size_t)496//497// We provide this in all language modes, since it seems generally useful.498Builder.defineMacro("__STDCPP_DEFAULT_NEW_ALIGNMENT__",499Twine(TI.getNewAlign() / TI.getCharWidth()) +500TI.getTypeConstantSuffix(TI.getSizeType()));501502// -- __STDCPP_THREADS__503// Defined, and has the value integer literal 1, if and only if a504// program can have more than one thread of execution.505if (LangOpts.getThreadModel() == LangOptions::ThreadModelKind::POSIX)506Builder.defineMacro("__STDCPP_THREADS__", "1");507}508509// In C11 these are environment macros. In C++11 they are only defined510// as part of <cuchar>. To prevent breakage when mixing C and C++511// code, define these macros unconditionally. We can define them512// unconditionally, as Clang always uses UTF-16 and UTF-32 for 16-bit513// and 32-bit character literals.514Builder.defineMacro("__STDC_UTF_16__", "1");515Builder.defineMacro("__STDC_UTF_32__", "1");516517// __has_embed definitions518Builder.defineMacro("__STDC_EMBED_NOT_FOUND__",519llvm::itostr(static_cast<int>(EmbedResult::NotFound)));520Builder.defineMacro("__STDC_EMBED_FOUND__",521llvm::itostr(static_cast<int>(EmbedResult::Found)));522Builder.defineMacro("__STDC_EMBED_EMPTY__",523llvm::itostr(static_cast<int>(EmbedResult::Empty)));524525if (LangOpts.ObjC)526Builder.defineMacro("__OBJC__");527528// OpenCL v1.0/1.1 s6.9, v1.2/2.0 s6.10: Preprocessor Directives and Macros.529if (LangOpts.OpenCL) {530if (LangOpts.CPlusPlus) {531switch (LangOpts.OpenCLCPlusPlusVersion) {532case 100:533Builder.defineMacro("__OPENCL_CPP_VERSION__", "100");534break;535case 202100:536Builder.defineMacro("__OPENCL_CPP_VERSION__", "202100");537break;538default:539llvm_unreachable("Unsupported C++ version for OpenCL");540}541Builder.defineMacro("__CL_CPP_VERSION_1_0__", "100");542Builder.defineMacro("__CL_CPP_VERSION_2021__", "202100");543} else {544// OpenCL v1.0 and v1.1 do not have a predefined macro to indicate the545// language standard with which the program is compiled. __OPENCL_VERSION__546// is for the OpenCL version supported by the OpenCL device, which is not547// necessarily the language standard with which the program is compiled.548// A shared OpenCL header file requires a macro to indicate the language549// standard. As a workaround, __OPENCL_C_VERSION__ is defined for550// OpenCL v1.0 and v1.1.551switch (LangOpts.OpenCLVersion) {552case 100:553Builder.defineMacro("__OPENCL_C_VERSION__", "100");554break;555case 110:556Builder.defineMacro("__OPENCL_C_VERSION__", "110");557break;558case 120:559Builder.defineMacro("__OPENCL_C_VERSION__", "120");560break;561case 200:562Builder.defineMacro("__OPENCL_C_VERSION__", "200");563break;564case 300:565Builder.defineMacro("__OPENCL_C_VERSION__", "300");566break;567default:568llvm_unreachable("Unsupported OpenCL version");569}570}571Builder.defineMacro("CL_VERSION_1_0", "100");572Builder.defineMacro("CL_VERSION_1_1", "110");573Builder.defineMacro("CL_VERSION_1_2", "120");574Builder.defineMacro("CL_VERSION_2_0", "200");575Builder.defineMacro("CL_VERSION_3_0", "300");576577if (TI.isLittleEndian())578Builder.defineMacro("__ENDIAN_LITTLE__");579580if (LangOpts.FastRelaxedMath)581Builder.defineMacro("__FAST_RELAXED_MATH__");582}583584if (LangOpts.SYCLIsDevice || LangOpts.SYCLIsHost) {585// SYCL Version is set to a value when building SYCL applications586if (LangOpts.getSYCLVersion() == LangOptions::SYCL_2017)587Builder.defineMacro("CL_SYCL_LANGUAGE_VERSION", "121");588else if (LangOpts.getSYCLVersion() == LangOptions::SYCL_2020)589Builder.defineMacro("SYCL_LANGUAGE_VERSION", "202001");590}591592// Not "standard" per se, but available even with the -undef flag.593if (LangOpts.AsmPreprocessor)594Builder.defineMacro("__ASSEMBLER__");595if (LangOpts.CUDA) {596if (LangOpts.GPURelocatableDeviceCode)597Builder.defineMacro("__CLANG_RDC__");598if (!LangOpts.HIP)599Builder.defineMacro("__CUDA__");600if (LangOpts.GPUDefaultStream ==601LangOptions::GPUDefaultStreamKind::PerThread)602Builder.defineMacro("CUDA_API_PER_THREAD_DEFAULT_STREAM");603}604if (LangOpts.HIP) {605Builder.defineMacro("__HIP__");606Builder.defineMacro("__HIPCC__");607Builder.defineMacro("__HIP_MEMORY_SCOPE_SINGLETHREAD", "1");608Builder.defineMacro("__HIP_MEMORY_SCOPE_WAVEFRONT", "2");609Builder.defineMacro("__HIP_MEMORY_SCOPE_WORKGROUP", "3");610Builder.defineMacro("__HIP_MEMORY_SCOPE_AGENT", "4");611Builder.defineMacro("__HIP_MEMORY_SCOPE_SYSTEM", "5");612if (LangOpts.HIPStdPar) {613Builder.defineMacro("__HIPSTDPAR__");614if (LangOpts.HIPStdParInterposeAlloc)615Builder.defineMacro("__HIPSTDPAR_INTERPOSE_ALLOC__");616}617if (LangOpts.CUDAIsDevice) {618Builder.defineMacro("__HIP_DEVICE_COMPILE__");619if (!TI.hasHIPImageSupport()) {620Builder.defineMacro("__HIP_NO_IMAGE_SUPPORT__", "1");621// Deprecated.622Builder.defineMacro("__HIP_NO_IMAGE_SUPPORT", "1");623}624}625if (LangOpts.GPUDefaultStream ==626LangOptions::GPUDefaultStreamKind::PerThread) {627Builder.defineMacro("__HIP_API_PER_THREAD_DEFAULT_STREAM__");628// Deprecated.629Builder.defineMacro("HIP_API_PER_THREAD_DEFAULT_STREAM");630}631}632633if (LangOpts.OpenACC) {634// FIXME: When we have full support for OpenACC, we should set this to the635// version we support. Until then, set as '1' by default, but provide a636// temporary mechanism for users to override this so real-world examples can637// be tested against.638if (!LangOpts.OpenACCMacroOverride.empty())639Builder.defineMacro("_OPENACC", LangOpts.OpenACCMacroOverride);640else641Builder.defineMacro("_OPENACC", "1");642}643}644645/// Initialize the predefined C++ language feature test macros defined in646/// ISO/IEC JTC1/SC22/WG21 (C++) SD-6: "SG10 Feature Test Recommendations".647static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts,648MacroBuilder &Builder) {649// C++98 features.650if (LangOpts.RTTI)651Builder.defineMacro("__cpp_rtti", "199711L");652if (LangOpts.CXXExceptions)653Builder.defineMacro("__cpp_exceptions", "199711L");654655// C++11 features.656if (LangOpts.CPlusPlus11) {657Builder.defineMacro("__cpp_unicode_characters", "200704L");658Builder.defineMacro("__cpp_raw_strings", "200710L");659Builder.defineMacro("__cpp_unicode_literals", "200710L");660Builder.defineMacro("__cpp_user_defined_literals", "200809L");661Builder.defineMacro("__cpp_lambdas", "200907L");662Builder.defineMacro("__cpp_constexpr", LangOpts.CPlusPlus26 ? "202306L"663: LangOpts.CPlusPlus23 ? "202211L"664: LangOpts.CPlusPlus20 ? "201907L"665: LangOpts.CPlusPlus17 ? "201603L"666: LangOpts.CPlusPlus14 ? "201304L"667: "200704");668Builder.defineMacro("__cpp_constexpr_in_decltype", "201711L");669Builder.defineMacro("__cpp_range_based_for",670LangOpts.CPlusPlus23 ? "202211L"671: LangOpts.CPlusPlus17 ? "201603L"672: "200907");673Builder.defineMacro("__cpp_static_assert", LangOpts.CPlusPlus26 ? "202306L"674: LangOpts.CPlusPlus17675? "201411L"676: "200410");677Builder.defineMacro("__cpp_decltype", "200707L");678Builder.defineMacro("__cpp_attributes", "200809L");679Builder.defineMacro("__cpp_rvalue_references", "200610L");680Builder.defineMacro("__cpp_variadic_templates", "200704L");681Builder.defineMacro("__cpp_initializer_lists", "200806L");682Builder.defineMacro("__cpp_delegating_constructors", "200604L");683Builder.defineMacro("__cpp_nsdmi", "200809L");684Builder.defineMacro("__cpp_inheriting_constructors", "201511L");685Builder.defineMacro("__cpp_ref_qualifiers", "200710L");686Builder.defineMacro("__cpp_alias_templates", "200704L");687}688if (LangOpts.ThreadsafeStatics)689Builder.defineMacro("__cpp_threadsafe_static_init", "200806L");690691// C++14 features.692if (LangOpts.CPlusPlus14) {693Builder.defineMacro("__cpp_binary_literals", "201304L");694Builder.defineMacro("__cpp_digit_separators", "201309L");695Builder.defineMacro("__cpp_init_captures",696LangOpts.CPlusPlus20 ? "201803L" : "201304L");697Builder.defineMacro("__cpp_generic_lambdas",698LangOpts.CPlusPlus20 ? "201707L" : "201304L");699Builder.defineMacro("__cpp_decltype_auto", "201304L");700Builder.defineMacro("__cpp_return_type_deduction", "201304L");701Builder.defineMacro("__cpp_aggregate_nsdmi", "201304L");702Builder.defineMacro("__cpp_variable_templates", "201304L");703}704if (LangOpts.SizedDeallocation)705Builder.defineMacro("__cpp_sized_deallocation", "201309L");706707// C++17 features.708if (LangOpts.CPlusPlus17) {709Builder.defineMacro("__cpp_hex_float", "201603L");710Builder.defineMacro("__cpp_inline_variables", "201606L");711Builder.defineMacro("__cpp_noexcept_function_type", "201510L");712Builder.defineMacro("__cpp_capture_star_this", "201603L");713Builder.defineMacro("__cpp_if_constexpr", "201606L");714Builder.defineMacro("__cpp_deduction_guides", "201703L"); // (not latest)715Builder.defineMacro("__cpp_template_auto", "201606L"); // (old name)716Builder.defineMacro("__cpp_namespace_attributes", "201411L");717Builder.defineMacro("__cpp_enumerator_attributes", "201411L");718Builder.defineMacro("__cpp_nested_namespace_definitions", "201411L");719Builder.defineMacro("__cpp_variadic_using", "201611L");720Builder.defineMacro("__cpp_aggregate_bases", "201603L");721Builder.defineMacro("__cpp_structured_bindings", "202403L");722Builder.defineMacro("__cpp_nontype_template_args",723"201411L"); // (not latest)724Builder.defineMacro("__cpp_fold_expressions", "201603L");725Builder.defineMacro("__cpp_guaranteed_copy_elision", "201606L");726Builder.defineMacro("__cpp_nontype_template_parameter_auto", "201606L");727}728if (LangOpts.AlignedAllocation && !LangOpts.AlignedAllocationUnavailable)729Builder.defineMacro("__cpp_aligned_new", "201606L");730if (LangOpts.RelaxedTemplateTemplateArgs)731Builder.defineMacro("__cpp_template_template_args", "201611L");732733// C++20 features.734if (LangOpts.CPlusPlus20) {735Builder.defineMacro("__cpp_aggregate_paren_init", "201902L");736737Builder.defineMacro("__cpp_concepts", "202002");738Builder.defineMacro("__cpp_conditional_explicit", "201806L");739Builder.defineMacro("__cpp_consteval", "202211L");740Builder.defineMacro("__cpp_constexpr_dynamic_alloc", "201907L");741Builder.defineMacro("__cpp_constinit", "201907L");742Builder.defineMacro("__cpp_impl_coroutine", "201902L");743Builder.defineMacro("__cpp_designated_initializers", "201707L");744Builder.defineMacro("__cpp_impl_three_way_comparison", "201907L");745//Builder.defineMacro("__cpp_modules", "201907L");746Builder.defineMacro("__cpp_using_enum", "201907L");747}748// C++23 features.749if (LangOpts.CPlusPlus23) {750Builder.defineMacro("__cpp_implicit_move", "202207L");751Builder.defineMacro("__cpp_size_t_suffix", "202011L");752Builder.defineMacro("__cpp_if_consteval", "202106L");753Builder.defineMacro("__cpp_multidimensional_subscript", "202211L");754Builder.defineMacro("__cpp_auto_cast", "202110L");755}756757// We provide those C++23 features as extensions in earlier language modes, so758// we also define their feature test macros.759if (LangOpts.CPlusPlus11)760Builder.defineMacro("__cpp_static_call_operator", "202207L");761Builder.defineMacro("__cpp_named_character_escapes", "202207L");762Builder.defineMacro("__cpp_placeholder_variables", "202306L");763764// C++26 features supported in earlier language modes.765Builder.defineMacro("__cpp_pack_indexing", "202311L");766Builder.defineMacro("__cpp_deleted_function", "202403L");767768if (LangOpts.Char8)769Builder.defineMacro("__cpp_char8_t", "202207L");770Builder.defineMacro("__cpp_impl_destroying_delete", "201806L");771}772773/// InitializeOpenCLFeatureTestMacros - Define OpenCL macros based on target774/// settings and language version775void InitializeOpenCLFeatureTestMacros(const TargetInfo &TI,776const LangOptions &Opts,777MacroBuilder &Builder) {778const llvm::StringMap<bool> &OpenCLFeaturesMap = TI.getSupportedOpenCLOpts();779// FIXME: OpenCL options which affect language semantics/syntax780// should be moved into LangOptions.781auto defineOpenCLExtMacro = [&](llvm::StringRef Name, auto... OptArgs) {782// Check if extension is supported by target and is available in this783// OpenCL version784if (TI.hasFeatureEnabled(OpenCLFeaturesMap, Name) &&785OpenCLOptions::isOpenCLOptionAvailableIn(Opts, OptArgs...))786Builder.defineMacro(Name);787};788#define OPENCL_GENERIC_EXTENSION(Ext, ...) \789defineOpenCLExtMacro(#Ext, __VA_ARGS__);790#include "clang/Basic/OpenCLExtensions.def"791792// Assume compiling for FULL profile793Builder.defineMacro("__opencl_c_int64");794}795796llvm::SmallString<32> ConstructFixedPointLiteral(llvm::APFixedPoint Val,797llvm::StringRef Suffix) {798if (Val.isSigned() && Val == llvm::APFixedPoint::getMin(Val.getSemantics())) {799// When representing the min value of a signed fixed point type in source800// code, we cannot simply write `-<lowest value>`. For example, the min801// value of a `short _Fract` cannot be written as `-1.0hr`. This is because802// the parser will read this (and really any negative numerical literal) as803// a UnaryOperator that owns a FixedPointLiteral with a positive value804// rather than just a FixedPointLiteral with a negative value. Compiling805// `-1.0hr` results in an overflow to the maximal value of that fixed point806// type. The correct way to represent a signed min value is to instead split807// it into two halves, like `(-0.5hr-0.5hr)` which is what the standard808// defines SFRACT_MIN as.809llvm::SmallString<32> Literal;810Literal.push_back('(');811llvm::SmallString<32> HalfStr =812ConstructFixedPointLiteral(Val.shr(1), Suffix);813Literal += HalfStr;814Literal += HalfStr;815Literal.push_back(')');816return Literal;817}818819llvm::SmallString<32> Str(Val.toString());820Str += Suffix;821return Str;822}823824void DefineFixedPointMacros(const TargetInfo &TI, MacroBuilder &Builder,825llvm::StringRef TypeName, llvm::StringRef Suffix,826unsigned Width, unsigned Scale, bool Signed) {827// Saturation doesn't affect the size or scale of a fixed point type, so we828// don't need it here.829llvm::FixedPointSemantics FXSema(830Width, Scale, Signed, /*IsSaturated=*/false,831!Signed && TI.doUnsignedFixedPointTypesHavePadding());832llvm::SmallString<32> MacroPrefix("__");833MacroPrefix += TypeName;834Builder.defineMacro(MacroPrefix + "_EPSILON__",835ConstructFixedPointLiteral(836llvm::APFixedPoint::getEpsilon(FXSema), Suffix));837Builder.defineMacro(MacroPrefix + "_FBIT__", Twine(Scale));838Builder.defineMacro(839MacroPrefix + "_MAX__",840ConstructFixedPointLiteral(llvm::APFixedPoint::getMax(FXSema), Suffix));841842// ISO/IEC TR 18037:2008 doesn't specify MIN macros for unsigned types since843// they're all just zero.844if (Signed)845Builder.defineMacro(846MacroPrefix + "_MIN__",847ConstructFixedPointLiteral(llvm::APFixedPoint::getMin(FXSema), Suffix));848}849850static void InitializePredefinedMacros(const TargetInfo &TI,851const LangOptions &LangOpts,852const FrontendOptions &FEOpts,853const PreprocessorOptions &PPOpts,854MacroBuilder &Builder) {855// Compiler version introspection macros.856Builder.defineMacro("__llvm__"); // LLVM Backend857Builder.defineMacro("__clang__"); // Clang Frontend858#define TOSTR2(X) #X859#define TOSTR(X) TOSTR2(X)860Builder.defineMacro("__clang_major__", TOSTR(CLANG_VERSION_MAJOR));861Builder.defineMacro("__clang_minor__", TOSTR(CLANG_VERSION_MINOR));862Builder.defineMacro("__clang_patchlevel__", TOSTR(CLANG_VERSION_PATCHLEVEL));863#undef TOSTR864#undef TOSTR2865Builder.defineMacro("__clang_version__",866"\"" CLANG_VERSION_STRING " "867+ getClangFullRepositoryVersion() + "\"");868869if (LangOpts.GNUCVersion != 0) {870// Major, minor, patch, are given two decimal places each, so 4.2.1 becomes871// 40201.872unsigned GNUCMajor = LangOpts.GNUCVersion / 100 / 100;873unsigned GNUCMinor = LangOpts.GNUCVersion / 100 % 100;874unsigned GNUCPatch = LangOpts.GNUCVersion % 100;875Builder.defineMacro("__GNUC__", Twine(GNUCMajor));876Builder.defineMacro("__GNUC_MINOR__", Twine(GNUCMinor));877Builder.defineMacro("__GNUC_PATCHLEVEL__", Twine(GNUCPatch));878Builder.defineMacro("__GXX_ABI_VERSION", "1002");879880if (LangOpts.CPlusPlus) {881Builder.defineMacro("__GNUG__", Twine(GNUCMajor));882Builder.defineMacro("__GXX_WEAK__");883}884}885886// Define macros for the C11 / C++11 memory orderings887Builder.defineMacro("__ATOMIC_RELAXED", "0");888Builder.defineMacro("__ATOMIC_CONSUME", "1");889Builder.defineMacro("__ATOMIC_ACQUIRE", "2");890Builder.defineMacro("__ATOMIC_RELEASE", "3");891Builder.defineMacro("__ATOMIC_ACQ_REL", "4");892Builder.defineMacro("__ATOMIC_SEQ_CST", "5");893894// Define macros for the clang atomic scopes.895Builder.defineMacro("__MEMORY_SCOPE_SYSTEM", "0");896Builder.defineMacro("__MEMORY_SCOPE_DEVICE", "1");897Builder.defineMacro("__MEMORY_SCOPE_WRKGRP", "2");898Builder.defineMacro("__MEMORY_SCOPE_WVFRNT", "3");899Builder.defineMacro("__MEMORY_SCOPE_SINGLE", "4");900901// Define macros for the OpenCL memory scope.902// The values should match AtomicScopeOpenCLModel::ID enum.903static_assert(904static_cast<unsigned>(AtomicScopeOpenCLModel::WorkGroup) == 1 &&905static_cast<unsigned>(AtomicScopeOpenCLModel::Device) == 2 &&906static_cast<unsigned>(AtomicScopeOpenCLModel::AllSVMDevices) == 3 &&907static_cast<unsigned>(AtomicScopeOpenCLModel::SubGroup) == 4,908"Invalid OpenCL memory scope enum definition");909Builder.defineMacro("__OPENCL_MEMORY_SCOPE_WORK_ITEM", "0");910Builder.defineMacro("__OPENCL_MEMORY_SCOPE_WORK_GROUP", "1");911Builder.defineMacro("__OPENCL_MEMORY_SCOPE_DEVICE", "2");912Builder.defineMacro("__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES", "3");913Builder.defineMacro("__OPENCL_MEMORY_SCOPE_SUB_GROUP", "4");914915// Define macros for floating-point data classes, used in __builtin_isfpclass.916Builder.defineMacro("__FPCLASS_SNAN", "0x0001");917Builder.defineMacro("__FPCLASS_QNAN", "0x0002");918Builder.defineMacro("__FPCLASS_NEGINF", "0x0004");919Builder.defineMacro("__FPCLASS_NEGNORMAL", "0x0008");920Builder.defineMacro("__FPCLASS_NEGSUBNORMAL", "0x0010");921Builder.defineMacro("__FPCLASS_NEGZERO", "0x0020");922Builder.defineMacro("__FPCLASS_POSZERO", "0x0040");923Builder.defineMacro("__FPCLASS_POSSUBNORMAL", "0x0080");924Builder.defineMacro("__FPCLASS_POSNORMAL", "0x0100");925Builder.defineMacro("__FPCLASS_POSINF", "0x0200");926927// Support for #pragma redefine_extname (Sun compatibility)928Builder.defineMacro("__PRAGMA_REDEFINE_EXTNAME", "1");929930// Previously this macro was set to a string aiming to achieve compatibility931// with GCC 4.2.1. Now, just return the full Clang version932Builder.defineMacro("__VERSION__", "\"" +933Twine(getClangFullCPPVersion()) + "\"");934935// Initialize language-specific preprocessor defines.936937// Standard conforming mode?938if (!LangOpts.GNUMode && !LangOpts.MSVCCompat)939Builder.defineMacro("__STRICT_ANSI__");940941if (LangOpts.GNUCVersion && LangOpts.CPlusPlus11)942Builder.defineMacro("__GXX_EXPERIMENTAL_CXX0X__");943944if (TI.getTriple().isWindowsGNUEnvironment()) {945// Set ABI defining macros for libstdc++ for MinGW, where the946// default in libstdc++ differs from the defaults for this target.947Builder.defineMacro("__GXX_TYPEINFO_EQUALITY_INLINE", "0");948}949950if (LangOpts.ObjC) {951if (LangOpts.ObjCRuntime.isNonFragile()) {952Builder.defineMacro("__OBJC2__");953954if (LangOpts.ObjCExceptions)955Builder.defineMacro("OBJC_ZEROCOST_EXCEPTIONS");956}957958if (LangOpts.getGC() != LangOptions::NonGC)959Builder.defineMacro("__OBJC_GC__");960961if (LangOpts.ObjCRuntime.isNeXTFamily())962Builder.defineMacro("__NEXT_RUNTIME__");963964if (LangOpts.ObjCRuntime.getKind() == ObjCRuntime::GNUstep) {965auto version = LangOpts.ObjCRuntime.getVersion();966std::string versionString = "1";967// Don't rely on the tuple argument, because we can be asked to target968// later ABIs than we actually support, so clamp these values to those969// currently supported970if (version >= VersionTuple(2, 0))971Builder.defineMacro("__OBJC_GNUSTEP_RUNTIME_ABI__", "20");972else973Builder.defineMacro(974"__OBJC_GNUSTEP_RUNTIME_ABI__",975"1" + Twine(std::min(8U, version.getMinor().value_or(0))));976}977978if (LangOpts.ObjCRuntime.getKind() == ObjCRuntime::ObjFW) {979VersionTuple tuple = LangOpts.ObjCRuntime.getVersion();980unsigned minor = tuple.getMinor().value_or(0);981unsigned subminor = tuple.getSubminor().value_or(0);982Builder.defineMacro("__OBJFW_RUNTIME_ABI__",983Twine(tuple.getMajor() * 10000 + minor * 100 +984subminor));985}986987Builder.defineMacro("IBOutlet", "__attribute__((iboutlet))");988Builder.defineMacro("IBOutletCollection(ClassName)",989"__attribute__((iboutletcollection(ClassName)))");990Builder.defineMacro("IBAction", "void)__attribute__((ibaction)");991Builder.defineMacro("IBInspectable", "");992Builder.defineMacro("IB_DESIGNABLE", "");993}994995// Define a macro that describes the Objective-C boolean type even for C996// and C++ since BOOL can be used from non Objective-C code.997Builder.defineMacro("__OBJC_BOOL_IS_BOOL",998Twine(TI.useSignedCharForObjCBool() ? "0" : "1"));9991000if (LangOpts.CPlusPlus)1001InitializeCPlusPlusFeatureTestMacros(LangOpts, Builder);10021003// darwin_constant_cfstrings controls this. This is also dependent1004// on other things like the runtime I believe. This is set even for C code.1005if (!LangOpts.NoConstantCFStrings)1006Builder.defineMacro("__CONSTANT_CFSTRINGS__");10071008if (LangOpts.ObjC)1009Builder.defineMacro("OBJC_NEW_PROPERTIES");10101011if (LangOpts.PascalStrings)1012Builder.defineMacro("__PASCAL_STRINGS__");10131014if (LangOpts.Blocks) {1015Builder.defineMacro("__block", "__attribute__((__blocks__(byref)))");1016Builder.defineMacro("__BLOCKS__");1017}10181019if (!LangOpts.MSVCCompat && LangOpts.Exceptions)1020Builder.defineMacro("__EXCEPTIONS");1021if (LangOpts.GNUCVersion && LangOpts.RTTI)1022Builder.defineMacro("__GXX_RTTI");10231024if (LangOpts.hasSjLjExceptions())1025Builder.defineMacro("__USING_SJLJ_EXCEPTIONS__");1026else if (LangOpts.hasSEHExceptions())1027Builder.defineMacro("__SEH__");1028else if (LangOpts.hasDWARFExceptions() &&1029(TI.getTriple().isThumb() || TI.getTriple().isARM()))1030Builder.defineMacro("__ARM_DWARF_EH__");1031else if (LangOpts.hasWasmExceptions() && TI.getTriple().isWasm())1032Builder.defineMacro("__WASM_EXCEPTIONS__");10331034if (LangOpts.Deprecated)1035Builder.defineMacro("__DEPRECATED");10361037if (!LangOpts.MSVCCompat && LangOpts.CPlusPlus)1038Builder.defineMacro("__private_extern__", "extern");10391040if (LangOpts.MicrosoftExt) {1041if (LangOpts.WChar) {1042// wchar_t supported as a keyword.1043Builder.defineMacro("_WCHAR_T_DEFINED");1044Builder.defineMacro("_NATIVE_WCHAR_T_DEFINED");1045}1046}10471048// Macros to help identify the narrow and wide character sets1049// FIXME: clang currently ignores -fexec-charset=. If this changes,1050// then this may need to be updated.1051Builder.defineMacro("__clang_literal_encoding__", "\"UTF-8\"");1052if (TI.getTypeWidth(TI.getWCharType()) >= 32) {1053// FIXME: 32-bit wchar_t signals UTF-32. This may change1054// if -fwide-exec-charset= is ever supported.1055Builder.defineMacro("__clang_wide_literal_encoding__", "\"UTF-32\"");1056} else {1057// FIXME: Less-than 32-bit wchar_t generally means UTF-161058// (e.g., Windows, 32-bit IBM). This may need to be1059// updated if -fwide-exec-charset= is ever supported.1060Builder.defineMacro("__clang_wide_literal_encoding__", "\"UTF-16\"");1061}10621063if (LangOpts.Optimize)1064Builder.defineMacro("__OPTIMIZE__");1065if (LangOpts.OptimizeSize)1066Builder.defineMacro("__OPTIMIZE_SIZE__");10671068if (LangOpts.FastMath)1069Builder.defineMacro("__FAST_MATH__");10701071// Initialize target-specific preprocessor defines.10721073// __BYTE_ORDER__ was added in GCC 4.6. It's analogous1074// to the macro __BYTE_ORDER (no trailing underscores)1075// from glibc's <endian.h> header.1076// We don't support the PDP-11 as a target, but include1077// the define so it can still be compared against.1078Builder.defineMacro("__ORDER_LITTLE_ENDIAN__", "1234");1079Builder.defineMacro("__ORDER_BIG_ENDIAN__", "4321");1080Builder.defineMacro("__ORDER_PDP_ENDIAN__", "3412");1081if (TI.isBigEndian()) {1082Builder.defineMacro("__BYTE_ORDER__", "__ORDER_BIG_ENDIAN__");1083Builder.defineMacro("__BIG_ENDIAN__");1084} else {1085Builder.defineMacro("__BYTE_ORDER__", "__ORDER_LITTLE_ENDIAN__");1086Builder.defineMacro("__LITTLE_ENDIAN__");1087}10881089if (TI.getPointerWidth(LangAS::Default) == 64 && TI.getLongWidth() == 64 &&1090TI.getIntWidth() == 32) {1091Builder.defineMacro("_LP64");1092Builder.defineMacro("__LP64__");1093}10941095if (TI.getPointerWidth(LangAS::Default) == 32 && TI.getLongWidth() == 32 &&1096TI.getIntWidth() == 32) {1097Builder.defineMacro("_ILP32");1098Builder.defineMacro("__ILP32__");1099}11001101// Define type sizing macros based on the target properties.1102assert(TI.getCharWidth() == 8 && "Only support 8-bit char so far");1103Builder.defineMacro("__CHAR_BIT__", Twine(TI.getCharWidth()));11041105Builder.defineMacro("__BOOL_WIDTH__", Twine(TI.getBoolWidth()));1106Builder.defineMacro("__SHRT_WIDTH__", Twine(TI.getShortWidth()));1107Builder.defineMacro("__INT_WIDTH__", Twine(TI.getIntWidth()));1108Builder.defineMacro("__LONG_WIDTH__", Twine(TI.getLongWidth()));1109Builder.defineMacro("__LLONG_WIDTH__", Twine(TI.getLongLongWidth()));11101111size_t BitIntMaxWidth = TI.getMaxBitIntWidth();1112assert(BitIntMaxWidth <= llvm::IntegerType::MAX_INT_BITS &&1113"Target defined a max bit width larger than LLVM can support!");1114assert(BitIntMaxWidth >= TI.getLongLongWidth() &&1115"Target defined a max bit width smaller than the C standard allows!");1116Builder.defineMacro("__BITINT_MAXWIDTH__", Twine(BitIntMaxWidth));11171118DefineTypeSize("__SCHAR_MAX__", TargetInfo::SignedChar, TI, Builder);1119DefineTypeSize("__SHRT_MAX__", TargetInfo::SignedShort, TI, Builder);1120DefineTypeSize("__INT_MAX__", TargetInfo::SignedInt, TI, Builder);1121DefineTypeSize("__LONG_MAX__", TargetInfo::SignedLong, TI, Builder);1122DefineTypeSize("__LONG_LONG_MAX__", TargetInfo::SignedLongLong, TI, Builder);1123DefineTypeSizeAndWidth("__WCHAR", TI.getWCharType(), TI, Builder);1124DefineTypeSizeAndWidth("__WINT", TI.getWIntType(), TI, Builder);1125DefineTypeSizeAndWidth("__INTMAX", TI.getIntMaxType(), TI, Builder);1126DefineTypeSizeAndWidth("__SIZE", TI.getSizeType(), TI, Builder);11271128DefineTypeSizeAndWidth("__UINTMAX", TI.getUIntMaxType(), TI, Builder);1129DefineTypeSizeAndWidth("__PTRDIFF", TI.getPtrDiffType(LangAS::Default), TI,1130Builder);1131DefineTypeSizeAndWidth("__INTPTR", TI.getIntPtrType(), TI, Builder);1132DefineTypeSizeAndWidth("__UINTPTR", TI.getUIntPtrType(), TI, Builder);11331134DefineTypeSizeof("__SIZEOF_DOUBLE__", TI.getDoubleWidth(), TI, Builder);1135DefineTypeSizeof("__SIZEOF_FLOAT__", TI.getFloatWidth(), TI, Builder);1136DefineTypeSizeof("__SIZEOF_INT__", TI.getIntWidth(), TI, Builder);1137DefineTypeSizeof("__SIZEOF_LONG__", TI.getLongWidth(), TI, Builder);1138DefineTypeSizeof("__SIZEOF_LONG_DOUBLE__",TI.getLongDoubleWidth(),TI,Builder);1139DefineTypeSizeof("__SIZEOF_LONG_LONG__", TI.getLongLongWidth(), TI, Builder);1140DefineTypeSizeof("__SIZEOF_POINTER__", TI.getPointerWidth(LangAS::Default),1141TI, Builder);1142DefineTypeSizeof("__SIZEOF_SHORT__", TI.getShortWidth(), TI, Builder);1143DefineTypeSizeof("__SIZEOF_PTRDIFF_T__",1144TI.getTypeWidth(TI.getPtrDiffType(LangAS::Default)), TI,1145Builder);1146DefineTypeSizeof("__SIZEOF_SIZE_T__",1147TI.getTypeWidth(TI.getSizeType()), TI, Builder);1148DefineTypeSizeof("__SIZEOF_WCHAR_T__",1149TI.getTypeWidth(TI.getWCharType()), TI, Builder);1150DefineTypeSizeof("__SIZEOF_WINT_T__",1151TI.getTypeWidth(TI.getWIntType()), TI, Builder);1152if (TI.hasInt128Type())1153DefineTypeSizeof("__SIZEOF_INT128__", 128, TI, Builder);11541155DefineType("__INTMAX_TYPE__", TI.getIntMaxType(), Builder);1156DefineFmt(LangOpts, "__INTMAX", TI.getIntMaxType(), TI, Builder);1157Builder.defineMacro("__INTMAX_C_SUFFIX__",1158TI.getTypeConstantSuffix(TI.getIntMaxType()));1159DefineType("__UINTMAX_TYPE__", TI.getUIntMaxType(), Builder);1160DefineFmt(LangOpts, "__UINTMAX", TI.getUIntMaxType(), TI, Builder);1161Builder.defineMacro("__UINTMAX_C_SUFFIX__",1162TI.getTypeConstantSuffix(TI.getUIntMaxType()));1163DefineType("__PTRDIFF_TYPE__", TI.getPtrDiffType(LangAS::Default), Builder);1164DefineFmt(LangOpts, "__PTRDIFF", TI.getPtrDiffType(LangAS::Default), TI,1165Builder);1166DefineType("__INTPTR_TYPE__", TI.getIntPtrType(), Builder);1167DefineFmt(LangOpts, "__INTPTR", TI.getIntPtrType(), TI, Builder);1168DefineType("__SIZE_TYPE__", TI.getSizeType(), Builder);1169DefineFmt(LangOpts, "__SIZE", TI.getSizeType(), TI, Builder);1170DefineType("__WCHAR_TYPE__", TI.getWCharType(), Builder);1171DefineType("__WINT_TYPE__", TI.getWIntType(), Builder);1172DefineTypeSizeAndWidth("__SIG_ATOMIC", TI.getSigAtomicType(), TI, Builder);1173if (LangOpts.C23)1174DefineType("__CHAR8_TYPE__", TI.UnsignedChar, Builder);1175DefineType("__CHAR16_TYPE__", TI.getChar16Type(), Builder);1176DefineType("__CHAR32_TYPE__", TI.getChar32Type(), Builder);11771178DefineType("__UINTPTR_TYPE__", TI.getUIntPtrType(), Builder);1179DefineFmt(LangOpts, "__UINTPTR", TI.getUIntPtrType(), TI, Builder);11801181// The C standard requires the width of uintptr_t and intptr_t to be the same,1182// per 7.20.2.4p1. Same for intmax_t and uintmax_t, per 7.20.2.5p1.1183assert(TI.getTypeWidth(TI.getUIntPtrType()) ==1184TI.getTypeWidth(TI.getIntPtrType()) &&1185"uintptr_t and intptr_t have different widths?");1186assert(TI.getTypeWidth(TI.getUIntMaxType()) ==1187TI.getTypeWidth(TI.getIntMaxType()) &&1188"uintmax_t and intmax_t have different widths?");11891190if (LangOpts.FixedPoint) {1191// Each unsigned type has the same width as their signed type.1192DefineFixedPointMacros(TI, Builder, "SFRACT", "HR", TI.getShortFractWidth(),1193TI.getShortFractScale(), /*Signed=*/true);1194DefineFixedPointMacros(TI, Builder, "USFRACT", "UHR",1195TI.getShortFractWidth(),1196TI.getUnsignedShortFractScale(), /*Signed=*/false);1197DefineFixedPointMacros(TI, Builder, "FRACT", "R", TI.getFractWidth(),1198TI.getFractScale(), /*Signed=*/true);1199DefineFixedPointMacros(TI, Builder, "UFRACT", "UR", TI.getFractWidth(),1200TI.getUnsignedFractScale(), /*Signed=*/false);1201DefineFixedPointMacros(TI, Builder, "LFRACT", "LR", TI.getLongFractWidth(),1202TI.getLongFractScale(), /*Signed=*/true);1203DefineFixedPointMacros(TI, Builder, "ULFRACT", "ULR",1204TI.getLongFractWidth(),1205TI.getUnsignedLongFractScale(), /*Signed=*/false);1206DefineFixedPointMacros(TI, Builder, "SACCUM", "HK", TI.getShortAccumWidth(),1207TI.getShortAccumScale(), /*Signed=*/true);1208DefineFixedPointMacros(TI, Builder, "USACCUM", "UHK",1209TI.getShortAccumWidth(),1210TI.getUnsignedShortAccumScale(), /*Signed=*/false);1211DefineFixedPointMacros(TI, Builder, "ACCUM", "K", TI.getAccumWidth(),1212TI.getAccumScale(), /*Signed=*/true);1213DefineFixedPointMacros(TI, Builder, "UACCUM", "UK", TI.getAccumWidth(),1214TI.getUnsignedAccumScale(), /*Signed=*/false);1215DefineFixedPointMacros(TI, Builder, "LACCUM", "LK", TI.getLongAccumWidth(),1216TI.getLongAccumScale(), /*Signed=*/true);1217DefineFixedPointMacros(TI, Builder, "ULACCUM", "ULK",1218TI.getLongAccumWidth(),1219TI.getUnsignedLongAccumScale(), /*Signed=*/false);12201221Builder.defineMacro("__SACCUM_IBIT__", Twine(TI.getShortAccumIBits()));1222Builder.defineMacro("__USACCUM_IBIT__",1223Twine(TI.getUnsignedShortAccumIBits()));1224Builder.defineMacro("__ACCUM_IBIT__", Twine(TI.getAccumIBits()));1225Builder.defineMacro("__UACCUM_IBIT__", Twine(TI.getUnsignedAccumIBits()));1226Builder.defineMacro("__LACCUM_IBIT__", Twine(TI.getLongAccumIBits()));1227Builder.defineMacro("__ULACCUM_IBIT__",1228Twine(TI.getUnsignedLongAccumIBits()));1229}12301231if (TI.hasFloat16Type())1232DefineFloatMacros(Builder, "FLT16", &TI.getHalfFormat(), "F16");1233DefineFloatMacros(Builder, "FLT", &TI.getFloatFormat(), "F");1234DefineFloatMacros(Builder, "DBL", &TI.getDoubleFormat(), "");1235DefineFloatMacros(Builder, "LDBL", &TI.getLongDoubleFormat(), "L");12361237// Define a __POINTER_WIDTH__ macro for stdint.h.1238Builder.defineMacro("__POINTER_WIDTH__",1239Twine((int)TI.getPointerWidth(LangAS::Default)));12401241// Define __BIGGEST_ALIGNMENT__ to be compatible with gcc.1242Builder.defineMacro("__BIGGEST_ALIGNMENT__",1243Twine(TI.getSuitableAlign() / TI.getCharWidth()) );12441245if (!LangOpts.CharIsSigned)1246Builder.defineMacro("__CHAR_UNSIGNED__");12471248if (!TargetInfo::isTypeSigned(TI.getWCharType()))1249Builder.defineMacro("__WCHAR_UNSIGNED__");12501251if (!TargetInfo::isTypeSigned(TI.getWIntType()))1252Builder.defineMacro("__WINT_UNSIGNED__");12531254// Define exact-width integer types for stdint.h1255DefineExactWidthIntType(LangOpts, TargetInfo::SignedChar, TI, Builder);12561257if (TI.getShortWidth() > TI.getCharWidth())1258DefineExactWidthIntType(LangOpts, TargetInfo::SignedShort, TI, Builder);12591260if (TI.getIntWidth() > TI.getShortWidth())1261DefineExactWidthIntType(LangOpts, TargetInfo::SignedInt, TI, Builder);12621263if (TI.getLongWidth() > TI.getIntWidth())1264DefineExactWidthIntType(LangOpts, TargetInfo::SignedLong, TI, Builder);12651266if (TI.getLongLongWidth() > TI.getLongWidth())1267DefineExactWidthIntType(LangOpts, TargetInfo::SignedLongLong, TI, Builder);12681269DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedChar, TI, Builder);1270DefineExactWidthIntTypeSize(TargetInfo::UnsignedChar, TI, Builder);1271DefineExactWidthIntTypeSize(TargetInfo::SignedChar, TI, Builder);12721273if (TI.getShortWidth() > TI.getCharWidth()) {1274DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedShort, TI, Builder);1275DefineExactWidthIntTypeSize(TargetInfo::UnsignedShort, TI, Builder);1276DefineExactWidthIntTypeSize(TargetInfo::SignedShort, TI, Builder);1277}12781279if (TI.getIntWidth() > TI.getShortWidth()) {1280DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedInt, TI, Builder);1281DefineExactWidthIntTypeSize(TargetInfo::UnsignedInt, TI, Builder);1282DefineExactWidthIntTypeSize(TargetInfo::SignedInt, TI, Builder);1283}12841285if (TI.getLongWidth() > TI.getIntWidth()) {1286DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedLong, TI, Builder);1287DefineExactWidthIntTypeSize(TargetInfo::UnsignedLong, TI, Builder);1288DefineExactWidthIntTypeSize(TargetInfo::SignedLong, TI, Builder);1289}12901291if (TI.getLongLongWidth() > TI.getLongWidth()) {1292DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedLongLong, TI,1293Builder);1294DefineExactWidthIntTypeSize(TargetInfo::UnsignedLongLong, TI, Builder);1295DefineExactWidthIntTypeSize(TargetInfo::SignedLongLong, TI, Builder);1296}12971298DefineLeastWidthIntType(LangOpts, 8, true, TI, Builder);1299DefineLeastWidthIntType(LangOpts, 8, false, TI, Builder);1300DefineLeastWidthIntType(LangOpts, 16, true, TI, Builder);1301DefineLeastWidthIntType(LangOpts, 16, false, TI, Builder);1302DefineLeastWidthIntType(LangOpts, 32, true, TI, Builder);1303DefineLeastWidthIntType(LangOpts, 32, false, TI, Builder);1304DefineLeastWidthIntType(LangOpts, 64, true, TI, Builder);1305DefineLeastWidthIntType(LangOpts, 64, false, TI, Builder);13061307DefineFastIntType(LangOpts, 8, true, TI, Builder);1308DefineFastIntType(LangOpts, 8, false, TI, Builder);1309DefineFastIntType(LangOpts, 16, true, TI, Builder);1310DefineFastIntType(LangOpts, 16, false, TI, Builder);1311DefineFastIntType(LangOpts, 32, true, TI, Builder);1312DefineFastIntType(LangOpts, 32, false, TI, Builder);1313DefineFastIntType(LangOpts, 64, true, TI, Builder);1314DefineFastIntType(LangOpts, 64, false, TI, Builder);13151316Builder.defineMacro("__USER_LABEL_PREFIX__", TI.getUserLabelPrefix());13171318if (!LangOpts.MathErrno)1319Builder.defineMacro("__NO_MATH_ERRNO__");13201321if (LangOpts.FastMath || LangOpts.FiniteMathOnly)1322Builder.defineMacro("__FINITE_MATH_ONLY__", "1");1323else1324Builder.defineMacro("__FINITE_MATH_ONLY__", "0");13251326if (LangOpts.GNUCVersion) {1327if (LangOpts.GNUInline || LangOpts.CPlusPlus)1328Builder.defineMacro("__GNUC_GNU_INLINE__");1329else1330Builder.defineMacro("__GNUC_STDC_INLINE__");13311332// The value written by __atomic_test_and_set.1333// FIXME: This is target-dependent.1334Builder.defineMacro("__GCC_ATOMIC_TEST_AND_SET_TRUEVAL", "1");1335}13361337// GCC defines these macros in both C and C++ modes despite them being needed1338// mostly for STL implementations in C++.1339auto [Destructive, Constructive] = TI.hardwareInterferenceSizes();1340Builder.defineMacro("__GCC_DESTRUCTIVE_SIZE", Twine(Destructive));1341Builder.defineMacro("__GCC_CONSTRUCTIVE_SIZE", Twine(Constructive));1342// We need to use push_macro to allow users to redefine these macros from the1343// command line with -D and not issue a -Wmacro-redefined warning.1344Builder.append("#pragma push_macro(\"__GCC_DESTRUCTIVE_SIZE\")");1345Builder.append("#pragma push_macro(\"__GCC_CONSTRUCTIVE_SIZE\")");13461347auto addLockFreeMacros = [&](const llvm::Twine &Prefix) {1348// Used by libc++ and libstdc++ to implement ATOMIC_<foo>_LOCK_FREE.1349#define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \1350Builder.defineMacro(Prefix + #TYPE "_LOCK_FREE", \1351getLockFreeValue(TI.get##Type##Width(), TI));1352DEFINE_LOCK_FREE_MACRO(BOOL, Bool);1353DEFINE_LOCK_FREE_MACRO(CHAR, Char);1354// char8_t has the same representation / width as unsigned1355// char in C++ and is a typedef for unsigned char in C231356if (LangOpts.Char8 || LangOpts.C23)1357DEFINE_LOCK_FREE_MACRO(CHAR8_T, Char);1358DEFINE_LOCK_FREE_MACRO(CHAR16_T, Char16);1359DEFINE_LOCK_FREE_MACRO(CHAR32_T, Char32);1360DEFINE_LOCK_FREE_MACRO(WCHAR_T, WChar);1361DEFINE_LOCK_FREE_MACRO(SHORT, Short);1362DEFINE_LOCK_FREE_MACRO(INT, Int);1363DEFINE_LOCK_FREE_MACRO(LONG, Long);1364DEFINE_LOCK_FREE_MACRO(LLONG, LongLong);1365Builder.defineMacro(1366Prefix + "POINTER_LOCK_FREE",1367getLockFreeValue(TI.getPointerWidth(LangAS::Default), TI));1368#undef DEFINE_LOCK_FREE_MACRO1369};1370addLockFreeMacros("__CLANG_ATOMIC_");1371if (LangOpts.GNUCVersion)1372addLockFreeMacros("__GCC_ATOMIC_");13731374if (LangOpts.NoInlineDefine)1375Builder.defineMacro("__NO_INLINE__");13761377if (unsigned PICLevel = LangOpts.PICLevel) {1378Builder.defineMacro("__PIC__", Twine(PICLevel));1379Builder.defineMacro("__pic__", Twine(PICLevel));1380if (LangOpts.PIE) {1381Builder.defineMacro("__PIE__", Twine(PICLevel));1382Builder.defineMacro("__pie__", Twine(PICLevel));1383}1384}13851386// Macros to control C99 numerics and <float.h>1387Builder.defineMacro("__FLT_RADIX__", "2");1388Builder.defineMacro("__DECIMAL_DIG__", "__LDBL_DECIMAL_DIG__");13891390if (LangOpts.getStackProtector() == LangOptions::SSPOn)1391Builder.defineMacro("__SSP__");1392else if (LangOpts.getStackProtector() == LangOptions::SSPStrong)1393Builder.defineMacro("__SSP_STRONG__", "2");1394else if (LangOpts.getStackProtector() == LangOptions::SSPReq)1395Builder.defineMacro("__SSP_ALL__", "3");13961397if (PPOpts.SetUpStaticAnalyzer)1398Builder.defineMacro("__clang_analyzer__");13991400if (LangOpts.FastRelaxedMath)1401Builder.defineMacro("__FAST_RELAXED_MATH__");14021403if (FEOpts.ProgramAction == frontend::RewriteObjC ||1404LangOpts.getGC() != LangOptions::NonGC) {1405Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");1406Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");1407Builder.defineMacro("__autoreleasing", "");1408Builder.defineMacro("__unsafe_unretained", "");1409} else if (LangOpts.ObjC) {1410Builder.defineMacro("__weak", "__attribute__((objc_ownership(weak)))");1411Builder.defineMacro("__strong", "__attribute__((objc_ownership(strong)))");1412Builder.defineMacro("__autoreleasing",1413"__attribute__((objc_ownership(autoreleasing)))");1414Builder.defineMacro("__unsafe_unretained",1415"__attribute__((objc_ownership(none)))");1416}14171418// On Darwin, there are __double_underscored variants of the type1419// nullability qualifiers.1420if (TI.getTriple().isOSDarwin()) {1421Builder.defineMacro("__nonnull", "_Nonnull");1422Builder.defineMacro("__null_unspecified", "_Null_unspecified");1423Builder.defineMacro("__nullable", "_Nullable");1424}14251426// Add a macro to differentiate between regular iOS/tvOS/watchOS targets and1427// the corresponding simulator targets.1428if (TI.getTriple().isOSDarwin() && TI.getTriple().isSimulatorEnvironment())1429Builder.defineMacro("__APPLE_EMBEDDED_SIMULATOR__", "1");14301431// OpenMP definition1432// OpenMP 2.2:1433// In implementations that support a preprocessor, the _OPENMP1434// macro name is defined to have the decimal value yyyymm where1435// yyyy and mm are the year and the month designations of the1436// version of the OpenMP API that the implementation support.1437if (!LangOpts.OpenMPSimd) {1438switch (LangOpts.OpenMP) {1439case 0:1440break;1441case 31:1442Builder.defineMacro("_OPENMP", "201107");1443break;1444case 40:1445Builder.defineMacro("_OPENMP", "201307");1446break;1447case 45:1448Builder.defineMacro("_OPENMP", "201511");1449break;1450case 50:1451Builder.defineMacro("_OPENMP", "201811");1452break;1453case 52:1454Builder.defineMacro("_OPENMP", "202111");1455break;1456default: // case 51:1457// Default version is OpenMP 5.11458Builder.defineMacro("_OPENMP", "202011");1459break;1460}1461}14621463// CUDA device path compilaton1464if (LangOpts.CUDAIsDevice && !LangOpts.HIP) {1465// The CUDA_ARCH value is set for the GPU target specified in the NVPTX1466// backend's target defines.1467Builder.defineMacro("__CUDA_ARCH__");1468}14691470// We need to communicate this to our CUDA/HIP header wrapper, which in turn1471// informs the proper CUDA/HIP headers of this choice.1472if (LangOpts.GPUDeviceApproxTranscendentals)1473Builder.defineMacro("__CLANG_GPU_APPROX_TRANSCENDENTALS__");14741475// Define a macro indicating that the source file is being compiled with a1476// SYCL device compiler which doesn't produce host binary.1477if (LangOpts.SYCLIsDevice) {1478Builder.defineMacro("__SYCL_DEVICE_ONLY__", "1");1479}14801481// OpenCL definitions.1482if (LangOpts.OpenCL) {1483InitializeOpenCLFeatureTestMacros(TI, LangOpts, Builder);14841485if (TI.getTriple().isSPIR() || TI.getTriple().isSPIRV())1486Builder.defineMacro("__IMAGE_SUPPORT__");1487}14881489if (TI.hasInt128Type() && LangOpts.CPlusPlus && LangOpts.GNUMode) {1490// For each extended integer type, g++ defines a macro mapping the1491// index of the type (0 in this case) in some list of extended types1492// to the type.1493Builder.defineMacro("__GLIBCXX_TYPE_INT_N_0", "__int128");1494Builder.defineMacro("__GLIBCXX_BITSIZE_INT_N_0", "128");1495}14961497// ELF targets define __ELF__1498if (TI.getTriple().isOSBinFormatELF())1499Builder.defineMacro("__ELF__");15001501// Target OS macro definitions.1502if (PPOpts.DefineTargetOSMacros) {1503const llvm::Triple &Triple = TI.getTriple();1504#define TARGET_OS(Name, Predicate) \1505Builder.defineMacro(#Name, (Predicate) ? "1" : "0");1506#include "clang/Basic/TargetOSMacros.def"1507#undef TARGET_OS1508}15091510// Get other target #defines.1511TI.getTargetDefines(LangOpts, Builder);1512}15131514static void InitializePGOProfileMacros(const CodeGenOptions &CodeGenOpts,1515MacroBuilder &Builder) {1516if (CodeGenOpts.hasProfileInstr())1517Builder.defineMacro("__LLVM_INSTR_PROFILE_GENERATE");15181519if (CodeGenOpts.hasProfileIRUse() || CodeGenOpts.hasProfileClangUse())1520Builder.defineMacro("__LLVM_INSTR_PROFILE_USE");1521}15221523/// InitializePreprocessor - Initialize the preprocessor getting it and the1524/// environment ready to process a single file.1525void clang::InitializePreprocessor(Preprocessor &PP,1526const PreprocessorOptions &InitOpts,1527const PCHContainerReader &PCHContainerRdr,1528const FrontendOptions &FEOpts,1529const CodeGenOptions &CodeGenOpts) {1530const LangOptions &LangOpts = PP.getLangOpts();1531std::string PredefineBuffer;1532PredefineBuffer.reserve(4080);1533llvm::raw_string_ostream Predefines(PredefineBuffer);1534MacroBuilder Builder(Predefines);15351536// Emit line markers for various builtin sections of the file. The 3 here1537// marks <built-in> as being a system header, which suppresses warnings when1538// the same macro is defined multiple times.1539Builder.append("# 1 \"<built-in>\" 3");15401541// Install things like __POWERPC__, __GNUC__, etc into the macro table.1542if (InitOpts.UsePredefines) {1543// FIXME: This will create multiple definitions for most of the predefined1544// macros. This is not the right way to handle this.1545if ((LangOpts.CUDA || LangOpts.OpenMPIsTargetDevice ||1546LangOpts.SYCLIsDevice) &&1547PP.getAuxTargetInfo())1548InitializePredefinedMacros(*PP.getAuxTargetInfo(), LangOpts, FEOpts,1549PP.getPreprocessorOpts(), Builder);15501551InitializePredefinedMacros(PP.getTargetInfo(), LangOpts, FEOpts,1552PP.getPreprocessorOpts(), Builder);15531554// Install definitions to make Objective-C++ ARC work well with various1555// C++ Standard Library implementations.1556if (LangOpts.ObjC && LangOpts.CPlusPlus &&1557(LangOpts.ObjCAutoRefCount || LangOpts.ObjCWeak)) {1558switch (InitOpts.ObjCXXARCStandardLibrary) {1559case ARCXX_nolib:1560case ARCXX_libcxx:1561break;15621563case ARCXX_libstdcxx:1564AddObjCXXARCLibstdcxxDefines(LangOpts, Builder);1565break;1566}1567}1568}15691570// Even with predefines off, some macros are still predefined.1571// These should all be defined in the preprocessor according to the1572// current language configuration.1573InitializeStandardPredefinedMacros(PP.getTargetInfo(), PP.getLangOpts(),1574FEOpts, Builder);15751576// The PGO instrumentation profile macros are driven by options1577// -fprofile[-instr]-generate/-fcs-profile-generate/-fprofile[-instr]-use,1578// hence they are not guarded by InitOpts.UsePredefines.1579InitializePGOProfileMacros(CodeGenOpts, Builder);15801581// Add on the predefines from the driver. Wrap in a #line directive to report1582// that they come from the command line.1583Builder.append("# 1 \"<command line>\" 1");15841585// Process #define's and #undef's in the order they are given.1586for (unsigned i = 0, e = InitOpts.Macros.size(); i != e; ++i) {1587if (InitOpts.Macros[i].second) // isUndef1588Builder.undefineMacro(InitOpts.Macros[i].first);1589else1590DefineBuiltinMacro(Builder, InitOpts.Macros[i].first,1591PP.getDiagnostics());1592}15931594// Exit the command line and go back to <built-in> (2 is LC_LEAVE).1595Builder.append("# 1 \"<built-in>\" 2");15961597// If -imacros are specified, include them now. These are processed before1598// any -include directives.1599for (unsigned i = 0, e = InitOpts.MacroIncludes.size(); i != e; ++i)1600AddImplicitIncludeMacros(Builder, InitOpts.MacroIncludes[i]);16011602// Process -include-pch/-include-pth directives.1603if (!InitOpts.ImplicitPCHInclude.empty())1604AddImplicitIncludePCH(Builder, PP, PCHContainerRdr,1605InitOpts.ImplicitPCHInclude);16061607// Process -include directives.1608for (unsigned i = 0, e = InitOpts.Includes.size(); i != e; ++i) {1609const std::string &Path = InitOpts.Includes[i];1610AddImplicitInclude(Builder, Path);1611}16121613// Instruct the preprocessor to skip the preamble.1614PP.setSkipMainFilePreamble(InitOpts.PrecompiledPreambleBytes.first,1615InitOpts.PrecompiledPreambleBytes.second);16161617// Copy PredefinedBuffer into the Preprocessor.1618PP.setPredefines(std::move(PredefineBuffer));1619}162016211622