<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Thanks for the heads-up. That explains the slower-than-average delay before my changes went through.<div>It is unfortunate that we did not get the message on lldb-dev. I guess it's time to enroll in the general llvm-dev now :)</div><div><br><div apple-content-edited="true">
<div><div style="border-collapse: separate; border-spacing: 0px; "><i>Enrico Granata</i></div><div style="border-collapse: separate; border-spacing: 0px; ">✉ egranata@<font class="Apple-style-span" color="#ff230e"></font>.com</div><div>✆ (408) 972-7683</div></div>
</div>
<br><div><div>On Feb 4, 2013, at 3:59 PM, Filipe Cabecinhas <<a href="mailto:filcab@gmail.com">filcab@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr">Hi all,<div><br></div><div style="">Just an FYI: the server that contains the llvm project repositories is going through an upgrade.</div><div style="">Everyone was asked to not commit anything until further notice (if a problem occurs, they'll have to restore from backups and will lose today's commits).</div>
<div style=""><br></div><div style="">Warning on llvm-dev: <a href="http://lists.cs.uiuc.edu/pipermail/llvmdev/2013-February/059018.html">http://lists.cs.uiuc.edu/pipermail/llvmdev/2013-February/059018.html</a></div><div style="">
<br></div><div style="">Let's hope you don't have to repeat your commits :-)</div><div style=""><br></div><div style="">Regards,</div><div style=""><br></div><div style="">  Filipe</div><div style=""><br></div></div><div class="gmail_extra">
<br clear="all"><div>  F<br></div>
<br><br><div class="gmail_quote">On Mon, Feb 4, 2013 at 2:54 PM, Enrico Granata <span dir="ltr"><<a href="mailto:egranata@apple.com" target="_blank">egranata@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: enrico<br>
Date: Mon Feb  4 16:54:42 2013<br>
New Revision: 174333<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=174333&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=174333&view=rev</a><br>
Log:<br>
<<a href="rdar://problem/12953018">rdar://problem/12953018</a>><br>
<br>
Synthetic children and summary for std::vector<bool> (for both libcxx and libstdcpp).<br>
std::vector<bool> is a special case and is custom-implemented to be a vector of bits, which means we failed to handle it with the standard std::vector<T> formatter.<br>
This checkin provides custom formatters that work correctly<br>
<br>
<br>
Added:<br>
    lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/<br>
    lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/Makefile<br>
    lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/TestDataFormatterLibcxxVBool.py<br>
    lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/main.cpp<br>
    lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/<br>
    lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/Makefile<br>
    lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/TestDataFormatterStdVBool.py<br>
    lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/main.cpp<br>
Modified:<br>
    lldb/trunk/include/lldb/DataFormatters/CXXFormatterFunctions.h<br>
    lldb/trunk/source/DataFormatters/CXXFormatterFunctions.cpp<br>
    lldb/trunk/source/DataFormatters/FormatManager.cpp<br>
<br>
Modified: lldb/trunk/include/lldb/DataFormatters/CXXFormatterFunctions.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/CXXFormatterFunctions.h?rev=174333&r1=174332&r2=174333&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/CXXFormatterFunctions.h?rev=174333&r1=174332&r2=174333&view=diff</a><br>

==============================================================================<br>
--- lldb/trunk/include/lldb/DataFormatters/CXXFormatterFunctions.h (original)<br>
+++ lldb/trunk/include/lldb/DataFormatters/CXXFormatterFunctions.h Mon Feb  4 16:54:42 2013<br>
@@ -15,6 +15,7 @@<br>
<br>
 #include "lldb/Core/ConstString.h"<br>
 #include "lldb/DataFormatters/FormatClasses.h"<br>
+#include "lldb/Target/Target.h"<br>
<br>
 #include "clang/AST/ASTContext.h"<br>
<br>
@@ -348,6 +349,69 @@ namespace lldb_private {<br>
<br>
         SyntheticChildrenFrontEnd* NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);<br>
