124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Value.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/Core/Value.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 "lldb/Core/DataExtractor.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBufferHeap.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
193c49d4cd77b36b1c44e05144e23eebc11d67b7adJohnny Chen#include "lldb/Core/State.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContext.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
29395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton#include "lldb/Target/Target.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::Value() :
35801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    m_value (),
3652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_vector (),
3752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_clang_type (),
38801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    m_context (NULL),
3952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_value_type (eValueTypeScalar),
40801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    m_context_type (eContextTypeInvalid),
41801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    m_data_buffer ()
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::Value(const Scalar& scalar) :
46801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    m_value (scalar),
4752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_vector (),
4852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_clang_type (),
49801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    m_context (NULL),
5052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_value_type (eValueTypeScalar),
51801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    m_context_type (eContextTypeInvalid),
52801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    m_data_buffer ()
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::Value(const uint8_t *bytes, int len) :
58801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    m_value (),
5952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_vector (),
6052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_clang_type (),
61801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    m_context (NULL),
6252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_value_type (eValueTypeHostAddress),
63801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    m_context_type (eContextTypeInvalid),
64801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    m_data_buffer ()
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data_buffer.CopyData(bytes, len);
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_value = (uintptr_t)m_data_buffer.GetBytes();
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::Value(const Value &v) :
7152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_value (v.m_value),
7252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_vector (v.m_vector),
7352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_clang_type (v.m_clang_type),
7452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_context (v.m_context),
7552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_value_type (v.m_value_type),
7652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_context_type (v.m_context_type),
7752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_data_buffer ()
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if ((uintptr_t)v.m_value.ULongLong(LLDB_INVALID_ADDRESS) == (uintptr_t)v.m_data_buffer.GetBytes())
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_data_buffer.CopyData(v.m_data_buffer.GetBytes(),
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               v.m_data_buffer.GetByteSize());
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_value = (uintptr_t)m_data_buffer.GetBytes();
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonValue &
89bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonValue::operator=(const Value &rhs)
90bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton{
91bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    if (this != &rhs)
92bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    {
93bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton        m_value = rhs.m_value;
9452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        m_vector = rhs.m_vector;
9552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        m_clang_type = rhs.m_clang_type;
96bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton        m_context = rhs.m_context;
9752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        m_value_type = rhs.m_value_type;
98bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton        m_context_type = rhs.m_context_type;
99bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton        if ((uintptr_t)rhs.m_value.ULongLong(LLDB_INVALID_ADDRESS) == (uintptr_t)rhs.m_data_buffer.GetBytes())
100bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton        {
101bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton            m_data_buffer.CopyData(rhs.m_data_buffer.GetBytes(),
102bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton                                   rhs.m_data_buffer.GetByteSize());
103bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton
104bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton            m_value = (uintptr_t)m_data_buffer.GetBytes();
105bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton        }
106bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    }
107bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    return *this;
108bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton}
109bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::Dump (Stream* strm)
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_value.GetValue (strm, true);
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    strm->Printf(", value_type = %s, context = %p, context_type = %s",
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Value::GetValueTypeAsCString(m_value_type),
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_context,
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Value::GetContextTypeAsCString(m_context_type));
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::ValueType
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::GetValueType() const
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value_type;
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonAddressType
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::GetValueAddressType () const
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_value_type)
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eValueTypeScalar:
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eValueTypeLoadAddress: return eAddressTypeLoad;
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eValueTypeFileAddress: return eAddressTypeFile;
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eValueTypeHostAddress: return eAddressTypeHost;
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return eAddressTypeInvalid;
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegisterInfo *
14210dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico GranataValue::GetRegisterInfo() const
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1446916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    if (m_context_type == eContextTypeRegisterInfo)
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return static_cast<RegisterInfo *> (m_context);
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerType *
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::GetType()
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1526916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    if (m_context_type == eContextTypeLLDBType)
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return static_cast<Type *> (m_context);
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
15836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValue::ResizeData(size_t len)
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_value_type = eValueTypeHostAddress;
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data_buffer.SetByteSize(len);
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_value = (uintptr_t)m_data_buffer.GetBytes();
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
16652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonValue::ValueOf(ExecutionContext *exe_ctx)
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_context_type)
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eContextTypeInvalid:
171801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    case eContextTypeRegisterInfo:      // RegisterInfo *
172801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    case eContextTypeLLDBType:          // Type *
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
175801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    case eContextTypeVariable:          // Variable *
17652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ResolveValue(exe_ctx);
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
182fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Claytonuint64_t
18352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonValue::GetValueByteSize (Error *error_ptr)
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
185fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton    uint64_t byte_size = 0;
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_context_type)
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1896916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    case eContextTypeRegisterInfo:     // RegisterInfo *
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (GetRegisterInfo())
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            byte_size = GetRegisterInfo()->byte_size;
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    case eContextTypeInvalid:
19552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    case eContextTypeLLDBType:         // Type *
1966916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    case eContextTypeVariable:         // Variable *
19752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
19852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const ClangASTType &ast_type = GetClangType();
19952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (ast_type.IsValid())
20052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                byte_size = ast_type.GetByteSize();
201b399653251df1798e16726e89a0d61148f736cbaJim Ingham        }
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error_ptr)
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size == 0)
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (error_ptr->Success())
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                error_ptr->SetErrorString("Unable to determine byte size.");
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error_ptr->Clear();
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return byte_size;
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22052f792329be5db8e38961350589e97e8f2823acdGreg Claytonconst ClangASTType &
221462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonValue::GetClangType ()
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
22352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!m_clang_type.IsValid())
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
22552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        switch (m_context_type)
22652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
22752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case eContextTypeInvalid:
22852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case eContextTypeRegisterInfo:
23152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;    // TODO: Eventually convert into a clang type?
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case eContextTypeLLDBType:
23452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
23552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                Type *lldb_type = GetType();
23652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (lldb_type)
23752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    m_clang_type = lldb_type->GetClangForwardType();
23852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
23952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case eContextTypeVariable:
24252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
24352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                Variable *variable = GetVariable();
24452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (variable)
24552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
24652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    Type *variable_type = variable->GetType();
24752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (variable_type)
24852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        m_clang_type = variable_type->GetClangForwardType();
24952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
25052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
25152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
25252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return m_clang_type;
25652f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
25752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
25852f792329be5db8e38961350589e97e8f2823acdGreg Claytonvoid
25952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonValue::SetClangType (const ClangASTType &clang_type)
26052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
26152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_clang_type = clang_type;
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::Format
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::GetValueDefaultFormat ()
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_context_type)
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2696916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    case eContextTypeRegisterInfo:
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (GetRegisterInfo())
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetRegisterInfo()->format;
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    case eContextTypeInvalid:
2756916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    case eContextTypeLLDBType:
2766916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    case eContextTypeVariable:
27752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
27852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const ClangASTType &ast_type = GetClangType();
27952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (ast_type.IsValid())
28052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ast_type.GetFormat();
28152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Return a good default in case we can't figure anything out
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return eFormatHex;
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
290427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonbool
291427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValue::GetData (DataExtractor &data)
292427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
293427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    switch (m_value_type)
294427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
295427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    default:
296427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        break;
297427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
298427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    case eValueTypeScalar:
299427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (m_value.GetData (data))
300427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return true;
301427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        break;
302427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
303427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    case eValueTypeLoadAddress:
304427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    case eValueTypeFileAddress:
305427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    case eValueTypeHostAddress:
306427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (m_data_buffer.GetByteSize())
307427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
308427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            data.SetData(m_data_buffer.GetBytes(), m_data_buffer.GetByteSize(), data.GetByteOrder());
309427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return true;
310427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
311427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        break;
312427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
313427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
314427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return false;
315427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
316427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
317427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
3197421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg ClaytonValue::GetValueAsData (ExecutionContext *exe_ctx,
32052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                       DataExtractor &data,
321801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                       uint32_t data_offset,
322801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                       Module *module)
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    data.Clear();
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::addr_t address = LLDB_INVALID_ADDRESS;
328b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    AddressType address_type = eAddressTypeFile;
329917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    Address file_so_addr;
33052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const ClangASTType &ast_type = GetClangType();
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (m_value_type)
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3330468bb2077ab25a289514dc474d6b5a7c537202fEnrico Granata    case eValueTypeVector:
33452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (ast_type.IsValid())
33552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            data.SetAddressByteSize (ast_type.GetPointerByteSize());
3360468bb2077ab25a289514dc474d6b5a7c537202fEnrico Granata        else
3370468bb2077ab25a289514dc474d6b5a7c537202fEnrico Granata            data.SetAddressByteSize(sizeof(void *));
3380468bb2077ab25a289514dc474d6b5a7c537202fEnrico Granata        data.SetData(m_vector.bytes, m_vector.length, m_vector.byte_order);
3390468bb2077ab25a289514dc474d6b5a7c537202fEnrico Granata        break;
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eValueTypeScalar:
342cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton        data.SetByteOrder (lldb::endian::InlHostByteOrder());
34352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (ast_type.IsValid())
34452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            data.SetAddressByteSize (ast_type.GetPointerByteSize());
345b14b00c825d82286808a0e43f8fe9b7c37c7d3cfJim Ingham        else
346b14b00c825d82286808a0e43f8fe9b7c37c7d3cfJim Ingham            data.SetAddressByteSize(sizeof(void *));
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_value.GetData (data))
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return error;   // Success;
349a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton        error.SetErrorStringWithFormat("extracting data from value failed");
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eValueTypeLoadAddress:
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (exe_ctx == NULL)
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
355917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            error.SetErrorString ("can't read load address (no execution context)");
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
357801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        else
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
359567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            Process *process = exe_ctx->GetProcessPtr();
3607421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton            if (process == NULL || !process->IsAlive())
361801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            {
3627421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                Target *target = exe_ctx->GetTargetPtr();
3637421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                if (target)
3647421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                {
3657421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                    // Allow expressions to run and evaluate things when the target
3667421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                    // has memory sections loaded. This allows you to use "target modules load"
3677421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                    // to load your executable and any shared libraries, then execute
3687421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                    // commands where you can look at types in data sections.
3697421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                    const SectionLoadList &target_sections = target->GetSectionLoadList();
3707421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                    if (!target_sections.IsEmpty())
3717421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                    {
3727421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                        address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
3737421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                        if (target_sections.ResolveLoadAddress(address, file_so_addr))
3747421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                        {
3757421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                            address_type = eAddressTypeLoad;
3767421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                            data.SetByteOrder(target->GetArchitecture().GetByteOrder());
3777421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                            data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
3787421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                        }
3797421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                        else
3807421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                            address = LLDB_INVALID_ADDRESS;
3817421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                    }
3827421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                    else
3837421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                    {
3847421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                        ModuleSP exe_module_sp (target->GetExecutableModule());
3857421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                        if (exe_module_sp)
3867421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                        {
3877421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                            address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
3887421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                            if (address != LLDB_INVALID_ADDRESS)
3897421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                            {
3907421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                                if (exe_module_sp->ResolveFileAddress(address, file_so_addr))
3917421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                                {
3927421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                                    data.SetByteOrder(target->GetArchitecture().GetByteOrder());
3937421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                                    data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
3947421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                                    address_type = eAddressTypeFile;
3957421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                                }
3967421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                                else
3977421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                                {
3987421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                                    address = LLDB_INVALID_ADDRESS;
3997421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                                }
4007421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                            }
4017421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                        }
4027421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton//                    }
4037421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                }
4047421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                else
4057421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                {
4067421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                    error.SetErrorString ("can't read load address (invalid process)");
4077421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                }
408801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            }
409801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            else
410801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            {
411801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
412801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                address_type = eAddressTypeLoad;
413801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                data.SetByteOrder(process->GetTarget().GetArchitecture().GetByteOrder());
414801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                data.SetAddressByteSize(process->GetTarget().GetArchitecture().GetAddressByteSize());
415801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            }
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eValueTypeFileAddress:
420917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (exe_ctx == NULL)
421917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        {
422917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            error.SetErrorString ("can't read file address (no execution context)");
423917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        }
424567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        else if (exe_ctx->GetTargetPtr() == NULL)
425917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        {
426917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            error.SetErrorString ("can't read file address (invalid target)");
427917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        }
428917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        else
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
430801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
431801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            if (address == LLDB_INVALID_ADDRESS)
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
433801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                error.SetErrorString ("invalid file address");
434801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            }
435801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            else
436801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            {
437801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                if (module == NULL)
438801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                {
439801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    // The only thing we can currently lock down to a module so that
440801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    // we can resolve a file address, is a variable.
441801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    Variable *variable = GetVariable();
442801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    if (variable)
443801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    {
444801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                        SymbolContext var_sc;
445801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                        variable->CalculateSymbolContext(&var_sc);
446801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                        module = var_sc.module_sp.get();
447801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    }
448801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                }
449801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
450801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                if (module)
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
452917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    bool resolved = false;
453801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    ObjectFile *objfile = module->GetObjectFile();
454801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    if (objfile)
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
456801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                        Address so_addr(address, objfile->GetSectionList());
457567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                        addr_t load_address = so_addr.GetLoadAddress (exe_ctx->GetTargetPtr());
4583c49d4cd77b36b1c44e05144e23eebc11d67b7adJohnny Chen                        bool process_launched_and_stopped = exe_ctx->GetProcessPtr()
4593c49d4cd77b36b1c44e05144e23eebc11d67b7adJohnny Chen                            ? StateIsStoppedState(exe_ctx->GetProcessPtr()->GetState(), true /* must_exist */)
4603c49d4cd77b36b1c44e05144e23eebc11d67b7adJohnny Chen                            : false;
4616c49bf469d8b43eaab76a43f7a17ac6137a0380cJohnny Chen                        // Don't use the load address if the process has exited.
4626c49bf469d8b43eaab76a43f7a17ac6137a0380cJohnny Chen                        if (load_address != LLDB_INVALID_ADDRESS && process_launched_and_stopped)
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
464801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                            resolved = true;
465801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                            address = load_address;
466801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                            address_type = eAddressTypeLoad;
467567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                            data.SetByteOrder(exe_ctx->GetTargetRef().GetArchitecture().GetByteOrder());
468567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                            data.SetAddressByteSize(exe_ctx->GetTargetRef().GetArchitecture().GetAddressByteSize());
469801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                        }
470801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                        else
471801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                        {
472801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                            if (so_addr.IsSectionOffset())
473fe9864c516cb8e5b63cf463aecf089b4f9b94ac8Greg Clayton                            {
474917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                resolved = true;
475801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                                file_so_addr = so_addr;
476801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                                data.SetByteOrder(objfile->GetByteOrder());
477801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                                data.SetAddressByteSize(objfile->GetAddressByteSize());
478fe9864c516cb8e5b63cf463aecf089b4f9b94ac8Greg Clayton                            }
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
481917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    if (!resolved)
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
483801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                        Variable *variable = GetVariable();
484801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
485801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                        if (module)
486801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                        {
487801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                            if (variable)
48897a19b21dacd9063bb5475812df7781777262198Greg Clayton                                error.SetErrorStringWithFormat ("unable to resolve the module for file address 0x%" PRIx64 " for variable '%s' in %s",
489801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                                                                address,
490801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                                                                variable->GetName().AsCString(""),
49197a19b21dacd9063bb5475812df7781777262198Greg Clayton                                                                module->GetFileSpec().GetPath().c_str());
492801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                            else
49397a19b21dacd9063bb5475812df7781777262198Greg Clayton                                error.SetErrorStringWithFormat ("unable to resolve the module for file address 0x%" PRIx64 " in %s",
494801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                                                                address,
49597a19b21dacd9063bb5475812df7781777262198Greg Clayton                                                                module->GetFileSpec().GetPath().c_str());
496801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                        }
497917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        else
498801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                        {
499801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                            if (variable)
5005f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                                error.SetErrorStringWithFormat ("unable to resolve the module for file address 0x%" PRIx64 " for variable '%s'",
501801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                                                                address,
502801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                                                                variable->GetName().AsCString(""));
503801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                            else
5045f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                                error.SetErrorStringWithFormat ("unable to resolve the module for file address 0x%" PRIx64, address);
505801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                        }
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
510801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    // Can't convert a file address to anything valid without more
511801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    // context (which Module it came from)
512801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    error.SetErrorString ("can't read memory from file address without more context");
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eValueTypeHostAddress:
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
5202d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata        address_type = eAddressTypeHost;
5212d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata        if (exe_ctx)
5222d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata        {
5232d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata            Target *target = exe_ctx->GetTargetPtr();
5242d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata            if (target)
5252d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata            {
5262d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata                data.SetByteOrder(target->GetArchitecture().GetByteOrder());
5272d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata                data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
5282d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata                break;
5292d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata            }
5302d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata        }
5312d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata        // fallback to host settings
532cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton        data.SetByteOrder(lldb::endian::InlHostByteOrder());
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        data.SetAddressByteSize(sizeof(void *));
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Bail if we encountered any errors
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Fail())
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return error;
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (address == LLDB_INVALID_ADDRESS)
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
543a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton        error.SetErrorStringWithFormat ("invalid %s address", address_type == eAddressTypeHost ? "host" : "load");
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return error;
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If we got here, we need to read the value from memory
54852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    size_t byte_size = GetValueByteSize (&error);
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Bail if we encountered any errors getting the byte size
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Fail())
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return error;
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure we have enough room within "data", and if we don't make
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // something large enough that does
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!data.ValidOffsetForDataOfSize (data_offset, byte_size))
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DataBufferSP data_sp(new DataBufferHeap (data_offset + byte_size, '\0'));
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        data.SetData(data_sp);
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    uint8_t* dst = const_cast<uint8_t*>(data.PeekData (data_offset, byte_size));
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (dst != NULL)
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (address_type == eAddressTypeHost)
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // The address is an address in this process, so just copy it
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            memcpy (dst, (uint8_t*)NULL + address, byte_size);
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
570917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        else if ((address_type == eAddressTypeLoad) || (address_type == eAddressTypeFile))
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
572917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            if (file_so_addr.IsValid())
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
574917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                // We have a file address that we were able to translate into a
575917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                // section offset address so we might be able to read this from
576917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                // the object files if we don't have a live process. Lets always
577917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                // try and read from the process if we have one though since we
578917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                // want to read the actual value by setting "prefer_file_cache"
579917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                // to false.
580917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                const bool prefer_file_cache = false;
581567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (exe_ctx->GetTargetRef().ReadMemory(file_so_addr, prefer_file_cache, dst, byte_size, error) != byte_size)
582917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                {
5835f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                    error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed", (uint64_t)address);
584917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                }
585917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            }
586917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            else
587917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            {
588801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                // The execution context might have a NULL process, but it
589801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                // might have a valid process in the exe_ctx->target, so use
590801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                // the ExecutionContext::GetProcess accessor to ensure we
591801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                // get the process if there is one.
592567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Process *process = exe_ctx->GetProcessPtr();
593801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
594801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                if (process)
595917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                {
596801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    const size_t bytes_read = process->ReadMemory(address, dst, byte_size, error);
597801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    if (bytes_read != byte_size)
5985f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                        error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed (%u of %u bytes read)",
599801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                                                       (uint64_t)address,
600801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                                                       (uint32_t)bytes_read,
601801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                                                       (uint32_t)byte_size);
602801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                }
603801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                else
604801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                {
6055f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                    error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed (invalid process)", (uint64_t)address);
606917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                }
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
611b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            error.SetErrorStringWithFormat ("unsupported AddressType value (%i)", address_type);
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
616a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton        error.SetErrorStringWithFormat ("out of memory");
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar &
62352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonValue::ResolveValue(ExecutionContext *exe_ctx)
62452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
62552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const ClangASTType &clang_type = GetClangType();
62652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (clang_type.IsValid())
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (m_value_type)
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eValueTypeScalar:               // raw scalar value
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eValueTypeFileAddress:
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eValueTypeLoadAddress:          // load address value
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eValueTypeHostAddress:          // host address value (for memory in the process that is using liblldb)
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                DataExtractor data;
6397421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                lldb::addr_t addr = m_value.ULongLong(LLDB_INVALID_ADDRESS);
64052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                Error error (GetValueAsData (exe_ctx, data, 0, NULL));
6417421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton                if (error.Success())
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
643801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    Scalar scalar;
64452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (clang_type.GetValueAsScalar (data, 0, data.GetByteSize(), scalar))
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        m_value = scalar;
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        m_value_type = eValueTypeScalar;
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if ((uintptr_t)addr != (uintptr_t)m_data_buffer.GetBytes())
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_value.Clear();
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_value_type = eValueTypeScalar;
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if ((uintptr_t)addr != (uintptr_t)m_data_buffer.GetBytes())
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        m_value.Clear();
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        m_value_type = eValueTypeScalar;
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value;
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariable *
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::GetVariable()
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6766916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    if (m_context_type == eContextTypeVariable)
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return static_cast<Variable *> (m_context);
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68152f792329be5db8e38961350589e97e8f2823acdGreg Claytonvoid
68252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonValue::Clear()
68352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
68452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_value.Clear();
68552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_vector.Clear();
68652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_clang_type.Clear();
68752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_value_type = eValueTypeScalar;
68852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_context = NULL;
68952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_context_type = eContextTypeInvalid;
69052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_data_buffer.Clear();
69152f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
69252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
69352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::GetValueTypeAsCString (ValueType value_type)
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (value_type)
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eValueTypeScalar:      return "scalar";
700f0fab4fcabd0aa5a60425b430206d1b5b2bef96fGreg Clayton    case eValueTypeVector:      return "vector";
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eValueTypeFileAddress: return "file address";
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eValueTypeLoadAddress: return "load address";
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eValueTypeHostAddress: return "host address";
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "???";
70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::GetContextTypeAsCString (ContextType context_type)
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (context_type)
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
713801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    case eContextTypeInvalid:       return "invalid";
714801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    case eContextTypeRegisterInfo:  return "RegisterInfo *";
715801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    case eContextTypeLLDBType:      return "Type *";
716801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    case eContextTypeVariable:      return "Variable *";
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "???";
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueList::ValueList (const ValueList &rhs)
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_values = rhs.m_values;
72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ValueList &
72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueList::operator= (const ValueList &rhs)
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_values = rhs.m_values;
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueList::PushValue (const Value &value)
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_values.push_back (value);
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueList::GetSize()
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_values.size();
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue *
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueList::GetValueAtIndex (size_t idx)
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (idx < GetSize())
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &(m_values[idx]);
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueList::Clear ()
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_values.clear();
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
76152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
762