Preprocessor.cpp revision 1a531570d294ffc300cce1bc5e73de847a370f4f
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.
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//   -d[MDNI] - 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"
335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/Diagnostic.h"
345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/SourceManager.h"
355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h"
362db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner#include "llvm/ADT/APFloat.h"
375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/ADT/SmallVector.h"
3897ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner#include "llvm/Support/MemoryBuffer.h"
39bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek#include "llvm/Support/Streams.h"
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
44ec6c574478a22008847d7ebc2498ef3336752096Ted KremenekPreprocessorFactory::~PreprocessorFactory() {}
45ec6c574478a22008847d7ebc2498ef3336752096Ted Kremenek
465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerPreprocessor::Preprocessor(Diagnostic &diags, const LangOptions &opts,
475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                           TargetInfo &target, SourceManager &SM,
485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                           HeaderSearch &Headers)
495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  : Diags(diags), Features(opts), Target(target), FileMgr(Headers.getFileMgr()),
505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    SourceMgr(SM), HeaderInfo(Headers), Identifiers(opts),
514b71e3e439080e69cd369313bf2ad2c85bac8267Ted Kremenek    CurPPLexer(0), CurDirLookup(0), Callbacks(0) {
525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ScratchBuf = new ScratchBuffer(SourceMgr);
539594acf32de2939b15eafa8fe818607bfc56bf66Chris Lattner
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Clear stats.
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumDirectives = NumDefined = NumUndefined = NumPragma = 0;
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumIf = NumElse = NumEndif = 0;
575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumEnteredSourceFiles = 0;
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumMacroExpanded = NumFnMacroExpanded = NumBuiltinMacroExpanded = 0;
595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumFastMacroExpanded = NumTokenPaste = NumFastTokenPaste = 0;
605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  MaxIncludeStackDepth = 0;
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumSkipped = 0;
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Default to discarding comments.
645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  KeepComments = false;
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  KeepMacroComments = false;
665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Macro expansion is enabled.
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  DisableMacroExpansion = false;
695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InMacroArgs = false;
706cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner  NumCachedTokenLexers = 0;
715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7203db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis  CachedLexPos = 0;
7303db1b31dd926409b7defc1c90b66549464652c0Argyrios Kyrtzidis
745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro.
755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // This gets unpoisoned where it is allowed.
765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  (Ident__VA_ARGS__ = getIdentifierInfo("__VA_ARGS__"))->setIsPoisoned();
775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Initialize the pragma handlers.
795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PragmaHandlers = new PragmaNamespace(0);
805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  RegisterBuiltinPragmas();
815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Initialize builtin macros like __LINE__ and friends.
835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  RegisterBuiltinMacros();
845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerPreprocessor::~Preprocessor() {
872174a4ff834b72c0a0e3f24e4b62123f30f4cce6Argyrios Kyrtzidis  assert(BacktrackPositions.empty() && "EnableBacktrack/Backtrack imbalance!");
882174a4ff834b72c0a0e3f24e4b62123f30f4cce6Argyrios Kyrtzidis
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  while (!IncludeMacroStack.empty()) {
905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    delete IncludeMacroStack.back().TheLexer;
916cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner    delete IncludeMacroStack.back().TheTokenLexer;
925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    IncludeMacroStack.pop_back();
935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
94cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner
95cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner  // Free any macro definitions.
96cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner  for (llvm::DenseMap<IdentifierInfo*, MacroInfo*>::iterator I =
97cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner       Macros.begin(), E = Macros.end(); I != E; ++I) {
98cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner    // Free the macro definition.
99cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner    delete I->second;
100cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner    I->second = 0;
101cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner    I->first->setHasMacroDefinition(false);
102cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner  }
1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1049594acf32de2939b15eafa8fe818607bfc56bf66Chris Lattner  // Free any cached macro expanders.
1056cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner  for (unsigned i = 0, e = NumCachedTokenLexers; i != e; ++i)
1066cfe7594a46b5d270142cfcb688a9c1a3a487a48Chris Lattner    delete TokenLexerCache[i];
1079594acf32de2939b15eafa8fe818607bfc56bf66Chris Lattner
1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Release pragma information.
1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  delete PragmaHandlers;
1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Delete the scratch buffer info.
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  delete ScratchBuf;
113eb50ed88c2aa040fac08bf2a50bde4dd3da6eb19Chris Lattner
114eb50ed88c2aa040fac08bf2a50bde4dd3da6eb19Chris Lattner  delete Callbacks;
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Diag - Forwarding function for diagnostics.  This emits a diagnostic at
118d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner/// the specified Token's location, translating the token's start
1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// position in the current buffer into a SourcePosition object for rendering.
1203692b09faa9fe346f39bc922db6dce48cdcc3f63Chris LattnerDiagnosticInfo Preprocessor::Diag(SourceLocation Loc, unsigned DiagID) {
1213692b09faa9fe346f39bc922db6dce48cdcc3f63Chris Lattner  return Diags.Report(getFullLoc(Loc), DiagID);
1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1243692b09faa9fe346f39bc922db6dce48cdcc3f63Chris LattnerDiagnosticInfo Preprocessor::Diag(const Token &Tok, unsigned DiagID) {
1253692b09faa9fe346f39bc922db6dce48cdcc3f63Chris Lattner  return Diags.Report(getFullLoc(Tok.getLocation()), DiagID);
1263692b09faa9fe346f39bc922db6dce48cdcc3f63Chris Lattner}
1273692b09faa9fe346f39bc922db6dce48cdcc3f63Chris Lattner
128d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnervoid Preprocessor::DumpToken(const Token &Tok, bool DumpFlags) const {
129bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << tok::getTokenName(Tok.getKind()) << " '"
130bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << getSpelling(Tok) << "'";
1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!DumpFlags) return;
133c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner
134bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "\t";
1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.isAtStartOfLine())
136bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek    llvm::cerr << " [StartOfLine]";
1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.hasLeadingSpace())
138bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek    llvm::cerr << " [LeadingSpace]";
1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.isExpandDisabled())
140bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek    llvm::cerr << " [ExpandDisabled]";
1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Tok.needsCleaning()) {
1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    const char *Start = SourceMgr.getCharacterData(Tok.getLocation());
143bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek    llvm::cerr << " [UnClean='" << std::string(Start, Start+Tok.getLength())
144bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek               << "']";
1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
146c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner
147bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "\tLoc=<";
148c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner  DumpLocation(Tok.getLocation());
149bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << ">";
150c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner}
151c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner
152c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattnervoid Preprocessor::DumpLocation(SourceLocation Loc) const {
153c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner  SourceLocation LogLoc = SourceMgr.getLogicalLoc(Loc);
154bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << SourceMgr.getSourceName(LogLoc) << ':'
155bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << SourceMgr.getLineNumber(LogLoc) << ':'
156109949a5f5f8c1e9f917095706639167cfe9260fTed Kremenek             << SourceMgr.getColumnNumber(LogLoc);
157c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner
158c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner  SourceLocation PhysLoc = SourceMgr.getPhysicalLoc(Loc);
159c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner  if (PhysLoc != LogLoc) {
160bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek    llvm::cerr << " <PhysLoc=";
161c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner    DumpLocation(PhysLoc);
162bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek    llvm::cerr << ">";
163c3d8d57b010e2ed15a2a7685d5761db14f5d2252Chris Lattner  }
1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid Preprocessor::DumpMacro(const MacroInfo &MI) const {
167bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "MACRO: ";
1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = MI.getNumTokens(); i != e; ++i) {
1695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    DumpToken(MI.getReplacementToken(i));
170bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek    llvm::cerr << "  ";
1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
172bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "\n";
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid Preprocessor::PrintStats() {
176bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "\n*** Preprocessor Stats:\n";
177bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << NumDirectives << " directives found:\n";
178bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "  " << NumDefined << " #define.\n";
179bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "  " << NumUndefined << " #undef.\n";
180bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "  #include/#include_next/#import:\n";
181bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "    " << NumEnteredSourceFiles << " source files entered.\n";
182bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "    " << MaxIncludeStackDepth << " max include stack depth\n";
183bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "  " << NumIf << " #if/#ifndef/#ifdef.\n";
184bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "  " << NumElse << " #else/#elif.\n";
185bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "  " << NumEndif << " #endif.\n";
186bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << "  " << NumPragma << " #pragma.\n";
187bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << NumSkipped << " #if/#ifndef#ifdef regions skipped\n";
188bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek
189bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << NumMacroExpanded << "/" << NumFnMacroExpanded << "/"
190bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumBuiltinMacroExpanded << " obj/fn/builtin macros expanded, "
191bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumFastMacroExpanded << " on the fast path.\n";
192bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek  llvm::cerr << (NumFastTokenPaste+NumTokenPaste)
193bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << " token paste (##) operations performed, "
194bdd30c26bd93a89ae0fe125e9aae8b7c05e55324Ted Kremenek             << NumFastTokenPaste << " on the fast path.\n";
1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Token Spelling
1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getSpelling() - Return the 'spelling' of this token.  The spelling of a
2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// token are the characters used to represent the token in the source file
2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// after trigraph expansion and escaped-newline folding.  In particular, this
2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// wants to get the true, uncanonicalized, spelling of things like digraphs
2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// UCNs, etc.
207d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnerstd::string Preprocessor::getSpelling(const Token &Tok) const {
2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert((int)Tok.getLength() >= 0 && "Token character range is bogus!");
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this token contains nothing interesting, return it directly.
2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *TokStart = SourceMgr.getCharacterData(Tok.getLocation());
2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!Tok.needsCleaning())
2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return std::string(TokStart, TokStart+Tok.getLength());
2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  std::string Result;
2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Result.reserve(Tok.getLength());
2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Otherwise, hard case, relex the characters into the string.
2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (const char *Ptr = TokStart, *End = TokStart+Tok.getLength();
2205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer       Ptr != End; ) {
2215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    unsigned CharSize;
2225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Result.push_back(Lexer::getCharAndSizeNoWarn(Ptr, CharSize, Features));
2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Ptr += CharSize;
2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(Result.size() != unsigned(Tok.getLength()) &&
2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer         "NeedsCleaning flag set on something that didn't need cleaning!");
2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return Result;
2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getSpelling - This method is used to get the spelling of a token into a
2315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// preallocated buffer, instead of as an std::string.  The caller is required
2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// to allocate enough space for the token, which is guaranteed to be at least
2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Tok.getLength() bytes long.  The actual length of the token is returned.
2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
2355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Note that this method may do two possible things: it may either fill in
2365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// the buffer specified with characters, or it may *change the input pointer*
2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// to point to a constant buffer with the data already in it (avoiding a
2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// copy).  The caller is not allowed to modify the returned buffer pointer
2395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// if an internal buffer is returned.
240d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnerunsigned Preprocessor::getSpelling(const Token &Tok,
2415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                   const char *&Buffer) const {
2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert((int)Tok.getLength() >= 0 && "Token character range is bogus!");
2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this token is an identifier, just return the string from the identifier
2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // table, which is very quick.
2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const IdentifierInfo *II = Tok.getIdentifierInfo()) {
2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Buffer = II->getName();
2480f67032078de7b8944eb8dc5fea4fef6f483c385Chris Lattner
2490f67032078de7b8944eb8dc5fea4fef6f483c385Chris Lattner    // Return the length of the token.  If the token needed cleaning, don't
2500f67032078de7b8944eb8dc5fea4fef6f483c385Chris Lattner    // include the size of the newlines or trigraphs in it.
2510f67032078de7b8944eb8dc5fea4fef6f483c385Chris Lattner    if (!Tok.needsCleaning())
2520f67032078de7b8944eb8dc5fea4fef6f483c385Chris Lattner      return Tok.getLength();
2530f67032078de7b8944eb8dc5fea4fef6f483c385Chris Lattner    else
2540f67032078de7b8944eb8dc5fea4fef6f483c385Chris Lattner      return strlen(Buffer);
2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Otherwise, compute the start of the token in the input lexer buffer.
2585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *TokStart = SourceMgr.getCharacterData(Tok.getLocation());
2595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this token contains nothing interesting, return it directly.
2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!Tok.needsCleaning()) {
2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Buffer = TokStart;
2635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return Tok.getLength();
2645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Otherwise, hard case, relex the characters into the string.
2665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  char *OutBuf = const_cast<char*>(Buffer);
2675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (const char *Ptr = TokStart, *End = TokStart+Tok.getLength();
2685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer       Ptr != End; ) {
2695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    unsigned CharSize;
2705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    *OutBuf++ = Lexer::getCharAndSizeNoWarn(Ptr, CharSize, Features);
2715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Ptr += CharSize;
2725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(unsigned(OutBuf-Buffer) != Tok.getLength() &&
2745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer         "NeedsCleaning flag set on something that didn't need cleaning!");
2755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return OutBuf-Buffer;
2775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// CreateString - Plop the specified string into a scratch buffer and return a
2815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// location for it.  If specified, the source location provides a source
2825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// location for the token.
2835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerSourceLocation Preprocessor::
2845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerCreateString(const char *Buf, unsigned Len, SourceLocation SLoc) {
2855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (SLoc.isValid())
2865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return ScratchBuf->getToken(Buf, Len, SLoc);
2875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return ScratchBuf->getToken(Buf, Len);
2885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
29197ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner/// AdvanceToTokenCharacter - Given a location that specifies the start of a
29297ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner/// token, return a new location that specifies a character within the token.
29397ba77cf09bf7b83b679165ce67ad7d49ffd568cChris LattnerSourceLocation Preprocessor::AdvanceToTokenCharacter(SourceLocation TokStart,
29497ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner                                                     unsigned CharNo) {
2959dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  // If they request the first char of the token, we're trivially done.  If this
2969dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  // is a macro expansion, it doesn't make sense to point to a character within
2979dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  // the instantiation point (the name).  We could point to the source
2989dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  // character, but without also pointing to instantiation info, this is
2999dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  // confusing.
3009dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  if (CharNo == 0 || TokStart.isMacroID()) return TokStart;
30197ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
30297ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // Figure out how many physical characters away the specified logical
30397ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // character is.  This needs to take into consideration newlines and
30497ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // trigraphs.
3059dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  const char *TokPtr = SourceMgr.getCharacterData(TokStart);
3069dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  unsigned PhysOffset = 0;
30797ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
30897ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // The usual case is that tokens don't contain anything interesting.  Skip
30997ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // over the uninteresting characters.  If a token only consists of simple
31097ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // chars, this method is extremely fast.
31197ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  while (CharNo && Lexer::isObviouslySimpleCharacter(*TokPtr))
3129dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner    ++TokPtr, --CharNo, ++PhysOffset;
31397ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
31497ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // If we have a character that may be a trigraph or escaped newline, create a
31597ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  // lexer to parse it correctly.
31697ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  if (CharNo != 0) {
31797ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner    // Create a lexer starting at this token position.
31825bdb51276d3bfc180a68688082071505a00ed27Chris Lattner    Lexer TheLexer(TokStart, *this, TokPtr);
319d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner    Token Tok;
32097ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner    // Skip over characters the remaining characters.
3219dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner    const char *TokStartPtr = TokPtr;
32297ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner    for (; CharNo; --CharNo)
32397ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner      TheLexer.getAndAdvanceChar(TokPtr, Tok);
3249dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner
3259dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner    PhysOffset += TokPtr-TokStartPtr;
32697ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner  }
3279dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner
3289dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner  return TokStart.getFileLocWithOffset(PhysOffset);
32997ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner}
33097ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
33197ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
33253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner//===----------------------------------------------------------------------===//
33353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner// Preprocessor Initialization Methods
33453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner//===----------------------------------------------------------------------===//
33553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
33653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner// Append a #define line to Buf for Macro.  Macro should be of the form XXX,
33753b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner// in which case we emit "#define XXX 1" or "XXX=Y z W" in which case we emit
33853b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner// "#define XXX Y z W".  To get a #define with no value, use "XXX=".
33953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattnerstatic void DefineBuiltinMacro(std::vector<char> &Buf, const char *Macro,
34053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner                               const char *Command = "#define ") {
34153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  Buf.insert(Buf.end(), Command, Command+strlen(Command));
34253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  if (const char *Equal = strchr(Macro, '=')) {
34353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    // Turn the = into ' '.
34453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    Buf.insert(Buf.end(), Macro, Equal);
34553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    Buf.push_back(' ');
34653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    Buf.insert(Buf.end(), Equal+1, Equal+strlen(Equal));
34753b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  } else {
34853b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    // Push "macroname 1".
34953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
35053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    Buf.push_back(' ');
35153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    Buf.push_back('1');
35253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  }
35353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  Buf.push_back('\n');
35453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner}
35553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
3562db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner/// PickFP - This is used to pick a value based on the FP semantics of the
3572db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner/// specified FP model.
3582db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattnertemplate <typename T>
3592db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattnerstatic T PickFP(const llvm::fltSemantics *Sem, T IEEESingleVal,
3602db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner                T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal) {
3612db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  if (Sem == &llvm::APFloat::IEEEsingle)
3622db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner    return IEEESingleVal;
3632db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  if (Sem == &llvm::APFloat::IEEEdouble)
3642db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner    return IEEEDoubleVal;
3652db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  if (Sem == &llvm::APFloat::x87DoubleExtended)
3662db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner    return X87DoubleExtendedVal;
3672db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  assert(Sem == &llvm::APFloat::PPCDoubleDouble);
3682db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  return PPCDoubleDoubleVal;
3692db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner}
3702db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner
3712db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattnerstatic void DefineFloatMacros(std::vector<char> &Buf, const char *Prefix,
3722db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner                              const llvm::fltSemantics *Sem) {
373e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  const char *DenormMin, *Epsilon, *Max, *Min;
374e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DenormMin = PickFP(Sem, "1.40129846e-45F", "4.9406564584124654e-324",
375e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner                     "3.64519953188247460253e-4951L",
376e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner                     "4.94065645841246544176568792868221e-324L");
377e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  int Digits = PickFP(Sem, 6, 15, 18, 31);
378e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  Epsilon = PickFP(Sem, "1.19209290e-7F", "2.2204460492503131e-16",
379e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner                   "1.08420217248550443401e-19L",
380e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner                   "4.94065645841246544176568792868221e-324L");
381e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  int HasInifinity = 1, HasQuietNaN = 1;
382e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  int MantissaDigits = PickFP(Sem, 24, 53, 64, 106);
383e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  int Min10Exp = PickFP(Sem, -37, -307, -4931, -291);
384e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  int Max10Exp = PickFP(Sem, 38, 308, 4932, 308);
385e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  int MinExp = PickFP(Sem, -125, -1021, -16381, -968);
386e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  int MaxExp = PickFP(Sem, 128, 1024, 16384, 1024);
387e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  Min = PickFP(Sem, "1.17549435e-38F", "2.2250738585072014e-308",
388e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner               "3.36210314311209350626e-4932L",
389e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner               "2.00416836000897277799610805135016e-292L");
390e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  Max = PickFP(Sem, "3.40282347e+38F", "1.7976931348623157e+308",
391e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner               "1.18973149535723176502e+4932L",
392e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner               "1.79769313486231580793728971405301e+308L");
3932db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner
3942db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  char MacroBuf[60];
3952db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  sprintf(MacroBuf, "__%s_DENORM_MIN__=%s", Prefix, DenormMin);
3962db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
397e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_DIG__=%d", Prefix, Digits);
398e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
399e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_EPSILON__=%s", Prefix, Epsilon);
400e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
401e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_HAS_INFINITY__=%d", Prefix, HasInifinity);
402e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
403e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_HAS_QUIET_NAN__=%d", Prefix, HasQuietNaN);
404e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
405e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_MANT_DIG__=%d", Prefix, MantissaDigits);
406e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
407e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_MAX_10_EXP__=%d", Prefix, Max10Exp);
408e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
409e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_MAX_EXP__=%d", Prefix, MaxExp);
410e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
411e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_MAX__=%s", Prefix, Max);
412e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
413e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_MIN_10_EXP__=(%d)", Prefix, Min10Exp);
414e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
415e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_MIN_EXP__=(%d)", Prefix, MinExp);
416e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
417e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  sprintf(MacroBuf, "__%s_MIN__=%s", Prefix, Min);
418e9863cab04789cd6d82453c42f6736624e0e739bChris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
4192db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner}
4202db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner
42153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
42253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattnerstatic void InitializePredefinedMacros(Preprocessor &PP,
42353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner                                       std::vector<char> &Buf) {
42462213d90822848110e5f4125491351697d5a302cChris Lattner  // Compiler version introspection macros.
42562213d90822848110e5f4125491351697d5a302cChris Lattner  DefineBuiltinMacro(Buf, "__llvm__=1");   // LLVM Backend
42662213d90822848110e5f4125491351697d5a302cChris Lattner  DefineBuiltinMacro(Buf, "__clang__=1");  // Clang Frontend
42762213d90822848110e5f4125491351697d5a302cChris Lattner
42862213d90822848110e5f4125491351697d5a302cChris Lattner  // Currently claim to be compatible with GCC 4.2.1-5621.
42962213d90822848110e5f4125491351697d5a302cChris Lattner  DefineBuiltinMacro(Buf, "__APPLE_CC__=5621");
43062213d90822848110e5f4125491351697d5a302cChris Lattner  DefineBuiltinMacro(Buf, "__GNUC_MINOR__=2");
43162213d90822848110e5f4125491351697d5a302cChris Lattner  DefineBuiltinMacro(Buf, "__GNUC_PATCHLEVEL__=1");
43262213d90822848110e5f4125491351697d5a302cChris Lattner  DefineBuiltinMacro(Buf, "__GNUC__=4");
43362213d90822848110e5f4125491351697d5a302cChris Lattner  DefineBuiltinMacro(Buf, "__GXX_ABI_VERSION=1002");
43462213d90822848110e5f4125491351697d5a302cChris Lattner  DefineBuiltinMacro(Buf, "__VERSION__=\"4.2.1 (Apple Computer, Inc. "
43562213d90822848110e5f4125491351697d5a302cChris Lattner                     "build 5621) (dot 3)\"");
43662213d90822848110e5f4125491351697d5a302cChris Lattner
43762213d90822848110e5f4125491351697d5a302cChris Lattner
43862213d90822848110e5f4125491351697d5a302cChris Lattner  // Initialize language-specific preprocessor defines.
43962213d90822848110e5f4125491351697d5a302cChris Lattner
44053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // FIXME: Implement magic like cpp_init_builtins for things like __STDC__
44153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // and __DATE__ etc.
44253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // These should all be defined in the preprocessor according to the
44353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // current language configuration.
44453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  DefineBuiltinMacro(Buf, "__STDC__=1");
44553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  //DefineBuiltinMacro(Buf, "__ASSEMBLER__=1");
44653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  if (PP.getLangOptions().C99 && !PP.getLangOptions().CPlusPlus)
44753b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    DefineBuiltinMacro(Buf, "__STDC_VERSION__=199901L");
44853b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  else if (0) // STDC94 ?
44953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    DefineBuiltinMacro(Buf, "__STDC_VERSION__=199409L");
45053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
45153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  DefineBuiltinMacro(Buf, "__STDC_HOSTED__=1");
452fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar  if (PP.getLangOptions().ObjC1) {
45353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    DefineBuiltinMacro(Buf, "__OBJC__=1");
454fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar
455fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar    if (PP.getLangOptions().getGCMode() == LangOptions::NonGC) {
456fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar      DefineBuiltinMacro(Buf, "__weak=");
457fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar      DefineBuiltinMacro(Buf, "__strong=");
458fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar    } else {
459fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar      DefineBuiltinMacro(Buf, "__weak=__attribute__((objc_gc(weak)))");
460fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar      DefineBuiltinMacro(Buf, "__strong=__attribute__((objc_gc(strong)))");
461fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar      DefineBuiltinMacro(Buf, "__OBJC_GC__=1");
462fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar    }
463fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar
464fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar    if (PP.getLangOptions().NeXTRuntime)
465fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar      DefineBuiltinMacro(Buf, "__NEXT_RUNTIME__=1");
466fba5cb12adbe95d79855e91db018b863ce48387eDaniel Dunbar  }
4679b533164570a67c81ad49f3691f02608530a042eChris Lattner
468eb52b44caf9afbf4bfaf0e3e6f9426d90492b85bChris Lattner  // darwin_constant_cfstrings controls this. This is also dependent
469eb52b44caf9afbf4bfaf0e3e6f9426d90492b85bChris Lattner  // on other things like the runtime I believe.  This is set even for C code.
470eb52b44caf9afbf4bfaf0e3e6f9426d90492b85bChris Lattner  DefineBuiltinMacro(Buf, "__CONSTANT_CFSTRINGS__=1");
471eb52b44caf9afbf4bfaf0e3e6f9426d90492b85bChris Lattner
47273b17cd017f70d0bf7ca2dbb12f09f99081d7fdbSteve Naroff  if (PP.getLangOptions().ObjC2)
47373b17cd017f70d0bf7ca2dbb12f09f99081d7fdbSteve Naroff    DefineBuiltinMacro(Buf, "OBJC_NEW_PROPERTIES");
4748ee529b5671295ea38c249df8b9d3766c905cfa7Steve Naroff
475048dd943fc22a3ee60180d6992d744106c4c100aChris Lattner  if (PP.getLangOptions().PascalStrings)
476048dd943fc22a3ee60180d6992d744106c4c100aChris Lattner    DefineBuiltinMacro(Buf, "__PASCAL_STRINGS__");
477048dd943fc22a3ee60180d6992d744106c4c100aChris Lattner
47862213d90822848110e5f4125491351697d5a302cChris Lattner  if (PP.getLangOptions().Blocks) {
47962213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__block=__attribute__((__blocks__(byref)))");
48062213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__BLOCKS__=1");
4812b43ad9588b8c7f0c9fdc1d95f4f972257215fcaChris Lattner  }
48262213d90822848110e5f4125491351697d5a302cChris Lattner
48362213d90822848110e5f4125491351697d5a302cChris Lattner  if (PP.getLangOptions().CPlusPlus) {
48462213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__DEPRECATED=1");
48562213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__EXCEPTIONS=1");
48662213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__GNUG__=4");
48762213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__GXX_WEAK__=1");
48862213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__cplusplus=1");
48962213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__private_extern__=extern");
49062213d90822848110e5f4125491351697d5a302cChris Lattner  }
49162213d90822848110e5f4125491351697d5a302cChris Lattner
49262213d90822848110e5f4125491351697d5a302cChris Lattner  // Filter out some microsoft extensions when trying to parse in ms-compat
49362213d90822848110e5f4125491351697d5a302cChris Lattner  // mode.
49462213d90822848110e5f4125491351697d5a302cChris Lattner  if (PP.getLangOptions().Microsoft) {
49562213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__stdcall=");
49662213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__cdecl=");
49762213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "_cdecl=");
49862213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__ptr64=");
49962213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__w64=");
50062213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__forceinline=");
50162213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__int8=char");
50262213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__int16=short");
50362213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__int32=int");
50462213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__int64=long long");
50562213d90822848110e5f4125491351697d5a302cChris Lattner    DefineBuiltinMacro(Buf, "__declspec(X)=");
50662213d90822848110e5f4125491351697d5a302cChris Lattner  }
50762213d90822848110e5f4125491351697d5a302cChris Lattner
50862213d90822848110e5f4125491351697d5a302cChris Lattner
50962213d90822848110e5f4125491351697d5a302cChris Lattner  // Initialize target-specific preprocessor defines.
5109b533164570a67c81ad49f3691f02608530a042eChris Lattner  const TargetInfo &TI = PP.getTargetInfo();
5119b533164570a67c81ad49f3691f02608530a042eChris Lattner
5129b533164570a67c81ad49f3691f02608530a042eChris Lattner  // Define type sizing macros based on the target properties.
5139b533164570a67c81ad49f3691f02608530a042eChris Lattner  assert(TI.getCharWidth() == 8 && "Only support 8-bit char so far");
5149b533164570a67c81ad49f3691f02608530a042eChris Lattner  DefineBuiltinMacro(Buf, "__CHAR_BIT__=8");
5159b533164570a67c81ad49f3691f02608530a042eChris Lattner  DefineBuiltinMacro(Buf, "__SCHAR_MAX__=127");
5162db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner
5172db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  assert(TI.getWCharWidth() == 32 && "Only support 32-bit wchar so far");
5182db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  DefineBuiltinMacro(Buf, "__WCHAR_MAX__=2147483647");
5192db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  DefineBuiltinMacro(Buf, "__WCHAR_TYPE__=int");
5202db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  DefineBuiltinMacro(Buf, "__WINT_TYPE__=int");
5219b533164570a67c81ad49f3691f02608530a042eChris Lattner
5229b533164570a67c81ad49f3691f02608530a042eChris Lattner  assert(TI.getShortWidth() == 16 && "Only support 16-bit short so far");
5239b533164570a67c81ad49f3691f02608530a042eChris Lattner  DefineBuiltinMacro(Buf, "__SHRT_MAX__=32767");
5249b533164570a67c81ad49f3691f02608530a042eChris Lattner
5250e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner  if (TI.getIntWidth() == 32)
5260e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner    DefineBuiltinMacro(Buf, "__INT_MAX__=2147483647");
5270e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner  else if (TI.getIntWidth() == 16)
5280e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner    DefineBuiltinMacro(Buf, "__INT_MAX__=32767");
5290e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner  else
5300e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner    assert(0 && "Unknown integer size");
53131fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta
53231fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  if (TI.getLongLongWidth() == 64)
53331fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__LONG_LONG_MAX__=9223372036854775807LL");
53431fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getLongLongWidth() == 32)
53531fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__LONG_LONG_MAX__=2147483647L");
5369b533164570a67c81ad49f3691f02608530a042eChris Lattner
5370e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner  if (TI.getLongWidth() == 32)
5380e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner    DefineBuiltinMacro(Buf, "__LONG_MAX__=2147483647L");
5390e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner  else if (TI.getLongWidth() == 64)
5400e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner    DefineBuiltinMacro(Buf, "__LONG_MAX__=9223372036854775807L");
5410e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner  else if (TI.getLongWidth() == 16)
5420e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner    DefineBuiltinMacro(Buf, "__LONG_MAX__=32767L");
5430e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner  else
5440e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner    assert(0 && "Unknown long size");
54531fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  char MacroBuf[60];
54631fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  sprintf(MacroBuf, "__INTMAX_MAX__=%lld",
54731fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta          (TI.getIntMaxType() == TargetInfo::UnsignedLongLong?
54873608a89a64401985990f8046f75cdd82309e92fSanjiv Gupta           (1LL << (TI.getLongLongWidth() - 1)) :
54973608a89a64401985990f8046f75cdd82309e92fSanjiv Gupta           ((1LL << (TI.getLongLongWidth() - 2)) - 1)));
55031fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  DefineBuiltinMacro(Buf, MacroBuf);
5510e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner
55231fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  if (TI.getIntMaxType() == TargetInfo::UnsignedLongLong)
55331fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__INTMAX_TYPE__=unsigned long long int");
55431fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getIntMaxType() == TargetInfo::SignedLongLong)
55531fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__INTMAX_TYPE__=long long int");
55631fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getIntMaxType() == TargetInfo::UnsignedLong)
55731fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__INTMAX_TYPE__=unsigned long int");
55831fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getIntMaxType() == TargetInfo::SignedLong)
5590e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner    DefineBuiltinMacro(Buf, "__INTMAX_TYPE__=long int");
56031fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getIntMaxType() == TargetInfo::UnsignedInt)
56131fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__INTMAX_TYPE__=unsigned int");
56231fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else
56331fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__INTMAX_TYPE__=int");
56431fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta
56531fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  if (TI.getUIntMaxType() == TargetInfo::UnsignedLongLong)
56631fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__UINTMAX_TYPE__=unsigned long long int");
56731fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getUIntMaxType() == TargetInfo::SignedLongLong)
56831fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__UINTMAX_TYPE__=long long int");
56931fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getUIntMaxType() == TargetInfo::UnsignedLong)
57031fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__UINTMAX_TYPE__=unsigned long int");
57131fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getUIntMaxType() == TargetInfo::SignedLong)
57231fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__UINTMAX_TYPE__=long int");
57331fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getUIntMaxType() == TargetInfo::UnsignedInt)
57431fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__UINTMAX_TYPE__=unsigned int");
57531fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else
57631fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__UINTMAX_TYPE__=int");
57731fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta
57831fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  if (TI.getPtrDiffType(0) == TargetInfo::UnsignedLongLong)
57931fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__PTRDIFF_TYPE__=unsigned long long int");
58031fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getPtrDiffType(0) == TargetInfo::SignedLongLong)
58131fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__PTRDIFF_TYPE__=long long int");
58231fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getPtrDiffType(0) == TargetInfo::UnsignedLong)
58331fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__PTRDIFF_TYPE__=unsigned long int");
58431fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getPtrDiffType(0) == TargetInfo::SignedLong)
5850e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner    DefineBuiltinMacro(Buf, "__PTRDIFF_TYPE__=long int");
58631fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getPtrDiffType(0) == TargetInfo::UnsignedInt)
58731fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__PTRDIFF_TYPE__=unsigned int");
58831fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else
5890e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner    DefineBuiltinMacro(Buf, "__PTRDIFF_TYPE__=int");
5900e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner
59131fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  if (TI.getSizeType() == TargetInfo::UnsignedLongLong)
59231fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__SIZE_TYPE__=unsigned long long int");
59331fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getSizeType() == TargetInfo::SignedLongLong)
59431fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__SIZE_TYPE__=long long int");
59531fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getSizeType() == TargetInfo::UnsignedLong)
59631fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__SIZE_TYPE__=unsigned long int");
59731fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getSizeType() == TargetInfo::SignedLong)
59831fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__SIZE_TYPE__=long int");
59931fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getSizeType() == TargetInfo::UnsignedInt)
60031fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__SIZE_TYPE__=unsigned int");
60131fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else if (TI.getSizeType() == TargetInfo::SignedInt)
60231fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__SIZE_TYPE__=int");
60331fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  else
60431fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    DefineBuiltinMacro(Buf, "__SIZE_TYPE__=unsigned short");
60531fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta
6062db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  DefineFloatMacros(Buf, "FLT", &TI.getFloatFormat());
6072db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  DefineFloatMacros(Buf, "DBL", &TI.getDoubleFormat());
6082db78dd977fbba8fdf24cf8a4593436c031cfbcbChris Lattner  DefineFloatMacros(Buf, "LDBL", &TI.getLongDoubleFormat());
6090e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner
610048dd943fc22a3ee60180d6992d744106c4c100aChris Lattner
611d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner  // Add __builtin_va_list typedef.
612d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner  {
6139b533164570a67c81ad49f3691f02608530a042eChris Lattner    const char *VAList = TI.getVAListDeclaration();
614d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner    Buf.insert(Buf.end(), VAList, VAList+strlen(VAList));
615d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner    Buf.push_back('\n');
616d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner  }
61753b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
6189b533164570a67c81ad49f3691f02608530a042eChris Lattner  if (const char *Prefix = TI.getUserLabelPrefix()) {
61912f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner    sprintf(MacroBuf, "__USER_LABEL_PREFIX__=%s", Prefix);
62012f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner    DefineBuiltinMacro(Buf, MacroBuf);
6213fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  }
6223fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner
6239b533164570a67c81ad49f3691f02608530a042eChris Lattner  // Build configuration options.  FIXME: these should be controlled by
6249b533164570a67c81ad49f3691f02608530a042eChris Lattner  // command line options or something.
62553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  DefineBuiltinMacro(Buf, "__DYNAMIC__=1");
62653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  DefineBuiltinMacro(Buf, "__FINITE_MATH_ONLY__=0");
62753b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  DefineBuiltinMacro(Buf, "__NO_INLINE__=1");
62853b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  DefineBuiltinMacro(Buf, "__PIC__=1");
6299b533164570a67c81ad49f3691f02608530a042eChris Lattner
63012f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner  // Macros to control C99 numerics and <float.h>
63112f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner  DefineBuiltinMacro(Buf, "__FLT_EVAL_METHOD__=0");
63212f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner  DefineBuiltinMacro(Buf, "__FLT_RADIX__=2");
63312f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner  sprintf(MacroBuf, "__DECIMAL_DIG__=%d",
63412f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner          PickFP(&TI.getLongDoubleFormat(), -1/*FIXME*/, 17, 21, 33));
63512f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner  DefineBuiltinMacro(Buf, MacroBuf);
63612f09260294175dc097b843d3d06d048b9cd64a3Chris Lattner
6379b533164570a67c81ad49f3691f02608530a042eChris Lattner  // Get other target #defines.
6389b533164570a67c81ad49f3691f02608530a042eChris Lattner  TI.getTargetDefines(Buf);
63953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
64053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // FIXME: Should emit a #line directive here.
64153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner}
64253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
64353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
64453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner/// EnterMainSourceFile - Enter the specified FileID as the main source file,
6456b61602bc7695d40b3c4d09032be1ca1dd0b3c31Nate Begeman/// which implicitly adds the builtin defines etc.
64695041a2029a069386ee67439f6d0fb524a9d184fTed Kremenekvoid Preprocessor::EnterMainSourceFile() {
64795041a2029a069386ee67439f6d0fb524a9d184fTed Kremenek
64895041a2029a069386ee67439f6d0fb524a9d184fTed Kremenek  unsigned MainFileID = SourceMgr.getMainFileID();
64995041a2029a069386ee67439f6d0fb524a9d184fTed Kremenek
65053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Enter the main file source buffer.
65153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  EnterSourceFile(MainFileID, 0);
65253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
653b283298f03d2b512204d14ca687f9de263eeff0fChris Lattner  // Tell the header info that the main file was entered.  If the file is later
654b283298f03d2b512204d14ca687f9de263eeff0fChris Lattner  // #imported, it won't be re-entered.
655b283298f03d2b512204d14ca687f9de263eeff0fChris Lattner  if (const FileEntry *FE =
656b283298f03d2b512204d14ca687f9de263eeff0fChris Lattner        SourceMgr.getFileEntryForLoc(SourceLocation::getFileLoc(MainFileID, 0)))
657b283298f03d2b512204d14ca687f9de263eeff0fChris Lattner    HeaderInfo.IncrementIncludeCount(FE);
658b283298f03d2b512204d14ca687f9de263eeff0fChris Lattner
65953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  std::vector<char> PrologFile;
66053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  PrologFile.reserve(4080);
66153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
66253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Install things like __POWERPC__, __GNUC__, etc into the macro table.
66353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  InitializePredefinedMacros(*this, PrologFile);
66453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
66553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Add on the predefines from the driver.
666aa39197431a0a0b1326ecf6b3be6a11f6e2f8503Chris Lattner  PrologFile.insert(PrologFile.end(), Predefines.begin(), Predefines.end());
66753b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
66853b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Memory buffer must end with a null byte!
66953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  PrologFile.push_back(0);
67053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
67153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Now that we have emitted the predefined macros, #includes, etc into
67253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // PrologFile, preprocess it to populate the initial preprocessor state.
67353b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  llvm::MemoryBuffer *SB =
67453b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner    llvm::MemoryBuffer::getMemBufferCopy(&PrologFile.front(),&PrologFile.back(),
67553b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner                                         "<predefines>");
67653b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  assert(SB && "Cannot fail to create predefined source buffer");
67753b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  unsigned FileID = SourceMgr.createFileIDForMemBuffer(SB);
67853b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  assert(FileID && "Could not create FileID for predefines?");
67953b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner
68053b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  // Start parsing the predefines.
68153b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner  EnterSourceFile(FileID, 0);
68253b0dabbe52219a8057659b90539837394ef0fa1Chris Lattner}
68397ba77cf09bf7b83b679165ce67ad7d49ffd568cChris Lattner
6845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
6865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Lexer Event Handling.
6875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
6885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// LookUpIdentifierInfo - Given a tok::identifier token, look up the
6905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// identifier information for the token and install it into the token.
691d217773f106856a11879ec79dc468efefaf2ee75Chris LattnerIdentifierInfo *Preprocessor::LookUpIdentifierInfo(Token &Identifier,
6925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                                   const char *BufPtr) {
69322f6bbcafa8871f4f20c4402d9cbc5c024fee99aChris Lattner  assert(Identifier.is(tok::identifier) && "Not an identifier!");
6945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(Identifier.getIdentifierInfo() == 0 && "Identinfo already exists!");
6955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Look up this token, see if it is a macro, or if it is a language keyword.
6975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo *II;
6985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (BufPtr && !Identifier.needsCleaning()) {
6995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // No cleaning needed, just use the characters from the lexed buffer.
7005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    II = getIdentifierInfo(BufPtr, BufPtr+Identifier.getLength());
7015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
7025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Cleaning needed, alloca a buffer, clean into it, then use the buffer.
703c35717a1b34269fc5d78226b1624f53e1c073ed6Chris Lattner    llvm::SmallVector<char, 64> IdentifierBuffer;
704c35717a1b34269fc5d78226b1624f53e1c073ed6Chris Lattner    IdentifierBuffer.resize(Identifier.getLength());
705c35717a1b34269fc5d78226b1624f53e1c073ed6Chris Lattner    const char *TmpBuf = &IdentifierBuffer[0];
7065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    unsigned Size = getSpelling(Identifier, TmpBuf);
7075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    II = getIdentifierInfo(TmpBuf, TmpBuf+Size);
7085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
7095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Identifier.setIdentifierInfo(II);
7105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return II;
7115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// HandleIdentifier - This callback is invoked when the lexer reads an
7155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// identifier.  This callback looks up the identifier in the map and/or
7165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// potentially macro expands it or turns it into a named token (like 'for').
717d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnervoid Preprocessor::HandleIdentifier(Token &Identifier) {
7185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(Identifier.getIdentifierInfo() &&
7195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer         "Can't handle identifiers without identifier info!");
7205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  IdentifierInfo &II = *Identifier.getIdentifierInfo();
7225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this identifier was poisoned, and if it was not produced from a macro
7245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // expansion, emit an error.
7251a531570d294ffc300cce1bc5e73de847a370f4fTed Kremenek  if (II.isPoisoned() && CurPPLexer) {
7265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (&II != Ident__VA_ARGS__)   // We warn about __VA_ARGS__ with poisoning.
7275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      Diag(Identifier, diag::err_pp_used_poisoned_id);
7285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else
7295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      Diag(Identifier, diag::ext_pp_bad_vaargs_use);
7305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
7315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this is a macro to be expanded, do it.
733cc1a875f94630e58d24a55577ffbf0e89b7da8c7Chris Lattner  if (MacroInfo *MI = getMacroInfo(&II)) {
7345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (!DisableMacroExpansion && !Identifier.isExpandDisabled()) {
7355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      if (MI->isEnabled()) {
7365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        if (!HandleMacroExpandedIdentifier(Identifier, MI))
7375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer          return;
7385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      } else {
7395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // C99 6.10.3.4p2 says that a disabled macro may never again be
7405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // expanded, even if it's in a context where it could be expanded in the
7415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // future.
742d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner        Identifier.setFlag(Token::DisableExpand);
7435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
7445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
7455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
7465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // C++ 2.11p2: If this is an alternative representation of a C++ operator,
7485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // then we act as if it is the actual operator and not the textual
7495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // representation of it.
7505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (II.isCPlusPlusOperatorKeyword())
7515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Identifier.setIdentifierInfo(0);
7525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Change the kind of this identifier to the appropriate token kind, e.g.
7545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // turning "for" into a keyword.
7555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Identifier.setKind(II.getTokenID());
7565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If this is an extension token, diagnose its use.
758b4eaf9cf5f79c86a3f7564f4dfdea57f165ca45cSteve Naroff  // We avoid diagnosing tokens that originate from macro definitions.
759b4eaf9cf5f79c86a3f7564f4dfdea57f165ca45cSteve Naroff  if (II.isExtensionToken() && Features.C99 && !DisableMacroExpansion)
7605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Diag(Identifier, diag::ext_token_used);
7615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
762