<br>
+        class LibcxxVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd<br>
+        {<br>
+        public:<br>
+            LibcxxVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);<br>
+<br>
+            virtual size_t<br>
+            CalculateNumChildren ();<br>
+<br>
+            virtual lldb::ValueObjectSP<br>
+            GetChildAtIndex (size_t idx);<br>
+<br>
+            virtual bool<br>
+            Update();<br>
+<br>
+            virtual bool<br>
+            MightHaveChildren ();<br>
+<br>
+            virtual size_t<br>
+            GetIndexOfChildWithName (const ConstString &name);<br>
+<br>
+            virtual<br>
+            ~LibcxxVectorBoolSyntheticFrontEnd ();<br>
+        private:<br>
+            ExecutionContextRef m_exe_ctx_ref;<br>
+            uint64_t m_count;<br>
+            lldb::addr_t m_base_data_address;<br>
+            EvaluateExpressionOptions m_options;<br>
+        };<br>
+<br>
+        SyntheticChildrenFrontEnd* LibcxxVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);<br>
+<br>
+        class LibstdcppVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd<br>
+        {<br>
+        public:<br>
+            LibstdcppVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);<br>
+<br>
+            virtual size_t<br>
+            CalculateNumChildren ();<br>
+<br>
+            virtual lldb::ValueObjectSP<br>
+            GetChildAtIndex (size_t idx);<br>
+<br>
+            virtual bool<br>
+            Update();<br>
+<br>
+            virtual bool<br>
+            MightHaveChildren ();<br>
+<br>
+            virtual size_t<br>
+            GetIndexOfChildWithName (const ConstString &name);<br>
+<br>
+            virtual<br>
+            ~LibstdcppVectorBoolSyntheticFrontEnd ();<br>
+        private:<br>
+            ExecutionContextRef m_exe_ctx_ref;<br>
+            uint64_t m_count;<br>
+            lldb::addr_t m_base_data_address;<br>
+            EvaluateExpressionOptions m_options;<br>
+        };<br>
+<br>
+        SyntheticChildrenFrontEnd* LibstdcppVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);<br>
+<br>
+<br>
     }<br>
 }<br>
<br>
<br>
Modified: lldb/trunk/source/DataFormatters/CXXFormatterFunctions.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/CXXFormatterFunctions.cpp?rev=174333&r1=174332&r2=174333&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/CXXFormatterFunctions.cpp?rev=174333&r1=174332&r2=174333&view=diff</a><br>

==============================================================================<br>
--- lldb/trunk/source/DataFormatters/CXXFormatterFunctions.cpp (original)<br>
+++ lldb/trunk/source/DataFormatters/CXXFormatterFunctions.cpp Mon Feb  4 16:54:42 2013<br>
@@ -1787,6 +1787,322 @@ lldb_private::formatters::NSDictionaryMS<br>
     return dict_item.valobj_sp;<br>
 }<br>
