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"
2452f792329be5db8e38961350589e97e8f2823acdGreg Clayton#include "lldb/Symbol/ClangASTType.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Value
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Values Less than zero are an error, greater than or equal to zero
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // returns what the Scalar result is.
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum ValueType
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // m_value contains...
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // ============================
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eValueTypeScalar,               // raw scalar value
397c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        eValueTypeVector,               // byte array of m_vector.length with endianness of m_vector.byte_order
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eValueTypeFileAddress,          // file address value
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eValueTypeLoadAddress,          // load address value
4287c871847dba627a07cf6f4ac8cfb4d6722eccb5Eli Friedman        eValueTypeHostAddress           // host address value (for memory in the process that is using liblldb)
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum ContextType                    // Type that describes Value::m_context
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // m_context contains...
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        // ====================
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eContextTypeInvalid,            // undefined
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
55d387b462eecb908af265ecc7006781b4532073adGreg Clayton    const static size_t kMaxByteSize = 32u;
567c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
577c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    struct Vector
587c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    {
597c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        // The byte array must be big enough to hold vector registers for any supported target.
607c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        uint8_t bytes[kMaxByteSize];
617c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        size_t length;
627c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        lldb::ByteOrder byte_order;
637c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
647c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        Vector() :
657c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton			length(0),
667c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton			byte_order(lldb::eByteOrderInvalid)
677c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        {
687c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		}
697c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
707c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        Vector(const Vector& vector)
717c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		{ *this = vector;
727c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        }
737c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        const Vector&
747c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		operator=(const Vector& vector)
757c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		{
76d387b462eecb908af265ecc7006781b4532073adGreg Clayton            SetBytes(vector.bytes, vector.length, vector.byte_order);
777c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            return *this;
787c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        }
797c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
8052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        void
8152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        Clear ()
8252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
8352f792329be5db8e38961350589e97e8f2823acdGreg Clayton			length = 0;
8452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
8552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
8652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        bool
87d387b462eecb908af265ecc7006781b4532073adGreg Clayton		SetBytes(const void *bytes, size_t length, lldb::ByteOrder byte_order)
887c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		{
897c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            this->length = length;
907c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            this->byte_order = byte_order;
917c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            if (length)
927c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton                ::memcpy(this->bytes, bytes, length < kMaxByteSize ? length : kMaxByteSize);
937c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            return IsValid();
947c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        }
957c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
967c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        bool
977c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		IsValid() const
987c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		{
997c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            return (length > 0 && length < kMaxByteSize && byte_order != lldb::eByteOrderInvalid);
1007c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        }
1017c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        // Casts a vector, if valid, to an unsigned int of matching or largest supported size.
1027c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        // Truncates to the beginning of the vector if required.
1037c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        // Returns a default constructed Scalar if the Vector data is internally inconsistent.
1047c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        Scalar
1057c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		GetAsScalar() const
1067c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		{
1077c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            Scalar scalar;
1087c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            if (IsValid())
109b335e7090f1c6579d8bf2915f6a4a0ba98be15efGreg Clayton            {
110b335e7090f1c6579d8bf2915f6a4a0ba98be15efGreg Clayton                if (length == 1) scalar = *(const uint8_t *)bytes;
111b335e7090f1c6579d8bf2915f6a4a0ba98be15efGreg Clayton                else if (length == 2) scalar = *(const uint16_t *)bytes;
112b335e7090f1c6579d8bf2915f6a4a0ba98be15efGreg Clayton                else if (length == 4) scalar = *(const uint32_t *)bytes;
113b335e7090f1c6579d8bf2915f6a4a0ba98be15efGreg Clayton                else if (length == 8) scalar = *(const uint64_t *)bytes;
1147c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton#if defined (ENABLE_128_BIT_SUPPORT)
115b335e7090f1c6579d8bf2915f6a4a0ba98be15efGreg Clayton                else if (length >= 16) scalar = *(const __uint128_t *)bytes;
1167c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton#else
117b335e7090f1c6579d8bf2915f6a4a0ba98be15efGreg Clayton                else if (length >= 16) scalar = *(const __uint64_t *)bytes;
1187c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton#endif
119b335e7090f1c6579d8bf2915f6a4a0ba98be15efGreg Clayton            }
1207c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            return scalar;
1217c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        }
1227c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    };
1237c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Value();
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Value(const Scalar& scalar);
1267c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    Value(const Vector& vector);
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Value(const uint8_t *bytes, int len);
128bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    Value(const Value &rhs);
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    Value &
131bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    operator=(const Value &rhs);
132bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton
13352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const ClangASTType &
134462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    GetClangType();
13552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
13652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    void
13752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    SetClangType (const ClangASTType &clang_type);
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueType
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetValueType() const;
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
142b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    AddressType
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetValueAddressType () const;
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ContextType
146801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    GetContextType() const
147801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
148801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        return m_context_type;
149801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
152801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    SetValueType (ValueType value_type)
153801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
154801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        m_value_type = value_type;
155801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
158801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    ClearContext ()
159801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
160801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        m_context = NULL;
161801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        m_context_type = eContextTypeInvalid;
162801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
165801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    SetContext (ContextType context_type, void *p)
166801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
167801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        m_context_type = context_type;
168801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        m_context = p;
1697c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        if (m_context_type == eContextTypeRegisterInfo) {
1707c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            RegisterInfo *reg_info = GetRegisterInfo();
1717c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            if (reg_info->encoding == lldb::eEncodingVector)
1727c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton                SetValueType(eValueTypeVector);
1737c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            else
1747c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton                SetValueType(eValueTypeScalar);
1757c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        }
176801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
178b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    RegisterInfo *
17910dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    GetRegisterInfo() const;
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetType();
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar &
18552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ResolveValue (ExecutionContext *exe_ctx);
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18710dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    const Scalar &
18810dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    GetScalar() const
18910dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    {
19010dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        return m_value;
19110dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    }
19210dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata
19310dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    const Vector &
19410dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    GetVector() const
19510dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    {
19610dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata        return m_vector;
19710dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata    }
19810dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico Granata
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar &
200801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    GetScalar()
201801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
202801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        return m_value;
203801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2057c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    Vector &
2067c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    GetVector()
2077c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    {
2087c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        return m_vector;
2097c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    }
2107c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
2117c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    bool
2127c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    SetVectorBytes(const Vector& vector)
2137c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton	{
2147c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        m_vector = vector;
2157c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        return m_vector.IsValid();
2167c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    }
2177c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
2187c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    bool
2197c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    SetVectorBytes(uint8_t *bytes, size_t length, lldb::ByteOrder byte_order)
2207c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton	{
2217c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        return m_vector.SetBytes(bytes, length, byte_order);
2227c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    }
2237c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
2247c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    bool
2257c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    SetScalarFromVector()
2267c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton	{
2277c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        if (m_vector.IsValid())
2287c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton		{
2297c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            m_value = m_vector.GetAsScalar();
2307c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            return true;
2317c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        }
2327c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton        return false;
2337c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    }
2347c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
23636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    ResizeData(size_t len);
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
23952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ValueOf(ExecutionContext *exe_ctx);
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Variable *
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetVariable();
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Dump (Stream* strm);
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::Format
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetValueDefaultFormat ();
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
250fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton    uint64_t
25152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetValueByteSize (Error *error_ptr);
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error
254801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    GetValueAsData (ExecutionContext *exe_ctx,
255801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    DataExtractor &data,
256801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    uint32_t data_offset,
257801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                    Module *module);     // Can be NULL
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const char *
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetValueTypeAsCString (ValueType context_type);
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const char *
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetContextTypeAsCString (ContextType context_type);
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
265427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
266427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetData (DataExtractor &data);
267427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
26852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    void
26952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    Clear();
27052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Scalar          m_value;
2737c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton    Vector          m_vector;
27452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType    m_clang_type;
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *          m_context;
27652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ValueType       m_value_type;
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ContextType     m_context_type;
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DataBufferHeap  m_data_buffer;
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ValueList
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
284bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    ValueList () :
285bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton        m_values()
286bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    {
287bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    }
288bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueList (const ValueList &rhs);
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
291bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    ~ValueList ()
292bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    {
293bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    }
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ValueList & operator= (const ValueList &rhs);
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // void InsertValue (Value *value, size_t idx);
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void PushValue (const Value &value);
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t GetSize ();
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Value *GetValueAtIndex(size_t idx);
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void Clear();
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::vector<Value> collection;
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection m_values;
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Value_h_
315