132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata//===-- LibStdcpp.cpp ---------------------------------------------*- C++ -*-===//
232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata//
332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata//                     The LLVM Compiler Infrastructure
432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata//
532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata// This file is distributed under the University of Illinois Open Source
632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata// License. See LICENSE.TXT for details.
732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata//
832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata//===----------------------------------------------------------------------===//
932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
10fe21d4f351f560921e615a6677afe1c057aa7f28Matt Kopec#include "lldb/lldb-python.h"
11fe21d4f351f560921e615a6677afe1c057aa7f28Matt Kopec
1232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata#include "lldb/DataFormatters/CXXFormatterFunctions.h"
1332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
1432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata#include "lldb/Core/DataBufferHeap.h"
1532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata#include "lldb/Core/Error.h"
1632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata#include "lldb/Core/Stream.h"
1732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata#include "lldb/Core/ValueObject.h"
1832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata#include "lldb/Core/ValueObjectConstResult.h"
1932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata#include "lldb/Host/Endian.h"
2032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata#include "lldb/Symbol/ClangASTContext.h"
2132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata#include "lldb/Target/ObjCLanguageRuntime.h"
2232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata#include "lldb/Target/Target.h"
2332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
2432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatausing namespace lldb;
2532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatausing namespace lldb_private;
2632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatausing namespace lldb_private::formatters;
2732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
2832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::LibstdcppVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
2932d7ee3d2969211e104a27fcfcd636f249b26559Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()),
3032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatam_exe_ctx_ref(),
3132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatam_count(0),
3232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatam_base_data_address(0),
3332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatam_options()
3432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{
3532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (valobj_sp)
3632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        Update();
3732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    m_options.SetCoerceToId(false)
3832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    .SetUnwindOnError(true)
3932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    .SetKeepInMemory(true)
4032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    .SetUseDynamic(lldb::eDynamicCanRunTarget);
4132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata}
4232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
4332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatasize_t
4432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::CalculateNumChildren ()
4532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{
4632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    return m_count;
4732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata}
4832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
4932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb::ValueObjectSP
5032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::GetChildAtIndex (size_t idx)
5132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{
5232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (idx >= m_count)
5332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return ValueObjectSP();
5432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (m_base_data_address == 0 || m_count == 0)
5532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return ValueObjectSP();
5632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    size_t byte_idx = (idx >> 3); // divide by 8 to get byte index
5732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    size_t bit_index = (idx & 7); // efficient idx % 8 for bit index
5832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    lldb::addr_t byte_location = m_base_data_address + byte_idx;
5932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP());
6032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!process_sp)
6132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return ValueObjectSP();
6232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    uint8_t byte = 0;
6332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    uint8_t mask = 0;
6432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    Error err;
6532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    size_t bytes_read = process_sp->ReadMemory(byte_location, &byte, 1, err);
6632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (err.Fail() || bytes_read == 0)
6732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return ValueObjectSP();
6832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    switch (bit_index)
6932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    {
7032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        case 0:
7132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata            mask = 1; break;
7232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        case 1:
7332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata            mask = 2; break;
7432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        case 2:
7532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata            mask = 4; break;
7632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        case 3:
7732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata            mask = 8; break;
7832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        case 4:
7932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata            mask = 16; break;
8032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        case 5:
8132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata            mask = 32; break;
8232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        case 6:
8332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata            mask = 64; break;
8432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        case 7:
8532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata            mask = 128; break;
8632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        default:
8732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata            return ValueObjectSP();
8832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    }
8932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    bool bit_set = ((byte & mask) != 0);
9032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    Target& target(process_sp->GetTarget());
9132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    ValueObjectSP retval_sp;
9232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (bit_set)
9332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        target.EvaluateExpression("(bool)true", NULL, retval_sp);
9432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    else
9532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        target.EvaluateExpression("(bool)false", NULL, retval_sp);
9632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    StreamString name; name.Printf("[%zu]",idx);
9732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (retval_sp)
9832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        retval_sp->SetName(ConstString(name.GetData()));
9932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    return retval_sp;
10032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata}
10132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
10232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata/*((std::vector<std::allocator<bool> >) vBool = {
10332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (std::_Bvector_base<std::allocator<bool> >) std::_Bvector_base<std::allocator<bool> > = {
10432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (std::_Bvector_base<std::allocator<bool> >::_Bvector_impl) _M_impl = {
10532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (std::_Bit_iterator) _M_start = {
10632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (std::_Bit_iterator_base) std::_Bit_iterator_base = {
10732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (_Bit_type *) _M_p = 0x0016b160
10832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (unsigned int) _M_offset = 0
10932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata }
11032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata }
11132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (std::_Bit_iterator) _M_finish = {
11232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (std::_Bit_iterator_base) std::_Bit_iterator_base = {
11332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (_Bit_type *) _M_p = 0x0016b16c
11432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (unsigned int) _M_offset = 16
11532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata }
11632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata }
11732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (_Bit_type *) _M_end_of_storage = 0x0016b170
11832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata }
11932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata }
12032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata }
12132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata */
12232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
12332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatabool
12432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::Update()
12532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{
12632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    ValueObjectSP valobj_sp = m_backend.GetSP();
12732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!valobj_sp)
12832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return false;
12932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!valobj_sp)
13032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return false;
13132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
13232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
13332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    ValueObjectSP m_impl_sp(valobj_sp->GetChildMemberWithName(ConstString("_M_impl"), true));
13432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!m_impl_sp)
13532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return false;
13632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
13732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    ValueObjectSP m_start_sp(m_impl_sp->GetChildMemberWithName(ConstString("_M_start"), true));
13832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    ValueObjectSP m_finish_sp(m_impl_sp->GetChildMemberWithName(ConstString("_M_finish"), true));
13932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
14032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    ValueObjectSP start_p_sp, finish_p_sp, finish_offset_sp;
14132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
14232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!m_start_sp || !m_finish_sp)
14332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return false;
14432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
14532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    start_p_sp = m_start_sp->GetChildMemberWithName(ConstString("_M_p"), true);
14632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    finish_p_sp = m_finish_sp->GetChildMemberWithName(ConstString("_M_p"), true);
14732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    finish_offset_sp = m_finish_sp->GetChildMemberWithName(ConstString("_M_offset"), true);
14832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
14932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!start_p_sp || !finish_offset_sp || !finish_p_sp)
15032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return false;
15132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
15232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    m_base_data_address = start_p_sp->GetValueAsUnsigned(0);
15332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!m_base_data_address)
15432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return false;
15532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
15632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    lldb::addr_t end_data_address(finish_p_sp->GetValueAsUnsigned(0));
15732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!end_data_address)
15832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return false;
15932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
16032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (end_data_address < m_base_data_address)
16132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return false;
16232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    else
16332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        m_count = finish_offset_sp->GetValueAsUnsigned(0) + (end_data_address-m_base_data_address)*8;
16432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
16532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    return true;
16632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata}
16732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
16832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatabool
16932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::MightHaveChildren ()
17032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{
17132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    return true;
17232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata}
17332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
17432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatasize_t
17532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
17632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{
17732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!m_count || !m_base_data_address)
17832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return UINT32_MAX;
17932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    const char* item_name = name.GetCString();
18032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    uint32_t idx = ExtractIndexFromString(item_name);
18132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (idx < UINT32_MAX && idx >= CalculateNumChildren())
18232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return UINT32_MAX;
18332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    return idx;
18432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata}
18532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
18632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::~LibstdcppVectorBoolSyntheticFrontEnd ()
18732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{}
18832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
18932d7ee3d2969211e104a27fcfcd636f249b26559Enrico GranataSyntheticChildrenFrontEnd*
19032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)
19132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{
19232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!valobj_sp)
19332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return NULL;
19432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    return (new LibstdcppVectorBoolSyntheticFrontEnd(valobj_sp));
19532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata}
19632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
19732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata/*
19832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (std::_Rb_tree_iterator<std::pair<const int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >) ibeg = {
19932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (_Base_ptr) _M_node = 0x0000000100103910 {
20032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (std::_Rb_tree_color) _M_color = _S_black
20132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (std::_Rb_tree_node_base::_Base_ptr) _M_parent = 0x00000001001038c0
20232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (std::_Rb_tree_node_base::_Base_ptr) _M_left = 0x0000000000000000
20332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (std::_Rb_tree_node_base::_Base_ptr) _M_right = 0x0000000000000000
20432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata }
20532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata }
20632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata */
20732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
20832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::LibstdcppMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
20952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    SyntheticChildrenFrontEnd(*valobj_sp.get()),
21052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_exe_ctx_ref(),
21152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_pair_address(0),
21252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_pair_type(),
21352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_options(),
21452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_pair_sp()
21532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{
21632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (valobj_sp)
21732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        Update();
21832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    m_options.SetCoerceToId(false)
21932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    .SetUnwindOnError(true)
22032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    .SetKeepInMemory(true)
22132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    .SetUseDynamic(lldb::eDynamicCanRunTarget);
22232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata}
22332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
22432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatabool
22532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::Update()
22632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{
22732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    ValueObjectSP valobj_sp = m_backend.GetSP();
22832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!valobj_sp)
22932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return false;
23032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
23132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    TargetSP target_sp(valobj_sp->GetTargetSP());
23232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
23332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!target_sp)
23432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return false;
23532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
23632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    bool is_64bit = (target_sp->GetArchitecture().GetAddressByteSize() == 8);
23732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
23832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!valobj_sp)
23932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return false;
24032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
24132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
24232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    ValueObjectSP _M_node_sp(valobj_sp->GetChildMemberWithName(ConstString("_M_node"), true));
24332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!_M_node_sp)
24432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return false;
24532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
24632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    m_pair_address = _M_node_sp->GetValueAsUnsigned(0);
24732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (m_pair_address == 0)
24832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return false;
24932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
25032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    m_pair_address += (is_64bit ? 32 : 16);
25132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
25252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType my_type(valobj_sp->GetClangType());
25352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (my_type.GetNumTemplateArguments() >= 1)
25432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    {
25532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        TemplateArgumentKind kind;
25652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ClangASTType pair_type = my_type.GetTemplateArgument(0, kind);
25732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        if (kind != eTemplateArgumentKindType && kind != eTemplateArgumentKindTemplate && kind != eTemplateArgumentKindTemplateExpansion)
25832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata            return false;
25952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        m_pair_type = pair_type;
26032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    }
26132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    else
26232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return false;
26332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
26432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    return true;
26532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata}
26632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
26732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatasize_t
26832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::CalculateNumChildren ()
26932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{
27032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    return 2;
27132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata}
27232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
27332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb::ValueObjectSP
27432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::GetChildAtIndex (size_t idx)
27532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{
27652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (m_pair_address != 0 && m_pair_type)
27752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
27852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (!m_pair_sp)
27952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            m_pair_sp = ValueObject::CreateValueObjectFromAddress("pair", m_pair_address, m_exe_ctx_ref, m_pair_type);
28052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (m_pair_sp)
28152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return m_pair_sp->GetChildAtIndex(idx, true);
28252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
28332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    return lldb::ValueObjectSP();
28432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata}
28532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
28632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatabool
28732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::MightHaveChildren ()
28832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{
28932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    return true;
29032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata}
29132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
29232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatasize_t
29332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
29432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{
29532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (name == ConstString("first"))
29632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return 0;
29732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (name == ConstString("second"))
29832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return 1;
29932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    return UINT32_MAX;
30032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata}
30132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
30232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::~LibstdcppMapIteratorSyntheticFrontEnd ()
30332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{}
30432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
30532d7ee3d2969211e104a27fcfcd636f249b26559Enrico GranataSyntheticChildrenFrontEnd*
30632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)
30732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{
30832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!valobj_sp)
30932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return NULL;
31032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    return (new LibstdcppMapIteratorSyntheticFrontEnd(valobj_sp));
31132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata}
31232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
31332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata/*
31432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (lldb) fr var ibeg --ptr-depth 1
31532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata (__gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > >) ibeg = {
31632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata _M_current = 0x00000001001037a0 {
31732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata *_M_current = 1
31832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata }
31932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata }
32032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata */
32132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata
32232d7ee3d2969211e104a27fcfcd636f249b26559Enrico GranataSyntheticChildrenFrontEnd*
32332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::LibStdcppVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)
32432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata{
32532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    static ConstString g_item_name;
32632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!g_item_name)
32732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        g_item_name.SetCString("_M_current");
32832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    if (!valobj_sp)
32932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata        return NULL;
33032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata    return (new VectorIteratorSyntheticFrontEnd(valobj_sp,g_item_name));
33132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata}
332