14 #ifndef LLVM_CLANG_AST_EXTERNALASTSOURCE_H 15 #define LLVM_CLANG_AST_EXTERNALASTSOURCE_H 21 #include "llvm/ADT/ArrayRef.h" 22 #include "llvm/ADT/DenseMap.h" 23 #include "llvm/ADT/IntrusiveRefCntPtr.h" 24 #include "llvm/ADT/Optional.h" 25 #include "llvm/ADT/PointerUnion.h" 26 #include "llvm/ADT/STLExtras.h" 27 #include "llvm/ADT/SmallVector.h" 28 #include "llvm/ADT/StringRef.h" 29 #include "llvm/ADT/iterator.h" 30 #include "llvm/Support/PointerLikeTypeTraits.h" 42 class CXXBaseSpecifier;
43 class CXXCtorInitializer;
45 class DeclarationName;
49 class ObjCInterfaceDecl;
67 uint32_t CurrentGeneration = 0;
71 bool SemaSource =
false;
173 StringRef PCHModuleName;
177 const Module *ClangModule =
nullptr;
183 : PCHModuleName(
std::move(Name)), Path(
std::move(Path)),
184 ASTFile(
std::move(ASTFile)), Signature(Signature) {}
187 std::string getModuleName()
const;
210 llvm::function_ref<
bool(
Decl::Kind)> IsKindWeWant,
301 const RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
302 llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,
303 llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,
304 llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets);
315 : malloc_bytes(malloc_bytes), mmap_bytes(mmap_bytes) {}
348 template<
typename T,
typename OffsT, T* (ExternalASTSource::*Get)(OffsT Offset)>
355 mutable uint64_t Ptr = 0;
362 assert((Offset << 1 >> 1) == Offset &&
"Offsets must require < 63 bits");
368 this->Ptr =
reinterpret_cast<uint64_t
>(Ptr);
373 assert((Offset << 1 >> 1) == Offset &&
"Offsets must require < 63 bits");
377 Ptr = (Offset << 1) | 0x01;
385 explicit operator bool()
const {
return Ptr != 0; }
403 "Cannot deserialize a lazy pointer without an AST source");
404 Ptr =
reinterpret_cast<uint64_t
>((Source->*Get)(Ptr >> 1));
406 return reinterpret_cast<T*
>(Ptr);
413 template<
typename Owner,
typename T,
void (ExternalASTSource::*Update)(Owner)>
419 uint32_t LastGeneration = 0;
423 : ExternalSource(Source), LastValue(Value) {}
437 : Value(makeValue(Ctx, Value)) {}
447 Value.template get<LazyData *>()->LastGeneration = 0;
451 void set(T NewValue) {
452 if (
auto *LazyVal = Value.template dyn_cast<LazyData *>()) {
453 LazyVal->LastValue = NewValue;
464 if (
auto *LazyVal = Value.template dyn_cast<LazyData *>()) {
465 if (LazyVal->LastGeneration != LazyVal->ExternalSource->getGeneration()) {
466 LazyVal->LastGeneration = LazyVal->ExternalSource->getGeneration();
467 (LazyVal->ExternalSource->*
Update)(O);
469 return LazyVal->LastValue;
471 return Value.template get<T>();
476 if (
auto *LazyVal = Value.template dyn_cast<LazyData *>())
477 return LazyVal->LastValue;
478 return Value.template get<T>();
493 template<
typename Owner,
typename T,
517 template<
typename T,
typename Source,
519 unsigned LoadedStorage = 2,
unsigned LocalStorage = 4>
542 :
public llvm::iterator_adaptor_base<
543 iterator, int, std::random_access_iterator_tag, T, int, T *, T &> {
549 : iterator::iterator_adaptor_base(Position), Self(Self) {}
551 bool isLoaded()
const {
return this->I < 0; }
558 return Self->Loaded.end()[this->I];
559 return Self->Local.begin()[this->I];
563 iterator
begin(Source *source,
bool LocalOnly =
false) {
565 return iterator(
this, 0);
568 (source->*Loader)(Loaded);
569 return iterator(
this, -(
int)Loaded.size());
573 return iterator(
this, Local.size());
577 Local.push_back(LocalValue);
580 void erase(iterator From, iterator To) {
581 if (From.isLoaded() && To.isLoaded()) {
582 Loaded.erase(&*From, &*To);
586 if (From.isLoaded()) {
587 Loaded.erase(&*From, Loaded.end());
588 From = begin(
nullptr,
true);
591 Local.erase(&*From, &*To);
615 #endif // LLVM_CLANG_AST_EXTERNALASTSOURCE_H
Smart pointer class that efficiently represents Objective-C method names.
virtual Decl * GetExternalDecl(uint32_t ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
virtual void FindExternalLexicalDecls(const DeclContext *DC, llvm::function_ref< bool(Decl::Kind)> IsKindWeWant, SmallVectorImpl< Decl *> &Result)
Finds all declarations lexically contained within the given DeclContext, after applying an optional f...
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs...
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
Represents a lazily-loaded vector of data.
void setNotUpdated(T NewValue)
Set the value of this pointer, for this and all future generations.
LazyData(ExternalASTSource *Source, T Value)
DominatorTree GraphTraits specialization so the DominatorTree can be iterable by generic graph iterat...
Stmt - This represents one statement.
Defines the clang::Module class, which describes a module in the source code.
Decl - This represents one declaration (or definition), e.g.
virtual uint32_t GetNumExternalSelectors()
Returns the number of selectors known to the external AST source.
virtual bool layoutRecordType(const RecordDecl *Record, uint64_t &Size, uint64_t &Alignment, llvm::DenseMap< const FieldDecl *, uint64_t > &FieldOffsets, llvm::DenseMap< const CXXRecordDecl *, CharUnits > &BaseOffsets, llvm::DenseMap< const CXXRecordDecl *, CharUnits > &VirtualBaseOffsets)
Perform layout on the given record.
NotUpdatedTag
Create a pointer that is not potentially updated by later generations of the external AST source...
virtual void FindFileRegionDecls(FileID File, unsigned Offset, unsigned Length, SmallVectorImpl< Decl *> &Decls)
Get the decls that are contained in a file in the Offset/Length range.
LazyOffsetPtr & operator=(uint64_t Offset)
virtual bool DeclIsFromPCHWithObjectFile(const Decl *D)
Determine whether D comes from a PCH which was built with a corresponding object file.
virtual void PrintStats()
Print any statistics that have been gathered regarding the external AST source.
Deserializing(ExternalASTSource *source)
virtual void CompleteRedeclChain(const Decl *D)
Gives the external AST source an opportunity to complete the redeclaration chain for a declaration...
virtual Selector GetExternalSelector(uint32_t ID)
Resolve a selector ID into a selector.
virtual void StartedDeserializing()
Notify ExternalASTSource that we started deserialization of a decl or type so until FinishedDeseriali...
iterator begin(Source *source, bool LocalOnly=false)
Represents a struct/union/class.
void FindExternalLexicalDecls(const DeclContext *DC, SmallVectorImpl< Decl *> &Result)
Finds all declarations lexically contained within the given DeclContext.
One of these records is kept for each identifier that is lexed.
static DeclContextLookupResult SetExternalVisibleDeclsForName(const DeclContext *DC, DeclarationName Name, ArrayRef< NamedDecl *> Decls)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
The results of name lookup within a DeclContext.
StringRef getPath() const
void erase(iterator From, iterator To)
uint32_t incrementGeneration(ASTContext &C)
Increment the current generation.
uint32_t getGeneration() const
Get the current generation of this AST source.
T getNotUpdated() const
Get the most recently computed value of this pointer without updating it.
The signature of a module, which is a hash of the AST content.
virtual CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset)
Resolve the offset of a set of C++ base specifiers in the decl stream into an array of specifiers...
Describes a module or submodule.
ASTSourceDescriptor(StringRef Name, StringRef Path, StringRef ASTFile, ASTFileSignature Signature)
virtual void updateOutOfDateIdentifier(IdentifierInfo &II)
Update an out-of-date identifier.
virtual bool FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name)
Find all declarations with the given name in the given context, and add them to the context by callin...
virtual void FinishedDeserializing()
Notify ExternalASTSource that we finished the deserialization of a decl or type.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
static DeclContextLookupResult SetNoExternalVisibleDeclsForName(const DeclContext *DC, DeclarationName Name)
iterator::reference operator*() const
A cache of the value of this pointer, in the most recent generation in which we queried it...
LazyGenerationalUpdatePtr(ValueType V)
Represents an ObjC class declaration.
const Module * getModuleOrNull() const
virtual void completeVisibleDeclsMap(const DeclContext *DC)
Ensures that the table of all visible declarations inside this context is up to date.
ASTFileSignature getSignature() const
ExternalASTSource()=default
The result type of a method or function.
static void * getAsVoidPointer(Ptr P)
MemoryBufferSizes getMemoryBufferSizes() const
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
An abstract interface that should be implemented by external AST sources that also provide informatio...
Abstract interface for external sources of AST nodes.
StringRef getASTFile() const
virtual Stmt * GetExternalDeclStmt(uint64_t Offset)
Resolve the offset of a statement in the decl stream into a statement.
Represents the declaration of a struct/union/class/enum.
static LazyGenerationalUpdatePtr getFromOpaqueValue(void *Ptr)
void push_back(const T &LocalValue)
ExternalASTSource * ExternalSource
MemoryBufferSizes(size_t malloc_bytes, size_t mmap_bytes)
bool isValid() const
Whether this pointer is non-NULL.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Dataflow Directional Tag Classes.
virtual Module * getModule(unsigned ID)
Retrieve the module that corresponds to the given module ID.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
void markIncomplete()
Forcibly set this pointer (which must be lazy) as needing updates.
virtual void StartTranslationUnit(ASTConsumer *Consumer)
Function that will be invoked when we begin parsing a new translation unit involving this external AS...
virtual void ReadComments()
Loads comment ranges.
LazyOffsetPtr & operator=(T *Ptr)
A lazy pointer to an AST node (of base type T) that resides within an external AST source...
The name of a declaration.
virtual CXXCtorInitializer ** GetExternalCXXCtorInitializers(uint64_t Offset)
Resolve the offset of a set of C++ constructor initializers in the decl stream into an array of initi...
virtual ~ExternalASTSource()
virtual ExtKind hasExternalDefinitions(const Decl *D)
LazyGenerationalUpdatePtr(NotUpdatedTag, T Value=T())
Represents a C++ base or member initializer.
virtual void CompleteType(TagDecl *Tag)
Gives the external AST source an opportunity to complete an incomplete type.
Represents a base class of a C++ class.
virtual llvm::Optional< ASTSourceDescriptor > getSourceDescriptor(unsigned ID)
Return a descriptor for the corresponding module, if one exists.
LazyGenerationalUpdatePtr(const ASTContext &Ctx, T Value=T())
bool isOffset() const
Whether this pointer is currently stored as an offset.
Kind
Lists the kind of concrete classes of Decl.
Iteration over the elements in the vector.
Abstracts clang modules and precompiled header files and holds everything needed to generate debug in...
llvm::PointerUnion< T, LazyData * > ValueType
A lazy value (of type T) that is within an AST node of type Owner, where the value might change in la...
LazyOffsetPtr(uint64_t Offset)
static Ptr getFromVoidPointer(void *P)