1e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner//===--- InitPreprocessor.cpp - PP initialization code. ---------*- C++ -*-===// 2e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner// 3e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner// The LLVM Compiler Infrastructure 4e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner// 5e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner// This file is distributed under the University of Illinois Open Source 6e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner// License. See LICENSE.TXT for details. 7e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner// 8e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner//===----------------------------------------------------------------------===// 9e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner// 10e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner// This file implements the clang::InitializePreprocessor function. 11e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner// 12e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner//===----------------------------------------------------------------------===// 13e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 144290fbd89e851c1f1240a007461f4afd940cbb47Douglas Gregor#include "clang/Basic/Version.h" 158863b985f1cf78a2fb62913e184dc45162853cf9Daniel Dunbar#include "clang/Frontend/Utils.h" 16103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth#include "clang/Basic/MacroBuilder.h" 17e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner#include "clang/Basic/TargetInfo.h" 182973c0eff437e57541735c9bb9561358715440e6Douglas Gregor#include "clang/Frontend/FrontendDiagnostic.h" 197d957472ef9a09048c03d8a11028536f908c18b9Fariborz Jahanian#include "clang/Frontend/FrontendOptions.h" 208863b985f1cf78a2fb62913e184dc45162853cf9Daniel Dunbar#include "clang/Frontend/PreprocessorOptions.h" 21cb381eac84e5a14a8c7e7654eadbe1d3d54d795cChandler Carruth#include "clang/Lex/HeaderSearch.h" 22e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner#include "clang/Lex/Preprocessor.h" 232973c0eff437e57541735c9bb9561358715440e6Douglas Gregor#include "clang/Basic/FileManager.h" 242973c0eff437e57541735c9bb9561358715440e6Douglas Gregor#include "clang/Basic/SourceManager.h" 25a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer#include "llvm/ADT/APFloat.h" 26fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer#include "llvm/Support/FileSystem.h" 272973c0eff437e57541735c9bb9561358715440e6Douglas Gregor#include "llvm/Support/MemoryBuffer.h" 2803013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Path.h" 2947c06eea60873fe87adc2b5c985f0a3173e1d266Chris Lattnerusing namespace clang; 30e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 31e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner// Append a #define line to Buf for Macro. Macro should be of the form XXX, 32e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner// in which case we emit "#define XXX 1" or "XXX=Y z W" in which case we emit 33e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner// "#define XXX Y z W". To get a #define with no value, use "XXX=". 345f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void DefineBuiltinMacro(MacroBuilder &Builder, StringRef Macro, 35d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags) { 365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner std::pair<StringRef, StringRef> MacroPair = Macro.split('='); 375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef MacroName = MacroPair.first; 385f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef MacroBody = MacroPair.second; 391ee4b9e6d2d0d031708e2e6dd52aa9e32b83f1c3Daniel Dunbar if (MacroName.size() != Macro.size()) { 40e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // Per GCC -D semantics, the macro ends at \n if it exists. 415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef::size_type End = MacroBody.find_first_of("\n\r"); 425f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (End != StringRef::npos) 431ee4b9e6d2d0d031708e2e6dd52aa9e32b83f1c3Daniel Dunbar Diags.Report(diag::warn_fe_macro_contains_embedded_newline) 448746e4e3810ffa54a3a0fa74ed95d8112defb6feKovarththanan Rajaratnam << MacroName; 45b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro(MacroName, MacroBody.substr(0, End)); 46e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner } else { 47e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // Push "macroname 1". 48b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro(Macro); 49e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner } 50dcdecf4a777e503b24de6b15a054d580b585c06cChris Lattner} 51dcdecf4a777e503b24de6b15a054d580b585c06cChris Lattner 52809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett/// AddImplicitInclude - Add an implicit \#include of the specified file to the 53e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner/// predefines buffer. 545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void AddImplicitInclude(MacroBuilder &Builder, StringRef File, 55277a6e752512cff286190d35cb353ce717e86b18Nick Lewycky FileManager &FileMgr) { 56cb381eac84e5a14a8c7e7654eadbe1d3d54d795cChandler Carruth Builder.append(Twine("#include \"") + 57cb381eac84e5a14a8c7e7654eadbe1d3d54d795cChandler Carruth HeaderSearch::NormalizeDashIncludePath(File, FileMgr) + "\""); 58e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner} 59e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 60a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramerstatic void AddImplicitIncludeMacros(MacroBuilder &Builder, 615f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef File, 62277a6e752512cff286190d35cb353ce717e86b18Nick Lewycky FileManager &FileMgr) { 63cb381eac84e5a14a8c7e7654eadbe1d3d54d795cChandler Carruth Builder.append(Twine("#__include_macros \"") + 64cb381eac84e5a14a8c7e7654eadbe1d3d54d795cChandler Carruth HeaderSearch::NormalizeDashIncludePath(File, FileMgr) + "\""); 65e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // Marker token to stop the __include_macros fetch loop. 66b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.append("##"); // ##? 67e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner} 68e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 69809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett/// AddImplicitIncludePTH - Add an implicit \#include using the original file 70809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett/// used to generate a PTH cache. 71a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramerstatic void AddImplicitIncludePTH(MacroBuilder &Builder, Preprocessor &PP, 725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef ImplicitIncludePTH) { 73e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner PTHManager *P = PP.getPTHManager(); 744ae4c919205307c6e98e6c920aa55019040cbe77Ted Kremenek // Null check 'P' in the corner case where it couldn't be created. 754ae4c919205307c6e98e6c920aa55019040cbe77Ted Kremenek const char *OriginalFile = P ? P->getOriginalSourceFile() : 0; 761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner if (!OriginalFile) { 78baac10380c8b8597a9e5f1beb96c439c3bf02baaDaniel Dunbar PP.getDiagnostics().Report(diag::err_fe_pth_file_has_no_source_header) 79baac10380c8b8597a9e5f1beb96c439c3bf02baaDaniel Dunbar << ImplicitIncludePTH; 80baac10380c8b8597a9e5f1beb96c439c3bf02baaDaniel Dunbar return; 81e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner } 821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 83277a6e752512cff286190d35cb353ce717e86b18Nick Lewycky AddImplicitInclude(Builder, OriginalFile, PP.getFileManager()); 84e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner} 85e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 86e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner/// PickFP - This is used to pick a value based on the FP semantics of the 87e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner/// specified FP model. 88e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattnertemplate <typename T> 89e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattnerstatic T PickFP(const llvm::fltSemantics *Sem, T IEEESingleVal, 902665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, 912665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman T IEEEQuadVal) { 9263682f9c64ba48854d26870486cc33b3291f71b3Duncan Sands if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle) 93e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner return IEEESingleVal; 9463682f9c64ba48854d26870486cc33b3291f71b3Duncan Sands if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEdouble) 95e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner return IEEEDoubleVal; 9663682f9c64ba48854d26870486cc33b3291f71b3Duncan Sands if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::x87DoubleExtended) 97e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner return X87DoubleExtendedVal; 9863682f9c64ba48854d26870486cc33b3291f71b3Duncan Sands if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble) 992665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman return PPCDoubleDoubleVal; 10063682f9c64ba48854d26870486cc33b3291f71b3Duncan Sands assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad); 1012665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman return IEEEQuadVal; 102e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner} 103e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 1045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, 105e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner const llvm::fltSemantics *Sem) { 106e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner const char *DenormMin, *Epsilon, *Max, *Min; 1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DenormMin = PickFP(Sem, "1.40129846e-45F", "4.9406564584124654e-324", 108e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner "3.64519953188247460253e-4951L", 1092665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman "4.94065645841246544176568792868221e-324L", 1102665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman "6.47517511943802511092443895822764655e-4966L"); 1112665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman int Digits = PickFP(Sem, 6, 15, 18, 31, 33); 112e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner Epsilon = PickFP(Sem, "1.19209290e-7F", "2.2204460492503131e-16", 113e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner "1.08420217248550443401e-19L", 1142665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman "4.94065645841246544176568792868221e-324L", 1152665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman "1.92592994438723585305597794258492732e-34L"); 1162665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman int MantissaDigits = PickFP(Sem, 24, 53, 64, 106, 113); 1172665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman int Min10Exp = PickFP(Sem, -37, -307, -4931, -291, -4931); 1182665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman int Max10Exp = PickFP(Sem, 38, 308, 4932, 308, 4932); 1192665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman int MinExp = PickFP(Sem, -125, -1021, -16381, -968, -16381); 1202665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman int MaxExp = PickFP(Sem, 128, 1024, 16384, 1024, 16384); 121e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner Min = PickFP(Sem, "1.17549435e-38F", "2.2250738585072014e-308", 122e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner "3.36210314311209350626e-4932L", 1232665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman "2.00416836000897277799610805135016e-292L", 1242665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman "3.36210314311209350626267781732175260e-4932L"); 125e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner Max = PickFP(Sem, "3.40282347e+38F", "1.7976931348623157e+308", 126e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner "1.18973149535723176502e+4932L", 1272665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman "1.79769313486231580793728971405301e+308L", 1282665a75c16b93a4977225472aa0e7bcf32ddcec6Eli Friedman "1.18973149535723176508575932662800702e+4932L"); 1291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 130f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<32> DefPrefix; 131066515feea9af5319c138ff4db99081c7686c5b1Daniel Dunbar DefPrefix = "__"; 132066515feea9af5319c138ff4db99081c7686c5b1Daniel Dunbar DefPrefix += Prefix; 133066515feea9af5319c138ff4db99081c7686c5b1Daniel Dunbar DefPrefix += "_"; 134a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer 135b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro(DefPrefix + "DENORM_MIN__", DenormMin); 136b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro(DefPrefix + "HAS_DENORM__"); 1375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Builder.defineMacro(DefPrefix + "DIG__", Twine(Digits)); 1385f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Builder.defineMacro(DefPrefix + "EPSILON__", Twine(Epsilon)); 139b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro(DefPrefix + "HAS_INFINITY__"); 140b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro(DefPrefix + "HAS_QUIET_NAN__"); 1415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Builder.defineMacro(DefPrefix + "MANT_DIG__", Twine(MantissaDigits)); 142b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer 1435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Builder.defineMacro(DefPrefix + "MAX_10_EXP__", Twine(Max10Exp)); 1445f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Builder.defineMacro(DefPrefix + "MAX_EXP__", Twine(MaxExp)); 1455f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Builder.defineMacro(DefPrefix + "MAX__", Twine(Max)); 146b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer 1475f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Builder.defineMacro(DefPrefix + "MIN_10_EXP__","("+Twine(Min10Exp)+")"); 1485f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Builder.defineMacro(DefPrefix + "MIN_EXP__", "("+Twine(MinExp)+")"); 1495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Builder.defineMacro(DefPrefix + "MIN__", Twine(Min)); 150e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner} 151e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 152e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 153e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner/// DefineTypeSize - Emit a macro to the predefines buffer that declares a macro 154e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner/// named MacroName with the max value for a type with width 'TypeWidth' a 155e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner/// signedness of 'isSigned' and with a value suffix of 'ValSuffix' (e.g. LL). 1565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void DefineTypeSize(StringRef MacroName, unsigned TypeWidth, 1575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef ValSuffix, bool isSigned, 158d7f758cb88ce56c5f49faae088ab5a4073c28fa6Chris Lattner MacroBuilder &Builder) { 159d7f758cb88ce56c5f49faae088ab5a4073c28fa6Chris Lattner llvm::APInt MaxVal = isSigned ? llvm::APInt::getSignedMaxValue(TypeWidth) 160d7f758cb88ce56c5f49faae088ab5a4073c28fa6Chris Lattner : llvm::APInt::getMaxValue(TypeWidth); 161d7f758cb88ce56c5f49faae088ab5a4073c28fa6Chris Lattner Builder.defineMacro(MacroName, MaxVal.toString(10, isSigned) + ValSuffix); 162e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner} 163e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 1649099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner/// DefineTypeSize - An overloaded helper that uses TargetInfo to determine 1659099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner/// the width, suffix, and signedness of the given type 1665f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void DefineTypeSize(StringRef MacroName, TargetInfo::IntType Ty, 167a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer const TargetInfo &TI, MacroBuilder &Builder) { 1689099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner DefineTypeSize(MacroName, TI.getTypeWidth(Ty), TI.getTypeConstantSuffix(Ty), 169a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer TI.isTypeSigned(Ty), Builder); 1709099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner} 1719099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner 1725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void DefineType(const Twine &MacroName, TargetInfo::IntType Ty, 173a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer MacroBuilder &Builder) { 174b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro(MacroName, TargetInfo::getTypeName(Ty)); 175e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner} 176e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 1775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void DefineTypeWidth(StringRef MacroName, TargetInfo::IntType Ty, 178a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer const TargetInfo &TI, MacroBuilder &Builder) { 1795f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Builder.defineMacro(MacroName, Twine(TI.getTypeWidth(Ty))); 180186696bee3b3544d942bb43041595e210de577c6Ken Dyck} 181186696bee3b3544d942bb43041595e210de577c6Ken Dyck 1825f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void DefineTypeSizeof(StringRef MacroName, unsigned BitWidth, 183cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman const TargetInfo &TI, MacroBuilder &Builder) { 184cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman Builder.defineMacro(MacroName, 1855f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Twine(BitWidth / TI.getCharWidth())); 186cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman} 187cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman 188dcdd2a064a6d3ea7712169629328ef80d6cb28ecChris Lattnerstatic void DefineExactWidthIntType(TargetInfo::IntType Ty, 189a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer const TargetInfo &TI, MacroBuilder &Builder) { 190eef22efce8dd9d0ba9adb8f4746b96b584f2521dKen Dyck int TypeWidth = TI.getTypeWidth(Ty); 1917f3a545ba6ccfbe8b7f5268e4cfbee52ec2c4d4cDaniel Dunbar 1927f3a545ba6ccfbe8b7f5268e4cfbee52ec2c4d4cDaniel Dunbar // Use the target specified int64 type, when appropriate, so that [u]int64_t 1937f3a545ba6ccfbe8b7f5268e4cfbee52ec2c4d4cDaniel Dunbar // ends up being defined in terms of the correct type. 1947f3a545ba6ccfbe8b7f5268e4cfbee52ec2c4d4cDaniel Dunbar if (TypeWidth == 64) 1957f3a545ba6ccfbe8b7f5268e4cfbee52ec2c4d4cDaniel Dunbar Ty = TI.getInt64Type(); 1967f3a545ba6ccfbe8b7f5268e4cfbee52ec2c4d4cDaniel Dunbar 1975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner DefineType("__INT" + Twine(TypeWidth) + "_TYPE__", Ty, Builder); 198eef22efce8dd9d0ba9adb8f4746b96b584f2521dKen Dyck 1995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef ConstSuffix(TargetInfo::getTypeConstantSuffix(Ty)); 200a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer if (!ConstSuffix.empty()) 2015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Builder.defineMacro("__INT" + Twine(TypeWidth) + "_C_SUFFIX__", 202a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer ConstSuffix); 203dcdd2a064a6d3ea7712169629328ef80d6cb28ecChris Lattner} 204e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 2052c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith/// Get the value the ATOMIC_*_LOCK_FREE macro should have for a type with 2062c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith/// the specified properties. 2072c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smithstatic const char *getLockFreeValue(unsigned TypeWidth, unsigned TypeAlign, 2082c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith unsigned InlineWidth) { 2092c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith // Fully-aligned, power-of-2 sizes no larger than the inline 2102c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith // width will be inlined as lock-free operations. 2112c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith if (TypeWidth == TypeAlign && (TypeWidth & (TypeWidth - 1)) == 0 && 2122c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith TypeWidth <= InlineWidth) 2132c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith return "2"; // "always lock free" 2142c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith // We cannot be certain what operations the lib calls might be 2152c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith // able to implement as lock-free on future processors. 2162c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith return "1"; // "sometimes lock free" 2172c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith} 2182c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith 219f85e193739c953358c865005855253af4f68a497John McCall/// \brief Add definitions required for a smooth interaction between 220f85e193739c953358c865005855253af4f68a497John McCall/// Objective-C++ automated reference counting and libstdc++ (4.2). 221f85e193739c953358c865005855253af4f68a497John McCallstatic void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts, 222f85e193739c953358c865005855253af4f68a497John McCall MacroBuilder &Builder) { 223f85e193739c953358c865005855253af4f68a497John McCall Builder.defineMacro("_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR"); 224f85e193739c953358c865005855253af4f68a497John McCall 225f85e193739c953358c865005855253af4f68a497John McCall std::string Result; 226f85e193739c953358c865005855253af4f68a497John McCall { 227f85e193739c953358c865005855253af4f68a497John McCall // Provide specializations for the __is_scalar type trait so that 228f85e193739c953358c865005855253af4f68a497John McCall // lifetime-qualified objects are not considered "scalar" types, which 229f85e193739c953358c865005855253af4f68a497John McCall // libstdc++ uses as an indicator of the presence of trivial copy, assign, 230f85e193739c953358c865005855253af4f68a497John McCall // default-construct, and destruct semantics (none of which hold for 231f85e193739c953358c865005855253af4f68a497John McCall // lifetime-qualified objects in ARC). 232f85e193739c953358c865005855253af4f68a497John McCall llvm::raw_string_ostream Out(Result); 233f85e193739c953358c865005855253af4f68a497John McCall 234f85e193739c953358c865005855253af4f68a497John McCall Out << "namespace std {\n" 235f85e193739c953358c865005855253af4f68a497John McCall << "\n" 236f85e193739c953358c865005855253af4f68a497John McCall << "struct __true_type;\n" 237f85e193739c953358c865005855253af4f68a497John McCall << "struct __false_type;\n" 238f85e193739c953358c865005855253af4f68a497John McCall << "\n"; 239f85e193739c953358c865005855253af4f68a497John McCall 240f85e193739c953358c865005855253af4f68a497John McCall Out << "template<typename _Tp> struct __is_scalar;\n" 241f85e193739c953358c865005855253af4f68a497John McCall << "\n"; 242f85e193739c953358c865005855253af4f68a497John McCall 243f85e193739c953358c865005855253af4f68a497John McCall Out << "template<typename _Tp>\n" 244b8b0313e84700b5c6d597b3be4de41c97b7550f1Argyrios Kyrtzidis << "struct __is_scalar<__attribute__((objc_ownership(strong))) _Tp> {\n" 245f85e193739c953358c865005855253af4f68a497John McCall << " enum { __value = 0 };\n" 246f85e193739c953358c865005855253af4f68a497John McCall << " typedef __false_type __type;\n" 247f85e193739c953358c865005855253af4f68a497John McCall << "};\n" 248f85e193739c953358c865005855253af4f68a497John McCall << "\n"; 249f85e193739c953358c865005855253af4f68a497John McCall 2500a7dd788dbef975f35f273c7ab913f480f7edd60John McCall if (LangOpts.ObjCARCWeak) { 251f85e193739c953358c865005855253af4f68a497John McCall Out << "template<typename _Tp>\n" 252b8b0313e84700b5c6d597b3be4de41c97b7550f1Argyrios Kyrtzidis << "struct __is_scalar<__attribute__((objc_ownership(weak))) _Tp> {\n" 253f85e193739c953358c865005855253af4f68a497John McCall << " enum { __value = 0 };\n" 254f85e193739c953358c865005855253af4f68a497John McCall << " typedef __false_type __type;\n" 255f85e193739c953358c865005855253af4f68a497John McCall << "};\n" 256f85e193739c953358c865005855253af4f68a497John McCall << "\n"; 257f85e193739c953358c865005855253af4f68a497John McCall } 258f85e193739c953358c865005855253af4f68a497John McCall 259f85e193739c953358c865005855253af4f68a497John McCall Out << "template<typename _Tp>\n" 260b8b0313e84700b5c6d597b3be4de41c97b7550f1Argyrios Kyrtzidis << "struct __is_scalar<__attribute__((objc_ownership(autoreleasing)))" 261f85e193739c953358c865005855253af4f68a497John McCall << " _Tp> {\n" 262f85e193739c953358c865005855253af4f68a497John McCall << " enum { __value = 0 };\n" 263f85e193739c953358c865005855253af4f68a497John McCall << " typedef __false_type __type;\n" 264f85e193739c953358c865005855253af4f68a497John McCall << "};\n" 265f85e193739c953358c865005855253af4f68a497John McCall << "\n"; 266f85e193739c953358c865005855253af4f68a497John McCall 267f85e193739c953358c865005855253af4f68a497John McCall Out << "}\n"; 268f85e193739c953358c865005855253af4f68a497John McCall } 269f85e193739c953358c865005855253af4f68a497John McCall Builder.append(Result); 270f85e193739c953358c865005855253af4f68a497John McCall} 271f85e193739c953358c865005855253af4f68a497John McCall 272a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewyckystatic void InitializeStandardPredefinedMacros(const TargetInfo &TI, 273a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky const LangOptions &LangOpts, 274a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky const FrontendOptions &FEOpts, 275a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky MacroBuilder &Builder) { 27685037d987a68b8bc9db22e4e1c18cac80b74ea1cEli Friedman if (!LangOpts.MicrosoftMode && !LangOpts.TraditionalCPP) 277a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky Builder.defineMacro("__STDC__"); 278a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky if (LangOpts.Freestanding) 279a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky Builder.defineMacro("__STDC_HOSTED__", "0"); 280a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky else 281a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky Builder.defineMacro("__STDC_HOSTED__"); 282a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky 283a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky if (!LangOpts.CPlusPlus) { 284ffbe9b9c64ab2e94b9d48ec56e511f75826fc80aBenjamin Kramer if (LangOpts.C11) 285430cf51d4a4744fdcc9286098c659f9c82e3bd9aBenjamin Kramer Builder.defineMacro("__STDC_VERSION__", "201112L"); 2865aa6dea4efe19f4c2e6600364123fb8899ec4af7Douglas Gregor else if (LangOpts.C99) 287a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky Builder.defineMacro("__STDC_VERSION__", "199901L"); 288a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky else if (!LangOpts.GNUMode && LangOpts.Digraphs) 289a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky Builder.defineMacro("__STDC_VERSION__", "199409L"); 290a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky } else { 2910513448ae71478fd08d7e925bab46db1ddac3dfaRichard Smith // C++11 [cpp.predefined]p1: 2920513448ae71478fd08d7e925bab46db1ddac3dfaRichard Smith // The name __cplusplus is defined to the value 201103L when compiling a 2930513448ae71478fd08d7e925bab46db1ddac3dfaRichard Smith // C++ translation unit. 2940513448ae71478fd08d7e925bab46db1ddac3dfaRichard Smith if (LangOpts.CPlusPlus0x) 2950513448ae71478fd08d7e925bab46db1ddac3dfaRichard Smith Builder.defineMacro("__cplusplus", "201103L"); 2960513448ae71478fd08d7e925bab46db1ddac3dfaRichard Smith // C++03 [cpp.predefined]p1: 2970513448ae71478fd08d7e925bab46db1ddac3dfaRichard Smith // The name __cplusplus is defined to the value 199711L when compiling a 2980513448ae71478fd08d7e925bab46db1ddac3dfaRichard Smith // C++ translation unit. 2990513448ae71478fd08d7e925bab46db1ddac3dfaRichard Smith else 3000513448ae71478fd08d7e925bab46db1ddac3dfaRichard Smith Builder.defineMacro("__cplusplus", "199711L"); 301a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky } 302a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky 303146480922cfd80b1ca4b022bf242481b3899c62bNick Lewycky if (LangOpts.ObjC1) 304146480922cfd80b1ca4b022bf242481b3899c62bNick Lewycky Builder.defineMacro("__OBJC__"); 305146480922cfd80b1ca4b022bf242481b3899c62bNick Lewycky 306a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky // Not "standard" per se, but available even with the -undef flag. 307a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky if (LangOpts.AsmPreprocessor) 308a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky Builder.defineMacro("__ASSEMBLER__"); 309a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky} 310a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky 311e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattnerstatic void InitializePredefinedMacros(const TargetInfo &TI, 312e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner const LangOptions &LangOpts, 3137d957472ef9a09048c03d8a11028536f908c18b9Fariborz Jahanian const FrontendOptions &FEOpts, 314a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer MacroBuilder &Builder) { 315e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // Compiler version introspection macros. 316b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__llvm__"); // LLVM Backend 317b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__clang__"); // Clang Frontend 3184290fbd89e851c1f1240a007461f4afd940cbb47Douglas Gregor#define TOSTR2(X) #X 3194290fbd89e851c1f1240a007461f4afd940cbb47Douglas Gregor#define TOSTR(X) TOSTR2(X) 3204290fbd89e851c1f1240a007461f4afd940cbb47Douglas Gregor Builder.defineMacro("__clang_major__", TOSTR(CLANG_VERSION_MAJOR)); 3214290fbd89e851c1f1240a007461f4afd940cbb47Douglas Gregor Builder.defineMacro("__clang_minor__", TOSTR(CLANG_VERSION_MINOR)); 3224290fbd89e851c1f1240a007461f4afd940cbb47Douglas Gregor#ifdef CLANG_VERSION_PATCHLEVEL 3234290fbd89e851c1f1240a007461f4afd940cbb47Douglas Gregor Builder.defineMacro("__clang_patchlevel__", TOSTR(CLANG_VERSION_PATCHLEVEL)); 3244290fbd89e851c1f1240a007461f4afd940cbb47Douglas Gregor#else 3254290fbd89e851c1f1240a007461f4afd940cbb47Douglas Gregor Builder.defineMacro("__clang_patchlevel__", "0"); 3264290fbd89e851c1f1240a007461f4afd940cbb47Douglas Gregor#endif 3274290fbd89e851c1f1240a007461f4afd940cbb47Douglas Gregor Builder.defineMacro("__clang_version__", 3284290fbd89e851c1f1240a007461f4afd940cbb47Douglas Gregor "\"" CLANG_VERSION_STRING " (" 3294290fbd89e851c1f1240a007461f4afd940cbb47Douglas Gregor + getClangFullRepositoryVersion() + ")\""); 3304290fbd89e851c1f1240a007461f4afd940cbb47Douglas Gregor#undef TOSTR 3314290fbd89e851c1f1240a007461f4afd940cbb47Douglas Gregor#undef TOSTR2 3325b31d55ab3a72c026a0781b6dcf9bc1dd462e8b9Aaron Ballman if (!LangOpts.MicrosoftMode) { 3335b31d55ab3a72c026a0781b6dcf9bc1dd462e8b9Aaron Ballman // Currently claim to be compatible with GCC 4.2.1-5621, but only if we're 3345b31d55ab3a72c026a0781b6dcf9bc1dd462e8b9Aaron Ballman // not compiling for MSVC compatibility 3355b31d55ab3a72c026a0781b6dcf9bc1dd462e8b9Aaron Ballman Builder.defineMacro("__GNUC_MINOR__", "2"); 3365b31d55ab3a72c026a0781b6dcf9bc1dd462e8b9Aaron Ballman Builder.defineMacro("__GNUC_PATCHLEVEL__", "1"); 3375b31d55ab3a72c026a0781b6dcf9bc1dd462e8b9Aaron Ballman Builder.defineMacro("__GNUC__", "4"); 3385b31d55ab3a72c026a0781b6dcf9bc1dd462e8b9Aaron Ballman Builder.defineMacro("__GXX_ABI_VERSION", "1002"); 3395b31d55ab3a72c026a0781b6dcf9bc1dd462e8b9Aaron Ballman } 340ad1a4c6e89594e704775ddb6b036ac982fd68cadDaniel Dunbar 3417a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall // Define macros for the C11 / C++11 memory orderings 3427a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall Builder.defineMacro("__ATOMIC_RELAXED", "0"); 3437a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall Builder.defineMacro("__ATOMIC_CONSUME", "1"); 3447a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall Builder.defineMacro("__ATOMIC_ACQUIRE", "2"); 3457a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall Builder.defineMacro("__ATOMIC_RELEASE", "3"); 3467a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall Builder.defineMacro("__ATOMIC_ACQ_REL", "4"); 3477a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall Builder.defineMacro("__ATOMIC_SEQ_CST", "5"); 3487a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall 3495f3c163b7b19a0c7e02509a0984ee1256bca890dDavid Chisnall // Support for #pragma redefine_extname (Sun compatibility) 3505f3c163b7b19a0c7e02509a0984ee1256bca890dDavid Chisnall Builder.defineMacro("__PRAGMA_REDEFINE_EXTNAME", "1"); 3515f3c163b7b19a0c7e02509a0984ee1256bca890dDavid Chisnall 352ad1a4c6e89594e704775ddb6b036ac982fd68cadDaniel Dunbar // As sad as it is, enough software depends on the __VERSION__ for version 353ad1a4c6e89594e704775ddb6b036ac982fd68cadDaniel Dunbar // checks that it is necessary to report 4.2.1 (the base GCC version we claim 354ad1a4c6e89594e704775ddb6b036ac982fd68cadDaniel Dunbar // compatibility with) first. 355ad1a4c6e89594e704775ddb6b036ac982fd68cadDaniel Dunbar Builder.defineMacro("__VERSION__", "\"4.2.1 Compatible " + 3565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Twine(getClangFullCPPVersion()) + "\""); 3571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 358e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // Initialize language-specific preprocessor defines. 3591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 360e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // Standard conforming mode? 361e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner if (!LangOpts.GNUMode) 362b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__STRICT_ANSI__"); 3631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 364e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner if (LangOpts.CPlusPlus0x) 365b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__GXX_EXPERIMENTAL_CXX0X__"); 366e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 367e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner if (LangOpts.ObjC1) { 368260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (LangOpts.ObjCRuntime.isNonFragile()) { 369b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__OBJC2__"); 370eced60c185c92a34953090b98d8458fb2df9dc81Douglas Gregor 371eced60c185c92a34953090b98d8458fb2df9dc81Douglas Gregor if (LangOpts.ObjCExceptions) 372eced60c185c92a34953090b98d8458fb2df9dc81Douglas Gregor Builder.defineMacro("OBJC_ZEROCOST_EXCEPTIONS"); 373e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner } 374e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 375e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor if (LangOpts.getGC() != LangOptions::NonGC) 376b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__OBJC_GC__"); 3771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 378260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (LangOpts.ObjCRuntime.isNeXTFamily()) 379b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__NEXT_RUNTIME__"); 3803065cf9ecc883715edbd3bf875acb2cab531138eTed Kremenek 3813065cf9ecc883715edbd3bf875acb2cab531138eTed Kremenek Builder.defineMacro("IBOutlet", "__attribute__((iboutlet))"); 3823065cf9ecc883715edbd3bf875acb2cab531138eTed Kremenek Builder.defineMacro("IBOutletCollection(ClassName)", 3833065cf9ecc883715edbd3bf875acb2cab531138eTed Kremenek "__attribute__((iboutletcollection(ClassName)))"); 3843065cf9ecc883715edbd3bf875acb2cab531138eTed Kremenek Builder.defineMacro("IBAction", "void)__attribute__((ibaction)"); 385e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner } 3861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 387e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // darwin_constant_cfstrings controls this. This is also dependent 388e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // on other things like the runtime I believe. This is set even for C code. 38916c3eaeea209487ce688215736f0660fc530c17dFariborz Jahanian if (!LangOpts.NoConstantCFStrings) 39016c3eaeea209487ce688215736f0660fc530c17dFariborz Jahanian Builder.defineMacro("__CONSTANT_CFSTRINGS__"); 3911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 392e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner if (LangOpts.ObjC2) 393b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("OBJC_NEW_PROPERTIES"); 394e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 395e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner if (LangOpts.PascalStrings) 396b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__PASCAL_STRINGS__"); 397e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 398e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner if (LangOpts.Blocks) { 399b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__block", "__attribute__((__blocks__(byref)))"); 400b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__BLOCKS__"); 401e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner } 4021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 403eced60c185c92a34953090b98d8458fb2df9dc81Douglas Gregor if (LangOpts.CXXExceptions) 404b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__EXCEPTIONS"); 405cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman if (LangOpts.RTTI) 406cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman Builder.defineMacro("__GXX_RTTI"); 407b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar if (LangOpts.SjLjExceptions) 408b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar Builder.defineMacro("__USING_SJLJ_EXCEPTIONS__"); 409f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola 410f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth if (LangOpts.Deprecated) 411f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth Builder.defineMacro("__DEPRECATED"); 412f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth 413e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner if (LangOpts.CPlusPlus) { 414b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__GNUG__", "4"); 415b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__GXX_WEAK__"); 416b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__private_extern__", "extern"); 417e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner } 4181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41962ec1f2fd7368542bb926c04797fb07023547694Francois Pichet if (LangOpts.MicrosoftExt) { 420fdd6aaf16279c6141da929c1207c15be9b2551eeSteve Naroff // Both __PRETTY_FUNCTION__ and __FUNCTION__ are GCC extensions, however 421fdd6aaf16279c6141da929c1207c15be9b2551eeSteve Naroff // VC++ appears to only like __FUNCTION__. 422b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__PRETTY_FUNCTION__", "__FUNCTION__"); 4235b86ffd219bdee7720217d5755b772726668b242Abramo Bagnara // Work around some issues with Visual C++ headers. 4245b86ffd219bdee7720217d5755b772726668b242Abramo Bagnara if (LangOpts.WChar) { 4255b86ffd219bdee7720217d5755b772726668b242Abramo Bagnara // wchar_t supported as a keyword. 426b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("_WCHAR_T_DEFINED"); 427b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("_NATIVE_WCHAR_T_DEFINED"); 4285b86ffd219bdee7720217d5755b772726668b242Abramo Bagnara } 4295b86ffd219bdee7720217d5755b772726668b242Abramo Bagnara if (LangOpts.CPlusPlus) { 4304b7e048970ddd0d75d428ddbb0ce48a71578fed2Francois Pichet // FIXME: Support Microsoft's __identifier extension in the lexer. 431a23ae3f45789f40cdfd939117284f977d2dc17a6Francois Pichet Builder.append("#define __identifier(x) x"); 4325c0ca52e40e0b9e3c2da7abba47b18e468c84060Douglas Gregor Builder.append("class type_info;"); 43324ee804962ecef23eb040083eb668f9fa202e4c0John Thompson } 434e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner } 4351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 436e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner if (LangOpts.Optimize) 437b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__OPTIMIZE__"); 438e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner if (LangOpts.OptimizeSize) 439b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__OPTIMIZE_SIZE__"); 4401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 441ba9186c6fca2b8dd7885c909e7b1fd76c537c4edChandler Carruth if (LangOpts.FastMath) 442ba9186c6fca2b8dd7885c909e7b1fd76c537c4edChandler Carruth Builder.defineMacro("__FAST_MATH__"); 443ba9186c6fca2b8dd7885c909e7b1fd76c537c4edChandler Carruth 444e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // Initialize target-specific preprocessor defines. 4451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4465aeda88995fd98d55f3c565a108196e2b0df16edDylan Noblesmith // __BYTE_ORDER__ was added in GCC 4.6. It's analogous 4475aeda88995fd98d55f3c565a108196e2b0df16edDylan Noblesmith // to the macro __BYTE_ORDER (no trailing underscores) 4485aeda88995fd98d55f3c565a108196e2b0df16edDylan Noblesmith // from glibc's <endian.h> header. 4493b198a97d2aceb1620483586c8c3cabf9e5e8078Dylan Noblesmith // We don't support the PDP-11 as a target, but include 4503b198a97d2aceb1620483586c8c3cabf9e5e8078Dylan Noblesmith // the define so it can still be compared against. 4513b198a97d2aceb1620483586c8c3cabf9e5e8078Dylan Noblesmith Builder.defineMacro("__ORDER_LITTLE_ENDIAN__", "1234"); 4523b198a97d2aceb1620483586c8c3cabf9e5e8078Dylan Noblesmith Builder.defineMacro("__ORDER_BIG_ENDIAN__", "4321"); 4533b198a97d2aceb1620483586c8c3cabf9e5e8078Dylan Noblesmith Builder.defineMacro("__ORDER_PDP_ENDIAN__", "3412"); 4543b198a97d2aceb1620483586c8c3cabf9e5e8078Dylan Noblesmith if (TI.isBigEndian()) 4553b198a97d2aceb1620483586c8c3cabf9e5e8078Dylan Noblesmith Builder.defineMacro("__BYTE_ORDER__", "__ORDER_BIG_ENDIAN__"); 4563b198a97d2aceb1620483586c8c3cabf9e5e8078Dylan Noblesmith else 4573b198a97d2aceb1620483586c8c3cabf9e5e8078Dylan Noblesmith Builder.defineMacro("__BYTE_ORDER__", "__ORDER_LITTLE_ENDIAN__"); 4583b198a97d2aceb1620483586c8c3cabf9e5e8078Dylan Noblesmith 4596bd3291605a3034b858c8aeecc6990fa4f979f6cDylan Noblesmith 4606bd3291605a3034b858c8aeecc6990fa4f979f6cDylan Noblesmith if (TI.getPointerWidth(0) == 64 && TI.getLongWidth() == 64 4616bd3291605a3034b858c8aeecc6990fa4f979f6cDylan Noblesmith && TI.getIntWidth() == 32) { 4626bd3291605a3034b858c8aeecc6990fa4f979f6cDylan Noblesmith Builder.defineMacro("_LP64"); 4636bd3291605a3034b858c8aeecc6990fa4f979f6cDylan Noblesmith Builder.defineMacro("__LP64__"); 4646bd3291605a3034b858c8aeecc6990fa4f979f6cDylan Noblesmith } 4656bd3291605a3034b858c8aeecc6990fa4f979f6cDylan Noblesmith 466e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // Define type sizing macros based on the target properties. 467e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner assert(TI.getCharWidth() == 8 && "Only support 8-bit char so far"); 468b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__CHAR_BIT__", "8"); 469a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer 470a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineTypeSize("__SCHAR_MAX__", TI.getCharWidth(), "", true, Builder); 471a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineTypeSize("__SHRT_MAX__", TargetInfo::SignedShort, TI, Builder); 472a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineTypeSize("__INT_MAX__", TargetInfo::SignedInt, TI, Builder); 473a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineTypeSize("__LONG_MAX__", TargetInfo::SignedLong, TI, Builder); 474a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineTypeSize("__LONG_LONG_MAX__", TargetInfo::SignedLongLong, TI, Builder); 475a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineTypeSize("__WCHAR_MAX__", TI.getWCharType(), TI, Builder); 476a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineTypeSize("__INTMAX_MAX__", TI.getIntMaxType(), TI, Builder); 477a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer 478cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman DefineTypeSizeof("__SIZEOF_DOUBLE__", TI.getDoubleWidth(), TI, Builder); 479cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman DefineTypeSizeof("__SIZEOF_FLOAT__", TI.getFloatWidth(), TI, Builder); 480cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman DefineTypeSizeof("__SIZEOF_INT__", TI.getIntWidth(), TI, Builder); 481cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman DefineTypeSizeof("__SIZEOF_LONG__", TI.getLongWidth(), TI, Builder); 482cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman DefineTypeSizeof("__SIZEOF_LONG_DOUBLE__",TI.getLongDoubleWidth(),TI,Builder); 483cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman DefineTypeSizeof("__SIZEOF_LONG_LONG__", TI.getLongLongWidth(), TI, Builder); 484cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman DefineTypeSizeof("__SIZEOF_POINTER__", TI.getPointerWidth(0), TI, Builder); 485cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman DefineTypeSizeof("__SIZEOF_SHORT__", TI.getShortWidth(), TI, Builder); 486cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman DefineTypeSizeof("__SIZEOF_PTRDIFF_T__", 487cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman TI.getTypeWidth(TI.getPtrDiffType(0)), TI, Builder); 488cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman DefineTypeSizeof("__SIZEOF_SIZE_T__", 489cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman TI.getTypeWidth(TI.getSizeType()), TI, Builder); 490cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman DefineTypeSizeof("__SIZEOF_WCHAR_T__", 491cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman TI.getTypeWidth(TI.getWCharType()), TI, Builder); 492cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman DefineTypeSizeof("__SIZEOF_WINT_T__", 493cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman TI.getTypeWidth(TI.getWIntType()), TI, Builder); 494cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman 495a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineType("__INTMAX_TYPE__", TI.getIntMaxType(), Builder); 496a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineType("__UINTMAX_TYPE__", TI.getUIntMaxType(), Builder); 497a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineTypeWidth("__INTMAX_WIDTH__", TI.getIntMaxType(), TI, Builder); 498a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineType("__PTRDIFF_TYPE__", TI.getPtrDiffType(0), Builder); 499a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineTypeWidth("__PTRDIFF_WIDTH__", TI.getPtrDiffType(0), TI, Builder); 500a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineType("__INTPTR_TYPE__", TI.getIntPtrType(), Builder); 501a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineTypeWidth("__INTPTR_WIDTH__", TI.getIntPtrType(), TI, Builder); 502a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineType("__SIZE_TYPE__", TI.getSizeType(), Builder); 503a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineTypeWidth("__SIZE_WIDTH__", TI.getSizeType(), TI, Builder); 504a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineType("__WCHAR_TYPE__", TI.getWCharType(), Builder); 505a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineTypeWidth("__WCHAR_WIDTH__", TI.getWCharType(), TI, Builder); 506a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineType("__WINT_TYPE__", TI.getWIntType(), Builder); 507a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineTypeWidth("__WINT_WIDTH__", TI.getWIntType(), TI, Builder); 508a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineTypeWidth("__SIG_ATOMIC_WIDTH__", TI.getSigAtomicType(), TI, Builder); 509cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman DefineType("__CHAR16_TYPE__", TI.getChar16Type(), Builder); 510cfeac3441afb44c9af86eef0c911a5d90d561192Dan Gohman DefineType("__CHAR32_TYPE__", TI.getChar32Type(), Builder); 511a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer 512a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineFloatMacros(Builder, "FLT", &TI.getFloatFormat()); 513a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineFloatMacros(Builder, "DBL", &TI.getDoubleFormat()); 514a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineFloatMacros(Builder, "LDBL", &TI.getLongDoubleFormat()); 515e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 516e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // Define a __POINTER_WIDTH__ macro for stdint.h. 517b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__POINTER_WIDTH__", 5185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Twine((int)TI.getPointerWidth(0))); 5191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 52015b91764d08e886391c865c4a444d7b51141c284Eli Friedman if (!LangOpts.CharIsSigned) 521b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__CHAR_UNSIGNED__"); 522e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 523a30d8600b9b52922a92a90b30993564ba257537aJames Molloy if (!TargetInfo::isTypeSigned(TI.getWCharType())) 524a30d8600b9b52922a92a90b30993564ba257537aJames Molloy Builder.defineMacro("__WCHAR_UNSIGNED__"); 525a30d8600b9b52922a92a90b30993564ba257537aJames Molloy 5261cfeefdb383b106f63d91dd715f54339467d6aa8Eli Friedman if (!TargetInfo::isTypeSigned(TI.getWIntType())) 5271cfeefdb383b106f63d91dd715f54339467d6aa8Eli Friedman Builder.defineMacro("__WINT_UNSIGNED__"); 5281cfeefdb383b106f63d91dd715f54339467d6aa8Eli Friedman 529dcdd2a064a6d3ea7712169629328ef80d6cb28ecChris Lattner // Define exact-width integer types for stdint.h 5305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Builder.defineMacro("__INT" + Twine(TI.getCharWidth()) + "_TYPE__", 531a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer "char"); 5321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 533dcdd2a064a6d3ea7712169629328ef80d6cb28ecChris Lattner if (TI.getShortWidth() > TI.getCharWidth()) 534a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineExactWidthIntType(TargetInfo::SignedShort, TI, Builder); 535a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer 536dcdd2a064a6d3ea7712169629328ef80d6cb28ecChris Lattner if (TI.getIntWidth() > TI.getShortWidth()) 537a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineExactWidthIntType(TargetInfo::SignedInt, TI, Builder); 538a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer 539dcdd2a064a6d3ea7712169629328ef80d6cb28ecChris Lattner if (TI.getLongWidth() > TI.getIntWidth()) 540a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineExactWidthIntType(TargetInfo::SignedLong, TI, Builder); 541a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer 542dcdd2a064a6d3ea7712169629328ef80d6cb28ecChris Lattner if (TI.getLongLongWidth() > TI.getLongWidth()) 543a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineExactWidthIntType(TargetInfo::SignedLongLong, TI, Builder); 544a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer 545a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer if (const char *Prefix = TI.getUserLabelPrefix()) 546b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__USER_LABEL_PREFIX__", Prefix); 5471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 548455e72e7625a8f87c2c302d8d82baee5c111e094Bob Wilson if (LangOpts.FastMath || LangOpts.FiniteMathOnly) 549455e72e7625a8f87c2c302d8d82baee5c111e094Bob Wilson Builder.defineMacro("__FINITE_MATH_ONLY__", "1"); 550455e72e7625a8f87c2c302d8d82baee5c111e094Bob Wilson else 551455e72e7625a8f87c2c302d8d82baee5c111e094Bob Wilson Builder.defineMacro("__FINITE_MATH_ONLY__", "0"); 552e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 553e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner if (LangOpts.GNUInline) 554b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__GNUC_GNU_INLINE__"); 555e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner else 556b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__GNUC_STDC_INLINE__"); 557e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 5582c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith // The value written by __atomic_test_and_set. 5592c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith // FIXME: This is target-dependent. 5602c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith Builder.defineMacro("__GCC_ATOMIC_TEST_AND_SET_TRUEVAL", "1"); 5612c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith 5622c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith // Used by libstdc++ to implement ATOMIC_<foo>_LOCK_FREE. 5632c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith unsigned InlineWidthBits = TI.getMaxAtomicInlineWidth(); 5642c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith#define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \ 5652c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith Builder.defineMacro("__GCC_ATOMIC_" #TYPE "_LOCK_FREE", \ 5662c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith getLockFreeValue(TI.get##Type##Width(), \ 5672c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith TI.get##Type##Align(), \ 5682c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith InlineWidthBits)); 5692c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith DEFINE_LOCK_FREE_MACRO(BOOL, Bool); 5702c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith DEFINE_LOCK_FREE_MACRO(CHAR, Char); 5712c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith DEFINE_LOCK_FREE_MACRO(CHAR16_T, Char16); 5722c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith DEFINE_LOCK_FREE_MACRO(CHAR32_T, Char32); 5732c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith DEFINE_LOCK_FREE_MACRO(WCHAR_T, WChar); 5742c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith DEFINE_LOCK_FREE_MACRO(SHORT, Short); 5752c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith DEFINE_LOCK_FREE_MACRO(INT, Int); 5762c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith DEFINE_LOCK_FREE_MACRO(LONG, Long); 5772c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith DEFINE_LOCK_FREE_MACRO(LLONG, LongLong); 5782c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith Builder.defineMacro("__GCC_ATOMIC_POINTER_LOCK_FREE", 5792c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith getLockFreeValue(TI.getPointerWidth(0), 5802c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith TI.getPointerAlign(0), 5812c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith InlineWidthBits)); 5822c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith#undef DEFINE_LOCK_FREE_MACRO 5832c39d71bb7cefdfe6116fa52454f3b3dc5abd517Richard Smith 5847b14026640d76145c4a9a9ac3b2e647bb49651f8Daniel Dunbar if (LangOpts.NoInlineDefine) 585b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__NO_INLINE__"); 586e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 587e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner if (unsigned PICLevel = LangOpts.PICLevel) { 5885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Builder.defineMacro("__PIC__", Twine(PICLevel)); 5895f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Builder.defineMacro("__pic__", Twine(PICLevel)); 590e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner } 5915e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth if (unsigned PIELevel = LangOpts.PIELevel) { 5925e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth Builder.defineMacro("__PIE__", Twine(PIELevel)); 5935e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth Builder.defineMacro("__pie__", Twine(PIELevel)); 5945e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth } 595e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 596e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // Macros to control C99 numerics and <float.h> 597b406669fea7c8db83a377f368f1689c848296974Benjamin Kramer Builder.defineMacro("__FLT_EVAL_METHOD__", Twine(TI.getFloatEvalMethod())); 598b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__FLT_RADIX__", "2"); 599a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer int Dig = PickFP(&TI.getLongDoubleFormat(), -1/*FIXME*/, 17, 21, 33, 36); 6005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner Builder.defineMacro("__DECIMAL_DIG__", Twine(Dig)); 60145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling 602e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor if (LangOpts.getStackProtector() == LangOptions::SSPOn) 603b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__SSP__"); 604e289d81369914678db386f6aa86faf8f178e245dDouglas Gregor else if (LangOpts.getStackProtector() == LangOptions::SSPReq) 605b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.defineMacro("__SSP_ALL__", "2"); 60645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling 6077d957472ef9a09048c03d8a11028536f908c18b9Fariborz Jahanian if (FEOpts.ProgramAction == frontend::RewriteObjC) 6087d957472ef9a09048c03d8a11028536f908c18b9Fariborz Jahanian Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))"); 609f0af777aff72b58333edcf258e30998e865bdef3Ted Kremenek 610f0af777aff72b58333edcf258e30998e865bdef3Ted Kremenek // Define a macro that exists only when using the static analyzer. 611f0af777aff72b58333edcf258e30998e865bdef3Ted Kremenek if (FEOpts.ProgramAction == frontend::RunAnalysis) 612f0af777aff72b58333edcf258e30998e865bdef3Ted Kremenek Builder.defineMacro("__clang_analyzer__"); 613f0af777aff72b58333edcf258e30998e865bdef3Ted Kremenek 614f0840820b4e28fd0cc04d737382811d7372cb832Peter Collingbourne if (LangOpts.FastRelaxedMath) 615f0840820b4e28fd0cc04d737382811d7372cb832Peter Collingbourne Builder.defineMacro("__FAST_RELAXED_MATH__"); 616f0840820b4e28fd0cc04d737382811d7372cb832Peter Collingbourne 617098df7f1de80527d7a70e410a5830c8b2d742310John McCall if (LangOpts.ObjCAutoRefCount) { 618b8b0313e84700b5c6d597b3be4de41c97b7550f1Argyrios Kyrtzidis Builder.defineMacro("__weak", "__attribute__((objc_ownership(weak)))"); 619b8b0313e84700b5c6d597b3be4de41c97b7550f1Argyrios Kyrtzidis Builder.defineMacro("__strong", "__attribute__((objc_ownership(strong)))"); 620098df7f1de80527d7a70e410a5830c8b2d742310John McCall Builder.defineMacro("__autoreleasing", 621b8b0313e84700b5c6d597b3be4de41c97b7550f1Argyrios Kyrtzidis "__attribute__((objc_ownership(autoreleasing)))"); 622098df7f1de80527d7a70e410a5830c8b2d742310John McCall Builder.defineMacro("__unsafe_unretained", 623b8b0313e84700b5c6d597b3be4de41c97b7550f1Argyrios Kyrtzidis "__attribute__((objc_ownership(none)))"); 624098df7f1de80527d7a70e410a5830c8b2d742310John McCall } 625098df7f1de80527d7a70e410a5830c8b2d742310John McCall 626e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // Get other target #defines. 627a99927774d07af9c6f0e1945531eadc910592945Benjamin Kramer TI.getTargetDefines(LangOpts, Builder); 628e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner} 629e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 6302973c0eff437e57541735c9bb9561358715440e6Douglas Gregor// Initialize the remapping of files to alternative contents, e.g., 6312973c0eff437e57541735c9bb9561358715440e6Douglas Gregor// those specified through other files. 632d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikiestatic void InitializeFileRemapping(DiagnosticsEngine &Diags, 6332973c0eff437e57541735c9bb9561358715440e6Douglas Gregor SourceManager &SourceMgr, 6342973c0eff437e57541735c9bb9561358715440e6Douglas Gregor FileManager &FileMgr, 6352973c0eff437e57541735c9bb9561358715440e6Douglas Gregor const PreprocessorOptions &InitOpts) { 6364db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor // Remap files in the source manager (with buffers). 63744c181aec37789f25f6c15543c164416f72e562aDouglas Gregor for (PreprocessorOptions::const_remapped_file_buffer_iterator 6384db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor Remap = InitOpts.remapped_file_buffer_begin(), 6394db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor RemapEnd = InitOpts.remapped_file_buffer_end(); 6404db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor Remap != RemapEnd; 6414db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor ++Remap) { 6424db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor // Create the file entry for the file that we're mapping from. 6434db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor const FileEntry *FromFile = FileMgr.getVirtualFile(Remap->first, 6444db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor Remap->second->getBufferSize(), 64539b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner 0); 6464db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor if (!FromFile) { 6474db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor Diags.Report(diag::err_fe_remap_missing_from_file) 6484db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor << Remap->first; 649f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor if (!InitOpts.RetainRemappedFileBuffers) 650f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor delete Remap->second; 6514db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor continue; 6524db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor } 6534db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor 6544db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor // Override the contents of the "from" file with the contents of 6554db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor // the "to" file. 656f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor SourceMgr.overrideFileContents(FromFile, Remap->second, 657f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor InitOpts.RetainRemappedFileBuffers); 6584db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor } 6594db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor 6604db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor // Remap files in the source manager (with other files). 66144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor for (PreprocessorOptions::const_remapped_file_iterator 66244c181aec37789f25f6c15543c164416f72e562aDouglas Gregor Remap = InitOpts.remapped_file_begin(), 66344c181aec37789f25f6c15543c164416f72e562aDouglas Gregor RemapEnd = InitOpts.remapped_file_end(); 6642973c0eff437e57541735c9bb9561358715440e6Douglas Gregor Remap != RemapEnd; 6652973c0eff437e57541735c9bb9561358715440e6Douglas Gregor ++Remap) { 6662973c0eff437e57541735c9bb9561358715440e6Douglas Gregor // Find the file that we're mapping to. 66739b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner const FileEntry *ToFile = FileMgr.getFile(Remap->second); 6682973c0eff437e57541735c9bb9561358715440e6Douglas Gregor if (!ToFile) { 6692973c0eff437e57541735c9bb9561358715440e6Douglas Gregor Diags.Report(diag::err_fe_remap_missing_to_file) 6704db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor << Remap->first << Remap->second; 6712973c0eff437e57541735c9bb9561358715440e6Douglas Gregor continue; 6722973c0eff437e57541735c9bb9561358715440e6Douglas Gregor } 6734db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor 674057e567f1b375190779e5341f42861896cdee442Douglas Gregor // Create the file entry for the file that we're mapping from. 675057e567f1b375190779e5341f42861896cdee442Douglas Gregor const FileEntry *FromFile = FileMgr.getVirtualFile(Remap->first, 67639b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner ToFile->getSize(), 0); 6772973c0eff437e57541735c9bb9561358715440e6Douglas Gregor if (!FromFile) { 6782973c0eff437e57541735c9bb9561358715440e6Douglas Gregor Diags.Report(diag::err_fe_remap_missing_from_file) 6794db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor << Remap->first; 6802973c0eff437e57541735c9bb9561358715440e6Douglas Gregor continue; 6812973c0eff437e57541735c9bb9561358715440e6Douglas Gregor } 6824db64a461cb3442934afe43c83ed3f17f7c11c1dDouglas Gregor 6832973c0eff437e57541735c9bb9561358715440e6Douglas Gregor // Override the contents of the "from" file with the contents of 6842973c0eff437e57541735c9bb9561358715440e6Douglas Gregor // the "to" file. 685299a4a967b02c9f0d0d94ad8560e3ced893f9116Argyrios Kyrtzidis SourceMgr.overrideFileContents(FromFile, ToFile); 6862973c0eff437e57541735c9bb9561358715440e6Douglas Gregor } 687299a4a967b02c9f0d0d94ad8560e3ced893f9116Argyrios Kyrtzidis 688299a4a967b02c9f0d0d94ad8560e3ced893f9116Argyrios Kyrtzidis SourceMgr.setOverridenFilesKeepOriginalName( 689299a4a967b02c9f0d0d94ad8560e3ced893f9116Argyrios Kyrtzidis InitOpts.RemappedFilesKeepOriginalName); 6902973c0eff437e57541735c9bb9561358715440e6Douglas Gregor} 6912973c0eff437e57541735c9bb9561358715440e6Douglas Gregor 692e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner/// InitializePreprocessor - Initialize the preprocessor getting it and the 693e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner/// environment ready to process a single file. This returns true on error. 694e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner/// 695938963f076418aa61b570e5317240f66642af2dfDaniel Dunbarvoid clang::InitializePreprocessor(Preprocessor &PP, 696961c76ea8d5089293e448e5d538570653e28080cDaniel Dunbar const PreprocessorOptions &InitOpts, 6977d957472ef9a09048c03d8a11028536f908c18b9Fariborz Jahanian const HeaderSearchOptions &HSOpts, 6987d957472ef9a09048c03d8a11028536f908c18b9Fariborz Jahanian const FrontendOptions &FEOpts) { 6994e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie const LangOptions &LangOpts = PP.getLangOpts(); 700a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer std::string PredefineBuffer; 701a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer PredefineBuffer.reserve(4080); 702a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer llvm::raw_string_ostream Predefines(PredefineBuffer); 703a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer MacroBuilder Builder(Predefines); 7041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7052973c0eff437e57541735c9bb9561358715440e6Douglas Gregor InitializeFileRemapping(PP.getDiagnostics(), PP.getSourceManager(), 70639b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner PP.getFileManager(), InitOpts); 7072973c0eff437e57541735c9bb9561358715440e6Douglas Gregor 708fcaa9e787037b22a6833d4562fed3105c5b55f71Chris Lattner // Emit line markers for various builtin sections of the file. We don't do 709fcaa9e787037b22a6833d4562fed3105c5b55f71Chris Lattner // this in asm preprocessor mode, because "# 4" is not a line marker directive 710fcaa9e787037b22a6833d4562fed3105c5b55f71Chris Lattner // in this mode. 7114e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!PP.getLangOpts().AsmPreprocessor) 712fcaa9e787037b22a6833d4562fed3105c5b55f71Chris Lattner Builder.append("# 1 \"<built-in>\" 3"); 7131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 714e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // Install things like __POWERPC__, __GNUC__, etc into the macro table. 715f85e193739c953358c865005855253af4f68a497John McCall if (InitOpts.UsePredefines) { 716f85e193739c953358c865005855253af4f68a497John McCall InitializePredefinedMacros(PP.getTargetInfo(), LangOpts, FEOpts, Builder); 717f85e193739c953358c865005855253af4f68a497John McCall 718f85e193739c953358c865005855253af4f68a497John McCall // Install definitions to make Objective-C++ ARC work well with various 719f85e193739c953358c865005855253af4f68a497John McCall // C++ Standard Library implementations. 720f85e193739c953358c865005855253af4f68a497John McCall if (LangOpts.ObjC1 && LangOpts.CPlusPlus && LangOpts.ObjCAutoRefCount) { 721f85e193739c953358c865005855253af4f68a497John McCall switch (InitOpts.ObjCXXARCStandardLibrary) { 722f85e193739c953358c865005855253af4f68a497John McCall case ARCXX_nolib: 723ed73b1046d1f30d64b47baaaeaaeffa6ef0dde91Douglas Gregor case ARCXX_libcxx: 724f85e193739c953358c865005855253af4f68a497John McCall break; 725f85e193739c953358c865005855253af4f68a497John McCall 726f85e193739c953358c865005855253af4f68a497John McCall case ARCXX_libstdcxx: 727f85e193739c953358c865005855253af4f68a497John McCall AddObjCXXARCLibstdcxxDefines(LangOpts, Builder); 728f85e193739c953358c865005855253af4f68a497John McCall break; 729f85e193739c953358c865005855253af4f68a497John McCall } 730f85e193739c953358c865005855253af4f68a497John McCall } 731f85e193739c953358c865005855253af4f68a497John McCall } 732f85e193739c953358c865005855253af4f68a497John McCall 733a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky // Even with predefines off, some macros are still predefined. 734a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky // These should all be defined in the preprocessor according to the 735a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky // current language configuration. 7364e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie InitializeStandardPredefinedMacros(PP.getTargetInfo(), PP.getLangOpts(), 737a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky FEOpts, Builder); 738a9c6441c73686c34fdf5de681bfd81381fd0903cNick Lewycky 739e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // Add on the predefines from the driver. Wrap in a #line directive to report 740e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // that they come from the command line. 7414e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!PP.getLangOpts().AsmPreprocessor) 742fcaa9e787037b22a6833d4562fed3105c5b55f71Chris Lattner Builder.append("# 1 \"<command line>\" 1"); 743e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 744e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // Process #define's and #undef's in the order they are given. 745049d3a06ea9f8fc03582488a2b7f24512565a335Daniel Dunbar for (unsigned i = 0, e = InitOpts.Macros.size(); i != e; ++i) { 746049d3a06ea9f8fc03582488a2b7f24512565a335Daniel Dunbar if (InitOpts.Macros[i].second) // isUndef 747b1b5b901ca229ce05dc40abbec8bebe7b1096e42Benjamin Kramer Builder.undefineMacro(InitOpts.Macros[i].first); 74862f86c4555e14456acef6b251fcb13a66c3ce6ddChris Lattner else 749a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer DefineBuiltinMacro(Builder, InitOpts.Macros[i].first, 7501ee4b9e6d2d0d031708e2e6dd52aa9e32b83f1c3Daniel Dunbar PP.getDiagnostics()); 751e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner } 752e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 753e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // If -imacros are specified, include them now. These are processed before 754e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // any -include directives. 755049d3a06ea9f8fc03582488a2b7f24512565a335Daniel Dunbar for (unsigned i = 0, e = InitOpts.MacroIncludes.size(); i != e; ++i) 756277a6e752512cff286190d35cb353ce717e86b18Nick Lewycky AddImplicitIncludeMacros(Builder, InitOpts.MacroIncludes[i], 757277a6e752512cff286190d35cb353ce717e86b18Nick Lewycky PP.getFileManager()); 758e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 759e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner // Process -include directives. 760049d3a06ea9f8fc03582488a2b7f24512565a335Daniel Dunbar for (unsigned i = 0, e = InitOpts.Includes.size(); i != e; ++i) { 761049d3a06ea9f8fc03582488a2b7f24512565a335Daniel Dunbar const std::string &Path = InitOpts.Includes[i]; 762049d3a06ea9f8fc03582488a2b7f24512565a335Daniel Dunbar if (Path == InitOpts.ImplicitPTHInclude) 763a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer AddImplicitIncludePTH(Builder, PP, Path); 76462f86c4555e14456acef6b251fcb13a66c3ce6ddChris Lattner else 765277a6e752512cff286190d35cb353ce717e86b18Nick Lewycky AddImplicitInclude(Builder, Path, PP.getFileManager()); 766ae96a9637af7beea89a66d43bf3595b5a7d2756dEli Friedman } 767e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner 7680259d20ba1a188acb8770f4b5fab9fc947080be1Rafael Espindola // Exit the command line and go back to <built-in> (2 is LC_LEAVE). 7694e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!PP.getLangOpts().AsmPreprocessor) 770fcaa9e787037b22a6833d4562fed3105c5b55f71Chris Lattner Builder.append("# 1 \"<built-in>\" 2"); 7710259d20ba1a188acb8770f4b5fab9fc947080be1Rafael Espindola 772f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor // Instruct the preprocessor to skip the preamble. 773f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor PP.setSkipMainFilePreamble(InitOpts.PrecompiledPreambleBytes.first, 774f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor InitOpts.PrecompiledPreambleBytes.second); 775f4f6c9db68465b886ec2e596feaa6ecc782395a4Douglas Gregor 776a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer // Copy PredefinedBuffer into the Preprocessor. 777a3d8ced7f022cdbd09891f190342a08f22d80772Benjamin Kramer PP.setPredefines(Predefines.str()); 778fba18aa8f2cd1994dc65e8cb9f4be201c560dc0bDouglas Gregor 779961c76ea8d5089293e448e5d538570653e28080cDaniel Dunbar // Initialize the header search object. 780961c76ea8d5089293e448e5d538570653e28080cDaniel Dunbar ApplyHeaderSearchOptions(PP.getHeaderSearchInfo(), HSOpts, 7814e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie PP.getLangOpts(), 782961c76ea8d5089293e448e5d538570653e28080cDaniel Dunbar PP.getTargetInfo().getTriple()); 783e116ccf140b813ecd20e3fb4041d7d0b8a967c0bChris Lattner} 784