[Lldb-commits] [lldb] Add the ability to get a C++ vtable ValueObject from another ValueObj… (PR #67599)

via lldb-commits lldb-commits at lists.llvm.org
Mon Oct 30 17:46:30 PDT 2023


github-actions[bot] wrote:

<!--LLVM CODE FORMAT COMMENT: {clang-format}-->


:warning: C/C++ code formatter, clang-format found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

``````````bash
git-clang-format --diff 6eafe2cb7a3286c1b13eea7d8370374553fe81a9 f06cd76bd05f95277dced786ac3ca3e83f2e8779 -- lldb/include/lldb/Core/ValueObjectVTable.h lldb/source/Core/ValueObjectVTable.cpp lldb/test/API/functionalities/vtable/main.cpp lldb/include/lldb/API/SBValue.h lldb/include/lldb/Core/ValueObject.h lldb/include/lldb/Core/ValueObjectChild.h lldb/include/lldb/Symbol/Type.h lldb/include/lldb/Symbol/TypeSystem.h lldb/include/lldb/Target/LanguageRuntime.h lldb/include/lldb/lldb-enumerations.h lldb/source/API/SBValue.cpp lldb/source/Commands/CommandObjectFrame.cpp lldb/source/Core/ValueObject.cpp lldb/source/DataFormatters/CXXFunctionPointer.cpp lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.h lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h lldb/source/Symbol/Type.cpp
``````````

</details>

<details>
<summary>
View the diff from clang-format here.
</summary>

``````````diff
diff --git a/lldb/include/lldb/Target/LanguageRuntime.h b/lldb/include/lldb/Target/LanguageRuntime.h
index a2a9c0163..749f78170 100644
--- a/lldb/include/lldb/Target/LanguageRuntime.h
+++ b/lldb/include/lldb/Target/LanguageRuntime.h
@@ -78,9 +78,8 @@ public:
   virtual bool GetObjectDescription(Stream &str, Value &value,
                                     ExecutionContextScope *exe_scope) = 0;
 
-
   struct VTableInfo {
-    Address addr; /// Address of the vtable's virtual function table
+    Address addr;   /// Address of the vtable's virtual function table
     Symbol *symbol; /// The vtable symbol from the symbol table
   };
   /// Get the vtable information for a given value.
diff --git a/lldb/source/API/SBValue.cpp b/lldb/source/API/SBValue.cpp
index 34d01d759..8f6367da8 100644
--- a/lldb/source/API/SBValue.cpp
+++ b/lldb/source/API/SBValue.cpp
@@ -1038,9 +1038,9 @@ lldb::ValueObjectSP SBValue::GetSP(ValueLocker &locker) const {
   // IsValid means that the SBValue has a value in it.  But that's not the
   // only time that ValueObjects are useful.  We also want to return the value
   // if there's an error state in it.
-  if (!m_opaque_sp || (!m_opaque_sp->IsValid()
-      && (m_opaque_sp->GetRootSP()
-          && !m_opaque_sp->GetRootSP()->GetError().Fail()))) {
+  if (!m_opaque_sp || (!m_opaque_sp->IsValid() &&
+                       (m_opaque_sp->GetRootSP() &&
+                        !m_opaque_sp->GetRootSP()->GetError().Fail()))) {
     locker.GetError().SetErrorString("No value");
     return ValueObjectSP();
   }
diff --git a/lldb/source/Core/ValueObjectVTable.cpp b/lldb/source/Core/ValueObjectVTable.cpp
index 177ae4167..fb4dc7530 100644
--- a/lldb/source/Core/ValueObjectVTable.cpp
+++ b/lldb/source/Core/ValueObjectVTable.cpp
@@ -82,7 +82,6 @@ protected:
       return false;
     }
 
-
     // Set our value to be the load address of the function pointer in memory
     // and our type to be the function pointer type.
     m_value.SetValueType(Value::ValueType::LoadAddress);
@@ -107,7 +106,7 @@ protected:
       // the language from it correctly.
       ValueObject *val = parent->GetParent();
       auto type_system = target_sp->GetScratchTypeSystemForLanguage(
-            val ? val->GetObjectRuntimeLanguage() : eLanguageTypeC_plus_plus);
+          val ? val->GetObjectRuntimeLanguage() : eLanguageTypeC_plus_plus);
       if (type_system) {
         m_value.SetCompilerType(
             (*type_system)->CreateGenericFunctionPrototype().GetPointerType());
@@ -122,7 +121,7 @@ protected:
     if (m_error.Success()) {
       const bool thread_and_frame_only_if_stopped = true;
       ExecutionContext exe_ctx(
-        GetExecutionContextRef().Lock(thread_and_frame_only_if_stopped));
+          GetExecutionContextRef().Lock(thread_and_frame_only_if_stopped));
       m_error = m_value.GetValueAsData(&exe_ctx, m_data, GetModule().get());
     }
     SetValueDidChange(true);
@@ -257,7 +256,7 @@ bool ValueObjectVTable::UpdateValue() {
   m_value.SetValueType(Value::ValueType::LoadAddress);
   m_value.GetScalar() = parent->GetAddressOf();
   auto type_system_or_err =
-        target_sp->GetScratchTypeSystemForLanguage(eLanguageTypeC_plus_plus);
+      target_sp->GetScratchTypeSystemForLanguage(eLanguageTypeC_plus_plus);
   if (type_system_or_err) {
     m_value.SetCompilerType(
         (*type_system_or_err)->GetBasicTypeFromAST(eBasicTypeUnsignedLong));
diff --git a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp
index 17c8b4357..eee70bf74 100644
--- a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp
+++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp
@@ -54,8 +54,9 @@ bool ItaniumABILanguageRuntime::CouldHaveDynamicValue(ValueObject &in_value) {
                                                           check_objc);
 }
 
-TypeAndOrName ItaniumABILanguageRuntime::GetTypeInfo(
-    ValueObject &in_value, const VTableInfo &vtable_info) {
+TypeAndOrName
+ItaniumABILanguageRuntime::GetTypeInfo(ValueObject &in_value,
+                                       const VTableInfo &vtable_info) {
   if (vtable_info.addr.IsSectionOffset()) {
     // See if we have cached info for this type already
     TypeAndOrName type_info = GetDynamicTypeInfo(vtable_info.addr);
@@ -69,8 +70,7 @@ TypeAndOrName ItaniumABILanguageRuntime::GetTypeInfo(
       LLDB_LOGF(log,
                 "0x%16.16" PRIx64
                 ": static-type = '%s' has vtable symbol '%s'\n",
-                in_value.GetPointerValue(),
-                in_value.GetTypeName().GetCString(),
+                in_value.GetPointerValue(), in_value.GetTypeName().GetCString(),
                 symbol_name.str().c_str());
       // We are a C++ class, that's good.  Get the class name and look it
       // up:
@@ -91,15 +91,15 @@ TypeAndOrName ItaniumABILanguageRuntime::GetTypeInfo(
       ModuleSP module_sp = vtable_info.symbol->CalculateSymbolContextModule();
       if (module_sp)
         module_sp->FindTypes(ConstString(lookup_name), exact_match, 1,
-                              searched_symbol_files, class_types);
+                             searched_symbol_files, class_types);
 
       // If we didn't find a symbol, then move on to the entire module
       // list in the target and get as many unique matches as possible
       Target &target = m_process->GetTarget();
       if (class_types.Empty())
         target.GetImages().FindTypes(nullptr, ConstString(lookup_name),
-                                      exact_match, UINT32_MAX,
-                                      searched_symbol_files, class_types);
+                                     exact_match, UINT32_MAX,
+                                     searched_symbol_files, class_types);
 
       lldb::TypeSP type_sp;
       if (class_types.Empty()) {
@@ -112,13 +112,13 @@ TypeAndOrName ItaniumABILanguageRuntime::GetTypeInfo(
         if (type_sp) {
           if (TypeSystemClang::IsCXXClassType(
                   type_sp->GetForwardCompilerType())) {
-            LLDB_LOGF(
-                log,
-                "0x%16.16" PRIx64
-                ": static-type = '%s' has dynamic type: uid={0x%" PRIx64
-                "}, type-name='%s'\n",
-                in_value.GetPointerValue(), in_value.GetTypeName().AsCString(),
-                type_sp->GetID(), type_sp->GetName().GetCString());
+            LLDB_LOGF(log,
+                      "0x%16.16" PRIx64
+                      ": static-type = '%s' has dynamic type: uid={0x%" PRIx64
+                      "}, type-name='%s'\n",
+                      in_value.GetPointerValue(),
+                      in_value.GetTypeName().AsCString(), type_sp->GetID(),
+                      type_sp->GetName().GetCString());
             type_info.SetTypeSP(type_sp);
           }
         }
@@ -128,14 +128,13 @@ TypeAndOrName ItaniumABILanguageRuntime::GetTypeInfo(
           for (i = 0; i < class_types.GetSize(); i++) {
             type_sp = class_types.GetTypeAtIndex(i);
             if (type_sp) {
-              LLDB_LOGF(
-                  log,
-                  "0x%16.16" PRIx64
-                  ": static-type = '%s' has multiple matching dynamic "
-                  "types: uid={0x%" PRIx64 "}, type-name='%s'\n",
-                  in_value.GetPointerValue(),
-                  in_value.GetTypeName().AsCString(),
-                  type_sp->GetID(), type_sp->GetName().GetCString());
+              LLDB_LOGF(log,
+                        "0x%16.16" PRIx64
+                        ": static-type = '%s' has multiple matching dynamic "
+                        "types: uid={0x%" PRIx64 "}, type-name='%s'\n",
+                        in_value.GetPointerValue(),
+                        in_value.GetTypeName().AsCString(), type_sp->GetID(),
+                        type_sp->GetName().GetCString());
             }
           }
         }
@@ -145,14 +144,13 @@ TypeAndOrName ItaniumABILanguageRuntime::GetTypeInfo(
           if (type_sp) {
             if (TypeSystemClang::IsCXXClassType(
                     type_sp->GetForwardCompilerType())) {
-              LLDB_LOGF(
-                  log,
-                  "0x%16.16" PRIx64 ": static-type = '%s' has multiple "
-                  "matching dynamic types, picking "
-                  "this one: uid={0x%" PRIx64 "}, type-name='%s'\n",
-                  in_value.GetPointerValue(),
-                  in_value.GetTypeName().AsCString(),
-                  type_sp->GetID(), type_sp->GetName().GetCString());
+              LLDB_LOGF(log,
+                        "0x%16.16" PRIx64 ": static-type = '%s' has multiple "
+                        "matching dynamic types, picking "
+                        "this one: uid={0x%" PRIx64 "}, type-name='%s'\n",
+                        in_value.GetPointerValue(),
+                        in_value.GetTypeName().AsCString(), type_sp->GetID(),
+                        type_sp->GetName().GetCString());
               type_info.SetTypeSP(type_sp);
             }
           }
@@ -187,7 +185,8 @@ llvm::Error ItaniumABILanguageRuntime::TypeHasVTable(CompilerType type) {
   // Make sure this is a class or a struct first by checking the type class
   // bitfield that gets returned.
   if ((type.GetTypeClass() & (eTypeClassStruct | eTypeClassClass)) == 0) {
-    return llvm::createStringError(std::errc::invalid_argument,
+    return llvm::createStringError(
+        std::errc::invalid_argument,
         "type \"%s\" is not a class or struct or a pointer to one",
         original_type.GetTypeName().AsCString("<invalid>"));
   }
@@ -195,8 +194,8 @@ llvm::Error ItaniumABILanguageRuntime::TypeHasVTable(CompilerType type) {
   // Check if the type has virtual functions by asking it if it is polymorphic.
   if (!type.IsPolymorphicClass()) {
     return llvm::createStringError(std::errc::invalid_argument,
-        "type \"%s\" doesn't have a vtable",
-        type.GetTypeName().AsCString("<invalid>"));
+                                   "type \"%s\" doesn't have a vtable",
+                                   type.GetTypeName().AsCString("<invalid>"));
   }
   return llvm::Error::success();
 }
@@ -209,8 +208,8 @@ llvm::Error ItaniumABILanguageRuntime::TypeHasVTable(CompilerType type) {
 // and is can pass in instances of classes which is not suitable for dynamic
 // type detection, these cases should pass true for \a check_type.
 llvm::Expected<LanguageRuntime::VTableInfo>
- ItaniumABILanguageRuntime::GetVTableInfo(ValueObject &in_value,
-                                          bool check_type) {
+ItaniumABILanguageRuntime::GetVTableInfo(ValueObject &in_value,
+                                         bool check_type) {
 
   CompilerType type = in_value.GetCompilerType();
   if (check_type) {
@@ -228,8 +227,8 @@ llvm::Expected<LanguageRuntime::VTableInfo>
   if (type.IsPointerOrReferenceType())
     original_ptr = in_value.GetPointerValue(&address_type);
   else
-    original_ptr = in_value.GetAddressOf(/*scalar_is_load_address=*/true,
-                                         &address_type);
+    original_ptr =
+        in_value.GetAddressOf(/*scalar_is_load_address=*/true, &address_type);
   if (original_ptr == LLDB_INVALID_ADDRESS || address_type != eAddressTypeLoad)
     return llvm::createStringError(std::errc::invalid_argument,
                                    "failed to get the address of the value");
@@ -239,17 +238,19 @@ llvm::Expected<LanguageRuntime::VTableInfo>
       process->ReadPointerFromMemory(original_ptr, error);
 
   if (!error.Success() || vtable_load_addr == LLDB_INVALID_ADDRESS)
-    return llvm::createStringError(std::errc::invalid_argument,
+    return llvm::createStringError(
+        std::errc::invalid_argument,
         "failed to read vtable pointer from memory at 0x%" PRIx64,
         original_ptr);
-;
+  ;
 
   // Find the symbol that contains the "vtable_load_addr" address
   Address vtable_addr;
   if (!process->GetTarget().ResolveLoadAddress(vtable_load_addr, vtable_addr))
     return llvm::createStringError(std::errc::invalid_argument,
-                                   "failed to resolve vtable pointer 0x%"
-                                   PRIx64 "to a section", vtable_load_addr);
+                                   "failed to resolve vtable pointer 0x%" PRIx64
+                                   "to a section",
+                                   vtable_load_addr);
 
   // Check our cache first to see if we already have this info
   {
@@ -272,8 +273,9 @@ llvm::Expected<LanguageRuntime::VTableInfo>
     return info;
   }
   return llvm::createStringError(std::errc::invalid_argument,
-      "symbol found that contains 0x%" PRIx64 " is not a vtable symbol",
-      vtable_load_addr);
+                                 "symbol found that contains 0x%" PRIx64
+                                 " is not a vtable symbol",
+                                 vtable_load_addr);
 }
 
 bool ItaniumABILanguageRuntime::GetDynamicTypeAndAddress(
@@ -348,8 +350,8 @@ bool ItaniumABILanguageRuntime::GetDynamicTypeAndAddress(
   // So the dynamic type is a value that starts at offset_to_top above
   // the original address.
   lldb::addr_t dynamic_addr = in_value.GetPointerValue() + offset_to_top;
-  if (!m_process->GetTarget().ResolveLoadAddress(
-          dynamic_addr, dynamic_address)) {
+  if (!m_process->GetTarget().ResolveLoadAddress(dynamic_addr,
+                                                 dynamic_address)) {
     dynamic_address.SetRawAddress(dynamic_addr);
   }
   return true;
@@ -671,11 +673,11 @@ ValueObjectSP ItaniumABILanguageRuntime::GetExceptionObjectForThread(
   ValueObjectSP exception = ValueObject::CreateValueObjectFromData(
       "exception", exception_isw.GetAsData(m_process->GetByteOrder()), exe_ctx,
       voidstar);
-  ValueObjectSP dyn_exception
-      = exception->GetDynamicValue(eDynamicDontRunTarget);
+  ValueObjectSP dyn_exception =
+      exception->GetDynamicValue(eDynamicDontRunTarget);
   // If we succeed in making a dynamic value, return that:
   if (dyn_exception)
-     return dyn_exception;
+    return dyn_exception;
 
   return exception;
 }
diff --git a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.h b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.h
index 0f7e73cfe..04c1e7cce 100644
--- a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.h
+++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.h
@@ -47,7 +47,6 @@ public:
     return runtime->isA(&ID);
   }
 
-
   llvm::Expected<LanguageRuntime::VTableInfo>
   GetVTableInfo(ValueObject &in_value, bool check_type) override;
 
diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
index f037708ef..f95ebb892 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -4719,14 +4719,13 @@ CompilerType TypeSystemClang::GetBasicTypeFromAST(lldb::BasicType basic_type) {
 CompilerType TypeSystemClang::CreateGenericFunctionPrototype() {
   clang::ASTContext &ast = getASTContext();
   const FunctionType::ExtInfo generic_ext_info(
-    /*noReturn=*/false,
-    /*hasRegParm=*/false,
-    /*regParm=*/0,
-    CallingConv::CC_C,
-    /*producesResult=*/false,
-    /*noCallerSavedRegs=*/false,
-    /*NoCfCheck=*/false,
-    /*cmseNSCall=*/false);
+      /*noReturn=*/false,
+      /*hasRegParm=*/false,
+      /*regParm=*/0, CallingConv::CC_C,
+      /*producesResult=*/false,
+      /*noCallerSavedRegs=*/false,
+      /*NoCfCheck=*/false,
+      /*cmseNSCall=*/false);
   QualType func_type = ast.getFunctionNoProtoType(ast.VoidTy, generic_ext_info);
   return GetType(func_type);
 }
diff --git a/lldb/test/API/functionalities/vtable/main.cpp b/lldb/test/API/functionalities/vtable/main.cpp
index 498a5765a..327128ffc 100644
--- a/lldb/test/API/functionalities/vtable/main.cpp
+++ b/lldb/test/API/functionalities/vtable/main.cpp
@@ -23,6 +23,7 @@ public:
 // valid vtable from this object.
 class NotVirtual {
   Rectangle m_rect;
+
 public:
   NotVirtual() = default;
 };
@@ -32,7 +33,7 @@ int main(int argc, const char **argv) {
   Rectangle rect;
   Shape *shape_ptr = ▭
   Shape &shape_ref = shape;
-  shape_ptr = &shape; // Shape is Rectangle
+  shape_ptr = &shape;     // Shape is Rectangle
   NotVirtual not_virtual; // Shape is Shape
-  return 0; // At the end
+  return 0;               // At the end
 }

``````````

</details>


https://github.com/llvm/llvm-project/pull/67599


More information about the lldb-commits mailing list