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