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:
Adrian Prantl 2018-04-30 21:54:02 +00:00
parent 32f2d0e564
commit ce05952943
3 changed files with 20 additions and 5 deletions

View File

@ -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'])

View File

@ -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
}

View File

@ -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(