124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangExpressionVariable.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#include "lldb/Expression/ClangExpressionVariable.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/ASTContext.h"
17a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan#include "lldb/Core/ConstString.h"
18a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan#include "lldb/Core/DataExtractor.h"
19a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan#include "lldb/Core/Stream.h"
20a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan#include "lldb/Core/Value.h"
2166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton#include "lldb/Core/ValueObjectConstResult.h"
22e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan#include "lldb/Target/ExecutionContext.h"
23e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan#include "lldb/Target/Process.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamClangExpressionVariable::ClangExpressionVariable(ExecutionContextScope *exe_scope, lldb::ByteOrder byte_order, uint32_t addr_byte_size) :
2966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    m_parser_vars(),
3066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    m_jit_vars (),
31dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_flags (EVNone),
3247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_frozen_sp (ValueObjectConstResult::Create (exe_scope, byte_order, addr_byte_size))
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionVariable::ClangExpressionVariable (const lldb::ValueObjectSP &valobj_sp) :
37427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_parser_vars(),
38427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_jit_vars (),
39dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_flags (EVNone),
40dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_frozen_sp (valobj_sp)
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton//----------------------------------------------------------------------
45427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton/// Return the variable's size in bytes
46427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton//----------------------------------------------------------------------
47427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonsize_t
48427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionVariable::GetByteSize ()
49427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    return m_frozen_sp->GetByteSize();
51427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
52324067bc91877dbbd6ec3a8663914fa3dbb7e3c9Jim Ingham
53427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonconst ConstString &
54427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionVariable::GetName ()
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    return m_frozen_sp->GetName();
57427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
58427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
59427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonlldb::ValueObjectSP
60427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionVariable::GetValueObject()
61427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    return m_frozen_sp;
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonRegisterInfo *
66427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionVariable::GetRegisterInfo()
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    return m_frozen_sp->GetValue().GetRegisterInfo();
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
71427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid
72b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonClangExpressionVariable::SetRegisterInfo (const RegisterInfo *reg_info)
7366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{
74b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    return m_frozen_sp->GetValue().SetContext (Value::eContextTypeRegisterInfo, const_cast<RegisterInfo *>(reg_info));
7566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton}
7666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
7752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
78427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionVariable::GetClangType()
79427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    return m_frozen_sp->GetClangType();
81427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
82427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
83427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid
8452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangExpressionVariable::SetClangType(const ClangASTType &clang_type)
85427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
8652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_frozen_sp->GetValue().SetClangType(clang_type);
87427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
88427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
89427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
90427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonTypeFromUser
91427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionVariable::GetTypeFromUser()
92427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
9352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    TypeFromUser tfu (m_frozen_sp->GetClangType());
94427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return tfu;
95427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
96427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
97427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonuint8_t *
98427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionVariable::GetValueBytes()
9966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{
1006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    const size_t byte_size = m_frozen_sp->GetByteSize();
101427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (byte_size > 0)
10266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    {
1036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (m_frozen_sp->GetDataExtractor().GetByteSize() < byte_size)
10466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
1056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            m_frozen_sp->GetValue().ResizeData(byte_size);
1066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            m_frozen_sp->GetValue().GetData (m_frozen_sp->GetDataExtractor());
10766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
1086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        return const_cast<uint8_t *>(m_frozen_sp->GetDataExtractor().GetDataStart());
10966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    }
110427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return NULL;
111427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
112427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
113427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid
114427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionVariable::SetName (const ConstString &name)
115427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
1166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    m_frozen_sp->SetName (name);
117427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
118427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid
120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionVariable::ValueUpdated ()
121427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
1226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    m_frozen_sp->ValueUpdated ();
12366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton}
12466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
125c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chenvoid
126c61349681fa2923bd30ad16afce450a0da6108cfJohnny ChenClangExpressionVariable::TransferAddress (bool force)
127c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen{
128c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen    if (m_live_sp.get() == NULL)
129c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen        return;
130c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen
131c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen    if (m_frozen_sp.get() == NULL)
132c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen        return;
133c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen
134c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen    if (force || (m_frozen_sp->GetLiveAddress() == LLDB_INVALID_ADDRESS))
135c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen        m_frozen_sp->SetLiveAddress(m_live_sp->GetLiveAddress());
136c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen}
137