<br>
+lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::LibcxxVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :<br>
+    SyntheticChildrenFrontEnd(*valobj_sp.get()),<br>
+    m_exe_ctx_ref(),<br>
+    m_count(0),<br>
+    m_base_data_address(0),<br>
+    m_options()<br>
+    {<br>
+        if (valobj_sp)<br>
+            Update();<br>
+        m_options.SetCoerceToId(false)<br>
+                 .SetUnwindOnError(true)<br>
+                 .SetKeepInMemory(true)<br>
+                 .SetUseDynamic(lldb::eDynamicCanRunTarget);<br>
+    }<br>
+<br>
+size_t<br>
+lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::CalculateNumChildren ()<br>
+{<br>
+    return m_count;<br>
+}<br>
+<br>
+lldb::ValueObjectSP<br>
+lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::GetChildAtIndex (size_t idx)<br>
+{<br>
+    if (idx >= m_count)<br>
+        return ValueObjectSP();<br>
+    if (m_base_data_address == 0 || m_count == 0)<br>
+        return ValueObjectSP();<br>
+    size_t byte_idx = (idx >> 3); // divide by 8 to get byte index<br>
+    size_t bit_index = (idx & 7); // efficient idx % 8 for bit index<br>
+    lldb::addr_t byte_location = m_base_data_address + byte_idx;<br>
+    ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP());<br>
+    if (!process_sp)<br>
+        return ValueObjectSP();<br>
+    uint8_t byte = 0;<br>
+    uint8_t mask = 0;<br>
+    Error err;<br>
+    size_t bytes_read = process_sp->ReadMemory(byte_location, &byte, 1, err);<br>
+    if (err.Fail() || bytes_read == 0)<br>
+        return ValueObjectSP();<br>
+    switch (bit_index)<br>
+    {<br>
+        case 0:<br>
+            mask = 1; break;<br>
+        case 1:<br>
+            mask = 2; break;<br>
+        case 2:<br>
+            mask = 4; break;<br>
+        case 3:<br>
+            mask = 8; break;<br>
+        case 4:<br>
+            mask = 16; break;<br>
+        case 5:<br>
+            mask = 32; break;<br>
+        case 6:<br>
+            mask = 64; break;<br>
+        case 7:<br>
+            mask = 128; break;<br>
+        default:<br>
+            return ValueObjectSP();<br>
+    }<br>
+    bool bit_set = ((byte & mask) != 0);<br>
+    Target& target(process_sp->GetTarget());<br>
+    ValueObjectSP retval_sp;<br>
+    if (bit_set)<br>
+        target.EvaluateExpression("(bool)true", NULL, retval_sp);<br>
+    else<br>
+        target.EvaluateExpression("(bool)false", NULL, retval_sp);<br>
+    StreamString name; name.Printf("[%zu]",idx);<br>
+    if (retval_sp)<br>
+        retval_sp->SetName(ConstString(name.GetData()));<br>
+    return retval_sp;<br>
+}<br>
+<br>
+/*(std::__1::vector<std::__1::allocator<bool> >) vBool = {<br>
+    __begin_ = 0x00000001001000e0<br>
+    __size_ = 56<br>
+    __cap_alloc_ = {<br>
+        std::__1::__libcpp_compressed_pair_imp<unsigned long, std::__1::allocator<unsigned long> > = {<br>
+            __first_ = 1<br>
+        }<br>
+    }<br>
+}*/<br>
+<br>
+bool<br>
+lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::Update()<br>
+{<br>
+    ValueObjectSP valobj_sp = m_backend.GetSP();<br>
+    if (!valobj_sp)<br>
+        return false;<br>
+    if (valobj_sp->IsDynamic())<br>
+        valobj_sp = valobj_sp->GetStaticValue();<br>
+    if (!valobj_sp)<br>
+        return false;<br>
+    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();<br>
+    ValueObjectSP size_sp(valobj_sp->GetChildMemberWithName(ConstString("__size_"), true));<br>
+    if (!size_sp)<br>
+        return false;<br>
+    m_count = size_sp->GetValueAsUnsigned(0);<br>
+    if (!m_count)<br>
+        return true;<br>
+    ValueObjectSP begin_sp(valobj_sp->GetChildMemberWithName(ConstString("__begin_"), true));<br>
+    if (!begin_sp)<br>
+    {<br>
+        m_count = 0;<br>
+        return false;<br>
+    }<br>
+    m_base_data_address = begin_sp->GetValueAsUnsigned(0);<br>
+    if (!m_base_data_address)<br>
+    {<br>
+        m_count = 0;<br>
+        return false;<br>
+    }<br>
+    return true;<br>
+}<br>
+<br>
+bool<br>
+lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::MightHaveChildren ()<br>
+{<br>
+    return true;<br>
+}<br>
+<br>
+size_t<br>
+lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)<br>
+{<br>
+    if (!m_count || !m_base_data_address)<br>
+        return UINT32_MAX;<br>
+    const char* item_name = name.GetCString();<br>
+    uint32_t idx = ExtractIndexFromString(item_name);<br>
+    if (idx < UINT32_MAX && idx >= CalculateNumChildren())<br>
+        return UINT32_MAX;<br>
+    return idx;<br>
+}<br>
+<br>
+lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::~LibcxxVectorBoolSyntheticFrontEnd ()<br>
+{}<br>
+<br>
+SyntheticChildrenFrontEnd*<br>
+lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)<br>
+{<br>
+    if (!valobj_sp)<br>
+        return NULL;<br>
+    return (new LibcxxVectorBoolSyntheticFrontEnd(valobj_sp));<br>
+}<br>
+<br>
+lldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::LibstdcppVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :<br>
+SyntheticChildrenFrontEnd(*valobj_sp.get()),<br>
+m_exe_ctx_ref(),<br>
+m_count(0),<br>
+m_base_data_address(0),<br>
+m_options()<br>
+{<br>
+    if (valobj_sp)<br>
+        Update();<br>
+    m_options.SetCoerceToId(false)<br>
+    .SetUnwindOnError(true)<br>
+    .SetKeepInMemory(true)<br>
+    .SetUseDynamic(lldb::eDynamicCanRunTarget);<br>
+}<br>
+<br>
+size_t<br>
+lldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::CalculateNumChildren ()<br>
+{<br>
+    return m_count;<br>
+}<br>
+<br>
+lldb::ValueObjectSP<br>
+lldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::GetChildAtIndex (size_t idx)<br>
+{<br>
+    if (idx >= m_count)<br>
+        return ValueObjectSP();<br>
+    if (m_base_data_address == 0 || m_count == 0)<br>
+        return ValueObjectSP();<br>
+    size_t byte_idx = (idx >> 3); // divide by 8 to get byte index<br>
+    size_t bit_index = (idx & 7); // efficient idx % 8 for bit index<br>
+    lldb::addr_t byte_location = m_base_data_address + byte_idx;<br>
+    ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP());<br>
+    if (!process_sp)<br>
+        return ValueObjectSP();<br>
+    uint8_t byte = 0;<br>
+    uint8_t mask = 0;<br>
+    Error err;<br>
+    size_t bytes_read = process_sp->ReadMemory(byte_location, &byte, 1, err);<br>
+    if (err.Fail() || bytes_read == 0)<br>
+        return ValueObjectSP();<br>
+    switch (bit_index)<br>
+    {<br>
+        case 0:<br>
+            mask = 1; break;<br>
+        case 1:<br>
+            mask = 2; break;<br>
+        case 2:<br>
+            mask = 4; break;<br>
+        case 3:<br>
+            mask = 8; break;<br>
+        case 4:<br>
+            mask = 16; break;<br>
+        case 5:<br>
+            mask = 32; break;<br>
+        case 6:<br>
+            mask = 64; break;<br>
+        case 7:<br>
+            mask = 128; break;<br>
+        default:<br>
+            return ValueObjectSP();<br>
+    }<br>
+    bool bit_set = ((byte & mask) != 0);<br>
+    Target& target(process_sp->GetTarget());<br>
+    ValueObjectSP retval_sp;<br>
+    if (bit_set)<br>
+        target.EvaluateExpression("(bool)true", NULL, retval_sp);<br>
+    else<br>
+        target.EvaluateExpression("(bool)false", NULL, retval_sp);<br>
+    StreamString name; name.Printf("[%zu]",idx);<br>
+    if (retval_sp)<br>
+        retval_sp->SetName(ConstString(name.GetData()));<br>
+    return retval_sp;<br>
+}<br>
+<br>
+/*((std::vector<std::allocator<bool> >) vBool = {<br>
+ (std::_Bvector_base<std::allocator<bool> >) std::_Bvector_base<std::allocator<bool> > = {<br>
+ (std::_Bvector_base<std::allocator<bool> >::_Bvector_impl) _M_impl = {<br>
+ (std::_Bit_iterator) _M_start = {<br>
+ (std::_Bit_iterator_base) std::_Bit_iterator_base = {<br>
+ (_Bit_type *) _M_p = 0x0016b160<br>
+ (unsigned int) _M_offset = 0<br>
+ }<br>
+ }<br>
+ (std::_Bit_iterator) _M_finish = {<br>
+ (std::_Bit_iterator_base) std::_Bit_iterator_base = {<br>
+ (_Bit_type *) _M_p = 0x0016b16c<br>
+ (unsigned int) _M_offset = 16<br>
+ }<br>
+ }<br>
+ (_Bit_type *) _M_end_of_storage = 0x0016b170<br>
+ }<br>
+ }<br>
+ }<br>
+*/<br>
+<br>
+bool<br>
+lldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::Update()<br>
+{<br>
+    ValueObjectSP valobj_sp = m_backend.GetSP();<br>
+    if (!valobj_sp)<br>
+        return false;<br>
+    if (valobj_sp->IsDynamic())<br>
+        valobj_sp = valobj_sp->GetStaticValue();<br>
+    if (!valobj_sp)<br>
+        return false;<br>
+    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();<br>
+<br>
+    ValueObjectSP m_impl_sp(valobj_sp->GetChildMemberWithName(ConstString("_M_impl"), true));<br>
+    if (!m_impl_sp)<br>
+        return false;<br>
+<br>
+    ValueObjectSP m_start_sp(m_impl_sp->GetChildMemberWithName(ConstString("_M_start"), true));<br>
+    ValueObjectSP m_finish_sp(m_impl_sp->GetChildMemberWithName(ConstString("_M_finish"), true));<br>
+<br>
+    ValueObjectSP start_p_sp, finish_p_sp, finish_offset_sp;<br>
+<br>
+    if (!m_start_sp || !m_finish_sp)<br>
+        return false;<br>
+<br>
+    start_p_sp = m_start_sp->GetChildMemberWithName(ConstString("_M_p"), true);<br>
+    finish_p_sp = m_finish_sp->GetChildMemberWithName(ConstString("_M_p"), true);<br>
+    finish_offset_sp = m_finish_sp->GetChildMemberWithName(ConstString("_M_offset"), true);<br>
+<br>
+    if (!start_p_sp || !finish_offset_sp || !finish_p_sp)<br>
+        return false;<br>
+<br>
+    m_base_data_address = start_p_sp->GetValueAsUnsigned(0);<br>
+    if (!m_base_data_address)<br>
+        return false;<br>
+<br>
+    lldb::addr_t end_data_address(finish_p_sp->GetValueAsUnsigned(0));<br>
+    if (!end_data_address)<br>
+        return false;<br>
+<br>
+    if (end_data_address < m_base_data_address)<br>
+        return false;<br>
+    else<br>
+        m_count = finish_offset_sp->GetValueAsUnsigned(0) + (end_data_address-m_base_data_address)*8;<br>
+<br>
+    return true;<br>
+}<br>
+<br>
+bool<br>
+lldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::MightHaveChildren ()<br>
+{<br>
+    return true;<br>
+}<br>
+<br>
+size_t<br>
+lldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)<br>
+{<br>
+    if (!m_count || !m_base_data_address)<br>
+        return UINT32_MAX;<br>
+    const char* item_name = name.GetCString();<br>
+    uint32_t idx = ExtractIndexFromString(item_name);<br>
+    if (idx < UINT32_MAX && idx >= CalculateNumChildren())<br>
+        return UINT32_MAX;<br>
+    return idx;<br>
+}<br>
+<br>
+lldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::~LibstdcppVectorBoolSyntheticFrontEnd ()<br>
+{}<br>
+<br>
+SyntheticChildrenFrontEnd*<br>
+lldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)<br>
+{<br>
+    if (!valobj_sp)<br>
+        return NULL;<br>
+    return (new LibstdcppVectorBoolSyntheticFrontEnd(valobj_sp));<br>
+}<br>
+<br>
 template bool<br>
 lldb_private::formatters::NSDictionarySummaryProvider<true> (ValueObject&, Stream&) ;<br>
