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;
172 StringRef PCHModuleName;
176 const Module *ClangModule =
nullptr;
182 : PCHModuleName(
std::move(Name)), Path(
std::move(Path)),
183 ASTFile(
std::move(ASTFile)), Signature(Signature) {}
186 std::string getModuleName()
const;
209 llvm::function_ref<
bool(
Decl::Kind)> IsKindWeWant,
300 const RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
301 llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,
302 llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,
303 llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets);
314 : malloc_bytes(malloc_bytes), mmap_bytes(mmap_bytes) {}
329 virtual bool isA(
const void *ClassID)
const {
return ClassID == &ID; }
353 template<
typename T,
typename OffsT, T* (ExternalASTSource::*Get)(OffsT Offset)>
360 mutable uint64_t Ptr = 0;
367 assert((Offset << 1 >> 1) == Offset &&
"Offsets must require < 63 bits");
373 this->Ptr =
reinterpret_cast<uint64_t
>(Ptr);
378 assert((Offset << 1 >> 1) == Offset &&
"Offsets must require < 63 bits");
382 Ptr = (Offset << 1) | 0x01;
390 explicit operator bool()
const {
return Ptr != 0; }
408 "Cannot deserialize a lazy pointer without an AST source");
409 Ptr =
reinterpret_cast<uint64_t
>((Source->*Get)(Ptr >> 1));
411 return reinterpret_cast<T*
>(Ptr);
418 template<
typename Owner,
typename T,
void (ExternalASTSource::*Update)(Owner)>
424 uint32_t LastGeneration = 0;
428 : ExternalSource(Source), LastValue(Value) {}
442 : Value(makeValue(Ctx, Value)) {}
452 Value.template get<LazyData *>()->LastGeneration = 0;
456 void set(T NewValue) {
457 if (
auto *LazyVal = Value.template dyn_cast<LazyData *>()) {
458 LazyVal->LastValue = NewValue;
469 if (
auto *LazyVal = Value.template dyn_cast<LazyData *>()) {
470 if (LazyVal->LastGeneration != LazyVal->ExternalSource->getGeneration()) {
471 LazyVal->LastGeneration = LazyVal->ExternalSource->getGeneration();
472 (LazyVal->ExternalSource->*
Update)(O);
474 return LazyVal->LastValue;
476 return Value.template get<T>();
481 if (
auto *LazyVal = Value.template dyn_cast<LazyData *>())
482 return LazyVal->LastValue;
483 return Value.template get<T>();
498 template<
typename Owner,
typename T,
522 template<
typename T,
typename Source,
524 unsigned LoadedStorage = 2,
unsigned LocalStorage = 4>
547 :
public llvm::iterator_adaptor_base<
548 iterator, int, std::random_access_iterator_tag, T, int, T *, T &> {
554 : iterator::iterator_adaptor_base(Position), Self(Self) {}
556 bool isLoaded()
const {
return this->I < 0; }
563 return Self->Loaded.end()[this->I];
564 return Self->Local.begin()[this->I];
568 iterator
begin(Source *source,
bool LocalOnly =
false) {
570 return iterator(
this, 0);
573 (source->*Loader)(Loaded);
574 return iterator(
this, -(
int)Loaded.size());
578 return iterator(
this, Local.size());
582 Local.push_back(LocalValue);
585 void erase(iterator From, iterator To) {
586 if (From.isLoaded() && To.isLoaded()) {
587 Loaded.erase(&*From, &*To);
591 if (From.isLoaded()) {
592 Loaded.erase(&*From, Loaded.end());
593 From = begin(
nullptr,
true);
596 Local.erase(&*From, &*To);
620 #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)
Specialize PointerLikeTypeTraits to allow LazyGenerationalUpdatePtr to be placed into a PointerUnion...
Stmt - This represents one statement.
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
static bool classof(const ExternalASTSource *S)
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)
Defines the clang::Module class, which describes a module in the source code.
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 bool isA(const void *ClassID) const
LLVM-style RTTI.
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.
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)