124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ValueObjectRegister.cpp ---------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectRegister.h"
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContext.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark ValueObjectRegisterContext
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectRegisterContext::ValueObjectRegisterContext (ValueObject &parent, RegisterContextSP &reg_ctx) :
33bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    ValueObject (parent),
34fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_reg_ctx_sp (reg_ctx)
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (reg_ctx);
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name.SetCString("Registers");
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetValueIsValid (true);
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegisterContext::~ValueObjectRegisterContext()
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
46931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObjectRegisterContext::GetClangTypeImpl ()
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerConstString
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegisterContext::GetTypeName()
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
54940dd18789f83f28a618a9b588376c8bae557347Sean Callanan    return ConstString();
55940dd18789f83f28a618a9b588376c8bae557347Sean Callanan}
56940dd18789f83f28a618a9b588376c8bae557347Sean Callanan
57940dd18789f83f28a618a9b588376c8bae557347Sean CallananConstString
58940dd18789f83f28a618a9b588376c8bae557347Sean CallananValueObjectRegisterContext::GetQualifiedTypeName()
59940dd18789f83f28a618a9b588376c8bae557347Sean Callanan{
60940dd18789f83f28a618a9b588376c8bae557347Sean Callanan    return ConstString();
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegisterContext::CalculateNumChildren()
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
66fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return m_reg_ctx_sp->GetRegisterSetCount();
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Claytonuint64_t
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegisterContext::GetByteSize()
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool
76fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectRegisterContext::UpdateValue ()
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_error.Clear();
79b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    ExecutionContext exe_ctx(GetExecutionContextRef());
80b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (frame)
82fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_reg_ctx_sp = frame->GetRegisterContext();
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
84fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_reg_ctx_sp.reset();
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_reg_ctx_sp.get() == NULL)
87fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
88fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        SetValueIsValid (false);
89fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_error.SetErrorToGenericError();
90fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
91fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    else
92fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        SetValueIsValid (true);
93fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
94fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return m_error.Success();
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9747da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject *
9836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObjectRegisterContext::CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index)
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    ValueObject *new_valobj = NULL;
10147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham
10236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const size_t num_children = GetNumChildren();
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (idx < num_children)
104b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    {
105b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton        ExecutionContext exe_ctx(GetExecutionContextRef());
106b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton        new_valobj = new ValueObjectRegisterSet(exe_ctx.GetBestExecutionContextScope(), m_reg_ctx_sp, idx);
107b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    }
10847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham
10947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    return new_valobj;
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark -
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark ValueObjectRegisterSet
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11647da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP
11747da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectRegisterSet::Create (ExecutionContextScope *exe_scope, lldb::RegisterContextSP &reg_ctx_sp, uint32_t set_idx)
11847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham{
11947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    return (new ValueObjectRegisterSet (exe_scope, reg_ctx_sp, set_idx))->GetSP();
12047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham}
12147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham
12247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham
123fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectRegisterSet::ValueObjectRegisterSet (ExecutionContextScope *exe_scope, lldb::RegisterContextSP &reg_ctx, uint32_t reg_set_idx) :
124fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ValueObject (exe_scope),
125fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_reg_ctx_sp (reg_ctx),
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_reg_set (NULL),
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_reg_set_idx (reg_set_idx)
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (reg_ctx);
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_reg_set = reg_ctx->GetRegisterSet(m_reg_set_idx);
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_reg_set)
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_name.SetCString (m_reg_set->name);
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegisterSet::~ValueObjectRegisterSet()
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
142931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObjectRegisterSet::GetClangTypeImpl ()
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerConstString
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegisterSet::GetTypeName()
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ConstString();
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
153940dd18789f83f28a618a9b588376c8bae557347Sean CallananConstString
154940dd18789f83f28a618a9b588376c8bae557347Sean CallananValueObjectRegisterSet::GetQualifiedTypeName()
155940dd18789f83f28a618a9b588376c8bae557347Sean Callanan{
156940dd18789f83f28a618a9b588376c8bae557347Sean Callanan    return ConstString();
157940dd18789f83f28a618a9b588376c8bae557347Sean Callanan}
158940dd18789f83f28a618a9b588376c8bae557347Sean Callanan
15936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegisterSet::CalculateNumChildren()
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
162fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    const RegisterSet *reg_set = m_reg_ctx_sp->GetRegisterSet(m_reg_set_idx);
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (reg_set)
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return reg_set->num_registers;
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
168fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Claytonuint64_t
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegisterSet::GetByteSize()
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool
175fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectRegisterSet::UpdateValue ()
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_error.Clear();
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetValueDidChange (false);
179b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    ExecutionContext exe_ctx(GetExecutionContextRef());
180b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (frame == NULL)
182fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_reg_ctx_sp.reset();
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
185fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_reg_ctx_sp = frame->GetRegisterContext ();
186fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_reg_ctx_sp)
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
188fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            const RegisterSet *reg_set = m_reg_ctx_sp->GetRegisterSet (m_reg_set_idx);
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (reg_set == NULL)
190fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_reg_ctx_sp.reset();
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else if (m_reg_set != reg_set)
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SetValueDidChange (true);
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_name.SetCString(reg_set->name);
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
198fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_reg_ctx_sp)
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetValueIsValid (true);
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetValueIsValid (false);
205fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_error.SetErrorToGenericError ();
20606cdb8d50b916a0ef1b8d65e3cfd48a26e3d7541Enrico Granata        m_children.Clear();
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
208fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return m_error.Success();
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21247da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject *
21336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValueObjectRegisterSet::CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index)
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21520e663f4da447f98b8edb25d68413ae0a71ce76bJohnny Chen    ValueObject *valobj = NULL;
216fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_reg_ctx_sp && m_reg_set)
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
21836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        const size_t num_children = GetNumChildren();
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (idx < num_children)
22047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            valobj = new ValueObjectRegister(*this, m_reg_ctx_sp, m_reg_set->registers[idx]);
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
22247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    return valobj;
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
225fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghamlldb::ValueObjectSP
226fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectRegisterSet::GetChildMemberWithName (const ConstString &name, bool can_create)
227fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
22847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    ValueObject *valobj = NULL;
229fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_reg_ctx_sp && m_reg_set)
230fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
231fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoByName (name.AsCString());
232fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (reg_info != NULL)
23347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            valobj = new ValueObjectRegister(*this, m_reg_ctx_sp, reg_info->kinds[eRegisterKindLLDB]);
234fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
23547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (valobj)
23647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return valobj->GetSP();
23747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    else
23847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return ValueObjectSP();
239fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
240fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
24136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
242fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectRegisterSet::GetIndexOfChildWithName (const ConstString &name)
243fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
244fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_reg_ctx_sp && m_reg_set)
245fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
246fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoByName (name.AsCString());
247fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (reg_info != NULL)
248fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            return reg_info->kinds[eRegisterKindLLDB];
249fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
250fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return UINT32_MAX;
251fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark -
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark ValueObjectRegister
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
256fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghamvoid
257061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonValueObjectRegister::ConstructObject (uint32_t reg_num)
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
259061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoAtIndex (reg_num);
260061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (reg_info)
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
262061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        m_reg_info = *reg_info;
263061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (reg_info->name)
264061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            m_name.SetCString(reg_info->name);
265061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        else if (reg_info->alt_name)
266061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            m_name.SetCString(reg_info->alt_name);
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
270061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonValueObjectRegister::ValueObjectRegister (ValueObject &parent, lldb::RegisterContextSP &reg_ctx_sp, uint32_t reg_num) :
271fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ValueObject (parent),
272061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    m_reg_ctx_sp (reg_ctx_sp),
273061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    m_reg_info (),
274061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    m_reg_value (),
275fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_type_name (),
27652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_clang_type ()
277fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
278061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    assert (reg_ctx_sp.get());
279061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    ConstructObject(reg_num);
280fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
281fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
28247da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP
28347da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectRegister::Create (ExecutionContextScope *exe_scope, lldb::RegisterContextSP &reg_ctx_sp, uint32_t reg_num)
28447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham{
28547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    return (new ValueObjectRegister (exe_scope, reg_ctx_sp, reg_num))->GetSP();
28647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham}
28747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham
288fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectRegister::ValueObjectRegister (ExecutionContextScope *exe_scope, lldb::RegisterContextSP &reg_ctx, uint32_t reg_num) :
289fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ValueObject (exe_scope),
290fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_reg_ctx_sp (reg_ctx),
291061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    m_reg_info (),
292061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    m_reg_value (),
293fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_type_name (),
29452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_clang_type ()
295fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
296fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    assert (reg_ctx);
297061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    ConstructObject(reg_num);
298fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
299fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegister::~ValueObjectRegister()
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
305931acecd4e3af534028936431dc0f75a9fd6eb02Sean CallananValueObjectRegister::GetClangTypeImpl ()
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!m_clang_type.IsValid())
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
309289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton        ExecutionContext exe_ctx (GetExecutionContextRef());
310289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton        Target *target = exe_ctx.GetTargetPtr();
311289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton        if (target)
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
313289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton            Module *exe_module = target->GetExecutableModulePointer();
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (exe_module)
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
316061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                m_clang_type = exe_module->GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize (m_reg_info.encoding,
317061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                                                                                     m_reg_info.byte_size * 8);
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_clang_type;
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerConstString
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegister::GetTypeName()
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_type_name.IsEmpty())
32852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        m_type_name = GetClangType().GetConstTypeName ();
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_type_name;
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegister::CalculateNumChildren()
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return GetClangType().GetNumChildren(true);
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
338fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Claytonuint64_t
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectRegister::GetByteSize()
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
341061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    return m_reg_info.byte_size;
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
344fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool
345fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObjectRegister::UpdateValue ()
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_error.Clear();
348b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    ExecutionContext exe_ctx(GetExecutionContextRef());
349b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
350061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (frame == NULL)
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
352fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_reg_ctx_sp.reset();
353061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        m_reg_value.Clear();
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
357061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    if (m_reg_ctx_sp)
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
359061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (m_reg_ctx_sp->ReadRegister (&m_reg_info, m_reg_value))
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
361061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (m_reg_value.GetData (m_data))
362061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            {
363f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                Process *process = exe_ctx.GetProcessPtr();
364f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                if (process)
365f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                    m_data.SetAddressByteSize(process->GetAddressByteSize());
366061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                m_value.SetContext(Value::eContextTypeRegisterInfo, (void *)&m_reg_info);
367061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                m_value.SetValueType(Value::eValueTypeHostAddress);
368061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                m_value.GetScalar() = (uintptr_t)m_data.GetDataStart();
369061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                SetValueIsValid (true);
370061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                return true;
371061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            }
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
374fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetValueIsValid (false);
376fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_error.SetErrorToGenericError ();
377fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return false;
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
380574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Inghambool
381651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico GranataValueObjectRegister::SetValueFromCString (const char *value_str, Error& error)
382574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham{
383574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham    // The new value will be in the m_data.  Copy that into our register value.
384651cbe2e3f6efb8bd579a5007c2d2f90f0ab7633Enrico Granata    error = m_reg_value.SetValueFromCString (&m_reg_info, value_str);
385574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham    if (error.Success())
386574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham    {
387574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham        if (m_reg_ctx_sp->WriteRegister (&m_reg_info, m_reg_value))
388574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham        {
389574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham            SetNeedsUpdate();
390574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham            return true;
391574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham        }
392574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham        else
393574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham            return false;
394574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham    }
395574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham    else
396574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham        return false;
397574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham}
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
399d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg Claytonbool
400ab8e00e51475b9148626bfdf99549b7ffc3d046dSean CallananValueObjectRegister::SetData (DataExtractor &data, Error &error)
401ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan{
402ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    error = m_reg_value.SetValueFromData(&m_reg_info, data, 0, false);
403ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    if (error.Success())
404ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    {
405ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        if (m_reg_ctx_sp->WriteRegister (&m_reg_info, m_reg_value))
406ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        {
407ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            SetNeedsUpdate();
408ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            return true;
409ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        }
410ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        else
411ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan            return false;
412ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    }
413ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan    else
414ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan        return false;
415ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan}
416ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callanan
417ab8e00e51475b9148626bfdf99549b7ffc3d046dSean Callananbool
418d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg ClaytonValueObjectRegister::ResolveValue (Scalar &scalar)
419d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg Clayton{
420d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg Clayton    if (UpdateValueIfNeeded(false)) // make sure that you are up to date before returning anything
421d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg Clayton        return m_reg_value.GetScalarValue(scalar);
422d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg Clayton    return false;
423d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg Clayton}
424d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg Clayton
4253e8388ccdc30231f86521e0d2657f80548e3daedSean Callananvoid
4263e8388ccdc30231f86521e0d2657f80548e3daedSean CallananValueObjectRegister::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat)
4273e8388ccdc30231f86521e0d2657f80548e3daedSean Callanan{
4283e8388ccdc30231f86521e0d2657f80548e3daedSean Callanan    s.Printf("$%s", m_reg_info.name);
4293e8388ccdc30231f86521e0d2657f80548e3daedSean Callanan}
4303e8388ccdc30231f86521e0d2657f80548e3daedSean Callanan
431d6bcc0db2ffc5cf724460f8e260c5709e07ea642Greg Clayton
432