| """Test that C++ global variables can be inspected by name and also their mangled name.""" |
| |
| |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| |
| class GlobalVariablesCppTestCase(TestBase): |
| def setUp(self): |
| TestBase.setUp(self) |
| self.source = lldb.SBFileSpec("main.cpp") |
| |
| 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"], |
| ) |
| self.expect( |
| "target variable abc::g_file_global_int", |
| VARIABLES_DISPLAYED_CORRECTLY, |
| substrs=["42"], |
| ) |
| 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) |
| mangled = lldb.SBAddress(addr, target).GetSymbol().GetMangledName() |
| self.assertNotEqual(mangled, None) |
| gv = target.FindFirstGlobalVariable(mangled) |
| self.assertTrue(gv.IsValid()) |
| self.assertEqual(gv.GetName(), "abc::g_file_global_int") |
| self.assertEqual(gv.GetValueAsUnsigned(), 42) |