<br>
<br>
Modified: lldb/trunk/source/DataFormatters/FormatManager.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/FormatManager.cpp?rev=174333&r1=174332&r2=174333&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/FormatManager.cpp?rev=174333&r1=174332&r2=174333&view=diff</a><br>

==============================================================================<br>
--- lldb/trunk/source/DataFormatters/FormatManager.cpp (original)<br>
+++ lldb/trunk/source/DataFormatters/FormatManager.cpp Mon Feb  4 16:54:42 2013<br>
@@ -561,6 +561,13 @@ FormatManager::LoadLibStdcppFormatters()<br>
     gnu_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::list<.+>(( )?&)?$")),<br>
                                                      TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags,<br>
                                                                                                "size=${svar%#}")));<br>
+<br>
+    gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::vector<std::allocator<bool> >"),<br>
+                                                   TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));<br>
+<br>
+    gnu_category_sp->GetSyntheticNavigator()->Add(ConstString("std::vector<std::allocator<bool> >"),<br>
+                                                     SyntheticChildrenSP(new CXXSyntheticChildren(stl_synth_flags,"libc++ std::vector<bool> synthetic children",lldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEndCreator)));<br>

+<br>
 #endif<br>
 }<br>
<br>
@@ -633,7 +640,10 @@ FormatManager::LoadLibcxxFormatters()<br>
<br>
     // this summary prevails on the regex std::vector<> because we do exact matches before regex ones<br>
     libcxx_category_sp->GetSummaryNavigator()->Add(ConstString("std::__1::vector<std::__1::allocator<bool> >"),<br>
-                                                   TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "size=${var.__size_}")));<br>
+                                                   TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));<br>
+<br>
+    libcxx_category_sp->GetSyntheticNavigator()->Add(ConstString("std::__1::vector<std::__1::allocator<bool> >"),<br>
+                                                     SyntheticChildrenSP(new CXXSyntheticChildren(stl_synth_flags,"libc++ std::vector<bool> synthetic children",lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator)));<br>

