"""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)