diff options
| -rw-r--r-- | lldb/include/lldb/Symbol/ClangASTContext.h | 2 | ||||
| -rw-r--r-- | lldb/include/lldb/Symbol/DeclVendor.h | 3 | ||||
| -rw-r--r-- | lldb/include/lldb/Symbol/TypeSystem.h | 2 | ||||
| -rw-r--r-- | lldb/source/Plugins/ExpressionParser/Clang/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp | 11 | ||||
| -rw-r--r-- | lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.cpp | 30 | ||||
| -rw-r--r-- | lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.h | 8 | ||||
| -rw-r--r-- | lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h | 1 | ||||
| -rw-r--r-- | lldb/source/Symbol/ClangASTContext.cpp | 10 | ||||
| -rw-r--r-- | lldb/source/Symbol/DeclVendor.cpp | 11 | 
10 files changed, 69 insertions, 10 deletions
diff --git a/lldb/include/lldb/Symbol/ClangASTContext.h b/lldb/include/lldb/Symbol/ClangASTContext.h index f4912050ff9..6536c432f41 100644 --- a/lldb/include/lldb/Symbol/ClangASTContext.h +++ b/lldb/include/lldb/Symbol/ClangASTContext.h @@ -465,6 +465,8 @@ public:    CompilerType DeclGetFunctionArgumentType(void *opaque_decl,                                             size_t arg_idx) override; +  CompilerType GetTypeForDecl(void *opaque_decl) override; +    // CompilerDeclContext override functions    std::vector<CompilerDecl> diff --git a/lldb/include/lldb/Symbol/DeclVendor.h b/lldb/include/lldb/Symbol/DeclVendor.h index 203f34e56cb..748c0c8ac96 100644 --- a/lldb/include/lldb/Symbol/DeclVendor.h +++ b/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 @@ public:    ///     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. diff --git a/lldb/include/lldb/Symbol/TypeSystem.h b/lldb/include/lldb/Symbol/TypeSystem.h index ccd4d8e17be..bff15da955e 100644 --- a/lldb/include/lldb/Symbol/TypeSystem.h +++ b/lldb/include/lldb/Symbol/TypeSystem.h @@ -126,6 +126,8 @@ public:    virtual CompilerType DeclGetFunctionArgumentType(void *opaque_decl,                                                     size_t arg_idx); +  virtual CompilerType GetTypeForDecl(void *opaque_decl) = 0; +    // CompilerDeclContext functions    virtual std::vector<CompilerDecl> diff --git a/lldb/source/Plugins/ExpressionParser/Clang/CMakeLists.txt b/lldb/source/Plugins/ExpressionParser/Clang/CMakeLists.txt index 950dae6eef3..99d50c4007f 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/CMakeLists.txt +++ b/lldb/source/Plugins/ExpressionParser/Clang/CMakeLists.txt @@ -8,6 +8,7 @@ add_lldb_library(lldbPluginExpressionParserClang PLUGIN    ASTStructExtractor.cpp    ASTUtils.cpp    ClangASTSource.cpp +  ClangDeclVendor.cpp    ClangExpressionDeclMap.cpp    ClangExpressionParser.cpp    ClangExpressionSourceCode.cpp diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp index 2788e691dbb..e33bfc774b8 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp +++ b/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 @@ void ClangASTSource::FindExternalVisibleDecls(          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 @@ void ClangASTSource::FindObjCMethodDecls(NameSearchContext &context) {      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 @@ void ClangASTSource::FindObjCPropertyAndIvarDecls(NameSearchContext &context) {      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( diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.cpp new file mode 100644 index 00000000000..c59722b7b4f --- /dev/null +++ b/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; +} diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.h b/lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.h index afeb5ce9fe6..90b715f37cb 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.h +++ b/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 @@ public:    ///     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; diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h b/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h index 1925c78ed34..39acd6e9f26 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h +++ b/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" diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index faeaf78339b..36700846802 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -1473,6 +1473,16 @@ bool ClangASTContext::AreTypesSame(CompilerType type1, CompilerType type2,    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)) diff --git a/lldb/source/Symbol/DeclVendor.cpp b/lldb/source/Symbol/DeclVendor.cpp index 0a912a2fd21..9ccf422e3be 100644 --- a/lldb/source/Symbol/DeclVendor.cpp +++ b/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 @@ std::vector<CompilerType> DeclVendor::FindTypes(ConstString name,    // 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;  }  | 