<br>
 #endif<br>
 }<br>
<br>
Added: lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/Makefile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/Makefile?rev=174333&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/Makefile?rev=174333&view=auto</a><br>

==============================================================================<br>
--- lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/Makefile (added)<br>
+++ lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/Makefile Mon Feb  4 16:54:42 2013<br>
@@ -0,0 +1,8 @@<br>
+LEVEL = ../../../../../make<br>
+<br>
+CXX_SOURCES := main.cpp<br>
+<br>
+include $(LEVEL)/Makefile.rules<br>
+<br>
+CXXFLAGS += -stdlib=libc++ -O0<br>
+LDFLAGS += -stdlib=libc++<br>
\ No newline at end of file<br>
<br>
Added: lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/TestDataFormatterLibcxxVBool.py<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/TestDataFormatterLibcxxVBool.py?rev=174333&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/TestDataFormatterLibcxxVBool.py?rev=174333&view=auto</a><br>

==============================================================================<br>
--- lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/TestDataFormatterLibcxxVBool.py (added)<br>
+++ lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/TestDataFormatterLibcxxVBool.py Mon Feb  4 16:54:42 2013<br>
@@ -0,0 +1,70 @@<br>
+"""<br>
+Test lldb data formatter subsystem.<br>
+"""<br>
+<br>
+import os, time<br>
+import unittest2<br>
+import lldb<br>
+from lldbtest import *<br>
+import lldbutil<br>
+<br>
+class LibcxxVBoolDataFormatterTestCase(TestBase):<br>
+<br>
+    mydir = os.path.join("functionalities", "data-formatter", "data-formatter-stl", "libcxx", "vbool")<br>
+<br>
+    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")<br>
+    @dsym_test<br>
+    def test_with_dsym_and_run_command(self):<br>
+        """Test data formatter commands."""<br>
+        self.buildDsym()<br>
+        self.data_formatter_commands()<br>
+<br>
+    @skipOnLinux # No standard locations for libc++ on Linux, so skip for now<br>
+    @dwarf_test<br>
+    def test_with_dwarf_and_run_command(self):<br>
+        """Test data formatter commands."""<br>
+        self.buildDwarf()<br>
+        self.data_formatter_commands()<br>
+<br>
+    def setUp(self):<br>
+        # Call super's setUp().<br>
+        TestBase.setUp(self)<br>
+        # Find the line number to break at.<br>
+        self.line = line_number('main.cpp', '// Set break point at this line.')<br>
+<br>
+    def data_formatter_commands(self):<br>
+        """Test that that file and class static variables display correctly."""<br>
+        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)<br>
+<br>
+        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=-1)<br>
+<br>
+        self.runCmd("run", RUN_SUCCEEDED)<br>
+<br>
+        # The stop reason of the thread should be breakpoint.<br>
+        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,<br>
+            substrs = ['stopped',<br>
+                       'stop reason = breakpoint'])<br>
+<br>
+        # This is the function to remove the custom formats in order to have a<br>
+        # clean slate for the next test case.<br>
+        def cleanup():<br>
+            self.runCmd('type format clear', check=False)<br>
+            self.runCmd('type summary clear', check=False)<br>
+            self.runCmd('type filter clear', check=False)<br>
+            self.runCmd('type synth clear', check=False)<br>
+            self.runCmd("settings set target.max-children-count 256", check=False)<br>
+<br>
+        # Execute the cleanup function during test case tear down.<br>
+        self.addTearDownHook(cleanup)<br>
+<br>
+        self.expect("frame variable vBool",<br>
+            substrs = ['size=49','[0] = false','[1] = true','[18] = false','[27] = true','[36] = false','[47] = true','[48] = true'])<br>
+<br>
+        self.expect("expr vBool",<br>
+            substrs = ['size=49','[0] = false','[1] = true','[18] = false','[27] = true','[36] = false','[47] = true','[48] = true'])<br>
+<br>
+if __name__ == '__main__':<br>
+    import atexit<br>
+    lldb.SBDebugger.Initialize()<br>
+    atexit.register(lambda: lldb.SBDebugger.Terminate())<br>
+    unittest2.main()<br>
<br>
Added: lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/main.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/main.cpp?rev=174333&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/main.cpp?rev=174333&view=auto</a><br>

