14ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor//===--- PreprocessingRecord.cpp - Record of Preprocessing ------*- C++ -*-===//
24ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor//
34ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor//                     The LLVM Compiler Infrastructure
44ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor//
54ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor// This file is distributed under the University of Illinois Open Source
64ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor// License. See LICENSE.TXT for details.
74ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor//
84ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor//===----------------------------------------------------------------------===//
94ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor//
104ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor//  This file implements the PreprocessingRecord class, which maintains a record
114ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor//  of what occurred during preprocessing, and its helpers.
124ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor//
134ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor//===----------------------------------------------------------------------===//
144ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor#include "clang/Lex/PreprocessingRecord.h"
154ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor#include "clang/Lex/MacroInfo.h"
164ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor#include "clang/Lex/Token.h"
17e3c20a8cf8b5fdbd88c416a25452179a5a9f3b56Ted Kremenek#include "llvm/Support/Capacity.h"
1855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/ErrorHandling.h"
194ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor
204ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregorusing namespace clang;
214ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor
226a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas GregorExternalPreprocessingRecordSource::~ExternalPreprocessingRecordSource() { }
236a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
244ab829c2a229dc20ecb9f35e7337bbfa95bf4026Douglas Gregor
254ab829c2a229dc20ecb9f35e7337bbfa95bf4026Douglas GregorInclusionDirective::InclusionDirective(PreprocessingRecord &PPRec,
264ab829c2a229dc20ecb9f35e7337bbfa95bf4026Douglas Gregor                                       InclusionKind Kind,
275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                       StringRef FileName,
288dd927cf03e85b942f323eebb42e06c839887ebbArgyrios Kyrtzidis                                       bool InQuotes, bool ImportedModule,
298dd927cf03e85b942f323eebb42e06c839887ebbArgyrios Kyrtzidis                                       const FileEntry *File,
304ab829c2a229dc20ecb9f35e7337bbfa95bf4026Douglas Gregor                                       SourceRange Range)
314ab829c2a229dc20ecb9f35e7337bbfa95bf4026Douglas Gregor  : PreprocessingDirective(InclusionDirectiveKind, Range),
328dd927cf03e85b942f323eebb42e06c839887ebbArgyrios Kyrtzidis    InQuotes(InQuotes), Kind(Kind), ImportedModule(ImportedModule), File(File)
334ab829c2a229dc20ecb9f35e7337bbfa95bf4026Douglas Gregor{
344ab829c2a229dc20ecb9f35e7337bbfa95bf4026Douglas Gregor  char *Memory
354ab829c2a229dc20ecb9f35e7337bbfa95bf4026Douglas Gregor    = (char*)PPRec.Allocate(FileName.size() + 1, llvm::alignOf<char>());
364ab829c2a229dc20ecb9f35e7337bbfa95bf4026Douglas Gregor  memcpy(Memory, FileName.data(), FileName.size());
374ab829c2a229dc20ecb9f35e7337bbfa95bf4026Douglas Gregor  Memory[FileName.size()] = 0;
385f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  this->FileName = StringRef(Memory, FileName.size());
394ab829c2a229dc20ecb9f35e7337bbfa95bf4026Douglas Gregor}
404ab829c2a229dc20ecb9f35e7337bbfa95bf4026Douglas Gregor
4137ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios KyrtzidisPreprocessingRecord::PreprocessingRecord(SourceManager &SM)
42c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis  : SourceMgr(SM),
4337ed12720a35b7bfa1c4de73ad6f1c6c1c88ee17Argyrios Kyrtzidis    ExternalSource(0) {
446a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor}
456a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
462dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis/// \brief Returns a pair of [Begin, End) iterators of preprocessed entities
47cd6b34b8cd5f99450e32a32b1f1024324f3566e7James Dennett/// that source range \p Range encompasses.
482dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidisstd::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
492dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios KyrtzidisPreprocessingRecord::getPreprocessedEntitiesInRange(SourceRange Range) {
502dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  if (Range.isInvalid())
51f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    return std::make_pair(iterator(), iterator());
52f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
53f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  if (CachedRangeQuery.Range == Range) {
54f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    return std::make_pair(iterator(this, CachedRangeQuery.Result.first),
55f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis                          iterator(this, CachedRangeQuery.Result.second));
56f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  }
57f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
58f03b888a12ccff7d54ddd8a79a0141cf23adbf67Argyrios Kyrtzidis  std::pair<int, int> Res = getPreprocessedEntitiesInRangeSlow(Range);
59f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
60f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  CachedRangeQuery.Range = Range;
61f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  CachedRangeQuery.Result = Res;
62f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
63f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  return std::make_pair(iterator(this, Res.first), iterator(this, Res.second));
64f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis}
65f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
66f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidisstatic bool isPreprocessedEntityIfInFileID(PreprocessedEntity *PPE, FileID FID,
67f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis                                           SourceManager &SM) {
68f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  assert(!FID.isInvalid());
69f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  if (!PPE)
70f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    return false;
71f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
72f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  SourceLocation Loc = PPE->getSourceRange().getBegin();
73f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  if (Loc.isInvalid())
74f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    return false;
75f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
76f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  if (SM.isInFileID(SM.getFileLoc(Loc), FID))
77f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    return true;
78f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  else
79f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    return false;
80f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis}
812dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
82f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis/// \brief Returns true if the preprocessed entity that \arg PPEI iterator
83f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis/// points to is coming from the file \arg FID.
84f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis///
85f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis/// Can be used to avoid implicit deserializations of preallocated
86f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis/// preprocessed entities if we only care about entities of a specific file
87cd6b34b8cd5f99450e32a32b1f1024324f3566e7James Dennett/// and not from files \#included in the range given at
88f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis/// \see getPreprocessedEntitiesInRange.
89f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidisbool PreprocessingRecord::isEntityInFileID(iterator PPEI, FileID FID) {
90f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  if (FID.isInvalid())
91f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    return false;
92f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
93f03b888a12ccff7d54ddd8a79a0141cf23adbf67Argyrios Kyrtzidis  int Pos = PPEI.Position;
94f03b888a12ccff7d54ddd8a79a0141cf23adbf67Argyrios Kyrtzidis  if (Pos < 0) {
95064d88e0f9a3f1deca71b98931361f3f5c9ce192Argyrios Kyrtzidis    if (unsigned(-Pos-1) >= LoadedPreprocessedEntities.size()) {
96064d88e0f9a3f1deca71b98931361f3f5c9ce192Argyrios Kyrtzidis      assert(0 && "Out-of bounds loaded preprocessed entity");
97064d88e0f9a3f1deca71b98931361f3f5c9ce192Argyrios Kyrtzidis      return false;
98064d88e0f9a3f1deca71b98931361f3f5c9ce192Argyrios Kyrtzidis    }
99f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    assert(ExternalSource && "No external source to load from");
100f03b888a12ccff7d54ddd8a79a0141cf23adbf67Argyrios Kyrtzidis    unsigned LoadedIndex = LoadedPreprocessedEntities.size()+Pos;
101f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    if (PreprocessedEntity *PPE = LoadedPreprocessedEntities[LoadedIndex])
102f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis      return isPreprocessedEntityIfInFileID(PPE, FID, SourceMgr);
103f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
104f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    // See if the external source can see if the entity is in the file without
105f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    // deserializing it.
106dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie    Optional<bool> IsInFile =
107dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie        ExternalSource->isPreprocessedEntityInFileID(LoadedIndex, FID);
108f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    if (IsInFile.hasValue())
109f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis      return IsInFile.getValue();
110f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
111f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    // The external source did not provide a definite answer, go and deserialize
112f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    // the entity to check it.
113f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    return isPreprocessedEntityIfInFileID(
114f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis                                       getLoadedPreprocessedEntity(LoadedIndex),
115f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis                                          FID, SourceMgr);
116f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  }
117f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
118064d88e0f9a3f1deca71b98931361f3f5c9ce192Argyrios Kyrtzidis  if (unsigned(Pos) >= PreprocessedEntities.size()) {
119064d88e0f9a3f1deca71b98931361f3f5c9ce192Argyrios Kyrtzidis    assert(0 && "Out-of bounds local preprocessed entity");
120064d88e0f9a3f1deca71b98931361f3f5c9ce192Argyrios Kyrtzidis    return false;
121064d88e0f9a3f1deca71b98931361f3f5c9ce192Argyrios Kyrtzidis  }
122f03b888a12ccff7d54ddd8a79a0141cf23adbf67Argyrios Kyrtzidis  return isPreprocessedEntityIfInFileID(PreprocessedEntities[Pos],
123f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis                                        FID, SourceMgr);
124f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis}
125f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
126f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis/// \brief Returns a pair of [Begin, End) iterators of preprocessed entities
127f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis/// that source range \arg R encompasses.
128f03b888a12ccff7d54ddd8a79a0141cf23adbf67Argyrios Kyrtzidisstd::pair<int, int>
129f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios KyrtzidisPreprocessingRecord::getPreprocessedEntitiesInRangeSlow(SourceRange Range) {
130f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  assert(Range.isValid());
131f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
132f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
1332dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  std::pair<unsigned, unsigned>
1342dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    Local = findLocalPreprocessedEntitiesInRange(Range);
135f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
1362dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  // Check if range spans local entities.
1372dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  if (!ExternalSource || SourceMgr.isLocalSourceLocation(Range.getBegin()))
138f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    return std::make_pair(Local.first, Local.second);
139f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
1402dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  std::pair<unsigned, unsigned>
1412dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    Loaded = ExternalSource->findPreprocessedEntitiesInRange(Range);
142f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
1432dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  // Check if range spans local entities.
1442dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  if (Loaded.first == Loaded.second)
145f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    return std::make_pair(Local.first, Local.second);
146f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
1472dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  unsigned TotalLoaded = LoadedPreprocessedEntities.size();
148f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
1492dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  // Check if range spans loaded entities.
1502dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  if (Local.first == Local.second)
151f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis    return std::make_pair(int(Loaded.first)-TotalLoaded,
152f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis                          int(Loaded.second)-TotalLoaded);
153f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis
1542dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  // Range spands loaded and local entities.
155f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis  return std::make_pair(int(Loaded.first)-TotalLoaded, Local.second);
1562dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis}
1572dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
1582dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidisstd::pair<unsigned, unsigned>
1592dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios KyrtzidisPreprocessingRecord::findLocalPreprocessedEntitiesInRange(
1602dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis                                                      SourceRange Range) const {
1612dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  if (Range.isInvalid())
1622dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    return std::make_pair(0,0);
1632dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
1642dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
1652dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  unsigned Begin = findBeginLocalPreprocessedEntity(Range.getBegin());
1662dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  unsigned End = findEndLocalPreprocessedEntity(Range.getEnd());
1672dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  return std::make_pair(Begin, End);
1682dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis}
1692dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
1702dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidisnamespace {
1712dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
1722dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidistemplate <SourceLocation (SourceRange::*getRangeLoc)() const>
1732dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidisstruct PPEntityComp {
1742dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  const SourceManager &SM;
1752dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
1762dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  explicit PPEntityComp(const SourceManager &SM) : SM(SM) { }
1772dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
178196e71e1357b14076c42f4a3458e6ea71714eb06Benjamin Kramer  bool operator()(PreprocessedEntity *L, PreprocessedEntity *R) const {
179196e71e1357b14076c42f4a3458e6ea71714eb06Benjamin Kramer    SourceLocation LHS = getLoc(L);
180196e71e1357b14076c42f4a3458e6ea71714eb06Benjamin Kramer    SourceLocation RHS = getLoc(R);
181196e71e1357b14076c42f4a3458e6ea71714eb06Benjamin Kramer    return SM.isBeforeInTranslationUnit(LHS, RHS);
182196e71e1357b14076c42f4a3458e6ea71714eb06Benjamin Kramer  }
183196e71e1357b14076c42f4a3458e6ea71714eb06Benjamin Kramer
184196e71e1357b14076c42f4a3458e6ea71714eb06Benjamin Kramer  bool operator()(PreprocessedEntity *L, SourceLocation RHS) const {
1852dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    SourceLocation LHS = getLoc(L);
1862dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    return SM.isBeforeInTranslationUnit(LHS, RHS);
1872dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  }
1882dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
189196e71e1357b14076c42f4a3458e6ea71714eb06Benjamin Kramer  bool operator()(SourceLocation LHS, PreprocessedEntity *R) const {
1902dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    SourceLocation RHS = getLoc(R);
1912dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    return SM.isBeforeInTranslationUnit(LHS, RHS);
1922dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  }
1932dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
1942dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  SourceLocation getLoc(PreprocessedEntity *PPE) const {
1950e322ffdae588aa479ae077ea569803b24bbe63bArgyrios Kyrtzidis    SourceRange Range = PPE->getSourceRange();
1960e322ffdae588aa479ae077ea569803b24bbe63bArgyrios Kyrtzidis    return (Range.*getRangeLoc)();
1972dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  }
1982dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis};
1992dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
2002dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis}
2012dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
2022dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidisunsigned PreprocessingRecord::findBeginLocalPreprocessedEntity(
2032dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis                                                     SourceLocation Loc) const {
2042dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  if (SourceMgr.isLoadedSourceLocation(Loc))
2052dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    return 0;
2062dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
2074cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  size_t Count = PreprocessedEntities.size();
2084cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  size_t Half;
2092dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  std::vector<PreprocessedEntity *>::const_iterator
2104cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis    First = PreprocessedEntities.begin();
2114cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  std::vector<PreprocessedEntity *>::const_iterator I;
2124cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis
2134cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  // Do a binary search manually instead of using std::lower_bound because
2144cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  // The end locations of entities may be unordered (when a macro expansion
2154cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  // is inside another macro argument), but for this case it is not important
2164cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  // whether we get the first macro expansion or its containing macro.
2174cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  while (Count > 0) {
2184cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis    Half = Count/2;
2194cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis    I = First;
2204cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis    std::advance(I, Half);
2214cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis    if (SourceMgr.isBeforeInTranslationUnit((*I)->getSourceRange().getEnd(),
2224cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis                                            Loc)){
2234cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis      First = I;
2244cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis      ++First;
2254cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis      Count = Count - Half - 1;
2264cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis    } else
2274cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis      Count = Half;
2284cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  }
2294cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis
2304cd06348a8c7b3559e9f437439dfc75ff7a04e88Argyrios Kyrtzidis  return First - PreprocessedEntities.begin();
2312dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis}
2322dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
2332dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidisunsigned PreprocessingRecord::findEndLocalPreprocessedEntity(
2342dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis                                                     SourceLocation Loc) const {
2352dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  if (SourceMgr.isLoadedSourceLocation(Loc))
2362dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    return 0;
2372dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
2382dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  std::vector<PreprocessedEntity *>::const_iterator
2392dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  I = std::upper_bound(PreprocessedEntities.begin(),
2402dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis                       PreprocessedEntities.end(),
2412dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis                       Loc,
2422dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis                       PPEntityComp<&SourceRange::getBegin>(SourceMgr));
2432dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  return I - PreprocessedEntities.begin();
2442dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis}
2452dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis
246db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios KyrtzidisPreprocessingRecord::PPEntityID
247db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios KyrtzidisPreprocessingRecord::addPreprocessedEntity(PreprocessedEntity *Entity) {
2482502efd26196d5bbc1f320181aea765d469309b4Argyrios Kyrtzidis  assert(Entity);
249209dfbe638d8a2ea85eac255a919381962b80704Argyrios Kyrtzidis  SourceLocation BeginLoc = Entity->getSourceRange().getBegin();
250db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis
251d017e42af00c2e7c380d0f9b27c81734f4b2844eArgyrios Kyrtzidis  if (isa<MacroDefinition>(Entity)) {
252db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis    assert((PreprocessedEntities.empty() ||
253db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis            !SourceMgr.isBeforeInTranslationUnit(BeginLoc,
254db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis                   PreprocessedEntities.back()->getSourceRange().getBegin())) &&
255d017e42af00c2e7c380d0f9b27c81734f4b2844eArgyrios Kyrtzidis           "a macro definition was encountered out-of-order");
256db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis    PreprocessedEntities.push_back(Entity);
257db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis    return getPPEntityID(PreprocessedEntities.size()-1, /*isLoaded=*/false);
258db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis  }
259db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis
260209dfbe638d8a2ea85eac255a919381962b80704Argyrios Kyrtzidis  // Check normal case, this entity begin location is after the previous one.
261209dfbe638d8a2ea85eac255a919381962b80704Argyrios Kyrtzidis  if (PreprocessedEntities.empty() ||
262209dfbe638d8a2ea85eac255a919381962b80704Argyrios Kyrtzidis      !SourceMgr.isBeforeInTranslationUnit(BeginLoc,
263209dfbe638d8a2ea85eac255a919381962b80704Argyrios Kyrtzidis                   PreprocessedEntities.back()->getSourceRange().getBegin())) {
264209dfbe638d8a2ea85eac255a919381962b80704Argyrios Kyrtzidis    PreprocessedEntities.push_back(Entity);
265db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis    return getPPEntityID(PreprocessedEntities.size()-1, /*isLoaded=*/false);
266209dfbe638d8a2ea85eac255a919381962b80704Argyrios Kyrtzidis  }
267209dfbe638d8a2ea85eac255a919381962b80704Argyrios Kyrtzidis
268db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis  // The entity's location is not after the previous one; this can happen with
269db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis  // include directives that form the filename using macros, e.g:
270d017e42af00c2e7c380d0f9b27c81734f4b2844eArgyrios Kyrtzidis  // "#include MACRO(STUFF)"
271d017e42af00c2e7c380d0f9b27c81734f4b2844eArgyrios Kyrtzidis  // or with macro expansions inside macro arguments where the arguments are
272d017e42af00c2e7c380d0f9b27c81734f4b2844eArgyrios Kyrtzidis  // not expanded in the same order as listed, e.g:
273d017e42af00c2e7c380d0f9b27c81734f4b2844eArgyrios Kyrtzidis  // \code
274d017e42af00c2e7c380d0f9b27c81734f4b2844eArgyrios Kyrtzidis  //  #define M1 1
275d017e42af00c2e7c380d0f9b27c81734f4b2844eArgyrios Kyrtzidis  //  #define M2 2
276d017e42af00c2e7c380d0f9b27c81734f4b2844eArgyrios Kyrtzidis  //  #define FM(x,y) y x
277d017e42af00c2e7c380d0f9b27c81734f4b2844eArgyrios Kyrtzidis  //  FM(M1, M2)
278d017e42af00c2e7c380d0f9b27c81734f4b2844eArgyrios Kyrtzidis  // \endcode
279db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis
280db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis  typedef std::vector<PreprocessedEntity *>::iterator pp_iter;
281db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis
282db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis  // Usually there are few macro expansions when defining the filename, do a
283db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis  // linear search for a few entities.
284db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis  unsigned count = 0;
285db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis  for (pp_iter RI    = PreprocessedEntities.end(),
286db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis               Begin = PreprocessedEntities.begin();
287db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis       RI != Begin && count < 4; --RI, ++count) {
288db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis    pp_iter I = RI;
289209dfbe638d8a2ea85eac255a919381962b80704Argyrios Kyrtzidis    --I;
290209dfbe638d8a2ea85eac255a919381962b80704Argyrios Kyrtzidis    if (!SourceMgr.isBeforeInTranslationUnit(BeginLoc,
291209dfbe638d8a2ea85eac255a919381962b80704Argyrios Kyrtzidis                                           (*I)->getSourceRange().getBegin())) {
292db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis      pp_iter insertI = PreprocessedEntities.insert(RI, Entity);
293db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis      return getPPEntityID(insertI - PreprocessedEntities.begin(),
294db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis                           /*isLoaded=*/false);
295209dfbe638d8a2ea85eac255a919381962b80704Argyrios Kyrtzidis    }
296209dfbe638d8a2ea85eac255a919381962b80704Argyrios Kyrtzidis  }
297db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis
298db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis  // Linear search unsuccessful. Do a binary search.
299db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis  pp_iter I = std::upper_bound(PreprocessedEntities.begin(),
300db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis                               PreprocessedEntities.end(),
301db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis                               BeginLoc,
302db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis                               PPEntityComp<&SourceRange::getBegin>(SourceMgr));
303db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis  pp_iter insertI = PreprocessedEntities.insert(I, Entity);
304db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis  return getPPEntityID(insertI - PreprocessedEntities.begin(),
305db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis                       /*isLoaded=*/false);
3064ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor}
3074ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor
3086a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregorvoid PreprocessingRecord::SetExternalSource(
3094c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor                                    ExternalPreprocessingRecordSource &Source) {
3106a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor  assert(!ExternalSource &&
3116a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor         "Preprocessing record already has an external source");
3126a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor  ExternalSource = &Source;
3136a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor}
3146a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
3154c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregorunsigned PreprocessingRecord::allocateLoadedEntities(unsigned NumEntities) {
3164c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor  unsigned Result = LoadedPreprocessedEntities.size();
3174c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor  LoadedPreprocessedEntities.resize(LoadedPreprocessedEntities.size()
3184c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor                                    + NumEntities);
3194c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor  return Result;
3204c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor}
3214c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor
322e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidisvoid PreprocessingRecord::RegisterMacroDefinition(MacroInfo *Macro,
3230b849d34b3a9574615e98e108db4e8099e9032e0Argyrios Kyrtzidis                                                  MacroDefinition *Def) {
3240b849d34b3a9574615e98e108db4e8099e9032e0Argyrios Kyrtzidis  MacroDefinitions[Macro] = Def;
325e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis}
326e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis
327e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis/// \brief Retrieve the preprocessed entity at the given ID.
328e24692b30adbe8144597678a0e3354912e99c747Argyrios KyrtzidisPreprocessedEntity *PreprocessingRecord::getPreprocessedEntity(PPEntityID PPID){
329f03b888a12ccff7d54ddd8a79a0141cf23adbf67Argyrios Kyrtzidis  if (PPID.ID < 0) {
330f03b888a12ccff7d54ddd8a79a0141cf23adbf67Argyrios Kyrtzidis    unsigned Index = -PPID.ID - 1;
331f03b888a12ccff7d54ddd8a79a0141cf23adbf67Argyrios Kyrtzidis    assert(Index < LoadedPreprocessedEntities.size() &&
332e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis           "Out-of bounds loaded preprocessed entity");
333f03b888a12ccff7d54ddd8a79a0141cf23adbf67Argyrios Kyrtzidis    return getLoadedPreprocessedEntity(Index);
334e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis  }
335f03b888a12ccff7d54ddd8a79a0141cf23adbf67Argyrios Kyrtzidis
336f03b888a12ccff7d54ddd8a79a0141cf23adbf67Argyrios Kyrtzidis  if (PPID.ID == 0)
337f03b888a12ccff7d54ddd8a79a0141cf23adbf67Argyrios Kyrtzidis    return 0;
338f03b888a12ccff7d54ddd8a79a0141cf23adbf67Argyrios Kyrtzidis  unsigned Index = PPID.ID - 1;
339f03b888a12ccff7d54ddd8a79a0141cf23adbf67Argyrios Kyrtzidis  assert(Index < PreprocessedEntities.size() &&
340e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis         "Out-of bounds local preprocessed entity");
341f03b888a12ccff7d54ddd8a79a0141cf23adbf67Argyrios Kyrtzidis  return PreprocessedEntities[Index];
3426a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor}
3436a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
344e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis/// \brief Retrieve the loaded preprocessed entity at the given index.
345e24692b30adbe8144597678a0e3354912e99c747Argyrios KyrtzidisPreprocessedEntity *
346e24692b30adbe8144597678a0e3354912e99c747Argyrios KyrtzidisPreprocessingRecord::getLoadedPreprocessedEntity(unsigned Index) {
347e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis  assert(Index < LoadedPreprocessedEntities.size() &&
348e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis         "Out-of bounds loaded preprocessed entity");
349e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis  assert(ExternalSource && "No external source to load from");
350e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis  PreprocessedEntity *&Entity = LoadedPreprocessedEntities[Index];
351e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis  if (!Entity) {
352e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis    Entity = ExternalSource->ReadPreprocessedEntity(Index);
353e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis    if (!Entity) // Failed to load.
354e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis      Entity = new (*this)
355e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis         PreprocessedEntity(PreprocessedEntity::InvalidKind, SourceRange());
356e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis  }
357e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis  return Entity;
3586a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor}
3596a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
3601b058e8956ea29a7fb7649fdee2b80581dcbdf39Douglas GregorMacroDefinition *PreprocessingRecord::findMacroDefinition(const MacroInfo *MI) {
3610b849d34b3a9574615e98e108db4e8099e9032e0Argyrios Kyrtzidis  llvm::DenseMap<const MacroInfo *, MacroDefinition *>::iterator Pos
362b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor    = MacroDefinitions.find(MI);
363b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor  if (Pos == MacroDefinitions.end())
364b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor    return 0;
3650b849d34b3a9574615e98e108db4e8099e9032e0Argyrios Kyrtzidis
3660b849d34b3a9574615e98e108db4e8099e9032e0Argyrios Kyrtzidis  return Pos->second;
367b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor}
368b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor
3695f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidisvoid PreprocessingRecord::addMacroExpansion(const Token &Id,
3705f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidis                                            const MacroInfo *MI,
3715f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidis                                            SourceRange Range) {
372e1d4330adaaa7faf093e725c9c993207eb2d778aArgyrios Kyrtzidis  // We don't record nested macro expansions.
373e1d4330adaaa7faf093e725c9c993207eb2d778aArgyrios Kyrtzidis  if (Id.getLocation().isMacroID())
374dca8ee8b7bc86076916a3a80f553f7a4e98c14afDouglas Gregor    return;
375dca8ee8b7bc86076916a3a80f553f7a4e98c14afDouglas Gregor
3768f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis  if (MI->isBuiltinMacro())
3772dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    addPreprocessedEntity(
3788f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis                      new (*this) MacroExpansion(Id.getIdentifierInfo(),Range));
3798f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis  else if (MacroDefinition *Def = findMacroDefinition(MI))
3802dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis    addPreprocessedEntity(
3818f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis                       new (*this) MacroExpansion(Def, Range));
382b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor}
383b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor
3845f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidisvoid PreprocessingRecord::Ifdef(SourceLocation Loc, const Token &MacroNameTok,
385c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis                                const MacroDirective *MD) {
3865f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidis  // This is not actually a macro expansion but record it as a macro reference.
387c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis  if (MD)
388c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis    addMacroExpansion(MacroNameTok, MD->getMacroInfo(),
389c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis                      MacroNameTok.getLocation());
3905f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidis}
3915f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidis
3925f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidisvoid PreprocessingRecord::Ifndef(SourceLocation Loc, const Token &MacroNameTok,
393c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis                                 const MacroDirective *MD) {
3945f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidis  // This is not actually a macro expansion but record it as a macro reference.
395c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis  if (MD)
396c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis    addMacroExpansion(MacroNameTok, MD->getMacroInfo(),
397c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis                      MacroNameTok.getLocation());
3985f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidis}
3995f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidis
4005f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidisvoid PreprocessingRecord::Defined(const Token &MacroNameTok,
4016fb63ab0c74bb777772a3c3ecec09799e275599aJohn Thompson                                  const MacroDirective *MD,
4026fb63ab0c74bb777772a3c3ecec09799e275599aJohn Thompson                                  SourceRange Range) {
4035f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidis  // This is not actually a macro expansion but record it as a macro reference.
404c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis  if (MD)
405c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis    addMacroExpansion(MacroNameTok, MD->getMacroInfo(),
406c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis                      MacroNameTok.getLocation());
4075f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidis}
4085f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidis
409c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidisvoid PreprocessingRecord::MacroExpands(const Token &Id,const MacroDirective *MD,
410dd08a0c178329ec16cb9e494e6880f3991708b93Argyrios Kyrtzidis                                       SourceRange Range,
411dd08a0c178329ec16cb9e494e6880f3991708b93Argyrios Kyrtzidis                                       const MacroArgs *Args) {
412c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis  addMacroExpansion(Id, MD->getMacroInfo(), Range);
4135f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidis}
4145f5250b140544436eb3c2fbd9f43e14019ef01f2Argyrios Kyrtzidis
4152aa9267cf193e5eceb9fd24a51b51c031b606fe9Craig Silversteinvoid PreprocessingRecord::MacroDefined(const Token &Id,
416c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis                                       const MacroDirective *MD) {
417c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis  const MacroInfo *MI = MD->getMacroInfo();
418b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor  SourceRange R(MI->getDefinitionLoc(), MI->getDefinitionEndLoc());
419b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor  MacroDefinition *Def
420de4e0a8e57e643bbe78ad37ad6023c45a8a9f7e2Argyrios Kyrtzidis      = new (*this) MacroDefinition(Id.getIdentifierInfo(), R);
4210b849d34b3a9574615e98e108db4e8099e9032e0Argyrios Kyrtzidis  addPreprocessedEntity(Def);
4220b849d34b3a9574615e98e108db4e8099e9032e0Argyrios Kyrtzidis  MacroDefinitions[MI] = Def;
423b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor}
4246a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
4252aa9267cf193e5eceb9fd24a51b51c031b606fe9Craig Silversteinvoid PreprocessingRecord::MacroUndefined(const Token &Id,
426c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis                                         const MacroDirective *MD) {
42736845474e217b952c720f4f87923bc78059640c5Argyrios Kyrtzidis  // Note: MI may be null (when #undef'ining an undefined macro).
428c515978bd3a703aa733f846a0094ffa84d149074Argyrios Kyrtzidis  if (MD)
429c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis    MacroDefinitions.erase(MD->getMacroInfo());
4301b058e8956ea29a7fb7649fdee2b80581dcbdf39Douglas Gregor}
4311b058e8956ea29a7fb7649fdee2b80581dcbdf39Douglas Gregor
432b5142bb7af5c70fffd09f05172a1379a35a9c29aChandler Carruthvoid PreprocessingRecord::InclusionDirective(
433b5142bb7af5c70fffd09f05172a1379a35a9c29aChandler Carruth    SourceLocation HashLoc,
434b5142bb7af5c70fffd09f05172a1379a35a9c29aChandler Carruth    const clang::Token &IncludeTok,
4355f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef FileName,
436b5142bb7af5c70fffd09f05172a1379a35a9c29aChandler Carruth    bool IsAngled,
437da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis    CharSourceRange FilenameRange,
438b5142bb7af5c70fffd09f05172a1379a35a9c29aChandler Carruth    const FileEntry *File,
4395f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef SearchPath,
440f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis    StringRef RelativePath,
441f8afcffe6a0213760b64c211812b1750e1e1e967Argyrios Kyrtzidis    const Module *Imported) {
442ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor  InclusionDirective::InclusionKind Kind = InclusionDirective::Include;
443ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor
444ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor  switch (IncludeTok.getIdentifierInfo()->getPPKeywordID()) {
445ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor  case tok::pp_include:
446ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    Kind = InclusionDirective::Include;
447ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    break;
448ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor
449ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor  case tok::pp_import:
450ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    Kind = InclusionDirective::Import;
451ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    break;
452ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor
453ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor  case tok::pp_include_next:
454ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    Kind = InclusionDirective::IncludeNext;
455ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    break;
456ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor
457ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor  case tok::pp___include_macros:
458ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    Kind = InclusionDirective::IncludeMacros;
459ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    break;
460ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor
461ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor  default:
462ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor    llvm_unreachable("Unknown include directive kind");
463ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor  }
464da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis
465da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis  SourceLocation EndLoc;
466da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis  if (!IsAngled) {
467da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis    EndLoc = FilenameRange.getBegin();
468da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis  } else {
469da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis    EndLoc = FilenameRange.getEnd();
470da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis    if (FilenameRange.isCharRange())
471da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis      EndLoc = EndLoc.getLocWithOffset(-1); // the InclusionDirective expects
472da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis                                            // a token range.
473da313592441db36cf4b06be97c4bcc238ee6fa9cArgyrios Kyrtzidis  }
474ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor  clang::InclusionDirective *ID
4758dd927cf03e85b942f323eebb42e06c839887ebbArgyrios Kyrtzidis    = new (*this) clang::InclusionDirective(*this, Kind, FileName, !IsAngled,
4768dd927cf03e85b942f323eebb42e06c839887ebbArgyrios Kyrtzidis                                            (bool)Imported,
4774ab829c2a229dc20ecb9f35e7337bbfa95bf4026Douglas Gregor                                            File, SourceRange(HashLoc, EndLoc));
4782dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis  addPreprocessedEntity(ID);
479ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor}
48091d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek
48191d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremeneksize_t PreprocessingRecord::getTotalMemory() const {
48291d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek  return BumpAlloc.getTotalMemory()
483e3c20a8cf8b5fdbd88c416a25452179a5a9f3b56Ted Kremenek    + llvm::capacity_in_bytes(MacroDefinitions)
484e3c20a8cf8b5fdbd88c416a25452179a5a9f3b56Ted Kremenek    + llvm::capacity_in_bytes(PreprocessedEntities)
485e3c20a8cf8b5fdbd88c416a25452179a5a9f3b56Ted Kremenek    + llvm::capacity_in_bytes(LoadedPreprocessedEntities);
48691d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek}
487