14ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor//===--- PreprocessingRecord.h - 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 defines the PreprocessingRecord class, which maintains a record 114ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor// of what occurred during preprocessing. 124ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor// 134ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor//===----------------------------------------------------------------------===// 144ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor#ifndef LLVM_CLANG_LEX_PREPROCESSINGRECORD_H 154ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor#define LLVM_CLANG_LEX_PREPROCESSINGRECORD_H 164ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 17b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor#include "clang/Lex/PPCallbacks.h" 184ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor#include "clang/Basic/SourceLocation.h" 198f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis#include "clang/Basic/IdentifierTable.h" 20c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis#include "llvm/ADT/SmallVector.h" 21b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor#include "llvm/ADT/DenseMap.h" 22f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis#include "llvm/ADT/Optional.h" 234ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor#include "llvm/Support/Allocator.h" 24aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar#include "llvm/Support/Compiler.h" 254ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor#include <vector> 264ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 274ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregornamespace clang { 284ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor class IdentifierInfo; 294ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor class PreprocessingRecord; 304ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor} 314ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 324ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor/// \brief Allocates memory within a Clang preprocessing record. 334ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregorvoid* operator new(size_t bytes, clang::PreprocessingRecord& PR, 344ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor unsigned alignment = 8) throw(); 354ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 364ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor/// \brief Frees memory allocated in a Clang preprocessing record. 374ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregorvoid operator delete(void* ptr, clang::PreprocessingRecord& PR, 384ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor unsigned) throw(); 394ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 404ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregornamespace clang { 41bf7efa2742dc94363d3561d284c9d634fc5a780fDouglas Gregor class MacroDefinition; 42ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor class FileEntry; 43bf7efa2742dc94363d3561d284c9d634fc5a780fDouglas Gregor 444ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief Base class that describes a preprocessed entity, which may be a 459e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth /// preprocessor directive or macro expansion. 464ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor class PreprocessedEntity { 474ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor public: 484ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief The kind of preprocessed entity an object describes. 494ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor enum EntityKind { 50e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// \brief Indicates a problem trying to load the preprocessed entity. 51e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis InvalidKind, 52e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 539e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth /// \brief A macro expansion. 549e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth MacroExpansionKind, 554ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 565555bf78e0a76337f7149669723bf4f3f9ddbc1cArgyrios Kyrtzidis /// \defgroup Preprocessing directives 575555bf78e0a76337f7149669723bf4f3f9ddbc1cArgyrios Kyrtzidis /// @{ 584ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 594ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief A macro definition. 604ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor MacroDefinitionKind, 614ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 62809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett /// \brief An inclusion directive, such as \c \#include, \c 63809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett /// \#import, or \c \#include_next. 64ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor InclusionDirectiveKind, 65ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 665555bf78e0a76337f7149669723bf4f3f9ddbc1cArgyrios Kyrtzidis /// @} 675555bf78e0a76337f7149669723bf4f3f9ddbc1cArgyrios Kyrtzidis 685555bf78e0a76337f7149669723bf4f3f9ddbc1cArgyrios Kyrtzidis FirstPreprocessingDirective = MacroDefinitionKind, 69ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor LastPreprocessingDirective = InclusionDirectiveKind 704ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor }; 714ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 724ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor private: 734ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief The kind of preprocessed entity that this object describes. 744ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor EntityKind Kind; 754ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 764ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief The source range that covers this preprocessed entity. 774ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor SourceRange Range; 784ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 794ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor protected: 804ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor PreprocessedEntity(EntityKind Kind, SourceRange Range) 814ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor : Kind(Kind), Range(Range) { } 82e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 83e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis friend class PreprocessingRecord; 84e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 854ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor public: 864ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief Retrieve the kind of preprocessed entity stored in this object. 874ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor EntityKind getKind() const { return Kind; } 884ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 894ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief Retrieve the source range that covers this entire preprocessed 904ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// entity. 91aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar SourceRange getSourceRange() const LLVM_READONLY { return Range; } 92e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 93e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// \brief Returns true if there was a problem loading the preprocessed 94e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// entity. 95e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis bool isInvalid() const { return Kind == InvalidKind; } 96e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 974ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor // Implement isa/cast/dyncast/etc. 984ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor static bool classof(const PreprocessedEntity *) { return true; } 994ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 1004ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor // Only allow allocation of preprocessed entities using the allocator 1014ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor // in PreprocessingRecord or by doing a placement new. 1024ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor void* operator new(size_t bytes, PreprocessingRecord& PR, 1034ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor unsigned alignment = 8) throw() { 1044ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor return ::operator new(bytes, PR, alignment); 1054ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor } 1064ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 1074ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor void* operator new(size_t bytes, void* mem) throw() { 1084ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor return mem; 1094ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor } 1104ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 1114ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor void operator delete(void* ptr, PreprocessingRecord& PR, 1124ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor unsigned alignment) throw() { 1134ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor return ::operator delete(ptr, PR, alignment); 1144ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor } 1154ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 1164ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor void operator delete(void*, std::size_t) throw() { } 1174ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor void operator delete(void*, void*) throw() { } 1184ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 1194ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor private: 1204ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor // Make vanilla 'new' and 'delete' illegal for preprocessed entities. 1214ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor void* operator new(size_t bytes) throw(); 1224ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor void operator delete(void* data) throw(); 1234ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor }; 1244ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 1254ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief Records the presence of a preprocessor directive. 1264ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor class PreprocessingDirective : public PreprocessedEntity { 1274ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor public: 1284ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor PreprocessingDirective(EntityKind Kind, SourceRange Range) 1294ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor : PreprocessedEntity(Kind, Range) { } 1304ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 1314ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor // Implement isa/cast/dyncast/etc. 1324ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor static bool classof(const PreprocessedEntity *PD) { 1334ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor return PD->getKind() >= FirstPreprocessingDirective && 1344ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor PD->getKind() <= LastPreprocessingDirective; 1354ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor } 1364ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor static bool classof(const PreprocessingDirective *) { return true; } 1374ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor }; 1384ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 1394ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief Record the location of a macro definition. 1404ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor class MacroDefinition : public PreprocessingDirective { 1414ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief The name of the macro being defined. 1424ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor const IdentifierInfo *Name; 1434ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 1444ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor public: 145de4e0a8e57e643bbe78ad37ad6023c45a8a9f7e2Argyrios Kyrtzidis explicit MacroDefinition(const IdentifierInfo *Name, SourceRange Range) 146de4e0a8e57e643bbe78ad37ad6023c45a8a9f7e2Argyrios Kyrtzidis : PreprocessingDirective(MacroDefinitionKind, Range), Name(Name) { } 1474ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 1484ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief Retrieve the name of the macro being defined. 149572feb2a190b5e8b04fb06c4ac50ee0f61e93ff0Douglas Gregor const IdentifierInfo *getName() const { return Name; } 1504ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 1514ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief Retrieve the location of the macro name in the definition. 152de4e0a8e57e643bbe78ad37ad6023c45a8a9f7e2Argyrios Kyrtzidis SourceLocation getLocation() const { return getSourceRange().getBegin(); } 1534ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 1544ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor // Implement isa/cast/dyncast/etc. 155572feb2a190b5e8b04fb06c4ac50ee0f61e93ff0Douglas Gregor static bool classof(const PreprocessedEntity *PE) { 156572feb2a190b5e8b04fb06c4ac50ee0f61e93ff0Douglas Gregor return PE->getKind() == MacroDefinitionKind; 1574ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor } 1584ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor static bool classof(const MacroDefinition *) { return true; } 1594ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor }; 1608f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis 1618f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis /// \brief Records the location of a macro expansion. 1628f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis class MacroExpansion : public PreprocessedEntity { 1638f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis /// \brief The definition of this macro or the name of the macro if it is 1648f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis /// a builtin macro. 1658f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis llvm::PointerUnion<IdentifierInfo *, MacroDefinition *> NameOrDef; 1668f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis 1678f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis public: 1688f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis MacroExpansion(IdentifierInfo *BuiltinName, SourceRange Range) 1698f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis : PreprocessedEntity(MacroExpansionKind, Range), 1708f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis NameOrDef(BuiltinName) { } 1718f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis 1728f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis MacroExpansion(MacroDefinition *Definition, SourceRange Range) 1738f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis : PreprocessedEntity(MacroExpansionKind, Range), 1748f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis NameOrDef(Definition) { } 1758f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis 1768f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis /// \brief True if it is a builtin macro. 1778f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis bool isBuiltinMacro() const { return NameOrDef.is<IdentifierInfo *>(); } 1788f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis 1798f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis /// \brief The name of the macro being expanded. 1808f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis const IdentifierInfo *getName() const { 1818f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis if (MacroDefinition *Def = getDefinition()) 1828f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis return Def->getName(); 1838f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis return NameOrDef.get<IdentifierInfo*>(); 1848f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis } 1858f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis 1868f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis /// \brief The definition of the macro being expanded. May return null if 1878f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis /// this is a builtin macro. 1888f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis MacroDefinition *getDefinition() const { 1898f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis return NameOrDef.dyn_cast<MacroDefinition *>(); 1908f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis } 1918f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis 1928f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis // Implement isa/cast/dyncast/etc. 1938f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis static bool classof(const PreprocessedEntity *PE) { 1948f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis return PE->getKind() == MacroExpansionKind; 1958f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis } 1968f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis static bool classof(const MacroExpansion *) { return true; } 1978f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis }; 198ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 199ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// \brief Record the location of an inclusion directive, such as an 200809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett /// \c \#include or \c \#import statement. 201ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor class InclusionDirective : public PreprocessingDirective { 202ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor public: 203ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// \brief The kind of inclusion directives known to the 204ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// preprocessor. 205ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor enum InclusionKind { 206809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett /// \brief An \c \#include directive. 207ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor Include, 208809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett /// \brief An Objective-C \c \#import directive. 209ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor Import, 210809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett /// \brief A GNU \c \#include_next directive. 211ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor IncludeNext, 212809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett /// \brief A Clang \c \#__include_macros directive. 213ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor IncludeMacros 214ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor }; 215ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 216ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor private: 217ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// \brief The name of the file that was included, as written in 218ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// the source. 219686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef FileName; 220ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 221ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// \brief Whether the file name was in quotation marks; otherwise, it was 222ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// in angle brackets. 223ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor unsigned InQuotes : 1; 224ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 225ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// \brief The kind of inclusion directive we have. 226ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// 227ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// This is a value of type InclusionKind. 228ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor unsigned Kind : 2; 229ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 230ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// \brief The file that was included. 231ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor const FileEntry *File; 232ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 233ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor public: 2344ab829c2a229dc20ecb9f35e7337bbfa95bf4026Douglas Gregor InclusionDirective(PreprocessingRecord &PPRec, 235686775deca8b8685eb90801495880e3abdd844c2Chris Lattner InclusionKind Kind, StringRef FileName, 2364ab829c2a229dc20ecb9f35e7337bbfa95bf4026Douglas Gregor bool InQuotes, const FileEntry *File, SourceRange Range); 237ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 238ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// \brief Determine what kind of inclusion directive this is. 239ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor InclusionKind getKind() const { return static_cast<InclusionKind>(Kind); } 240ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 241ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// \brief Retrieve the included file name as it was written in the source. 242686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef getFileName() const { return FileName; } 243ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 244ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// \brief Determine whether the included file name was written in quotes; 245ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// otherwise, it was written in angle brackets. 246ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor bool wasInQuotes() const { return InQuotes; } 247ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 248ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// \brief Retrieve the file entry for the actual file that was included 249ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor /// by this directive. 250ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor const FileEntry *getFile() const { return File; } 251ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 252ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor // Implement isa/cast/dyncast/etc. 253ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor static bool classof(const PreprocessedEntity *PE) { 254ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor return PE->getKind() == InclusionDirectiveKind; 255ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor } 256ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor static bool classof(const InclusionDirective *) { return true; } 257ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor }; 2586a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 2596a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor /// \brief An abstract class that should be subclassed by any external source 2606a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor /// of preprocessing record entries. 2616a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor class ExternalPreprocessingRecordSource { 2626a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor public: 2636a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor virtual ~ExternalPreprocessingRecordSource(); 2644ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 265e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// \brief Read a preallocated preprocessed entity from the external source. 266e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// 267e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// \returns null if an error occurred that prevented the preprocessed 268e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// entity from being loaded. 269e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis virtual PreprocessedEntity *ReadPreprocessedEntity(unsigned Index) = 0; 270e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 2712dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis /// \brief Returns a pair of [Begin, End) indices of preallocated 2722dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis /// preprocessed entities that \arg Range encompasses. 2732dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis virtual std::pair<unsigned, unsigned> 2742dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis findPreprocessedEntitiesInRange(SourceRange Range) = 0; 275f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis 276f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis /// \brief Optionally returns true or false if the preallocated preprocessed 277f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis /// entity with index \arg Index came from file \arg FID. 278f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis virtual llvm::Optional<bool> isPreprocessedEntityInFileID(unsigned Index, 279f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis FileID FID) { 280f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis return llvm::Optional<bool>(); 281f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis } 2826a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor }; 2836a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 2844ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief A record of the steps taken while preprocessing a source file, 2854ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// including the various preprocessing directives processed, macros 2869e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth /// expanded, etc. 287b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor class PreprocessingRecord : public PPCallbacks { 2882dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis SourceManager &SourceMgr; 289dca8ee8b7bc86076916a3a80f553f7a4e98c14afDouglas Gregor 2904ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief Allocator used to store preprocessing objects. 2914ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor llvm::BumpPtrAllocator BumpAlloc; 2924ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 2934ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief The set of preprocessed entities in this record, in order they 2944ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// were seen. 2954ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor std::vector<PreprocessedEntity *> PreprocessedEntities; 2964ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 2974c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// \brief The set of preprocessed entities in this record that have been 2984c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// loaded from external sources. 2994c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// 3004c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// The entries in this vector are loaded lazily from the external source, 3014c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// and are referenced by the iterator using negative indices. 3024c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor std::vector<PreprocessedEntity *> LoadedPreprocessedEntities; 303e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 304c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis bool RecordCondDirectives; 305c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis unsigned CondDirectiveNextIdx; 306c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis SmallVector<unsigned, 6> CondDirectiveStack; 307c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis 308c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis class CondDirectiveLoc { 309c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis SourceLocation Loc; 310c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis unsigned Idx; 311c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis 312c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis public: 313c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis CondDirectiveLoc(SourceLocation Loc, unsigned Idx) : Loc(Loc), Idx(Idx) {} 314c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis 315c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis SourceLocation getLoc() const { return Loc; } 316c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis unsigned getIdx() const { return Idx; } 317c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis 318c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis class Comp { 319c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis SourceManager &SM; 320c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis public: 321c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis explicit Comp(SourceManager &SM) : SM(SM) {} 322c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis bool operator()(const CondDirectiveLoc &LHS, 323c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis const CondDirectiveLoc &RHS) { 324c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis return SM.isBeforeInTranslationUnit(LHS.getLoc(), RHS.getLoc()); 325c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis } 326c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis bool operator()(const CondDirectiveLoc &LHS, SourceLocation RHS) { 327c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis return SM.isBeforeInTranslationUnit(LHS.getLoc(), RHS); 328c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis } 329c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis bool operator()(SourceLocation LHS, const CondDirectiveLoc &RHS) { 330c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis return SM.isBeforeInTranslationUnit(LHS, RHS.getLoc()); 331c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis } 332c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis }; 333c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis }; 334c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis 335c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis typedef std::vector<CondDirectiveLoc> CondDirectiveLocsTy; 336c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis /// \brief The locations of conditional directives in source order. 337c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis CondDirectiveLocsTy CondDirectiveLocs; 338c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis 339c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis void addCondDirectiveLoc(CondDirectiveLoc DirLoc); 340c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis unsigned findCondDirectiveIdx(SourceLocation Loc) const; 341c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis 342e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// \brief Global (loaded or local) ID for a preprocessed entity. 343e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// Negative values are used to indicate preprocessed entities 344e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// loaded from the external source while non-negative values are used to 345e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// indicate preprocessed entities introduced by the current preprocessor. 346e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// If M is the number of loaded preprocessed entities, value -M 347e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// corresponds to element 0 in the loaded entities vector, position -M+1 348e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// corresponds to element 1 in the loaded entities vector, etc. 349e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis typedef int PPEntityID; 350e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 351e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis PPEntityID getPPEntityID(unsigned Index, bool isLoaded) const { 352e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis return isLoaded ? PPEntityID(Index) - LoadedPreprocessedEntities.size() 353e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis : Index; 354e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis } 355e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 356b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor /// \brief Mapping from MacroInfo structures to their definitions. 357e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis llvm::DenseMap<const MacroInfo *, PPEntityID> MacroDefinitions; 358b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor 3596a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor /// \brief External source of preprocessed entities. 3606a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor ExternalPreprocessingRecordSource *ExternalSource; 361e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 362e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// \brief Retrieve the preprocessed entity at the given ID. 363e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis PreprocessedEntity *getPreprocessedEntity(PPEntityID PPID); 364e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 365e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// \brief Retrieve the loaded preprocessed entity at the given index. 366e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis PreprocessedEntity *getLoadedPreprocessedEntity(unsigned Index); 3676a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 368e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// \brief Determine the number of preprocessed entities that were 369e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// loaded (or can be loaded) from an external source. 370e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis unsigned getNumLoadedPreprocessedEntities() const { 371e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis return LoadedPreprocessedEntities.size(); 372e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis } 3732dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis 3742dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis /// \brief Returns a pair of [Begin, End) indices of local preprocessed 3752dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis /// entities that \arg Range encompasses. 3762dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis std::pair<unsigned, unsigned> 3772dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis findLocalPreprocessedEntitiesInRange(SourceRange Range) const; 3782dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis unsigned findBeginLocalPreprocessedEntity(SourceLocation Loc) const; 3792dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis unsigned findEndLocalPreprocessedEntity(SourceLocation Loc) const; 3802dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis 381e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// \brief Allocate space for a new set of loaded preprocessed entities. 382e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// 383e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// \returns The index into the set of loaded preprocessed entities, which 384e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// corresponds to the first newly-allocated entity. 385e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis unsigned allocateLoadedEntities(unsigned NumEntities); 386e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 387e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /// \brief Register a new macro definition. 388e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis void RegisterMacroDefinition(MacroInfo *Macro, PPEntityID PPID); 3896a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 3904ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor public: 3914c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// \brief Construct a new preprocessing record. 392c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis PreprocessingRecord(SourceManager &SM, bool RecordConditionalDirectives); 3936a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 3944ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief Allocate memory in the preprocessing record. 3954ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor void *Allocate(unsigned Size, unsigned Align = 8) { 3964ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor return BumpAlloc.Allocate(Size, Align); 3974ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor } 3984ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 3994ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief Deallocate memory in the preprocessing record. 4004ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor void Deallocate(void *Ptr) { } 40191d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek 40291d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek size_t getTotalMemory() const; 40391d1bd6ede1d101a2e49719250c33154b39e0016Ted Kremenek 4042dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis SourceManager &getSourceManager() const { return SourceMgr; } 4052dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis 4064ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor // Iteration over the preprocessed entities. 4074c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor class iterator { 4084c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor PreprocessingRecord *Self; 4094c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 4104c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// \brief Position within the preprocessed entity sequence. 4114c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// 4124c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// In a complete iteration, the Position field walks the range [-M, N), 4134c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// where negative values are used to indicate preprocessed entities 4144c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// loaded from the external source while non-negative values are used to 4154c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// indicate preprocessed entities introduced by the current preprocessor. 4164c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// However, to provide iteration in source order (for, e.g., chained 4174c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// precompiled headers), dereferencing the iterator flips the negative 4184c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// values (corresponding to loaded entities), so that position -M 4194c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// corresponds to element 0 in the loaded entities vector, position -M+1 4204c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// corresponds to element 1 in the loaded entities vector, etc. This 4214c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor /// gives us a reasonably efficient, source-order walk. 422e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis PPEntityID Position; 4234c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 4244c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor public: 4254c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor typedef PreprocessedEntity *value_type; 4264c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor typedef value_type& reference; 4274c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor typedef value_type* pointer; 4284c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor typedef std::random_access_iterator_tag iterator_category; 4294c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor typedef int difference_type; 4304c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 4314c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor iterator() : Self(0), Position(0) { } 4324c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 433f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis iterator(PreprocessingRecord *Self, PPEntityID Position) 4344c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor : Self(Self), Position(Position) { } 4354c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 436e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis value_type operator*() const { 437e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis return Self->getPreprocessedEntity(Position); 438a3e9a969fd25022805a9e0ad827f3729286f6d58Argyrios Kyrtzidis } 4394c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 440e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis value_type operator[](difference_type D) { 4414c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor return *(*this + D); 4424c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor } 4434c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 4444c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor iterator &operator++() { 4454c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor ++Position; 4464c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor return *this; 4474c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor } 4484c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 4494c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor iterator operator++(int) { 4504c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor iterator Prev(*this); 4514c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor ++Position; 4524c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor return Prev; 4534c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor } 4544c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 4554c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor iterator &operator--() { 4564c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor --Position; 4574c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor return *this; 4584c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor } 4594c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 4604c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor iterator operator--(int) { 4614c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor iterator Prev(*this); 4624c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor --Position; 4634c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor return Prev; 4644c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor } 4654c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 4664c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor friend bool operator==(const iterator &X, const iterator &Y) { 4674c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor return X.Position == Y.Position; 4684c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor } 4694c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 47067029567f7d39d9356fbc505fffc2c1e21bf06ceDouglas Gregor friend bool operator!=(const iterator &X, const iterator &Y) { 47167029567f7d39d9356fbc505fffc2c1e21bf06ceDouglas Gregor return X.Position != Y.Position; 47267029567f7d39d9356fbc505fffc2c1e21bf06ceDouglas Gregor } 47367029567f7d39d9356fbc505fffc2c1e21bf06ceDouglas Gregor 4748d366c0e347ab600ac09e2ba9b676d12017a448aFrancois Pichet friend bool operator<(const iterator &X, const iterator &Y) { 4758d366c0e347ab600ac09e2ba9b676d12017a448aFrancois Pichet return X.Position < Y.Position; 4768d366c0e347ab600ac09e2ba9b676d12017a448aFrancois Pichet } 4778d366c0e347ab600ac09e2ba9b676d12017a448aFrancois Pichet 47867029567f7d39d9356fbc505fffc2c1e21bf06ceDouglas Gregor friend bool operator>(const iterator &X, const iterator &Y) { 47967029567f7d39d9356fbc505fffc2c1e21bf06ceDouglas Gregor return X.Position > Y.Position; 48067029567f7d39d9356fbc505fffc2c1e21bf06ceDouglas Gregor } 48167029567f7d39d9356fbc505fffc2c1e21bf06ceDouglas Gregor 48267029567f7d39d9356fbc505fffc2c1e21bf06ceDouglas Gregor friend bool operator<=(const iterator &X, const iterator &Y) { 48367029567f7d39d9356fbc505fffc2c1e21bf06ceDouglas Gregor return X.Position < Y.Position; 4844c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor } 4854c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 48667029567f7d39d9356fbc505fffc2c1e21bf06ceDouglas Gregor friend bool operator>=(const iterator &X, const iterator &Y) { 48767029567f7d39d9356fbc505fffc2c1e21bf06ceDouglas Gregor return X.Position > Y.Position; 48867029567f7d39d9356fbc505fffc2c1e21bf06ceDouglas Gregor } 48967029567f7d39d9356fbc505fffc2c1e21bf06ceDouglas Gregor 4904c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor friend iterator& operator+=(iterator &X, difference_type D) { 4914c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor X.Position += D; 4924c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor return X; 4934c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor } 4944c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 4954c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor friend iterator& operator-=(iterator &X, difference_type D) { 4964c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor X.Position -= D; 4974c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor return X; 4984c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor } 4994c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 5004c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor friend iterator operator+(iterator X, difference_type D) { 5014c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor X.Position += D; 5024c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor return X; 5034c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor } 5044c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 5054c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor friend iterator operator+(difference_type D, iterator X) { 5064c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor X.Position += D; 5074c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor return X; 5084c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor } 5094c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 5104c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor friend difference_type operator-(const iterator &X, const iterator &Y) { 5114c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor return X.Position - Y.Position; 5124c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor } 5131a23f12e1e283384b76e768a83f01bfcbbd61ca0Douglas Gregor 5141a23f12e1e283384b76e768a83f01bfcbbd61ca0Douglas Gregor friend iterator operator-(iterator X, difference_type D) { 5151a23f12e1e283384b76e768a83f01bfcbbd61ca0Douglas Gregor X.Position -= D; 5161a23f12e1e283384b76e768a83f01bfcbbd61ca0Douglas Gregor return X; 5171a23f12e1e283384b76e768a83f01bfcbbd61ca0Douglas Gregor } 518f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis friend class PreprocessingRecord; 5194c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor }; 5204c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor friend class iterator; 521b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis 522b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis /// \brief Begin iterator for all preprocessed entities. 523b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis iterator begin() { 524b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis return iterator(this, -(int)LoadedPreprocessedEntities.size()); 525b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis } 526b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis 527b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis /// \brief End iterator for all preprocessed entities. 528b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis iterator end() { 529b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis return iterator(this, PreprocessedEntities.size()); 530b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis } 531b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis 532b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis /// \brief Begin iterator for local, non-loaded, preprocessed entities. 533b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis iterator local_begin() { 534b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis return iterator(this, 0); 535b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis } 536b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis 537b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis /// \brief End iterator for local, non-loaded, preprocessed entities. 538b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis iterator local_end() { 539b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis return iterator(this, PreprocessedEntities.size()); 540b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis } 5410a480293f726508ad9aed0be39e8c9779e84f2f2Douglas Gregor 5422dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis /// \brief Returns a pair of [Begin, End) iterators of preprocessed entities 5432dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis /// that source range \arg R encompasses. 544f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis /// 545f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis /// \param R the range to look for preprocessed entities. 546f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis /// 5472dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis std::pair<iterator, iterator> getPreprocessedEntitiesInRange(SourceRange R); 5482dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis 549f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis /// \brief Returns true if the preprocessed entity that \arg PPEI iterator 550f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis /// points to is coming from the file \arg FID. 551f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis /// 552f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis /// Can be used to avoid implicit deserializations of preallocated 553f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis /// preprocessed entities if we only care about entities of a specific file 554809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett /// and not from files \#included in the range given at 555f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis /// \see getPreprocessedEntitiesInRange. 556f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis bool isEntityInFileID(iterator PPEI, FileID FID); 557f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis 5584ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor /// \brief Add a new preprocessed entity to this record. 559db81d38d9cd468a9eeffe8ab092be4d48e43888eArgyrios Kyrtzidis PPEntityID addPreprocessedEntity(PreprocessedEntity *Entity); 560c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis 561c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis /// \brief Returns true if this PreprocessingRecord is keeping track of 562c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis /// conditional directives locations. 563c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis bool isRecordingConditionalDirectives() const { 564c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis return RecordCondDirectives; 565c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis } 566c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis 567c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis /// \brief Returns true if the given range intersects with a conditional 568809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett /// directive. if a \#if/\#endif block is fully contained within the range, 569c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis /// this function will return false. 570c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis bool rangeIntersectsConditionalDirective(SourceRange Range) const; 571c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis 572c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis /// \brief Returns true if the given locations are in different regions, 573c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis /// separated by conditional directive blocks. 574c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis bool areInDifferentConditionalDirectiveRegion(SourceLocation LHS, 575c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis SourceLocation RHS) const { 576c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis return findCondDirectiveIdx(LHS) != findCondDirectiveIdx(RHS); 577c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis } 578c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis 5796a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor /// \brief Set the external source for preprocessed entities. 5804c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor void SetExternalSource(ExternalPreprocessingRecordSource &Source); 581b57a624f22b1efa873e0abac78128b69fba3d486Sebastian Redl 58289d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor /// \brief Retrieve the external source for preprocessed entities. 58389d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor ExternalPreprocessingRecordSource *getExternalSource() const { 58489d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor return ExternalSource; 58589d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor } 58689d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor 587b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor /// \brief Retrieve the macro definition that corresponds to the given 588b9e1b75772db2c7db566c6034ba90a07f22e35ebDouglas Gregor /// \c MacroInfo. 5891b058e8956ea29a7fb7649fdee2b80581dcbdf39Douglas Gregor MacroDefinition *findMacroDefinition(const MacroInfo *MI); 5904c30bb148b53c8063e940ca3e049ba4d270dc9d5Douglas Gregor 591c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis private: 5921b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis virtual void MacroExpands(const Token &Id, const MacroInfo* MI, 5931b2d53647dda5e4a70cea54ec3bedbf167081120Argyrios Kyrtzidis SourceRange Range); 5942aa9267cf193e5eceb9fd24a51b51c031b606fe9Craig Silverstein virtual void MacroDefined(const Token &Id, const MacroInfo *MI); 5952aa9267cf193e5eceb9fd24a51b51c031b606fe9Craig Silverstein virtual void MacroUndefined(const Token &Id, const MacroInfo *MI); 596ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor virtual void InclusionDirective(SourceLocation HashLoc, 597ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor const Token &IncludeTok, 598686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef FileName, 599ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor bool IsAngled, 600ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor const FileEntry *File, 601b5142bb7af5c70fffd09f05172a1379a35a9c29aChandler Carruth SourceLocation EndLoc, 602686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef SearchPath, 603686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef RelativePath); 604c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis virtual void If(SourceLocation Loc, SourceRange ConditionRange); 605c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis virtual void Elif(SourceLocation Loc, SourceRange ConditionRange, 606c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis SourceLocation IfLoc); 607c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis virtual void Ifdef(SourceLocation Loc, const Token &MacroNameTok); 608c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis virtual void Ifndef(SourceLocation Loc, const Token &MacroNameTok); 609c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis virtual void Else(SourceLocation Loc, SourceLocation IfLoc); 610c6c54521f95760a5eaf29b668d4bf41fe2af49d7Argyrios Kyrtzidis virtual void Endif(SourceLocation Loc, SourceLocation IfLoc); 611e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 612f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis /// \brief Cached result of the last \see getPreprocessedEntitiesInRange 613f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis /// query. 614f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis struct { 615f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis SourceRange Range; 616f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis std::pair<PPEntityID, PPEntityID> Result; 617f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis } CachedRangeQuery; 618f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis 619f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis std::pair<PPEntityID, PPEntityID> 620f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis getPreprocessedEntitiesInRangeSlow(SourceRange R); 621f226ff9fe8c8db6c5b74a61ce649eda1491c3502Argyrios Kyrtzidis 622e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis friend class ASTReader; 623e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis friend class ASTWriter; 6244ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor }; 6254ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor} // end namespace clang 6264ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 6274ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregorinline void* operator new(size_t bytes, clang::PreprocessingRecord& PR, 6284ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor unsigned alignment) throw() { 6294ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor return PR.Allocate(bytes, alignment); 6304ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor} 6314ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 6324ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregorinline void operator delete(void* ptr, clang::PreprocessingRecord& PR, 6334ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor unsigned) throw() { 6344ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor PR.Deallocate(ptr); 6354ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor} 6364ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor 6374ae8f298b1ea51b4c2234f9148e2e4349c9bdd23Douglas Gregor#endif // LLVM_CLANG_LEX_PREPROCESSINGRECORD_H 638