==============================================================================<br>
--- lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/main.cpp (added)<br>
+++ lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/main.cpp Mon Feb  4 16:54:42 2013<br>
@@ -0,0 +1,69 @@<br>
+#include <string><br>
+#ifdef _LIBCPP_INLINE_VISIBILITY<br>
+#undef _LIBCPP_INLINE_VISIBILITY<br>
+#endif<br>
+#define _LIBCPP_INLINE_VISIBILITY<br>
+<br>
+#include <vector><br>
+<br>
+int main()<br>
+{<br>
+    std::vector<bool> vBool;<br>
+<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(true);<br>
+<br>
+    return 0; // Set break point at this line.<br>
+}<br>
<br>
Added: lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/Makefile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/Makefile?rev=174333&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/Makefile?rev=174333&view=auto</a><br>

==============================================================================<br>
--- lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/Makefile (added)<br>
+++ lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/Makefile Mon Feb  4 16:54:42 2013<br>
@@ -0,0 +1,5 @@<br>
+LEVEL = ../../../../../make<br>
+<br>
+CXX_SOURCES := main.cpp<br>
+<br>
+include $(LEVEL)/Makefile.rules<br>
<br>
Added: lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/TestDataFormatterStdVBool.py<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/TestDataFormatterStdVBool.py?rev=174333&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/TestDataFormatterStdVBool.py?rev=174333&view=auto</a><br>

