teemperor created this revision. teemperor added reviewers: aprantl, dblaikie, rjmccall. Herald added a project: clang. Herald added a subscriber: cfe-commits.
We currently have some very basic LLVM-style RTTI support in the ExternalASTSource class hierarchy based on the `SemaSource` bool( to discriminate it form the ExternalSemaSource). As ExternalASTSource is supposed to be subclassed we should have extendable LLVM-style RTTI in this class hierarchy to make life easier for projects building on top of Clang. Most notably the current RTTI implementation forces LLDB to implement RTTI for its own ExternalASTSource class (ClangExternalASTSourceCommon) by keeping a global set of ExternalASTSources that are known to be ClangExternalASTSourceCommon. Projects using Clang currently have to dosimilar workarounds to get RTTI support for their subclasses. This patch turns this into full-fledged LLVM-style RTTI based on a static `ID` variable similar to other LLVM class hierarchies. Also removes the friend declaration from ExternalASTSource to its child class that was only used to grant access to the `SemaSource` member. Repository: rC Clang https://reviews.llvm.org/D71397 Files: clang/include/clang/AST/ExternalASTSource.h clang/include/clang/Sema/ExternalSemaSource.h clang/include/clang/Sema/MultiplexExternalSemaSource.h clang/lib/AST/ExternalASTSource.cpp clang/lib/Sema/MultiplexExternalSemaSource.cpp clang/lib/Sema/Sema.cpp
Index: clang/lib/Sema/Sema.cpp =================================================================== --- clang/lib/Sema/Sema.cpp +++ clang/lib/Sema/Sema.cpp @@ -1917,6 +1917,7 @@ // Pin this vtable to this file. ExternalSemaSource::~ExternalSemaSource() {} +char ExternalSemaSource::ID; void ExternalSemaSource::ReadMethodPool(Selector Sel) { } void ExternalSemaSource::updateOutOfDateSelector(Selector Sel) { } Index: clang/lib/Sema/MultiplexExternalSemaSource.cpp =================================================================== --- clang/lib/Sema/MultiplexExternalSemaSource.cpp +++ clang/lib/Sema/MultiplexExternalSemaSource.cpp @@ -15,6 +15,8 @@ using namespace clang; +char MultiplexExternalSemaSource::ID; + ///Constructs a new multiplexing external sema source and appends the /// given element to it. /// Index: clang/lib/AST/ExternalASTSource.cpp =================================================================== --- clang/lib/AST/ExternalASTSource.cpp +++ clang/lib/AST/ExternalASTSource.cpp @@ -24,6 +24,8 @@ using namespace clang; +char ExternalASTSource::ID; + ExternalASTSource::~ExternalASTSource() = default; llvm::Optional<ExternalASTSource::ASTSourceDescriptor> Index: clang/include/clang/Sema/MultiplexExternalSemaSource.h =================================================================== --- clang/include/clang/Sema/MultiplexExternalSemaSource.h +++ clang/include/clang/Sema/MultiplexExternalSemaSource.h @@ -36,6 +36,8 @@ /// external AST sources that also provide information for semantic /// analysis. class MultiplexExternalSemaSource : public ExternalSemaSource { + // LLVM-style RTTI. + static char ID; private: SmallVector<ExternalSemaSource *, 2> Sources; // doesn't own them. @@ -352,9 +354,11 @@ bool MaybeDiagnoseMissingCompleteType(SourceLocation Loc, QualType T) override; - // isa/cast/dyn_cast support - static bool classof(const MultiplexExternalSemaSource*) { return true; } - //static bool classof(const ExternalSemaSource*) { return true; } + // LLVM-style RTTI. + bool isA(const void *ClassID) const override { + return ClassID == &ID || ExternalSemaSource::isA(ClassID); + } + static bool classof(const ExternalASTSource *S) { return S->isA(&ID); } }; } // end namespace clang Index: clang/include/clang/Sema/ExternalSemaSource.h =================================================================== --- clang/include/clang/Sema/ExternalSemaSource.h +++ clang/include/clang/Sema/ExternalSemaSource.h @@ -50,10 +50,11 @@ /// external AST sources that also provide information for semantic /// analysis. class ExternalSemaSource : public ExternalASTSource { + // LLVM-style RTTI. + static char ID; + public: - ExternalSemaSource() { - ExternalASTSource::SemaSource = true; - } + ExternalSemaSource() = default; ~ExternalSemaSource() override; @@ -222,10 +223,11 @@ return false; } - // isa/cast/dyn_cast support - static bool classof(const ExternalASTSource *Source) { - return Source->SemaSource; + // LLVM-style RTTI. + bool isA(const void *ClassID) const override { + return ClassID == &ID || ExternalASTSource::isA(ClassID); } + static bool classof(const ExternalASTSource *S) { return S->isA(&ID); } }; } // end namespace clang Index: clang/include/clang/AST/ExternalASTSource.h =================================================================== --- clang/include/clang/AST/ExternalASTSource.h +++ clang/include/clang/AST/ExternalASTSource.h @@ -66,9 +66,8 @@ /// whenever we might have added new redeclarations for existing decls. uint32_t CurrentGeneration = 0; - /// Whether this AST source also provides information for - /// semantic analysis. - bool SemaSource = false; + // LLVM-style RTTI. + static char ID; public: ExternalASTSource() = default; @@ -325,6 +324,10 @@ virtual void getMemoryBufferSizes(MemoryBufferSizes &sizes) const; + // LLVM-style RTTI. + virtual bool isA(const void *ClassID) const { return ClassID == &ID; } + static bool classof(const ExternalASTSource *S) { return S->isA(&ID); } + protected: static DeclContextLookupResult SetExternalVisibleDeclsForName(const DeclContext *DC,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits