aboutsummaryrefslogtreecommitdiff
path: root/include/lldb/Core/Value.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/lldb/Core/Value.h')
-rw-r--r--include/lldb/Core/Value.h432
1 files changed, 178 insertions, 254 deletions
diff --git a/include/lldb/Core/Value.h b/include/lldb/Core/Value.h
index 7539b550dc42..2800c4f20996 100644
--- a/include/lldb/Core/Value.h
+++ b/include/lldb/Core/Value.h
@@ -16,308 +16,232 @@
// Other libraries and framework includes
// Project includes
-#include "lldb/lldb-private.h"
#include "lldb/Core/DataBufferHeap.h"
#include "lldb/Core/Error.h"
#include "lldb/Core/Scalar.h"
#include "lldb/Symbol/CompilerType.h"
+#include "lldb/lldb-private.h"
namespace lldb_private {
-class Value
-{
+class Value {
public:
- // Values Less than zero are an error, greater than or equal to zero
- // returns what the Scalar result is.
- enum ValueType
- {
- // m_value contains...
- // ============================
- eValueTypeScalar, // raw scalar value
- eValueTypeVector, // byte array of m_vector.length with endianness of m_vector.byte_order
- eValueTypeFileAddress, // file address value
- eValueTypeLoadAddress, // load address value
- eValueTypeHostAddress // host address value (for memory in the process that is using liblldb)
- };
-
- enum ContextType // Type that describes Value::m_context
- {
- // m_context contains...
- // ====================
- eContextTypeInvalid, // undefined
- eContextTypeRegisterInfo, // RegisterInfo * (can be a scalar or a vector register)
- eContextTypeLLDBType, // lldb_private::Type *
- eContextTypeVariable // lldb_private::Variable *
- };
-
- const static size_t kMaxByteSize = 32u;
-
- struct Vector
- {
- // The byte array must be big enough to hold vector registers for any supported target.
- uint8_t bytes[kMaxByteSize];
- size_t length;
- lldb::ByteOrder byte_order;
-
- Vector() :
- length(0),
- byte_order(lldb::eByteOrderInvalid)
- {
- }
-
- Vector(const Vector& vector)
- { *this = vector;
- }
- const Vector&
- operator=(const Vector& vector)
- {
- SetBytes(vector.bytes, vector.length, vector.byte_order);
- return *this;
- }
-
- void
- Clear ()
- {
- length = 0;
- }
-
- bool
- SetBytes(const void *bytes, size_t length, lldb::ByteOrder byte_order)
- {
- this->length = length;
- this->byte_order = byte_order;
- if (length)
- ::memcpy(this->bytes, bytes, length < kMaxByteSize ? length : kMaxByteSize);
- return IsValid();
- }
-
- bool
- IsValid() const
- {
- return (length > 0 && length < kMaxByteSize && byte_order != lldb::eByteOrderInvalid);
- }
- // Casts a vector, if valid, to an unsigned int of matching or largest supported size.
- // Truncates to the beginning of the vector if required.
- // Returns a default constructed Scalar if the Vector data is internally inconsistent.
- llvm::APInt rhs = llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128, ((type128 *)bytes)->x);
- Scalar
- GetAsScalar() const
- {
- Scalar scalar;
- if (IsValid())
- {
- if (length == 1) scalar = *(const uint8_t *)bytes;
- else if (length == 2) scalar = *(const uint16_t *)bytes;
- else if (length == 4) scalar = *(const uint32_t *)bytes;
- else if (length == 8) scalar = *(const uint64_t *)bytes;
- else if (length >= 16) scalar = rhs;
- }
- return scalar;
- }
- };
-
- Value();
- Value(const Scalar& scalar);
- Value(const Vector& vector);
- Value(const void *bytes, int len);
- Value(const Value &rhs);
-
- void
- SetBytes (const void *bytes, int len);
-
- void
- AppendBytes (const void *bytes, int len);
-
- Value &
- operator=(const Value &rhs);
-
- const CompilerType &
- GetCompilerType();
-
- void
- SetCompilerType (const CompilerType &compiler_type);
-
- ValueType
- GetValueType() const;
-
- AddressType
- GetValueAddressType () const;
-
- ContextType
- GetContextType() const
- {
- return m_context_type;
+ // Values Less than zero are an error, greater than or equal to zero
+ // returns what the Scalar result is.
+ enum ValueType {
+ // m_value contains...
+ // ============================
+ eValueTypeScalar, // raw scalar value
+ eValueTypeVector, // byte array of m_vector.length with endianness of
+ // m_vector.byte_order
+ eValueTypeFileAddress, // file address value
+ eValueTypeLoadAddress, // load address value
+ eValueTypeHostAddress // host address value (for memory in the process that
+ // is using liblldb)
+ };
+
+ enum ContextType // Type that describes Value::m_context
+ {
+ // m_context contains...
+ // ====================
+ eContextTypeInvalid, // undefined
+ eContextTypeRegisterInfo, // RegisterInfo * (can be a scalar or a vector
+ // register)
+ eContextTypeLLDBType, // lldb_private::Type *
+ eContextTypeVariable // lldb_private::Variable *
+ };
+
+ const static size_t kMaxByteSize = 32u;
+
+ struct Vector {
+ // The byte array must be big enough to hold vector registers for any
+ // supported target.
+ uint8_t bytes[kMaxByteSize];
+ size_t length;
+ lldb::ByteOrder byte_order;
+
+ Vector() : length(0), byte_order(lldb::eByteOrderInvalid) {}
+
+ Vector(const Vector &vector) { *this = vector; }
+ const Vector &operator=(const Vector &vector) {
+ SetBytes(vector.bytes, vector.length, vector.byte_order);
+ return *this;
}
- void
- SetValueType (ValueType value_type)
- {
- m_value_type = value_type;
- }
+ void Clear() { length = 0; }
- void
- ClearContext ()
- {
- m_context = nullptr;
- m_context_type = eContextTypeInvalid;
+ bool SetBytes(const void *bytes, size_t length,
+ lldb::ByteOrder byte_order) {
+ this->length = length;
+ this->byte_order = byte_order;
+ if (length)
+ ::memcpy(this->bytes, bytes,
+ length < kMaxByteSize ? length : kMaxByteSize);
+ return IsValid();
}
- void
- SetContext (ContextType context_type, void *p)
- {
- m_context_type = context_type;
- m_context = p;
- if (m_context_type == eContextTypeRegisterInfo) {
- RegisterInfo *reg_info = GetRegisterInfo();
- if (reg_info->encoding == lldb::eEncodingVector &&
- m_vector.byte_order != lldb::eByteOrderInvalid)
- SetValueType(eValueTypeScalar);
- }
+ bool IsValid() const {
+ return (length > 0 && length < kMaxByteSize &&
+ byte_order != lldb::eByteOrderInvalid);
+ }
+ // Casts a vector, if valid, to an unsigned int of matching or largest
+ // supported size.
+ // Truncates to the beginning of the vector if required.
+ // Returns a default constructed Scalar if the Vector data is internally
+ // inconsistent.
+ llvm::APInt rhs = llvm::APInt(BITWIDTH_INT128, NUM_OF_WORDS_INT128,
+ ((type128 *)bytes)->x);
+ Scalar GetAsScalar() const {
+ Scalar scalar;
+ if (IsValid()) {
+ if (length == 1)
+ scalar = *(const uint8_t *)bytes;
+ else if (length == 2)
+ scalar = *(const uint16_t *)bytes;
+ else if (length == 4)
+ scalar = *(const uint32_t *)bytes;
+ else if (length == 8)
+ scalar = *(const uint64_t *)bytes;
+ else if (length >= 16)
+ scalar = rhs;
+ }
+ return scalar;
}
+ };
- RegisterInfo *
- GetRegisterInfo() const;
+ Value();
+ Value(const Scalar &scalar);
+ Value(const Vector &vector);
+ Value(const void *bytes, int len);
+ Value(const Value &rhs);
- Type *
- GetType();
+ void SetBytes(const void *bytes, int len);
- Scalar &
- ResolveValue (ExecutionContext *exe_ctx);
+ void AppendBytes(const void *bytes, int len);
- const Scalar &
- GetScalar() const
- {
- return m_value;
- }
-
- const Vector &
- GetVector() const
- {
- return m_vector;
- }
-
- Scalar &
- GetScalar()
- {
- return m_value;
- }
-
- Vector &
- GetVector()
- {
- return m_vector;
- }
+ Value &operator=(const Value &rhs);
- bool
- SetVectorBytes(const Vector& vector)
- {
- m_vector = vector;
- return m_vector.IsValid();
- }
-
- bool
- SetVectorBytes(uint8_t *bytes, size_t length, lldb::ByteOrder byte_order)
- {
- return m_vector.SetBytes(bytes, length, byte_order);
- }
+ const CompilerType &GetCompilerType();
- bool
- SetScalarFromVector()
- {
- if (m_vector.IsValid())
- {
- m_value = m_vector.GetAsScalar();
- return true;
- }
- return false;
- }
+ void SetCompilerType(const CompilerType &compiler_type);
+
+ ValueType GetValueType() const;
+
+ AddressType GetValueAddressType() const;
+
+ ContextType GetContextType() const { return m_context_type; }
+
+ void SetValueType(ValueType value_type) { m_value_type = value_type; }
- size_t
- ResizeData(size_t len);
-
- size_t
- AppendDataToHostBuffer (const Value &rhs);
+ void ClearContext() {
+ m_context = nullptr;
+ m_context_type = eContextTypeInvalid;
+ }
- DataBufferHeap &
- GetBuffer ()
- {
- return m_data_buffer;
+ void SetContext(ContextType context_type, void *p) {
+ m_context_type = context_type;
+ m_context = p;
+ if (m_context_type == eContextTypeRegisterInfo) {
+ RegisterInfo *reg_info = GetRegisterInfo();
+ if (reg_info->encoding == lldb::eEncodingVector &&
+ m_vector.byte_order != lldb::eByteOrderInvalid)
+ SetValueType(eValueTypeScalar);
}
+ }
- const DataBufferHeap &
- GetBuffer () const
- {
- return m_data_buffer;
+ RegisterInfo *GetRegisterInfo() const;
+
+ Type *GetType();
+
+ Scalar &ResolveValue(ExecutionContext *exe_ctx);
+
+ const Scalar &GetScalar() const { return m_value; }
+
+ const Vector &GetVector() const { return m_vector; }
+
+ Scalar &GetScalar() { return m_value; }
+
+ Vector &GetVector() { return m_vector; }
+
+ bool SetVectorBytes(const Vector &vector) {
+ m_vector = vector;
+ return m_vector.IsValid();
+ }
+
+ bool SetVectorBytes(uint8_t *bytes, size_t length,
+ lldb::ByteOrder byte_order) {
+ return m_vector.SetBytes(bytes, length, byte_order);
+ }
+
+ bool SetScalarFromVector() {
+ if (m_vector.IsValid()) {
+ m_value = m_vector.GetAsScalar();
+ return true;
}
+ return false;
+ }
+
+ size_t ResizeData(size_t len);
+
+ size_t AppendDataToHostBuffer(const Value &rhs);
- bool
- ValueOf(ExecutionContext *exe_ctx);
+ DataBufferHeap &GetBuffer() { return m_data_buffer; }
- Variable *
- GetVariable();
+ const DataBufferHeap &GetBuffer() const { return m_data_buffer; }
- void
- Dump (Stream* strm);
+ bool ValueOf(ExecutionContext *exe_ctx);
- lldb::Format
- GetValueDefaultFormat ();
+ Variable *GetVariable();
- uint64_t
- GetValueByteSize (Error *error_ptr, ExecutionContext *exe_ctx);
+ void Dump(Stream *strm);
- Error
- GetValueAsData(ExecutionContext *exe_ctx,
- DataExtractor &data,
- uint32_t data_offset,
- Module *module); // Can be nullptr
+ lldb::Format GetValueDefaultFormat();
- static const char *
- GetValueTypeAsCString (ValueType context_type);
+ uint64_t GetValueByteSize(Error *error_ptr, ExecutionContext *exe_ctx);
- static const char *
- GetContextTypeAsCString (ContextType context_type);
+ Error GetValueAsData(ExecutionContext *exe_ctx, DataExtractor &data,
+ uint32_t data_offset,
+ Module *module); // Can be nullptr
- bool
- GetData (DataExtractor &data);
+ static const char *GetValueTypeAsCString(ValueType context_type);
- void
- Clear();
+ static const char *GetContextTypeAsCString(ContextType context_type);
+
+ bool GetData(DataExtractor &data);
+
+ void Clear();
protected:
- Scalar m_value;
- Vector m_vector;
- CompilerType m_compiler_type;
- void * m_context;
- ValueType m_value_type;
- ContextType m_context_type;
- DataBufferHeap m_data_buffer;
+ Scalar m_value;
+ Vector m_vector;
+ CompilerType m_compiler_type;
+ void *m_context;
+ ValueType m_value_type;
+ ContextType m_context_type;
+ DataBufferHeap m_data_buffer;
};
-class ValueList
-{
+class ValueList {
public:
- ValueList () :
- m_values()
- {
- }
+ ValueList() : m_values() {}
- ValueList (const ValueList &rhs);
+ ValueList(const ValueList &rhs);
- ~ValueList() = default;
+ ~ValueList() = default;
- const ValueList & operator= (const ValueList &rhs);
+ const ValueList &operator=(const ValueList &rhs);
- // void InsertValue (Value *value, size_t idx);
- void PushValue (const Value &value);
+ // void InsertValue (Value *value, size_t idx);
+ void PushValue(const Value &value);
- size_t GetSize ();
- Value *GetValueAtIndex(size_t idx);
- void Clear();
+ size_t GetSize();
+ Value *GetValueAtIndex(size_t idx);
+ void Clear();
private:
- typedef std::vector<Value> collection;
+ typedef std::vector<Value> collection;
- collection m_values;
+ collection m_values;
};
} // namespace lldb_private