Value.h revision 7c5e22f2edf0a0ef17e3a401c814a873399d108a
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Value.h -------------------------------------------------*- 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#ifndef liblldb_Value_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_Value_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
157c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton#include <string>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ClangForward.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBufferHeap.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Error.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Scalar.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Value
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Values Less than zero are an error, greater than or equal to zero
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // returns what the Scalar result is.
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum ValueType
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // m_value contains...
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // ============================
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eValueTypeScalar,               // raw scalar value
387c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        eValueTypeVector,               // byte array of m_vector.length with endianness of m_vector.byte_order
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eValueTypeFileAddress,          // file address value
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eValueTypeLoadAddress,          // load address value
4187c871847dba627a07cf6f4ac8cfb4d6722eccb5Eli Friedman        eValueTypeHostAddress           // host address value (for memory in the process that is using liblldb)
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum ContextType                    // Type that describes Value::m_context
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // m_context contains...
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // ====================
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eContextTypeInvalid,            // undefined
496916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        eContextTypeClangType,          // void * (an opaque clang::QualType * that can be fed to "static QualType QualType::getFromOpaquePtr(void *)")
507c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        eContextTypeRegisterInfo,       // RegisterInfo * (can be a scalar or a vector register)
516916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        eContextTypeLLDBType,           // lldb_private::Type *
522bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen        eContextTypeVariable            // lldb_private::Variable *
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
557c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    enum
567c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    {
577c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        kMaxByteSize = 32u
587c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    };
597c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
607c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    struct Vector
617c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    {
627c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        // The byte array must be big enough to hold vector registers for any supported target.
637c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        uint8_t bytes[kMaxByteSize];
647c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        size_t length;
657c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        lldb::ByteOrder byte_order;
667c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
677c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        Vector() :
687c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton			length(0),
697c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton			byte_order(lldb::eByteOrderInvalid)
707c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        {
717c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		}
727c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
737c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        Vector(const Vector& vector)
747c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		{ *this = vector;
757c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        }
767c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        const Vector&
777c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		operator=(const Vector& vector)
787c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		{
797c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            SetBytes((uint8_t *)vector.bytes, vector.length, vector.byte_order);
807c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            return *this;
817c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        }
827c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
837c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        bool
847c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		SetBytes(uint8_t *bytes, size_t length, lldb::ByteOrder byte_order)
857c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		{
867c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            this->length = length;
877c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            this->byte_order = byte_order;
887c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            if (length)
897c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton                ::memcpy(this->bytes, bytes, length < kMaxByteSize ? length : kMaxByteSize);
907c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            return IsValid();
917c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        }
927c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
937c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        bool
947c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		IsValid() const
957c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		{
967c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            return (length > 0 && length < kMaxByteSize && byte_order != lldb::eByteOrderInvalid);
977c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        }
987c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        // Casts a vector, if valid, to an unsigned int of matching or largest supported size.
997c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        // Truncates to the beginning of the vector if required.
1007c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        // Returns a default constructed Scalar if the Vector data is internally inconsistent.
1017c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        Scalar
1027c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		GetAsScalar() const
1037c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		{
1047c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            Scalar scalar;
1057c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            if (IsValid())
1067c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton                if (length == 1) scalar = *(uint8_t *)bytes;
1077c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton                if (length == 2) scalar = *(uint16_t *)bytes;
1087c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton                if (length == 4) scalar = *(uint32_t *)bytes;
1097c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton                if (length == 8) scalar = *(uint64_t *)bytes;
1107c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
1117c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton                if (length >= 16) scalar = *(__uint128_t *)bytes;
1127c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton#else
1137c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton                if (length >= 16) scalar = *(__uint64_t *)bytes;
1147c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton#endif
1157c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            return scalar;
1167c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        }
1177c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    };
1187c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Value();
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Value(const Scalar& scalar);
1217c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    Value(const Vector& vector);
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Value(const uint8_t *bytes, int len);
123bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    Value(const Value &rhs);
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
125bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    Value &
126bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    operator=(const Value &rhs);
127bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton
12804c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    lldb::clang_type_t
129462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    GetClangType();
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueType
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetValueType() const;
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
134b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    AddressType
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetValueAddressType () const;
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ContextType
138801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    GetContextType() const
139801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
140801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        return m_context_type;
141801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
144801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    SetValueType (ValueType value_type)
145801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
146801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        m_value_type = value_type;
147801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
150801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    ClearContext ()
151801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
152801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        m_context = NULL;
153801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        m_context_type = eContextTypeInvalid;
154801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
157801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    SetContext (ContextType context_type, void *p)
158801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
159801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        m_context_type = context_type;
160801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        m_context = p;
1617c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        if (m_context_type == eContextTypeRegisterInfo) {
1627c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            RegisterInfo *reg_info = GetRegisterInfo();
1637c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            if (reg_info->encoding == lldb::eEncodingVector)
1647c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton                SetValueType(eValueTypeVector);
1657c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            else
1667c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton                SetValueType(eValueTypeScalar);
1677c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        }
168801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
170b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    RegisterInfo *
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetRegisterInfo();
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetType();
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar &
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ResolveValue (ExecutionContext *exe_ctx, clang::ASTContext *ast_context);
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar &
180801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    GetScalar()
181801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
182801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        return m_value;
183801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1857c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    Vector &
1867c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    GetVector()
1877c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    {
1887c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        return m_vector;
1897c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    }
1907c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
1917c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    bool
1927c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    SetVectorBytes(const Vector& vector)
1937c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton	{
1947c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        m_vector = vector;
1957c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        return m_vector.IsValid();
1967c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    }
1977c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
1987c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    bool
1997c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    SetVectorBytes(uint8_t *bytes, size_t length, lldb::ByteOrder byte_order)
2007c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton	{
2017c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        return m_vector.SetBytes(bytes, length, byte_order);
2027c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    }
2037c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
2047c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    bool
2057c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    SetScalarFromVector()
2067c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton	{
2077c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        if (m_vector.IsValid())
2087c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		{
2097c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            m_value = m_vector.GetAsScalar();
2107c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            return true;
2117c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        }
2127c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        return false;
2137c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    }
2147c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ResizeData(int len);
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueOf(ExecutionContext *exe_ctx, clang::ASTContext *ast_context);
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Variable *
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetVariable();
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Dump (Stream* strm);
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::Format
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetValueDefaultFormat ();
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetValueByteSize (clang::ASTContext *ast_context, Error *error_ptr);
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error
234801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    GetValueAsData (ExecutionContext *exe_ctx,
235801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    clang::ASTContext *ast_context,
236801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    DataExtractor &data,
237801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    uint32_t data_offset,
238801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    Module *module);     // Can be NULL
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const char *
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetValueTypeAsCString (ValueType context_type);
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const char *
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetContextTypeAsCString (ContextType context_type);
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
246427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
247427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetData (DataExtractor &data);
248427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar          m_value;
2517c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    Vector          m_vector;
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueType       m_value_type;
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *          m_context;
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ContextType     m_context_type;
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DataBufferHeap  m_data_buffer;
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ValueList
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
261bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    ValueList () :
262bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton        m_values()
263bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    {
264bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    }
265bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueList (const ValueList &rhs);
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
268bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    ~ValueList ()
269bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    {
270bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    }
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ValueList & operator= (const ValueList &rhs);
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // void InsertValue (Value *value, size_t idx);
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void PushValue (const Value &value);
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t GetSize ();
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Value *GetValueAtIndex(size_t idx);
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void Clear();
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::vector<Value> collection;
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection m_values;
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Value_h_
292