diff options
5 files changed, 83 insertions, 56 deletions
diff --git a/lldb/source/Commands/CommandObjectMemory.cpp b/lldb/source/Commands/CommandObjectMemory.cpp index 7a0da8386d7..b9f9edaab6c 100644 --- a/lldb/source/Commands/CommandObjectMemory.cpp +++ b/lldb/source/Commands/CommandObjectMemory.cpp @@ -540,7 +540,7 @@ protected: { if (ClangPersistentVariables *persistent_vars = llvm::dyn_cast_or_null<ClangPersistentVariables>(target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC))) { - clang::TypeDecl *tdecl = persistent_vars->GetPersistentType(ConstString(lookup_type_name)); + clang::TypeDecl *tdecl = llvm::dyn_cast_or_null<clang::TypeDecl>(persistent_vars->GetPersistentDecl(ConstString(lookup_type_name))); if (tdecl) { diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ASTResultSynthesizer.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ASTResultSynthesizer.cpp index 02505bde240..02daf7f515d 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ASTResultSynthesizer.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ASTResultSynthesizer.cpp @@ -464,7 +464,7 @@ ASTResultSynthesizer::MaybeRecordPersistentType(TypeDecl *D) D); if (TypeDecl *TypeDecl_scratch = dyn_cast<TypeDecl>(D_scratch)) - llvm::cast<ClangPersistentVariables>(m_target.GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC))->RegisterPersistentType(name_cs, TypeDecl_scratch); + llvm::cast<ClangPersistentVariables>(m_target.GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC))->RegisterPersistentDecl(name_cs, TypeDecl_scratch); } void diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp index 235e5c18981..b40fe3b311f 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp @@ -877,6 +877,17 @@ ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, unsigned int current_id) { assert (m_ast_context); + + std::function<void (clang::FunctionDecl *)> MaybeRegisterFunctionBody = + [this](clang::FunctionDecl *copied_function_decl) + { + if (copied_function_decl->getBody() && m_parser_vars->m_code_gen) + { + DeclGroupRef decl_group_ref(copied_function_decl); + m_parser_vars->m_code_gen->HandleTopLevelDecl(decl_group_ref); + } + }; + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); @@ -902,6 +913,52 @@ ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, SymbolContext sym_ctx; if (frame != nullptr) sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction|lldb::eSymbolContextBlock); + + // Try the persistent decls, which take precedence over all else. + if (!namespace_decl) + { + do + { + if (!target) + break; + + ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext(); + + if (!scratch_clang_ast_context) + break; + + ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext(); + + if (!scratch_ast_context) + break; + + NamedDecl *persistent_decl = m_parser_vars->m_persistent_vars->GetPersistentDecl(name); + + if (!persistent_decl) + break; + + Decl *parser_persistent_decl = m_ast_importer_sp->CopyDecl(m_ast_context, scratch_ast_context, persistent_decl); + + if (!parser_persistent_decl) + break; + + NamedDecl *parser_named_decl = dyn_cast<NamedDecl>(parser_persistent_decl); + + if (!parser_named_decl) + break; + + if (clang::FunctionDecl *parser_function_decl = llvm::dyn_cast<clang::FunctionDecl>(parser_named_decl)) + { + MaybeRegisterFunctionBody(parser_function_decl); + } + + if (log) + log->Printf(" CEDM::FEVD[%u] Found persistent decl %s", current_id, name.GetCString()); + + context.AddNamedDecl(parser_named_decl); + } while (0); + } + if (name_unique_cstr[0] == '$' && !namespace_decl) { static ConstString g_lldb_class_name ("$__lldb_class"); @@ -1153,42 +1210,6 @@ ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1)) return; - do - { - if (!target) - break; - - ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext(); - - if (!scratch_clang_ast_context) - break; - - ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext(); - - if (!scratch_ast_context) - break; - - TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name); - - if (!ptype_type_decl) - break; - - Decl *parser_ptype_decl = m_ast_importer_sp->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl); - - if (!parser_ptype_decl) - break; - - TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl); - - if (!parser_ptype_type_decl) - break; - - if (log) - log->Printf(" CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString()); - - context.AddNamedDecl(parser_ptype_type_decl); - } while (0); - ExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name)); if (pvar_sp) @@ -1544,11 +1565,7 @@ ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, break; } - if (copied_function_decl->getBody() && m_parser_vars->m_code_gen) - { - DeclGroupRef decl_group_ref(copied_function_decl); - m_parser_vars->m_code_gen->HandleTopLevelDecl(decl_group_ref); - } + MaybeRegisterFunctionBody(copied_function_decl); context.AddNamedDecl(copied_function_decl); diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp index 9bf9d435d7e..d1478e49bff 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp @@ -14,6 +14,8 @@ #include "lldb/Core/StreamString.h" #include "lldb/Core/Value.h" +#include "clang/AST/Decl.h" + #include "llvm/ADT/StringMap.h" using namespace lldb; @@ -66,18 +68,26 @@ ClangPersistentVariables::GetNextPersistentVariableName () } void -ClangPersistentVariables::RegisterPersistentType (const ConstString &name, - clang::TypeDecl *type_decl) +ClangPersistentVariables::RegisterPersistentDecl (const ConstString &name, + clang::NamedDecl *decl) { - m_persistent_types.insert(std::pair<const char*, clang::TypeDecl*>(name.GetCString(), type_decl)); + m_persistent_decls.insert(std::pair<const char*, clang::NamedDecl*>(name.GetCString(), decl)); + + if (clang::EnumDecl *enum_decl = llvm::dyn_cast<clang::EnumDecl>(decl)) + { + for (clang::EnumConstantDecl *enumerator_decl : enum_decl->enumerators()) + { + m_persistent_decls.insert(std::pair<const char*, clang::NamedDecl*>(ConstString(enumerator_decl->getNameAsString()).GetCString(), enumerator_decl)); + } + } } -clang::TypeDecl * -ClangPersistentVariables::GetPersistentType (const ConstString &name) +clang::NamedDecl * +ClangPersistentVariables::GetPersistentDecl (const ConstString &name) { - PersistentTypeMap::const_iterator i = m_persistent_types.find(name.GetCString()); + PersistentDeclMap::const_iterator i = m_persistent_decls.find(name.GetCString()); - if (i == m_persistent_types.end()) + if (i == m_persistent_decls.end()) return NULL; else return i->second; diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.h b/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.h index 0e03d013d04..e94db680e14 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.h +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.h @@ -74,11 +74,11 @@ public: LookupSymbol (const ConstString &name) override { return LLDB_INVALID_ADDRESS; } void - RegisterPersistentType (const ConstString &name, - clang::TypeDecl *tag_decl); + RegisterPersistentDecl (const ConstString &name, + clang::NamedDecl *decl); - clang::TypeDecl * - GetPersistentType (const ConstString &name); + clang::NamedDecl * + GetPersistentDecl (const ConstString &name); void AddHandLoadedClangModule(ClangModulesDeclVendor::ModuleID module) @@ -94,8 +94,8 @@ public: private: uint32_t m_next_persistent_variable_id; ///< The counter used by GetNextResultName(). - typedef llvm::DenseMap<const char *, clang::TypeDecl *> PersistentTypeMap; - PersistentTypeMap m_persistent_types; ///< The persistent types declared by the user. + typedef llvm::DenseMap<const char *, clang::NamedDecl *> PersistentDeclMap; + PersistentDeclMap m_persistent_decls; ///< Persistent entities declared by the user. ClangModulesDeclVendor::ModuleVector m_hand_loaded_clang_modules; ///< These are Clang modules we hand-loaded; these are the highest- ///< priority source for macros. |