[Lldb-commits] [lldb] r283160 - Changes to the std::multimap formatter to make it work against trunk libc++

Zachary Turner via lldb-commits lldb-commits at lists.llvm.org
Mon Oct 3 16:43:23 PDT 2016


Was this clang-formatted?  some of these lines look way longer than 80
columns.

On Mon, Oct 3, 2016 at 4:41 PM Enrico Granata via lldb-commits <
lldb-commits at lists.llvm.org> wrote:

> Author: enrico
> Date: Mon Oct  3 18:33:00 2016
> New Revision: 283160
>
> URL: http://llvm.org/viewvc/llvm-project?rev=283160&view=rev
> Log:
> Changes to the std::multimap formatter to make it work against trunk libc++
>
> Fixes rdar://28237486
>
>
> Modified:
>     lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxMap.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=283160&r1=283159&r2=283160&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp (original)
> +++ lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp Mon Oct  3
> 18:33:00 2016
> @@ -39,21 +39,21 @@ public:
>      static ConstString g_left("__left_");
>      if (!m_entry_sp)
>        return m_entry_sp;
> -    return m_entry_sp->GetChildMemberWithName(g_left, true);
> +    return m_entry_sp->GetSyntheticChildAtOffset(0,
> m_entry_sp->GetCompilerType(), true);
>    }
>
>    ValueObjectSP right() const {
>      static ConstString g_right("__right_");
>      if (!m_entry_sp)
>        return m_entry_sp;
> -    return m_entry_sp->GetChildMemberWithName(g_right, true);
> +    return
> m_entry_sp->GetSyntheticChildAtOffset(m_entry_sp->GetProcessSP()->GetAddressByteSize(),
> m_entry_sp->GetCompilerType(), true);
>    }
>
>    ValueObjectSP parent() const {
>      static ConstString g_parent("__parent_");
>      if (!m_entry_sp)
>        return m_entry_sp;
> -    return m_entry_sp->GetChildMemberWithName(g_parent, true);
> +    return
> m_entry_sp->GetSyntheticChildAtOffset(2*m_entry_sp->GetProcessSP()->GetAddressByteSize(),
> m_entry_sp->GetCompilerType(), true);
>    }
>
>    uint64_t value() const {
> @@ -231,6 +231,8 @@ size_t lldb_private::formatters::LibcxxS
>
>  bool
> lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetDataType() {
>    static ConstString g___value_("__value_");
> +  static ConstString g_tree_("__tree_");
> +  static ConstString g_pair3("__pair3_");
>
>    if (m_element_type.GetOpaqueQualType() &&
> m_element_type.GetTypeSystem())
>      return true;
> @@ -241,10 +243,21 @@ bool lldb_private::formatters::LibcxxStd
>    if (!deref || error.Fail())
>      return false;
>    deref = deref->GetChildMemberWithName(g___value_, true);
> +  if (deref) {
> +      m_element_type = deref->GetCompilerType();
> +      return true;
> +  }
> +  lldb::TemplateArgumentKind kind;
> +  deref = m_backend.GetChildAtNamePath( {g_tree_, g_pair3} );
>    if (!deref)
>      return false;
> -  m_element_type = deref->GetCompilerType();
> -  return true;
> +  m_element_type = deref->GetCompilerType().GetTemplateArgument(1,
> kind).GetTemplateArgument(1, kind);
> +  if (!m_element_type)
> +    return false;
> +  std::string name; uint64_t bit_offset_ptr; uint32_t
> bitfield_bit_size_ptr; bool is_bitfield_ptr;
> +  m_element_type = m_element_type.GetFieldAtIndex(0, name,
> &bit_offset_ptr, &bitfield_bit_size_ptr, &is_bitfield_ptr);
> +  m_element_type = m_element_type.GetTypedefedType();
> +  return m_element_type.IsValid();
>  }
>
>  void
> lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetValueOffset(
> @@ -255,10 +268,32 @@ void lldb_private::formatters::LibcxxStd
>      return;
>    CompilerType node_type(node->GetCompilerType());
>    uint64_t bit_offset;
> -  if (node_type.GetIndexOfFieldWithName("__value_", nullptr, &bit_offset)
> ==
> -      UINT32_MAX)
> -    return;
> -  m_skip_size = bit_offset / 8u;
> +  if (node_type.GetIndexOfFieldWithName("__value_", nullptr, &bit_offset)
> !=
> +      UINT32_MAX) {
> +    m_skip_size = bit_offset / 8u;
> +  }
> +  else {
> +    ClangASTContext *ast_ctx =
> llvm::dyn_cast_or_null<ClangASTContext>(node_type.GetTypeSystem());
> +    if (!ast_ctx)
> +      return;
> +    CompilerType tree_node_type =
> ast_ctx->CreateStructForIdentifier(ConstString(), {
> +
> {"ptr0",ast_ctx->GetBasicType(lldb::eBasicTypeVoid).GetPointerType()},
> +
> {"ptr1",ast_ctx->GetBasicType(lldb::eBasicTypeVoid).GetPointerType()},
> +
> {"ptr2",ast_ctx->GetBasicType(lldb::eBasicTypeVoid).GetPointerType()},
> +      {"cw",ast_ctx->GetBasicType(lldb::eBasicTypeBool)},
> +      {"payload",m_element_type}
> +    });
> +    std::string child_name;
> +    uint32_t child_byte_size;
> +    int32_t child_byte_offset = 0;
> +    uint32_t child_bitfield_bit_size;
> +    uint32_t child_bitfield_bit_offset;
> +    bool child_is_base_class;
> +    bool child_is_deref_of_parent;
> +    uint64_t language_flags;
> +    if (tree_node_type.GetChildCompilerTypeAtIndex(nullptr, 4, true,
> true, true, child_name, child_byte_size, child_byte_offset,
> child_bitfield_bit_size, child_bitfield_bit_offset, child_is_base_class,
> child_is_deref_of_parent, nullptr, language_flags).IsValid())
> +      m_skip_size = (uint32_t)child_byte_offset;
> +  }
>  }
>
>  lldb::ValueObjectSP
> @@ -301,7 +336,12 @@ lldb_private::formatters::LibcxxStdMapSy
>          return lldb::ValueObjectSP();
>        }
>        GetValueOffset(iterated_sp);
> -      iterated_sp = iterated_sp->GetChildMemberWithName(g___value_, true);
> +      auto child_sp = iterated_sp->GetChildMemberWithName(g___value_,
> true);
> +      if (child_sp)
> +        iterated_sp = child_sp;
> +      else
> +        iterated_sp = iterated_sp->GetSyntheticChildAtOffset(
> +                                                             m_skip_size,
> m_element_type, true);
>        if (!iterated_sp) {
>          m_tree = nullptr;
>          return lldb::ValueObjectSP();
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20161003/6bd47ab9/attachment.html>


More information about the lldb-commits mailing list