14 #ifndef LLVM_CLANG_AST_EXTERNALASTSOURCE_H
15 #define LLVM_CLANG_AST_EXTERNALASTSOURCE_H
19 #include "llvm/ADT/DenseMap.h"
24 class CXXBaseSpecifier;
25 class CXXCtorInitializer;
26 class DeclarationName;
27 class ExternalSemaSource;
46 uint32_t CurrentGeneration;
149 StringRef PCHModuleName;
152 uint64_t Signature = 0;
153 const Module *ClangModule =
nullptr;
159 : PCHModuleName(std::move(Name)), Path(std::move(Path)),
160 ASTFile(std::move(ASTFile)), Signature(Signature){};
181 llvm::function_ref<
bool(
Decl::Kind)> IsKindWeWant,
273 const RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
274 llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,
275 llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,
276 llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets);
287 : malloc_bytes(malloc_bytes), mmap_bytes(mmap_bytes) {}
320 template<
typename T,
typename OffsT, T* (ExternalASTSource::*Get)(OffsT Offset)>
334 assert((Offset << 1 >> 1) == Offset &&
"Offsets must require < 63 bits");
340 this->Ptr =
reinterpret_cast<uint64_t
>(
Ptr);
345 assert((Offset << 1 >> 1) == Offset &&
"Offsets must require < 63 bits");
349 Ptr = (Offset << 1) | 0x01;
357 explicit operator bool()
const {
return Ptr != 0; }
375 "Cannot deserialize a lazy pointer without an AST source");
376 Ptr =
reinterpret_cast<uint64_t
>((Source->*Get)(
Ptr >> 1));
378 return reinterpret_cast<T*
>(
Ptr);
385 template<
typename Owner,
typename T,
void (ExternalASTSource::*Update)(Owner)>
418 Value.template get<LazyData *>()->LastGeneration = 0;
423 if (
LazyData *LazyVal =
Value.template dyn_cast<LazyData*>()) {
424 LazyVal->LastValue = NewValue;
435 if (
LazyData *LazyVal =
Value.template dyn_cast<LazyData*>()) {
436 if (LazyVal->LastGeneration != LazyVal->ExternalSource->getGeneration()) {
437 LazyVal->LastGeneration = LazyVal->ExternalSource->getGeneration();
438 (LazyVal->ExternalSource->*Update)(O);
440 return LazyVal->LastValue;
442 return Value.template get<T>();
447 if (
LazyData *LazyVal =
Value.template dyn_cast<LazyData*>())
448 return LazyVal->LastValue;
449 return Value.template get<T>();
462 template<
typename Owner,
typename T,
482 template<
typename T,
typename Source,
483 void (Source::*Loader)(SmallVectorImpl<T>&),
484 unsigned LoadedStorage = 2,
unsigned LocalStorage = 4>
507 :
public llvm::iterator_adaptor_base<
508 iterator, int, std::random_access_iterator_tag, T, int, T *, T &> {
512 : iterator::iterator_adaptor_base(Position), Self(Self) {}
514 bool isLoaded()
const {
return this->
I < 0; }
522 return Self->Loaded.end()[this->
I];
523 return Self->Local.begin()[this->
I];
527 iterator
begin(Source *source,
bool LocalOnly =
false) {
532 (source->*Loader)(Loaded);
533 return iterator(
this, -(
int)Loaded.size());
537 return iterator(
this, Local.size());
541 Local.push_back(LocalValue);
544 void erase(iterator From, iterator To) {
545 if (From.isLoaded() && To.isLoaded()) {
546 Loaded.erase(&*From, &*To);
550 if (From.isLoaded()) {
551 Loaded.erase(&*From, Loaded.end());
552 From =
begin(
nullptr,
true);
555 Local.erase(&*From, &*To);
560 typedef LazyOffsetPtr<Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt>
569 &ExternalASTSource::GetExternalCXXCtorInitializers>
574 &ExternalASTSource::GetExternalCXXBaseSpecifiers>
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...
uint64_t Ptr
Either a pointer to an AST node or the offset within the external AST source where the AST node can b...
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.
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)
bool isOffset() const
Whether this pointer is currently stored as an offset.
virtual uint32_t GetNumExternalSelectors()
Returns the number of selectors known to the external AST source.
static DeclContextLookupResult SetExternalVisibleDeclsForName(const DeclContext *DC, DeclarationName Name, ArrayRef< NamedDecl * > Decls)
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...
LazyOffsetPtr< CXXCtorInitializer *, uint64_t,&ExternalASTSource::GetExternalCXXCtorInitializers > LazyCXXCtorInitializersPtr
A lazy pointer to a set of CXXCtorInitializers.
LazyOffsetPtr & operator=(uint64_t Offset)
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.
ASTSourceDescriptor(StringRef Name, StringRef Path, StringRef ASTFile, uint64_t Signature)
virtual void StartedDeserializing()
Notify ExternalASTSource that we started deserialization of a decl or type so until FinishedDeseriali...
iterator begin(Source *source, bool LocalOnly=false)
MemoryBufferSizes getMemoryBufferSizes() const
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
RecordDecl - Represents a struct/union/class.
One of these records is kept for each identifier that is lexed.
StringRef getPath() const
class LLVM_ALIGNAS(8) DependentTemplateSpecializationType const IdentifierInfo * Name
Represents a template specialization type whose template cannot be resolved, e.g. ...
LazyOffsetPtr< Stmt, uint64_t,&ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr
A lazy pointer to a statement.
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.
void erase(iterator From, iterator To)
iterator::reference operator*() const
uint32_t incrementGeneration(ASTContext &C)
Increment the current generation.
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.
virtual void updateOutOfDateIdentifier(IdentifierInfo &II)
Update an out-of-date identifier.
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.
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.
static DeclContextLookupResult SetNoExternalVisibleDeclsForName(const DeclContext *DC, DeclarationName Name)
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.
detail::InMemoryDirectory::const_iterator I
virtual void completeVisibleDeclsMap(const DeclContext *DC)
Ensures that the table of all visible declarations inside this context is up to date.
static ValueType makeValue(const ASTContext &Ctx, T Value)
Create the representation of a LazyGenerationalUpdatePtr.
The result type of a method or function.
static void * getAsVoidPointer(Ptr P)
const Module * getModuleOrNull() const
An abstract interface that should be implemented by external AST sources that also provide informatio...
Abstract interface for external sources of AST nodes.
virtual Stmt * GetExternalDeclStmt(uint64_t Offset)
Resolve the offset of a statement in the decl stream into a statement.
const TemplateArgument * iterator
TagDecl - Represents the declaration of a struct/union/class/enum.
LazyOffsetPtr< CXXBaseSpecifier, uint64_t,&ExternalASTSource::GetExternalCXXBaseSpecifiers > LazyCXXBaseSpecifiersPtr
A lazy pointer to a set of CXXBaseSpecifiers.
static LazyGenerationalUpdatePtr getFromOpaqueValue(void *Ptr)
void push_back(const T &LocalValue)
LazyOffsetPtr< Decl, uint32_t,&ExternalASTSource::GetExternalDecl > LazyDeclPtr
A lazy pointer to a declaration.
ExternalASTSource * ExternalSource
void FindExternalLexicalDecls(const DeclContext *DC, SmallVectorImpl< Decl * > &Result)
Finds all declarations lexically contained within the given DeclContext.
MemoryBufferSizes(size_t malloc_bytes, size_t mmap_bytes)
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
clang::LazyGenerationalUpdatePtr< Owner, T, Update > Ptr
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...
StringRef getASTFile() const
bool isValid() const
Whether this pointer is non-NULL.
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)
std::string getModuleName() const
A lazy pointer to an AST node (of base type T) that resides within an external AST source...
DeclarationName - 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...
void set(T NewValue)
Set the value of this pointer, in the current generation.
T getNotUpdated() const
Get the most recently computed value of this pointer without updating it.
virtual ~ExternalASTSource()
uint32_t getGeneration() const
Get the current generation of this AST source.
LazyGenerationalUpdatePtr(NotUpdatedTag, T Value=T())
uint64_t getSignature() const
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())
Iteration over the elements in the vector.
Abstracts clang modules and precompiled header files and holds everything needed to generate debug in...
A lazy value (of type T) that is within an AST node of type Owner, where the value might change in la...
llvm::PointerUnion< T, LazyData * > ValueType
LazyOffsetPtr(uint64_t Offset)
static Ptr getFromVoidPointer(void *P)