forked from OSchip/llvm-project
Remove premature caching of the global variables list in CompileUnit.
This fixes a bug where (lldb) target var g_ptr would populate the global variables list with exactly one entry because SymbolFileDWARF::ParseVariables() was invoked with a list of DIEs pre-filtered by name, such that a subsequent call to (lldb) fr var --show-globals would only list that one variable, because CompileUnit::m_variables was already initialized, fooling CompileUnit::GetVariableList(). CompileUnit::GetVariableList() grabs the *complete* list of variables via (SymbolFileDWARF, ...)::ParseVariablesForContext and that still calls CompileUnit::SetVariableList(variables) which acts as the caching mechanism. Differential Revision: https://reviews.llvm.org/D46220 llvm-svn: 331230
This commit is contained in:
parent
32f2d0e564
commit
ce05952943
|
@ -39,6 +39,12 @@ class GlobalVariablesTestCase(TestBase):
|
|||
environment = self.registerSharedLibrariesWithTarget(
|
||||
target, self.shlib_names)
|
||||
|
||||
# Test that static initialized variables can be inspected without process.
|
||||
self.expect("target variable g_ptr", VARIABLES_DISPLAYED_CORRECTLY,
|
||||
substrs=['(int *)'])
|
||||
self.expect("target variable *g_ptr", VARIABLES_DISPLAYED_CORRECTLY,
|
||||
substrs=['42'])
|
||||
|
||||
# Now launch the process, and do not stop at entry point.
|
||||
process = target.LaunchSimple(
|
||||
None, environment, self.get_process_working_directory())
|
||||
|
@ -54,17 +60,21 @@ class GlobalVariablesTestCase(TestBase):
|
|||
substrs=[' resolved, hit count = 1'])
|
||||
|
||||
# Check that GLOBAL scopes are indicated for the variables.
|
||||
self.runCmd("frame variable --show-types --scope --show-globals --no-args")
|
||||
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',
|
||||
'STATIC: (const char *) g_func_static_cstr',
|
||||
'GLOBAL: (const char *) g_file_global_cstr',
|
||||
'"g_file_global_cstr"',
|
||||
'GLOBAL: (int) g_file_global_int = 42',
|
||||
'GLOBAL: (int) g_common_1 = 21',
|
||||
'GLOBAL: (int *) g_ptr',
|
||||
'STATIC: (const char *) g_file_static_cstr',
|
||||
'"g_file_static_cstr"',
|
||||
'GLOBAL: (int) g_common_1 = 21'])
|
||||
'"g_file_static_cstr"'
|
||||
])
|
||||
|
||||
# 'frame variable' should support address-of operator.
|
||||
self.runCmd("frame variable &g_file_global_int")
|
||||
|
@ -95,3 +105,8 @@ class GlobalVariablesTestCase(TestBase):
|
|||
VARIABLES_DISPLAYED_CORRECTLY,
|
||||
matching=False,
|
||||
substrs=["can't be resolved"])
|
||||
|
||||
# Test that the statically initialized variable can also be
|
||||
# inspected *with* a process.
|
||||
self.expect("target variable *g_ptr", VARIABLES_DISPLAYED_CORRECTLY,
|
||||
substrs=['42'])
|
||||
|
|
|
@ -13,6 +13,7 @@ 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";
|
||||
int *g_ptr = &g_file_global_int;
|
||||
|
||||
extern int g_a;
|
||||
int main (int argc, char const *argv[])
|
||||
|
@ -20,5 +21,5 @@ int main (int argc, char const *argv[])
|
|||
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
|
||||
return g_file_global_int + g_a + g_common_1 + *g_ptr; // Set break point at this line. //// break $source:$line; continue; var -global g_a -global g_global_int
|
||||
}
|
||||
|
|
|
@ -4194,7 +4194,6 @@ size_t SymbolFileDWARF::ParseVariables(const SymbolContext &sc,
|
|||
variable_list_sp = sc.comp_unit->GetVariableList(false);
|
||||
if (variable_list_sp.get() == NULL) {
|
||||
variable_list_sp.reset(new VariableList());
|
||||
sc.comp_unit->SetVariableList(variable_list_sp);
|
||||
}
|
||||
} else {
|
||||
GetObjectFile()->GetModule()->ReportError(
|
||||
|
|
Loading…
Reference in New Issue