==============================================================================<br>
--- lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/TestDataFormatterStdVBool.py (added)<br>
+++ lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/TestDataFormatterStdVBool.py Mon Feb  4 16:54:42 2013<br>
@@ -0,0 +1,69 @@<br>
+"""<br>
+Test lldb data formatter subsystem.<br>
+"""<br>
+<br>
+import os, time<br>
+import unittest2<br>
+import lldb<br>
+from lldbtest import *<br>
+import lldbutil<br>
+<br>
+class StdVBoolDataFormatterTestCase(TestBase):<br>
+<br>
+    mydir = os.path.join("functionalities", "data-formatter", "data-formatter-stl", "libstdcpp", "vbool")<br>
+<br>
+    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")<br>
+    @dsym_test<br>
+    def test_with_dsym_and_run_command(self):<br>
+        """Test data formatter commands."""<br>
+        self.buildDsym()<br>
+        self.data_formatter_commands()<br>
+<br>
+    @dwarf_test<br>
+    def test_with_dwarf_and_run_command(self):<br>
+        """Test data formatter commands."""<br>
+        self.buildDwarf()<br>
+        self.data_formatter_commands()<br>
+<br>
+    def setUp(self):<br>
+        # Call super's setUp().<br>
+        TestBase.setUp(self)<br>
+        # Find the line number to break at.<br>
+        self.line = line_number('main.cpp', '// Set break point at this line.')<br>
+<br>
+    def data_formatter_commands(self):<br>
+        """Test that that file and class static variables display correctly."""<br>
+        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)<br>
+<br>
+        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=-1)<br>
+<br>
+        self.runCmd("run", RUN_SUCCEEDED)<br>
+<br>
+        # The stop reason of the thread should be breakpoint.<br>
+        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,<br>
+            substrs = ['stopped',<br>
+                       'stop reason = breakpoint'])<br>
+<br>
+        # This is the function to remove the custom formats in order to have a<br>
+        # clean slate for the next test case.<br>
+        def cleanup():<br>
+            self.runCmd('type format clear', check=False)<br>
+            self.runCmd('type summary clear', check=False)<br>
+            self.runCmd('type filter clear', check=False)<br>
+            self.runCmd('type synth clear', check=False)<br>
+            self.runCmd("settings set target.max-children-count 256", check=False)<br>
+<br>
+        # Execute the cleanup function during test case tear down.<br>
+        self.addTearDownHook(cleanup)<br>
+<br>
+        self.expect("frame variable vBool",<br>
+            substrs = ['size=49','[0] = false','[1] = true','[18] = false','[27] = true','[36] = false','[47] = true','[48] = true'])<br>
+<br>
+        self.expect("expr vBool",<br>
+            substrs = ['size=49','[0] = false','[1] = true','[18] = false','[27] = true','[36] = false','[47] = true','[48] = true'])<br>
+<br>
+if __name__ == '__main__':<br>
+    import atexit<br>
+    lldb.SBDebugger.Initialize()<br>
+    atexit.register(lambda: lldb.SBDebugger.Terminate())<br>
+    unittest2.main()<br>
<br>
Added: lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/main.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/main.cpp?rev=174333&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/main.cpp?rev=174333&view=auto</a><br>

==============================================================================<br>
--- lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/main.cpp (added)<br>
+++ lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/main.cpp Mon Feb  4 16:54:42 2013<br>
@@ -0,0 +1,63 @@<br>
+#include <vector><br>
+<br>
+int main()<br>
+{<br>
+    std::vector<bool> vBool;<br>
+<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(false);<br>
+    vBool.push_back(true);<br>
+    vBool.push_back(true);<br>
+<br>
+    return 0; // Set break point at this line.<br>
+}<br>
<br>
<br>
_______________________________________________<br>
lldb-commits mailing list<br>
<a href="mailto:lldb-commits@cs.uiuc.edu">lldb-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits</a><br>
</blockquote></div><br></div>
</blockquote></div><br></div></body></html>