summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Core/ValueObject.h6
-rw-r--r--lldb/include/lldb/Symbol/ClangASTContext.h2
-rw-r--r--lldb/source/API/SBType.cpp2
-rw-r--r--lldb/source/Commands/CommandObjectTarget.cpp2
-rw-r--r--lldb/source/Core/ValueObject.cpp77
-rw-r--r--lldb/source/Symbol/ClangASTContext.cpp11
-rw-r--r--lldb/source/Symbol/Variable.cpp4
7 files changed, 89 insertions, 15 deletions
diff --git a/lldb/include/lldb/Core/ValueObject.h b/lldb/include/lldb/Core/ValueObject.h
index a2a674c8db7..e87948c4711 100644
--- a/lldb/include/lldb/Core/ValueObject.h
+++ b/lldb/include/lldb/Core/ValueObject.h
@@ -349,6 +349,9 @@ public:
IsPointerType ();
virtual bool
+ IsArrayType ();
+
+ virtual bool
IsScalarType ();
virtual bool
@@ -524,6 +527,9 @@ public:
GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create);
lldb::ValueObjectSP
+ GetSyntheticArrayMemberFromArray (int32_t index, bool can_create);
+
+ lldb::ValueObjectSP
GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create);
lldb::ValueObjectSP
diff --git a/lldb/include/lldb/Symbol/ClangASTContext.h b/lldb/include/lldb/Symbol/ClangASTContext.h
index c9d00433672..7159793133d 100644
--- a/lldb/include/lldb/Symbol/ClangASTContext.h
+++ b/lldb/include/lldb/Symbol/ClangASTContext.h
@@ -415,6 +415,7 @@ public:
uint32_t idx,
bool transparent_pointers,
bool omit_empty_base_classes,
+ bool ignore_array_bounds,
std::string& child_name,
uint32_t &child_byte_size,
int32_t &child_byte_offset,
@@ -431,6 +432,7 @@ public:
uint32_t idx,
bool transparent_pointers,
bool omit_empty_base_classes,
+ bool ignore_array_bounds,
std::string& child_name,
uint32_t &child_byte_size,
int32_t &child_byte_offset,
diff --git a/lldb/source/API/SBType.cpp b/lldb/source/API/SBType.cpp
index c49f61b7f37..647a20c4327 100644
--- a/lldb/source/API/SBType.cpp
+++ b/lldb/source/API/SBType.cpp
@@ -107,6 +107,7 @@ bool
SBType::GetChildAtIndex (bool omit_empty_base_classes, uint32_t idx, SBTypeMember &member)
{
void *child_clang_type = NULL;
+ bool ignore_array_bounds = false;
std::string child_name;
uint32_t child_byte_size = 0;
int32_t child_byte_offset = 0;
@@ -125,6 +126,7 @@ SBType::GetChildAtIndex (bool omit_empty_base_classes, uint32_t idx, SBTypeMembe
idx,
false, // transparent pointers
omit_empty_base_classes,
+ ignore_array_bounds,
child_name,
child_byte_size,
child_byte_offset,
diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp
index 9b2147ec3ba..510fe488a46 100644
--- a/lldb/source/Commands/CommandObjectTarget.cpp
+++ b/lldb/source/Commands/CommandObjectTarget.cpp
@@ -545,7 +545,7 @@ public:
else
{
Error error (Variable::GetValuesForVariableExpressionPath (arg,
- exe_ctx.target,
+ exe_ctx.GetBestExecutionContextScope(),
GetVariableCallback,
exe_ctx.target,
variable_list,
diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp
index aae31dc414f..09cbd8c60f9 100644
--- a/lldb/source/Core/ValueObject.cpp
+++ b/lldb/source/Core/ValueObject.cpp
@@ -430,7 +430,7 @@ ValueObject::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int3
ValueObject *valobj = NULL;
bool omit_empty_base_classes = true;
-
+ bool ignore_array_bounds = synthetic_array_member;
std::string child_name_str;
uint32_t child_byte_size = 0;
int32_t child_byte_offset = 0;
@@ -454,6 +454,7 @@ ValueObject::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int3
idx,
transparent_pointers,
omit_empty_base_classes,
+ ignore_array_bounds,
child_name_str,
child_byte_size,
child_byte_offset,
@@ -499,7 +500,9 @@ ValueObject::GetSummaryAsCString ()
StreamString s;
ExecutionContext exe_ctx;
this->GetExecutionContextScope()->CalculateExecutionContext(exe_ctx);
- SymbolContext sc = exe_ctx.frame->GetSymbolContext(eSymbolContextEverything);
+ SymbolContext sc;
+ if (exe_ctx.frame)
+ sc = exe_ctx.frame->GetSymbolContext(eSymbolContextEverything);
if (m_last_summary_format->m_show_members_oneliner)
{
@@ -1110,6 +1113,12 @@ ValueObject::IsPointerType ()
}
bool
+ValueObject::IsArrayType ()
+{
+ return ClangASTContext::IsArrayType (GetClangType());
+}
+
+bool
ValueObject::IsScalarType ()
{
return ClangASTContext::IsScalarType (GetClangType());
@@ -1171,6 +1180,49 @@ ValueObject::GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create)
return synthetic_child_sp;
}
+// This allows you to create an array member using and index
+// that doesn't not fall in the normal bounds of the array.
+// Many times structure can be defined as:
+// struct Collection
+// {
+// uint32_t item_count;
+// Item item_array[0];
+// };
+// The size of the "item_array" is 1, but many times in practice
+// there are more items in "item_array".
+
+ValueObjectSP
+ValueObject::GetSyntheticArrayMemberFromArray (int32_t index, bool can_create)
+{
+ ValueObjectSP synthetic_child_sp;
+ if (IsArrayType ())
+ {
+ char index_str[64];
+ snprintf(index_str, sizeof(index_str), "[%i]", index);
+ ConstString index_const_str(index_str);
+ // Check if we have already created a synthetic array member in this
+ // valid object. If we have we will re-use it.
+ synthetic_child_sp = GetSyntheticChild (index_const_str);
+ if (!synthetic_child_sp)
+ {
+ ValueObject *synthetic_child;
+ // We haven't made a synthetic array member for INDEX yet, so
+ // lets make one and cache it for any future reference.
+ synthetic_child = CreateChildAtIndex(0, true, index);
+
+ // Cache the value if we got one back...
+ if (synthetic_child)
+ {
+ AddSyntheticChild(index_const_str, synthetic_child);
+ synthetic_child_sp = synthetic_child->GetSP();
+ synthetic_child_sp->SetName(index_str);
+ synthetic_child_sp->m_is_array_item_for_pointer = true;
+ }
+ }
+ }
+ return synthetic_child_sp;
+}
+
ValueObjectSP
ValueObject::GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create)
{
@@ -1628,20 +1680,23 @@ ValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr,
// from here on we do have a valid index
if (ClangASTContext::IsArrayType(root_clang_type))
{
- root = root->GetChildAtIndex(index, true);
- if (!root.get())
+ ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true);
+ if (!child_valobj_sp)
+ child_valobj_sp = root->GetSyntheticArrayMemberFromArray(index, true);
+ if (child_valobj_sp)
+ {
+ root = child_valobj_sp;
+ *first_unparsed = end+1; // skip ]
+ *final_result = ValueObject::ePlain;
+ continue;
+ }
+ else
{
*first_unparsed = expression_cstr;
*reason_to_stop = ValueObject::eNoSuchChild;
*final_result = ValueObject::eInvalid;
return ValueObjectSP();
}
- else
- {
- *first_unparsed = end+1; // skip ]
- *final_result = ValueObject::ePlain;
- continue;
- }
}
else if (ClangASTContext::IsPointerType(root_clang_type))
{
@@ -2057,6 +2112,7 @@ ValueObject::Dereference (Error &error)
if (is_pointer_type)
{
bool omit_empty_base_classes = true;
+ bool ignore_array_bounds = false;
std::string child_name_str;
uint32_t child_byte_size = 0;
@@ -2080,6 +2136,7 @@ ValueObject::Dereference (Error &error)
0,
transparent_pointers,
omit_empty_base_classes,
+ ignore_array_bounds,
child_name_str,
child_byte_size,
child_byte_offset,
diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp
index 88a3d86a770..6e3a83e162c 100644
--- a/lldb/source/Symbol/ClangASTContext.cpp
+++ b/lldb/source/Symbol/ClangASTContext.cpp
@@ -2460,6 +2460,7 @@ ClangASTContext::GetChildClangTypeAtIndex
uint32_t idx,
bool transparent_pointers,
bool omit_empty_base_classes,
+ bool ignore_array_bounds,
std::string& child_name,
uint32_t &child_byte_size,
int32_t &child_byte_offset,
@@ -2478,6 +2479,7 @@ ClangASTContext::GetChildClangTypeAtIndex
idx,
transparent_pointers,
omit_empty_base_classes,
+ ignore_array_bounds,
child_name,
child_byte_size,
child_byte_offset,
@@ -2498,6 +2500,7 @@ ClangASTContext::GetChildClangTypeAtIndex
uint32_t idx,
bool transparent_pointers,
bool omit_empty_base_classes,
+ bool ignore_array_bounds,
std::string& child_name,
uint32_t &child_byte_size,
int32_t &child_byte_offset,
@@ -2736,6 +2739,7 @@ ClangASTContext::GetChildClangTypeAtIndex
idx,
transparent_pointers,
omit_empty_base_classes,
+ ignore_array_bounds,
child_name,
child_byte_size,
child_byte_offset,
@@ -2771,7 +2775,7 @@ ClangASTContext::GetChildClangTypeAtIndex
const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
const uint64_t element_count = array->getSize().getLimitedValue();
- if (idx < element_count)
+ if (ignore_array_bounds || idx < element_count)
{
if (GetCompleteQualType (ast, array->getElementType()))
{
@@ -2783,7 +2787,7 @@ ClangASTContext::GetChildClangTypeAtIndex
child_name.assign(element_name);
assert(field_type_info.first % 8 == 0);
child_byte_size = field_type_info.first / 8;
- child_byte_offset = idx * child_byte_size;
+ child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
return array->getElementType().getAsOpaquePtr();
}
}
@@ -2810,6 +2814,7 @@ ClangASTContext::GetChildClangTypeAtIndex
idx,
transparent_pointers,
omit_empty_base_classes,
+ ignore_array_bounds,
child_name,
child_byte_size,
child_byte_offset,
@@ -2858,6 +2863,7 @@ ClangASTContext::GetChildClangTypeAtIndex
idx,
transparent_pointers,
omit_empty_base_classes,
+ ignore_array_bounds,
child_name,
child_byte_size,
child_byte_offset,
@@ -2895,6 +2901,7 @@ ClangASTContext::GetChildClangTypeAtIndex
idx,
transparent_pointers,
omit_empty_base_classes,
+ ignore_array_bounds,
child_name,
child_byte_size,
child_byte_offset,
diff --git a/lldb/source/Symbol/Variable.cpp b/lldb/source/Symbol/Variable.cpp
index 895fb5c6c8f..a8ebe85921d 100644
--- a/lldb/source/Symbol/Variable.cpp
+++ b/lldb/source/Symbol/Variable.cpp
@@ -199,10 +199,10 @@ Variable::IsInScope (StackFrame *frame)
return frame != NULL;
case eValueTypeConstResult:
- return true;
-
case eValueTypeVariableGlobal:
case eValueTypeVariableStatic:
+ return true;
+
case eValueTypeVariableArgument:
case eValueTypeVariableLocal:
if (frame)
OpenPOWER on IntegriCloud