blob: 3a54d1dca78096c3accf2e0be0a1aac309a3543d [file] [log] [blame]
Chris Lattnere116ccf2009-04-21 05:40:52 +00001//===--- InitPreprocessor.cpp - PP initialization code. ---------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the clang::InitializePreprocessor function.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Frontend/InitPreprocessor.h"
15#include "clang/Basic/TargetInfo.h"
16#include "clang/Lex/Preprocessor.h"
17#include "llvm/ADT/StringExtras.h"
18#include "llvm/ADT/STLExtras.h"
19#include "llvm/System/Path.h"
Chris Lattner47c06ee2009-11-02 21:48:09 +000020using namespace clang;
Chris Lattnere116ccf2009-04-21 05:40:52 +000021
22// Append a #define line to Buf for Macro. Macro should be of the form XXX,
23// in which case we emit "#define XXX 1" or "XXX=Y z W" in which case we emit
24// "#define XXX Y z W". To get a #define with no value, use "XXX=".
Chris Lattner810dc542009-06-04 16:47:09 +000025static void DefineBuiltinMacro(std::vector<char> &Buf, const char *Macro) {
26 const char *Command = "#define ";
Chris Lattnere116ccf2009-04-21 05:40:52 +000027 Buf.insert(Buf.end(), Command, Command+strlen(Command));
28 if (const char *Equal = strchr(Macro, '=')) {
29 // Turn the = into ' '.
30 Buf.insert(Buf.end(), Macro, Equal);
31 Buf.push_back(' ');
Mike Stump1eb44332009-09-09 15:08:12 +000032
Chris Lattnere116ccf2009-04-21 05:40:52 +000033 // Per GCC -D semantics, the macro ends at \n if it exists.
34 const char *End = strpbrk(Equal, "\n\r");
35 if (End) {
36 fprintf(stderr, "warning: macro '%s' contains embedded newline, text "
37 "after the newline is ignored.\n",
38 std::string(Macro, Equal).c_str());
39 } else {
40 End = Equal+strlen(Equal);
41 }
Mike Stump1eb44332009-09-09 15:08:12 +000042
Chris Lattnere116ccf2009-04-21 05:40:52 +000043 Buf.insert(Buf.end(), Equal+1, End);
44 } else {
45 // Push "macroname 1".
46 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
47 Buf.push_back(' ');
48 Buf.push_back('1');
49 }
50 Buf.push_back('\n');
51}
52
Chris Lattnerdcdecf42009-05-15 16:08:43 +000053// Append a #undef line to Buf for Macro. Macro should be of the form XXX
54// and we emit "#undef XXX".
55static void UndefineBuiltinMacro(std::vector<char> &Buf, const char *Macro) {
56 // Push "macroname".
57 const char *Command = "#undef ";
58 Buf.insert(Buf.end(), Command, Command+strlen(Command));
59 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
60 Buf.push_back('\n');
61}
62
Chris Lattnere116ccf2009-04-21 05:40:52 +000063/// Add the quoted name of an implicit include file.
Mike Stump1eb44332009-09-09 15:08:12 +000064static void AddQuotedIncludePath(std::vector<char> &Buf,
Chris Lattnere116ccf2009-04-21 05:40:52 +000065 const std::string &File) {
Daniel Dunbar1e7c6b62009-04-22 08:53:01 +000066 // Implicit include paths should be resolved relative to the current
67 // working directory first, and then use the regular header search
68 // mechanism. The proper way to handle this is to have the
69 // predefines buffer located at the current working directory, but
70 // it has not file entry. For now, workaround this by using an
71 // absolute path if we find the file here, and otherwise letting
72 // header search handle it.
Chris Lattnere116ccf2009-04-21 05:40:52 +000073 llvm::sys::Path Path(File);
74 Path.makeAbsolute();
Daniel Dunbar1e7c6b62009-04-22 08:53:01 +000075 if (!Path.exists())
76 Path = File;
Mike Stump1eb44332009-09-09 15:08:12 +000077
Chris Lattnere116ccf2009-04-21 05:40:52 +000078 // Escape double quotes etc.
79 Buf.push_back('"');
Chris Lattnerd57a7ef2009-08-23 22:45:33 +000080 std::string EscapedFile = Lexer::Stringify(Path.str());
Chris Lattnere116ccf2009-04-21 05:40:52 +000081 Buf.insert(Buf.end(), EscapedFile.begin(), EscapedFile.end());
82 Buf.push_back('"');
83}
84
85/// AddImplicitInclude - Add an implicit #include of the specified file to the
86/// predefines buffer.
Mike Stump1eb44332009-09-09 15:08:12 +000087static void AddImplicitInclude(std::vector<char> &Buf,
Chris Lattnere116ccf2009-04-21 05:40:52 +000088 const std::string &File) {
89 const char *Inc = "#include ";
90 Buf.insert(Buf.end(), Inc, Inc+strlen(Inc));
91 AddQuotedIncludePath(Buf, File);
92 Buf.push_back('\n');
93}
94
95static void AddImplicitIncludeMacros(std::vector<char> &Buf,
96 const std::string &File) {
97 const char *Inc = "#__include_macros ";
98 Buf.insert(Buf.end(), Inc, Inc+strlen(Inc));
99 AddQuotedIncludePath(Buf, File);
100 Buf.push_back('\n');
101 // Marker token to stop the __include_macros fetch loop.
102 const char *Marker = "##\n"; // ##?
103 Buf.insert(Buf.end(), Marker, Marker+strlen(Marker));
104}
105
106/// AddImplicitIncludePTH - Add an implicit #include using the original file
107/// used to generate a PTH cache.
Mike Stump1eb44332009-09-09 15:08:12 +0000108static void AddImplicitIncludePTH(std::vector<char> &Buf, Preprocessor &PP,
Chris Lattnere116ccf2009-04-21 05:40:52 +0000109 const std::string& ImplicitIncludePTH) {
110 PTHManager *P = PP.getPTHManager();
111 assert(P && "No PTHManager.");
112 const char *OriginalFile = P->getOriginalSourceFile();
Mike Stump1eb44332009-09-09 15:08:12 +0000113
Chris Lattnere116ccf2009-04-21 05:40:52 +0000114 if (!OriginalFile) {
115 assert(!ImplicitIncludePTH.empty());
116 fprintf(stderr, "error: PTH file '%s' does not designate an original "
117 "source header file for -include-pth\n",
118 ImplicitIncludePTH.c_str());
119 exit (1);
120 }
Mike Stump1eb44332009-09-09 15:08:12 +0000121
Chris Lattnere116ccf2009-04-21 05:40:52 +0000122 AddImplicitInclude(Buf, OriginalFile);
123}
124
125/// PickFP - This is used to pick a value based on the FP semantics of the
126/// specified FP model.
127template <typename T>
128static T PickFP(const llvm::fltSemantics *Sem, T IEEESingleVal,
Eli Friedman2665a752009-05-23 03:50:01 +0000129 T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal,
130 T IEEEQuadVal) {
Duncan Sands63682f92009-06-03 14:28:20 +0000131 if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle)
Chris Lattnere116ccf2009-04-21 05:40:52 +0000132 return IEEESingleVal;
Duncan Sands63682f92009-06-03 14:28:20 +0000133 if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEdouble)
Chris Lattnere116ccf2009-04-21 05:40:52 +0000134 return IEEEDoubleVal;
Duncan Sands63682f92009-06-03 14:28:20 +0000135 if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::x87DoubleExtended)
Chris Lattnere116ccf2009-04-21 05:40:52 +0000136 return X87DoubleExtendedVal;
Duncan Sands63682f92009-06-03 14:28:20 +0000137 if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble)
Eli Friedman2665a752009-05-23 03:50:01 +0000138 return PPCDoubleDoubleVal;
Duncan Sands63682f92009-06-03 14:28:20 +0000139 assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad);
Eli Friedman2665a752009-05-23 03:50:01 +0000140 return IEEEQuadVal;
Chris Lattnere116ccf2009-04-21 05:40:52 +0000141}
142
143static void DefineFloatMacros(std::vector<char> &Buf, const char *Prefix,
144 const llvm::fltSemantics *Sem) {
145 const char *DenormMin, *Epsilon, *Max, *Min;
Mike Stump1eb44332009-09-09 15:08:12 +0000146 DenormMin = PickFP(Sem, "1.40129846e-45F", "4.9406564584124654e-324",
Chris Lattnere116ccf2009-04-21 05:40:52 +0000147 "3.64519953188247460253e-4951L",
Eli Friedman2665a752009-05-23 03:50:01 +0000148 "4.94065645841246544176568792868221e-324L",
149 "6.47517511943802511092443895822764655e-4966L");
150 int Digits = PickFP(Sem, 6, 15, 18, 31, 33);
Chris Lattnere116ccf2009-04-21 05:40:52 +0000151 Epsilon = PickFP(Sem, "1.19209290e-7F", "2.2204460492503131e-16",
152 "1.08420217248550443401e-19L",
Eli Friedman2665a752009-05-23 03:50:01 +0000153 "4.94065645841246544176568792868221e-324L",
154 "1.92592994438723585305597794258492732e-34L");
Chris Lattnere116ccf2009-04-21 05:40:52 +0000155 int HasInifinity = 1, HasQuietNaN = 1;
Eli Friedman2665a752009-05-23 03:50:01 +0000156 int MantissaDigits = PickFP(Sem, 24, 53, 64, 106, 113);
157 int Min10Exp = PickFP(Sem, -37, -307, -4931, -291, -4931);
158 int Max10Exp = PickFP(Sem, 38, 308, 4932, 308, 4932);
159 int MinExp = PickFP(Sem, -125, -1021, -16381, -968, -16381);
160 int MaxExp = PickFP(Sem, 128, 1024, 16384, 1024, 16384);
Chris Lattnere116ccf2009-04-21 05:40:52 +0000161 Min = PickFP(Sem, "1.17549435e-38F", "2.2250738585072014e-308",
162 "3.36210314311209350626e-4932L",
Eli Friedman2665a752009-05-23 03:50:01 +0000163 "2.00416836000897277799610805135016e-292L",
164 "3.36210314311209350626267781732175260e-4932L");
Chris Lattnere116ccf2009-04-21 05:40:52 +0000165 Max = PickFP(Sem, "3.40282347e+38F", "1.7976931348623157e+308",
166 "1.18973149535723176502e+4932L",
Eli Friedman2665a752009-05-23 03:50:01 +0000167 "1.79769313486231580793728971405301e+308L",
168 "1.18973149535723176508575932662800702e+4932L");
Mike Stump1eb44332009-09-09 15:08:12 +0000169
Eli Friedman2665a752009-05-23 03:50:01 +0000170 char MacroBuf[100];
Chris Lattnere116ccf2009-04-21 05:40:52 +0000171 sprintf(MacroBuf, "__%s_DENORM_MIN__=%s", Prefix, DenormMin);
172 DefineBuiltinMacro(Buf, MacroBuf);
173 sprintf(MacroBuf, "__%s_DIG__=%d", Prefix, Digits);
174 DefineBuiltinMacro(Buf, MacroBuf);
175 sprintf(MacroBuf, "__%s_EPSILON__=%s", Prefix, Epsilon);
176 DefineBuiltinMacro(Buf, MacroBuf);
177 sprintf(MacroBuf, "__%s_HAS_INFINITY__=%d", Prefix, HasInifinity);
178 DefineBuiltinMacro(Buf, MacroBuf);
179 sprintf(MacroBuf, "__%s_HAS_QUIET_NAN__=%d", Prefix, HasQuietNaN);
180 DefineBuiltinMacro(Buf, MacroBuf);
181 sprintf(MacroBuf, "__%s_MANT_DIG__=%d", Prefix, MantissaDigits);
182 DefineBuiltinMacro(Buf, MacroBuf);
183 sprintf(MacroBuf, "__%s_MAX_10_EXP__=%d", Prefix, Max10Exp);
184 DefineBuiltinMacro(Buf, MacroBuf);
185 sprintf(MacroBuf, "__%s_MAX_EXP__=%d", Prefix, MaxExp);
186 DefineBuiltinMacro(Buf, MacroBuf);
187 sprintf(MacroBuf, "__%s_MAX__=%s", Prefix, Max);
188 DefineBuiltinMacro(Buf, MacroBuf);
189 sprintf(MacroBuf, "__%s_MIN_10_EXP__=(%d)", Prefix, Min10Exp);
190 DefineBuiltinMacro(Buf, MacroBuf);
191 sprintf(MacroBuf, "__%s_MIN_EXP__=(%d)", Prefix, MinExp);
192 DefineBuiltinMacro(Buf, MacroBuf);
193 sprintf(MacroBuf, "__%s_MIN__=%s", Prefix, Min);
194 DefineBuiltinMacro(Buf, MacroBuf);
195 sprintf(MacroBuf, "__%s_HAS_DENORM__=1", Prefix);
196 DefineBuiltinMacro(Buf, MacroBuf);
197}
198
199
200/// DefineTypeSize - Emit a macro to the predefines buffer that declares a macro
201/// named MacroName with the max value for a type with width 'TypeWidth' a
202/// signedness of 'isSigned' and with a value suffix of 'ValSuffix' (e.g. LL).
203static void DefineTypeSize(const char *MacroName, unsigned TypeWidth,
204 const char *ValSuffix, bool isSigned,
205 std::vector<char> &Buf) {
206 char MacroBuf[60];
207 long long MaxVal;
208 if (isSigned)
209 MaxVal = (1LL << (TypeWidth - 1)) - 1;
210 else
211 MaxVal = ~0LL >> (64-TypeWidth);
Mike Stump1eb44332009-09-09 15:08:12 +0000212
Daniel Dunbarb8b844b2009-09-03 19:23:49 +0000213 // FIXME: Switch to using raw_ostream and avoid utostr().
214 sprintf(MacroBuf, "%s=%s%s", MacroName, llvm::utostr(MaxVal).c_str(),
215 ValSuffix);
Chris Lattnere116ccf2009-04-21 05:40:52 +0000216 DefineBuiltinMacro(Buf, MacroBuf);
217}
218
219static void DefineType(const char *MacroName, TargetInfo::IntType Ty,
220 std::vector<char> &Buf) {
221 char MacroBuf[60];
222 sprintf(MacroBuf, "%s=%s", MacroName, TargetInfo::getTypeName(Ty));
223 DefineBuiltinMacro(Buf, MacroBuf);
224}
225
226
227static void InitializePredefinedMacros(const TargetInfo &TI,
228 const LangOptions &LangOpts,
229 std::vector<char> &Buf) {
230 char MacroBuf[60];
231 // Compiler version introspection macros.
232 DefineBuiltinMacro(Buf, "__llvm__=1"); // LLVM Backend
233 DefineBuiltinMacro(Buf, "__clang__=1"); // Clang Frontend
Mike Stump1eb44332009-09-09 15:08:12 +0000234
Chris Lattnere116ccf2009-04-21 05:40:52 +0000235 // Currently claim to be compatible with GCC 4.2.1-5621.
Chris Lattnere116ccf2009-04-21 05:40:52 +0000236 DefineBuiltinMacro(Buf, "__GNUC_MINOR__=2");
237 DefineBuiltinMacro(Buf, "__GNUC_PATCHLEVEL__=1");
238 DefineBuiltinMacro(Buf, "__GNUC__=4");
239 DefineBuiltinMacro(Buf, "__GXX_ABI_VERSION=1002");
240 DefineBuiltinMacro(Buf, "__VERSION__=\"4.2.1 Compatible Clang Compiler\"");
Mike Stump1eb44332009-09-09 15:08:12 +0000241
242
Chris Lattnere116ccf2009-04-21 05:40:52 +0000243 // Initialize language-specific preprocessor defines.
Mike Stump1eb44332009-09-09 15:08:12 +0000244
Chris Lattnere116ccf2009-04-21 05:40:52 +0000245 // These should all be defined in the preprocessor according to the
246 // current language configuration.
247 if (!LangOpts.Microsoft)
248 DefineBuiltinMacro(Buf, "__STDC__=1");
249 if (LangOpts.AsmPreprocessor)
250 DefineBuiltinMacro(Buf, "__ASSEMBLER__=1");
Ryan Flynn07ef8042009-07-21 00:07:02 +0000251
252 if (!LangOpts.CPlusPlus) {
253 if (LangOpts.C99)
254 DefineBuiltinMacro(Buf, "__STDC_VERSION__=199901L");
255 else if (!LangOpts.GNUMode && LangOpts.Digraphs)
256 DefineBuiltinMacro(Buf, "__STDC_VERSION__=199409L");
257 }
Chris Lattnere116ccf2009-04-21 05:40:52 +0000258
259 // Standard conforming mode?
260 if (!LangOpts.GNUMode)
261 DefineBuiltinMacro(Buf, "__STRICT_ANSI__=1");
Mike Stump1eb44332009-09-09 15:08:12 +0000262
Chris Lattnere116ccf2009-04-21 05:40:52 +0000263 if (LangOpts.CPlusPlus0x)
264 DefineBuiltinMacro(Buf, "__GXX_EXPERIMENTAL_CXX0X__");
265
266 if (LangOpts.Freestanding)
267 DefineBuiltinMacro(Buf, "__STDC_HOSTED__=0");
268 else
269 DefineBuiltinMacro(Buf, "__STDC_HOSTED__=1");
Mike Stump1eb44332009-09-09 15:08:12 +0000270
Chris Lattnere116ccf2009-04-21 05:40:52 +0000271 if (LangOpts.ObjC1) {
272 DefineBuiltinMacro(Buf, "__OBJC__=1");
273 if (LangOpts.ObjCNonFragileABI) {
274 DefineBuiltinMacro(Buf, "__OBJC2__=1");
275 DefineBuiltinMacro(Buf, "OBJC_ZEROCOST_EXCEPTIONS=1");
Chris Lattnere116ccf2009-04-21 05:40:52 +0000276 }
277
278 if (LangOpts.getGCMode() != LangOptions::NonGC)
279 DefineBuiltinMacro(Buf, "__OBJC_GC__=1");
Mike Stump1eb44332009-09-09 15:08:12 +0000280
Chris Lattnere116ccf2009-04-21 05:40:52 +0000281 if (LangOpts.NeXTRuntime)
282 DefineBuiltinMacro(Buf, "__NEXT_RUNTIME__=1");
283 }
Mike Stump1eb44332009-09-09 15:08:12 +0000284
Chris Lattnere116ccf2009-04-21 05:40:52 +0000285 // darwin_constant_cfstrings controls this. This is also dependent
286 // on other things like the runtime I believe. This is set even for C code.
287 DefineBuiltinMacro(Buf, "__CONSTANT_CFSTRINGS__=1");
Mike Stump1eb44332009-09-09 15:08:12 +0000288
Chris Lattnere116ccf2009-04-21 05:40:52 +0000289 if (LangOpts.ObjC2)
290 DefineBuiltinMacro(Buf, "OBJC_NEW_PROPERTIES");
291
292 if (LangOpts.PascalStrings)
293 DefineBuiltinMacro(Buf, "__PASCAL_STRINGS__");
294
295 if (LangOpts.Blocks) {
296 DefineBuiltinMacro(Buf, "__block=__attribute__((__blocks__(byref)))");
297 DefineBuiltinMacro(Buf, "__BLOCKS__=1");
298 }
Mike Stump1eb44332009-09-09 15:08:12 +0000299
Rafael Espindolaf759df02009-10-01 13:33:33 +0000300 if (LangOpts.Exceptions)
301 DefineBuiltinMacro(Buf, "__EXCEPTIONS=1");
302
Chris Lattnere116ccf2009-04-21 05:40:52 +0000303 if (LangOpts.CPlusPlus) {
304 DefineBuiltinMacro(Buf, "__DEPRECATED=1");
Chris Lattnere116ccf2009-04-21 05:40:52 +0000305 DefineBuiltinMacro(Buf, "__GNUG__=4");
306 DefineBuiltinMacro(Buf, "__GXX_WEAK__=1");
Douglas Gregor36dd1312009-08-06 04:09:28 +0000307 if (LangOpts.GNUMode)
308 DefineBuiltinMacro(Buf, "__cplusplus=1");
Mike Stump1eb44332009-09-09 15:08:12 +0000309 else
Douglas Gregor36dd1312009-08-06 04:09:28 +0000310 // C++ [cpp.predefined]p1:
Mike Stump1eb44332009-09-09 15:08:12 +0000311 // The name_ _cplusplusis defined to the value199711Lwhen compiling a
Douglas Gregor36dd1312009-08-06 04:09:28 +0000312 // C++ translation unit.
313 DefineBuiltinMacro(Buf, "__cplusplus=199711L");
Chris Lattnere116ccf2009-04-21 05:40:52 +0000314 DefineBuiltinMacro(Buf, "__private_extern__=extern");
Eli Friedman666479b2009-08-27 22:01:41 +0000315 // Ugly hack to work with GNU libstdc++.
316 DefineBuiltinMacro(Buf, "_GNU_SOURCE=1");
Chris Lattnere116ccf2009-04-21 05:40:52 +0000317 }
Mike Stump1eb44332009-09-09 15:08:12 +0000318
Chris Lattnere116ccf2009-04-21 05:40:52 +0000319 if (LangOpts.Microsoft) {
John Thompson24ee8042009-10-16 01:12:00 +0000320 // Filter out some microsoft extensions when trying to parse in ms-compat
321 // mode.
Chris Lattnere116ccf2009-04-21 05:40:52 +0000322 DefineBuiltinMacro(Buf, "__int8=__INT8_TYPE__");
323 DefineBuiltinMacro(Buf, "__int16=__INT16_TYPE__");
324 DefineBuiltinMacro(Buf, "__int32=__INT32_TYPE__");
325 DefineBuiltinMacro(Buf, "__int64=__INT64_TYPE__");
John Thompson24ee8042009-10-16 01:12:00 +0000326 // Work around some issues with Visual C++ headerws.
327 if (LangOpts.CPlusPlus) {
328 // Since we define wchar_t in C++ mode.
329 DefineBuiltinMacro(Buf, "_WCHAR_T_DEFINED=1");
330 DefineBuiltinMacro(Buf, "_NATIVE_WCHAR_T_DEFINED=1");
331 // FIXME: This should be temporary until we have a __pragma
332 // solution, to avoid some errors flagged in VC++ headers.
333 DefineBuiltinMacro(Buf, "_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES=0");
334 }
Chris Lattnere116ccf2009-04-21 05:40:52 +0000335 }
Mike Stump1eb44332009-09-09 15:08:12 +0000336
Chris Lattnere116ccf2009-04-21 05:40:52 +0000337 if (LangOpts.Optimize)
338 DefineBuiltinMacro(Buf, "__OPTIMIZE__=1");
339 if (LangOpts.OptimizeSize)
340 DefineBuiltinMacro(Buf, "__OPTIMIZE_SIZE__=1");
Mike Stump1eb44332009-09-09 15:08:12 +0000341
Chris Lattnere116ccf2009-04-21 05:40:52 +0000342 // Initialize target-specific preprocessor defines.
Mike Stump1eb44332009-09-09 15:08:12 +0000343
Chris Lattnere116ccf2009-04-21 05:40:52 +0000344 // Define type sizing macros based on the target properties.
345 assert(TI.getCharWidth() == 8 && "Only support 8-bit char so far");
346 DefineBuiltinMacro(Buf, "__CHAR_BIT__=8");
347
Chris Lattnere116ccf2009-04-21 05:40:52 +0000348 DefineTypeSize("__SCHAR_MAX__", TI.getCharWidth(), "", true, Buf);
349 DefineTypeSize("__SHRT_MAX__", TI.getShortWidth(), "", true, Buf);
350 DefineTypeSize("__INT_MAX__", TI.getIntWidth(), "", true, Buf);
351 DefineTypeSize("__LONG_MAX__", TI.getLongWidth(), "L", true, Buf);
352 DefineTypeSize("__LONG_LONG_MAX__", TI.getLongLongWidth(), "LL", true, Buf);
353 DefineTypeSize("__WCHAR_MAX__", TI.getWCharWidth(), "", true, Buf);
Chris Lattnerc8837702009-10-29 04:54:24 +0000354 TargetInfo::IntType IntMaxType = TI.getIntMaxType();
355 DefineTypeSize("__INTMAX_MAX__", TI.getTypeWidth(IntMaxType),
356 TI.getTypeConstantSuffix(IntMaxType), true, Buf);
Chris Lattnere116ccf2009-04-21 05:40:52 +0000357
358 DefineType("__INTMAX_TYPE__", TI.getIntMaxType(), Buf);
359 DefineType("__UINTMAX_TYPE__", TI.getUIntMaxType(), Buf);
360 DefineType("__PTRDIFF_TYPE__", TI.getPtrDiffType(0), Buf);
361 DefineType("__INTPTR_TYPE__", TI.getIntPtrType(), Buf);
362 DefineType("__SIZE_TYPE__", TI.getSizeType(), Buf);
363 DefineType("__WCHAR_TYPE__", TI.getWCharType(), Buf);
Chris Lattnere64ef802009-10-21 04:59:34 +0000364 DefineType("__WINT_TYPE__", TI.getWIntType(), Buf);
Mike Stump1eb44332009-09-09 15:08:12 +0000365
Chris Lattnere116ccf2009-04-21 05:40:52 +0000366 DefineFloatMacros(Buf, "FLT", &TI.getFloatFormat());
367 DefineFloatMacros(Buf, "DBL", &TI.getDoubleFormat());
368 DefineFloatMacros(Buf, "LDBL", &TI.getLongDoubleFormat());
369
370 // Define a __POINTER_WIDTH__ macro for stdint.h.
371 sprintf(MacroBuf, "__POINTER_WIDTH__=%d", (int)TI.getPointerWidth(0));
372 DefineBuiltinMacro(Buf, MacroBuf);
Mike Stump1eb44332009-09-09 15:08:12 +0000373
Eli Friedman15b91762009-06-05 07:05:05 +0000374 if (!LangOpts.CharIsSigned)
Mike Stump1eb44332009-09-09 15:08:12 +0000375 DefineBuiltinMacro(Buf, "__CHAR_UNSIGNED__");
Chris Lattnere116ccf2009-04-21 05:40:52 +0000376
377 // Define fixed-sized integer types for stdint.h
378 assert(TI.getCharWidth() == 8 && "unsupported target types");
379 assert(TI.getShortWidth() == 16 && "unsupported target types");
380 DefineBuiltinMacro(Buf, "__INT8_TYPE__=char");
381 DefineBuiltinMacro(Buf, "__INT16_TYPE__=short");
Mike Stump1eb44332009-09-09 15:08:12 +0000382
Chris Lattnere116ccf2009-04-21 05:40:52 +0000383 if (TI.getIntWidth() == 32)
384 DefineBuiltinMacro(Buf, "__INT32_TYPE__=int");
385 else {
386 assert(TI.getLongLongWidth() == 32 && "unsupported target types");
387 DefineBuiltinMacro(Buf, "__INT32_TYPE__=long long");
388 }
Mike Stump1eb44332009-09-09 15:08:12 +0000389
Chris Lattnere116ccf2009-04-21 05:40:52 +0000390 // 16-bit targets doesn't necessarily have a 64-bit type.
391 if (TI.getLongLongWidth() == 64)
Eli Friedman3c7b6e42009-07-01 03:36:11 +0000392 DefineType("__INT64_TYPE__", TI.getInt64Type(), Buf);
Mike Stump1eb44332009-09-09 15:08:12 +0000393
Chris Lattnere116ccf2009-04-21 05:40:52 +0000394 // Add __builtin_va_list typedef.
395 {
396 const char *VAList = TI.getVAListDeclaration();
397 Buf.insert(Buf.end(), VAList, VAList+strlen(VAList));
398 Buf.push_back('\n');
399 }
Mike Stump1eb44332009-09-09 15:08:12 +0000400
Chris Lattnere116ccf2009-04-21 05:40:52 +0000401 if (const char *Prefix = TI.getUserLabelPrefix()) {
402 sprintf(MacroBuf, "__USER_LABEL_PREFIX__=%s", Prefix);
403 DefineBuiltinMacro(Buf, MacroBuf);
404 }
Mike Stump1eb44332009-09-09 15:08:12 +0000405
Chris Lattnere116ccf2009-04-21 05:40:52 +0000406 // Build configuration options. FIXME: these should be controlled by
407 // command line options or something.
408 DefineBuiltinMacro(Buf, "__FINITE_MATH_ONLY__=0");
409
Chris Lattnere116ccf2009-04-21 05:40:52 +0000410 if (LangOpts.GNUInline)
411 DefineBuiltinMacro(Buf, "__GNUC_GNU_INLINE__=1");
412 else
413 DefineBuiltinMacro(Buf, "__GNUC_STDC_INLINE__=1");
414
415 if (LangOpts.NoInline)
416 DefineBuiltinMacro(Buf, "__NO_INLINE__=1");
417
418 if (unsigned PICLevel = LangOpts.PICLevel) {
419 sprintf(MacroBuf, "__PIC__=%d", PICLevel);
420 DefineBuiltinMacro(Buf, MacroBuf);
421
422 sprintf(MacroBuf, "__pic__=%d", PICLevel);
423 DefineBuiltinMacro(Buf, MacroBuf);
424 }
425
426 // Macros to control C99 numerics and <float.h>
427 DefineBuiltinMacro(Buf, "__FLT_EVAL_METHOD__=0");
428 DefineBuiltinMacro(Buf, "__FLT_RADIX__=2");
429 sprintf(MacroBuf, "__DECIMAL_DIG__=%d",
Eli Friedman2665a752009-05-23 03:50:01 +0000430 PickFP(&TI.getLongDoubleFormat(), -1/*FIXME*/, 17, 21, 33, 36));
Chris Lattnere116ccf2009-04-21 05:40:52 +0000431 DefineBuiltinMacro(Buf, MacroBuf);
Bill Wendling45483f72009-06-28 07:36:13 +0000432
Bill Wendling4ebe3e42009-06-28 23:01:01 +0000433 if (LangOpts.getStackProtectorMode() == LangOptions::SSPOn)
Bill Wendling45483f72009-06-28 07:36:13 +0000434 DefineBuiltinMacro(Buf, "__SSP__=1");
Bill Wendling4ebe3e42009-06-28 23:01:01 +0000435 else if (LangOpts.getStackProtectorMode() == LangOptions::SSPReq)
Bill Wendling45483f72009-06-28 07:36:13 +0000436 DefineBuiltinMacro(Buf, "__SSP_ALL__=2");
437
Chris Lattnere116ccf2009-04-21 05:40:52 +0000438 // Get other target #defines.
439 TI.getTargetDefines(LangOpts, Buf);
440}
441
442/// InitializePreprocessor - Initialize the preprocessor getting it and the
443/// environment ready to process a single file. This returns true on error.
444///
Chris Lattner47c06ee2009-11-02 21:48:09 +0000445bool clang::InitializePreprocessor(Preprocessor &PP,
Daniel Dunbar468fe242009-11-04 21:13:02 +0000446 const PreprocessorInitOptions &InitOpts) {
Chris Lattnere116ccf2009-04-21 05:40:52 +0000447 std::vector<char> PredefineBuffer;
Mike Stump1eb44332009-09-09 15:08:12 +0000448
Chris Lattner39360242009-04-22 03:42:19 +0000449 const char *LineDirective = "# 1 \"<built-in>\" 3\n";
450 PredefineBuffer.insert(PredefineBuffer.end(),
451 LineDirective, LineDirective+strlen(LineDirective));
Mike Stump1eb44332009-09-09 15:08:12 +0000452
Chris Lattnere116ccf2009-04-21 05:40:52 +0000453 // Install things like __POWERPC__, __GNUC__, etc into the macro table.
Daniel Dunbar468fe242009-11-04 21:13:02 +0000454 if (InitOpts.getUsePredefines())
Chris Lattnere6113de2009-11-03 19:50:27 +0000455 InitializePredefinedMacros(PP.getTargetInfo(), PP.getLangOptions(),
456 PredefineBuffer);
Mike Stump1eb44332009-09-09 15:08:12 +0000457
Chris Lattnere116ccf2009-04-21 05:40:52 +0000458 // Add on the predefines from the driver. Wrap in a #line directive to report
459 // that they come from the command line.
Chris Lattner39360242009-04-22 03:42:19 +0000460 LineDirective = "# 1 \"<command line>\" 1\n";
Chris Lattnere116ccf2009-04-21 05:40:52 +0000461 PredefineBuffer.insert(PredefineBuffer.end(),
462 LineDirective, LineDirective+strlen(LineDirective));
463
464 // Process #define's and #undef's in the order they are given.
465 for (PreprocessorInitOptions::macro_iterator I = InitOpts.macro_begin(),
466 E = InitOpts.macro_end(); I != E; ++I) {
Chris Lattner62f86c42009-04-21 06:00:24 +0000467 if (I->second) // isUndef
Chris Lattnerdcdecf42009-05-15 16:08:43 +0000468 UndefineBuiltinMacro(PredefineBuffer, I->first.c_str());
Chris Lattner62f86c42009-04-21 06:00:24 +0000469 else
470 DefineBuiltinMacro(PredefineBuffer, I->first.c_str());
Chris Lattnere116ccf2009-04-21 05:40:52 +0000471 }
472
473 // If -imacros are specified, include them now. These are processed before
474 // any -include directives.
475 for (PreprocessorInitOptions::imacro_iterator I = InitOpts.imacro_begin(),
476 E = InitOpts.imacro_end(); I != E; ++I)
477 AddImplicitIncludeMacros(PredefineBuffer, *I);
478
479 // Process -include directives.
480 for (PreprocessorInitOptions::include_iterator I = InitOpts.include_begin(),
481 E = InitOpts.include_end(); I != E; ++I) {
Chris Lattner62f86c42009-04-21 06:00:24 +0000482 if (I->second) // isPTH
Chris Lattnere116ccf2009-04-21 05:40:52 +0000483 AddImplicitIncludePTH(PredefineBuffer, PP, I->first);
Chris Lattner62f86c42009-04-21 06:00:24 +0000484 else
485 AddImplicitInclude(PredefineBuffer, I->first);
Eli Friedmanae96a962009-06-15 09:57:52 +0000486 }
Chris Lattnere116ccf2009-04-21 05:40:52 +0000487
488 // Null terminate PredefinedBuffer and add it.
489 PredefineBuffer.push_back(0);
490 PP.setPredefines(&PredefineBuffer[0]);
491
492 // Once we've read this, we're done.
493 return false;
494}