[Lldb-commits] [lldb] r331230 - Remove premature caching of the global variables list in CompileUnit.

Adrian Prantl via lldb-commits lldb-commits at lists.llvm.org
Mon Apr 30 14:54:02 PDT 2018


Author: adrian
Date: Mon Apr 30 14:54:02 2018
New Revision: 331230

URL: http://llvm.org/viewvc/llvm-project?rev=331230&view=rev
Log:
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

Modified:
    lldb/trunk/packages/Python/lldbsuite/test/lang/c/global_variables/TestGlobalVariables.py
    lldb/trunk/packages/Python/lldbsuite/test/lang/c/global_variables/main.c
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp

Modified: lldb/trunk/packages/Python/lldbsuite/test/lang/c/global_variables/TestGlobalVariables.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/c/global_variables/TestGlobalVariables.py?rev=331230&r1=331229&r2=331230&view=diff
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/lang/c/global_variables/TestGlobalVariables.py (original)
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/c/global_variables/TestGlobalVariables.py Mon Apr 30 14:54:02 2018
@@ -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'])

Modified: lldb/trunk/packages/Python/lldbsuite/test/lang/c/global_variables/main.c
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/c/global_variables/main.c?rev=331230&r1=331229&r2=331230&view=diff
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/lang/c/global_variables/main.c (original)
+++ lldb/trunk/packages/Python/lldbsuite/test/lang/c/global_variables/main.c Mon Apr 30 14:54:02 2018
@@ -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
 }

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp?rev=331230&r1=331229&r2=331230&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Mon Apr 30 14:54:02 2018
@@ -4194,7 +4194,6 @@ size_t SymbolFileDWARF::ParseVariables(c
               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(




More information about the lldb-commits mailing list