diff options
Diffstat (limited to 'source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp')
| -rw-r--r-- | source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp | 66 | 
1 files changed, 52 insertions, 14 deletions
diff --git a/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp b/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp index c3566b7c6bfb..526bae6900f5 100644 --- a/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp +++ b/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp @@ -94,9 +94,30 @@ lldb::ValueObjectSP lldb_private::formatters::          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::LibcxxStdUnorderedMapSyntheticFrontEnd::        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;  }  | 
