14#ifndef LLVM_CLANG_LEX_PREPROCESSINGRECORD_H
15#define LLVM_CLANG_LEX_PREPROCESSINGRECORD_H
21#include "llvm/ADT/DenseMap.h"
22#include "llvm/ADT/PointerUnion.h"
23#include "llvm/ADT/StringRef.h"
24#include "llvm/ADT/iterator.h"
25#include "llvm/ADT/iterator_range.h"
26#include "llvm/Support/Allocator.h"
27#include "llvm/Support/Compiler.h"
37class PreprocessingRecord;
43 unsigned alignment = 8)
noexcept;
112 unsigned alignment = 8)
noexcept {
113 return ::operator
new(
bytes, PR, alignment);
116 void *
operator new(
size_t bytes,
void *mem)
noexcept {
return mem; }
119 unsigned alignment)
noexcept {
120 return ::operator
delete(ptr, PR, alignment);
123 void operator delete(
void *, std::size_t)
noexcept {}
124 void operator delete(
void *,
void *)
noexcept {}
128 void *
operator new(
size_t bytes)
noexcept;
129 void operator delete(
void *data)
noexcept;
171 llvm::PointerUnion<IdentifierInfo *, MacroDefinitionRecord *> NameOrDef;
176 NameOrDef(BuiltinName) {}
231 LLVM_PREFERRED_TYPE(
bool)
232 unsigned InQuotes : 1;
242 LLVM_PREFERRED_TYPE(
bool)
243 unsigned ImportedModule : 1;
250 StringRef FileName,
bool InQuotes,
bool ImportedModule,
291 virtual std::pair<unsigned, unsigned>
312 llvm::BumpPtrAllocator BumpAlloc;
316 std::vector<PreprocessedEntity *> PreprocessedEntities;
323 std::vector<PreprocessedEntity *> LoadedPreprocessedEntities;
326 std::vector<SourceRange> SkippedRanges;
328 bool SkippedRangesAllLoaded =
true;
344 explicit PPEntityID(
int ID) :
ID(
ID) {}
347 PPEntityID() =
default;
350 static PPEntityID getPPEntityID(
unsigned Index,
bool isLoaded) {
351 return isLoaded ? PPEntityID(-
int(Index)-1) : PPEntityID(Index+1);
355 llvm::DenseMap<const MacroInfo *, MacroDefinitionRecord *> MacroDefinitions;
368 unsigned getNumLoadedPreprocessedEntities()
const {
369 return LoadedPreprocessedEntities.size();
374 std::pair<unsigned, unsigned>
383 unsigned allocateLoadedEntities(
unsigned NumEntities);
390 unsigned allocateSkippedRanges(
unsigned NumRanges);
393 void ensureSkippedRangesLoaded();
403 void *
Allocate(
unsigned Size,
unsigned Align = 8) {
404 return BumpAlloc.Allocate(Size, Align);
430 class iterator :
public llvm::iterator_adaptor_base<
431 iterator, int, std::random_access_iterator_tag,
432 PreprocessedEntity *, int, PreprocessedEntity *,
433 PreprocessedEntity *> {
439 :
iterator::iterator_adaptor_base(Position), Self(Self) {}
445 bool isLoaded = this->I < 0;
446 unsigned Index = isLoaded ?
447 Self->LoadedPreprocessedEntities.size() + this->I : this->I;
448 PPEntityID
ID = Self->getPPEntityID(Index, isLoaded);
449 return Self->getPreprocessedEntity(
ID);
456 return iterator(
this, -(
int)LoadedPreprocessedEntities.size());
461 return iterator(
this, PreprocessedEntities.size());
471 return iterator(
this, PreprocessedEntities.size());
478 unsigned end = start + count;
479 assert(
end <= LoadedPreprocessedEntities.size());
480 return llvm::make_range(
481 iterator(
this,
int(start) - LoadedPreprocessedEntities.size()),
482 iterator(
this,
int(
end) - LoadedPreprocessedEntities.size()));
489 llvm::iterator_range<iterator>
518 ensureSkippedRangesLoaded();
519 return SkippedRanges;
535 StringRef RelativePath,
536 const Module *SuggestedModule,
bool ModuleImported,
567 std::pair<int, int> getPreprocessedEntitiesInRangeSlow(
SourceRange R);
573 unsigned alignment)
noexcept {
574 return PR.Allocate(
bytes, alignment);
static StringRef bytes(const std::vector< T, Allocator > &v)
enum clang::sema::@1655::IndirectLocalPathEntry::EntryKind Kind
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
llvm::MachO::FileType FileType
Defines the PPCallbacks interface.
Defines the clang::SourceLocation class and associated facilities.
Reads an AST files chain containing the contents of a translation unit.
Writes an AST file containing the contents of a translation unit.
Represents a character-granular source range.
An abstract class that should be subclassed by any external source of preprocessing record entries.
virtual SourceRange ReadSkippedRange(unsigned Index)=0
Read a preallocated skipped range from the external source.
virtual ~ExternalPreprocessingRecordSource()
virtual std::optional< bool > isPreprocessedEntityInFileID(unsigned Index, FileID FID)
Optionally returns true or false if the preallocated preprocessed entity with index Index came from f...
virtual PreprocessedEntity * ReadPreprocessedEntity(unsigned Index)=0
Read a preallocated preprocessed entity from the external source.
virtual std::pair< unsigned, unsigned > findPreprocessedEntitiesInRange(SourceRange Range)=0
Returns a pair of [Begin, End) indices of preallocated preprocessed entities that Range encompasses.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
Record the location of an inclusion directive, such as an #include or #import statement.
StringRef getFileName() const
Retrieve the included file name as it was written in the source.
InclusionKind getKind() const
Determine what kind of inclusion directive this is.
bool wasInQuotes() const
Determine whether the included file name was written in quotes; otherwise, it was written in angle br...
bool importedModule() const
Determine whether the inclusion directive was automatically turned into a module import.
InclusionKind
The kind of inclusion directives known to the preprocessor.
@ IncludeMacros
A Clang #__include_macros directive.
@ Import
An Objective-C #import directive.
@ IncludeNext
A GNU #include_next directive.
@ Include
An #include directive.
static bool classof(const PreprocessedEntity *PE)
OptionalFileEntryRef getFile() const
Retrieve the file entry for the actual file that was included by this directive.
MacroArgs - An instance of this class captures information about the formal arguments specified to a ...
Record the location of a macro definition.
static bool classof(const PreprocessedEntity *PE)
SourceLocation getLocation() const
Retrieve the location of the macro name in the definition.
MacroDefinitionRecord(const IdentifierInfo *Name, SourceRange Range)
const IdentifierInfo * getName() const
Retrieve the name of the macro being defined.
A description of the current definition of a macro.
Encapsulates changes to the "macros namespace" (the location where the macro name became active,...
Records the location of a macro expansion.
MacroDefinitionRecord * getDefinition() const
The definition of the macro being expanded.
bool isBuiltinMacro() const
True if it is a builtin macro.
const IdentifierInfo * getName() const
The name of the macro being expanded.
static bool classof(const PreprocessedEntity *PE)
MacroExpansion(MacroDefinitionRecord *Definition, SourceRange Range)
MacroExpansion(IdentifierInfo *BuiltinName, SourceRange Range)
Encapsulates the data about a macro definition (e.g.
Describes a module or submodule.
This interface provides a way to observe the actions of the preprocessor as it does its thing.
virtual void Elifndef(SourceLocation Loc, const Token &MacroNameTok, const MacroDefinition &MD)
Hook called whenever an #elifndef branch is taken.
virtual void Elifdef(SourceLocation Loc, const Token &MacroNameTok, const MacroDefinition &MD)
Hook called whenever an #elifdef branch is taken.
Base class that describes a preprocessed entity, which may be a preprocessor directive or macro expan...
EntityKind
The kind of preprocessed entity an object describes.
@ InvalidKind
Indicates a problem trying to load the preprocessed entity.
@ MacroExpansionKind
A macro expansion.
@ LastPreprocessingDirective
bool isInvalid() const
Returns true if there was a problem loading the preprocessed entity.
PreprocessedEntity(EntityKind Kind, SourceRange Range)
EntityKind getKind() const
Retrieve the kind of preprocessed entity stored in this object.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range that covers this entire preprocessed entity.
Records the presence of a preprocessor directive.
PreprocessingDirective(EntityKind Kind, SourceRange Range)
static bool classof(const PreprocessedEntity *PD)
Iteration over the preprocessed entities.
PreprocessedEntity * operator->() const
PreprocessedEntity * operator*() const
A record of the steps taken while preprocessing a source file, including the various preprocessing di...
SourceManager & getSourceManager() const
void Deallocate(void *Ptr)
Deallocate memory in the preprocessing record.
void * Allocate(unsigned Size, unsigned Align=8)
Allocate memory in the preprocessing record.
llvm::iterator_range< iterator > getPreprocessedEntitiesInRange(SourceRange R)
Returns a range of preprocessed entities that source range R encompasses.
iterator end()
End iterator for all preprocessed entities.
ExternalPreprocessingRecordSource * getExternalSource() const
Retrieve the external source for preprocessed entities.
MacroDefinitionRecord * findMacroDefinition(const MacroInfo *MI)
Retrieve the macro definition that corresponds to the given MacroInfo.
PPEntityID addPreprocessedEntity(PreprocessedEntity *Entity)
Add a new preprocessed entity to this record.
llvm::iterator_range< iterator > getIteratorsForLoadedRange(unsigned start, unsigned count)
iterator range for the given range of loaded preprocessed entities.
const std::vector< SourceRange > & getSkippedRanges()
Retrieve all ranges that got skipped while preprocessing.
bool isEntityInFileID(iterator PPEI, FileID FID)
Returns true if the preprocessed entity that PPEI iterator points to is coming from the file FID.
size_t getTotalMemory() const
iterator begin()
Begin iterator for all preprocessed entities.
iterator local_begin()
Begin iterator for local, non-loaded, preprocessed entities.
std::pair< int, int > Result
iterator local_end()
End iterator for local, non-loaded, preprocessed entities.
void SetExternalSource(ExternalPreprocessingRecordSource &Source)
Set the external source for preprocessed entities.
Encodes a location in the source.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
Token - This structure provides full information about a lexed token.
@ MacroDefinitionKind
A macro definition.
@ FirstPreprocessingDirective
@ InclusionDirectiveKind
An inclusion directive, such as #include, #import, or #include_next.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
The JSON file list parser is used to communicate input to InstallAPI.