<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Wed, Sep 28, 2016 at 4:02 PM Enrico Granata via lldb-commits <<a href="mailto:lldb-commits@lists.llvm.org">lldb-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br class="gmail_msg">
-<br class="gmail_msg">
+<br class="gmail_msg">
+  static ConstString g___i_("__i_");<br class="gmail_msg">
+<br class="gmail_msg">
   // this must be a ValueObject* because it is a child of the ValueObject we are<br class="gmail_msg">
   // producing children for<br class="gmail_msg">
   // it if were a ValueObjectSP, we would end up with a loop (iterator -><br class="gmail_msg">
@@ -281,6 +287,57 @@ bool lldb_private::formatters::LibCxxMap<br class="gmail_msg">
                                    SyntheticChildrenTraversal::None),<br class="gmail_msg">
                        nullptr)<br class="gmail_msg">
                    .get();<br class="gmail_msg">
+<br class="gmail_msg">
+  if (!m_pair_ptr) {<br class="gmail_msg">
+    m_pair_ptr = valobj_sp->GetValueForExpressionPath(".__i_.__ptr_", nullptr, nullptr, nullptr,<br class="gmail_msg">
+                                                      ValueObject::GetValueForExpressionPathOptions()<br class="gmail_msg">
+                                                      .DontCheckDotVsArrowSyntax()<br class="gmail_msg">
+                                                      .SetSyntheticChildrenTraversal(<br class="gmail_msg">
+                                                                                     ValueObject::GetValueForExpressionPathOptions::<br class="gmail_msg">
+                                                                                     SyntheticChildrenTraversal::None),<br class="gmail_msg">
+                                                      nullptr)<br class="gmail_msg">
+    .get();<br class="gmail_msg">
+    if (m_pair_ptr) {<br class="gmail_msg">
+      auto __i_(valobj_sp->GetChildMemberWithName(g___i_, true));<br class="gmail_msg"></blockquote><div>Is there any reason we need to use such weird variable names?  This looks like undefined behavior to me.  Variables with more than one adjacent underscore are reserved.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      lldb::TemplateArgumentKind kind;<br class="gmail_msg">
+      if (!__i_) {<br class="gmail_msg">
+        m_pair_ptr = nullptr;<br class="gmail_msg">
+        return false;<br class="gmail_msg">
+      }<br class="gmail_msg">
+      CompilerType pair_type(__i_->GetCompilerType().GetTemplateArgument(0, kind));<br class="gmail_msg">
+      std::string name; uint64_t bit_offset_ptr; uint32_t bitfield_bit_size_ptr; bool is_bitfield_ptr;<br class="gmail_msg">
+      pair_type = pair_type.GetFieldAtIndex(0, name, &bit_offset_ptr, &bitfield_bit_size_ptr, &is_bitfield_ptr);<br class="gmail_msg">
+      if (!pair_type) {<br class="gmail_msg">
+        m_pair_ptr = nullptr;<br class="gmail_msg">
+        return false;<br class="gmail_msg">
+      }<br class="gmail_msg">
+<br class="gmail_msg">
+      auto addr(m_pair_ptr->GetValueAsUnsigned(LLDB_INVALID_ADDRESS));<br class="gmail_msg">
+      m_pair_ptr = nullptr;<br class="gmail_msg">
+      if (addr && addr!=LLDB_INVALID_ADDRESS) {<br class="gmail_msg"></blockquote><div>Can you do an early return here?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+        ClangASTContext *ast_ctx = llvm::dyn_cast_or_null<ClangASTContext>(pair_type.GetTypeSystem());<br class="gmail_msg">
+        if (!ast_ctx)<br class="gmail_msg">
+          return false;<br class="gmail_msg">
+        CompilerType tree_node_type = ast_ctx->CreateStructForIdentifier(ConstString(), {<br class="gmail_msg">
+          {"ptr0",ast_ctx->GetBasicType(lldb::eBasicTypeVoid).GetPointerType()},<br class="gmail_msg">
+          {"ptr1",ast_ctx->GetBasicType(lldb::eBasicTypeVoid).GetPointerType()},<br class="gmail_msg">
+          {"ptr2",ast_ctx->GetBasicType(lldb::eBasicTypeVoid).GetPointerType()},<br class="gmail_msg">
+          {"cw",ast_ctx->GetBasicType(lldb::eBasicTypeBool)},<br class="gmail_msg">
+          {"payload",pair_type}<br class="gmail_msg">
+        });<br class="gmail_msg">
+        DataBufferSP buffer_sp(new DataBufferHeap(tree_node_type.GetByteSize(nullptr),0));<br class="gmail_msg">
+        ProcessSP process_sp(target_sp->GetProcessSP());<br class="gmail_msg">
+        Error error;<br class="gmail_msg">
+        process_sp->ReadMemory(addr, buffer_sp->GetBytes(), buffer_sp->GetByteSize(), error);<br class="gmail_msg">
+        if (error.Fail())<br class="gmail_msg">
+          return false;<br class="gmail_msg">
+        DataExtractor extractor(buffer_sp, process_sp->GetByteOrder(), process_sp->GetAddressByteSize());<br class="gmail_msg">
+        auto pair_sp = CreateValueObjectFromData("pair", extractor, valobj_sp->GetExecutionContextRef(), tree_node_type);<br class="gmail_msg">
+        if (pair_sp)<br class="gmail_msg">
+          m_pair_sp = pair_sp->GetChildAtIndex(4,true);<br class="gmail_msg">
+      }<br class="gmail_msg">
+    }<br class="gmail_msg">
+  }<br class="gmail_msg">
<br class="gmail_msg">
   return false;<br class="gmail_msg">
 }<br class="gmail_msg">
@@ -293,9 +350,11 @@ size_t lldb_private::formatters::LibCxxM<br class="gmail_msg">
 lldb::ValueObjectSP<br class="gmail_msg">
 lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::GetChildAtIndex(<br class="gmail_msg">
     size_t idx) {<br class="gmail_msg">
-  if (!m_pair_ptr)<br class="gmail_msg">
-    return lldb::ValueObjectSP();<br class="gmail_msg">
-  return m_pair_ptr->GetChildAtIndex(idx, true);<br class="gmail_msg">
+  if (m_pair_ptr)<br class="gmail_msg">
+    return m_pair_ptr->GetChildAtIndex(idx, true);<br class="gmail_msg">
+  if (m_pair_sp)<br class="gmail_msg">
+    return m_pair_sp->GetChildAtIndex(idx, true);<br class="gmail_msg">
+  return lldb::ValueObjectSP();<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
 bool lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::<br class="gmail_msg">
<br class="gmail_msg">
Modified: lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.h<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.h?rev=282648&r1=282647&r2=282648&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.h?rev=282648&r1=282647&r2=282648&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.h (original)<br class="gmail_msg">
+++ lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.h Wed Sep 28 17:53:16 2016<br class="gmail_msg">
@@ -81,6 +81,7 @@ public:<br class="gmail_msg">
<br class="gmail_msg">
 private:<br class="gmail_msg">
   ValueObject *m_pair_ptr;<br class="gmail_msg">
+  lldb::ValueObjectSP m_pair_sp;<br class="gmail_msg">
 };<br class="gmail_msg">
<br class="gmail_msg">
 SyntheticChildrenFrontEnd *<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
lldb-commits mailing list<br class="gmail_msg">
<a href="mailto:lldb-commits@lists.llvm.org" class="gmail_msg" target="_blank">lldb-commits@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits</a><br class="gmail_msg">
</blockquote></div></div>