1915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata//===-- ValueObjectConstResultImpl.h -----------------------------*- C++ -*-===//
2915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata//
3915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata//                     The LLVM Compiler Infrastructure
4915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata//
5915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// This file is distributed under the University of Illinois Open Source
6915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// License. See LICENSE.TXT for details.
7915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata//
8915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata//===----------------------------------------------------------------------===//
9915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
10915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata#ifndef liblldb_ValueObjectConstResultImpl_h_
11915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata#define liblldb_ValueObjectConstResultImpl_h_
12915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
13915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// C Includes
14915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// C++ Includes
15915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// Other libraries and framework includes
16915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// Project includes
17915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata#include "lldb/Core/ValueObject.h"
18915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
19915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granatanamespace lldb_private {
20915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
21915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata//----------------------------------------------------------------------
22915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// A class wrapping common implementation details for operations in
23915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// ValueObjectConstResult ( & Child ) that may need to jump from the host
24915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata// memory space into the target's memory space
25915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata//----------------------------------------------------------------------
26915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granataclass ValueObjectConstResultImpl
27915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{
28915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granatapublic:
29915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
30915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    ValueObjectConstResultImpl (ValueObject* valobj,
31915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata                                lldb::addr_t live_address = LLDB_INVALID_ADDRESS);
32915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
33915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    virtual
34915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    ~ValueObjectConstResultImpl()
35915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    {
36915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    }
37915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
38915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    lldb::ValueObjectSP
39915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    Dereference (Error &error);
40915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
41915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    ValueObject *
4236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index);
43915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
44915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    lldb::ValueObjectSP
45915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    GetSyntheticChildAtOffset (uint32_t offset, const ClangASTType& type, bool can_create);
46915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
47915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    lldb::ValueObjectSP
48915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    AddressOf (Error &error);
49915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
50915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    bool
51915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    NeedsDerefOnTarget()
52915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    {
53915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        m_impl_backend->UpdateValueIfNeeded(false);
54915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        return (m_impl_backend->GetValue().GetValueType() == Value::eValueTypeHostAddress);
55915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    }
56915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
57915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    lldb::addr_t
58915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    GetLiveAddress()
59915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    {
60915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        return m_live_address;
61915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    }
62915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
63915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    void
64dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen    SetLiveAddress(lldb::addr_t addr = LLDB_INVALID_ADDRESS,
65dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen                   AddressType address_type = eAddressTypeLoad)
66915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    {
67915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        m_live_address = addr;
68dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen        m_live_address_type = address_type;
69915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    }
70915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
71915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    lldb::ValueObjectSP
72915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    DerefOnTarget();
73915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
74dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen    virtual lldb::addr_t
75dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen    GetAddressOf (bool scalar_is_load_address = true,
76dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen                  AddressType *address_type = NULL);
77dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen
78915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    virtual size_t
79915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    GetPointeeData (DataExtractor& data,
80915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata                    uint32_t item_idx = 0,
81915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata					uint32_t item_count = 1);
82915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
83915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granataprivate:
84915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
85915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    ValueObject *m_impl_backend;
86915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    lldb::addr_t m_live_address;
87dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen    AddressType m_live_address_type;
88915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    lldb::ValueObjectSP m_load_addr_backend;
89915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    lldb::ValueObjectSP m_address_of_backend;
90915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
91915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    DISALLOW_COPY_AND_ASSIGN (ValueObjectConstResultImpl);
92915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata};
93915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
94915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata} // namespace lldb_private
95915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
96915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata#endif  // liblldb_ValueObjectConstResultImpl_h_
97