[Lldb-commits] [lldb] e7cc833 - [lldb][NFC] Move searching for $__lldb_class into its own function in ClangExpressionDeclMap

Raphael Isemann via lldb-commits lldb-commits at lists.llvm.org
Wed Nov 20 06:12:55 PST 2019


Author: Raphael Isemann
Date: 2019-11-20T15:12:31+01:00
New Revision: e7cc833ddafdca10be4ef1322ab96ffee774045b

URL: https://github.com/llvm/llvm-project/commit/e7cc833ddafdca10be4ef1322ab96ffee774045b
DIFF: https://github.com/llvm/llvm-project/commit/e7cc833ddafdca10be4ef1322ab96ffee774045b.diff

LOG: [lldb][NFC] Move searching for $__lldb_class into its own function in ClangExpressionDeclMap

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 da106f4f8f44..b95713b44672 100644
--- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
+++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
@@ -824,138 +824,151 @@ void ClangExpressionDeclMap::SearchPersistenDecls(NameSearchContext &context,
 
   context.AddNamedDecl(parser_named_decl);
 }
-void ClangExpressionDeclMap::FindExternalVisibleDecls(
-    NameSearchContext &context, lldb::ModuleSP module_sp,
-    CompilerDeclContext &namespace_decl, unsigned int current_id) {
-  assert(m_ast_context);
 
+void ClangExpressionDeclMap::LookUpLldbClass(NameSearchContext &context,
+                                             unsigned int current_id) {
   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
 
-  SymbolContextList sc_list;
-
-  const ConstString name(context.m_decl_name.getAsString().c_str());
-  if (IgnoreName(name, false))
-    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);
 
-  // Try the persistent decls, which take precedence over all else.
-  if (!namespace_decl)
-    SearchPersistenDecls(context, name, current_id);
+  if (m_ctx_obj) {
+    Status status;
+    lldb::ValueObjectSP ctx_obj_ptr = m_ctx_obj->AddressOf(status);
+    if (!ctx_obj_ptr || status.Fail())
+      return;
 
-  if (name.GetCString()[0] == '$' && !namespace_decl) {
-    static ConstString g_lldb_class_name("$__lldb_class");
+    AddThisType(context, TypeFromUser(m_ctx_obj->GetCompilerType()),
+                current_id);
 
-    if (name == g_lldb_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;
+    m_struct_vars->m_object_pointer_type =
+        TypeFromUser(ctx_obj_ptr->GetCompilerType());
 
-        AddThisType(context, TypeFromUser(m_ctx_obj->GetCompilerType()),
-                    current_id);
+    return;
+  }
 
-        m_struct_vars->m_object_pointer_type =
-            TypeFromUser(ctx_obj_ptr->GetCompilerType());
+  // Clang is looking for the type of "this"
 
-        return;
-      }
+  if (frame == nullptr)
+    return;
 
-      // Clang is looking for the type of "this"
+  // Find the block that defines the function represented by "sym_ctx"
+  Block *function_block = sym_ctx.GetFunctionBlock();
 
-      if (frame == nullptr)
-        return;
+  if (!function_block)
+    return;
 
-      // Find the block that defines the function represented by "sym_ctx"
-      Block *function_block = sym_ctx.GetFunctionBlock();
+  CompilerDeclContext function_decl_ctx = function_block->GetDeclContext();
 
-      if (!function_block)
-        return;
+  if (!function_decl_ctx)
+    return;
 
-      CompilerDeclContext function_decl_ctx = function_block->GetDeclContext();
+  clang::CXXMethodDecl *method_decl =
+      ClangASTContext::DeclContextGetAsCXXMethodDecl(function_decl_ctx);
 
-      if (!function_decl_ctx)
-        return;
+  if (method_decl) {
+    clang::CXXRecordDecl *class_decl = method_decl->getParent();
 
-      clang::CXXMethodDecl *method_decl =
-          ClangASTContext::DeclContextGetAsCXXMethodDecl(function_decl_ctx);
+    QualType class_qual_type(class_decl->getTypeForDecl(), 0);
 
-      if (method_decl) {
-        clang::CXXRecordDecl *class_decl = method_decl->getParent();
+    TypeFromUser class_user_type(
+        class_qual_type.getAsOpaquePtr(),
+        ClangASTContext::GetASTContext(&class_decl->getASTContext()));
 
-        QualType class_qual_type(class_decl->getTypeForDecl(), 0);
+    if (log) {
+      ASTDumper ast_dumper(class_qual_type);
+      LLDB_LOGF(log, "  CEDM::FEVD[%u] Adding type for $__lldb_class: %s",
+                current_id, ast_dumper.GetCString());
+    }
 
-        TypeFromUser class_user_type(
-            class_qual_type.getAsOpaquePtr(),
-            ClangASTContext::GetASTContext(&class_decl->getASTContext()));
+    AddThisType(context, class_user_type, current_id);
 
-        if (log) {
-          ASTDumper ast_dumper(class_qual_type);
-          LLDB_LOGF(log, "  CEDM::FEVD[%u] Adding type for $__lldb_class: %s",
-                    current_id, ast_dumper.GetCString());
-        }
+    if (method_decl->isInstance()) {
+      // self is a pointer to the object
 
-        AddThisType(context, class_user_type, current_id);
+      QualType class_pointer_type =
+          method_decl->getASTContext().getPointerType(class_qual_type);
 
-        if (method_decl->isInstance()) {
-          // self is a pointer to the object
+      TypeFromUser self_user_type(
+          class_pointer_type.getAsOpaquePtr(),
+          ClangASTContext::GetASTContext(&method_decl->getASTContext()));
 
-          QualType class_pointer_type =
-              method_decl->getASTContext().getPointerType(class_qual_type);
+      m_struct_vars->m_object_pointer_type = self_user_type;
+    }
+    return;
+  }
 
-          TypeFromUser self_user_type(
-              class_pointer_type.getAsOpaquePtr(),
-              ClangASTContext::GetASTContext(&method_decl->getASTContext()));
+  // 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 "this" variable in the current scope
+  // and use its type.
+  // FIXME: This code is formally correct, but clang doesn't currently
+  // emit DW_AT_object_pointer
+  // for C++ so it hasn't actually been tested.
 
-          m_struct_vars->m_object_pointer_type = self_user_type;
-        }
-      } 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 "this" variable in the current scope
-        // and use its type.
-        // FIXME: This code is formally correct, but clang doesn't currently
-        // emit DW_AT_object_pointer
-        // for C++ so it hasn't actually been tested.
+  VariableList *vars = frame->GetVariableList(false);
 
-        VariableList *vars = frame->GetVariableList(false);
+  lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
 
-        lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
+  if (this_var && this_var->IsInScope(frame) &&
+      this_var->LocationIsValidForFrame(frame)) {
+    Type *this_type = this_var->GetType();
 
-        if (this_var && this_var->IsInScope(frame) &&
-            this_var->LocationIsValidForFrame(frame)) {
-          Type *this_type = this_var->GetType();
+    if (!this_type)
+      return;
 
-          if (!this_type)
-            return;
+    TypeFromUser pointee_type =
+        this_type->GetForwardCompilerType().GetPointeeType();
 
-          TypeFromUser pointee_type =
-              this_type->GetForwardCompilerType().GetPointeeType();
+    if (pointee_type.IsValid()) {
+      if (log) {
+        ASTDumper ast_dumper(pointee_type);
+        LLDB_LOGF(log, "  FEVD[%u] Adding type for $__lldb_class: %s",
+                  current_id, ast_dumper.GetCString());
+      }
 
-          if (pointee_type.IsValid()) {
-            if (log) {
-              ASTDumper ast_dumper(pointee_type);
-              LLDB_LOGF(log, "  FEVD[%u] Adding type for $__lldb_class: %s",
-                        current_id, ast_dumper.GetCString());
-            }
+      AddThisType(context, pointee_type, current_id);
+      TypeFromUser this_user_type(this_type->GetFullCompilerType());
+      m_struct_vars->m_object_pointer_type = this_user_type;
+    }
+  }
+}
 
-            AddThisType(context, pointee_type, current_id);
-            TypeFromUser this_user_type(this_type->GetFullCompilerType());
-            m_struct_vars->m_object_pointer_type = this_user_type;
-            return;
-          }
-        }
-      }
+void ClangExpressionDeclMap::FindExternalVisibleDecls(
+    NameSearchContext &context, lldb::ModuleSP module_sp,
+    CompilerDeclContext &namespace_decl, unsigned int current_id) {
+  assert(m_ast_context);
+
+  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
+
+  SymbolContextList sc_list;
+
+  const ConstString name(context.m_decl_name.getAsString().c_str());
+  if (IgnoreName(name, false))
+    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);
+
+  // Try the persistent decls, which take precedence over all else.
+  if (!namespace_decl)
+    SearchPersistenDecls(context, name, current_id);
+
+  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;
     }
 

diff  --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.h b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.h
index 4b80248ceac5..2d7b3712ad53 100644
--- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.h
+++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.h
@@ -390,6 +390,16 @@ class ClangExpressionDeclMap : public ClangASTSource {
   void SearchPersistenDecls(NameSearchContext &context, const ConstString name,
                             unsigned int current_id);
 
+  /// Handles looking up $__lldb_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 LookUpLldbClass(NameSearchContext &context, unsigned int current_id);
+
   /// Given a target, find a variable that matches the given name and type.
   ///
   /// \param[in] target


        


More information about the lldb-commits mailing list