[Lldb-commits] [PATCH] D112147: [lldb] Fix lookup for global constants in namespaces

Tonko SabolĨec via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Mon Nov 22 09:56:06 PST 2021


tonkosi updated this revision to Diff 388958.
tonkosi added a comment.

- Use scope context parent DIE instead of the direct parent
- Add tests for constants in anonymous namespace


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112147/new/

https://reviews.llvm.org/D112147

Files:
  lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
  lldb/test/API/lang/cpp/global_variables/TestCPPGlobalVariables.py
  lldb/test/API/lang/cpp/global_variables/main.cpp


Index: lldb/test/API/lang/cpp/global_variables/main.cpp
===================================================================
--- lldb/test/API/lang/cpp/global_variables/main.cpp
+++ lldb/test/API/lang/cpp/global_variables/main.cpp
@@ -1,10 +1,17 @@
 #include <stdio.h>
 
 namespace abc {
-	int g_file_global_int = 42;
+int g_file_global_int = 42;
+const int g_file_global_const_int = 1337;
+
+namespace {
+const int g_anon_namespace_const_int = 100;
+}
 }
 
 int main (int argc, char const *argv[])
 {
-    return abc::g_file_global_int; // Set break point at this line.
+  int unused = abc::g_file_global_const_int;
+  int unused2 = abc::g_anon_namespace_const_int;
+  return abc::g_file_global_int; // Set break point at this line.
 }
Index: lldb/test/API/lang/cpp/global_variables/TestCPPGlobalVariables.py
===================================================================
--- lldb/test/API/lang/cpp/global_variables/TestCPPGlobalVariables.py
+++ lldb/test/API/lang/cpp/global_variables/TestCPPGlobalVariables.py
@@ -15,12 +15,11 @@
         TestBase.setUp(self)
         self.source = lldb.SBFileSpec('main.cpp')
 
-    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764")
     def test(self):
         self.build()
 
         (target, _, _, _) = lldbutil.run_to_source_breakpoint(self, "// Set break point at this line.", self.source)
-        
+
         # Check that we can access g_file_global_int by its name
         self.expect("target variable g_file_global_int", VARIABLES_DISPLAYED_CORRECTLY,
                     substrs=['42'])
@@ -29,6 +28,30 @@
         self.expect("target variable xyz::g_file_global_int", VARIABLES_DISPLAYED_CORRECTLY,
                     error=True, substrs=['can\'t find global variable'])
 
+        # Check that we can access g_file_global_const_int by its name
+        self.expect("target variable g_file_global_const_int", VARIABLES_DISPLAYED_CORRECTLY,
+                    substrs=['1337'])
+        self.expect("target variable abc::g_file_global_const_int", VARIABLES_DISPLAYED_CORRECTLY,
+                    substrs=['1337'])
+        self.expect("target variable xyz::g_file_global_const_int", VARIABLES_DISPLAYED_CORRECTLY,
+                    error=True, substrs=['can\'t find global variable'])
+
+        # Try accessing a global variable in anonymous namespace.
+        self.expect("target variable g_anon_namespace_const_int", VARIABLES_DISPLAYED_CORRECTLY,
+                    substrs=['100'])
+        self.expect("target variable abc::g_anon_namespace_const_int", VARIABLES_DISPLAYED_CORRECTLY,
+                    error=True, substrs=['can\'t find global variable'])
+        var = target.FindFirstGlobalVariable("abc::(anonymous namespace)::g_anon_namespace_const_int")
+        self.assertTrue(var.IsValid())
+        self.assertEqual(var.GetName(), "abc::(anonymous namespace)::g_anon_namespace_const_int")
+        self.assertEqual(var.GetValue(), "100")
+
+    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764")
+    def test_access_by_mangled_name(self):
+        self.build()
+
+        (target, _, _, _) = lldbutil.run_to_source_breakpoint(self, "// Set break point at this line.", self.source)
+
         # Check that we can access g_file_global_int by its mangled name
         addr = target.EvaluateExpression("&abc::g_file_global_int").GetValueAsUnsigned()
         self.assertNotEqual(addr, 0)
Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
===================================================================
--- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -3271,15 +3271,14 @@
   }
 
   const DWARFDIE parent_context_die = GetDeclContextDIEContainingDIE(die);
-  const dw_tag_t parent_tag = die.GetParent().Tag();
+  const DWARFDIE sc_parent_die = GetParentSymbolContextDIE(die);
+  const dw_tag_t parent_tag = sc_parent_die.Tag();
   bool is_static_member = (parent_tag == DW_TAG_compile_unit ||
                            parent_tag == DW_TAG_partial_unit) &&
                           (parent_context_die.Tag() == DW_TAG_class_type ||
                            parent_context_die.Tag() == DW_TAG_structure_type);
 
   ValueType scope = eValueTypeInvalid;
-
-  const DWARFDIE sc_parent_die = GetParentSymbolContextDIE(die);
   SymbolContextScope *symbol_context_scope = nullptr;
 
   bool has_explicit_mangled = mangled != nullptr;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D112147.388958.patch
Type: text/x-patch
Size: 4450 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20211122/91aa0828/attachment.bin>


More information about the lldb-commits mailing list