[Lldb-commits] [lldb] r301493 - Fix libcxx formatters for changes in r300140.

Lang Hames via lldb-commits lldb-commits at lists.llvm.org
Wed Apr 26 16:29:59 PDT 2017


Author: lhames
Date: Wed Apr 26 18:29:59 2017
New Revision: 301493

URL: http://llvm.org/viewvc/llvm-project?rev=301493&view=rev
Log:
Fix libcxx formatters for changes in r300140.

Summary:
LLVM r300140 changed the layout and field names of __compressed_pair, which
broke LLDB's std::vector, std::map and std::unsorted_map formatters.

This patch attempts to fix these formatters by having them interogate the
__compressed_pair values to determine whether they're pre- or post-r300140
variants, then access them accordingly.

Reviewers: jingham, EricWF

Reviewed By: jingham

Differential Revision: https://reviews.llvm.org/D32554

Modified:
    lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp
    lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp
    lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp

Modified: lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp?rev=301493&r1=301492&r2=301493&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp (original)
+++ lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp Wed Apr 26 18:29:59 2017
@@ -219,6 +219,7 @@ size_t lldb_private::formatters::LibcxxS
     CalculateNumChildren() {
   static ConstString g___pair3_("__pair3_");
   static ConstString g___first_("__first_");
+  static ConstString g___value_("__value_");
 
   if (m_count != UINT32_MAX)
     return m_count;
@@ -227,7 +228,22 @@ size_t lldb_private::formatters::LibcxxS
   ValueObjectSP m_item(m_tree->GetChildMemberWithName(g___pair3_, true));
   if (!m_item)
     return 0;
-  m_item = m_item->GetChildMemberWithName(g___first_, true);
+
+  switch (m_item->GetCompilerType().GetNumDirectBaseClasses()) {
+  case 1:
+    // Assume a pre llvm r300140 __compressed_pair implementation:
+    m_item = m_item->GetChildMemberWithName(g___first_, true);
+    break;
+  case 2: {
+    // Assume a post llvm r300140 __compressed_pair implementation:
+    ValueObjectSP first_elem_parent = m_item->GetChildAtIndex(0, true);
+    m_item = first_elem_parent->GetChildMemberWithName(g___value_, true);
+    break;
+  }
+  default:
+    return false;
+  }
+
   if (!m_item)
     return 0;
   m_count = m_item->GetValueAsUnsigned(0);

Modified: lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp?rev=301493&r1=301492&r2=301493&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp (original)
+++ lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp Wed Apr 26 18:29:59 2017
@@ -94,9 +94,30 @@ lldb::ValueObjectSP lldb_private::format
         node_sp->GetChildMemberWithName(ConstString("__hash_"), true);
     if (!hash_sp || !value_sp) {
       if (!m_element_type) {
-        auto first_sp = m_backend.GetChildAtNamePath({ConstString("__table_"),
-                                                      ConstString("__p1_"),
-                                                      ConstString("__first_")});
+        auto p1_sp = m_backend.GetChildAtNamePath({ConstString("__table_"),
+                                                   ConstString("__p1_")});
+        if (!p1_sp)
+          return nullptr;
+
+        ValueObjectSP first_sp = nullptr;
+        switch (p1_sp->GetCompilerType().GetNumDirectBaseClasses()) {
+        case 1:
+          // Assume a pre llvm r300140 __compressed_pair implementation:
+          first_sp = p1_sp->GetChildMemberWithName(ConstString("__first_"),
+                                                   true);
+          break;
+        case 2: {
+          // Assume a post llvm r300140 __compressed_pair implementation:
+          ValueObjectSP first_elem_parent_sp =
+            p1_sp->GetChildAtIndex(0, true);
+          first_sp = p1_sp->GetChildMemberWithName(ConstString("__value_"),
+                                                   true);
+          break;
+        }
+        default:
+          return nullptr;
+        }
+
         if (!first_sp)
           return nullptr;
         m_element_type = first_sp->GetCompilerType();
@@ -152,22 +173,39 @@ bool lldb_private::formatters::LibcxxStd
       m_backend.GetChildMemberWithName(ConstString("__table_"), true);
   if (!table_sp)
     return false;
-  ValueObjectSP num_elements_sp = table_sp->GetChildAtNamePath(
-      {ConstString("__p2_"), ConstString("__first_")});
+
+  ValueObjectSP p2_sp = table_sp->GetChildMemberWithName(
+    ConstString("__p2_"), true);
+  ValueObjectSP num_elements_sp = nullptr;
+  llvm::SmallVector<ConstString, 3> next_path;
+  switch (p2_sp->GetCompilerType().GetNumDirectBaseClasses()) {
+  case 1:
+    // Assume a pre llvm r300140 __compressed_pair implementation:
+    num_elements_sp = p2_sp->GetChildMemberWithName(
+      ConstString("__first_"), true);
+    next_path.append({ConstString("__p1_"), ConstString("__first_"),
+                      ConstString("__next_")});
+    break;
+  case 2: {
+    // Assume a post llvm r300140 __compressed_pair implementation:
+    ValueObjectSP first_elem_parent = p2_sp->GetChildAtIndex(0, true);
+    num_elements_sp = first_elem_parent->GetChildMemberWithName(
+      ConstString("__value_"), true);
+    next_path.append({ConstString("__p1_"), ConstString("__value_"),
+                      ConstString("__next_")});
+    break;
+  }
+  default:
+    return false;
+  }
+
   if (!num_elements_sp)
     return false;
   m_num_elements = num_elements_sp->GetValueAsUnsigned(0);
-  m_tree =
-      table_sp
-          ->GetChildAtNamePath({ConstString("__p1_"), ConstString("__first_"),
-                                ConstString("__next_")})
-          .get();
+  m_tree = table_sp->GetChildAtNamePath(next_path).get();
   if (m_num_elements > 0)
     m_next_element =
-        table_sp
-            ->GetChildAtNamePath({ConstString("__p1_"), ConstString("__first_"),
-                                  ConstString("__next_")})
-            .get();
+        table_sp->GetChildAtNamePath(next_path).get();
   return false;
 }
 

Modified: lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp?rev=301493&r1=301492&r2=301493&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp (original)
+++ lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp Wed Apr 26 18:29:59 2017
@@ -127,8 +127,25 @@ bool lldb_private::formatters::LibcxxStd
       m_backend.GetChildMemberWithName(ConstString("__end_cap_"), true));
   if (!data_type_finder_sp)
     return false;
-  data_type_finder_sp = data_type_finder_sp->GetChildMemberWithName(
+
+  switch (data_type_finder_sp->GetCompilerType().GetNumDirectBaseClasses()) {
+  case 1:
+    // Assume a pre llvm r300140 __compressed_pair implementation:
+    data_type_finder_sp = data_type_finder_sp->GetChildMemberWithName(
       ConstString("__first_"), true);
+    break;
+  case 2: {
+    // Assume a post llvm r300140 __compressed_pair implementation:
+    ValueObjectSP first_elem_parent_sp =
+      data_type_finder_sp->GetChildAtIndex(0, true);
+    data_type_finder_sp = first_elem_parent_sp->GetChildMemberWithName(
+      ConstString("__value_"), true);
+    break;
+  }
+  default:
+    return false;
+  }
+
   if (!data_type_finder_sp)
     return false;
   m_element_type = data_type_finder_sp->GetCompilerType().GetPointeeType();




More information about the lldb-commits mailing list