forked from OSchip/llvm-project
Inspect DW_AT_const_value global static const variables
This patch adds support for printing global static const variables which are given a DW_AT_const_value DWARF tag by clang. Fix for bug https://llvm.org/bugs/show_bug.cgi?id=25653 Reviewers: clayborg, tberghammer Subscribers: emaste, lldb-commits Differential Revision: http://reviews.llvm.org/D15576 llvm-svn: 255887
This commit is contained in:
parent
23f04fd469
commit
37395ad211
|
@ -52,6 +52,7 @@ class GlobalVariablesTestCase(TestBase):
|
|||
# Check that GLOBAL scopes are indicated for the variables.
|
||||
self.expect("frame variable --show-types --scope --show-globals --no-args", VARIABLES_DISPLAYED_CORRECTLY,
|
||||
substrs = ['GLOBAL: (int) g_file_global_int = 42',
|
||||
'STATIC: (const int) g_file_static_int = 2',
|
||||
'GLOBAL: (const char *) g_file_global_cstr',
|
||||
'"g_file_global_cstr"',
|
||||
'STATIC: (const char *) g_file_static_cstr',
|
||||
|
|
|
@ -10,13 +10,14 @@
|
|||
|
||||
int g_common_1; // Not initialized on purpose to cause it to be undefined external in .o file
|
||||
int g_file_global_int = 42;
|
||||
static const int g_file_static_int = 2;
|
||||
const char *g_file_global_cstr = "g_file_global_cstr";
|
||||
static const char *g_file_static_cstr = "g_file_static_cstr";
|
||||
|
||||
extern int g_a;
|
||||
int main (int argc, char const *argv[])
|
||||
{
|
||||
g_common_1 = g_file_global_int / 2;
|
||||
g_common_1 = g_file_global_int / g_file_static_int;
|
||||
static const char *g_func_static_cstr = "g_func_static_cstr";
|
||||
printf ("%s %s\n", g_file_global_cstr, g_file_static_cstr);
|
||||
return g_file_global_int + g_a + g_common_1; // Set break point at this line. //// break $source:$line; continue; var -global g_a -global g_global_int
|
||||
|
|
|
@ -1135,6 +1135,7 @@ ValueObject::GetData (DataExtractor& data, Error &error)
|
|||
if (m_data.GetByteSize())
|
||||
{
|
||||
data = m_data;
|
||||
error.Clear();
|
||||
return data.GetByteSize();
|
||||
}
|
||||
else
|
||||
|
|
|
@ -815,7 +815,7 @@ DWARFCompileUnit::IndexPrivate (DWARFCompileUnit* dwarf_cu,
|
|||
bool is_declaration = false;
|
||||
//bool is_artificial = false;
|
||||
bool has_address = false;
|
||||
bool has_location = false;
|
||||
bool has_location_or_const_value = false;
|
||||
bool is_global_or_static_variable = false;
|
||||
|
||||
DWARFFormValue specification_die_form;
|
||||
|
@ -860,7 +860,8 @@ DWARFCompileUnit::IndexPrivate (DWARFCompileUnit* dwarf_cu,
|
|||
break;
|
||||
|
||||
case DW_AT_location:
|
||||
has_location = true;
|
||||
case DW_AT_const_value:
|
||||
has_location_or_const_value = true;
|
||||
if (tag == DW_TAG_variable)
|
||||
{
|
||||
const DWARFDebugInfoEntry* parent_die = die.GetParent();
|
||||
|
@ -1035,7 +1036,7 @@ DWARFCompileUnit::IndexPrivate (DWARFCompileUnit* dwarf_cu,
|
|||
break;
|
||||
|
||||
case DW_TAG_variable:
|
||||
if (name && has_location && is_global_or_static_variable)
|
||||
if (name && has_location_or_const_value && is_global_or_static_variable)
|
||||
{
|
||||
globals.Insert (ConstString(name), DIERef(cu_offset, die.GetOffset()));
|
||||
// Be sure to include variables by their mangled and demangled
|
||||
|
|
|
@ -4260,7 +4260,10 @@ SymbolFileDWARF::ParseVariableDIE
|
|||
}
|
||||
else
|
||||
{
|
||||
scope = eValueTypeVariableLocal;
|
||||
if (location_is_const_value_data)
|
||||
scope = eValueTypeVariableStatic;
|
||||
else
|
||||
scope = eValueTypeVariableLocal;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue