14 #ifndef LLVM_CLANG_LEX_PREPROCESSINGRECORD_H
15 #define LLVM_CLANG_LEX_PREPROCESSINGRECORD_H
20 #include "llvm/ADT/DenseMap.h"
21 #include "llvm/ADT/Optional.h"
22 #include "llvm/ADT/SmallVector.h"
23 #include "llvm/ADT/iterator.h"
24 #include "llvm/Support/Allocator.h"
25 #include "llvm/Support/Compiler.h"
31 class PreprocessingRecord;
36 unsigned alignment = 8)
throw();
43 class MacroDefinitionRecord;
83 : Kind(Kind), Range(Range) { }
102 unsigned alignment = 8)
throw() {
103 return ::operator
new(
bytes, PR, alignment);
106 void*
operator new(
size_t bytes,
void* mem)
throw() {
111 unsigned alignment)
throw() {
112 return ::operator
delete(ptr, PR, alignment);
116 void operator delete(
void*,
void*)
throw() { }
120 void*
operator new(
size_t bytes)
throw();
121 void operator delete(
void* data)
throw();
163 llvm::PointerUnion<IdentifierInfo *, MacroDefinitionRecord *> NameOrDef;
168 NameOrDef(BuiltinName) {}
220 unsigned InQuotes : 1;
229 unsigned ImportedModule : 1;
237 bool InQuotes,
bool ImportedModule,
278 virtual std::pair<unsigned, unsigned>
296 llvm::BumpPtrAllocator BumpAlloc;
300 std::vector<PreprocessedEntity *> PreprocessedEntities;
307 std::vector<PreprocessedEntity *> LoadedPreprocessedEntities;
310 std::vector<SourceRange> SkippedRanges;
323 explicit PPEntityID(
int ID) :
ID(ID) {}
326 PPEntityID() :
ID(0) {}
329 static PPEntityID getPPEntityID(
unsigned Index,
bool isLoaded) {
330 return isLoaded ? PPEntityID(-
int(Index)-1) : PPEntityID(Index+1);
334 llvm::DenseMap<const MacroInfo *, MacroDefinitionRecord *> MacroDefinitions;
347 unsigned getNumLoadedPreprocessedEntities()
const {
348 return LoadedPreprocessedEntities.size();
353 std::pair<unsigned, unsigned>
355 unsigned findBeginLocalPreprocessedEntity(
SourceLocation Loc)
const;
356 unsigned findEndLocalPreprocessedEntity(
SourceLocation Loc)
const;
362 unsigned allocateLoadedEntities(
unsigned NumEntities);
372 void *
Allocate(
unsigned Size,
unsigned Align = 8) {
373 return BumpAlloc.Allocate(Size, Align);
399 class iterator :
public llvm::iterator_adaptor_base<
400 iterator, int, std::random_access_iterator_tag,
401 PreprocessedEntity *, int, PreprocessedEntity *,
402 PreprocessedEntity *> {
406 : iterator::iterator_adaptor_base(Position), Self(Self) {}
413 bool isLoaded = this->I < 0;
414 unsigned Index = isLoaded ?
415 Self->LoadedPreprocessedEntities.size() + this->I : this->I;
416 PPEntityID
ID = Self->getPPEntityID(Index, isLoaded);
417 return Self->getPreprocessedEntity(ID);
424 return iterator(
this, -(
int)LoadedPreprocessedEntities.size());
429 return iterator(
this, PreprocessedEntities.size());
439 return iterator(
this, PreprocessedEntities.size());
446 unsigned end = start + count;
447 assert(end <= LoadedPreprocessedEntities.size());
448 return llvm::make_range(
449 iterator(
this,
int(start) - LoadedPreprocessedEntities.size()),
450 iterator(
this,
int(end) - LoadedPreprocessedEntities.size()));
458 llvm::iterator_range<iterator>
478 return ExternalSource;
487 return SkippedRanges;
496 StringRef FileName,
bool IsAngled,
498 const FileEntry *File, StringRef SearchPath,
499 StringRef RelativePath,
500 const Module *Imported)
override;
509 void SourceRangeSkipped(
SourceRange Range)
override;
521 std::pair<int, int> getPreprocessedEntitiesInRangeSlow(
SourceRange R);
529 unsigned alignment)
throw() {
530 return PR.Allocate(
bytes, alignment);
538 #endif // LLVM_CLANG_LEX_PREPROCESSINGRECORD_H
static bool classof(const PreprocessedEntity *PE)
MacroExpansion(MacroDefinitionRecord *Definition, SourceRange Range)
A description of the current definition of a macro.
Indicates a problem trying to load the preprocessed entity.
Base class that describes a preprocessed entity, which may be a preprocessor directive or macro expan...
virtual PreprocessedEntity * ReadPreprocessedEntity(unsigned Index)=0
Read a preallocated preprocessed entity from the external source.
const std::vector< SourceRange > & getSkippedRanges() const
Retrieve all ranges that got skipped while preprocessing.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range that covers this entire preprocessed entity.
iterator local_end()
End iterator for local, non-loaded, preprocessed entities.
StringRef getFileName() const
Retrieve the included file name as it was written in the source.
bool isBuiltinMacro() const
True if it is a builtin macro.
static StringRef bytes(const std::vector< T, Allocator > &v)
This interface provides a way to observe the actions of the preprocessor as it does its thing...
Records the presence of a preprocessor directive.
InclusionKind getKind() const
Determine what kind of inclusion directive this is.
Record the location of a macro definition.
bool wasInQuotes() const
Determine whether the included file name was written in quotes; otherwise, it was written in angle br...
Describes a module or submodule.
llvm::iterator_range< iterator > getPreprocessedEntitiesInRange(SourceRange R)
Returns a range of preprocessed entities that source range R encompasses.
EntityKind getKind() const
Retrieve the kind of preprocessed entity stored in this object.
A record of the steps taken while preprocessing a source file, including the various preprocessing di...
virtual std::pair< unsigned, unsigned > findPreprocessedEntitiesInRange(SourceRange Range)=0
Returns a pair of [Begin, End) indices of preallocated preprocessed entities that Range encompasses...
MacroDefinitionRecord * getDefinition() const
The definition of the macro being expanded. May return null if this is a builtin macro.
MacroExpansion(IdentifierInfo *BuiltinName, SourceRange Range)
SourceManager & getSourceManager() const
virtual ~ExternalPreprocessingRecordSource()
const FileEntry * getFile() const
Retrieve the file entry for the actual file that was included by this directive.
Records the location of a macro expansion.
PreprocessingRecord(SourceManager &SM)
Construct a new preprocessing record.
A GNU #include_next directive.
static bool classof(const PreprocessedEntity *PE)
std::pair< int, int > Result
ID
Defines the set of possible language-specific address spaces.
virtual Optional< bool > isPreprocessedEntityInFileID(unsigned Index, FileID FID)
Optionally returns true or false if the preallocated preprocessed entity with index Index came from f...
static bool classof(const PreprocessedEntity *PD)
StringRef getName() const
Return the actual identifier string.
void * Allocate(unsigned Size, unsigned Align=8)
Allocate memory in the preprocessing record.
Represents a character-granular source range.
PreprocessedEntity * operator->() const
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
bool importedModule() const
Determine whether the inclusion directive was automatically turned into a module import.
const IdentifierInfo * getName() const
The name of the macro being expanded.
Record the location of an inclusion directive, such as an #include or #import statement.
InclusionKind
The kind of inclusion directives known to the preprocessor.
llvm::iterator_range< iterator > getIteratorsForLoadedRange(unsigned start, unsigned count)
iterator range for the given range of loaded preprocessed entities.
ExternalPreprocessingRecordSource * getExternalSource() const
Retrieve the external source for preprocessed entities.
InclusionDirective(PreprocessingRecord &PPRec, InclusionKind Kind, StringRef FileName, bool InQuotes, bool ImportedModule, const FileEntry *File, SourceRange Range)
EntityKind
The kind of preprocessed entity an object describes.
Encapsulates changes to the "macros namespace" (the location where the macro name became active...
Encodes a location in the source. The SourceManager can decode this to get at the full include stack...
void Deallocate(void *Ptr)
Deallocate memory in the preprocessing record.
PreprocessedEntity(EntityKind Kind, SourceRange Range)
Cached information about one file (either on disk or in the virtual file system). ...
An abstract class that should be subclassed by any external source of preprocessing record entries...
MacroDefinitionRecord(const IdentifierInfo *Name, SourceRange Range)
SourceLocation getBegin() const
An inclusion directive, such as #include, #import, or #include_next.
bool isEntityInFileID(iterator PPEI, FileID FID)
Returns true if the preprocessed entity that PPEI iterator points to is coming from the file FID...
const IdentifierInfo * getName() const
Retrieve the name of the macro being defined.
A Clang #__include_macros directive.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
iterator end()
End iterator for all preprocessed entities.
static bool classof(const PreprocessedEntity *PE)
Reads an AST files chain containing the contents of a translation unit.
Encapsulates the data about a macro definition (e.g. its tokens).
PPEntityID addPreprocessedEntity(PreprocessedEntity *Entity)
Add a new preprocessed entity to this record.
An Objective-C #import directive.
size_t getTotalMemory() const
Defines the PPCallbacks interface.
Defines the clang::SourceLocation class and associated facilities.
PreprocessedEntity * operator*() const
iterator begin()
Begin iterator for all preprocessed entities.
PreprocessingDirective(EntityKind Kind, SourceRange Range)
Writes an AST file containing the contents of a translation unit.
SourceLocation getLocation() const
Retrieve the location of the macro name in the definition.
MacroDefinitionRecord * findMacroDefinition(const MacroInfo *MI)
Retrieve the macro definition that corresponds to the given MacroInfo.
void SetExternalSource(ExternalPreprocessingRecordSource &Source)
Set the external source for preprocessed entities.
A trivial tuple used to represent a source range.
This class handles loading and caching of source files into memory.
bool isInvalid() const
Returns true if there was a problem loading the preprocessed entity.
iterator local_begin()
Begin iterator for local, non-loaded, preprocessed entities.