Preprocessor.cpp revision 337edcdbec05316b407d0d64865c88ff8597d910
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Preprocess.cpp - C Language Family Preprocessor Implementation ---===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  This file implements the Preprocessor interface.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Options to support:
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//   -H       - Print the name of each header file used.
16f73903a1ded46748e1dfda151f5d037b7b3d31f9Chris Lattner//   -d[DNI] - Dump various things.
175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//   -fworking-directory - #line's with preprocessor's working dir.
185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//   -fpreprocessed
195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//   -dependency-file,-M,-MM,-MF,-MG,-MP,-MT,-MQ,-MD,-MMD
205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//   -W*
215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//   -w
225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Messages to emit:
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//   "Multiple include guards may be useful for:\n"
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/Preprocessor.h"
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/HeaderSearch.h"
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/MacroInfo.h"
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/Pragma.h"
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/ScratchBuffer.h"
33500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/Lex/LexDiagnostic.h"
345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/SourceManager.h"
35337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek#include "clang/Basic/FileManager.h"
365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h"
372db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner#include "llvm/ADT/APFloat.h"
385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/ADT/SmallVector.h"
3997ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner#include "llvm/Support/MemoryBuffer.h"
40bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek#include "llvm/Support/Streams.h"
415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
45ec6c574478a22008847d7ebc2498ef3336752096Ted KremenekPreprocessorFactory::~PreprocessorFactory() {}
46ec6c574478a22008847d7ebc2498ef3336752096Ted Kremenek
475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerPreprocessor::Preprocessor(Diagnostic &diags, const LangOptions &opts,
485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                           TargetInfo &target, SourceManager &SM,
4972b1b15ee88aac0a63e2c1dc53fe22f5ab297b20Ted Kremenek                           HeaderSearch &Headers,
5072b1b15ee88aac0a63e2c1dc53fe22f5ab297b20Ted Kremenek                           IdentifierInfoLookup* IILookup)
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  : Diags(diags), Features(opts), Target(target), FileMgr(Headers.getFileMgr()),
5272b1b15ee88aac0a63e2c1dc53fe22f5ab297b20Ted Kremenek    SourceMgr(SM), HeaderInfo(Headers), Identifiers(opts, IILookup),
534b71e3e439080e69cd369313bf2ad2c85bac8267Ted Kremenek    CurPPLexer(0), CurDirLookup(0), Callbacks(0) {
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ScratchBuf = new ScratchBuffer(SourceMgr);
559594acf32de2939b15eafa8fe818607bfc56bf66Chris Lattner
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Clear stats.
575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumDirectives = NumDefined = NumUndefined = NumPragma = 0;
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumIf = NumElse = NumEndif = 0;
595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumEnteredSourceFiles = 0;
605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumMacroExpanded = NumFnMacroExpanded = NumBuiltinMacroExpanded = 0;
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumFastMacroExpanded = NumTokenPaste = NumFastTokenPaste = 0;
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  MaxIncludeStackDepth = 0;
635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumSkipped = 0;
645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Default to discarding comments.
665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  KeepComments = false;
675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  KeepMacroComments = false;
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Macro expansion is enabled.
705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DisableMacroExpansion = false;
715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InMacroArgs = false;
726cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner  NumCachedTokenLexers = 0;
735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7403db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis  CachedLexPos = 0;
7503db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis
765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro.
775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // This gets unpoisoned where it is allowed.
785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  (Ident__VA_ARGS__ = getIdentifierInfo("__VA_ARGS__"))->setIsPoisoned();
795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Initialize the pragma handlers.
815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PragmaHandlers = new PragmaNamespace(0);
825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  RegisterBuiltinPragmas();
835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Initialize builtin macros like __LINE__ and friends.
855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  RegisterBuiltinMacros();
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerPreprocessor::~Preprocessor() {
892174a4ff834b72c0a0e3f24e4b62123f30f4cce6Argyrios Kyrtzidis  assert(BacktrackPositions.empty() && "EnableBacktrack/Backtrack imbalance!");
902174a4ff834b72c0a0e3f24e4b62123f30f4cce6Argyrios Kyrtzidis
915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  while (!IncludeMacroStack.empty()) {
925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    delete IncludeMacroStack.back().TheLexer;
936cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner    delete IncludeMacroStack.back().TheTokenLexer;
945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    IncludeMacroStack.pop_back();
955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
96cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner
97cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner  // Free any macro definitions.
98cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner  for (llvm::DenseMap<IdentifierInfo*, MacroInfo*>::iterator I =
99cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner       Macros.begin(), E = Macros.end(); I != E; ++I) {
1000ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek    // We don't need to free the MacroInfo objects directly.  These
1010ea76727ae91bca918a8414ed85b530eddcfedebTed Kremenek    // will be released when the BumpPtrAllocator 'BP' object gets
1029ee7d456b427e002f7fe1844b64bec8055c8db52Ted Kremenek    // destroyed. We still need to run the dstor, however, to free
1039ee7d456b427e002f7fe1844b64bec8055c8db52Ted Kremenek    // memory alocated by MacroInfo.
1049ee7d456b427e002f7fe1844b64bec8055c8db52Ted Kremenek    I->second->~MacroInfo();
105cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner    I->first->setHasMacroDefinition(false);
106cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner  }
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1089594acf32de2939b15eafa8fe818607bfc56bf66Chris Lattner  // Free any cached macro expanders.
1096cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner  for (unsigned i = 0, e = NumCachedTokenLexers; i != e; ++i)
1106cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner    delete TokenLexerCache[i];
1119594acf32de2939b15eafa8fe818607bfc56bf66Chris Lattner
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Release pragma information.
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  delete PragmaHandlers;
1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Delete the scratch buffer info.
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  delete ScratchBuf;
117eb50ed88c2aa040fac08bf2a50bde4dd3da6eb19Chris Lattner
118eb50ed88c2aa040fac08bf2a50bde4dd3da6eb19Chris Lattner  delete Callbacks;
1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
121337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenekvoid Preprocessor::setPTHManager(PTHManager* pm) {
122337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek  PTH.reset(pm);
123337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek  FileMgr.setStatCache(PTH->createStatCache());
124337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek}
125337edcdbec05316b407d0d64865c88ff8597d910Ted Kremenek
126d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnervoid Preprocessor::DumpToken(const Token &Tok, bool DumpFlags) const {
127bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << tok::getTokenName(Tok.getKind()) << " '"
128bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << getSpelling(Tok) << "'";
1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!DumpFlags) return;
131c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner
132bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "\t";
1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.isAtStartOfLine())
134bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek    llvm::cerr << " [StartOfLine]";
1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.hasLeadingSpace())
136bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek    llvm::cerr << " [LeadingSpace]";
1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.isExpandDisabled())
138bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek    llvm::cerr << " [ExpandDisabled]";
1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.needsCleaning()) {
1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    const char *Start = SourceMgr.getCharacterData(Tok.getLocation());
141bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek    llvm::cerr << " [UnClean='" << std::string(Start, Start+Tok.getLength())
142bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek               << "']";
1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
144c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner
145bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "\tLoc=<";
146c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner  DumpLocation(Tok.getLocation());
147bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << ">";
148c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner}
149c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner
150c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattnervoid Preprocessor::DumpLocation(SourceLocation Loc) const {
151b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner  Loc.dump(SourceMgr);
1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid Preprocessor::DumpMacro(const MacroInfo &MI) const {
155bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "MACRO: ";
1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = MI.getNumTokens(); i != e; ++i) {
1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    DumpToken(MI.getReplacementToken(i));
158bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek    llvm::cerr << "  ";
1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
160bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "\n";
1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid Preprocessor::PrintStats() {
164bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "\n*** Preprocessor Stats:\n";
165bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << NumDirectives << " directives found:\n";
166bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "  " << NumDefined << " #define.\n";
167bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "  " << NumUndefined << " #undef.\n";
168bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "  #include/#include_next/#import:\n";
169bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "    " << NumEnteredSourceFiles << " source files entered.\n";
170bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "    " << MaxIncludeStackDepth << " max include stack depth\n";
171bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "  " << NumIf << " #if/#ifndef/#ifdef.\n";
172bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "  " << NumElse << " #else/#elif.\n";
173bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "  " << NumEndif << " #endif.\n";
174bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "  " << NumPragma << " #pragma.\n";
175bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << NumSkipped << " #if/#ifndef#ifdef regions skipped\n";
176bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek
177bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << NumMacroExpanded << "/" << NumFnMacroExpanded << "/"
178bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumBuiltinMacroExpanded << " obj/fn/builtin macros expanded, "
179bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumFastMacroExpanded << " on the fast path.\n";
180bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << (NumFastTokenPaste+NumTokenPaste)
181bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << " token paste (##) operations performed, "
182bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumFastTokenPaste << " on the fast path.\n";
1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Token Spelling
1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getSpelling() - Return the 'spelling' of this token.  The spelling of a
1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// token are the characters used to represent the token in the source file
1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// after trigraph expansion and escaped-newline folding.  In particular, this
1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// wants to get the true, uncanonicalized, spelling of things like digraphs
1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// UCNs, etc.
195d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnerstd::string Preprocessor::getSpelling(const Token &Tok) const {
1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert((int)Tok.getLength() >= 0 && "Token character range is bogus!");
197277faca30c9f8f72b79f55695cbe3395ec246e7cTed Kremenek
1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this token contains nothing interesting, return it directly.
199277faca30c9f8f72b79f55695cbe3395ec246e7cTed Kremenek  const char* TokStart = SourceMgr.getCharacterData(Tok.getLocation());
2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!Tok.needsCleaning())
2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return std::string(TokStart, TokStart+Tok.getLength());
2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  std::string Result;
2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Result.reserve(Tok.getLength());
2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Otherwise, hard case, relex the characters into the string.
2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (const char *Ptr = TokStart, *End = TokStart+Tok.getLength();
2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer       Ptr != End; ) {
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    unsigned CharSize;
2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Result.push_back(Lexer::getCharAndSizeNoWarn(Ptr, CharSize, Features));
2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Ptr += CharSize;
2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(Result.size() != unsigned(Tok.getLength()) &&
2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer         "NeedsCleaning flag set on something that didn't need cleaning!");
2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return Result;
2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getSpelling - This method is used to get the spelling of a token into a
2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// preallocated buffer, instead of as an std::string.  The caller is required
2205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// to allocate enough space for the token, which is guaranteed to be at least
2215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Tok.getLength() bytes long.  The actual length of the token is returned.
2225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Note that this method may do two possible things: it may either fill in
2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// the buffer specified with characters, or it may *change the input pointer*
2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// to point to a constant buffer with the data already in it (avoiding a
2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// copy).  The caller is not allowed to modify the returned buffer pointer
2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// if an internal buffer is returned.
228d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnerunsigned Preprocessor::getSpelling(const Token &Tok,
2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                   const char *&Buffer) const {
2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert((int)Tok.getLength() >= 0 && "Token character range is bogus!");
2315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this token is an identifier, just return the string from the identifier
2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // table, which is very quick.
2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const IdentifierInfo *II = Tok.getIdentifierInfo()) {
2355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Buffer = II->getName();
236e1dccaefe2d44a9f83f8c3f087438a3297254cacChris Lattner    return II->getLength();
2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
238b70e3dafb9618f34017061400dc19ac5e3539a6dTed Kremenek
2395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Otherwise, compute the start of the token in the input lexer buffer.
24047246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  const char *TokStart = 0;
24147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner
24247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  if (Tok.isLiteral())
24347246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner    TokStart = Tok.getLiteralData();
24447246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner
24547246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  if (TokStart == 0)
24647246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner    TokStart = SourceMgr.getCharacterData(Tok.getLocation());
2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this token contains nothing interesting, return it directly.
2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!Tok.needsCleaning()) {
2505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Buffer = TokStart;
2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return Tok.getLength();
2525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
25347246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner
2545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Otherwise, hard case, relex the characters into the string.
2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  char *OutBuf = const_cast<char*>(Buffer);
2565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (const char *Ptr = TokStart, *End = TokStart+Tok.getLength();
2575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer       Ptr != End; ) {
2585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    unsigned CharSize;
2595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    *OutBuf++ = Lexer::getCharAndSizeNoWarn(Ptr, CharSize, Features);
2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Ptr += CharSize;
2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(unsigned(OutBuf-Buffer) != Tok.getLength() &&
2635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer         "NeedsCleaning flag set on something that didn't need cleaning!");
2645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return OutBuf-Buffer;
2665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// CreateString - Plop the specified string into a scratch buffer and return a
2705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// location for it.  If specified, the source location provides a source
2715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// location for the token.
27247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattnervoid Preprocessor::CreateString(const char *Buf, unsigned Len, Token &Tok,
27347246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner                                SourceLocation InstantiationLoc) {
27447246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  Tok.setLength(Len);
27547246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner
27647246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  const char *DestPtr;
27747246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  SourceLocation Loc = ScratchBuf->getToken(Buf, Len, DestPtr);
27847246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner
27947246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  if (InstantiationLoc.isValid())
28047246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner    Loc = SourceMgr.createInstantiationLoc(Loc, InstantiationLoc, Len);
28147246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  Tok.setLocation(Loc);
28247246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner
28347246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  // If this is a literal token, set the pointer data.
28447246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner  if (Tok.isLiteral())
28547246be8ac5b0ddde6c402b8fc6946b6135487b5Chris Lattner    Tok.setLiteralData(DestPtr);
2865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
28997ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner/// AdvanceToTokenCharacter - Given a location that specifies the start of a
29097ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner/// token, return a new location that specifies a character within the token.
29197ba77cf09bf7b83b679165ce67ad7d49ffd568cChris LattnerSourceLocation Preprocessor::AdvanceToTokenCharacter(SourceLocation TokStart,
29297ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner                                                     unsigned CharNo) {
2939dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  // If they request the first char of the token, we're trivially done.  If this
2949dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  // is a macro expansion, it doesn't make sense to point to a character within
2959dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  // the instantiation point (the name).  We could point to the source
2969dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  // character, but without also pointing to instantiation info, this is
2979dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  // confusing.
2989dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  if (CharNo == 0 || TokStart.isMacroID()) return TokStart;
29997ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
300f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner  // Figure out how many physical characters away the specified instantiation
30197ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // character is.  This needs to take into consideration newlines and
30297ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // trigraphs.
3039dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  const char *TokPtr = SourceMgr.getCharacterData(TokStart);
3049dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  unsigned PhysOffset = 0;
30597ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
30697ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // The usual case is that tokens don't contain anything interesting.  Skip
30797ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // over the uninteresting characters.  If a token only consists of simple
30897ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // chars, this method is extremely fast.
30997ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  while (CharNo && Lexer::isObviouslySimpleCharacter(*TokPtr))
3109dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner    ++TokPtr, --CharNo, ++PhysOffset;
31197ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
31228c90ad7ef7c609a0b10c2f68b519ef69e7084d1Chris Lattner  // If we have a character that may be a trigraph or escaped newline, use a
31397ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // lexer to parse it correctly.
31497ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  if (CharNo != 0) {
31597ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner    // Skip over characters the remaining characters.
31628c90ad7ef7c609a0b10c2f68b519ef69e7084d1Chris Lattner    for (; CharNo; --CharNo) {
31728c90ad7ef7c609a0b10c2f68b519ef69e7084d1Chris Lattner      unsigned Size;
31828c90ad7ef7c609a0b10c2f68b519ef69e7084d1Chris Lattner      Lexer::getCharAndSizeNoWarn(TokPtr, Size, Features);
31928c90ad7ef7c609a0b10c2f68b519ef69e7084d1Chris Lattner      TokPtr += Size;
32028c90ad7ef7c609a0b10c2f68b519ef69e7084d1Chris Lattner      PhysOffset += Size;
32128c90ad7ef7c609a0b10c2f68b519ef69e7084d1Chris Lattner    }
32297ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  }
3239dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner
3249dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  return TokStart.getFileLocWithOffset(PhysOffset);
32597ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner}
32697ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
32797ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
32853b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner//===----------------------------------------------------------------------===//
32953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner// Preprocessor Initialization Methods
33053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner//===----------------------------------------------------------------------===//
33153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
33253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner// Append a #define line to Buf for Macro.  Macro should be of the form XXX,
33353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner// in which case we emit "#define XXX 1" or "XXX=Y z W" in which case we emit
33453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner// "#define XXX Y z W".  To get a #define with no value, use "XXX=".
33553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattnerstatic void DefineBuiltinMacro(std::vector<char> &Buf, const char *Macro,
33653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner                               const char *Command = "#define ") {
33753b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  Buf.insert(Buf.end(), Command, Command+strlen(Command));
33853b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  if (const char *Equal = strchr(Macro, '=')) {
33953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    // Turn the = into ' '.
34053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    Buf.insert(Buf.end(), Macro, Equal);
34153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    Buf.push_back(' ');
34253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    Buf.insert(Buf.end(), Equal+1, Equal+strlen(Equal));
34353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  } else {
34453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    // Push "macroname 1".
34553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
34653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    Buf.push_back(' ');
34753b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    Buf.push_back('1');
34853b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  }
34953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  Buf.push_back('\n');
35053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner}
35153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
3522db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner/// PickFP - This is used to pick a value based on the FP semantics of the
3532db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner/// specified FP model.
3542db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattnertemplate <typename T>
3552db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattnerstatic T PickFP(const llvm::fltSemantics *Sem, T IEEESingleVal,
3562db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner                T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal) {
3572db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  if (Sem == &llvm::APFloat::IEEEsingle)
3582db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner    return IEEESingleVal;
3592db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  if (Sem == &llvm::APFloat::IEEEdouble)
3602db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner    return IEEEDoubleVal;
3612db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  if (Sem == &llvm::APFloat::x87DoubleExtended)
3622db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner    return X87DoubleExtendedVal;
3632db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  assert(Sem == &llvm::APFloat::PPCDoubleDouble);
3642db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  return PPCDoubleDoubleVal;
3652db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner}
3662db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner
3672db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattnerstatic void DefineFloatMacros(std::vector<char> &Buf, const char *Prefix,
3682db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner                              const llvm::fltSemantics *Sem) {
369e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  const char *DenormMin, *Epsilon, *Max, *Min;
370e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DenormMin = PickFP(Sem, "1.40129846e-45F", "4.9406564584124654e-324",
371e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner                     "3.64519953188247460253e-4951L",
372e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner                     "4.94065645841246544176568792868221e-324L");
373e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  int Digits = PickFP(Sem, 6, 15, 18, 31);
374e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  Epsilon = PickFP(Sem, "1.19209290e-7F", "2.2204460492503131e-16",
375e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner                   "1.08420217248550443401e-19L",
376e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner                   "4.94065645841246544176568792868221e-324L");
377e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  int HasInifinity = 1, HasQuietNaN = 1;
378e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  int MantissaDigits = PickFP(Sem, 24, 53, 64, 106);
379e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  int Min10Exp = PickFP(Sem, -37, -307, -4931, -291);
380e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  int Max10Exp = PickFP(Sem, 38, 308, 4932, 308);
381e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  int MinExp = PickFP(Sem, -125, -1021, -16381, -968);
382e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  int MaxExp = PickFP(Sem, 128, 1024, 16384, 1024);
383e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  Min = PickFP(Sem, "1.17549435e-38F", "2.2250738585072014e-308",
384e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner               "3.36210314311209350626e-4932L",
385e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner               "2.00416836000897277799610805135016e-292L");
386e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  Max = PickFP(Sem, "3.40282347e+38F", "1.7976931348623157e+308",
387e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner               "1.18973149535723176502e+4932L",
388e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner               "1.79769313486231580793728971405301e+308L");
3892db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner
3902db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  char MacroBuf[60];
3912db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  sprintf(MacroBuf, "__%s_DENORM_MIN__=%s", Prefix, DenormMin);
3922db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
393e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_DIG__=%d", Prefix, Digits);
394e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
395e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_EPSILON__=%s", Prefix, Epsilon);
396e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
397e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_HAS_INFINITY__=%d", Prefix, HasInifinity);
398e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
399e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_HAS_QUIET_NAN__=%d", Prefix, HasQuietNaN);
400e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
401e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_MANT_DIG__=%d", Prefix, MantissaDigits);
402e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
403e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_MAX_10_EXP__=%d", Prefix, Max10Exp);
404e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
405e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_MAX_EXP__=%d", Prefix, MaxExp);
406e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
407e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_MAX__=%s", Prefix, Max);
408e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
409e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_MIN_10_EXP__=(%d)", Prefix, Min10Exp);
410e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
411e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_MIN_EXP__=(%d)", Prefix, MinExp);
412e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
413e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_MIN__=%s", Prefix, Min);
414e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
415d427ad4cceab4481be0ac5cc2a190148ccc181e2Chris Lattner  sprintf(MacroBuf, "__%s_HAS_DENORM__=1", Prefix);
416d427ad4cceab4481be0ac5cc2a190148ccc181e2Chris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
4172db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner}
4182db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner
41953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
420996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner/// DefineTypeSize - Emit a macro to the predefines buffer that declares a macro
421996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner/// named MacroName with the max value for a type with width 'TypeWidth' a
422996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner/// signedness of 'isSigned' and with a value suffix of 'ValSuffix' (e.g. LL).
423996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattnerstatic void DefineTypeSize(const char *MacroName, unsigned TypeWidth,
424996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner                           const char *ValSuffix, bool isSigned,
425996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner                           std::vector<char> &Buf) {
426996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner  char MacroBuf[60];
427996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner  uint64_t MaxVal;
428996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner  if (isSigned)
429996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner    MaxVal = (1LL << (TypeWidth - 1)) - 1;
430996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner  else
431996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner    MaxVal = ~0LL >> (64-TypeWidth);
432996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner
433996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner  sprintf(MacroBuf, "%s=%llu%s", MacroName, MaxVal, ValSuffix);
434996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
435996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner}
436996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner
4372b5abf515f9696912452f431c7738691cf97f4f1Chris Lattnerstatic void DefineType(const char *MacroName, TargetInfo::IntType Ty,
4382b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner                       std::vector<char> &Buf) {
4392b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  char MacroBuf[60];
4402b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  sprintf(MacroBuf, "%s=%s", MacroName, TargetInfo::getTypeName(Ty));
4412b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
4422b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner}
4432b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner
4442b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner
44553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattnerstatic void InitializePredefinedMacros(Preprocessor &PP,
44653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner                                       std::vector<char> &Buf) {
44703c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner  char MacroBuf[60];
44862213d90822848110e5f4125491351697d5a302cChris Lattner  // Compiler version introspection macros.
44962213d90822848110e5f4125491351697d5a302cChris Lattner  DefineBuiltinMacro(Buf, "__llvm__=1");   // LLVM Backend
45062213d90822848110e5f4125491351697d5a302cChris Lattner  DefineBuiltinMacro(Buf, "__clang__=1");  // Clang Frontend
45162213d90822848110e5f4125491351697d5a302cChris Lattner
45262213d90822848110e5f4125491351697d5a302cChris Lattner  // Currently claim to be compatible with GCC 4.2.1-5621.
45362213d90822848110e5f4125491351697d5a302cChris Lattner  DefineBuiltinMacro(Buf, "__APPLE_CC__=5621");
45462213d90822848110e5f4125491351697d5a302cChris Lattner  DefineBuiltinMacro(Buf, "__GNUC_MINOR__=2");
45562213d90822848110e5f4125491351697d5a302cChris Lattner  DefineBuiltinMacro(Buf, "__GNUC_PATCHLEVEL__=1");
45662213d90822848110e5f4125491351697d5a302cChris Lattner  DefineBuiltinMacro(Buf, "__GNUC__=4");
45762213d90822848110e5f4125491351697d5a302cChris Lattner  DefineBuiltinMacro(Buf, "__GXX_ABI_VERSION=1002");
45862213d90822848110e5f4125491351697d5a302cChris Lattner  DefineBuiltinMacro(Buf, "__VERSION__=\"4.2.1 (Apple Computer, Inc. "
45962213d90822848110e5f4125491351697d5a302cChris Lattner                     "build 5621) (dot 3)\"");
46062213d90822848110e5f4125491351697d5a302cChris Lattner
46162213d90822848110e5f4125491351697d5a302cChris Lattner
46262213d90822848110e5f4125491351697d5a302cChris Lattner  // Initialize language-specific preprocessor defines.
46362213d90822848110e5f4125491351697d5a302cChris Lattner
46453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // FIXME: Implement magic like cpp_init_builtins for things like __STDC__
46553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // and __DATE__ etc.
46653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // These should all be defined in the preprocessor according to the
46753b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // current language configuration.
4687e0fbb2561fadf8c1fce5fdb588f5db2f3cae51fSteve Naroff  if (!PP.getLangOptions().Microsoft)
4697e0fbb2561fadf8c1fce5fdb588f5db2f3cae51fSteve Naroff    DefineBuiltinMacro(Buf, "__STDC__=1");
470c1571453de3db2b26c15cc13115fac4ece84aa7cDaniel Dunbar  if (PP.getLangOptions().AsmPreprocessor)
471c1571453de3db2b26c15cc13115fac4ece84aa7cDaniel Dunbar    DefineBuiltinMacro(Buf, "__ASSEMBLER__=1");
47253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  if (PP.getLangOptions().C99 && !PP.getLangOptions().CPlusPlus)
47353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    DefineBuiltinMacro(Buf, "__STDC_VERSION__=199901L");
47453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  else if (0) // STDC94 ?
47553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    DefineBuiltinMacro(Buf, "__STDC_VERSION__=199409L");
47653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
47753b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  DefineBuiltinMacro(Buf, "__STDC_HOSTED__=1");
478fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar  if (PP.getLangOptions().ObjC1) {
47953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    DefineBuiltinMacro(Buf, "__OBJC__=1");
480fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar
481fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar    if (PP.getLangOptions().getGCMode() == LangOptions::NonGC) {
482fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar      DefineBuiltinMacro(Buf, "__weak=");
483fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar      DefineBuiltinMacro(Buf, "__strong=");
484fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar    } else {
485fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar      DefineBuiltinMacro(Buf, "__weak=__attribute__((objc_gc(weak)))");
486fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar      DefineBuiltinMacro(Buf, "__strong=__attribute__((objc_gc(strong)))");
487fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar      DefineBuiltinMacro(Buf, "__OBJC_GC__=1");
488fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar    }
489fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar
490fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar    if (PP.getLangOptions().NeXTRuntime)
491fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar      DefineBuiltinMacro(Buf, "__NEXT_RUNTIME__=1");
492fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar  }
4939b533164570a67c81ad49f3691f02608530a042eChris Lattner
494eb52b44caf9afbf4bfaf0e3e6f9426d90492b85bChris Lattner  // darwin_constant_cfstrings controls this. This is also dependent
495eb52b44caf9afbf4bfaf0e3e6f9426d90492b85bChris Lattner  // on other things like the runtime I believe.  This is set even for C code.
496eb52b44caf9afbf4bfaf0e3e6f9426d90492b85bChris Lattner  DefineBuiltinMacro(Buf, "__CONSTANT_CFSTRINGS__=1");
497eb52b44caf9afbf4bfaf0e3e6f9426d90492b85bChris Lattner
49873b17cd017f70d0bf7ca2dbb12f09f99081d7fdbSteve Naroff  if (PP.getLangOptions().ObjC2)
49973b17cd017f70d0bf7ca2dbb12f09f99081d7fdbSteve Naroff    DefineBuiltinMacro(Buf, "OBJC_NEW_PROPERTIES");
5008ee529b5671295ea38c249df8b9d3766c905cfa7Steve Naroff
501048dd943fc22a3ee60180d6992d744106c4c100aChris Lattner  if (PP.getLangOptions().PascalStrings)
502048dd943fc22a3ee60180d6992d744106c4c100aChris Lattner    DefineBuiltinMacro(Buf, "__PASCAL_STRINGS__");
503048dd943fc22a3ee60180d6992d744106c4c100aChris Lattner
50462213d90822848110e5f4125491351697d5a302cChris Lattner  if (PP.getLangOptions().Blocks) {
50562213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__block=__attribute__((__blocks__(byref)))");
50662213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__BLOCKS__=1");
5072b43ad9588b8c7f0c9fdc1d95f4f972257215fcaChris Lattner  }
50862213d90822848110e5f4125491351697d5a302cChris Lattner
50962213d90822848110e5f4125491351697d5a302cChris Lattner  if (PP.getLangOptions().CPlusPlus) {
51062213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__DEPRECATED=1");
51162213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__EXCEPTIONS=1");
51262213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__GNUG__=4");
51362213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__GXX_WEAK__=1");
51462213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__cplusplus=1");
51562213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__private_extern__=extern");
51662213d90822848110e5f4125491351697d5a302cChris Lattner  }
51762213d90822848110e5f4125491351697d5a302cChris Lattner
51862213d90822848110e5f4125491351697d5a302cChris Lattner  // Filter out some microsoft extensions when trying to parse in ms-compat
51962213d90822848110e5f4125491351697d5a302cChris Lattner  // mode.
52062213d90822848110e5f4125491351697d5a302cChris Lattner  if (PP.getLangOptions().Microsoft) {
521239f07384fe5e7194e780d98a17553084efeeb44Steve Naroff    DefineBuiltinMacro(Buf, "_cdecl=__cdecl");
52203c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner    DefineBuiltinMacro(Buf, "__int8=__INT8_TYPE__");
52303c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner    DefineBuiltinMacro(Buf, "__int16=__INT16_TYPE__");
52403c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner    DefineBuiltinMacro(Buf, "__int32=__INT32_TYPE__");
52503c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner    DefineBuiltinMacro(Buf, "__int64=__INT64_TYPE__");
52662213d90822848110e5f4125491351697d5a302cChris Lattner  }
52762213d90822848110e5f4125491351697d5a302cChris Lattner
52862213d90822848110e5f4125491351697d5a302cChris Lattner  // Initialize target-specific preprocessor defines.
5299b533164570a67c81ad49f3691f02608530a042eChris Lattner  const TargetInfo &TI = PP.getTargetInfo();
5309b533164570a67c81ad49f3691f02608530a042eChris Lattner
5319b533164570a67c81ad49f3691f02608530a042eChris Lattner  // Define type sizing macros based on the target properties.
5329b533164570a67c81ad49f3691f02608530a042eChris Lattner  assert(TI.getCharWidth() == 8 && "Only support 8-bit char so far");
5339b533164570a67c81ad49f3691f02608530a042eChris Lattner  DefineBuiltinMacro(Buf, "__CHAR_BIT__=8");
5342db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner
535659dc14559f7dc6e635810d5e0f6dca643549817Chris Lattner  unsigned IntMaxWidth;
536659dc14559f7dc6e635810d5e0f6dca643549817Chris Lattner  const char *IntMaxSuffix;
537659dc14559f7dc6e635810d5e0f6dca643549817Chris Lattner  if (TI.getIntMaxType() == TargetInfo::SignedLongLong) {
538659dc14559f7dc6e635810d5e0f6dca643549817Chris Lattner    IntMaxWidth = TI.getLongLongWidth();
539659dc14559f7dc6e635810d5e0f6dca643549817Chris Lattner    IntMaxSuffix = "LL";
540659dc14559f7dc6e635810d5e0f6dca643549817Chris Lattner  } else if (TI.getIntMaxType() == TargetInfo::SignedLong) {
541659dc14559f7dc6e635810d5e0f6dca643549817Chris Lattner    IntMaxWidth = TI.getLongWidth();
542659dc14559f7dc6e635810d5e0f6dca643549817Chris Lattner    IntMaxSuffix = "L";
543659dc14559f7dc6e635810d5e0f6dca643549817Chris Lattner  } else {
544659dc14559f7dc6e635810d5e0f6dca643549817Chris Lattner    assert(TI.getIntMaxType() == TargetInfo::SignedInt);
545659dc14559f7dc6e635810d5e0f6dca643549817Chris Lattner    IntMaxWidth = TI.getIntWidth();
546659dc14559f7dc6e635810d5e0f6dca643549817Chris Lattner    IntMaxSuffix = "";
547659dc14559f7dc6e635810d5e0f6dca643549817Chris Lattner  }
548659dc14559f7dc6e635810d5e0f6dca643549817Chris Lattner
54986d85b8e5e55db3079c9c22aecdb30d830793a50Chris Lattner  DefineTypeSize("__SCHAR_MAX__", TI.getCharWidth(), "", true, Buf);
55086d85b8e5e55db3079c9c22aecdb30d830793a50Chris Lattner  DefineTypeSize("__SHRT_MAX__", TI.getShortWidth(), "", true, Buf);
55186d85b8e5e55db3079c9c22aecdb30d830793a50Chris Lattner  DefineTypeSize("__INT_MAX__", TI.getIntWidth(), "", true, Buf);
55286d85b8e5e55db3079c9c22aecdb30d830793a50Chris Lattner  DefineTypeSize("__LONG_MAX__", TI.getLongWidth(), "L", true, Buf);
55386d85b8e5e55db3079c9c22aecdb30d830793a50Chris Lattner  DefineTypeSize("__LONG_LONG_MAX__", TI.getLongLongWidth(), "LL", true, Buf);
55486d85b8e5e55db3079c9c22aecdb30d830793a50Chris Lattner  DefineTypeSize("__WCHAR_MAX__", TI.getWCharWidth(), "", true, Buf);
555996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner  DefineTypeSize("__INTMAX_MAX__", IntMaxWidth, IntMaxSuffix, true, Buf);
556996feccdec6c865a2f9d11faac7e0970e7aebb1bChris Lattner
5572b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  DefineType("__INTMAX_TYPE__", TI.getIntMaxType(), Buf);
5582b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  DefineType("__UINTMAX_TYPE__", TI.getUIntMaxType(), Buf);
5592b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  DefineType("__PTRDIFF_TYPE__", TI.getPtrDiffType(0), Buf);
5602b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  DefineType("__SIZE_TYPE__", TI.getSizeType(), Buf);
5613c3b155ea8dfa29954a689a855d537a9ff2f12afChris Lattner  DefineType("__WCHAR_TYPE__", TI.getWCharType(), Buf);
5623c3b155ea8dfa29954a689a855d537a9ff2f12afChris Lattner  // FIXME: TargetInfo hookize __WINT_TYPE__.
5633c3b155ea8dfa29954a689a855d537a9ff2f12afChris Lattner  DefineBuiltinMacro(Buf, "__WINT_TYPE__=int");
5643c3b155ea8dfa29954a689a855d537a9ff2f12afChris Lattner
5652db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  DefineFloatMacros(Buf, "FLT", &TI.getFloatFormat());
5662db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  DefineFloatMacros(Buf, "DBL", &TI.getDoubleFormat());
5672db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  DefineFloatMacros(Buf, "LDBL", &TI.getLongDoubleFormat());
56803c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner
56903c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner  // Define a __POINTER_WIDTH__ macro for stdint.h.
57003c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner  sprintf(MacroBuf, "__POINTER_WIDTH__=%d", (int)TI.getPointerWidth(0));
57103c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
57203c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner
57303c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner  if (!TI.isCharSigned())
57403c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner    DefineBuiltinMacro(Buf, "__CHAR_UNSIGNED__");
57503c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner
57603c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner  // Define fixed-sized integer types for stdint.h
57703c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner  assert(TI.getCharWidth() == 8 && "unsupported target types");
57803c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner  assert(TI.getShortWidth() == 16 && "unsupported target types");
57903c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner  DefineBuiltinMacro(Buf, "__INT8_TYPE__=char");
58003c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner  DefineBuiltinMacro(Buf, "__INT16_TYPE__=short");
58103c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner
58203c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner  if (TI.getIntWidth() == 32)
58303c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner    DefineBuiltinMacro(Buf, "__INT32_TYPE__=int");
58403c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner  else {
58503c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner    assert(TI.getLongLongWidth() == 32 && "unsupported target types");
58603c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner    DefineBuiltinMacro(Buf, "__INT32_TYPE__=long long");
58703c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner  }
58803c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner
58903c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner  // 16-bit targets doesn't necessarily have a 64-bit type.
59003c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner  if (TI.getLongLongWidth() == 64)
59103c972767e6f1a9be8540f29edd110b27fbb6b59Chris Lattner    DefineBuiltinMacro(Buf, "__INT64_TYPE__=long long");
5920e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner
593d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner  // Add __builtin_va_list typedef.
594d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner  {
5959b533164570a67c81ad49f3691f02608530a042eChris Lattner    const char *VAList = TI.getVAListDeclaration();
596d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner    Buf.insert(Buf.end(), VAList, VAList+strlen(VAList));
597d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner    Buf.push_back('\n');
598d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner  }
59953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
6009b533164570a67c81ad49f3691f02608530a042eChris Lattner  if (const char *Prefix = TI.getUserLabelPrefix()) {
60112f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner    sprintf(MacroBuf, "__USER_LABEL_PREFIX__=%s", Prefix);
60212f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner    DefineBuiltinMacro(Buf, MacroBuf);
6033fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  }
6043fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner
6059b533164570a67c81ad49f3691f02608530a042eChris Lattner  // Build configuration options.  FIXME: these should be controlled by
6069b533164570a67c81ad49f3691f02608530a042eChris Lattner  // command line options or something.
60753b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  DefineBuiltinMacro(Buf, "__DYNAMIC__=1");
60853b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  DefineBuiltinMacro(Buf, "__FINITE_MATH_ONLY__=0");
60953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  DefineBuiltinMacro(Buf, "__NO_INLINE__=1");
61053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  DefineBuiltinMacro(Buf, "__PIC__=1");
6119b533164570a67c81ad49f3691f02608530a042eChris Lattner
61212f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner  // Macros to control C99 numerics and <float.h>
61312f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner  DefineBuiltinMacro(Buf, "__FLT_EVAL_METHOD__=0");
61412f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner  DefineBuiltinMacro(Buf, "__FLT_RADIX__=2");
61512f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner  sprintf(MacroBuf, "__DECIMAL_DIG__=%d",
61612f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner          PickFP(&TI.getLongDoubleFormat(), -1/*FIXME*/, 17, 21, 33));
61712f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
61812f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner
6199b533164570a67c81ad49f3691f02608530a042eChris Lattner  // Get other target #defines.
6209b533164570a67c81ad49f3691f02608530a042eChris Lattner  TI.getTargetDefines(Buf);
62153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
62253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // FIXME: Should emit a #line directive here.
62353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner}
62453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
62553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
62653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner/// EnterMainSourceFile - Enter the specified FileID as the main source file,
6276b61602bc7695d40b3c4d09032be1ca1dd0b3c31Nate Begeman/// which implicitly adds the builtin defines etc.
62895041a2029a069386ee67439f6d0fb524a9d184fTed Kremenekvoid Preprocessor::EnterMainSourceFile() {
62995041a2029a069386ee67439f6d0fb524a9d184fTed Kremenek
6302b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  FileID MainFileID = SourceMgr.getMainFileID();
63195041a2029a069386ee67439f6d0fb524a9d184fTed Kremenek
63253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Enter the main file source buffer.
63353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  EnterSourceFile(MainFileID, 0);
63453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
635b283298f03d2b512204d14ca687f9de263eeff0fChris Lattner  // Tell the header info that the main file was entered.  If the file is later
636b283298f03d2b512204d14ca687f9de263eeff0fChris Lattner  // #imported, it won't be re-entered.
6372b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  if (const FileEntry *FE = SourceMgr.getFileEntryForID(MainFileID))
638b283298f03d2b512204d14ca687f9de263eeff0fChris Lattner    HeaderInfo.IncrementIncludeCount(FE);
639b283298f03d2b512204d14ca687f9de263eeff0fChris Lattner
64053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  std::vector<char> PrologFile;
64153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  PrologFile.reserve(4080);
64253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
64353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Install things like __POWERPC__, __GNUC__, etc into the macro table.
64453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  InitializePredefinedMacros(*this, PrologFile);
64553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
64653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Add on the predefines from the driver.
647aa39197431a0a0b1326ecf6b3be6a11f6e2f8503Chris Lattner  PrologFile.insert(PrologFile.end(), Predefines.begin(), Predefines.end());
64853b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
64953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Memory buffer must end with a null byte!
65053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  PrologFile.push_back(0);
65153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
65253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Now that we have emitted the predefined macros, #includes, etc into
65353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // PrologFile, preprocess it to populate the initial preprocessor state.
65453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  llvm::MemoryBuffer *SB =
65553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    llvm::MemoryBuffer::getMemBufferCopy(&PrologFile.front(),&PrologFile.back(),
65653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner                                         "<predefines>");
65753b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  assert(SB && "Cannot fail to create predefined source buffer");
6582b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  FileID FID = SourceMgr.createFileIDForMemBuffer(SB);
6592b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  assert(!FID.isInvalid() && "Could not create FileID for predefines?");
66053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
66153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Start parsing the predefines.
6622b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner  EnterSourceFile(FID, 0);
66353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner}
66497ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
6655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
6675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Lexer Event Handling.
6685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
6695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// LookUpIdentifierInfo - Given a tok::identifier token, look up the
6715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// identifier information for the token and install it into the token.
672d217773f106856a11879ec79dc468efefaf2ee75Chris LattnerIdentifierInfo *Preprocessor::LookUpIdentifierInfo(Token &Identifier,
6735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                                   const char *BufPtr) {
67422f6bbcafa8871f4f20c4402d9cbc5c024fee99aChris Lattner  assert(Identifier.is(tok::identifier) && "Not an identifier!");
6755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(Identifier.getIdentifierInfo() == 0 && "Identinfo already exists!");
6765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Look up this token, see if it is a macro, or if it is a language keyword.
6785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo *II;
6795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (BufPtr && !Identifier.needsCleaning()) {
6805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // No cleaning needed, just use the characters from the lexed buffer.
6815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    II = getIdentifierInfo(BufPtr, BufPtr+Identifier.getLength());
6825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
6835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Cleaning needed, alloca a buffer, clean into it, then use the buffer.
684c35717a1b34269fc5d78226b1624f53e1c073ed6Chris Lattner    llvm::SmallVector<char, 64> IdentifierBuffer;
685c35717a1b34269fc5d78226b1624f53e1c073ed6Chris Lattner    IdentifierBuffer.resize(Identifier.getLength());
686c35717a1b34269fc5d78226b1624f53e1c073ed6Chris Lattner    const char *TmpBuf = &IdentifierBuffer[0];
6875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    unsigned Size = getSpelling(Identifier, TmpBuf);
6885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    II = getIdentifierInfo(TmpBuf, TmpBuf+Size);
6895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
6905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Identifier.setIdentifierInfo(II);
6915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return II;
6925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// HandleIdentifier - This callback is invoked when the lexer reads an
6965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// identifier.  This callback looks up the identifier in the map and/or
6975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// potentially macro expands it or turns it into a named token (like 'for').
6986a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner///
6996a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// Note that callers of this method are guarded by checking the
7006a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// IdentifierInfo's 'isHandleIdentifierCase' bit.  If this method changes, the
7016a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// IdentifierInfo methods that compute these properties will need to change to
7026a170eb3ea6d6319277becabef68eb1a26bf8766Chris Lattner/// match.
703d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnervoid Preprocessor::HandleIdentifier(Token &Identifier) {
7045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(Identifier.getIdentifierInfo() &&
7055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer         "Can't handle identifiers without identifier info!");
7065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo &II = *Identifier.getIdentifierInfo();
7085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this identifier was poisoned, and if it was not produced from a macro
7105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // expansion, emit an error.
7111a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek  if (II.isPoisoned() && CurPPLexer) {
7125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (&II != Ident__VA_ARGS__)   // We warn about __VA_ARGS__ with poisoning.
7135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      Diag(Identifier, diag::err_pp_used_poisoned_id);
7145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else
7155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      Diag(Identifier, diag::ext_pp_bad_vaargs_use);
7165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
7175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this is a macro to be expanded, do it.
719cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner  if (MacroInfo *MI = getMacroInfo(&II)) {
7205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (!DisableMacroExpansion && !Identifier.isExpandDisabled()) {
7215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      if (MI->isEnabled()) {
7225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        if (!HandleMacroExpandedIdentifier(Identifier, MI))
7235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer          return;
7245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      } else {
7255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // C99 6.10.3.4p2 says that a disabled macro may never again be
7265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // expanded, even if it's in a context where it could be expanded in the
7275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // future.
728d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner        Identifier.setFlag(Token::DisableExpand);
7295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
7305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
7315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
7325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C++ 2.11p2: If this is an alternative representation of a C++ operator,
7345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // then we act as if it is the actual operator and not the textual
7355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // representation of it.
7365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (II.isCPlusPlusOperatorKeyword())
7375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Identifier.setIdentifierInfo(0);
7385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this is an extension token, diagnose its use.
740b4eaf9cf5f79c86a3f7564f4dfdea57f165ca45cSteve Naroff  // We avoid diagnosing tokens that originate from macro definitions.
741b4eaf9cf5f79c86a3f7564f4dfdea57f165ca45cSteve Naroff  if (II.isExtensionToken() && Features.C99 && !DisableMacroExpansion)
7425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Diag(Identifier, diag::ext_token_used);
7435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
744