1*67e74705SXin Li //===--- InitPreprocessor.cpp - PP initialization code. ---------*- C++ -*-===//
2*67e74705SXin Li //
3*67e74705SXin Li // The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file implements the clang::InitializePreprocessor function.
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li
14*67e74705SXin Li #include "clang/Frontend/Utils.h"
15*67e74705SXin Li #include "clang/Basic/FileManager.h"
16*67e74705SXin Li #include "clang/Basic/MacroBuilder.h"
17*67e74705SXin Li #include "clang/Basic/SourceManager.h"
18*67e74705SXin Li #include "clang/Basic/TargetInfo.h"
19*67e74705SXin Li #include "clang/Basic/Version.h"
20*67e74705SXin Li #include "clang/Frontend/FrontendDiagnostic.h"
21*67e74705SXin Li #include "clang/Frontend/FrontendOptions.h"
22*67e74705SXin Li #include "clang/Lex/HeaderSearch.h"
23*67e74705SXin Li #include "clang/Lex/PTHManager.h"
24*67e74705SXin Li #include "clang/Lex/Preprocessor.h"
25*67e74705SXin Li #include "clang/Lex/PreprocessorOptions.h"
26*67e74705SXin Li #include "clang/Serialization/ASTReader.h"
27*67e74705SXin Li #include "llvm/ADT/APFloat.h"
28*67e74705SXin Li #include "llvm/Support/FileSystem.h"
29*67e74705SXin Li #include "llvm/Support/MemoryBuffer.h"
30*67e74705SXin Li #include "llvm/Support/Path.h"
31*67e74705SXin Li using namespace clang;
32*67e74705SXin Li
MacroBodyEndsInBackslash(StringRef MacroBody)33*67e74705SXin Li static bool MacroBodyEndsInBackslash(StringRef MacroBody) {
34*67e74705SXin Li while (!MacroBody.empty() && isWhitespace(MacroBody.back()))
35*67e74705SXin Li MacroBody = MacroBody.drop_back();
36*67e74705SXin Li return !MacroBody.empty() && MacroBody.back() == '\\';
37*67e74705SXin Li }
38*67e74705SXin Li
39*67e74705SXin Li // Append a #define line to Buf for Macro. Macro should be of the form XXX,
40*67e74705SXin Li // in which case we emit "#define XXX 1" or "XXX=Y z W" in which case we emit
41*67e74705SXin Li // "#define XXX Y z W". To get a #define with no value, use "XXX=".
DefineBuiltinMacro(MacroBuilder & Builder,StringRef Macro,DiagnosticsEngine & Diags)42*67e74705SXin Li static void DefineBuiltinMacro(MacroBuilder &Builder, StringRef Macro,
43*67e74705SXin Li DiagnosticsEngine &Diags) {
44*67e74705SXin Li std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
45*67e74705SXin Li StringRef MacroName = MacroPair.first;
46*67e74705SXin Li StringRef MacroBody = MacroPair.second;
47*67e74705SXin Li if (MacroName.size() != Macro.size()) {
48*67e74705SXin Li // Per GCC -D semantics, the macro ends at \n if it exists.
49*67e74705SXin Li StringRef::size_type End = MacroBody.find_first_of("\n\r");
50*67e74705SXin Li if (End != StringRef::npos)
51*67e74705SXin Li Diags.Report(diag::warn_fe_macro_contains_embedded_newline)
52*67e74705SXin Li << MacroName;
53*67e74705SXin Li MacroBody = MacroBody.substr(0, End);
54*67e74705SXin Li // We handle macro bodies which end in a backslash by appending an extra
55*67e74705SXin Li // backslash+newline. This makes sure we don't accidentally treat the
56*67e74705SXin Li // backslash as a line continuation marker.
57*67e74705SXin Li if (MacroBodyEndsInBackslash(MacroBody))
58*67e74705SXin Li Builder.defineMacro(MacroName, Twine(MacroBody) + "\\\n");
59*67e74705SXin Li else
60*67e74705SXin Li Builder.defineMacro(MacroName, MacroBody);
61*67e74705SXin Li } else {
62*67e74705SXin Li // Push "macroname 1".
63*67e74705SXin Li Builder.defineMacro(Macro);
64*67e74705SXin Li }
65*67e74705SXin Li }
66*67e74705SXin Li
67*67e74705SXin Li /// AddImplicitInclude - Add an implicit \#include of the specified file to the
68*67e74705SXin Li /// predefines buffer.
69*67e74705SXin Li /// As these includes are generated by -include arguments the header search
70*67e74705SXin Li /// logic is going to search relatively to the current working directory.
AddImplicitInclude(MacroBuilder & Builder,StringRef File)71*67e74705SXin Li static void AddImplicitInclude(MacroBuilder &Builder, StringRef File) {
72*67e74705SXin Li Builder.append(Twine("#include \"") + File + "\"");
73*67e74705SXin Li }
74*67e74705SXin Li
AddImplicitIncludeMacros(MacroBuilder & Builder,StringRef File)75*67e74705SXin Li static void AddImplicitIncludeMacros(MacroBuilder &Builder, StringRef File) {
76*67e74705SXin Li Builder.append(Twine("#__include_macros \"") + File + "\"");
77*67e74705SXin Li // Marker token to stop the __include_macros fetch loop.
78*67e74705SXin Li Builder.append("##"); // ##?
79*67e74705SXin Li }
80*67e74705SXin Li
81*67e74705SXin Li /// AddImplicitIncludePTH - Add an implicit \#include using the original file
82*67e74705SXin Li /// used to generate a PTH cache.
AddImplicitIncludePTH(MacroBuilder & Builder,Preprocessor & PP,StringRef ImplicitIncludePTH)83*67e74705SXin Li static void AddImplicitIncludePTH(MacroBuilder &Builder, Preprocessor &PP,
84*67e74705SXin Li StringRef ImplicitIncludePTH) {
85*67e74705SXin Li PTHManager *P = PP.getPTHManager();
86*67e74705SXin Li // Null check 'P' in the corner case where it couldn't be created.
87*67e74705SXin Li const char *OriginalFile = P ? P->getOriginalSourceFile() : nullptr;
88*67e74705SXin Li
89*67e74705SXin Li if (!OriginalFile) {
90*67e74705SXin Li PP.getDiagnostics().Report(diag::err_fe_pth_file_has_no_source_header)
91*67e74705SXin Li << ImplicitIncludePTH;
92*67e74705SXin Li return;
93*67e74705SXin Li }
94*67e74705SXin Li
95*67e74705SXin Li AddImplicitInclude(Builder, OriginalFile);
96*67e74705SXin Li }
97*67e74705SXin Li
98*67e74705SXin Li /// \brief Add an implicit \#include using the original file used to generate
99*67e74705SXin Li /// a PCH file.
AddImplicitIncludePCH(MacroBuilder & Builder,Preprocessor & PP,const PCHContainerReader & PCHContainerRdr,StringRef ImplicitIncludePCH)100*67e74705SXin Li static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP,
101*67e74705SXin Li const PCHContainerReader &PCHContainerRdr,
102*67e74705SXin Li StringRef ImplicitIncludePCH) {
103*67e74705SXin Li std::string OriginalFile =
104*67e74705SXin Li ASTReader::getOriginalSourceFile(ImplicitIncludePCH, PP.getFileManager(),
105*67e74705SXin Li PCHContainerRdr, PP.getDiagnostics());
106*67e74705SXin Li if (OriginalFile.empty())
107*67e74705SXin Li return;
108*67e74705SXin Li
109*67e74705SXin Li AddImplicitInclude(Builder, OriginalFile);
110*67e74705SXin Li }
111*67e74705SXin Li
112*67e74705SXin Li /// PickFP - This is used to pick a value based on the FP semantics of the
113*67e74705SXin Li /// specified FP model.
114*67e74705SXin Li template <typename T>
PickFP(const llvm::fltSemantics * Sem,T IEEESingleVal,T IEEEDoubleVal,T X87DoubleExtendedVal,T PPCDoubleDoubleVal,T IEEEQuadVal)115*67e74705SXin Li static T PickFP(const llvm::fltSemantics *Sem, T IEEESingleVal,
116*67e74705SXin Li T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal,
117*67e74705SXin Li T IEEEQuadVal) {
118*67e74705SXin Li if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle)
119*67e74705SXin Li return IEEESingleVal;
120*67e74705SXin Li if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEdouble)
121*67e74705SXin Li return IEEEDoubleVal;
122*67e74705SXin Li if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::x87DoubleExtended)
123*67e74705SXin Li return X87DoubleExtendedVal;
124*67e74705SXin Li if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble)
125*67e74705SXin Li return PPCDoubleDoubleVal;
126*67e74705SXin Li assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad);
127*67e74705SXin Li return IEEEQuadVal;
128*67e74705SXin Li }
129*67e74705SXin Li
DefineFloatMacros(MacroBuilder & Builder,StringRef Prefix,const llvm::fltSemantics * Sem,StringRef Ext)130*67e74705SXin Li static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,
131*67e74705SXin Li const llvm::fltSemantics *Sem, StringRef Ext) {
132*67e74705SXin Li const char *DenormMin, *Epsilon, *Max, *Min;
133*67e74705SXin Li DenormMin = PickFP(Sem, "1.40129846e-45", "4.9406564584124654e-324",
134*67e74705SXin Li "3.64519953188247460253e-4951",
135*67e74705SXin Li "4.94065645841246544176568792868221e-324",
136*67e74705SXin Li "6.47517511943802511092443895822764655e-4966");
137*67e74705SXin Li int Digits = PickFP(Sem, 6, 15, 18, 31, 33);
138*67e74705SXin Li int DecimalDigits = PickFP(Sem, 9, 17, 21, 33, 36);
139*67e74705SXin Li Epsilon = PickFP(Sem, "1.19209290e-7", "2.2204460492503131e-16",
140*67e74705SXin Li "1.08420217248550443401e-19",
141*67e74705SXin Li "4.94065645841246544176568792868221e-324",
142*67e74705SXin Li "1.92592994438723585305597794258492732e-34");
143*67e74705SXin Li int MantissaDigits = PickFP(Sem, 24, 53, 64, 106, 113);
144*67e74705SXin Li int Min10Exp = PickFP(Sem, -37, -307, -4931, -291, -4931);
145*67e74705SXin Li int Max10Exp = PickFP(Sem, 38, 308, 4932, 308, 4932);
146*67e74705SXin Li int MinExp = PickFP(Sem, -125, -1021, -16381, -968, -16381);
147*67e74705SXin Li int MaxExp = PickFP(Sem, 128, 1024, 16384, 1024, 16384);
148*67e74705SXin Li Min = PickFP(Sem, "1.17549435e-38", "2.2250738585072014e-308",
149*67e74705SXin Li "3.36210314311209350626e-4932",
150*67e74705SXin Li "2.00416836000897277799610805135016e-292",
151*67e74705SXin Li "3.36210314311209350626267781732175260e-4932");
152*67e74705SXin Li Max = PickFP(Sem, "3.40282347e+38", "1.7976931348623157e+308",
153*67e74705SXin Li "1.18973149535723176502e+4932",
154*67e74705SXin Li "1.79769313486231580793728971405301e+308",
155*67e74705SXin Li "1.18973149535723176508575932662800702e+4932");
156*67e74705SXin Li
157*67e74705SXin Li SmallString<32> DefPrefix;
158*67e74705SXin Li DefPrefix = "__";
159*67e74705SXin Li DefPrefix += Prefix;
160*67e74705SXin Li DefPrefix += "_";
161*67e74705SXin Li
162*67e74705SXin Li Builder.defineMacro(DefPrefix + "DENORM_MIN__", Twine(DenormMin)+Ext);
163*67e74705SXin Li Builder.defineMacro(DefPrefix + "HAS_DENORM__");
164*67e74705SXin Li Builder.defineMacro(DefPrefix + "DIG__", Twine(Digits));
165*67e74705SXin Li Builder.defineMacro(DefPrefix + "DECIMAL_DIG__", Twine(DecimalDigits));
166*67e74705SXin Li Builder.defineMacro(DefPrefix + "EPSILON__", Twine(Epsilon)+Ext);
167*67e74705SXin Li Builder.defineMacro(DefPrefix + "HAS_INFINITY__");
168*67e74705SXin Li Builder.defineMacro(DefPrefix + "HAS_QUIET_NAN__");
169*67e74705SXin Li Builder.defineMacro(DefPrefix + "MANT_DIG__", Twine(MantissaDigits));
170*67e74705SXin Li
171*67e74705SXin Li Builder.defineMacro(DefPrefix + "MAX_10_EXP__", Twine(Max10Exp));
172*67e74705SXin Li Builder.defineMacro(DefPrefix + "MAX_EXP__", Twine(MaxExp));
173*67e74705SXin Li Builder.defineMacro(DefPrefix + "MAX__", Twine(Max)+Ext);
174*67e74705SXin Li
175*67e74705SXin Li Builder.defineMacro(DefPrefix + "MIN_10_EXP__","("+Twine(Min10Exp)+")");
176*67e74705SXin Li Builder.defineMacro(DefPrefix + "MIN_EXP__", "("+Twine(MinExp)+")");
177*67e74705SXin Li Builder.defineMacro(DefPrefix + "MIN__", Twine(Min)+Ext);
178*67e74705SXin Li }
179*67e74705SXin Li
180*67e74705SXin Li
181*67e74705SXin Li /// DefineTypeSize - Emit a macro to the predefines buffer that declares a macro
182*67e74705SXin Li /// named MacroName with the max value for a type with width 'TypeWidth' a
183*67e74705SXin Li /// signedness of 'isSigned' and with a value suffix of 'ValSuffix' (e.g. LL).
DefineTypeSize(const Twine & MacroName,unsigned TypeWidth,StringRef ValSuffix,bool isSigned,MacroBuilder & Builder)184*67e74705SXin Li static void DefineTypeSize(const Twine &MacroName, unsigned TypeWidth,
185*67e74705SXin Li StringRef ValSuffix, bool isSigned,
186*67e74705SXin Li MacroBuilder &Builder) {
187*67e74705SXin Li llvm::APInt MaxVal = isSigned ? llvm::APInt::getSignedMaxValue(TypeWidth)
188*67e74705SXin Li : llvm::APInt::getMaxValue(TypeWidth);
189*67e74705SXin Li Builder.defineMacro(MacroName, MaxVal.toString(10, isSigned) + ValSuffix);
190*67e74705SXin Li }
191*67e74705SXin Li
192*67e74705SXin Li /// DefineTypeSize - An overloaded helper that uses TargetInfo to determine
193*67e74705SXin Li /// the width, suffix, and signedness of the given type
DefineTypeSize(const Twine & MacroName,TargetInfo::IntType Ty,const TargetInfo & TI,MacroBuilder & Builder)194*67e74705SXin Li static void DefineTypeSize(const Twine &MacroName, TargetInfo::IntType Ty,
195*67e74705SXin Li const TargetInfo &TI, MacroBuilder &Builder) {
196*67e74705SXin Li DefineTypeSize(MacroName, TI.getTypeWidth(Ty), TI.getTypeConstantSuffix(Ty),
197*67e74705SXin Li TI.isTypeSigned(Ty), Builder);
198*67e74705SXin Li }
199*67e74705SXin Li
DefineFmt(const Twine & Prefix,TargetInfo::IntType Ty,const TargetInfo & TI,MacroBuilder & Builder)200*67e74705SXin Li static void DefineFmt(const Twine &Prefix, TargetInfo::IntType Ty,
201*67e74705SXin Li const TargetInfo &TI, MacroBuilder &Builder) {
202*67e74705SXin Li bool IsSigned = TI.isTypeSigned(Ty);
203*67e74705SXin Li StringRef FmtModifier = TI.getTypeFormatModifier(Ty);
204*67e74705SXin Li for (const char *Fmt = IsSigned ? "di" : "ouxX"; *Fmt; ++Fmt) {
205*67e74705SXin Li Builder.defineMacro(Prefix + "_FMT" + Twine(*Fmt) + "__",
206*67e74705SXin Li Twine("\"") + FmtModifier + Twine(*Fmt) + "\"");
207*67e74705SXin Li }
208*67e74705SXin Li }
209*67e74705SXin Li
DefineType(const Twine & MacroName,TargetInfo::IntType Ty,MacroBuilder & Builder)210*67e74705SXin Li static void DefineType(const Twine &MacroName, TargetInfo::IntType Ty,
211*67e74705SXin Li MacroBuilder &Builder) {
212*67e74705SXin Li Builder.defineMacro(MacroName, TargetInfo::getTypeName(Ty));
213*67e74705SXin Li }
214*67e74705SXin Li
DefineTypeWidth(StringRef MacroName,TargetInfo::IntType Ty,const TargetInfo & TI,MacroBuilder & Builder)215*67e74705SXin Li static void DefineTypeWidth(StringRef MacroName, TargetInfo::IntType Ty,
216*67e74705SXin Li const TargetInfo &TI, MacroBuilder &Builder) {
217*67e74705SXin Li Builder.defineMacro(MacroName, Twine(TI.getTypeWidth(Ty)));
218*67e74705SXin Li }
219*67e74705SXin Li
DefineTypeSizeof(StringRef MacroName,unsigned BitWidth,const TargetInfo & TI,MacroBuilder & Builder)220*67e74705SXin Li static void DefineTypeSizeof(StringRef MacroName, unsigned BitWidth,
221*67e74705SXin Li const TargetInfo &TI, MacroBuilder &Builder) {
222*67e74705SXin Li Builder.defineMacro(MacroName,
223*67e74705SXin Li Twine(BitWidth / TI.getCharWidth()));
224*67e74705SXin Li }
225*67e74705SXin Li
DefineExactWidthIntType(TargetInfo::IntType Ty,const TargetInfo & TI,MacroBuilder & Builder)226*67e74705SXin Li static void DefineExactWidthIntType(TargetInfo::IntType Ty,
227*67e74705SXin Li const TargetInfo &TI,
228*67e74705SXin Li MacroBuilder &Builder) {
229*67e74705SXin Li int TypeWidth = TI.getTypeWidth(Ty);
230*67e74705SXin Li bool IsSigned = TI.isTypeSigned(Ty);
231*67e74705SXin Li
232*67e74705SXin Li // Use the target specified int64 type, when appropriate, so that [u]int64_t
233*67e74705SXin Li // ends up being defined in terms of the correct type.
234*67e74705SXin Li if (TypeWidth == 64)
235*67e74705SXin Li Ty = IsSigned ? TI.getInt64Type() : TI.getUInt64Type();
236*67e74705SXin Li
237*67e74705SXin Li const char *Prefix = IsSigned ? "__INT" : "__UINT";
238*67e74705SXin Li
239*67e74705SXin Li DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder);
240*67e74705SXin Li DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder);
241*67e74705SXin Li
242*67e74705SXin Li StringRef ConstSuffix(TI.getTypeConstantSuffix(Ty));
243*67e74705SXin Li Builder.defineMacro(Prefix + Twine(TypeWidth) + "_C_SUFFIX__", ConstSuffix);
244*67e74705SXin Li }
245*67e74705SXin Li
DefineExactWidthIntTypeSize(TargetInfo::IntType Ty,const TargetInfo & TI,MacroBuilder & Builder)246*67e74705SXin Li static void DefineExactWidthIntTypeSize(TargetInfo::IntType Ty,
247*67e74705SXin Li const TargetInfo &TI,
248*67e74705SXin Li MacroBuilder &Builder) {
249*67e74705SXin Li int TypeWidth = TI.getTypeWidth(Ty);
250*67e74705SXin Li bool IsSigned = TI.isTypeSigned(Ty);
251*67e74705SXin Li
252*67e74705SXin Li // Use the target specified int64 type, when appropriate, so that [u]int64_t
253*67e74705SXin Li // ends up being defined in terms of the correct type.
254*67e74705SXin Li if (TypeWidth == 64)
255*67e74705SXin Li Ty = IsSigned ? TI.getInt64Type() : TI.getUInt64Type();
256*67e74705SXin Li
257*67e74705SXin Li const char *Prefix = IsSigned ? "__INT" : "__UINT";
258*67e74705SXin Li DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder);
259*67e74705SXin Li }
260*67e74705SXin Li
DefineLeastWidthIntType(unsigned TypeWidth,bool IsSigned,const TargetInfo & TI,MacroBuilder & Builder)261*67e74705SXin Li static void DefineLeastWidthIntType(unsigned TypeWidth, bool IsSigned,
262*67e74705SXin Li const TargetInfo &TI,
263*67e74705SXin Li MacroBuilder &Builder) {
264*67e74705SXin Li TargetInfo::IntType Ty = TI.getLeastIntTypeByWidth(TypeWidth, IsSigned);
265*67e74705SXin Li if (Ty == TargetInfo::NoInt)
266*67e74705SXin Li return;
267*67e74705SXin Li
268*67e74705SXin Li const char *Prefix = IsSigned ? "__INT_LEAST" : "__UINT_LEAST";
269*67e74705SXin Li DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder);
270*67e74705SXin Li DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder);
271*67e74705SXin Li DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder);
272*67e74705SXin Li }
273*67e74705SXin Li
DefineFastIntType(unsigned TypeWidth,bool IsSigned,const TargetInfo & TI,MacroBuilder & Builder)274*67e74705SXin Li static void DefineFastIntType(unsigned TypeWidth, bool IsSigned,
275*67e74705SXin Li const TargetInfo &TI, MacroBuilder &Builder) {
276*67e74705SXin Li // stdint.h currently defines the fast int types as equivalent to the least
277*67e74705SXin Li // types.
278*67e74705SXin Li TargetInfo::IntType Ty = TI.getLeastIntTypeByWidth(TypeWidth, IsSigned);
279*67e74705SXin Li if (Ty == TargetInfo::NoInt)
280*67e74705SXin Li return;
281*67e74705SXin Li
282*67e74705SXin Li const char *Prefix = IsSigned ? "__INT_FAST" : "__UINT_FAST";
283*67e74705SXin Li DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder);
284*67e74705SXin Li DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder);
285*67e74705SXin Li
286*67e74705SXin Li DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder);
287*67e74705SXin Li }
288*67e74705SXin Li
289*67e74705SXin Li
290*67e74705SXin Li /// Get the value the ATOMIC_*_LOCK_FREE macro should have for a type with
291*67e74705SXin Li /// the specified properties.
getLockFreeValue(unsigned TypeWidth,unsigned TypeAlign,unsigned InlineWidth)292*67e74705SXin Li static const char *getLockFreeValue(unsigned TypeWidth, unsigned TypeAlign,
293*67e74705SXin Li unsigned InlineWidth) {
294*67e74705SXin Li // Fully-aligned, power-of-2 sizes no larger than the inline
295*67e74705SXin Li // width will be inlined as lock-free operations.
296*67e74705SXin Li if (TypeWidth == TypeAlign && (TypeWidth & (TypeWidth - 1)) == 0 &&
297*67e74705SXin Li TypeWidth <= InlineWidth)
298*67e74705SXin Li return "2"; // "always lock free"
299*67e74705SXin Li // We cannot be certain what operations the lib calls might be
300*67e74705SXin Li // able to implement as lock-free on future processors.
301*67e74705SXin Li return "1"; // "sometimes lock free"
302*67e74705SXin Li }
303*67e74705SXin Li
304*67e74705SXin Li /// \brief Add definitions required for a smooth interaction between
305*67e74705SXin Li /// Objective-C++ automated reference counting and libstdc++ (4.2).
AddObjCXXARCLibstdcxxDefines(const LangOptions & LangOpts,MacroBuilder & Builder)306*67e74705SXin Li static void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts,
307*67e74705SXin Li MacroBuilder &Builder) {
308*67e74705SXin Li Builder.defineMacro("_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR");
309*67e74705SXin Li
310*67e74705SXin Li std::string Result;
311*67e74705SXin Li {
312*67e74705SXin Li // Provide specializations for the __is_scalar type trait so that
313*67e74705SXin Li // lifetime-qualified objects are not considered "scalar" types, which
314*67e74705SXin Li // libstdc++ uses as an indicator of the presence of trivial copy, assign,
315*67e74705SXin Li // default-construct, and destruct semantics (none of which hold for
316*67e74705SXin Li // lifetime-qualified objects in ARC).
317*67e74705SXin Li llvm::raw_string_ostream Out(Result);
318*67e74705SXin Li
319*67e74705SXin Li Out << "namespace std {\n"
320*67e74705SXin Li << "\n"
321*67e74705SXin Li << "struct __true_type;\n"
322*67e74705SXin Li << "struct __false_type;\n"
323*67e74705SXin Li << "\n";
324*67e74705SXin Li
325*67e74705SXin Li Out << "template<typename _Tp> struct __is_scalar;\n"
326*67e74705SXin Li << "\n";
327*67e74705SXin Li
328*67e74705SXin Li if (LangOpts.ObjCAutoRefCount) {
329*67e74705SXin Li Out << "template<typename _Tp>\n"
330*67e74705SXin Li << "struct __is_scalar<__attribute__((objc_ownership(strong))) _Tp> {\n"
331*67e74705SXin Li << " enum { __value = 0 };\n"
332*67e74705SXin Li << " typedef __false_type __type;\n"
333*67e74705SXin Li << "};\n"
334*67e74705SXin Li << "\n";
335*67e74705SXin Li }
336*67e74705SXin Li
337*67e74705SXin Li if (LangOpts.ObjCWeak) {
338*67e74705SXin Li Out << "template<typename _Tp>\n"
339*67e74705SXin Li << "struct __is_scalar<__attribute__((objc_ownership(weak))) _Tp> {\n"
340*67e74705SXin Li << " enum { __value = 0 };\n"
341*67e74705SXin Li << " typedef __false_type __type;\n"
342*67e74705SXin Li << "};\n"
343*67e74705SXin Li << "\n";
344*67e74705SXin Li }
345*67e74705SXin Li
346*67e74705SXin Li if (LangOpts.ObjCAutoRefCount) {
347*67e74705SXin Li Out << "template<typename _Tp>\n"
348*67e74705SXin Li << "struct __is_scalar<__attribute__((objc_ownership(autoreleasing)))"
349*67e74705SXin Li << " _Tp> {\n"
350*67e74705SXin Li << " enum { __value = 0 };\n"
351*67e74705SXin Li << " typedef __false_type __type;\n"
352*67e74705SXin Li << "};\n"
353*67e74705SXin Li << "\n";
354*67e74705SXin Li }
355*67e74705SXin Li
356*67e74705SXin Li Out << "}\n";
357*67e74705SXin Li }
358*67e74705SXin Li Builder.append(Result);
359*67e74705SXin Li }
360*67e74705SXin Li
InitializeStandardPredefinedMacros(const TargetInfo & TI,const LangOptions & LangOpts,const FrontendOptions & FEOpts,MacroBuilder & Builder)361*67e74705SXin Li static void InitializeStandardPredefinedMacros(const TargetInfo &TI,
362*67e74705SXin Li const LangOptions &LangOpts,
363*67e74705SXin Li const FrontendOptions &FEOpts,
364*67e74705SXin Li MacroBuilder &Builder) {
365*67e74705SXin Li if (!LangOpts.MSVCCompat && !LangOpts.TraditionalCPP)
366*67e74705SXin Li Builder.defineMacro("__STDC__");
367*67e74705SXin Li if (LangOpts.Freestanding)
368*67e74705SXin Li Builder.defineMacro("__STDC_HOSTED__", "0");
369*67e74705SXin Li else
370*67e74705SXin Li Builder.defineMacro("__STDC_HOSTED__");
371*67e74705SXin Li
372*67e74705SXin Li if (!LangOpts.CPlusPlus) {
373*67e74705SXin Li if (LangOpts.C11)
374*67e74705SXin Li Builder.defineMacro("__STDC_VERSION__", "201112L");
375*67e74705SXin Li else if (LangOpts.C99)
376*67e74705SXin Li Builder.defineMacro("__STDC_VERSION__", "199901L");
377*67e74705SXin Li else if (!LangOpts.GNUMode && LangOpts.Digraphs)
378*67e74705SXin Li Builder.defineMacro("__STDC_VERSION__", "199409L");
379*67e74705SXin Li } else {
380*67e74705SXin Li // FIXME: Use correct value for C++17.
381*67e74705SXin Li if (LangOpts.CPlusPlus1z)
382*67e74705SXin Li Builder.defineMacro("__cplusplus", "201406L");
383*67e74705SXin Li // C++1y [cpp.predefined]p1:
384*67e74705SXin Li // The name __cplusplus is defined to the value 201402L when compiling a
385*67e74705SXin Li // C++ translation unit.
386*67e74705SXin Li else if (LangOpts.CPlusPlus14)
387*67e74705SXin Li Builder.defineMacro("__cplusplus", "201402L");
388*67e74705SXin Li // C++11 [cpp.predefined]p1:
389*67e74705SXin Li // The name __cplusplus is defined to the value 201103L when compiling a
390*67e74705SXin Li // C++ translation unit.
391*67e74705SXin Li else if (LangOpts.CPlusPlus11)
392*67e74705SXin Li Builder.defineMacro("__cplusplus", "201103L");
393*67e74705SXin Li // C++03 [cpp.predefined]p1:
394*67e74705SXin Li // The name __cplusplus is defined to the value 199711L when compiling a
395*67e74705SXin Li // C++ translation unit.
396*67e74705SXin Li else
397*67e74705SXin Li Builder.defineMacro("__cplusplus", "199711L");
398*67e74705SXin Li }
399*67e74705SXin Li
400*67e74705SXin Li // In C11 these are environment macros. In C++11 they are only defined
401*67e74705SXin Li // as part of <cuchar>. To prevent breakage when mixing C and C++
402*67e74705SXin Li // code, define these macros unconditionally. We can define them
403*67e74705SXin Li // unconditionally, as Clang always uses UTF-16 and UTF-32 for 16-bit
404*67e74705SXin Li // and 32-bit character literals.
405*67e74705SXin Li Builder.defineMacro("__STDC_UTF_16__", "1");
406*67e74705SXin Li Builder.defineMacro("__STDC_UTF_32__", "1");
407*67e74705SXin Li
408*67e74705SXin Li if (LangOpts.ObjC1)
409*67e74705SXin Li Builder.defineMacro("__OBJC__");
410*67e74705SXin Li
411*67e74705SXin Li // OpenCL v1.0/1.1 s6.9, v1.2/2.0 s6.10: Preprocessor Directives and Macros.
412*67e74705SXin Li if (LangOpts.OpenCL) {
413*67e74705SXin Li // OpenCL v1.0 and v1.1 do not have a predefined macro to indicate the
414*67e74705SXin Li // language standard with which the program is compiled. __OPENCL_VERSION__
415*67e74705SXin Li // is for the OpenCL version supported by the OpenCL device, which is not
416*67e74705SXin Li // necessarily the language standard with which the program is compiled.
417*67e74705SXin Li // A shared OpenCL header file requires a macro to indicate the language
418*67e74705SXin Li // standard. As a workaround, __OPENCL_C_VERSION__ is defined for
419*67e74705SXin Li // OpenCL v1.0 and v1.1.
420*67e74705SXin Li switch (LangOpts.OpenCLVersion) {
421*67e74705SXin Li case 100:
422*67e74705SXin Li Builder.defineMacro("__OPENCL_C_VERSION__", "100");
423*67e74705SXin Li break;
424*67e74705SXin Li case 110:
425*67e74705SXin Li Builder.defineMacro("__OPENCL_C_VERSION__", "110");
426*67e74705SXin Li break;
427*67e74705SXin Li case 120:
428*67e74705SXin Li Builder.defineMacro("__OPENCL_C_VERSION__", "120");
429*67e74705SXin Li break;
430*67e74705SXin Li case 200:
431*67e74705SXin Li Builder.defineMacro("__OPENCL_C_VERSION__", "200");
432*67e74705SXin Li break;
433*67e74705SXin Li default:
434*67e74705SXin Li llvm_unreachable("Unsupported OpenCL version");
435*67e74705SXin Li }
436*67e74705SXin Li Builder.defineMacro("CL_VERSION_1_0", "100");
437*67e74705SXin Li Builder.defineMacro("CL_VERSION_1_1", "110");
438*67e74705SXin Li Builder.defineMacro("CL_VERSION_1_2", "120");
439*67e74705SXin Li Builder.defineMacro("CL_VERSION_2_0", "200");
440*67e74705SXin Li
441*67e74705SXin Li if (LangOpts.FastRelaxedMath)
442*67e74705SXin Li Builder.defineMacro("__FAST_RELAXED_MATH__");
443*67e74705SXin Li }
444*67e74705SXin Li // Not "standard" per se, but available even with the -undef flag.
445*67e74705SXin Li if (LangOpts.AsmPreprocessor)
446*67e74705SXin Li Builder.defineMacro("__ASSEMBLER__");
447*67e74705SXin Li if (LangOpts.CUDA)
448*67e74705SXin Li Builder.defineMacro("__CUDA__");
449*67e74705SXin Li }
450*67e74705SXin Li
451*67e74705SXin Li /// Initialize the predefined C++ language feature test macros defined in
452*67e74705SXin Li /// ISO/IEC JTC1/SC22/WG21 (C++) SD-6: "SG10 Feature Test Recommendations".
InitializeCPlusPlusFeatureTestMacros(const LangOptions & LangOpts,MacroBuilder & Builder)453*67e74705SXin Li static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts,
454*67e74705SXin Li MacroBuilder &Builder) {
455*67e74705SXin Li // C++98 features.
456*67e74705SXin Li if (LangOpts.RTTI)
457*67e74705SXin Li Builder.defineMacro("__cpp_rtti", "199711");
458*67e74705SXin Li if (LangOpts.CXXExceptions)
459*67e74705SXin Li Builder.defineMacro("__cpp_exceptions", "199711");
460*67e74705SXin Li
461*67e74705SXin Li // C++11 features.
462*67e74705SXin Li if (LangOpts.CPlusPlus11) {
463*67e74705SXin Li Builder.defineMacro("__cpp_unicode_characters", "200704");
464*67e74705SXin Li Builder.defineMacro("__cpp_raw_strings", "200710");
465*67e74705SXin Li Builder.defineMacro("__cpp_unicode_literals", "200710");
466*67e74705SXin Li Builder.defineMacro("__cpp_user_defined_literals", "200809");
467*67e74705SXin Li Builder.defineMacro("__cpp_lambdas", "200907");
468*67e74705SXin Li Builder.defineMacro("__cpp_constexpr",
469*67e74705SXin Li LangOpts.CPlusPlus14 ? "201304" : "200704");
470*67e74705SXin Li Builder.defineMacro("__cpp_range_based_for", "200907");
471*67e74705SXin Li Builder.defineMacro("__cpp_static_assert", "200410");
472*67e74705SXin Li Builder.defineMacro("__cpp_decltype", "200707");
473*67e74705SXin Li Builder.defineMacro("__cpp_attributes", "200809");
474*67e74705SXin Li Builder.defineMacro("__cpp_rvalue_references", "200610");
475*67e74705SXin Li Builder.defineMacro("__cpp_variadic_templates", "200704");
476*67e74705SXin Li Builder.defineMacro("__cpp_initializer_lists", "200806");
477*67e74705SXin Li Builder.defineMacro("__cpp_delegating_constructors", "200604");
478*67e74705SXin Li Builder.defineMacro("__cpp_nsdmi", "200809");
479*67e74705SXin Li Builder.defineMacro("__cpp_inheriting_constructors", "200802");
480*67e74705SXin Li Builder.defineMacro("__cpp_ref_qualifiers", "200710");
481*67e74705SXin Li Builder.defineMacro("__cpp_alias_templates", "200704");
482*67e74705SXin Li }
483*67e74705SXin Li
484*67e74705SXin Li // C++14 features.
485*67e74705SXin Li if (LangOpts.CPlusPlus14) {
486*67e74705SXin Li Builder.defineMacro("__cpp_binary_literals", "201304");
487*67e74705SXin Li Builder.defineMacro("__cpp_digit_separators", "201309");
488*67e74705SXin Li Builder.defineMacro("__cpp_init_captures", "201304");
489*67e74705SXin Li Builder.defineMacro("__cpp_generic_lambdas", "201304");
490*67e74705SXin Li Builder.defineMacro("__cpp_decltype_auto", "201304");
491*67e74705SXin Li Builder.defineMacro("__cpp_return_type_deduction", "201304");
492*67e74705SXin Li Builder.defineMacro("__cpp_aggregate_nsdmi", "201304");
493*67e74705SXin Li Builder.defineMacro("__cpp_variable_templates", "201304");
494*67e74705SXin Li }
495*67e74705SXin Li if (LangOpts.SizedDeallocation)
496*67e74705SXin Li Builder.defineMacro("__cpp_sized_deallocation", "201309");
497*67e74705SXin Li if (LangOpts.ConceptsTS)
498*67e74705SXin Li Builder.defineMacro("__cpp_experimental_concepts", "1");
499*67e74705SXin Li if (LangOpts.Coroutines)
500*67e74705SXin Li Builder.defineMacro("__cpp_coroutines", "1");
501*67e74705SXin Li }
502*67e74705SXin Li
InitializePredefinedMacros(const TargetInfo & TI,const LangOptions & LangOpts,const FrontendOptions & FEOpts,MacroBuilder & Builder)503*67e74705SXin Li static void InitializePredefinedMacros(const TargetInfo &TI,
504*67e74705SXin Li const LangOptions &LangOpts,
505*67e74705SXin Li const FrontendOptions &FEOpts,
506*67e74705SXin Li MacroBuilder &Builder) {
507*67e74705SXin Li // Compiler version introspection macros.
508*67e74705SXin Li Builder.defineMacro("__llvm__"); // LLVM Backend
509*67e74705SXin Li Builder.defineMacro("__clang__"); // Clang Frontend
510*67e74705SXin Li #define TOSTR2(X) #X
511*67e74705SXin Li #define TOSTR(X) TOSTR2(X)
512*67e74705SXin Li Builder.defineMacro("__clang_major__", TOSTR(CLANG_VERSION_MAJOR));
513*67e74705SXin Li Builder.defineMacro("__clang_minor__", TOSTR(CLANG_VERSION_MINOR));
514*67e74705SXin Li #ifdef CLANG_VERSION_PATCHLEVEL
515*67e74705SXin Li Builder.defineMacro("__clang_patchlevel__", TOSTR(CLANG_VERSION_PATCHLEVEL));
516*67e74705SXin Li #else
517*67e74705SXin Li Builder.defineMacro("__clang_patchlevel__", "0");
518*67e74705SXin Li #endif
519*67e74705SXin Li Builder.defineMacro("__clang_version__",
520*67e74705SXin Li "\"" CLANG_VERSION_STRING " "
521*67e74705SXin Li + getClangFullRepositoryVersion() + "\"");
522*67e74705SXin Li #undef TOSTR
523*67e74705SXin Li #undef TOSTR2
524*67e74705SXin Li if (!LangOpts.MSVCCompat) {
525*67e74705SXin Li // Currently claim to be compatible with GCC 4.2.1-5621, but only if we're
526*67e74705SXin Li // not compiling for MSVC compatibility
527*67e74705SXin Li Builder.defineMacro("__GNUC_MINOR__", "2");
528*67e74705SXin Li Builder.defineMacro("__GNUC_PATCHLEVEL__", "1");
529*67e74705SXin Li Builder.defineMacro("__GNUC__", "4");
530*67e74705SXin Li Builder.defineMacro("__GXX_ABI_VERSION", "1002");
531*67e74705SXin Li }
532*67e74705SXin Li
533*67e74705SXin Li // Define macros for the C11 / C++11 memory orderings
534*67e74705SXin Li Builder.defineMacro("__ATOMIC_RELAXED", "0");
535*67e74705SXin Li Builder.defineMacro("__ATOMIC_CONSUME", "1");
536*67e74705SXin Li Builder.defineMacro("__ATOMIC_ACQUIRE", "2");
537*67e74705SXin Li Builder.defineMacro("__ATOMIC_RELEASE", "3");
538*67e74705SXin Li Builder.defineMacro("__ATOMIC_ACQ_REL", "4");
539*67e74705SXin Li Builder.defineMacro("__ATOMIC_SEQ_CST", "5");
540*67e74705SXin Li
541*67e74705SXin Li // Support for #pragma redefine_extname (Sun compatibility)
542*67e74705SXin Li Builder.defineMacro("__PRAGMA_REDEFINE_EXTNAME", "1");
543*67e74705SXin Li
544*67e74705SXin Li // As sad as it is, enough software depends on the __VERSION__ for version
545*67e74705SXin Li // checks that it is necessary to report 4.2.1 (the base GCC version we claim
546*67e74705SXin Li // compatibility with) first.
547*67e74705SXin Li Builder.defineMacro("__VERSION__", "\"4.2.1 Compatible " +
548*67e74705SXin Li Twine(getClangFullCPPVersion()) + "\"");
549*67e74705SXin Li
550*67e74705SXin Li // Initialize language-specific preprocessor defines.
551*67e74705SXin Li
552*67e74705SXin Li // Standard conforming mode?
553*67e74705SXin Li if (!LangOpts.GNUMode && !LangOpts.MSVCCompat)
554*67e74705SXin Li Builder.defineMacro("__STRICT_ANSI__");
555*67e74705SXin Li
556*67e74705SXin Li if (!LangOpts.MSVCCompat && LangOpts.CPlusPlus11)
557*67e74705SXin Li Builder.defineMacro("__GXX_EXPERIMENTAL_CXX0X__");
558*67e74705SXin Li
559*67e74705SXin Li if (LangOpts.ObjC1) {
560*67e74705SXin Li if (LangOpts.ObjCRuntime.isNonFragile()) {
561*67e74705SXin Li Builder.defineMacro("__OBJC2__");
562*67e74705SXin Li
563*67e74705SXin Li if (LangOpts.ObjCExceptions)
564*67e74705SXin Li Builder.defineMacro("OBJC_ZEROCOST_EXCEPTIONS");
565*67e74705SXin Li }
566*67e74705SXin Li
567*67e74705SXin Li if (LangOpts.getGC() != LangOptions::NonGC)
568*67e74705SXin Li Builder.defineMacro("__OBJC_GC__");
569*67e74705SXin Li
570*67e74705SXin Li if (LangOpts.ObjCRuntime.isNeXTFamily())
571*67e74705SXin Li Builder.defineMacro("__NEXT_RUNTIME__");
572*67e74705SXin Li
573*67e74705SXin Li if (LangOpts.ObjCRuntime.getKind() == ObjCRuntime::ObjFW) {
574*67e74705SXin Li VersionTuple tuple = LangOpts.ObjCRuntime.getVersion();
575*67e74705SXin Li
576*67e74705SXin Li unsigned minor = 0;
577*67e74705SXin Li if (tuple.getMinor().hasValue())
578*67e74705SXin Li minor = tuple.getMinor().getValue();
579*67e74705SXin Li
580*67e74705SXin Li unsigned subminor = 0;
581*67e74705SXin Li if (tuple.getSubminor().hasValue())
582*67e74705SXin Li subminor = tuple.getSubminor().getValue();
583*67e74705SXin Li
584*67e74705SXin Li Builder.defineMacro("__OBJFW_RUNTIME_ABI__",
585*67e74705SXin Li Twine(tuple.getMajor() * 10000 + minor * 100 +
586*67e74705SXin Li subminor));
587*67e74705SXin Li }
588*67e74705SXin Li
589*67e74705SXin Li Builder.defineMacro("IBOutlet", "__attribute__((iboutlet))");
590*67e74705SXin Li Builder.defineMacro("IBOutletCollection(ClassName)",
591*67e74705SXin Li "__attribute__((iboutletcollection(ClassName)))");
592*67e74705SXin Li Builder.defineMacro("IBAction", "void)__attribute__((ibaction)");
593*67e74705SXin Li Builder.defineMacro("IBInspectable", "");
594*67e74705SXin Li Builder.defineMacro("IB_DESIGNABLE", "");
595*67e74705SXin Li }
596*67e74705SXin Li
597*67e74705SXin Li if (LangOpts.CPlusPlus)
598*67e74705SXin Li InitializeCPlusPlusFeatureTestMacros(LangOpts, Builder);
599*67e74705SXin Li
600*67e74705SXin Li // darwin_constant_cfstrings controls this. This is also dependent
601*67e74705SXin Li // on other things like the runtime I believe. This is set even for C code.
602*67e74705SXin Li if (!LangOpts.NoConstantCFStrings)
603*67e74705SXin Li Builder.defineMacro("__CONSTANT_CFSTRINGS__");
604*67e74705SXin Li
605*67e74705SXin Li if (LangOpts.ObjC2)
606*67e74705SXin Li Builder.defineMacro("OBJC_NEW_PROPERTIES");
607*67e74705SXin Li
608*67e74705SXin Li if (LangOpts.PascalStrings)
609*67e74705SXin Li Builder.defineMacro("__PASCAL_STRINGS__");
610*67e74705SXin Li
611*67e74705SXin Li if (LangOpts.Blocks) {
612*67e74705SXin Li Builder.defineMacro("__block", "__attribute__((__blocks__(byref)))");
613*67e74705SXin Li Builder.defineMacro("__BLOCKS__");
614*67e74705SXin Li }
615*67e74705SXin Li
616*67e74705SXin Li if (!LangOpts.MSVCCompat && LangOpts.Exceptions)
617*67e74705SXin Li Builder.defineMacro("__EXCEPTIONS");
618*67e74705SXin Li if (!LangOpts.MSVCCompat && LangOpts.RTTI)
619*67e74705SXin Li Builder.defineMacro("__GXX_RTTI");
620*67e74705SXin Li if (LangOpts.SjLjExceptions)
621*67e74705SXin Li Builder.defineMacro("__USING_SJLJ_EXCEPTIONS__");
622*67e74705SXin Li
623*67e74705SXin Li if (LangOpts.Deprecated)
624*67e74705SXin Li Builder.defineMacro("__DEPRECATED");
625*67e74705SXin Li
626*67e74705SXin Li if (!LangOpts.MSVCCompat && LangOpts.CPlusPlus) {
627*67e74705SXin Li Builder.defineMacro("__GNUG__", "4");
628*67e74705SXin Li Builder.defineMacro("__GXX_WEAK__");
629*67e74705SXin Li Builder.defineMacro("__private_extern__", "extern");
630*67e74705SXin Li }
631*67e74705SXin Li
632*67e74705SXin Li if (LangOpts.MicrosoftExt) {
633*67e74705SXin Li if (LangOpts.WChar) {
634*67e74705SXin Li // wchar_t supported as a keyword.
635*67e74705SXin Li Builder.defineMacro("_WCHAR_T_DEFINED");
636*67e74705SXin Li Builder.defineMacro("_NATIVE_WCHAR_T_DEFINED");
637*67e74705SXin Li }
638*67e74705SXin Li }
639*67e74705SXin Li
640*67e74705SXin Li if (LangOpts.Optimize)
641*67e74705SXin Li Builder.defineMacro("__OPTIMIZE__");
642*67e74705SXin Li if (LangOpts.OptimizeSize)
643*67e74705SXin Li Builder.defineMacro("__OPTIMIZE_SIZE__");
644*67e74705SXin Li
645*67e74705SXin Li if (LangOpts.FastMath)
646*67e74705SXin Li Builder.defineMacro("__FAST_MATH__");
647*67e74705SXin Li
648*67e74705SXin Li // Initialize target-specific preprocessor defines.
649*67e74705SXin Li
650*67e74705SXin Li // __BYTE_ORDER__ was added in GCC 4.6. It's analogous
651*67e74705SXin Li // to the macro __BYTE_ORDER (no trailing underscores)
652*67e74705SXin Li // from glibc's <endian.h> header.
653*67e74705SXin Li // We don't support the PDP-11 as a target, but include
654*67e74705SXin Li // the define so it can still be compared against.
655*67e74705SXin Li Builder.defineMacro("__ORDER_LITTLE_ENDIAN__", "1234");
656*67e74705SXin Li Builder.defineMacro("__ORDER_BIG_ENDIAN__", "4321");
657*67e74705SXin Li Builder.defineMacro("__ORDER_PDP_ENDIAN__", "3412");
658*67e74705SXin Li if (TI.isBigEndian()) {
659*67e74705SXin Li Builder.defineMacro("__BYTE_ORDER__", "__ORDER_BIG_ENDIAN__");
660*67e74705SXin Li Builder.defineMacro("__BIG_ENDIAN__");
661*67e74705SXin Li } else {
662*67e74705SXin Li Builder.defineMacro("__BYTE_ORDER__", "__ORDER_LITTLE_ENDIAN__");
663*67e74705SXin Li Builder.defineMacro("__LITTLE_ENDIAN__");
664*67e74705SXin Li }
665*67e74705SXin Li
666*67e74705SXin Li if (TI.getPointerWidth(0) == 64 && TI.getLongWidth() == 64
667*67e74705SXin Li && TI.getIntWidth() == 32) {
668*67e74705SXin Li Builder.defineMacro("_LP64");
669*67e74705SXin Li Builder.defineMacro("__LP64__");
670*67e74705SXin Li }
671*67e74705SXin Li
672*67e74705SXin Li if (TI.getPointerWidth(0) == 32 && TI.getLongWidth() == 32
673*67e74705SXin Li && TI.getIntWidth() == 32) {
674*67e74705SXin Li Builder.defineMacro("_ILP32");
675*67e74705SXin Li Builder.defineMacro("__ILP32__");
676*67e74705SXin Li }
677*67e74705SXin Li
678*67e74705SXin Li // Define type sizing macros based on the target properties.
679*67e74705SXin Li assert(TI.getCharWidth() == 8 && "Only support 8-bit char so far");
680*67e74705SXin Li Builder.defineMacro("__CHAR_BIT__", "8");
681*67e74705SXin Li
682*67e74705SXin Li DefineTypeSize("__SCHAR_MAX__", TargetInfo::SignedChar, TI, Builder);
683*67e74705SXin Li DefineTypeSize("__SHRT_MAX__", TargetInfo::SignedShort, TI, Builder);
684*67e74705SXin Li DefineTypeSize("__INT_MAX__", TargetInfo::SignedInt, TI, Builder);
685*67e74705SXin Li DefineTypeSize("__LONG_MAX__", TargetInfo::SignedLong, TI, Builder);
686*67e74705SXin Li DefineTypeSize("__LONG_LONG_MAX__", TargetInfo::SignedLongLong, TI, Builder);
687*67e74705SXin Li DefineTypeSize("__WCHAR_MAX__", TI.getWCharType(), TI, Builder);
688*67e74705SXin Li DefineTypeSize("__INTMAX_MAX__", TI.getIntMaxType(), TI, Builder);
689*67e74705SXin Li DefineTypeSize("__SIZE_MAX__", TI.getSizeType(), TI, Builder);
690*67e74705SXin Li
691*67e74705SXin Li DefineTypeSize("__UINTMAX_MAX__", TI.getUIntMaxType(), TI, Builder);
692*67e74705SXin Li DefineTypeSize("__PTRDIFF_MAX__", TI.getPtrDiffType(0), TI, Builder);
693*67e74705SXin Li DefineTypeSize("__INTPTR_MAX__", TI.getIntPtrType(), TI, Builder);
694*67e74705SXin Li DefineTypeSize("__UINTPTR_MAX__", TI.getUIntPtrType(), TI, Builder);
695*67e74705SXin Li
696*67e74705SXin Li DefineTypeSizeof("__SIZEOF_DOUBLE__", TI.getDoubleWidth(), TI, Builder);
697*67e74705SXin Li DefineTypeSizeof("__SIZEOF_FLOAT__", TI.getFloatWidth(), TI, Builder);
698*67e74705SXin Li DefineTypeSizeof("__SIZEOF_INT__", TI.getIntWidth(), TI, Builder);
699*67e74705SXin Li DefineTypeSizeof("__SIZEOF_LONG__", TI.getLongWidth(), TI, Builder);
700*67e74705SXin Li DefineTypeSizeof("__SIZEOF_LONG_DOUBLE__",TI.getLongDoubleWidth(),TI,Builder);
701*67e74705SXin Li DefineTypeSizeof("__SIZEOF_LONG_LONG__", TI.getLongLongWidth(), TI, Builder);
702*67e74705SXin Li DefineTypeSizeof("__SIZEOF_POINTER__", TI.getPointerWidth(0), TI, Builder);
703*67e74705SXin Li DefineTypeSizeof("__SIZEOF_SHORT__", TI.getShortWidth(), TI, Builder);
704*67e74705SXin Li DefineTypeSizeof("__SIZEOF_PTRDIFF_T__",
705*67e74705SXin Li TI.getTypeWidth(TI.getPtrDiffType(0)), TI, Builder);
706*67e74705SXin Li DefineTypeSizeof("__SIZEOF_SIZE_T__",
707*67e74705SXin Li TI.getTypeWidth(TI.getSizeType()), TI, Builder);
708*67e74705SXin Li DefineTypeSizeof("__SIZEOF_WCHAR_T__",
709*67e74705SXin Li TI.getTypeWidth(TI.getWCharType()), TI, Builder);
710*67e74705SXin Li DefineTypeSizeof("__SIZEOF_WINT_T__",
711*67e74705SXin Li TI.getTypeWidth(TI.getWIntType()), TI, Builder);
712*67e74705SXin Li if (TI.hasInt128Type())
713*67e74705SXin Li DefineTypeSizeof("__SIZEOF_INT128__", 128, TI, Builder);
714*67e74705SXin Li
715*67e74705SXin Li DefineType("__INTMAX_TYPE__", TI.getIntMaxType(), Builder);
716*67e74705SXin Li DefineFmt("__INTMAX", TI.getIntMaxType(), TI, Builder);
717*67e74705SXin Li Builder.defineMacro("__INTMAX_C_SUFFIX__",
718*67e74705SXin Li TI.getTypeConstantSuffix(TI.getIntMaxType()));
719*67e74705SXin Li DefineType("__UINTMAX_TYPE__", TI.getUIntMaxType(), Builder);
720*67e74705SXin Li DefineFmt("__UINTMAX", TI.getUIntMaxType(), TI, Builder);
721*67e74705SXin Li Builder.defineMacro("__UINTMAX_C_SUFFIX__",
722*67e74705SXin Li TI.getTypeConstantSuffix(TI.getUIntMaxType()));
723*67e74705SXin Li DefineTypeWidth("__INTMAX_WIDTH__", TI.getIntMaxType(), TI, Builder);
724*67e74705SXin Li DefineType("__PTRDIFF_TYPE__", TI.getPtrDiffType(0), Builder);
725*67e74705SXin Li DefineFmt("__PTRDIFF", TI.getPtrDiffType(0), TI, Builder);
726*67e74705SXin Li DefineTypeWidth("__PTRDIFF_WIDTH__", TI.getPtrDiffType(0), TI, Builder);
727*67e74705SXin Li DefineType("__INTPTR_TYPE__", TI.getIntPtrType(), Builder);
728*67e74705SXin Li DefineFmt("__INTPTR", TI.getIntPtrType(), TI, Builder);
729*67e74705SXin Li DefineTypeWidth("__INTPTR_WIDTH__", TI.getIntPtrType(), TI, Builder);
730*67e74705SXin Li DefineType("__SIZE_TYPE__", TI.getSizeType(), Builder);
731*67e74705SXin Li DefineFmt("__SIZE", TI.getSizeType(), TI, Builder);
732*67e74705SXin Li DefineTypeWidth("__SIZE_WIDTH__", TI.getSizeType(), TI, Builder);
733*67e74705SXin Li DefineType("__WCHAR_TYPE__", TI.getWCharType(), Builder);
734*67e74705SXin Li DefineTypeWidth("__WCHAR_WIDTH__", TI.getWCharType(), TI, Builder);
735*67e74705SXin Li DefineType("__WINT_TYPE__", TI.getWIntType(), Builder);
736*67e74705SXin Li DefineTypeWidth("__WINT_WIDTH__", TI.getWIntType(), TI, Builder);
737*67e74705SXin Li DefineTypeWidth("__SIG_ATOMIC_WIDTH__", TI.getSigAtomicType(), TI, Builder);
738*67e74705SXin Li DefineTypeSize("__SIG_ATOMIC_MAX__", TI.getSigAtomicType(), TI, Builder);
739*67e74705SXin Li DefineType("__CHAR16_TYPE__", TI.getChar16Type(), Builder);
740*67e74705SXin Li DefineType("__CHAR32_TYPE__", TI.getChar32Type(), Builder);
741*67e74705SXin Li
742*67e74705SXin Li DefineTypeWidth("__UINTMAX_WIDTH__", TI.getUIntMaxType(), TI, Builder);
743*67e74705SXin Li DefineType("__UINTPTR_TYPE__", TI.getUIntPtrType(), Builder);
744*67e74705SXin Li DefineFmt("__UINTPTR", TI.getUIntPtrType(), TI, Builder);
745*67e74705SXin Li DefineTypeWidth("__UINTPTR_WIDTH__", TI.getUIntPtrType(), TI, Builder);
746*67e74705SXin Li
747*67e74705SXin Li DefineFloatMacros(Builder, "FLT", &TI.getFloatFormat(), "F");
748*67e74705SXin Li DefineFloatMacros(Builder, "DBL", &TI.getDoubleFormat(), "");
749*67e74705SXin Li DefineFloatMacros(Builder, "LDBL", &TI.getLongDoubleFormat(), "L");
750*67e74705SXin Li
751*67e74705SXin Li // Define a __POINTER_WIDTH__ macro for stdint.h.
752*67e74705SXin Li Builder.defineMacro("__POINTER_WIDTH__",
753*67e74705SXin Li Twine((int)TI.getPointerWidth(0)));
754*67e74705SXin Li
755*67e74705SXin Li // Define __BIGGEST_ALIGNMENT__ to be compatible with gcc.
756*67e74705SXin Li Builder.defineMacro("__BIGGEST_ALIGNMENT__",
757*67e74705SXin Li Twine(TI.getSuitableAlign() / TI.getCharWidth()) );
758*67e74705SXin Li
759*67e74705SXin Li if (!LangOpts.CharIsSigned)
760*67e74705SXin Li Builder.defineMacro("__CHAR_UNSIGNED__");
761*67e74705SXin Li
762*67e74705SXin Li if (!TargetInfo::isTypeSigned(TI.getWCharType()))
763*67e74705SXin Li Builder.defineMacro("__WCHAR_UNSIGNED__");
764*67e74705SXin Li
765*67e74705SXin Li if (!TargetInfo::isTypeSigned(TI.getWIntType()))
766*67e74705SXin Li Builder.defineMacro("__WINT_UNSIGNED__");
767*67e74705SXin Li
768*67e74705SXin Li // Define exact-width integer types for stdint.h
769*67e74705SXin Li DefineExactWidthIntType(TargetInfo::SignedChar, TI, Builder);
770*67e74705SXin Li
771*67e74705SXin Li if (TI.getShortWidth() > TI.getCharWidth())
772*67e74705SXin Li DefineExactWidthIntType(TargetInfo::SignedShort, TI, Builder);
773*67e74705SXin Li
774*67e74705SXin Li if (TI.getIntWidth() > TI.getShortWidth())
775*67e74705SXin Li DefineExactWidthIntType(TargetInfo::SignedInt, TI, Builder);
776*67e74705SXin Li
777*67e74705SXin Li if (TI.getLongWidth() > TI.getIntWidth())
778*67e74705SXin Li DefineExactWidthIntType(TargetInfo::SignedLong, TI, Builder);
779*67e74705SXin Li
780*67e74705SXin Li if (TI.getLongLongWidth() > TI.getLongWidth())
781*67e74705SXin Li DefineExactWidthIntType(TargetInfo::SignedLongLong, TI, Builder);
782*67e74705SXin Li
783*67e74705SXin Li DefineExactWidthIntType(TargetInfo::UnsignedChar, TI, Builder);
784*67e74705SXin Li DefineExactWidthIntTypeSize(TargetInfo::UnsignedChar, TI, Builder);
785*67e74705SXin Li DefineExactWidthIntTypeSize(TargetInfo::SignedChar, TI, Builder);
786*67e74705SXin Li
787*67e74705SXin Li if (TI.getShortWidth() > TI.getCharWidth()) {
788*67e74705SXin Li DefineExactWidthIntType(TargetInfo::UnsignedShort, TI, Builder);
789*67e74705SXin Li DefineExactWidthIntTypeSize(TargetInfo::UnsignedShort, TI, Builder);
790*67e74705SXin Li DefineExactWidthIntTypeSize(TargetInfo::SignedShort, TI, Builder);
791*67e74705SXin Li }
792*67e74705SXin Li
793*67e74705SXin Li if (TI.getIntWidth() > TI.getShortWidth()) {
794*67e74705SXin Li DefineExactWidthIntType(TargetInfo::UnsignedInt, TI, Builder);
795*67e74705SXin Li DefineExactWidthIntTypeSize(TargetInfo::UnsignedInt, TI, Builder);
796*67e74705SXin Li DefineExactWidthIntTypeSize(TargetInfo::SignedInt, TI, Builder);
797*67e74705SXin Li }
798*67e74705SXin Li
799*67e74705SXin Li if (TI.getLongWidth() > TI.getIntWidth()) {
800*67e74705SXin Li DefineExactWidthIntType(TargetInfo::UnsignedLong, TI, Builder);
801*67e74705SXin Li DefineExactWidthIntTypeSize(TargetInfo::UnsignedLong, TI, Builder);
802*67e74705SXin Li DefineExactWidthIntTypeSize(TargetInfo::SignedLong, TI, Builder);
803*67e74705SXin Li }
804*67e74705SXin Li
805*67e74705SXin Li if (TI.getLongLongWidth() > TI.getLongWidth()) {
806*67e74705SXin Li DefineExactWidthIntType(TargetInfo::UnsignedLongLong, TI, Builder);
807*67e74705SXin Li DefineExactWidthIntTypeSize(TargetInfo::UnsignedLongLong, TI, Builder);
808*67e74705SXin Li DefineExactWidthIntTypeSize(TargetInfo::SignedLongLong, TI, Builder);
809*67e74705SXin Li }
810*67e74705SXin Li
811*67e74705SXin Li DefineLeastWidthIntType(8, true, TI, Builder);
812*67e74705SXin Li DefineLeastWidthIntType(8, false, TI, Builder);
813*67e74705SXin Li DefineLeastWidthIntType(16, true, TI, Builder);
814*67e74705SXin Li DefineLeastWidthIntType(16, false, TI, Builder);
815*67e74705SXin Li DefineLeastWidthIntType(32, true, TI, Builder);
816*67e74705SXin Li DefineLeastWidthIntType(32, false, TI, Builder);
817*67e74705SXin Li DefineLeastWidthIntType(64, true, TI, Builder);
818*67e74705SXin Li DefineLeastWidthIntType(64, false, TI, Builder);
819*67e74705SXin Li
820*67e74705SXin Li DefineFastIntType(8, true, TI, Builder);
821*67e74705SXin Li DefineFastIntType(8, false, TI, Builder);
822*67e74705SXin Li DefineFastIntType(16, true, TI, Builder);
823*67e74705SXin Li DefineFastIntType(16, false, TI, Builder);
824*67e74705SXin Li DefineFastIntType(32, true, TI, Builder);
825*67e74705SXin Li DefineFastIntType(32, false, TI, Builder);
826*67e74705SXin Li DefineFastIntType(64, true, TI, Builder);
827*67e74705SXin Li DefineFastIntType(64, false, TI, Builder);
828*67e74705SXin Li
829*67e74705SXin Li char UserLabelPrefix[2] = {TI.getDataLayout().getGlobalPrefix(), 0};
830*67e74705SXin Li Builder.defineMacro("__USER_LABEL_PREFIX__", UserLabelPrefix);
831*67e74705SXin Li
832*67e74705SXin Li if (LangOpts.FastMath || LangOpts.FiniteMathOnly)
833*67e74705SXin Li Builder.defineMacro("__FINITE_MATH_ONLY__", "1");
834*67e74705SXin Li else
835*67e74705SXin Li Builder.defineMacro("__FINITE_MATH_ONLY__", "0");
836*67e74705SXin Li
837*67e74705SXin Li if (!LangOpts.MSVCCompat) {
838*67e74705SXin Li if (LangOpts.GNUInline || LangOpts.CPlusPlus)
839*67e74705SXin Li Builder.defineMacro("__GNUC_GNU_INLINE__");
840*67e74705SXin Li else
841*67e74705SXin Li Builder.defineMacro("__GNUC_STDC_INLINE__");
842*67e74705SXin Li
843*67e74705SXin Li // The value written by __atomic_test_and_set.
844*67e74705SXin Li // FIXME: This is target-dependent.
845*67e74705SXin Li Builder.defineMacro("__GCC_ATOMIC_TEST_AND_SET_TRUEVAL", "1");
846*67e74705SXin Li
847*67e74705SXin Li // Used by libc++ and libstdc++ to implement ATOMIC_<foo>_LOCK_FREE.
848*67e74705SXin Li unsigned InlineWidthBits = TI.getMaxAtomicInlineWidth();
849*67e74705SXin Li #define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \
850*67e74705SXin Li Builder.defineMacro("__GCC_ATOMIC_" #TYPE "_LOCK_FREE", \
851*67e74705SXin Li getLockFreeValue(TI.get##Type##Width(), \
852*67e74705SXin Li TI.get##Type##Align(), \
853*67e74705SXin Li InlineWidthBits));
854*67e74705SXin Li DEFINE_LOCK_FREE_MACRO(BOOL, Bool);
855*67e74705SXin Li DEFINE_LOCK_FREE_MACRO(CHAR, Char);
856*67e74705SXin Li DEFINE_LOCK_FREE_MACRO(CHAR16_T, Char16);
857*67e74705SXin Li DEFINE_LOCK_FREE_MACRO(CHAR32_T, Char32);
858*67e74705SXin Li DEFINE_LOCK_FREE_MACRO(WCHAR_T, WChar);
859*67e74705SXin Li DEFINE_LOCK_FREE_MACRO(SHORT, Short);
860*67e74705SXin Li DEFINE_LOCK_FREE_MACRO(INT, Int);
861*67e74705SXin Li DEFINE_LOCK_FREE_MACRO(LONG, Long);
862*67e74705SXin Li DEFINE_LOCK_FREE_MACRO(LLONG, LongLong);
863*67e74705SXin Li Builder.defineMacro("__GCC_ATOMIC_POINTER_LOCK_FREE",
864*67e74705SXin Li getLockFreeValue(TI.getPointerWidth(0),
865*67e74705SXin Li TI.getPointerAlign(0),
866*67e74705SXin Li InlineWidthBits));
867*67e74705SXin Li #undef DEFINE_LOCK_FREE_MACRO
868*67e74705SXin Li }
869*67e74705SXin Li
870*67e74705SXin Li if (LangOpts.NoInlineDefine)
871*67e74705SXin Li Builder.defineMacro("__NO_INLINE__");
872*67e74705SXin Li
873*67e74705SXin Li if (unsigned PICLevel = LangOpts.PICLevel) {
874*67e74705SXin Li Builder.defineMacro("__PIC__", Twine(PICLevel));
875*67e74705SXin Li Builder.defineMacro("__pic__", Twine(PICLevel));
876*67e74705SXin Li if (LangOpts.PIE) {
877*67e74705SXin Li Builder.defineMacro("__PIE__", Twine(PICLevel));
878*67e74705SXin Li Builder.defineMacro("__pie__", Twine(PICLevel));
879*67e74705SXin Li }
880*67e74705SXin Li }
881*67e74705SXin Li
882*67e74705SXin Li // Macros to control C99 numerics and <float.h>
883*67e74705SXin Li Builder.defineMacro("__FLT_EVAL_METHOD__", Twine(TI.getFloatEvalMethod()));
884*67e74705SXin Li Builder.defineMacro("__FLT_RADIX__", "2");
885*67e74705SXin Li Builder.defineMacro("__DECIMAL_DIG__", "__LDBL_DECIMAL_DIG__");
886*67e74705SXin Li
887*67e74705SXin Li if (LangOpts.getStackProtector() == LangOptions::SSPOn)
888*67e74705SXin Li Builder.defineMacro("__SSP__");
889*67e74705SXin Li else if (LangOpts.getStackProtector() == LangOptions::SSPStrong)
890*67e74705SXin Li Builder.defineMacro("__SSP_STRONG__", "2");
891*67e74705SXin Li else if (LangOpts.getStackProtector() == LangOptions::SSPReq)
892*67e74705SXin Li Builder.defineMacro("__SSP_ALL__", "3");
893*67e74705SXin Li
894*67e74705SXin Li // Define a macro that exists only when using the static analyzer.
895*67e74705SXin Li if (FEOpts.ProgramAction == frontend::RunAnalysis)
896*67e74705SXin Li Builder.defineMacro("__clang_analyzer__");
897*67e74705SXin Li
898*67e74705SXin Li if (LangOpts.FastRelaxedMath)
899*67e74705SXin Li Builder.defineMacro("__FAST_RELAXED_MATH__");
900*67e74705SXin Li
901*67e74705SXin Li if (FEOpts.ProgramAction == frontend::RewriteObjC ||
902*67e74705SXin Li LangOpts.getGC() != LangOptions::NonGC) {
903*67e74705SXin Li Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
904*67e74705SXin Li Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
905*67e74705SXin Li Builder.defineMacro("__autoreleasing", "");
906*67e74705SXin Li Builder.defineMacro("__unsafe_unretained", "");
907*67e74705SXin Li } else if (LangOpts.ObjC1) {
908*67e74705SXin Li Builder.defineMacro("__weak", "__attribute__((objc_ownership(weak)))");
909*67e74705SXin Li Builder.defineMacro("__strong", "__attribute__((objc_ownership(strong)))");
910*67e74705SXin Li Builder.defineMacro("__autoreleasing",
911*67e74705SXin Li "__attribute__((objc_ownership(autoreleasing)))");
912*67e74705SXin Li Builder.defineMacro("__unsafe_unretained",
913*67e74705SXin Li "__attribute__((objc_ownership(none)))");
914*67e74705SXin Li }
915*67e74705SXin Li
916*67e74705SXin Li // On Darwin, there are __double_underscored variants of the type
917*67e74705SXin Li // nullability qualifiers.
918*67e74705SXin Li if (TI.getTriple().isOSDarwin()) {
919*67e74705SXin Li Builder.defineMacro("__nonnull", "_Nonnull");
920*67e74705SXin Li Builder.defineMacro("__null_unspecified", "_Null_unspecified");
921*67e74705SXin Li Builder.defineMacro("__nullable", "_Nullable");
922*67e74705SXin Li }
923*67e74705SXin Li
924*67e74705SXin Li // OpenMP definition
925*67e74705SXin Li // OpenMP 2.2:
926*67e74705SXin Li // In implementations that support a preprocessor, the _OPENMP
927*67e74705SXin Li // macro name is defined to have the decimal value yyyymm where
928*67e74705SXin Li // yyyy and mm are the year and the month designations of the
929*67e74705SXin Li // version of the OpenMP API that the implementation support.
930*67e74705SXin Li switch (LangOpts.OpenMP) {
931*67e74705SXin Li case 0:
932*67e74705SXin Li break;
933*67e74705SXin Li case 40:
934*67e74705SXin Li Builder.defineMacro("_OPENMP", "201307");
935*67e74705SXin Li break;
936*67e74705SXin Li case 45:
937*67e74705SXin Li Builder.defineMacro("_OPENMP", "201511");
938*67e74705SXin Li break;
939*67e74705SXin Li default:
940*67e74705SXin Li // Default version is OpenMP 3.1
941*67e74705SXin Li Builder.defineMacro("_OPENMP", "201107");
942*67e74705SXin Li break;
943*67e74705SXin Li }
944*67e74705SXin Li
945*67e74705SXin Li // CUDA device path compilaton
946*67e74705SXin Li if (LangOpts.CUDAIsDevice) {
947*67e74705SXin Li // The CUDA_ARCH value is set for the GPU target specified in the NVPTX
948*67e74705SXin Li // backend's target defines.
949*67e74705SXin Li Builder.defineMacro("__CUDA_ARCH__");
950*67e74705SXin Li }
951*67e74705SXin Li
952*67e74705SXin Li // We need to communicate this to our CUDA header wrapper, which in turn
953*67e74705SXin Li // informs the proper CUDA headers of this choice.
954*67e74705SXin Li if (LangOpts.CUDADeviceApproxTranscendentals || LangOpts.FastMath) {
955*67e74705SXin Li Builder.defineMacro("__CLANG_CUDA_APPROX_TRANSCENDENTALS__");
956*67e74705SXin Li }
957*67e74705SXin Li
958*67e74705SXin Li // OpenCL definitions.
959*67e74705SXin Li if (LangOpts.OpenCL) {
960*67e74705SXin Li #define OPENCLEXT(Ext) \
961*67e74705SXin Li if (TI.getSupportedOpenCLOpts().is_##Ext##_supported( \
962*67e74705SXin Li LangOpts.OpenCLVersion)) \
963*67e74705SXin Li Builder.defineMacro(#Ext);
964*67e74705SXin Li #include "clang/Basic/OpenCLExtensions.def"
965*67e74705SXin Li }
966*67e74705SXin Li
967*67e74705SXin Li // Get other target #defines.
968*67e74705SXin Li TI.getTargetDefines(LangOpts, Builder);
969*67e74705SXin Li }
970*67e74705SXin Li
971*67e74705SXin Li /// InitializePreprocessor - Initialize the preprocessor getting it and the
972*67e74705SXin Li /// environment ready to process a single file. This returns true on error.
973*67e74705SXin Li ///
InitializePreprocessor(Preprocessor & PP,const PreprocessorOptions & InitOpts,const PCHContainerReader & PCHContainerRdr,const FrontendOptions & FEOpts)974*67e74705SXin Li void clang::InitializePreprocessor(
975*67e74705SXin Li Preprocessor &PP, const PreprocessorOptions &InitOpts,
976*67e74705SXin Li const PCHContainerReader &PCHContainerRdr,
977*67e74705SXin Li const FrontendOptions &FEOpts) {
978*67e74705SXin Li const LangOptions &LangOpts = PP.getLangOpts();
979*67e74705SXin Li std::string PredefineBuffer;
980*67e74705SXin Li PredefineBuffer.reserve(4080);
981*67e74705SXin Li llvm::raw_string_ostream Predefines(PredefineBuffer);
982*67e74705SXin Li MacroBuilder Builder(Predefines);
983*67e74705SXin Li
984*67e74705SXin Li // Emit line markers for various builtin sections of the file. We don't do
985*67e74705SXin Li // this in asm preprocessor mode, because "# 4" is not a line marker directive
986*67e74705SXin Li // in this mode.
987*67e74705SXin Li if (!PP.getLangOpts().AsmPreprocessor)
988*67e74705SXin Li Builder.append("# 1 \"<built-in>\" 3");
989*67e74705SXin Li
990*67e74705SXin Li // Install things like __POWERPC__, __GNUC__, etc into the macro table.
991*67e74705SXin Li if (InitOpts.UsePredefines) {
992*67e74705SXin Li if (LangOpts.CUDA && PP.getAuxTargetInfo())
993*67e74705SXin Li InitializePredefinedMacros(*PP.getAuxTargetInfo(), LangOpts, FEOpts,
994*67e74705SXin Li Builder);
995*67e74705SXin Li
996*67e74705SXin Li InitializePredefinedMacros(PP.getTargetInfo(), LangOpts, FEOpts, Builder);
997*67e74705SXin Li
998*67e74705SXin Li // Install definitions to make Objective-C++ ARC work well with various
999*67e74705SXin Li // C++ Standard Library implementations.
1000*67e74705SXin Li if (LangOpts.ObjC1 && LangOpts.CPlusPlus &&
1001*67e74705SXin Li (LangOpts.ObjCAutoRefCount || LangOpts.ObjCWeak)) {
1002*67e74705SXin Li switch (InitOpts.ObjCXXARCStandardLibrary) {
1003*67e74705SXin Li case ARCXX_nolib:
1004*67e74705SXin Li case ARCXX_libcxx:
1005*67e74705SXin Li break;
1006*67e74705SXin Li
1007*67e74705SXin Li case ARCXX_libstdcxx:
1008*67e74705SXin Li AddObjCXXARCLibstdcxxDefines(LangOpts, Builder);
1009*67e74705SXin Li break;
1010*67e74705SXin Li }
1011*67e74705SXin Li }
1012*67e74705SXin Li }
1013*67e74705SXin Li
1014*67e74705SXin Li // Even with predefines off, some macros are still predefined.
1015*67e74705SXin Li // These should all be defined in the preprocessor according to the
1016*67e74705SXin Li // current language configuration.
1017*67e74705SXin Li InitializeStandardPredefinedMacros(PP.getTargetInfo(), PP.getLangOpts(),
1018*67e74705SXin Li FEOpts, Builder);
1019*67e74705SXin Li
1020*67e74705SXin Li // Add on the predefines from the driver. Wrap in a #line directive to report
1021*67e74705SXin Li // that they come from the command line.
1022*67e74705SXin Li if (!PP.getLangOpts().AsmPreprocessor)
1023*67e74705SXin Li Builder.append("# 1 \"<command line>\" 1");
1024*67e74705SXin Li
1025*67e74705SXin Li // Process #define's and #undef's in the order they are given.
1026*67e74705SXin Li for (unsigned i = 0, e = InitOpts.Macros.size(); i != e; ++i) {
1027*67e74705SXin Li if (InitOpts.Macros[i].second) // isUndef
1028*67e74705SXin Li Builder.undefineMacro(InitOpts.Macros[i].first);
1029*67e74705SXin Li else
1030*67e74705SXin Li DefineBuiltinMacro(Builder, InitOpts.Macros[i].first,
1031*67e74705SXin Li PP.getDiagnostics());
1032*67e74705SXin Li }
1033*67e74705SXin Li
1034*67e74705SXin Li // Exit the command line and go back to <built-in> (2 is LC_LEAVE).
1035*67e74705SXin Li if (!PP.getLangOpts().AsmPreprocessor)
1036*67e74705SXin Li Builder.append("# 1 \"<built-in>\" 2");
1037*67e74705SXin Li
1038*67e74705SXin Li // If -imacros are specified, include them now. These are processed before
1039*67e74705SXin Li // any -include directives.
1040*67e74705SXin Li for (unsigned i = 0, e = InitOpts.MacroIncludes.size(); i != e; ++i)
1041*67e74705SXin Li AddImplicitIncludeMacros(Builder, InitOpts.MacroIncludes[i]);
1042*67e74705SXin Li
1043*67e74705SXin Li // Process -include-pch/-include-pth directives.
1044*67e74705SXin Li if (!InitOpts.ImplicitPCHInclude.empty())
1045*67e74705SXin Li AddImplicitIncludePCH(Builder, PP, PCHContainerRdr,
1046*67e74705SXin Li InitOpts.ImplicitPCHInclude);
1047*67e74705SXin Li if (!InitOpts.ImplicitPTHInclude.empty())
1048*67e74705SXin Li AddImplicitIncludePTH(Builder, PP, InitOpts.ImplicitPTHInclude);
1049*67e74705SXin Li
1050*67e74705SXin Li // Process -include directives.
1051*67e74705SXin Li for (unsigned i = 0, e = InitOpts.Includes.size(); i != e; ++i) {
1052*67e74705SXin Li const std::string &Path = InitOpts.Includes[i];
1053*67e74705SXin Li AddImplicitInclude(Builder, Path);
1054*67e74705SXin Li }
1055*67e74705SXin Li
1056*67e74705SXin Li // Instruct the preprocessor to skip the preamble.
1057*67e74705SXin Li PP.setSkipMainFilePreamble(InitOpts.PrecompiledPreambleBytes.first,
1058*67e74705SXin Li InitOpts.PrecompiledPreambleBytes.second);
1059*67e74705SXin Li
1060*67e74705SXin Li // Copy PredefinedBuffer into the Preprocessor.
1061*67e74705SXin Li PP.setPredefines(Predefines.str());
1062*67e74705SXin Li }
1063