Author: Raphael Isemann Date: 2019-11-20T16:10:24+01:00 New Revision: 51ad025ff313804674b4fb01f56f7b83e3ecc5e3
URL: https://github.com/llvm/llvm-project/commit/51ad025ff313804674b4fb01f56f7b83e3ecc5e3 DIFF: https://github.com/llvm/llvm-project/commit/51ad025ff313804674b4fb01f56f7b83e3ecc5e3.diff LOG: [lldb][NFC] Move searching for $__lldb_objc_class into its own function Same as in commit e7cc833ddafdca10be4ef1322ab96ffee774045b but with $__lldb_objc_class. Added: Modified: lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.h Removed: ################################################################################ diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp index b95713b44672..7b8456257c62 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp @@ -938,178 +938,180 @@ void ClangExpressionDeclMap::LookUpLldbClass(NameSearchContext &context, } } -void ClangExpressionDeclMap::FindExternalVisibleDecls( - NameSearchContext &context, lldb::ModuleSP module_sp, - CompilerDeclContext &namespace_decl, unsigned int current_id) { - assert(m_ast_context); - +void ClangExpressionDeclMap::LookUpLldbObjCClass(NameSearchContext &context, + unsigned int current_id) { Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); - SymbolContextList sc_list; + StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); - const ConstString name(context.m_decl_name.getAsString().c_str()); - if (IgnoreName(name, false)) - return; + if (m_ctx_obj) { + Status status; + lldb::ValueObjectSP ctx_obj_ptr = m_ctx_obj->AddressOf(status); + if (!ctx_obj_ptr || status.Fail()) + return; - // Only look for functions by name out in our symbols if the function doesn't - // start with our phony prefix of '$' - Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); - StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); - SymbolContext sym_ctx; - if (frame != nullptr) - sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction | - lldb::eSymbolContextBlock); + AddOneType(context, TypeFromUser(m_ctx_obj->GetCompilerType()), current_id); - // Try the persistent decls, which take precedence over all else. - if (!namespace_decl) - SearchPersistenDecls(context, name, current_id); + m_struct_vars->m_object_pointer_type = + TypeFromUser(ctx_obj_ptr->GetCompilerType()); - if (name.GetCString()[0] == '$' && !namespace_decl) { - static ConstString g_lldb_class_name("$__lldb_class"); + return; + } - if (name == g_lldb_class_name) { - LookUpLldbClass(context, current_id); - return; - } + // Clang is looking for the type of "*self" - static ConstString g_lldb_objc_class_name("$__lldb_objc_class"); - if (name == g_lldb_objc_class_name) { - if (m_ctx_obj) { - Status status; - lldb::ValueObjectSP ctx_obj_ptr = m_ctx_obj->AddressOf(status); - if (!ctx_obj_ptr || status.Fail()) - return; + if (!frame) + return; + + SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction | + lldb::eSymbolContextBlock); - AddOneType(context, TypeFromUser(m_ctx_obj->GetCompilerType()), - current_id); + // Find the block that defines the function represented by "sym_ctx" + Block *function_block = sym_ctx.GetFunctionBlock(); - m_struct_vars->m_object_pointer_type = - TypeFromUser(ctx_obj_ptr->GetCompilerType()); + if (!function_block) + return; - return; - } + CompilerDeclContext function_decl_ctx = function_block->GetDeclContext(); - // Clang is looking for the type of "*self" + if (!function_decl_ctx) + return; - if (!frame) - return; + clang::ObjCMethodDecl *method_decl = + ClangASTContext::DeclContextGetAsObjCMethodDecl(function_decl_ctx); - SymbolContext sym_ctx = frame->GetSymbolContext( - lldb::eSymbolContextFunction | lldb::eSymbolContextBlock); + if (method_decl) { + ObjCInterfaceDecl *self_interface = method_decl->getClassInterface(); - // Find the block that defines the function represented by "sym_ctx" - Block *function_block = sym_ctx.GetFunctionBlock(); + if (!self_interface) + return; - if (!function_block) - return; + const clang::Type *interface_type = self_interface->getTypeForDecl(); - CompilerDeclContext function_decl_ctx = function_block->GetDeclContext(); + if (!interface_type) + return; // This is unlikely, but we have seen crashes where this + // occurred - if (!function_decl_ctx) - return; + TypeFromUser class_user_type( + QualType(interface_type, 0).getAsOpaquePtr(), + ClangASTContext::GetASTContext(&method_decl->getASTContext())); + + if (log) { + ASTDumper ast_dumper(interface_type); + LLDB_LOGF(log, " FEVD[%u] Adding type for $__lldb_objc_class: %s", + current_id, ast_dumper.GetCString()); + } - clang::ObjCMethodDecl *method_decl = - ClangASTContext::DeclContextGetAsObjCMethodDecl(function_decl_ctx); + AddOneType(context, class_user_type, current_id); - if (method_decl) { - ObjCInterfaceDecl *self_interface = method_decl->getClassInterface(); + if (method_decl->isInstanceMethod()) { + // self is a pointer to the object - if (!self_interface) - return; + QualType class_pointer_type = + method_decl->getASTContext().getObjCObjectPointerType( + QualType(interface_type, 0)); - const clang::Type *interface_type = self_interface->getTypeForDecl(); + TypeFromUser self_user_type( + class_pointer_type.getAsOpaquePtr(), + ClangASTContext::GetASTContext(&method_decl->getASTContext())); - if (!interface_type) - return; // This is unlikely, but we have seen crashes where this - // occurred + m_struct_vars->m_object_pointer_type = self_user_type; + } else { + // self is a Class pointer + QualType class_type = method_decl->getASTContext().getObjCClassType(); - TypeFromUser class_user_type( - QualType(interface_type, 0).getAsOpaquePtr(), - ClangASTContext::GetASTContext(&method_decl->getASTContext())); + TypeFromUser self_user_type( + class_type.getAsOpaquePtr(), + ClangASTContext::GetASTContext(&method_decl->getASTContext())); - if (log) { - ASTDumper ast_dumper(interface_type); - LLDB_LOGF(log, " FEVD[%u] Adding type for $__lldb_objc_class: %s", - current_id, ast_dumper.GetCString()); - } + m_struct_vars->m_object_pointer_type = self_user_type; + } - AddOneType(context, class_user_type, current_id); + return; + } + // This branch will get hit if we are executing code in the context of + // a function that claims to have an object pointer (through + // DW_AT_object_pointer?) but is not formally a method of the class. + // In that case, just look up the "self" variable in the current scope + // and use its type. - if (method_decl->isInstanceMethod()) { - // self is a pointer to the object + VariableList *vars = frame->GetVariableList(false); - QualType class_pointer_type = - method_decl->getASTContext().getObjCObjectPointerType( - QualType(interface_type, 0)); + lldb::VariableSP self_var = vars->FindVariable(ConstString("self")); - TypeFromUser self_user_type( - class_pointer_type.getAsOpaquePtr(), - ClangASTContext::GetASTContext(&method_decl->getASTContext())); + if (self_var && self_var->IsInScope(frame) && + self_var->LocationIsValidForFrame(frame)) { + Type *self_type = self_var->GetType(); - m_struct_vars->m_object_pointer_type = self_user_type; - } else { - // self is a Class pointer - QualType class_type = method_decl->getASTContext().getObjCClassType(); + if (!self_type) + return; - TypeFromUser self_user_type( - class_type.getAsOpaquePtr(), - ClangASTContext::GetASTContext(&method_decl->getASTContext())); + CompilerType self_clang_type = self_type->GetFullCompilerType(); - m_struct_vars->m_object_pointer_type = self_user_type; - } + if (ClangASTContext::IsObjCClassType(self_clang_type)) { + return; + } else if (ClangASTContext::IsObjCObjectPointerType(self_clang_type)) { + self_clang_type = self_clang_type.GetPointeeType(); + if (!self_clang_type) return; - } else { - // This branch will get hit if we are executing code in the context of - // a function that claims to have an object pointer (through - // DW_AT_object_pointer?) but is not formally a method of the class. - // In that case, just look up the "self" variable in the current scope - // and use its type. - VariableList *vars = frame->GetVariableList(false); + if (log) { + ASTDumper ast_dumper(self_type->GetFullCompilerType()); + LLDB_LOGF(log, " FEVD[%u] Adding type for $__lldb_objc_class: %s", + current_id, ast_dumper.GetCString()); + } - lldb::VariableSP self_var = vars->FindVariable(ConstString("self")); + TypeFromUser class_user_type(self_clang_type); - if (self_var && self_var->IsInScope(frame) && - self_var->LocationIsValidForFrame(frame)) { - Type *self_type = self_var->GetType(); + AddOneType(context, class_user_type, current_id); - if (!self_type) - return; + TypeFromUser self_user_type(self_type->GetFullCompilerType()); - CompilerType self_clang_type = self_type->GetFullCompilerType(); + m_struct_vars->m_object_pointer_type = self_user_type; + } + } +} - if (ClangASTContext::IsObjCClassType(self_clang_type)) { - return; - } else if (ClangASTContext::IsObjCObjectPointerType( - self_clang_type)) { - self_clang_type = self_clang_type.GetPointeeType(); +void ClangExpressionDeclMap::FindExternalVisibleDecls( + NameSearchContext &context, lldb::ModuleSP module_sp, + CompilerDeclContext &namespace_decl, unsigned int current_id) { + assert(m_ast_context); - if (!self_clang_type) - return; + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); - if (log) { - ASTDumper ast_dumper(self_type->GetFullCompilerType()); - LLDB_LOGF(log, - " FEVD[%u] Adding type for $__lldb_objc_class: %s", - current_id, ast_dumper.GetCString()); - } + SymbolContextList sc_list; - TypeFromUser class_user_type(self_clang_type); + const ConstString name(context.m_decl_name.getAsString().c_str()); + if (IgnoreName(name, false)) + return; - AddOneType(context, class_user_type, current_id); + // Only look for functions by name out in our symbols if the function doesn't + // start with our phony prefix of '$' + Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); + StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); + SymbolContext sym_ctx; + if (frame != nullptr) + sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction | + lldb::eSymbolContextBlock); - TypeFromUser self_user_type(self_type->GetFullCompilerType()); + // Try the persistent decls, which take precedence over all else. + if (!namespace_decl) + SearchPersistenDecls(context, name, current_id); - m_struct_vars->m_object_pointer_type = self_user_type; - return; - } - } - } + if (name.GetCString()[0] == '$' && !namespace_decl) { + static ConstString g_lldb_class_name("$__lldb_class"); + if (name == g_lldb_class_name) { + LookUpLldbClass(context, current_id); return; } + static ConstString g_lldb_objc_class_name("$__lldb_objc_class"); + if (name == g_lldb_objc_class_name) { + LookUpLldbObjCClass(context, current_id); + return; + } if (name == ConstString(g_lldb_local_vars_namespace_cstr)) { CompilerDeclContext frame_decl_context = sym_ctx.block != nullptr ? sym_ctx.block->GetDeclContext() diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.h b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.h index 2d7b3712ad53..93342dace77e 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.h +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.h @@ -400,6 +400,16 @@ class ClangExpressionDeclMap : public ClangASTSource { /// for logging purposes. void LookUpLldbClass(NameSearchContext &context, unsigned int current_id); + /// Handles looking up $__lldb_objc_class which requires special treatment. + /// + /// \param[in] context + /// The NameSearchContext that can construct Decls for this name. + /// + /// \param[in] current_id + /// The ID for the current FindExternalVisibleDecls invocation, + /// for logging purposes. + void LookUpLldbObjCClass(NameSearchContext &context, unsigned int current_id); + /// Given a target, find a variable that matches the given name and type. /// /// \param[in] target _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits