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" 140b57cec5SDimitry Andric #include "clang/Basic/MacroBuilder.h" 150b57cec5SDimitry Andric #include "clang/Basic/SourceManager.h" 160b57cec5SDimitry Andric #include "clang/Basic/SyncScope.h" 170b57cec5SDimitry Andric #include "clang/Basic/TargetInfo.h" 180b57cec5SDimitry Andric #include "clang/Basic/Version.h" 190b57cec5SDimitry Andric #include "clang/Frontend/FrontendDiagnostic.h" 200b57cec5SDimitry Andric #include "clang/Frontend/FrontendOptions.h" 210b57cec5SDimitry Andric #include "clang/Frontend/Utils.h" 220b57cec5SDimitry Andric #include "clang/Lex/HeaderSearch.h" 230b57cec5SDimitry Andric #include "clang/Lex/Preprocessor.h" 240b57cec5SDimitry Andric #include "clang/Lex/PreprocessorOptions.h" 250b57cec5SDimitry Andric #include "clang/Serialization/ASTReader.h" 260b57cec5SDimitry Andric #include "llvm/ADT/APFloat.h" 27a7dea167SDimitry Andric #include "llvm/IR/DataLayout.h" 280b57cec5SDimitry Andric using namespace clang; 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric static bool MacroBodyEndsInBackslash(StringRef MacroBody) { 310b57cec5SDimitry Andric while (!MacroBody.empty() && isWhitespace(MacroBody.back())) 320b57cec5SDimitry Andric MacroBody = MacroBody.drop_back(); 330b57cec5SDimitry Andric return !MacroBody.empty() && MacroBody.back() == '\\'; 340b57cec5SDimitry Andric } 350b57cec5SDimitry Andric 360b57cec5SDimitry Andric // Append a #define line to Buf for Macro. Macro should be of the form XXX, 370b57cec5SDimitry Andric // in which case we emit "#define XXX 1" or "XXX=Y z W" in which case we emit 380b57cec5SDimitry Andric // "#define XXX Y z W". To get a #define with no value, use "XXX=". 390b57cec5SDimitry Andric static void DefineBuiltinMacro(MacroBuilder &Builder, StringRef Macro, 400b57cec5SDimitry Andric DiagnosticsEngine &Diags) { 410b57cec5SDimitry Andric std::pair<StringRef, StringRef> MacroPair = Macro.split('='); 420b57cec5SDimitry Andric StringRef MacroName = MacroPair.first; 430b57cec5SDimitry Andric StringRef MacroBody = MacroPair.second; 440b57cec5SDimitry Andric if (MacroName.size() != Macro.size()) { 450b57cec5SDimitry Andric // Per GCC -D semantics, the macro ends at \n if it exists. 460b57cec5SDimitry Andric StringRef::size_type End = MacroBody.find_first_of("\n\r"); 470b57cec5SDimitry Andric if (End != StringRef::npos) 480b57cec5SDimitry Andric Diags.Report(diag::warn_fe_macro_contains_embedded_newline) 490b57cec5SDimitry Andric << MacroName; 500b57cec5SDimitry Andric MacroBody = MacroBody.substr(0, End); 510b57cec5SDimitry Andric // We handle macro bodies which end in a backslash by appending an extra 520b57cec5SDimitry Andric // backslash+newline. This makes sure we don't accidentally treat the 530b57cec5SDimitry Andric // backslash as a line continuation marker. 540b57cec5SDimitry Andric if (MacroBodyEndsInBackslash(MacroBody)) 550b57cec5SDimitry Andric Builder.defineMacro(MacroName, Twine(MacroBody) + "\\\n"); 560b57cec5SDimitry Andric else 570b57cec5SDimitry Andric Builder.defineMacro(MacroName, MacroBody); 580b57cec5SDimitry Andric } else { 590b57cec5SDimitry Andric // Push "macroname 1". 600b57cec5SDimitry Andric Builder.defineMacro(Macro); 610b57cec5SDimitry Andric } 620b57cec5SDimitry Andric } 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric /// AddImplicitInclude - Add an implicit \#include of the specified file to the 650b57cec5SDimitry Andric /// predefines buffer. 660b57cec5SDimitry Andric /// As these includes are generated by -include arguments the header search 670b57cec5SDimitry Andric /// logic is going to search relatively to the current working directory. 680b57cec5SDimitry Andric static void AddImplicitInclude(MacroBuilder &Builder, StringRef File) { 690b57cec5SDimitry Andric Builder.append(Twine("#include \"") + File + "\""); 700b57cec5SDimitry Andric } 710b57cec5SDimitry Andric 720b57cec5SDimitry Andric static void AddImplicitIncludeMacros(MacroBuilder &Builder, StringRef File) { 730b57cec5SDimitry Andric Builder.append(Twine("#__include_macros \"") + File + "\""); 740b57cec5SDimitry Andric // Marker token to stop the __include_macros fetch loop. 750b57cec5SDimitry Andric Builder.append("##"); // ##? 760b57cec5SDimitry Andric } 770b57cec5SDimitry Andric 780b57cec5SDimitry Andric /// Add an implicit \#include using the original file used to generate 790b57cec5SDimitry Andric /// a PCH file. 800b57cec5SDimitry Andric static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, 810b57cec5SDimitry Andric const PCHContainerReader &PCHContainerRdr, 820b57cec5SDimitry Andric StringRef ImplicitIncludePCH) { 835ffd83dbSDimitry Andric std::string OriginalFile = ASTReader::getOriginalSourceFile( 845ffd83dbSDimitry Andric std::string(ImplicitIncludePCH), PP.getFileManager(), PCHContainerRdr, 855ffd83dbSDimitry Andric PP.getDiagnostics()); 860b57cec5SDimitry Andric if (OriginalFile.empty()) 870b57cec5SDimitry Andric return; 880b57cec5SDimitry Andric 890b57cec5SDimitry Andric AddImplicitInclude(Builder, OriginalFile); 900b57cec5SDimitry Andric } 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric /// PickFP - This is used to pick a value based on the FP semantics of the 930b57cec5SDimitry Andric /// specified FP model. 940b57cec5SDimitry Andric template <typename T> 950b57cec5SDimitry Andric static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, 960b57cec5SDimitry Andric T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, 970b57cec5SDimitry Andric T IEEEQuadVal) { 980b57cec5SDimitry Andric if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf()) 990b57cec5SDimitry Andric return IEEEHalfVal; 1000b57cec5SDimitry Andric if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle()) 1010b57cec5SDimitry Andric return IEEESingleVal; 1020b57cec5SDimitry Andric if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEdouble()) 1030b57cec5SDimitry Andric return IEEEDoubleVal; 1040b57cec5SDimitry Andric if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::x87DoubleExtended()) 1050b57cec5SDimitry Andric return X87DoubleExtendedVal; 1060b57cec5SDimitry Andric if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble()) 1070b57cec5SDimitry Andric return PPCDoubleDoubleVal; 1080b57cec5SDimitry Andric assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad()); 1090b57cec5SDimitry Andric return IEEEQuadVal; 1100b57cec5SDimitry Andric } 1110b57cec5SDimitry Andric 1120b57cec5SDimitry Andric static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, 1130b57cec5SDimitry Andric const llvm::fltSemantics *Sem, StringRef Ext) { 1140b57cec5SDimitry Andric const char *DenormMin, *Epsilon, *Max, *Min; 1150b57cec5SDimitry Andric DenormMin = PickFP(Sem, "5.9604644775390625e-8", "1.40129846e-45", 1160b57cec5SDimitry Andric "4.9406564584124654e-324", "3.64519953188247460253e-4951", 1170b57cec5SDimitry Andric "4.94065645841246544176568792868221e-324", 1180b57cec5SDimitry Andric "6.47517511943802511092443895822764655e-4966"); 1190b57cec5SDimitry Andric int Digits = PickFP(Sem, 3, 6, 15, 18, 31, 33); 1200b57cec5SDimitry Andric int DecimalDigits = PickFP(Sem, 5, 9, 17, 21, 33, 36); 1210b57cec5SDimitry Andric Epsilon = PickFP(Sem, "9.765625e-4", "1.19209290e-7", 1220b57cec5SDimitry Andric "2.2204460492503131e-16", "1.08420217248550443401e-19", 1230b57cec5SDimitry Andric "4.94065645841246544176568792868221e-324", 1240b57cec5SDimitry Andric "1.92592994438723585305597794258492732e-34"); 1250b57cec5SDimitry Andric int MantissaDigits = PickFP(Sem, 11, 24, 53, 64, 106, 113); 1260b57cec5SDimitry Andric int Min10Exp = PickFP(Sem, -4, -37, -307, -4931, -291, -4931); 1270b57cec5SDimitry Andric int Max10Exp = PickFP(Sem, 4, 38, 308, 4932, 308, 4932); 1280b57cec5SDimitry Andric int MinExp = PickFP(Sem, -13, -125, -1021, -16381, -968, -16381); 1290b57cec5SDimitry Andric int MaxExp = PickFP(Sem, 16, 128, 1024, 16384, 1024, 16384); 1300b57cec5SDimitry Andric Min = PickFP(Sem, "6.103515625e-5", "1.17549435e-38", "2.2250738585072014e-308", 1310b57cec5SDimitry Andric "3.36210314311209350626e-4932", 1320b57cec5SDimitry Andric "2.00416836000897277799610805135016e-292", 1330b57cec5SDimitry Andric "3.36210314311209350626267781732175260e-4932"); 1340b57cec5SDimitry Andric Max = PickFP(Sem, "6.5504e+4", "3.40282347e+38", "1.7976931348623157e+308", 1350b57cec5SDimitry Andric "1.18973149535723176502e+4932", 1360b57cec5SDimitry Andric "1.79769313486231580793728971405301e+308", 1370b57cec5SDimitry Andric "1.18973149535723176508575932662800702e+4932"); 1380b57cec5SDimitry Andric 1390b57cec5SDimitry Andric SmallString<32> DefPrefix; 1400b57cec5SDimitry Andric DefPrefix = "__"; 1410b57cec5SDimitry Andric DefPrefix += Prefix; 1420b57cec5SDimitry Andric DefPrefix += "_"; 1430b57cec5SDimitry Andric 1440b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "DENORM_MIN__", Twine(DenormMin)+Ext); 1450b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "HAS_DENORM__"); 1460b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "DIG__", Twine(Digits)); 1470b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "DECIMAL_DIG__", Twine(DecimalDigits)); 1480b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "EPSILON__", Twine(Epsilon)+Ext); 1490b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "HAS_INFINITY__"); 1500b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "HAS_QUIET_NAN__"); 1510b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "MANT_DIG__", Twine(MantissaDigits)); 1520b57cec5SDimitry Andric 1530b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "MAX_10_EXP__", Twine(Max10Exp)); 1540b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "MAX_EXP__", Twine(MaxExp)); 1550b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "MAX__", Twine(Max)+Ext); 1560b57cec5SDimitry Andric 1570b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "MIN_10_EXP__","("+Twine(Min10Exp)+")"); 1580b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "MIN_EXP__", "("+Twine(MinExp)+")"); 1590b57cec5SDimitry Andric Builder.defineMacro(DefPrefix + "MIN__", Twine(Min)+Ext); 1600b57cec5SDimitry Andric } 1610b57cec5SDimitry Andric 1620b57cec5SDimitry Andric 1630b57cec5SDimitry Andric /// DefineTypeSize - Emit a macro to the predefines buffer that declares a macro 1640b57cec5SDimitry Andric /// named MacroName with the max value for a type with width 'TypeWidth' a 1650b57cec5SDimitry Andric /// signedness of 'isSigned' and with a value suffix of 'ValSuffix' (e.g. LL). 1660b57cec5SDimitry Andric static void DefineTypeSize(const Twine &MacroName, unsigned TypeWidth, 1670b57cec5SDimitry Andric StringRef ValSuffix, bool isSigned, 1680b57cec5SDimitry Andric MacroBuilder &Builder) { 1690b57cec5SDimitry Andric llvm::APInt MaxVal = isSigned ? llvm::APInt::getSignedMaxValue(TypeWidth) 1700b57cec5SDimitry Andric : llvm::APInt::getMaxValue(TypeWidth); 1710b57cec5SDimitry Andric Builder.defineMacro(MacroName, MaxVal.toString(10, isSigned) + ValSuffix); 1720b57cec5SDimitry Andric } 1730b57cec5SDimitry Andric 1740b57cec5SDimitry Andric /// DefineTypeSize - An overloaded helper that uses TargetInfo to determine 1750b57cec5SDimitry Andric /// the width, suffix, and signedness of the given type 1760b57cec5SDimitry Andric static void DefineTypeSize(const Twine &MacroName, TargetInfo::IntType Ty, 1770b57cec5SDimitry Andric const TargetInfo &TI, MacroBuilder &Builder) { 1780b57cec5SDimitry Andric DefineTypeSize(MacroName, TI.getTypeWidth(Ty), TI.getTypeConstantSuffix(Ty), 1790b57cec5SDimitry Andric TI.isTypeSigned(Ty), Builder); 1800b57cec5SDimitry Andric } 1810b57cec5SDimitry Andric 1820b57cec5SDimitry Andric static void DefineFmt(const Twine &Prefix, TargetInfo::IntType Ty, 1830b57cec5SDimitry Andric const TargetInfo &TI, MacroBuilder &Builder) { 1840b57cec5SDimitry Andric bool IsSigned = TI.isTypeSigned(Ty); 1850b57cec5SDimitry Andric StringRef FmtModifier = TI.getTypeFormatModifier(Ty); 1860b57cec5SDimitry Andric for (const char *Fmt = IsSigned ? "di" : "ouxX"; *Fmt; ++Fmt) { 1870b57cec5SDimitry Andric Builder.defineMacro(Prefix + "_FMT" + Twine(*Fmt) + "__", 1880b57cec5SDimitry Andric Twine("\"") + FmtModifier + Twine(*Fmt) + "\""); 1890b57cec5SDimitry Andric } 1900b57cec5SDimitry Andric } 1910b57cec5SDimitry Andric 1920b57cec5SDimitry Andric static void DefineType(const Twine &MacroName, TargetInfo::IntType Ty, 1930b57cec5SDimitry Andric MacroBuilder &Builder) { 1940b57cec5SDimitry Andric Builder.defineMacro(MacroName, TargetInfo::getTypeName(Ty)); 1950b57cec5SDimitry Andric } 1960b57cec5SDimitry Andric 1970b57cec5SDimitry Andric static void DefineTypeWidth(StringRef MacroName, TargetInfo::IntType Ty, 1980b57cec5SDimitry Andric const TargetInfo &TI, MacroBuilder &Builder) { 1990b57cec5SDimitry Andric Builder.defineMacro(MacroName, Twine(TI.getTypeWidth(Ty))); 2000b57cec5SDimitry Andric } 2010b57cec5SDimitry Andric 2020b57cec5SDimitry Andric static void DefineTypeSizeof(StringRef MacroName, unsigned BitWidth, 2030b57cec5SDimitry Andric const TargetInfo &TI, MacroBuilder &Builder) { 2040b57cec5SDimitry Andric Builder.defineMacro(MacroName, 2050b57cec5SDimitry Andric Twine(BitWidth / TI.getCharWidth())); 2060b57cec5SDimitry Andric } 2070b57cec5SDimitry Andric 2080b57cec5SDimitry Andric static void DefineExactWidthIntType(TargetInfo::IntType Ty, 2090b57cec5SDimitry Andric const TargetInfo &TI, 2100b57cec5SDimitry Andric MacroBuilder &Builder) { 2110b57cec5SDimitry Andric int TypeWidth = TI.getTypeWidth(Ty); 2120b57cec5SDimitry Andric bool IsSigned = TI.isTypeSigned(Ty); 2130b57cec5SDimitry Andric 2140b57cec5SDimitry Andric // Use the target specified int64 type, when appropriate, so that [u]int64_t 2150b57cec5SDimitry Andric // ends up being defined in terms of the correct type. 2160b57cec5SDimitry Andric if (TypeWidth == 64) 2170b57cec5SDimitry Andric Ty = IsSigned ? TI.getInt64Type() : TI.getUInt64Type(); 2180b57cec5SDimitry Andric 2190b57cec5SDimitry Andric const char *Prefix = IsSigned ? "__INT" : "__UINT"; 2200b57cec5SDimitry Andric 2210b57cec5SDimitry Andric DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder); 2220b57cec5SDimitry Andric DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder); 2230b57cec5SDimitry Andric 2240b57cec5SDimitry Andric StringRef ConstSuffix(TI.getTypeConstantSuffix(Ty)); 2250b57cec5SDimitry Andric Builder.defineMacro(Prefix + Twine(TypeWidth) + "_C_SUFFIX__", ConstSuffix); 2260b57cec5SDimitry Andric } 2270b57cec5SDimitry Andric 2280b57cec5SDimitry Andric static void DefineExactWidthIntTypeSize(TargetInfo::IntType Ty, 2290b57cec5SDimitry Andric const TargetInfo &TI, 2300b57cec5SDimitry Andric MacroBuilder &Builder) { 2310b57cec5SDimitry Andric int TypeWidth = TI.getTypeWidth(Ty); 2320b57cec5SDimitry Andric bool IsSigned = TI.isTypeSigned(Ty); 2330b57cec5SDimitry Andric 2340b57cec5SDimitry Andric // Use the target specified int64 type, when appropriate, so that [u]int64_t 2350b57cec5SDimitry Andric // ends up being defined in terms of the correct type. 2360b57cec5SDimitry Andric if (TypeWidth == 64) 2370b57cec5SDimitry Andric Ty = IsSigned ? TI.getInt64Type() : TI.getUInt64Type(); 2380b57cec5SDimitry Andric 2390b57cec5SDimitry Andric const char *Prefix = IsSigned ? "__INT" : "__UINT"; 2400b57cec5SDimitry Andric DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder); 2410b57cec5SDimitry Andric } 2420b57cec5SDimitry Andric 2430b57cec5SDimitry Andric static void DefineLeastWidthIntType(unsigned TypeWidth, bool IsSigned, 2440b57cec5SDimitry Andric const TargetInfo &TI, 2450b57cec5SDimitry Andric MacroBuilder &Builder) { 2460b57cec5SDimitry Andric TargetInfo::IntType Ty = TI.getLeastIntTypeByWidth(TypeWidth, IsSigned); 2470b57cec5SDimitry Andric if (Ty == TargetInfo::NoInt) 2480b57cec5SDimitry Andric return; 2490b57cec5SDimitry Andric 2500b57cec5SDimitry Andric const char *Prefix = IsSigned ? "__INT_LEAST" : "__UINT_LEAST"; 2510b57cec5SDimitry Andric DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder); 2520b57cec5SDimitry Andric DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder); 2530b57cec5SDimitry Andric DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder); 2540b57cec5SDimitry Andric } 2550b57cec5SDimitry Andric 2560b57cec5SDimitry Andric static void DefineFastIntType(unsigned TypeWidth, bool IsSigned, 2570b57cec5SDimitry Andric const TargetInfo &TI, MacroBuilder &Builder) { 2580b57cec5SDimitry Andric // stdint.h currently defines the fast int types as equivalent to the least 2590b57cec5SDimitry Andric // types. 2600b57cec5SDimitry Andric TargetInfo::IntType Ty = TI.getLeastIntTypeByWidth(TypeWidth, IsSigned); 2610b57cec5SDimitry Andric if (Ty == TargetInfo::NoInt) 2620b57cec5SDimitry Andric return; 2630b57cec5SDimitry Andric 2640b57cec5SDimitry Andric const char *Prefix = IsSigned ? "__INT_FAST" : "__UINT_FAST"; 2650b57cec5SDimitry Andric DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder); 2660b57cec5SDimitry Andric DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder); 2670b57cec5SDimitry Andric 2680b57cec5SDimitry Andric DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder); 2690b57cec5SDimitry Andric } 2700b57cec5SDimitry Andric 2710b57cec5SDimitry Andric 2720b57cec5SDimitry Andric /// Get the value the ATOMIC_*_LOCK_FREE macro should have for a type with 2730b57cec5SDimitry Andric /// the specified properties. 2740b57cec5SDimitry Andric static const char *getLockFreeValue(unsigned TypeWidth, unsigned TypeAlign, 2750b57cec5SDimitry Andric unsigned InlineWidth) { 2760b57cec5SDimitry Andric // Fully-aligned, power-of-2 sizes no larger than the inline 2770b57cec5SDimitry Andric // width will be inlined as lock-free operations. 2780b57cec5SDimitry Andric if (TypeWidth == TypeAlign && (TypeWidth & (TypeWidth - 1)) == 0 && 2790b57cec5SDimitry Andric TypeWidth <= InlineWidth) 2800b57cec5SDimitry Andric return "2"; // "always lock free" 2810b57cec5SDimitry Andric // We cannot be certain what operations the lib calls might be 2820b57cec5SDimitry Andric // able to implement as lock-free on future processors. 2830b57cec5SDimitry Andric return "1"; // "sometimes lock free" 2840b57cec5SDimitry Andric } 2850b57cec5SDimitry Andric 2860b57cec5SDimitry Andric /// Add definitions required for a smooth interaction between 2870b57cec5SDimitry Andric /// Objective-C++ automated reference counting and libstdc++ (4.2). 2880b57cec5SDimitry Andric static void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts, 2890b57cec5SDimitry Andric MacroBuilder &Builder) { 2900b57cec5SDimitry Andric Builder.defineMacro("_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR"); 2910b57cec5SDimitry Andric 2920b57cec5SDimitry Andric std::string Result; 2930b57cec5SDimitry Andric { 2940b57cec5SDimitry Andric // Provide specializations for the __is_scalar type trait so that 2950b57cec5SDimitry Andric // lifetime-qualified objects are not considered "scalar" types, which 2960b57cec5SDimitry Andric // libstdc++ uses as an indicator of the presence of trivial copy, assign, 2970b57cec5SDimitry Andric // default-construct, and destruct semantics (none of which hold for 2980b57cec5SDimitry Andric // lifetime-qualified objects in ARC). 2990b57cec5SDimitry Andric llvm::raw_string_ostream Out(Result); 3000b57cec5SDimitry Andric 3010b57cec5SDimitry Andric Out << "namespace std {\n" 3020b57cec5SDimitry Andric << "\n" 3030b57cec5SDimitry Andric << "struct __true_type;\n" 3040b57cec5SDimitry Andric << "struct __false_type;\n" 3050b57cec5SDimitry Andric << "\n"; 3060b57cec5SDimitry Andric 3070b57cec5SDimitry Andric Out << "template<typename _Tp> struct __is_scalar;\n" 3080b57cec5SDimitry Andric << "\n"; 3090b57cec5SDimitry Andric 3100b57cec5SDimitry Andric if (LangOpts.ObjCAutoRefCount) { 3110b57cec5SDimitry Andric Out << "template<typename _Tp>\n" 3120b57cec5SDimitry Andric << "struct __is_scalar<__attribute__((objc_ownership(strong))) _Tp> {\n" 3130b57cec5SDimitry Andric << " enum { __value = 0 };\n" 3140b57cec5SDimitry Andric << " typedef __false_type __type;\n" 3150b57cec5SDimitry Andric << "};\n" 3160b57cec5SDimitry Andric << "\n"; 3170b57cec5SDimitry Andric } 3180b57cec5SDimitry Andric 3190b57cec5SDimitry Andric if (LangOpts.ObjCWeak) { 3200b57cec5SDimitry Andric Out << "template<typename _Tp>\n" 3210b57cec5SDimitry Andric << "struct __is_scalar<__attribute__((objc_ownership(weak))) _Tp> {\n" 3220b57cec5SDimitry Andric << " enum { __value = 0 };\n" 3230b57cec5SDimitry Andric << " typedef __false_type __type;\n" 3240b57cec5SDimitry Andric << "};\n" 3250b57cec5SDimitry Andric << "\n"; 3260b57cec5SDimitry Andric } 3270b57cec5SDimitry Andric 3280b57cec5SDimitry Andric if (LangOpts.ObjCAutoRefCount) { 3290b57cec5SDimitry Andric Out << "template<typename _Tp>\n" 3300b57cec5SDimitry Andric << "struct __is_scalar<__attribute__((objc_ownership(autoreleasing)))" 3310b57cec5SDimitry Andric << " _Tp> {\n" 3320b57cec5SDimitry Andric << " enum { __value = 0 };\n" 3330b57cec5SDimitry Andric << " typedef __false_type __type;\n" 3340b57cec5SDimitry Andric << "};\n" 3350b57cec5SDimitry Andric << "\n"; 3360b57cec5SDimitry Andric } 3370b57cec5SDimitry Andric 3380b57cec5SDimitry Andric Out << "}\n"; 3390b57cec5SDimitry Andric } 3400b57cec5SDimitry Andric Builder.append(Result); 3410b57cec5SDimitry Andric } 3420b57cec5SDimitry Andric 3430b57cec5SDimitry Andric static void InitializeStandardPredefinedMacros(const TargetInfo &TI, 3440b57cec5SDimitry Andric const LangOptions &LangOpts, 3450b57cec5SDimitry Andric const FrontendOptions &FEOpts, 3460b57cec5SDimitry Andric MacroBuilder &Builder) { 34747395794SDimitry Andric // C++ [cpp.predefined]p1: 34847395794SDimitry Andric // The following macro names shall be defined by the implementation: 34947395794SDimitry Andric 35047395794SDimitry Andric // -- __STDC__ 35147395794SDimitry Andric // [C++] Whether __STDC__ is predefined and if so, what its value is, 35247395794SDimitry Andric // are implementation-defined. 35347395794SDimitry Andric // (Removed in C++20.) 3540b57cec5SDimitry Andric if (!LangOpts.MSVCCompat && !LangOpts.TraditionalCPP) 3550b57cec5SDimitry Andric Builder.defineMacro("__STDC__"); 35647395794SDimitry Andric // -- __STDC_HOSTED__ 35747395794SDimitry Andric // The integer literal 1 if the implementation is a hosted 35847395794SDimitry Andric // implementation or the integer literal 0 if it is not. 3590b57cec5SDimitry Andric if (LangOpts.Freestanding) 3600b57cec5SDimitry Andric Builder.defineMacro("__STDC_HOSTED__", "0"); 3610b57cec5SDimitry Andric else 3620b57cec5SDimitry Andric Builder.defineMacro("__STDC_HOSTED__"); 3630b57cec5SDimitry Andric 36447395794SDimitry Andric // -- __STDC_VERSION__ 36547395794SDimitry Andric // [C++] Whether __STDC_VERSION__ is predefined and if so, what its 36647395794SDimitry Andric // value is, are implementation-defined. 36747395794SDimitry Andric // (Removed in C++20.) 3680b57cec5SDimitry Andric if (!LangOpts.CPlusPlus) { 3690b57cec5SDimitry Andric if (LangOpts.C17) 3700b57cec5SDimitry Andric Builder.defineMacro("__STDC_VERSION__", "201710L"); 3710b57cec5SDimitry Andric else if (LangOpts.C11) 3720b57cec5SDimitry Andric Builder.defineMacro("__STDC_VERSION__", "201112L"); 3730b57cec5SDimitry Andric else if (LangOpts.C99) 3740b57cec5SDimitry Andric Builder.defineMacro("__STDC_VERSION__", "199901L"); 3750b57cec5SDimitry Andric else if (!LangOpts.GNUMode && LangOpts.Digraphs) 3760b57cec5SDimitry Andric Builder.defineMacro("__STDC_VERSION__", "199409L"); 3770b57cec5SDimitry Andric } else { 37847395794SDimitry Andric // -- __cplusplus 379e8d8bef9SDimitry Andric // FIXME: Use correct value for C++23. 380e8d8bef9SDimitry Andric if (LangOpts.CPlusPlus2b) 381e8d8bef9SDimitry Andric Builder.defineMacro("__cplusplus", "202101L"); 38247395794SDimitry Andric // [C++20] The integer literal 202002L. 383e8d8bef9SDimitry Andric else if (LangOpts.CPlusPlus20) 38447395794SDimitry Andric Builder.defineMacro("__cplusplus", "202002L"); 38547395794SDimitry Andric // [C++17] The integer literal 201703L. 3860b57cec5SDimitry Andric else if (LangOpts.CPlusPlus17) 3870b57cec5SDimitry Andric Builder.defineMacro("__cplusplus", "201703L"); 38847395794SDimitry Andric // [C++14] The name __cplusplus is defined to the value 201402L when 38947395794SDimitry Andric // compiling a C++ translation unit. 3900b57cec5SDimitry Andric else if (LangOpts.CPlusPlus14) 3910b57cec5SDimitry Andric Builder.defineMacro("__cplusplus", "201402L"); 39247395794SDimitry Andric // [C++11] The name __cplusplus is defined to the value 201103L when 39347395794SDimitry Andric // compiling a C++ translation unit. 3940b57cec5SDimitry Andric else if (LangOpts.CPlusPlus11) 3950b57cec5SDimitry Andric Builder.defineMacro("__cplusplus", "201103L"); 39647395794SDimitry Andric // [C++03] The name __cplusplus is defined to the value 199711L when 39747395794SDimitry Andric // compiling a C++ translation unit. 3980b57cec5SDimitry Andric else 3990b57cec5SDimitry Andric Builder.defineMacro("__cplusplus", "199711L"); 4000b57cec5SDimitry Andric 40147395794SDimitry Andric // -- __STDCPP_DEFAULT_NEW_ALIGNMENT__ 40247395794SDimitry Andric // [C++17] An integer literal of type std::size_t whose value is the 40347395794SDimitry Andric // alignment guaranteed by a call to operator new(std::size_t) 4040b57cec5SDimitry Andric // 4050b57cec5SDimitry Andric // We provide this in all language modes, since it seems generally useful. 4060b57cec5SDimitry Andric Builder.defineMacro("__STDCPP_DEFAULT_NEW_ALIGNMENT__", 4070b57cec5SDimitry Andric Twine(TI.getNewAlign() / TI.getCharWidth()) + 4080b57cec5SDimitry Andric TI.getTypeConstantSuffix(TI.getSizeType())); 409e8d8bef9SDimitry Andric 410e8d8bef9SDimitry Andric // -- __STDCPP_THREADS__ 411e8d8bef9SDimitry Andric // Defined, and has the value integer literal 1, if and only if a 412e8d8bef9SDimitry Andric // program can have more than one thread of execution. 413e8d8bef9SDimitry Andric if (LangOpts.getThreadModel() == LangOptions::ThreadModelKind::POSIX) 414e8d8bef9SDimitry Andric Builder.defineMacro("__STDCPP_THREADS__", "1"); 4150b57cec5SDimitry Andric } 4160b57cec5SDimitry Andric 4170b57cec5SDimitry Andric // In C11 these are environment macros. In C++11 they are only defined 4180b57cec5SDimitry Andric // as part of <cuchar>. To prevent breakage when mixing C and C++ 4190b57cec5SDimitry Andric // code, define these macros unconditionally. We can define them 4200b57cec5SDimitry Andric // unconditionally, as Clang always uses UTF-16 and UTF-32 for 16-bit 4210b57cec5SDimitry Andric // and 32-bit character literals. 4220b57cec5SDimitry Andric Builder.defineMacro("__STDC_UTF_16__", "1"); 4230b57cec5SDimitry Andric Builder.defineMacro("__STDC_UTF_32__", "1"); 4240b57cec5SDimitry Andric 4250b57cec5SDimitry Andric if (LangOpts.ObjC) 4260b57cec5SDimitry Andric Builder.defineMacro("__OBJC__"); 4270b57cec5SDimitry Andric 4280b57cec5SDimitry Andric // OpenCL v1.0/1.1 s6.9, v1.2/2.0 s6.10: Preprocessor Directives and Macros. 4290b57cec5SDimitry Andric if (LangOpts.OpenCL) { 4300b57cec5SDimitry Andric if (LangOpts.CPlusPlus) { 4310b57cec5SDimitry Andric if (LangOpts.OpenCLCPlusPlusVersion == 100) 4320b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_CPP_VERSION__", "100"); 4330b57cec5SDimitry Andric else 4340b57cec5SDimitry Andric llvm_unreachable("Unsupported C++ version for OpenCL"); 4350b57cec5SDimitry Andric Builder.defineMacro("__CL_CPP_VERSION_1_0__", "100"); 4360b57cec5SDimitry Andric } else { 4370b57cec5SDimitry Andric // OpenCL v1.0 and v1.1 do not have a predefined macro to indicate the 4380b57cec5SDimitry Andric // language standard with which the program is compiled. __OPENCL_VERSION__ 4390b57cec5SDimitry Andric // is for the OpenCL version supported by the OpenCL device, which is not 4400b57cec5SDimitry Andric // necessarily the language standard with which the program is compiled. 4410b57cec5SDimitry Andric // A shared OpenCL header file requires a macro to indicate the language 4420b57cec5SDimitry Andric // standard. As a workaround, __OPENCL_C_VERSION__ is defined for 4430b57cec5SDimitry Andric // OpenCL v1.0 and v1.1. 4440b57cec5SDimitry Andric switch (LangOpts.OpenCLVersion) { 4450b57cec5SDimitry Andric case 100: 4460b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_C_VERSION__", "100"); 4470b57cec5SDimitry Andric break; 4480b57cec5SDimitry Andric case 110: 4490b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_C_VERSION__", "110"); 4500b57cec5SDimitry Andric break; 4510b57cec5SDimitry Andric case 120: 4520b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_C_VERSION__", "120"); 4530b57cec5SDimitry Andric break; 4540b57cec5SDimitry Andric case 200: 4550b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_C_VERSION__", "200"); 4560b57cec5SDimitry Andric break; 457e8d8bef9SDimitry Andric case 300: 458e8d8bef9SDimitry Andric Builder.defineMacro("__OPENCL_C_VERSION__", "300"); 459e8d8bef9SDimitry Andric break; 4600b57cec5SDimitry Andric default: 4610b57cec5SDimitry Andric llvm_unreachable("Unsupported OpenCL version"); 4620b57cec5SDimitry Andric } 4630b57cec5SDimitry Andric } 4640b57cec5SDimitry Andric Builder.defineMacro("CL_VERSION_1_0", "100"); 4650b57cec5SDimitry Andric Builder.defineMacro("CL_VERSION_1_1", "110"); 4660b57cec5SDimitry Andric Builder.defineMacro("CL_VERSION_1_2", "120"); 4670b57cec5SDimitry Andric Builder.defineMacro("CL_VERSION_2_0", "200"); 468e8d8bef9SDimitry Andric Builder.defineMacro("CL_VERSION_3_0", "300"); 4690b57cec5SDimitry Andric 4700b57cec5SDimitry Andric if (TI.isLittleEndian()) 4710b57cec5SDimitry Andric Builder.defineMacro("__ENDIAN_LITTLE__"); 4720b57cec5SDimitry Andric 4730b57cec5SDimitry Andric if (LangOpts.FastRelaxedMath) 4740b57cec5SDimitry Andric Builder.defineMacro("__FAST_RELAXED_MATH__"); 4750b57cec5SDimitry Andric } 4765ffd83dbSDimitry Andric 4775ffd83dbSDimitry Andric if (LangOpts.SYCL) { 4785ffd83dbSDimitry Andric // SYCL Version is set to a value when building SYCL applications 479e8d8bef9SDimitry Andric if (LangOpts.getSYCLVersion() == LangOptions::SYCL_2017) 4805ffd83dbSDimitry Andric Builder.defineMacro("CL_SYCL_LANGUAGE_VERSION", "121"); 4815ffd83dbSDimitry Andric } 4825ffd83dbSDimitry Andric 4830b57cec5SDimitry Andric // Not "standard" per se, but available even with the -undef flag. 4840b57cec5SDimitry Andric if (LangOpts.AsmPreprocessor) 4850b57cec5SDimitry Andric Builder.defineMacro("__ASSEMBLER__"); 4860b57cec5SDimitry Andric if (LangOpts.CUDA && !LangOpts.HIP) 4870b57cec5SDimitry Andric Builder.defineMacro("__CUDA__"); 4880b57cec5SDimitry Andric if (LangOpts.HIP) { 4890b57cec5SDimitry Andric Builder.defineMacro("__HIP__"); 4900b57cec5SDimitry Andric Builder.defineMacro("__HIPCC__"); 4910b57cec5SDimitry Andric if (LangOpts.CUDAIsDevice) 4920b57cec5SDimitry Andric Builder.defineMacro("__HIP_DEVICE_COMPILE__"); 4930b57cec5SDimitry Andric } 4940b57cec5SDimitry Andric } 4950b57cec5SDimitry Andric 4960b57cec5SDimitry Andric /// Initialize the predefined C++ language feature test macros defined in 4970b57cec5SDimitry Andric /// ISO/IEC JTC1/SC22/WG21 (C++) SD-6: "SG10 Feature Test Recommendations". 4980b57cec5SDimitry Andric static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts, 4990b57cec5SDimitry Andric MacroBuilder &Builder) { 5000b57cec5SDimitry Andric // C++98 features. 5010b57cec5SDimitry Andric if (LangOpts.RTTI) 5020b57cec5SDimitry Andric Builder.defineMacro("__cpp_rtti", "199711L"); 5030b57cec5SDimitry Andric if (LangOpts.CXXExceptions) 5040b57cec5SDimitry Andric Builder.defineMacro("__cpp_exceptions", "199711L"); 5050b57cec5SDimitry Andric 5060b57cec5SDimitry Andric // C++11 features. 5070b57cec5SDimitry Andric if (LangOpts.CPlusPlus11) { 5080b57cec5SDimitry Andric Builder.defineMacro("__cpp_unicode_characters", "200704L"); 5090b57cec5SDimitry Andric Builder.defineMacro("__cpp_raw_strings", "200710L"); 5100b57cec5SDimitry Andric Builder.defineMacro("__cpp_unicode_literals", "200710L"); 5110b57cec5SDimitry Andric Builder.defineMacro("__cpp_user_defined_literals", "200809L"); 5120b57cec5SDimitry Andric Builder.defineMacro("__cpp_lambdas", "200907L"); 5130b57cec5SDimitry Andric Builder.defineMacro("__cpp_constexpr", 5145ffd83dbSDimitry Andric LangOpts.CPlusPlus20 ? "201907L" : 5150b57cec5SDimitry Andric LangOpts.CPlusPlus17 ? "201603L" : 5160b57cec5SDimitry Andric LangOpts.CPlusPlus14 ? "201304L" : "200704"); 517480093f4SDimitry Andric Builder.defineMacro("__cpp_constexpr_in_decltype", "201711L"); 5180b57cec5SDimitry Andric Builder.defineMacro("__cpp_range_based_for", 5190b57cec5SDimitry Andric LangOpts.CPlusPlus17 ? "201603L" : "200907"); 5200b57cec5SDimitry Andric Builder.defineMacro("__cpp_static_assert", 5210b57cec5SDimitry Andric LangOpts.CPlusPlus17 ? "201411L" : "200410"); 5220b57cec5SDimitry Andric Builder.defineMacro("__cpp_decltype", "200707L"); 5230b57cec5SDimitry Andric Builder.defineMacro("__cpp_attributes", "200809L"); 5240b57cec5SDimitry Andric Builder.defineMacro("__cpp_rvalue_references", "200610L"); 5250b57cec5SDimitry Andric Builder.defineMacro("__cpp_variadic_templates", "200704L"); 5260b57cec5SDimitry Andric Builder.defineMacro("__cpp_initializer_lists", "200806L"); 5270b57cec5SDimitry Andric Builder.defineMacro("__cpp_delegating_constructors", "200604L"); 5280b57cec5SDimitry Andric Builder.defineMacro("__cpp_nsdmi", "200809L"); 5290b57cec5SDimitry Andric Builder.defineMacro("__cpp_inheriting_constructors", "201511L"); 5300b57cec5SDimitry Andric Builder.defineMacro("__cpp_ref_qualifiers", "200710L"); 5310b57cec5SDimitry Andric Builder.defineMacro("__cpp_alias_templates", "200704L"); 5320b57cec5SDimitry Andric } 5330b57cec5SDimitry Andric if (LangOpts.ThreadsafeStatics) 5340b57cec5SDimitry Andric Builder.defineMacro("__cpp_threadsafe_static_init", "200806L"); 5350b57cec5SDimitry Andric 5360b57cec5SDimitry Andric // C++14 features. 5370b57cec5SDimitry Andric if (LangOpts.CPlusPlus14) { 5380b57cec5SDimitry Andric Builder.defineMacro("__cpp_binary_literals", "201304L"); 5390b57cec5SDimitry Andric Builder.defineMacro("__cpp_digit_separators", "201309L"); 540480093f4SDimitry Andric Builder.defineMacro("__cpp_init_captures", 5415ffd83dbSDimitry Andric LangOpts.CPlusPlus20 ? "201803L" : "201304L"); 542480093f4SDimitry Andric Builder.defineMacro("__cpp_generic_lambdas", 5435ffd83dbSDimitry Andric LangOpts.CPlusPlus20 ? "201707L" : "201304L"); 5440b57cec5SDimitry Andric Builder.defineMacro("__cpp_decltype_auto", "201304L"); 5450b57cec5SDimitry Andric Builder.defineMacro("__cpp_return_type_deduction", "201304L"); 5460b57cec5SDimitry Andric Builder.defineMacro("__cpp_aggregate_nsdmi", "201304L"); 5470b57cec5SDimitry Andric Builder.defineMacro("__cpp_variable_templates", "201304L"); 5480b57cec5SDimitry Andric } 5490b57cec5SDimitry Andric if (LangOpts.SizedDeallocation) 5500b57cec5SDimitry Andric Builder.defineMacro("__cpp_sized_deallocation", "201309L"); 5510b57cec5SDimitry Andric 5520b57cec5SDimitry Andric // C++17 features. 5530b57cec5SDimitry Andric if (LangOpts.CPlusPlus17) { 5540b57cec5SDimitry Andric Builder.defineMacro("__cpp_hex_float", "201603L"); 5550b57cec5SDimitry Andric Builder.defineMacro("__cpp_inline_variables", "201606L"); 5560b57cec5SDimitry Andric Builder.defineMacro("__cpp_noexcept_function_type", "201510L"); 5570b57cec5SDimitry Andric Builder.defineMacro("__cpp_capture_star_this", "201603L"); 5580b57cec5SDimitry Andric Builder.defineMacro("__cpp_if_constexpr", "201606L"); 559480093f4SDimitry Andric Builder.defineMacro("__cpp_deduction_guides", "201703L"); // (not latest) 5600b57cec5SDimitry Andric Builder.defineMacro("__cpp_template_auto", "201606L"); // (old name) 5610b57cec5SDimitry Andric Builder.defineMacro("__cpp_namespace_attributes", "201411L"); 5620b57cec5SDimitry Andric Builder.defineMacro("__cpp_enumerator_attributes", "201411L"); 5630b57cec5SDimitry Andric Builder.defineMacro("__cpp_nested_namespace_definitions", "201411L"); 5640b57cec5SDimitry Andric Builder.defineMacro("__cpp_variadic_using", "201611L"); 5650b57cec5SDimitry Andric Builder.defineMacro("__cpp_aggregate_bases", "201603L"); 5660b57cec5SDimitry Andric Builder.defineMacro("__cpp_structured_bindings", "201606L"); 567480093f4SDimitry Andric Builder.defineMacro("__cpp_nontype_template_args", 568*d409305fSDimitry Andric "201411L"); // (not latest) 5690b57cec5SDimitry Andric Builder.defineMacro("__cpp_fold_expressions", "201603L"); 5700b57cec5SDimitry Andric Builder.defineMacro("__cpp_guaranteed_copy_elision", "201606L"); 5710b57cec5SDimitry Andric Builder.defineMacro("__cpp_nontype_template_parameter_auto", "201606L"); 5720b57cec5SDimitry Andric } 5730b57cec5SDimitry Andric if (LangOpts.AlignedAllocation && !LangOpts.AlignedAllocationUnavailable) 5740b57cec5SDimitry Andric Builder.defineMacro("__cpp_aligned_new", "201606L"); 5750b57cec5SDimitry Andric if (LangOpts.RelaxedTemplateTemplateArgs) 5760b57cec5SDimitry Andric Builder.defineMacro("__cpp_template_template_args", "201611L"); 5770b57cec5SDimitry Andric 5780b57cec5SDimitry Andric // C++20 features. 5795ffd83dbSDimitry Andric if (LangOpts.CPlusPlus20) { 580480093f4SDimitry Andric //Builder.defineMacro("__cpp_aggregate_paren_init", "201902L"); 58155e4f9d5SDimitry Andric Builder.defineMacro("__cpp_concepts", "201907L"); 5820b57cec5SDimitry Andric Builder.defineMacro("__cpp_conditional_explicit", "201806L"); 583480093f4SDimitry Andric //Builder.defineMacro("__cpp_consteval", "201811L"); 584a7dea167SDimitry Andric Builder.defineMacro("__cpp_constexpr_dynamic_alloc", "201907L"); 585a7dea167SDimitry Andric Builder.defineMacro("__cpp_constinit", "201907L"); 586480093f4SDimitry Andric //Builder.defineMacro("__cpp_coroutines", "201902L"); 587480093f4SDimitry Andric Builder.defineMacro("__cpp_designated_initializers", "201707L"); 588480093f4SDimitry Andric Builder.defineMacro("__cpp_impl_three_way_comparison", "201907L"); 589480093f4SDimitry Andric //Builder.defineMacro("__cpp_modules", "201907L"); 590480093f4SDimitry Andric //Builder.defineMacro("__cpp_using_enum", "201907L"); 591a7dea167SDimitry Andric } 5920b57cec5SDimitry Andric if (LangOpts.Char8) 5930b57cec5SDimitry Andric Builder.defineMacro("__cpp_char8_t", "201811L"); 5940b57cec5SDimitry Andric Builder.defineMacro("__cpp_impl_destroying_delete", "201806L"); 5950b57cec5SDimitry Andric 5960b57cec5SDimitry Andric // TS features. 5970b57cec5SDimitry Andric if (LangOpts.Coroutines) 5980b57cec5SDimitry Andric Builder.defineMacro("__cpp_coroutines", "201703L"); 5990b57cec5SDimitry Andric } 6000b57cec5SDimitry Andric 6010b57cec5SDimitry Andric static void InitializePredefinedMacros(const TargetInfo &TI, 6020b57cec5SDimitry Andric const LangOptions &LangOpts, 6030b57cec5SDimitry Andric const FrontendOptions &FEOpts, 604a7dea167SDimitry Andric const PreprocessorOptions &PPOpts, 6050b57cec5SDimitry Andric MacroBuilder &Builder) { 6060b57cec5SDimitry Andric // Compiler version introspection macros. 6070b57cec5SDimitry Andric Builder.defineMacro("__llvm__"); // LLVM Backend 6080b57cec5SDimitry Andric Builder.defineMacro("__clang__"); // Clang Frontend 6090b57cec5SDimitry Andric #define TOSTR2(X) #X 6100b57cec5SDimitry Andric #define TOSTR(X) TOSTR2(X) 6110b57cec5SDimitry Andric Builder.defineMacro("__clang_major__", TOSTR(CLANG_VERSION_MAJOR)); 6120b57cec5SDimitry Andric Builder.defineMacro("__clang_minor__", TOSTR(CLANG_VERSION_MINOR)); 6130b57cec5SDimitry Andric Builder.defineMacro("__clang_patchlevel__", TOSTR(CLANG_VERSION_PATCHLEVEL)); 6140b57cec5SDimitry Andric #undef TOSTR 6150b57cec5SDimitry Andric #undef TOSTR2 6160b57cec5SDimitry Andric Builder.defineMacro("__clang_version__", 6170b57cec5SDimitry Andric "\"" CLANG_VERSION_STRING " " 6180b57cec5SDimitry Andric + getClangFullRepositoryVersion() + "\""); 619a7dea167SDimitry Andric 620a7dea167SDimitry Andric if (LangOpts.GNUCVersion != 0) { 621a7dea167SDimitry Andric // Major, minor, patch, are given two decimal places each, so 4.2.1 becomes 622a7dea167SDimitry Andric // 40201. 623a7dea167SDimitry Andric unsigned GNUCMajor = LangOpts.GNUCVersion / 100 / 100; 624a7dea167SDimitry Andric unsigned GNUCMinor = LangOpts.GNUCVersion / 100 % 100; 625a7dea167SDimitry Andric unsigned GNUCPatch = LangOpts.GNUCVersion % 100; 626a7dea167SDimitry Andric Builder.defineMacro("__GNUC__", Twine(GNUCMajor)); 627a7dea167SDimitry Andric Builder.defineMacro("__GNUC_MINOR__", Twine(GNUCMinor)); 628a7dea167SDimitry Andric Builder.defineMacro("__GNUC_PATCHLEVEL__", Twine(GNUCPatch)); 6290b57cec5SDimitry Andric Builder.defineMacro("__GXX_ABI_VERSION", "1002"); 630a7dea167SDimitry Andric 631a7dea167SDimitry Andric if (LangOpts.CPlusPlus) { 632a7dea167SDimitry Andric Builder.defineMacro("__GNUG__", Twine(GNUCMajor)); 633a7dea167SDimitry Andric Builder.defineMacro("__GXX_WEAK__"); 634a7dea167SDimitry Andric } 6350b57cec5SDimitry Andric } 6360b57cec5SDimitry Andric 6370b57cec5SDimitry Andric // Define macros for the C11 / C++11 memory orderings 6380b57cec5SDimitry Andric Builder.defineMacro("__ATOMIC_RELAXED", "0"); 6390b57cec5SDimitry Andric Builder.defineMacro("__ATOMIC_CONSUME", "1"); 6400b57cec5SDimitry Andric Builder.defineMacro("__ATOMIC_ACQUIRE", "2"); 6410b57cec5SDimitry Andric Builder.defineMacro("__ATOMIC_RELEASE", "3"); 6420b57cec5SDimitry Andric Builder.defineMacro("__ATOMIC_ACQ_REL", "4"); 6430b57cec5SDimitry Andric Builder.defineMacro("__ATOMIC_SEQ_CST", "5"); 6440b57cec5SDimitry Andric 6450b57cec5SDimitry Andric // Define macros for the OpenCL memory scope. 6460b57cec5SDimitry Andric // The values should match AtomicScopeOpenCLModel::ID enum. 6470b57cec5SDimitry Andric static_assert( 6480b57cec5SDimitry Andric static_cast<unsigned>(AtomicScopeOpenCLModel::WorkGroup) == 1 && 6490b57cec5SDimitry Andric static_cast<unsigned>(AtomicScopeOpenCLModel::Device) == 2 && 6500b57cec5SDimitry Andric static_cast<unsigned>(AtomicScopeOpenCLModel::AllSVMDevices) == 3 && 6510b57cec5SDimitry Andric static_cast<unsigned>(AtomicScopeOpenCLModel::SubGroup) == 4, 6520b57cec5SDimitry Andric "Invalid OpenCL memory scope enum definition"); 6530b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_MEMORY_SCOPE_WORK_ITEM", "0"); 6540b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_MEMORY_SCOPE_WORK_GROUP", "1"); 6550b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_MEMORY_SCOPE_DEVICE", "2"); 6560b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES", "3"); 6570b57cec5SDimitry Andric Builder.defineMacro("__OPENCL_MEMORY_SCOPE_SUB_GROUP", "4"); 6580b57cec5SDimitry Andric 6590b57cec5SDimitry Andric // Support for #pragma redefine_extname (Sun compatibility) 6600b57cec5SDimitry Andric Builder.defineMacro("__PRAGMA_REDEFINE_EXTNAME", "1"); 6610b57cec5SDimitry Andric 6620b57cec5SDimitry Andric // Previously this macro was set to a string aiming to achieve compatibility 6630b57cec5SDimitry Andric // with GCC 4.2.1. Now, just return the full Clang version 6640b57cec5SDimitry Andric Builder.defineMacro("__VERSION__", "\"" + 6650b57cec5SDimitry Andric Twine(getClangFullCPPVersion()) + "\""); 6660b57cec5SDimitry Andric 6670b57cec5SDimitry Andric // Initialize language-specific preprocessor defines. 6680b57cec5SDimitry Andric 6690b57cec5SDimitry Andric // Standard conforming mode? 6700b57cec5SDimitry Andric if (!LangOpts.GNUMode && !LangOpts.MSVCCompat) 6710b57cec5SDimitry Andric Builder.defineMacro("__STRICT_ANSI__"); 6720b57cec5SDimitry Andric 673a7dea167SDimitry Andric if (LangOpts.GNUCVersion && LangOpts.CPlusPlus11) 6740b57cec5SDimitry Andric Builder.defineMacro("__GXX_EXPERIMENTAL_CXX0X__"); 6750b57cec5SDimitry Andric 6760b57cec5SDimitry Andric if (LangOpts.ObjC) { 6770b57cec5SDimitry Andric if (LangOpts.ObjCRuntime.isNonFragile()) { 6780b57cec5SDimitry Andric Builder.defineMacro("__OBJC2__"); 6790b57cec5SDimitry Andric 6800b57cec5SDimitry Andric if (LangOpts.ObjCExceptions) 6810b57cec5SDimitry Andric Builder.defineMacro("OBJC_ZEROCOST_EXCEPTIONS"); 6820b57cec5SDimitry Andric } 6830b57cec5SDimitry Andric 6840b57cec5SDimitry Andric if (LangOpts.getGC() != LangOptions::NonGC) 6850b57cec5SDimitry Andric Builder.defineMacro("__OBJC_GC__"); 6860b57cec5SDimitry Andric 6870b57cec5SDimitry Andric if (LangOpts.ObjCRuntime.isNeXTFamily()) 6880b57cec5SDimitry Andric Builder.defineMacro("__NEXT_RUNTIME__"); 6890b57cec5SDimitry Andric 6900b57cec5SDimitry Andric if (LangOpts.ObjCRuntime.getKind() == ObjCRuntime::GNUstep) { 6910b57cec5SDimitry Andric auto version = LangOpts.ObjCRuntime.getVersion(); 6920b57cec5SDimitry Andric std::string versionString = "1"; 6930b57cec5SDimitry Andric // Don't rely on the tuple argument, because we can be asked to target 6940b57cec5SDimitry Andric // later ABIs than we actually support, so clamp these values to those 6950b57cec5SDimitry Andric // currently supported 6960b57cec5SDimitry Andric if (version >= VersionTuple(2, 0)) 6970b57cec5SDimitry Andric Builder.defineMacro("__OBJC_GNUSTEP_RUNTIME_ABI__", "20"); 6980b57cec5SDimitry Andric else 6990b57cec5SDimitry Andric Builder.defineMacro("__OBJC_GNUSTEP_RUNTIME_ABI__", 7000b57cec5SDimitry Andric "1" + Twine(std::min(8U, version.getMinor().getValueOr(0)))); 7010b57cec5SDimitry Andric } 7020b57cec5SDimitry Andric 7030b57cec5SDimitry Andric if (LangOpts.ObjCRuntime.getKind() == ObjCRuntime::ObjFW) { 7040b57cec5SDimitry Andric VersionTuple tuple = LangOpts.ObjCRuntime.getVersion(); 7050b57cec5SDimitry Andric 7060b57cec5SDimitry Andric unsigned minor = 0; 7070b57cec5SDimitry Andric if (tuple.getMinor().hasValue()) 7080b57cec5SDimitry Andric minor = tuple.getMinor().getValue(); 7090b57cec5SDimitry Andric 7100b57cec5SDimitry Andric unsigned subminor = 0; 7110b57cec5SDimitry Andric if (tuple.getSubminor().hasValue()) 7120b57cec5SDimitry Andric subminor = tuple.getSubminor().getValue(); 7130b57cec5SDimitry Andric 7140b57cec5SDimitry Andric Builder.defineMacro("__OBJFW_RUNTIME_ABI__", 7150b57cec5SDimitry Andric Twine(tuple.getMajor() * 10000 + minor * 100 + 7160b57cec5SDimitry Andric subminor)); 7170b57cec5SDimitry Andric } 7180b57cec5SDimitry Andric 7190b57cec5SDimitry Andric Builder.defineMacro("IBOutlet", "__attribute__((iboutlet))"); 7200b57cec5SDimitry Andric Builder.defineMacro("IBOutletCollection(ClassName)", 7210b57cec5SDimitry Andric "__attribute__((iboutletcollection(ClassName)))"); 7220b57cec5SDimitry Andric Builder.defineMacro("IBAction", "void)__attribute__((ibaction)"); 7230b57cec5SDimitry Andric Builder.defineMacro("IBInspectable", ""); 7240b57cec5SDimitry Andric Builder.defineMacro("IB_DESIGNABLE", ""); 7250b57cec5SDimitry Andric } 7260b57cec5SDimitry Andric 7270b57cec5SDimitry Andric // Define a macro that describes the Objective-C boolean type even for C 7280b57cec5SDimitry Andric // and C++ since BOOL can be used from non Objective-C code. 7290b57cec5SDimitry Andric Builder.defineMacro("__OBJC_BOOL_IS_BOOL", 7300b57cec5SDimitry Andric Twine(TI.useSignedCharForObjCBool() ? "0" : "1")); 7310b57cec5SDimitry Andric 7320b57cec5SDimitry Andric if (LangOpts.CPlusPlus) 7330b57cec5SDimitry Andric InitializeCPlusPlusFeatureTestMacros(LangOpts, Builder); 7340b57cec5SDimitry Andric 7350b57cec5SDimitry Andric // darwin_constant_cfstrings controls this. This is also dependent 7360b57cec5SDimitry Andric // on other things like the runtime I believe. This is set even for C code. 7370b57cec5SDimitry Andric if (!LangOpts.NoConstantCFStrings) 7380b57cec5SDimitry Andric Builder.defineMacro("__CONSTANT_CFSTRINGS__"); 7390b57cec5SDimitry Andric 7400b57cec5SDimitry Andric if (LangOpts.ObjC) 7410b57cec5SDimitry Andric Builder.defineMacro("OBJC_NEW_PROPERTIES"); 7420b57cec5SDimitry Andric 7430b57cec5SDimitry Andric if (LangOpts.PascalStrings) 7440b57cec5SDimitry Andric Builder.defineMacro("__PASCAL_STRINGS__"); 7450b57cec5SDimitry Andric 7460b57cec5SDimitry Andric if (LangOpts.Blocks) { 7470b57cec5SDimitry Andric Builder.defineMacro("__block", "__attribute__((__blocks__(byref)))"); 7480b57cec5SDimitry Andric Builder.defineMacro("__BLOCKS__"); 7490b57cec5SDimitry Andric } 7500b57cec5SDimitry Andric 7510b57cec5SDimitry Andric if (!LangOpts.MSVCCompat && LangOpts.Exceptions) 7520b57cec5SDimitry Andric Builder.defineMacro("__EXCEPTIONS"); 753a7dea167SDimitry Andric if (LangOpts.GNUCVersion && LangOpts.RTTI) 7540b57cec5SDimitry Andric Builder.defineMacro("__GXX_RTTI"); 7550b57cec5SDimitry Andric 756e8d8bef9SDimitry Andric if (LangOpts.hasSjLjExceptions()) 7570b57cec5SDimitry Andric Builder.defineMacro("__USING_SJLJ_EXCEPTIONS__"); 758e8d8bef9SDimitry Andric else if (LangOpts.hasSEHExceptions()) 7590b57cec5SDimitry Andric Builder.defineMacro("__SEH__"); 760e8d8bef9SDimitry Andric else if (LangOpts.hasDWARFExceptions() && 7610b57cec5SDimitry Andric (TI.getTriple().isThumb() || TI.getTriple().isARM())) 7620b57cec5SDimitry Andric Builder.defineMacro("__ARM_DWARF_EH__"); 7630b57cec5SDimitry Andric 7640b57cec5SDimitry Andric if (LangOpts.Deprecated) 7650b57cec5SDimitry Andric Builder.defineMacro("__DEPRECATED"); 7660b57cec5SDimitry Andric 767a7dea167SDimitry Andric if (!LangOpts.MSVCCompat && LangOpts.CPlusPlus) 7680b57cec5SDimitry Andric Builder.defineMacro("__private_extern__", "extern"); 7690b57cec5SDimitry Andric 7700b57cec5SDimitry Andric if (LangOpts.MicrosoftExt) { 7710b57cec5SDimitry Andric if (LangOpts.WChar) { 7720b57cec5SDimitry Andric // wchar_t supported as a keyword. 7730b57cec5SDimitry Andric Builder.defineMacro("_WCHAR_T_DEFINED"); 7740b57cec5SDimitry Andric Builder.defineMacro("_NATIVE_WCHAR_T_DEFINED"); 7750b57cec5SDimitry Andric } 7760b57cec5SDimitry Andric } 7770b57cec5SDimitry Andric 7780b57cec5SDimitry Andric if (LangOpts.Optimize) 7790b57cec5SDimitry Andric Builder.defineMacro("__OPTIMIZE__"); 7800b57cec5SDimitry Andric if (LangOpts.OptimizeSize) 7810b57cec5SDimitry Andric Builder.defineMacro("__OPTIMIZE_SIZE__"); 7820b57cec5SDimitry Andric 7830b57cec5SDimitry Andric if (LangOpts.FastMath) 7840b57cec5SDimitry Andric Builder.defineMacro("__FAST_MATH__"); 7850b57cec5SDimitry Andric 7860b57cec5SDimitry Andric // Initialize target-specific preprocessor defines. 7870b57cec5SDimitry Andric 7880b57cec5SDimitry Andric // __BYTE_ORDER__ was added in GCC 4.6. It's analogous 7890b57cec5SDimitry Andric // to the macro __BYTE_ORDER (no trailing underscores) 7900b57cec5SDimitry Andric // from glibc's <endian.h> header. 7910b57cec5SDimitry Andric // We don't support the PDP-11 as a target, but include 7920b57cec5SDimitry Andric // the define so it can still be compared against. 7930b57cec5SDimitry Andric Builder.defineMacro("__ORDER_LITTLE_ENDIAN__", "1234"); 7940b57cec5SDimitry Andric Builder.defineMacro("__ORDER_BIG_ENDIAN__", "4321"); 7950b57cec5SDimitry Andric Builder.defineMacro("__ORDER_PDP_ENDIAN__", "3412"); 7960b57cec5SDimitry Andric if (TI.isBigEndian()) { 7970b57cec5SDimitry Andric Builder.defineMacro("__BYTE_ORDER__", "__ORDER_BIG_ENDIAN__"); 7980b57cec5SDimitry Andric Builder.defineMacro("__BIG_ENDIAN__"); 7990b57cec5SDimitry Andric } else { 8000b57cec5SDimitry Andric Builder.defineMacro("__BYTE_ORDER__", "__ORDER_LITTLE_ENDIAN__"); 8010b57cec5SDimitry Andric Builder.defineMacro("__LITTLE_ENDIAN__"); 8020b57cec5SDimitry Andric } 8030b57cec5SDimitry Andric 8040b57cec5SDimitry Andric if (TI.getPointerWidth(0) == 64 && TI.getLongWidth() == 64 8050b57cec5SDimitry Andric && TI.getIntWidth() == 32) { 8060b57cec5SDimitry Andric Builder.defineMacro("_LP64"); 8070b57cec5SDimitry Andric Builder.defineMacro("__LP64__"); 8080b57cec5SDimitry Andric } 8090b57cec5SDimitry Andric 8100b57cec5SDimitry Andric if (TI.getPointerWidth(0) == 32 && TI.getLongWidth() == 32 8110b57cec5SDimitry Andric && TI.getIntWidth() == 32) { 8120b57cec5SDimitry Andric Builder.defineMacro("_ILP32"); 8130b57cec5SDimitry Andric Builder.defineMacro("__ILP32__"); 8140b57cec5SDimitry Andric } 8150b57cec5SDimitry Andric 8160b57cec5SDimitry Andric // Define type sizing macros based on the target properties. 8170b57cec5SDimitry Andric assert(TI.getCharWidth() == 8 && "Only support 8-bit char so far"); 8180b57cec5SDimitry Andric Builder.defineMacro("__CHAR_BIT__", Twine(TI.getCharWidth())); 8190b57cec5SDimitry Andric 8200b57cec5SDimitry Andric DefineTypeSize("__SCHAR_MAX__", TargetInfo::SignedChar, TI, Builder); 8210b57cec5SDimitry Andric DefineTypeSize("__SHRT_MAX__", TargetInfo::SignedShort, TI, Builder); 8220b57cec5SDimitry Andric DefineTypeSize("__INT_MAX__", TargetInfo::SignedInt, TI, Builder); 8230b57cec5SDimitry Andric DefineTypeSize("__LONG_MAX__", TargetInfo::SignedLong, TI, Builder); 8240b57cec5SDimitry Andric DefineTypeSize("__LONG_LONG_MAX__", TargetInfo::SignedLongLong, TI, Builder); 8250b57cec5SDimitry Andric DefineTypeSize("__WCHAR_MAX__", TI.getWCharType(), TI, Builder); 8260b57cec5SDimitry Andric DefineTypeSize("__WINT_MAX__", TI.getWIntType(), TI, Builder); 8270b57cec5SDimitry Andric DefineTypeSize("__INTMAX_MAX__", TI.getIntMaxType(), TI, Builder); 8280b57cec5SDimitry Andric DefineTypeSize("__SIZE_MAX__", TI.getSizeType(), TI, Builder); 8290b57cec5SDimitry Andric 8300b57cec5SDimitry Andric DefineTypeSize("__UINTMAX_MAX__", TI.getUIntMaxType(), TI, Builder); 8310b57cec5SDimitry Andric DefineTypeSize("__PTRDIFF_MAX__", TI.getPtrDiffType(0), TI, Builder); 8320b57cec5SDimitry Andric DefineTypeSize("__INTPTR_MAX__", TI.getIntPtrType(), TI, Builder); 8330b57cec5SDimitry Andric DefineTypeSize("__UINTPTR_MAX__", TI.getUIntPtrType(), TI, Builder); 8340b57cec5SDimitry Andric 8350b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_DOUBLE__", TI.getDoubleWidth(), TI, Builder); 8360b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_FLOAT__", TI.getFloatWidth(), TI, Builder); 8370b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_INT__", TI.getIntWidth(), TI, Builder); 8380b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_LONG__", TI.getLongWidth(), TI, Builder); 8390b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_LONG_DOUBLE__",TI.getLongDoubleWidth(),TI,Builder); 8400b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_LONG_LONG__", TI.getLongLongWidth(), TI, Builder); 8410b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_POINTER__", TI.getPointerWidth(0), TI, Builder); 8420b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_SHORT__", TI.getShortWidth(), TI, Builder); 8430b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_PTRDIFF_T__", 8440b57cec5SDimitry Andric TI.getTypeWidth(TI.getPtrDiffType(0)), TI, Builder); 8450b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_SIZE_T__", 8460b57cec5SDimitry Andric TI.getTypeWidth(TI.getSizeType()), TI, Builder); 8470b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_WCHAR_T__", 8480b57cec5SDimitry Andric TI.getTypeWidth(TI.getWCharType()), TI, Builder); 8490b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_WINT_T__", 8500b57cec5SDimitry Andric TI.getTypeWidth(TI.getWIntType()), TI, Builder); 8510b57cec5SDimitry Andric if (TI.hasInt128Type()) 8520b57cec5SDimitry Andric DefineTypeSizeof("__SIZEOF_INT128__", 128, TI, Builder); 8530b57cec5SDimitry Andric 8540b57cec5SDimitry Andric DefineType("__INTMAX_TYPE__", TI.getIntMaxType(), Builder); 8550b57cec5SDimitry Andric DefineFmt("__INTMAX", TI.getIntMaxType(), TI, Builder); 8560b57cec5SDimitry Andric Builder.defineMacro("__INTMAX_C_SUFFIX__", 8570b57cec5SDimitry Andric TI.getTypeConstantSuffix(TI.getIntMaxType())); 8580b57cec5SDimitry Andric DefineType("__UINTMAX_TYPE__", TI.getUIntMaxType(), Builder); 8590b57cec5SDimitry Andric DefineFmt("__UINTMAX", TI.getUIntMaxType(), TI, Builder); 8600b57cec5SDimitry Andric Builder.defineMacro("__UINTMAX_C_SUFFIX__", 8610b57cec5SDimitry Andric TI.getTypeConstantSuffix(TI.getUIntMaxType())); 8620b57cec5SDimitry Andric DefineTypeWidth("__INTMAX_WIDTH__", TI.getIntMaxType(), TI, Builder); 8630b57cec5SDimitry Andric DefineType("__PTRDIFF_TYPE__", TI.getPtrDiffType(0), Builder); 8640b57cec5SDimitry Andric DefineFmt("__PTRDIFF", TI.getPtrDiffType(0), TI, Builder); 8650b57cec5SDimitry Andric DefineTypeWidth("__PTRDIFF_WIDTH__", TI.getPtrDiffType(0), TI, Builder); 8660b57cec5SDimitry Andric DefineType("__INTPTR_TYPE__", TI.getIntPtrType(), Builder); 8670b57cec5SDimitry Andric DefineFmt("__INTPTR", TI.getIntPtrType(), TI, Builder); 8680b57cec5SDimitry Andric DefineTypeWidth("__INTPTR_WIDTH__", TI.getIntPtrType(), TI, Builder); 8690b57cec5SDimitry Andric DefineType("__SIZE_TYPE__", TI.getSizeType(), Builder); 8700b57cec5SDimitry Andric DefineFmt("__SIZE", TI.getSizeType(), TI, Builder); 8710b57cec5SDimitry Andric DefineTypeWidth("__SIZE_WIDTH__", TI.getSizeType(), TI, Builder); 8720b57cec5SDimitry Andric DefineType("__WCHAR_TYPE__", TI.getWCharType(), Builder); 8730b57cec5SDimitry Andric DefineTypeWidth("__WCHAR_WIDTH__", TI.getWCharType(), TI, Builder); 8740b57cec5SDimitry Andric DefineType("__WINT_TYPE__", TI.getWIntType(), Builder); 8750b57cec5SDimitry Andric DefineTypeWidth("__WINT_WIDTH__", TI.getWIntType(), TI, Builder); 8760b57cec5SDimitry Andric DefineTypeWidth("__SIG_ATOMIC_WIDTH__", TI.getSigAtomicType(), TI, Builder); 8770b57cec5SDimitry Andric DefineTypeSize("__SIG_ATOMIC_MAX__", TI.getSigAtomicType(), TI, Builder); 8780b57cec5SDimitry Andric DefineType("__CHAR16_TYPE__", TI.getChar16Type(), Builder); 8790b57cec5SDimitry Andric DefineType("__CHAR32_TYPE__", TI.getChar32Type(), Builder); 8800b57cec5SDimitry Andric 8810b57cec5SDimitry Andric DefineTypeWidth("__UINTMAX_WIDTH__", TI.getUIntMaxType(), TI, Builder); 8820b57cec5SDimitry Andric DefineType("__UINTPTR_TYPE__", TI.getUIntPtrType(), Builder); 8830b57cec5SDimitry Andric DefineFmt("__UINTPTR", TI.getUIntPtrType(), TI, Builder); 8840b57cec5SDimitry Andric DefineTypeWidth("__UINTPTR_WIDTH__", TI.getUIntPtrType(), TI, Builder); 8850b57cec5SDimitry Andric 8860b57cec5SDimitry Andric if (TI.hasFloat16Type()) 8870b57cec5SDimitry Andric DefineFloatMacros(Builder, "FLT16", &TI.getHalfFormat(), "F16"); 8880b57cec5SDimitry Andric DefineFloatMacros(Builder, "FLT", &TI.getFloatFormat(), "F"); 8890b57cec5SDimitry Andric DefineFloatMacros(Builder, "DBL", &TI.getDoubleFormat(), ""); 8900b57cec5SDimitry Andric DefineFloatMacros(Builder, "LDBL", &TI.getLongDoubleFormat(), "L"); 8910b57cec5SDimitry Andric 8920b57cec5SDimitry Andric // Define a __POINTER_WIDTH__ macro for stdint.h. 8930b57cec5SDimitry Andric Builder.defineMacro("__POINTER_WIDTH__", 8940b57cec5SDimitry Andric Twine((int)TI.getPointerWidth(0))); 8950b57cec5SDimitry Andric 8960b57cec5SDimitry Andric // Define __BIGGEST_ALIGNMENT__ to be compatible with gcc. 8970b57cec5SDimitry Andric Builder.defineMacro("__BIGGEST_ALIGNMENT__", 8980b57cec5SDimitry Andric Twine(TI.getSuitableAlign() / TI.getCharWidth()) ); 8990b57cec5SDimitry Andric 9000b57cec5SDimitry Andric if (!LangOpts.CharIsSigned) 9010b57cec5SDimitry Andric Builder.defineMacro("__CHAR_UNSIGNED__"); 9020b57cec5SDimitry Andric 9030b57cec5SDimitry Andric if (!TargetInfo::isTypeSigned(TI.getWCharType())) 9040b57cec5SDimitry Andric Builder.defineMacro("__WCHAR_UNSIGNED__"); 9050b57cec5SDimitry Andric 9060b57cec5SDimitry Andric if (!TargetInfo::isTypeSigned(TI.getWIntType())) 9070b57cec5SDimitry Andric Builder.defineMacro("__WINT_UNSIGNED__"); 9080b57cec5SDimitry Andric 9090b57cec5SDimitry Andric // Define exact-width integer types for stdint.h 9100b57cec5SDimitry Andric DefineExactWidthIntType(TargetInfo::SignedChar, TI, Builder); 9110b57cec5SDimitry Andric 9120b57cec5SDimitry Andric if (TI.getShortWidth() > TI.getCharWidth()) 9130b57cec5SDimitry Andric DefineExactWidthIntType(TargetInfo::SignedShort, TI, Builder); 9140b57cec5SDimitry Andric 9150b57cec5SDimitry Andric if (TI.getIntWidth() > TI.getShortWidth()) 9160b57cec5SDimitry Andric DefineExactWidthIntType(TargetInfo::SignedInt, TI, Builder); 9170b57cec5SDimitry Andric 9180b57cec5SDimitry Andric if (TI.getLongWidth() > TI.getIntWidth()) 9190b57cec5SDimitry Andric DefineExactWidthIntType(TargetInfo::SignedLong, TI, Builder); 9200b57cec5SDimitry Andric 9210b57cec5SDimitry Andric if (TI.getLongLongWidth() > TI.getLongWidth()) 9220b57cec5SDimitry Andric DefineExactWidthIntType(TargetInfo::SignedLongLong, TI, Builder); 9230b57cec5SDimitry Andric 9240b57cec5SDimitry Andric DefineExactWidthIntType(TargetInfo::UnsignedChar, TI, Builder); 9250b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::UnsignedChar, TI, Builder); 9260b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::SignedChar, TI, Builder); 9270b57cec5SDimitry Andric 9280b57cec5SDimitry Andric if (TI.getShortWidth() > TI.getCharWidth()) { 9290b57cec5SDimitry Andric DefineExactWidthIntType(TargetInfo::UnsignedShort, TI, Builder); 9300b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::UnsignedShort, TI, Builder); 9310b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::SignedShort, TI, Builder); 9320b57cec5SDimitry Andric } 9330b57cec5SDimitry Andric 9340b57cec5SDimitry Andric if (TI.getIntWidth() > TI.getShortWidth()) { 9350b57cec5SDimitry Andric DefineExactWidthIntType(TargetInfo::UnsignedInt, TI, Builder); 9360b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::UnsignedInt, TI, Builder); 9370b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::SignedInt, TI, Builder); 9380b57cec5SDimitry Andric } 9390b57cec5SDimitry Andric 9400b57cec5SDimitry Andric if (TI.getLongWidth() > TI.getIntWidth()) { 9410b57cec5SDimitry Andric DefineExactWidthIntType(TargetInfo::UnsignedLong, TI, Builder); 9420b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::UnsignedLong, TI, Builder); 9430b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::SignedLong, TI, Builder); 9440b57cec5SDimitry Andric } 9450b57cec5SDimitry Andric 9460b57cec5SDimitry Andric if (TI.getLongLongWidth() > TI.getLongWidth()) { 9470b57cec5SDimitry Andric DefineExactWidthIntType(TargetInfo::UnsignedLongLong, TI, Builder); 9480b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::UnsignedLongLong, TI, Builder); 9490b57cec5SDimitry Andric DefineExactWidthIntTypeSize(TargetInfo::SignedLongLong, TI, Builder); 9500b57cec5SDimitry Andric } 9510b57cec5SDimitry Andric 9520b57cec5SDimitry Andric DefineLeastWidthIntType(8, true, TI, Builder); 9530b57cec5SDimitry Andric DefineLeastWidthIntType(8, false, TI, Builder); 9540b57cec5SDimitry Andric DefineLeastWidthIntType(16, true, TI, Builder); 9550b57cec5SDimitry Andric DefineLeastWidthIntType(16, false, TI, Builder); 9560b57cec5SDimitry Andric DefineLeastWidthIntType(32, true, TI, Builder); 9570b57cec5SDimitry Andric DefineLeastWidthIntType(32, false, TI, Builder); 9580b57cec5SDimitry Andric DefineLeastWidthIntType(64, true, TI, Builder); 9590b57cec5SDimitry Andric DefineLeastWidthIntType(64, false, TI, Builder); 9600b57cec5SDimitry Andric 9610b57cec5SDimitry Andric DefineFastIntType(8, true, TI, Builder); 9620b57cec5SDimitry Andric DefineFastIntType(8, false, TI, Builder); 9630b57cec5SDimitry Andric DefineFastIntType(16, true, TI, Builder); 9640b57cec5SDimitry Andric DefineFastIntType(16, false, TI, Builder); 9650b57cec5SDimitry Andric DefineFastIntType(32, true, TI, Builder); 9660b57cec5SDimitry Andric DefineFastIntType(32, false, TI, Builder); 9670b57cec5SDimitry Andric DefineFastIntType(64, true, TI, Builder); 9680b57cec5SDimitry Andric DefineFastIntType(64, false, TI, Builder); 9690b57cec5SDimitry Andric 9700b57cec5SDimitry Andric char UserLabelPrefix[2] = {TI.getDataLayout().getGlobalPrefix(), 0}; 9710b57cec5SDimitry Andric Builder.defineMacro("__USER_LABEL_PREFIX__", UserLabelPrefix); 9720b57cec5SDimitry Andric 9730b57cec5SDimitry Andric if (LangOpts.FastMath || LangOpts.FiniteMathOnly) 9740b57cec5SDimitry Andric Builder.defineMacro("__FINITE_MATH_ONLY__", "1"); 9750b57cec5SDimitry Andric else 9760b57cec5SDimitry Andric Builder.defineMacro("__FINITE_MATH_ONLY__", "0"); 9770b57cec5SDimitry Andric 978a7dea167SDimitry Andric if (LangOpts.GNUCVersion) { 9790b57cec5SDimitry Andric if (LangOpts.GNUInline || LangOpts.CPlusPlus) 9800b57cec5SDimitry Andric Builder.defineMacro("__GNUC_GNU_INLINE__"); 9810b57cec5SDimitry Andric else 9820b57cec5SDimitry Andric Builder.defineMacro("__GNUC_STDC_INLINE__"); 9830b57cec5SDimitry Andric 9840b57cec5SDimitry Andric // The value written by __atomic_test_and_set. 9850b57cec5SDimitry Andric // FIXME: This is target-dependent. 9860b57cec5SDimitry Andric Builder.defineMacro("__GCC_ATOMIC_TEST_AND_SET_TRUEVAL", "1"); 9870b57cec5SDimitry Andric } 9880b57cec5SDimitry Andric 9890b57cec5SDimitry Andric auto addLockFreeMacros = [&](const llvm::Twine &Prefix) { 9900b57cec5SDimitry Andric // Used by libc++ and libstdc++ to implement ATOMIC_<foo>_LOCK_FREE. 9910b57cec5SDimitry Andric unsigned InlineWidthBits = TI.getMaxAtomicInlineWidth(); 9920b57cec5SDimitry Andric #define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \ 9930b57cec5SDimitry Andric Builder.defineMacro(Prefix + #TYPE "_LOCK_FREE", \ 9940b57cec5SDimitry Andric getLockFreeValue(TI.get##Type##Width(), \ 9950b57cec5SDimitry Andric TI.get##Type##Align(), \ 9960b57cec5SDimitry Andric InlineWidthBits)); 9970b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(BOOL, Bool); 9980b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(CHAR, Char); 9990b57cec5SDimitry Andric if (LangOpts.Char8) 10000b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(CHAR8_T, Char); // Treat char8_t like char. 10010b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(CHAR16_T, Char16); 10020b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(CHAR32_T, Char32); 10030b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(WCHAR_T, WChar); 10040b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(SHORT, Short); 10050b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(INT, Int); 10060b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(LONG, Long); 10070b57cec5SDimitry Andric DEFINE_LOCK_FREE_MACRO(LLONG, LongLong); 10080b57cec5SDimitry Andric Builder.defineMacro(Prefix + "POINTER_LOCK_FREE", 10090b57cec5SDimitry Andric getLockFreeValue(TI.getPointerWidth(0), 10100b57cec5SDimitry Andric TI.getPointerAlign(0), 10110b57cec5SDimitry Andric InlineWidthBits)); 10120b57cec5SDimitry Andric #undef DEFINE_LOCK_FREE_MACRO 10130b57cec5SDimitry Andric }; 10140b57cec5SDimitry Andric addLockFreeMacros("__CLANG_ATOMIC_"); 1015a7dea167SDimitry Andric if (LangOpts.GNUCVersion) 10160b57cec5SDimitry Andric addLockFreeMacros("__GCC_ATOMIC_"); 10170b57cec5SDimitry Andric 10180b57cec5SDimitry Andric if (LangOpts.NoInlineDefine) 10190b57cec5SDimitry Andric Builder.defineMacro("__NO_INLINE__"); 10200b57cec5SDimitry Andric 10210b57cec5SDimitry Andric if (unsigned PICLevel = LangOpts.PICLevel) { 10220b57cec5SDimitry Andric Builder.defineMacro("__PIC__", Twine(PICLevel)); 10230b57cec5SDimitry Andric Builder.defineMacro("__pic__", Twine(PICLevel)); 10240b57cec5SDimitry Andric if (LangOpts.PIE) { 10250b57cec5SDimitry Andric Builder.defineMacro("__PIE__", Twine(PICLevel)); 10260b57cec5SDimitry Andric Builder.defineMacro("__pie__", Twine(PICLevel)); 10270b57cec5SDimitry Andric } 10280b57cec5SDimitry Andric } 10290b57cec5SDimitry Andric 10300b57cec5SDimitry Andric // Macros to control C99 numerics and <float.h> 10310b57cec5SDimitry Andric Builder.defineMacro("__FLT_EVAL_METHOD__", Twine(TI.getFloatEvalMethod())); 10320b57cec5SDimitry Andric Builder.defineMacro("__FLT_RADIX__", "2"); 10330b57cec5SDimitry Andric Builder.defineMacro("__DECIMAL_DIG__", "__LDBL_DECIMAL_DIG__"); 10340b57cec5SDimitry Andric 10350b57cec5SDimitry Andric if (LangOpts.getStackProtector() == LangOptions::SSPOn) 10360b57cec5SDimitry Andric Builder.defineMacro("__SSP__"); 10370b57cec5SDimitry Andric else if (LangOpts.getStackProtector() == LangOptions::SSPStrong) 10380b57cec5SDimitry Andric Builder.defineMacro("__SSP_STRONG__", "2"); 10390b57cec5SDimitry Andric else if (LangOpts.getStackProtector() == LangOptions::SSPReq) 10400b57cec5SDimitry Andric Builder.defineMacro("__SSP_ALL__", "3"); 10410b57cec5SDimitry Andric 1042a7dea167SDimitry Andric if (PPOpts.SetUpStaticAnalyzer) 10430b57cec5SDimitry Andric Builder.defineMacro("__clang_analyzer__"); 10440b57cec5SDimitry Andric 10450b57cec5SDimitry Andric if (LangOpts.FastRelaxedMath) 10460b57cec5SDimitry Andric Builder.defineMacro("__FAST_RELAXED_MATH__"); 10470b57cec5SDimitry Andric 10480b57cec5SDimitry Andric if (FEOpts.ProgramAction == frontend::RewriteObjC || 10490b57cec5SDimitry Andric LangOpts.getGC() != LangOptions::NonGC) { 10500b57cec5SDimitry Andric Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))"); 10510b57cec5SDimitry Andric Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))"); 10520b57cec5SDimitry Andric Builder.defineMacro("__autoreleasing", ""); 10530b57cec5SDimitry Andric Builder.defineMacro("__unsafe_unretained", ""); 10540b57cec5SDimitry Andric } else if (LangOpts.ObjC) { 10550b57cec5SDimitry Andric Builder.defineMacro("__weak", "__attribute__((objc_ownership(weak)))"); 10560b57cec5SDimitry Andric Builder.defineMacro("__strong", "__attribute__((objc_ownership(strong)))"); 10570b57cec5SDimitry Andric Builder.defineMacro("__autoreleasing", 10580b57cec5SDimitry Andric "__attribute__((objc_ownership(autoreleasing)))"); 10590b57cec5SDimitry Andric Builder.defineMacro("__unsafe_unretained", 10600b57cec5SDimitry Andric "__attribute__((objc_ownership(none)))"); 10610b57cec5SDimitry Andric } 10620b57cec5SDimitry Andric 10630b57cec5SDimitry Andric // On Darwin, there are __double_underscored variants of the type 10640b57cec5SDimitry Andric // nullability qualifiers. 10650b57cec5SDimitry Andric if (TI.getTriple().isOSDarwin()) { 10660b57cec5SDimitry Andric Builder.defineMacro("__nonnull", "_Nonnull"); 10670b57cec5SDimitry Andric Builder.defineMacro("__null_unspecified", "_Null_unspecified"); 10680b57cec5SDimitry Andric Builder.defineMacro("__nullable", "_Nullable"); 10690b57cec5SDimitry Andric } 10700b57cec5SDimitry Andric 10710b57cec5SDimitry Andric // Add a macro to differentiate between regular iOS/tvOS/watchOS targets and 10720b57cec5SDimitry Andric // the corresponding simulator targets. 10730b57cec5SDimitry Andric if (TI.getTriple().isOSDarwin() && TI.getTriple().isSimulatorEnvironment()) 10740b57cec5SDimitry Andric Builder.defineMacro("__APPLE_EMBEDDED_SIMULATOR__", "1"); 10750b57cec5SDimitry Andric 10760b57cec5SDimitry Andric // OpenMP definition 10770b57cec5SDimitry Andric // OpenMP 2.2: 10780b57cec5SDimitry Andric // In implementations that support a preprocessor, the _OPENMP 10790b57cec5SDimitry Andric // macro name is defined to have the decimal value yyyymm where 10800b57cec5SDimitry Andric // yyyy and mm are the year and the month designations of the 10810b57cec5SDimitry Andric // version of the OpenMP API that the implementation support. 10820b57cec5SDimitry Andric if (!LangOpts.OpenMPSimd) { 10830b57cec5SDimitry Andric switch (LangOpts.OpenMP) { 10840b57cec5SDimitry Andric case 0: 10850b57cec5SDimitry Andric break; 1086a7dea167SDimitry Andric case 31: 1087a7dea167SDimitry Andric Builder.defineMacro("_OPENMP", "201107"); 1088a7dea167SDimitry Andric break; 10890b57cec5SDimitry Andric case 40: 10900b57cec5SDimitry Andric Builder.defineMacro("_OPENMP", "201307"); 10910b57cec5SDimitry Andric break; 10925ffd83dbSDimitry Andric case 45: 10935ffd83dbSDimitry Andric Builder.defineMacro("_OPENMP", "201511"); 10940b57cec5SDimitry Andric break; 10950b57cec5SDimitry Andric default: 10965ffd83dbSDimitry Andric // Default version is OpenMP 5.0 10975ffd83dbSDimitry Andric Builder.defineMacro("_OPENMP", "201811"); 10980b57cec5SDimitry Andric break; 10990b57cec5SDimitry Andric } 11000b57cec5SDimitry Andric } 11010b57cec5SDimitry Andric 11020b57cec5SDimitry Andric // CUDA device path compilaton 11030b57cec5SDimitry Andric if (LangOpts.CUDAIsDevice && !LangOpts.HIP) { 11040b57cec5SDimitry Andric // The CUDA_ARCH value is set for the GPU target specified in the NVPTX 11050b57cec5SDimitry Andric // backend's target defines. 11060b57cec5SDimitry Andric Builder.defineMacro("__CUDA_ARCH__"); 11070b57cec5SDimitry Andric } 11080b57cec5SDimitry Andric 11090b57cec5SDimitry Andric // We need to communicate this to our CUDA header wrapper, which in turn 11100b57cec5SDimitry Andric // informs the proper CUDA headers of this choice. 11110b57cec5SDimitry Andric if (LangOpts.CUDADeviceApproxTranscendentals || LangOpts.FastMath) { 11120b57cec5SDimitry Andric Builder.defineMacro("__CLANG_CUDA_APPROX_TRANSCENDENTALS__"); 11130b57cec5SDimitry Andric } 11140b57cec5SDimitry Andric 11150b57cec5SDimitry Andric // Define a macro indicating that the source file is being compiled with a 11160b57cec5SDimitry Andric // SYCL device compiler which doesn't produce host binary. 11170b57cec5SDimitry Andric if (LangOpts.SYCLIsDevice) { 11180b57cec5SDimitry Andric Builder.defineMacro("__SYCL_DEVICE_ONLY__", "1"); 11190b57cec5SDimitry Andric } 11200b57cec5SDimitry Andric 11210b57cec5SDimitry Andric // OpenCL definitions. 11220b57cec5SDimitry Andric if (LangOpts.OpenCL) { 1123e8d8bef9SDimitry Andric TI.getOpenCLFeatureDefines(LangOpts, Builder); 11240b57cec5SDimitry Andric 11250b57cec5SDimitry Andric if (TI.getTriple().isSPIR()) 11260b57cec5SDimitry Andric Builder.defineMacro("__IMAGE_SUPPORT__"); 11270b57cec5SDimitry Andric } 11280b57cec5SDimitry Andric 11290b57cec5SDimitry Andric if (TI.hasInt128Type() && LangOpts.CPlusPlus && LangOpts.GNUMode) { 11300b57cec5SDimitry Andric // For each extended integer type, g++ defines a macro mapping the 11310b57cec5SDimitry Andric // index of the type (0 in this case) in some list of extended types 11320b57cec5SDimitry Andric // to the type. 11330b57cec5SDimitry Andric Builder.defineMacro("__GLIBCXX_TYPE_INT_N_0", "__int128"); 11340b57cec5SDimitry Andric Builder.defineMacro("__GLIBCXX_BITSIZE_INT_N_0", "128"); 11350b57cec5SDimitry Andric } 11360b57cec5SDimitry Andric 11370b57cec5SDimitry Andric // Get other target #defines. 11380b57cec5SDimitry Andric TI.getTargetDefines(LangOpts, Builder); 11390b57cec5SDimitry Andric } 11400b57cec5SDimitry Andric 11410b57cec5SDimitry Andric /// InitializePreprocessor - Initialize the preprocessor getting it and the 11420b57cec5SDimitry Andric /// environment ready to process a single file. This returns true on error. 11430b57cec5SDimitry Andric /// 11440b57cec5SDimitry Andric void clang::InitializePreprocessor( 11450b57cec5SDimitry Andric Preprocessor &PP, const PreprocessorOptions &InitOpts, 11460b57cec5SDimitry Andric const PCHContainerReader &PCHContainerRdr, 11470b57cec5SDimitry Andric const FrontendOptions &FEOpts) { 11480b57cec5SDimitry Andric const LangOptions &LangOpts = PP.getLangOpts(); 11490b57cec5SDimitry Andric std::string PredefineBuffer; 11500b57cec5SDimitry Andric PredefineBuffer.reserve(4080); 11510b57cec5SDimitry Andric llvm::raw_string_ostream Predefines(PredefineBuffer); 11520b57cec5SDimitry Andric MacroBuilder Builder(Predefines); 11530b57cec5SDimitry Andric 11540b57cec5SDimitry Andric // Emit line markers for various builtin sections of the file. We don't do 11550b57cec5SDimitry Andric // this in asm preprocessor mode, because "# 4" is not a line marker directive 11560b57cec5SDimitry Andric // in this mode. 11570b57cec5SDimitry Andric if (!PP.getLangOpts().AsmPreprocessor) 11580b57cec5SDimitry Andric Builder.append("# 1 \"<built-in>\" 3"); 11590b57cec5SDimitry Andric 11600b57cec5SDimitry Andric // Install things like __POWERPC__, __GNUC__, etc into the macro table. 11610b57cec5SDimitry Andric if (InitOpts.UsePredefines) { 11620b57cec5SDimitry Andric // FIXME: This will create multiple definitions for most of the predefined 11630b57cec5SDimitry Andric // macros. This is not the right way to handle this. 1164480093f4SDimitry Andric if ((LangOpts.CUDA || LangOpts.OpenMPIsDevice || LangOpts.SYCLIsDevice) && 1165480093f4SDimitry Andric PP.getAuxTargetInfo()) 11660b57cec5SDimitry Andric InitializePredefinedMacros(*PP.getAuxTargetInfo(), LangOpts, FEOpts, 1167a7dea167SDimitry Andric PP.getPreprocessorOpts(), Builder); 11680b57cec5SDimitry Andric 1169a7dea167SDimitry Andric InitializePredefinedMacros(PP.getTargetInfo(), LangOpts, FEOpts, 1170a7dea167SDimitry Andric PP.getPreprocessorOpts(), Builder); 11710b57cec5SDimitry Andric 11720b57cec5SDimitry Andric // Install definitions to make Objective-C++ ARC work well with various 11730b57cec5SDimitry Andric // C++ Standard Library implementations. 11740b57cec5SDimitry Andric if (LangOpts.ObjC && LangOpts.CPlusPlus && 11750b57cec5SDimitry Andric (LangOpts.ObjCAutoRefCount || LangOpts.ObjCWeak)) { 11760b57cec5SDimitry Andric switch (InitOpts.ObjCXXARCStandardLibrary) { 11770b57cec5SDimitry Andric case ARCXX_nolib: 11780b57cec5SDimitry Andric case ARCXX_libcxx: 11790b57cec5SDimitry Andric break; 11800b57cec5SDimitry Andric 11810b57cec5SDimitry Andric case ARCXX_libstdcxx: 11820b57cec5SDimitry Andric AddObjCXXARCLibstdcxxDefines(LangOpts, Builder); 11830b57cec5SDimitry Andric break; 11840b57cec5SDimitry Andric } 11850b57cec5SDimitry Andric } 11860b57cec5SDimitry Andric } 11870b57cec5SDimitry Andric 11880b57cec5SDimitry Andric // Even with predefines off, some macros are still predefined. 11890b57cec5SDimitry Andric // These should all be defined in the preprocessor according to the 11900b57cec5SDimitry Andric // current language configuration. 11910b57cec5SDimitry Andric InitializeStandardPredefinedMacros(PP.getTargetInfo(), PP.getLangOpts(), 11920b57cec5SDimitry Andric FEOpts, Builder); 11930b57cec5SDimitry Andric 11940b57cec5SDimitry Andric // Add on the predefines from the driver. Wrap in a #line directive to report 11950b57cec5SDimitry Andric // that they come from the command line. 11960b57cec5SDimitry Andric if (!PP.getLangOpts().AsmPreprocessor) 11970b57cec5SDimitry Andric Builder.append("# 1 \"<command line>\" 1"); 11980b57cec5SDimitry Andric 11990b57cec5SDimitry Andric // Process #define's and #undef's in the order they are given. 12000b57cec5SDimitry Andric for (unsigned i = 0, e = InitOpts.Macros.size(); i != e; ++i) { 12010b57cec5SDimitry Andric if (InitOpts.Macros[i].second) // isUndef 12020b57cec5SDimitry Andric Builder.undefineMacro(InitOpts.Macros[i].first); 12030b57cec5SDimitry Andric else 12040b57cec5SDimitry Andric DefineBuiltinMacro(Builder, InitOpts.Macros[i].first, 12050b57cec5SDimitry Andric PP.getDiagnostics()); 12060b57cec5SDimitry Andric } 12070b57cec5SDimitry Andric 12080b57cec5SDimitry Andric // Exit the command line and go back to <built-in> (2 is LC_LEAVE). 12090b57cec5SDimitry Andric if (!PP.getLangOpts().AsmPreprocessor) 12100b57cec5SDimitry Andric Builder.append("# 1 \"<built-in>\" 2"); 12110b57cec5SDimitry Andric 12120b57cec5SDimitry Andric // If -imacros are specified, include them now. These are processed before 12130b57cec5SDimitry Andric // any -include directives. 12140b57cec5SDimitry Andric for (unsigned i = 0, e = InitOpts.MacroIncludes.size(); i != e; ++i) 12150b57cec5SDimitry Andric AddImplicitIncludeMacros(Builder, InitOpts.MacroIncludes[i]); 12160b57cec5SDimitry Andric 12170b57cec5SDimitry Andric // Process -include-pch/-include-pth directives. 12180b57cec5SDimitry Andric if (!InitOpts.ImplicitPCHInclude.empty()) 12190b57cec5SDimitry Andric AddImplicitIncludePCH(Builder, PP, PCHContainerRdr, 12200b57cec5SDimitry Andric InitOpts.ImplicitPCHInclude); 12210b57cec5SDimitry Andric 12220b57cec5SDimitry Andric // Process -include directives. 12230b57cec5SDimitry Andric for (unsigned i = 0, e = InitOpts.Includes.size(); i != e; ++i) { 12240b57cec5SDimitry Andric const std::string &Path = InitOpts.Includes[i]; 12250b57cec5SDimitry Andric AddImplicitInclude(Builder, Path); 12260b57cec5SDimitry Andric } 12270b57cec5SDimitry Andric 12280b57cec5SDimitry Andric // Instruct the preprocessor to skip the preamble. 12290b57cec5SDimitry Andric PP.setSkipMainFilePreamble(InitOpts.PrecompiledPreambleBytes.first, 12300b57cec5SDimitry Andric InitOpts.PrecompiledPreambleBytes.second); 12310b57cec5SDimitry Andric 12320b57cec5SDimitry Andric // Copy PredefinedBuffer into the Preprocessor. 12330b57cec5SDimitry Andric PP.setPredefines(Predefines.str()); 12340b57cec5SDimitry Andric } 1235