xiaobai created this revision. xiaobai added reviewers: JDevlieghere, clayborg, jingham, teemperor. Herald added subscribers: kadircet, arphaman, mgorny. Herald added a project: LLDB.
This removes DeclVendor's dependency on clang (and ClangASTContext). DeclVendor has no need to know about specific TypeSystems. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D66628 Files: lldb/include/lldb/Symbol/ClangASTContext.h lldb/include/lldb/Symbol/DeclVendor.h lldb/include/lldb/Symbol/TypeSystem.h lldb/source/Plugins/ExpressionParser/Clang/CMakeLists.txt lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.cpp lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.h lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h lldb/source/Symbol/ClangASTContext.cpp lldb/source/Symbol/DeclVendor.cpp
Index: lldb/source/Symbol/DeclVendor.cpp =================================================================== --- lldb/source/Symbol/DeclVendor.cpp +++ lldb/source/Symbol/DeclVendor.cpp @@ -7,8 +7,8 @@ //===----------------------------------------------------------------------===// #include "lldb/Symbol/DeclVendor.h" - -#include "lldb/Symbol/ClangASTContext.h" +#include "lldb/Symbol/CompilerDecl.h" +#include "lldb/Symbol/TypeSystem.h" #include <vector> @@ -20,10 +20,11 @@ // FIXME: This depends on clang, but should be able to support any // TypeSystem. std::vector<CompilerType> ret; - std::vector<clang::NamedDecl *> decls; + std::vector<CompilerDecl> decls; if (FindDecls(name, /*append*/ true, max_matches, decls)) - for (auto *decl : decls) - if (auto type = ClangASTContext::GetTypeForDecl(decl)) + for (auto decl : decls) + if (auto type = + decl.GetTypeSystem()->GetTypeForDecl(decl.GetOpaqueDecl())) ret.push_back(type); return ret; } Index: lldb/source/Symbol/ClangASTContext.cpp =================================================================== --- lldb/source/Symbol/ClangASTContext.cpp +++ lldb/source/Symbol/ClangASTContext.cpp @@ -1473,6 +1473,16 @@ return ast->getASTContext()->hasSameType(type1_qual, type2_qual); } +CompilerType ClangASTContext::GetTypeForDecl(void *opaque_decl) { + if (!opaque_decl) + return CompilerType(); + + clang::Decl *decl = static_cast<clang::Decl *>(opaque_decl); + if (auto *named_decl = llvm::dyn_cast<clang::NamedDecl>(decl)) + return GetTypeForDecl(named_decl); + return CompilerType(); +} + CompilerType ClangASTContext::GetTypeForDecl(clang::NamedDecl *decl) { if (clang::ObjCInterfaceDecl *interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl)) Index: lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h =================================================================== --- lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h +++ lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h @@ -17,6 +17,7 @@ #include "llvm/Support/Casting.h" #include "lldb/Breakpoint/BreakpointPrecondition.h" +#include "lldb/Core/ClangForward.h" #include "lldb/Core/PluginInterface.h" #include "lldb/Core/ThreadSafeDenseMap.h" #include "lldb/Symbol/CompilerType.h" Index: lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.h =================================================================== --- lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.h +++ lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.h @@ -9,6 +9,7 @@ #ifndef liblldb_ClangDeclVendor_h_ #define liblldb_ClangDeclVendor_h_ +#include "lldb/Core/ClangForward.h" #include "lldb/Symbol/DeclVendor.h" #include "clang/AST/ExternalASTMerger.h" @@ -29,6 +30,13 @@ /// An ImporterSource for this ClangDeclVendor. virtual clang::ExternalASTMerger::ImporterSource GetImporterSource() = 0; + uint32_t FindDecls(ConstString name, bool append, uint32_t max_matches, + std::vector<CompilerDecl> &decls) override; + + virtual uint32_t FindDecls(ConstString name, bool append, + uint32_t max_matches, + std::vector<clang::NamedDecl *> &decls) = 0; + static bool classof(const DeclVendor *vendor) { return vendor->GetKind() >= eClangDeclVendor && vendor->GetKind() < eLastClangDeclVendor; Index: lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.cpp =================================================================== --- /dev/null +++ lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.cpp @@ -0,0 +1,30 @@ +//===-- ClangDeclVendor.cpp -------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "Plugins/ExpressionParser/Clang/ClangDeclVendor.h" + +#include "lldb/Symbol/ClangASTContext.h" +#include "lldb/Utility/ConstString.h" + +using namespace lldb_private; + +uint32_t ClangDeclVendor::FindDecls(ConstString name, bool append, + uint32_t max_matches, + std::vector<CompilerDecl> &decls) { + if (!append) + decls.clear(); + + std::vector<clang::NamedDecl *> named_decls; + uint32_t ret = FindDecls(name, /*append*/ false, max_matches, named_decls); + for (auto *named_decl : named_decls) { + decls.push_back(CompilerDecl( + ClangASTContext::GetASTContext(&named_decl->getASTContext()), + named_decl)); + } + return ret; +} Index: lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp =================================================================== --- lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp +++ lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp @@ -9,6 +9,7 @@ #include "ClangASTSource.h" #include "ASTDumper.h" +#include "ClangDeclVendor.h" #include "ClangModulesDeclVendor.h" #include "lldb/Core/Module.h" @@ -971,7 +972,8 @@ uint32_t max_matches = 1; std::vector<clang::NamedDecl *> decls; - if (!decl_vendor->FindDecls(name, append, max_matches, decls)) + auto *clang_decl_vendor = llvm::cast<ClangDeclVendor>(decl_vendor); + if (!clang_decl_vendor->FindDecls(name, append, max_matches, decls)) break; if (log) { @@ -1423,7 +1425,9 @@ uint32_t max_matches = 1; std::vector<clang::NamedDecl *> decls; - if (!decl_vendor->FindDecls(interface_name, append, max_matches, decls)) + auto *clang_decl_vendor = llvm::cast<ClangDeclVendor>(decl_vendor); + if (!clang_decl_vendor->FindDecls(interface_name, append, max_matches, + decls)) break; ObjCInterfaceDecl *runtime_interface_decl = @@ -1612,7 +1616,8 @@ uint32_t max_matches = 1; std::vector<clang::NamedDecl *> decls; - if (!decl_vendor->FindDecls(class_name, append, max_matches, decls)) + auto *clang_decl_vendor = llvm::cast<ClangDeclVendor>(decl_vendor); + if (!clang_decl_vendor->FindDecls(class_name, append, max_matches, decls)) break; DeclFromUser<const ObjCInterfaceDecl> interface_decl_from_runtime( Index: lldb/source/Plugins/ExpressionParser/Clang/CMakeLists.txt =================================================================== --- lldb/source/Plugins/ExpressionParser/Clang/CMakeLists.txt +++ lldb/source/Plugins/ExpressionParser/Clang/CMakeLists.txt @@ -8,6 +8,7 @@ ASTStructExtractor.cpp ASTUtils.cpp ClangASTSource.cpp + ClangDeclVendor.cpp ClangExpressionDeclMap.cpp ClangExpressionParser.cpp ClangExpressionSourceCode.cpp Index: lldb/include/lldb/Symbol/TypeSystem.h =================================================================== --- lldb/include/lldb/Symbol/TypeSystem.h +++ lldb/include/lldb/Symbol/TypeSystem.h @@ -126,6 +126,8 @@ virtual CompilerType DeclGetFunctionArgumentType(void *opaque_decl, size_t arg_idx); + virtual CompilerType GetTypeForDecl(void *opaque_decl) = 0; + // CompilerDeclContext functions virtual std::vector<CompilerDecl> Index: lldb/include/lldb/Symbol/DeclVendor.h =================================================================== --- lldb/include/lldb/Symbol/DeclVendor.h +++ lldb/include/lldb/Symbol/DeclVendor.h @@ -9,7 +9,6 @@ #ifndef liblldb_DeclVendor_h_ #define liblldb_DeclVendor_h_ -#include "lldb/Core/ClangForward.h" #include "lldb/lldb-defines.h" #include <vector> @@ -51,7 +50,7 @@ /// max_matches. virtual uint32_t FindDecls(ConstString name, bool append, uint32_t max_matches, - std::vector<clang::NamedDecl *> &decls) = 0; + std::vector<CompilerDecl> &decls) = 0; /// Look up the types that the DeclVendor currently knows about matching a /// given name. Index: lldb/include/lldb/Symbol/ClangASTContext.h =================================================================== --- lldb/include/lldb/Symbol/ClangASTContext.h +++ lldb/include/lldb/Symbol/ClangASTContext.h @@ -465,6 +465,8 @@ CompilerType DeclGetFunctionArgumentType(void *opaque_decl, size_t arg_idx) override; + CompilerType GetTypeForDecl(void *opaque_decl) override; + // CompilerDeclContext override functions std::vector<CompilerDecl>
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits