Fixed the global and static variables to always be in scope.
Made it so that you can create synthetic children of array
value objects. This is for creating array members when the
array index is out of range. This comes in handy when you have
a structure definition like:
struct Collection
{
uint32_t count;
Item array[0];
};
"array" has 1 item, but many times in practice there are more
items in "item_array".
This allows you to do:
(lldb) target variable g_collection.array[3]
To implement this, the get child at index has been modified
to have a "ignore_array_bounds" boolean that can be set to true.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@134846 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Symbol/ClangASTContext.cpp b/source/Symbol/ClangASTContext.cpp
index 88a3d86..6e3a83e 100644
--- a/source/Symbol/ClangASTContext.cpp
+++ b/source/Symbol/ClangASTContext.cpp
@@ -2460,6 +2460,7 @@
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 @@
idx,
transparent_pointers,
omit_empty_base_classes,
+ ignore_array_bounds,
child_name,
child_byte_size,
child_byte_offset,
@@ -2498,6 +2500,7 @@
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 @@
idx,
transparent_pointers,
omit_empty_base_classes,
+ ignore_array_bounds,
child_name,
child_byte_size,
child_byte_offset,
@@ -2771,7 +2775,7 @@
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 @@
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 @@
idx,
transparent_pointers,
omit_empty_base_classes,
+ ignore_array_bounds,
child_name,
child_byte_size,
child_byte_offset,
@@ -2858,6 +2863,7 @@
idx,
transparent_pointers,
omit_empty_base_classes,
+ ignore_array_bounds,
child_name,
child_byte_size,
child_byte_offset,
@@ -2895,6 +2901,7 @@
idx,
transparent_pointers,
omit_empty_base_classes,
+ ignore_array_bounds,
child_name,
child_byte_size,
child_byte_offset,
diff --git a/source/Symbol/Variable.cpp b/source/Symbol/Variable.cpp
index 895fb5c..a8ebe85 100644
--- a/source/Symbol/Variable.cpp
+++ b/source/Symbol/Variable.cpp
@@ -199,10 +199,10 @@
return frame != NULL;
case eValueTypeConstResult:
- return true;
-
case eValueTypeVariableGlobal:
case eValueTypeVariableStatic:
+ return true;
+
case eValueTypeVariableArgument:
case eValueTypeVariableLocal:
if (frame)