[Lldb-commits] [lldb] 3a28042 - [lldb][NFC] Early exit in DWARFASTParserClang::ParseArrayType

Raphael Isemann via lldb-commits lldb-commits at lists.llvm.org
Wed Nov 27 00:28:21 PST 2019


Author: Raphael Isemann
Date: 2019-11-27T09:28:01+01:00
New Revision: 3a280422b66a31af694782746ec0b5b7552a82a1

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

LOG: [lldb][NFC] Early exit in DWARFASTParserClang::ParseArrayType

Added: 
    

Modified: 
    lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp

Removed: 
    


################################################################################
diff  --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
index fe6ab3064447..df5c81f2e830 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
@@ -1257,83 +1257,83 @@ TypeSP DWARFASTParserClang::ParseArrayType(const DWARFDIE &die,
   DWARFDIE type_die = attrs.type.Reference();
   Type *element_type = dwarf->ResolveTypeUID(type_die, true);
 
-  if (element_type) {
-    auto array_info = ParseChildArrayInfo(die);
-    if (array_info) {
-      attrs.byte_stride = array_info->byte_stride;
-      attrs.bit_stride = array_info->bit_stride;
-    }
-    if (attrs.byte_stride == 0 && attrs.bit_stride == 0)
-      attrs.byte_stride = element_type->GetByteSize().getValueOr(0);
-    CompilerType array_element_type = element_type->GetForwardCompilerType();
-
-    if (ClangASTContext::IsCXXClassType(array_element_type) &&
-        !array_element_type.GetCompleteType()) {
-      ModuleSP module_sp = die.GetModule();
-      if (module_sp) {
-        if (die.GetCU()->GetProducer() == eProducerClang)
-          module_sp->ReportError(
-              "DWARF DW_TAG_array_type DIE at 0x%8.8x has a "
-              "class/union/struct element type DIE 0x%8.8x that is a "
-              "forward declaration, not a complete definition.\nTry "
-              "compiling the source file with -fstandalone-debug or "
-              "disable -gmodules",
-              die.GetOffset(), type_die.GetOffset());
-        else
-          module_sp->ReportError(
-              "DWARF DW_TAG_array_type DIE at 0x%8.8x has a "
-              "class/union/struct element type DIE 0x%8.8x that is a "
-              "forward declaration, not a complete definition.\nPlease "
-              "file a bug against the compiler and include the "
-              "preprocessed output for %s",
-              die.GetOffset(), type_die.GetOffset(), GetUnitName(die).c_str());
-      }
-
-      // We have no choice other than to pretend that the element class
-      // type is complete. If we don't do this, clang will crash when
-      // trying to layout the class. Since we provide layout
-      // assistance, all ivars in this class and other classes will be
-      // fine, this is the best we can do short of crashing.
-      if (ClangASTContext::StartTagDeclarationDefinition(array_element_type)) {
-        ClangASTContext::CompleteTagDeclarationDefinition(array_element_type);
-      } else {
-        module_sp->ReportError("DWARF DIE at 0x%8.8x was not able to "
-                               "start its definition.\nPlease file a "
-                               "bug and attach the file at the start "
-                               "of this error message",
-                               type_die.GetOffset());
-      }
-    }
+  if (!element_type)
+    return nullptr;
 
-    uint64_t array_element_bit_stride =
-        attrs.byte_stride * 8 + attrs.bit_stride;
-    CompilerType clang_type;
-    if (array_info && array_info->element_orders.size() > 0) {
-      uint64_t num_elements = 0;
-      auto end = array_info->element_orders.rend();
-      for (auto pos = array_info->element_orders.rbegin(); pos != end; ++pos) {
-        num_elements = *pos;
-        clang_type = m_ast.CreateArrayType(array_element_type, num_elements,
-                                           attrs.is_vector);
-        array_element_type = clang_type;
-        array_element_bit_stride = num_elements
-                                       ? array_element_bit_stride * num_elements
-                                       : array_element_bit_stride;
-      }
+  llvm::Optional<SymbolFile::ArrayInfo> array_info = ParseChildArrayInfo(die);
+  if (array_info) {
+    attrs.byte_stride = array_info->byte_stride;
+    attrs.bit_stride = array_info->bit_stride;
+  }
+  if (attrs.byte_stride == 0 && attrs.bit_stride == 0)
+    attrs.byte_stride = element_type->GetByteSize().getValueOr(0);
+  CompilerType array_element_type = element_type->GetForwardCompilerType();
+
+  if (ClangASTContext::IsCXXClassType(array_element_type) &&
+      !array_element_type.GetCompleteType()) {
+    ModuleSP module_sp = die.GetModule();
+    if (module_sp) {
+      if (die.GetCU()->GetProducer() == eProducerClang)
+        module_sp->ReportError(
+            "DWARF DW_TAG_array_type DIE at 0x%8.8x has a "
+            "class/union/struct element type DIE 0x%8.8x that is a "
+            "forward declaration, not a complete definition.\nTry "
+            "compiling the source file with -fstandalone-debug or "
+            "disable -gmodules",
+            die.GetOffset(), type_die.GetOffset());
+      else
+        module_sp->ReportError(
+            "DWARF DW_TAG_array_type DIE at 0x%8.8x has a "
+            "class/union/struct element type DIE 0x%8.8x that is a "
+            "forward declaration, not a complete definition.\nPlease "
+            "file a bug against the compiler and include the "
+            "preprocessed output for %s",
+            die.GetOffset(), type_die.GetOffset(), GetUnitName(die).c_str());
+    }
+
+    // We have no choice other than to pretend that the element class
+    // type is complete. If we don't do this, clang will crash when
+    // trying to layout the class. Since we provide layout
+    // assistance, all ivars in this class and other classes will be
+    // fine, this is the best we can do short of crashing.
+    if (ClangASTContext::StartTagDeclarationDefinition(array_element_type)) {
+      ClangASTContext::CompleteTagDeclarationDefinition(array_element_type);
     } else {
-      clang_type =
-          m_ast.CreateArrayType(array_element_type, 0, attrs.is_vector);
-    }
-    ConstString empty_name;
-    TypeSP type_sp = std::make_shared<Type>(
-        die.GetID(), dwarf, empty_name, array_element_bit_stride / 8, nullptr,
-        dwarf->GetUID(type_die), Type::eEncodingIsUID, &attrs.decl, clang_type,
-        Type::ResolveState::Full);
-    type_sp->SetEncodingType(element_type);
-    m_ast.SetMetadataAsUserID(clang_type.GetOpaqueQualType(), die.GetID());
-    return type_sp;
+      module_sp->ReportError("DWARF DIE at 0x%8.8x was not able to "
+                             "start its definition.\nPlease file a "
+                             "bug and attach the file at the start "
+                             "of this error message",
+                             type_die.GetOffset());
+    }
   }
-  return nullptr;
+
+  uint64_t array_element_bit_stride =
+      attrs.byte_stride * 8 + attrs.bit_stride;
+  CompilerType clang_type;
+  if (array_info && array_info->element_orders.size() > 0) {
+    uint64_t num_elements = 0;
+    auto end = array_info->element_orders.rend();
+    for (auto pos = array_info->element_orders.rbegin(); pos != end; ++pos) {
+      num_elements = *pos;
+      clang_type = m_ast.CreateArrayType(array_element_type, num_elements,
+                                         attrs.is_vector);
+      array_element_type = clang_type;
+      array_element_bit_stride = num_elements
+                                     ? array_element_bit_stride * num_elements
+                                     : array_element_bit_stride;
+    }
+  } else {
+    clang_type =
+        m_ast.CreateArrayType(array_element_type, 0, attrs.is_vector);
+  }
+  ConstString empty_name;
+  TypeSP type_sp = std::make_shared<Type>(
+      die.GetID(), dwarf, empty_name, array_element_bit_stride / 8, nullptr,
+      dwarf->GetUID(type_die), Type::eEncodingIsUID, &attrs.decl, clang_type,
+      Type::ResolveState::Full);
+  type_sp->SetEncodingType(element_type);
+  m_ast.SetMetadataAsUserID(clang_type.GetOpaqueQualType(), die.GetID());
+  return type_sp;
 }
 
 TypeSP DWARFASTParserClang::ParsePointerToMemberType(


        


More information about the lldb-commits mailing list