14 #ifndef LLVM_CLANG_AST_EXTERNALASTSOURCE_H
15 #define LLVM_CLANG_AST_EXTERNALASTSOURCE_H
20 #include "llvm/ADT/DenseMap.h"
25 class CXXBaseSpecifier;
26 class CXXCtorInitializer;
27 class DeclarationName;
28 class ExternalSemaSource;
47 uint32_t CurrentGeneration;
150 StringRef PCHModuleName;
154 const Module *ClangModule =
nullptr;
160 : PCHModuleName(std::move(Name)), Path(std::move(Path)),
161 ASTFile(std::move(ASTFile)), Signature(Signature){};
186 llvm::function_ref<
bool(
Decl::Kind)> IsKindWeWant,
278 const RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
279 llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,
280 llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,
281 llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets);
292 : malloc_bytes(malloc_bytes), mmap_bytes(mmap_bytes) {}
325 template<
typename T,
typename OffsT, T* (ExternalASTSource::*Get)(OffsT Offset)>
339 assert((Offset << 1 >> 1) == Offset &&
"Offsets must require < 63 bits");
345 this->Ptr =
reinterpret_cast<uint64_t
>(
Ptr);
350 assert((Offset << 1 >> 1) == Offset &&
"Offsets must require < 63 bits");
354 Ptr = (Offset << 1) | 0x01;
362 explicit operator bool()
const {
return Ptr != 0; }
380 "Cannot deserialize a lazy pointer without an AST source");
381 Ptr =
reinterpret_cast<uint64_t
>((Source->*Get)(
Ptr >> 1));
383 return reinterpret_cast<T*
>(
Ptr);
390 template<
typename Owner,
typename T,
void (ExternalASTSource::*Update)(Owner)>
423 Value.template get<LazyData *>()->LastGeneration = 0;
428 if (
LazyData *LazyVal =
Value.template dyn_cast<LazyData*>()) {
429 LazyVal->LastValue = NewValue;
440 if (
LazyData *LazyVal =
Value.template dyn_cast<LazyData*>()) {
441 if (LazyVal->LastGeneration != LazyVal->ExternalSource->getGeneration()) {
442 LazyVal->LastGeneration = LazyVal->ExternalSource->getGeneration();
443 (LazyVal->ExternalSource->*Update)(O);
445 return LazyVal->LastValue;
447 return Value.template get<T>();
452 if (
LazyData *LazyVal =
Value.template dyn_cast<LazyData*>())
453 return LazyVal->LastValue;
454 return Value.template get<T>();
467 template<
typename Owner,
typename T,
487 template<
typename T,
typename Source,
488 void (Source::*Loader)(SmallVectorImpl<T>&),
489 unsigned LoadedStorage = 2,
unsigned LocalStorage = 4>
512 :
public llvm::iterator_adaptor_base<
513 iterator, int, std::random_access_iterator_tag, T, int, T *, T &> {
517 : iterator::iterator_adaptor_base(Position), Self(Self) {}
519 bool isLoaded()
const {
return this->
I < 0; }
527 return Self->Loaded.end()[this->
I];
528 return Self->Local.begin()[this->
I];
532 iterator
begin(Source *source,
bool LocalOnly =
false) {
534 return iterator(
this, 0);
537 (source->*Loader)(Loaded);
538 return iterator(
this, -(
int)Loaded.size());
542 return iterator(
this, Local.size());
546 Local.push_back(LocalValue);
549 void erase(iterator From, iterator To) {
550 if (From.isLoaded() && To.isLoaded()) {
551 Loaded.erase(&*From, &*To);
555 if (From.isLoaded()) {
556 Loaded.erase(&*From, Loaded.end());
557 From = begin(
nullptr,
true);
560 Local.erase(&*From, &*To);
565 typedef LazyOffsetPtr<Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt>
574 &ExternalASTSource::GetExternalCXXCtorInitializers>
579 &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.
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.
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.
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
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.
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 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
ASTFileSignature getSignature() const
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.
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.
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())
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...
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)