15 #ifndef LLVM_CLANG_LEX_PREPROCESSINGRECORD_H 16 #define LLVM_CLANG_LEX_PREPROCESSINGRECORD_H 21 #include "llvm/ADT/DenseMap.h" 22 #include "llvm/ADT/None.h" 23 #include "llvm/ADT/Optional.h" 24 #include "llvm/ADT/PointerUnion.h" 25 #include "llvm/ADT/StringRef.h" 26 #include "llvm/ADT/iterator.h" 27 #include "llvm/ADT/iterator_range.h" 28 #include "llvm/Support/Allocator.h" 29 #include "llvm/Support/Compiler.h" 38 class PreprocessingRecord;
44 unsigned alignment = 8) noexcept;
97 : Kind(Kind), Range(Range) {}
114 unsigned alignment = 8) noexcept {
115 return ::operator
new(
bytes, PR, alignment);
118 void *
operator new(
size_t bytes,
void *mem) noexcept {
return mem; }
121 unsigned alignment) noexcept {
122 return ::operator
delete(ptr, PR, alignment);
126 void operator delete(
void *,
void *) noexcept {}
130 void *
operator new(
size_t bytes) noexcept;
131 void operator delete(
void *data) noexcept;
173 llvm::PointerUnion<IdentifierInfo *, MacroDefinitionRecord *> NameOrDef;
178 NameOrDef(BuiltinName) {}
233 unsigned InQuotes : 1;
242 unsigned ImportedModule : 1;
250 bool InQuotes,
bool ImportedModule,
291 virtual std::pair<unsigned, unsigned>
292 findPreprocessedEntitiesInRange(
SourceRange Range) = 0;
309 llvm::BumpPtrAllocator BumpAlloc;
313 std::vector<PreprocessedEntity *> PreprocessedEntities;
320 std::vector<PreprocessedEntity *> LoadedPreprocessedEntities;
323 std::vector<SourceRange> SkippedRanges;
339 explicit PPEntityID(
int ID) :
ID(ID) {}
342 PPEntityID() =
default;
345 static PPEntityID getPPEntityID(
unsigned Index,
bool isLoaded) {
346 return isLoaded ? PPEntityID(-
int(Index)-1) : PPEntityID(Index+1);
350 llvm::DenseMap<const MacroInfo *, MacroDefinitionRecord *> MacroDefinitions;
363 unsigned getNumLoadedPreprocessedEntities()
const {
364 return LoadedPreprocessedEntities.size();
369 std::pair<unsigned, unsigned>
370 findLocalPreprocessedEntitiesInRange(
SourceRange Range)
const;
371 unsigned findBeginLocalPreprocessedEntity(
SourceLocation Loc)
const;
372 unsigned findEndLocalPreprocessedEntity(
SourceLocation Loc)
const;
378 unsigned allocateLoadedEntities(
unsigned NumEntities);
388 void *
Allocate(
unsigned Size,
unsigned Align = 8) {
389 return BumpAlloc.Allocate(Size, Align);
395 size_t getTotalMemory()
const;
415 class iterator :
public llvm::iterator_adaptor_base<
416 iterator, int, std::random_access_iterator_tag,
417 PreprocessedEntity *, int, PreprocessedEntity *,
418 PreprocessedEntity *> {
424 :
iterator::iterator_adaptor_base(Position), Self(Self) {}
430 bool isLoaded = this->I < 0;
431 unsigned Index = isLoaded ?
432 Self->LoadedPreprocessedEntities.size() + this->I : this->I;
433 PPEntityID
ID = Self->getPPEntityID(Index, isLoaded);
434 return Self->getPreprocessedEntity(ID);
441 return iterator(
this, -(
int)LoadedPreprocessedEntities.size());
446 return iterator(
this, PreprocessedEntities.size());
456 return iterator(
this, PreprocessedEntities.size());
463 unsigned end = start + count;
464 assert(end <= LoadedPreprocessedEntities.size());
465 return llvm::make_range(
466 iterator(
this,
int(start) - LoadedPreprocessedEntities.size()),
467 iterator(
this,
int(end) - LoadedPreprocessedEntities.size()));
474 llvm::iterator_range<iterator>
494 return ExternalSource;
503 return SkippedRanges;
516 StringRef FileName,
bool IsAngled,
518 const FileEntry *File, StringRef SearchPath,
519 StringRef RelativePath,
520 const Module *Imported)
override;
543 std::pair<int, int> getPreprocessedEntitiesInRangeSlow(
SourceRange R);
549 unsigned alignment) noexcept {
550 return PR.Allocate(
bytes, alignment);
558 #endif // LLVM_CLANG_LEX_PREPROCESSINGRECORD_H const FileEntry * getFile() const
Retrieve the file entry for the actual file that was included by this directive.
static bool classof(const PreprocessedEntity *PE)
__SIZE_TYPE__ size_t
The unsigned integer type of the result of the sizeof operator.
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...
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.
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...
static const NamedDecl * getDefinition(const Decl *D)
Records the presence of a preprocessor directive.
One of these records is kept for each identifier that is lexed.
Iteration over the preprocessed entities.
Record the location of a macro definition.
Token - This structure provides full information about a lexed token.
friend class PreprocessingRecord
Describes a module or submodule.
A record of the steps taken while preprocessing a source file, including the various preprocessing di...
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
SourceManager & getSourceManager() const
MacroExpansion(IdentifierInfo *BuiltinName, SourceRange Range)
StringRef getFileName() const
Retrieve the included file name as it was written in the source.
Records the location of a macro expansion.
InclusionKind getKind() const
Determine what kind of inclusion directive this is.
A GNU #include_next directive.
static bool classof(const PreprocessedEntity *PE)
std::pair< int, int > Result
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)
void * Allocate(unsigned Size, unsigned Align=8)
Allocate memory in the preprocessing record.
Represents a character-granular source range.
MacroArgs - An instance of this class captures information about the formal arguments specified to a ...
Record the location of an inclusion directive, such as an #include or #import statement.
bool isBuiltinMacro() const
True if it is a builtin macro.
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.
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.
bool isInvalid() const
Returns true if there was a problem loading the preprocessed entity.
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)
const IdentifierInfo * getName() const
Retrieve the name of the macro being defined.
An inclusion directive, such as #include, #import, or #include_next.
StringRef getName() const
Return the actual identifier string.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
iterator end()
End iterator for all preprocessed entities.
Dataflow Directional Tag Classes.
static bool classof(const PreprocessedEntity *PE)
Reads an AST files chain containing the contents of a translation unit.
const IdentifierInfo * getName() const
The name of the macro being expanded.
bool wasInQuotes() const
Determine whether the included file name was written in quotes; otherwise, it was written in angle br...
Encapsulates the data about a macro definition (e.g.
PreprocessedEntity * operator*() const
SourceLocation getLocation() const
Retrieve the location of the macro name in the definition.
An Objective-C #import directive.
Defines the PPCallbacks interface.
ExternalPreprocessingRecordSource * getExternalSource() const
Retrieve the external source for preprocessed entities.
const std::vector< SourceRange > & getSkippedRanges() const
Retrieve all ranges that got skipped while preprocessing.
Defines the clang::SourceLocation class and associated facilities.
iterator begin()
Begin iterator for all preprocessed entities.
PreprocessingDirective(EntityKind Kind, SourceRange Range)
EntityKind getKind() const
Retrieve the kind of preprocessed entity stored in this object.
bool importedModule() const
Determine whether the inclusion directive was automatically turned into a module import.
Writes an AST file containing the contents of a translation unit.
PreprocessedEntity * operator->() const
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
This class handles loading and caching of source files into memory.
MacroDefinitionRecord * getDefinition() const
The definition of the macro being expanded.
iterator local_begin()
Begin iterator for local, non-loaded, preprocessed entities.