diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/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; diff --git a/lldb/test/API/lang/cpp/global_variables/TestCPPGlobalVariables.py b/lldb/test/API/lang/cpp/global_variables/TestCPPGlobalVariables.py --- a/lldb/test/API/lang/cpp/global_variables/TestCPPGlobalVariables.py +++ b/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) diff --git a/lldb/test/API/lang/cpp/global_variables/main.cpp b/lldb/test/API/lang/cpp/global_variables/main.cpp --- a/lldb/test/API/lang/cpp/global_variables/main.cpp +++ b/lldb/test/API/lang/cpp/global_variables/main.cpp @@ -1,10 +1,17 @@ #include 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. }