diff options
| -rw-r--r-- | lldb/include/lldb/Core/ValueObject.h | 6 | ||||
| -rw-r--r-- | lldb/include/lldb/Symbol/ClangASTContext.h | 2 | ||||
| -rw-r--r-- | lldb/source/API/SBType.cpp | 2 | ||||
| -rw-r--r-- | lldb/source/Commands/CommandObjectTarget.cpp | 2 | ||||
| -rw-r--r-- | lldb/source/Core/ValueObject.cpp | 77 | ||||
| -rw-r--r-- | lldb/source/Symbol/ClangASTContext.cpp | 11 | ||||
| -rw-r--r-- | lldb/source/Symbol/Variable.cpp | 4 |
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) |

