diff --git a/lldb/include/lldb/Core/ValueObjectCast.h b/lldb/include/lldb/Core/ValueObjectCast.h index 1538d7a556399..caae033b354ec 100644 --- a/lldb/include/lldb/Core/ValueObjectCast.h +++ b/lldb/include/lldb/Core/ValueObjectCast.h @@ -71,11 +71,11 @@ class ValueObjectCast : public ValueObject ClangASTType m_cast_type; -private: ValueObjectCast (ValueObject &parent, const ConstString &name, const ClangASTType &cast_type); +private: //------------------------------------------------------------------ // For ValueObject only //------------------------------------------------------------------ diff --git a/lldb/include/lldb/Core/ValueObjectConstResult.h b/lldb/include/lldb/Core/ValueObjectConstResult.h index 4e05d50132ec8..5e953f4a59fdc 100644 --- a/lldb/include/lldb/Core/ValueObjectConstResult.h +++ b/lldb/include/lldb/Core/ValueObjectConstResult.h @@ -131,6 +131,9 @@ class ValueObjectConstResult : public ValueObject virtual lldb::LanguageType GetPreferredDisplayLanguage (); + virtual lldb::ValueObjectSP + Cast (const ClangASTType &clang_ast_type); + protected: virtual bool UpdateValue (); diff --git a/lldb/include/lldb/Core/ValueObjectConstResultCast.h b/lldb/include/lldb/Core/ValueObjectConstResultCast.h new file mode 100644 index 0000000000000..98e9991b850ad --- /dev/null +++ b/lldb/include/lldb/Core/ValueObjectConstResultCast.h @@ -0,0 +1,77 @@ +//===-- ValueObjectConstResultCast.h ----------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_ValueObjectConstResultCast_h_ +#define liblldb_ValueObjectConstResultCast_h_ + +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/Core/ValueObjectCast.h" +#include "lldb/Core/ValueObjectConstResultImpl.h" + +namespace lldb_private { + +class ValueObjectConstResultCast : public ValueObjectCast +{ +public: + ValueObjectConstResultCast ( + ValueObject &parent, + const ConstString &name, + const ClangASTType &cast_type, + lldb::addr_t live_address = LLDB_INVALID_ADDRESS); + + virtual + ~ValueObjectConstResultCast (); + + virtual lldb::ValueObjectSP + Dereference (Error &error); + + virtual ValueObject * + CreateChildAtIndex (size_t idx, + bool synthetic_array_member, + int32_t synthetic_index); + + virtual ClangASTType + GetClangType () + { + return ValueObjectCast::GetClangType(); + } + + virtual lldb::ValueObjectSP + GetSyntheticChildAtOffset(uint32_t offset, + const ClangASTType& type, + bool can_create); + + virtual lldb::ValueObjectSP + AddressOf (Error &error); + + virtual size_t + GetPointeeData (DataExtractor& data, + uint32_t item_idx = 0, + uint32_t item_count = 1); + + virtual lldb::ValueObjectSP + Cast (const ClangASTType &clang_ast_type); + +protected: + ValueObjectConstResultImpl m_impl; + +private: + friend class ValueObject; + friend class ValueObjectConstResult; + friend class ValueObjectConstResultImpl; + + DISALLOW_COPY_AND_ASSIGN (ValueObjectConstResultCast); +}; + +} // namespace lldb_private + +#endif // liblldb_ValueObjectConstResultCast_h_ diff --git a/lldb/include/lldb/Core/ValueObjectConstResultChild.h b/lldb/include/lldb/Core/ValueObjectConstResultChild.h index 9063276b0198e..e8158d9bf757e 100644 --- a/lldb/include/lldb/Core/ValueObjectConstResultChild.h +++ b/lldb/include/lldb/Core/ValueObjectConstResultChild.h @@ -34,7 +34,8 @@ class ValueObjectConstResultChild : public ValueObjectChild uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, bool is_base_class, - bool is_deref_of_parent); + bool is_deref_of_parent, + lldb::addr_t live_address = LLDB_INVALID_ADDRESS); virtual ~ValueObjectConstResultChild(); @@ -60,6 +61,9 @@ class ValueObjectConstResultChild : public ValueObjectChild GetPointeeData (DataExtractor& data, uint32_t item_idx = 0, uint32_t item_count = 1); + + virtual lldb::ValueObjectSP + Cast (const ClangASTType &clang_ast_type); protected: ValueObjectConstResultImpl m_impl; diff --git a/lldb/include/lldb/Core/ValueObjectConstResultImpl.h b/lldb/include/lldb/Core/ValueObjectConstResultImpl.h index e3574e8a4d4e5..cc5a4fc9b2d60 100644 --- a/lldb/include/lldb/Core/ValueObjectConstResultImpl.h +++ b/lldb/include/lldb/Core/ValueObjectConstResultImpl.h @@ -52,6 +52,9 @@ class ValueObjectConstResultImpl { return m_live_address; } + + lldb::ValueObjectSP + Cast (const ClangASTType &clang_ast_type); void SetLiveAddress(lldb::addr_t addr = LLDB_INVALID_ADDRESS, diff --git a/lldb/source/Core/CMakeLists.txt b/lldb/source/Core/CMakeLists.txt index d96de9d949243..ffff22a3305d9 100644 --- a/lldb/source/Core/CMakeLists.txt +++ b/lldb/source/Core/CMakeLists.txt @@ -65,6 +65,7 @@ add_lldb_library(lldbCore ValueObjectCast.cpp ValueObjectChild.cpp ValueObjectConstResult.cpp + ValueObjectConstResultCast.cpp ValueObjectConstResultChild.cpp ValueObjectConstResultImpl.cpp ValueObjectDynamicValue.cpp diff --git a/lldb/source/Core/ValueObjectConstResult.cpp b/lldb/source/Core/ValueObjectConstResult.cpp index b4e6303064691..7aec555617d42 100644 --- a/lldb/source/Core/ValueObjectConstResult.cpp +++ b/lldb/source/Core/ValueObjectConstResult.cpp @@ -365,6 +365,12 @@ ValueObjectConstResult::GetDynamicValue (lldb::DynamicValueType use_dynamic) return ValueObjectSP(); } +lldb::ValueObjectSP +ValueObjectConstResult::Cast (const ClangASTType &clang_ast_type) +{ + return m_impl.Cast(clang_ast_type); +} + lldb::LanguageType ValueObjectConstResult::GetPreferredDisplayLanguage () { diff --git a/lldb/source/Core/ValueObjectConstResultCast.cpp b/lldb/source/Core/ValueObjectConstResultCast.cpp new file mode 100644 index 0000000000000..32123f94f36ff --- /dev/null +++ b/lldb/source/Core/ValueObjectConstResultCast.cpp @@ -0,0 +1,75 @@ +//===-- ValueObjectConstResultCast.cpp --------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Core/ValueObjectConstResultCast.h" + +#include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/Core/ValueObjectList.h" + +#include "lldb/Symbol/ClangASTContext.h" + +using namespace lldb_private; + +ValueObjectConstResultCast::ValueObjectConstResultCast( + ValueObject &parent, + const ConstString &name, + const ClangASTType &cast_type, + lldb::addr_t live_address) : + ValueObjectCast (parent, name, cast_type), + m_impl(this, live_address) +{ + m_name = name; +} + +ValueObjectConstResultCast::~ValueObjectConstResultCast() +{ +} + +lldb::ValueObjectSP +ValueObjectConstResultCast::Dereference (Error &error) +{ + return m_impl.Dereference(error); +} + +lldb::ValueObjectSP +ValueObjectConstResultCast::GetSyntheticChildAtOffset(uint32_t offset, + const ClangASTType& type, + bool can_create) +{ + return m_impl.GetSyntheticChildAtOffset(offset, type, can_create); +} + +lldb::ValueObjectSP +ValueObjectConstResultCast::AddressOf (Error &error) +{ + return m_impl.AddressOf(error); +} + +ValueObject * +ValueObjectConstResultCast::CreateChildAtIndex (size_t idx, + bool synthetic_array_member, + int32_t synthetic_index) +{ + return m_impl.CreateChildAtIndex( + idx, synthetic_array_member, synthetic_index); +} + +size_t +ValueObjectConstResultCast::GetPointeeData (DataExtractor& data, + uint32_t item_idx, + uint32_t item_count) +{ + return m_impl.GetPointeeData(data, item_idx, item_count); +} + +lldb::ValueObjectSP +ValueObjectConstResultCast::Cast (const ClangASTType &clang_ast_type) +{ + return m_impl.Cast(clang_ast_type); +} diff --git a/lldb/source/Core/ValueObjectConstResultChild.cpp b/lldb/source/Core/ValueObjectConstResultChild.cpp index 64425ea50969f..8bf49e8a5a6b7 100644 --- a/lldb/source/Core/ValueObjectConstResultChild.cpp +++ b/lldb/source/Core/ValueObjectConstResultChild.cpp @@ -26,7 +26,8 @@ ValueObjectConstResultChild::ValueObjectConstResultChild uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, bool is_base_class, - bool is_deref_of_parent + bool is_deref_of_parent, + lldb::addr_t live_address ) : ValueObjectChild (parent, clang_type, @@ -38,7 +39,7 @@ ValueObjectConstResultChild::ValueObjectConstResultChild is_base_class, is_deref_of_parent, eAddressTypeLoad), - m_impl(this) + m_impl(this, live_address) { m_name = name; } @@ -78,3 +79,9 @@ ValueObjectConstResultChild::GetPointeeData (DataExtractor& data, { return m_impl.GetPointeeData(data, item_idx, item_count); } + +lldb::ValueObjectSP +ValueObjectConstResultChild::Cast (const ClangASTType &clang_ast_type) +{ + return m_impl.Cast(clang_ast_type); +} diff --git a/lldb/source/Core/ValueObjectConstResultImpl.cpp b/lldb/source/Core/ValueObjectConstResultImpl.cpp index 733d767b7ee19..fce844dc20fa7 100644 --- a/lldb/source/Core/ValueObjectConstResultImpl.cpp +++ b/lldb/source/Core/ValueObjectConstResultImpl.cpp @@ -11,6 +11,7 @@ #include "lldb/Core/ValueObjectChild.h" #include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/Core/ValueObjectConstResultCast.h" #include "lldb/Core/ValueObjectConstResultChild.h" #include "lldb/Core/ValueObjectMemory.h" #include "lldb/Core/DataExtractor.h" @@ -96,7 +97,7 @@ ValueObjectConstResultImpl::CreateChildAtIndex (size_t idx, bool synthetic_array ConstString child_name; if (!child_name_str.empty()) child_name.SetCString (child_name_str.c_str()); - + valobj = new ValueObjectConstResultChild (*m_impl_backend, child_clang_type, child_name, @@ -155,6 +156,17 @@ ValueObjectConstResultImpl::AddressOf (Error &error) return m_impl_backend->ValueObject::AddressOf(error); } +lldb::ValueObjectSP +ValueObjectConstResultImpl::Cast (const ClangASTType &clang_ast_type) +{ + if (m_impl_backend == NULL) + return lldb::ValueObjectSP(); + + ValueObjectConstResultCast *result_cast = new ValueObjectConstResultCast( + *m_impl_backend, m_impl_backend->GetName(), clang_ast_type, m_live_address); + return result_cast->GetSP(); +} + lldb::addr_t ValueObjectConstResultImpl::GetAddressOf (bool scalar_is_load_address, AddressType *address_type) diff --git a/lldb/test/python_api/value/TestValueAPI.py b/lldb/test/python_api/value/TestValueAPI.py index 60239762a7f46..0839c37055c5d 100644 --- a/lldb/test/python_api/value/TestValueAPI.py +++ b/lldb/test/python_api/value/TestValueAPI.py @@ -137,6 +137,12 @@ def value_api(self, exe_name): self.DebugSBValue(val2) self.assertTrue(child.GetValue() == val2.GetValue() and child.GetSummary() == val2.GetSummary()) + + val_i = target.EvaluateExpression('i') + val_s = target.EvaluateExpression('s') + val_a = target.EvaluateExpression('a') + self.assertTrue(val_s.GetChildMemberWithName('a').AddressOf(), VALID_VARIABLE) + self.assertTrue(val_a.Cast(val_i.GetType()).AddressOf(), VALID_VARIABLE) if __name__ == '__main__': import atexit diff --git a/lldb/test/python_api/value/main.c b/lldb/test/python_api/value/main.c index afe4f0ed8bb93..a00795750de03 100644 --- a/lldb/test/python_api/value/main.c +++ b/lldb/test/python_api/value/main.c @@ -28,9 +28,19 @@ const char *weekdays[5] = { "Monday", const char **g_table[2] = { days_of_week, weekdays }; +typedef int MyInt; + +struct MyStruct +{ + int a; + int b; +}; + int main (int argc, char const *argv[]) { int i; + MyInt a = 12345; + struct MyStruct s = { 11, 22 }; int *my_int_ptr = &g_my_int; printf("my_int_ptr points to location %p\n", my_int_ptr); const char **str_ptr = days_of_week;