Skip to content

Commit

Permalink
Add a class ValueObjectConstResultCast.
Browse files Browse the repository at this point in the history
Summary:
Other changes around the main change include:

1. Add a method Cast to ValueObjectConstResult, ValueObjectConstResultImpl
and ValueObjectConstResultChild.

2. Add an argument |live_address| of type lldb::addr_t to the constructor
of ValueObjectConstResultChild. This is passed on to the backing
ValueObjectConstResultImpl object constructor so that the address of the
child value can be calculated properly.

Reviewers: granata.enrico, clayborg

Subscribers: lldb-commits

Differential Revision: http://reviews.llvm.org/D11203

llvm-svn: 242374
  • Loading branch information
Siva Chandra committed Jul 16, 2015
1 parent 938bd6f commit f8877ef
Show file tree
Hide file tree
Showing 12 changed files with 209 additions and 5 deletions.
2 changes: 1 addition & 1 deletion lldb/include/lldb/Core/ValueObjectCast.h
Expand Up @@ -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
//------------------------------------------------------------------
Expand Down
3 changes: 3 additions & 0 deletions lldb/include/lldb/Core/ValueObjectConstResult.h
Expand Up @@ -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 ();
Expand Down
77 changes: 77 additions & 0 deletions 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_
6 changes: 5 additions & 1 deletion lldb/include/lldb/Core/ValueObjectConstResultChild.h
Expand Up @@ -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();

Expand All @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions lldb/include/lldb/Core/ValueObjectConstResultImpl.h
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions lldb/source/Core/CMakeLists.txt
Expand Up @@ -65,6 +65,7 @@ add_lldb_library(lldbCore
ValueObjectCast.cpp
ValueObjectChild.cpp
ValueObjectConstResult.cpp
ValueObjectConstResultCast.cpp
ValueObjectConstResultChild.cpp
ValueObjectConstResultImpl.cpp
ValueObjectDynamicValue.cpp
Expand Down
6 changes: 6 additions & 0 deletions lldb/source/Core/ValueObjectConstResult.cpp
Expand Up @@ -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 ()
{
Expand Down
75 changes: 75 additions & 0 deletions 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);
}
11 changes: 9 additions & 2 deletions lldb/source/Core/ValueObjectConstResultChild.cpp
Expand Up @@ -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,
Expand All @@ -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;
}
Expand Down Expand Up @@ -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);
}
14 changes: 13 additions & 1 deletion lldb/source/Core/ValueObjectConstResultImpl.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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)
Expand Down
6 changes: 6 additions & 0 deletions lldb/test/python_api/value/TestValueAPI.py
Expand Up @@ -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
Expand Down
10 changes: 10 additions & 0 deletions lldb/test/python_api/value/main.c
Expand Up @@ -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;
Expand Down

0 comments on commit f8877ef

Please sign in to comment.