199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest the printing of anonymous and named namespace variables. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprecht 799451b44SJordan Rupprechtimport lldb 899451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1099451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprechtclass NamespaceBreakpointTestCase(TestBase): 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprecht @expectedFailureAll(bugnumber="llvm.org/pr28548", compiler="gcc") 1699451b44SJordan Rupprecht @expectedFailureAll(oslist=["windows"]) 1799451b44SJordan Rupprecht def test_breakpoints_func_auto(self): 1899451b44SJordan Rupprecht """Test that we can set breakpoints correctly by basename to find all functions whose basename is "func".""" 1999451b44SJordan Rupprecht self.build() 2099451b44SJordan Rupprecht 2199451b44SJordan Rupprecht names = [ 2299451b44SJordan Rupprecht "func()", 2399451b44SJordan Rupprecht "func(int)", 2499451b44SJordan Rupprecht "A::B::func()", 2599451b44SJordan Rupprecht "A::func()", 2699451b44SJordan Rupprecht "A::func(int)"] 2799451b44SJordan Rupprecht 2899451b44SJordan Rupprecht # Create a target by the debugger. 2999451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 3099451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 3199451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 3299451b44SJordan Rupprecht module_list = lldb.SBFileSpecList() 3399451b44SJordan Rupprecht module_list.Append(lldb.SBFileSpec(exe, False)) 3499451b44SJordan Rupprecht cu_list = lldb.SBFileSpecList() 3599451b44SJordan Rupprecht # Set a breakpoint by name "func" which should pick up all functions 3699451b44SJordan Rupprecht # whose basename is "func" 3799451b44SJordan Rupprecht bp = target.BreakpointCreateByName( 3899451b44SJordan Rupprecht "func", lldb.eFunctionNameTypeAuto, module_list, cu_list) 3999451b44SJordan Rupprecht for bp_loc in bp: 4099451b44SJordan Rupprecht name = bp_loc.GetAddress().GetFunction().GetName() 4199451b44SJordan Rupprecht self.assertTrue( 4299451b44SJordan Rupprecht name in names, 4399451b44SJordan Rupprecht "make sure breakpoint locations are correct for 'func' with eFunctionNameTypeAuto") 4499451b44SJordan Rupprecht 4599451b44SJordan Rupprecht @expectedFailureAll(bugnumber="llvm.org/pr28548", compiler="gcc") 4699451b44SJordan Rupprecht def test_breakpoints_func_full(self): 4799451b44SJordan Rupprecht """Test that we can set breakpoints correctly by fullname to find all functions whose fully qualified name is "func" 4899451b44SJordan Rupprecht (no namespaces).""" 4999451b44SJordan Rupprecht self.build() 5099451b44SJordan Rupprecht 5199451b44SJordan Rupprecht names = ["func()", "func(int)"] 5299451b44SJordan Rupprecht 5399451b44SJordan Rupprecht # Create a target by the debugger. 5499451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 5599451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 5699451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 5799451b44SJordan Rupprecht module_list = lldb.SBFileSpecList() 5899451b44SJordan Rupprecht module_list.Append(lldb.SBFileSpec(exe, False)) 5999451b44SJordan Rupprecht cu_list = lldb.SBFileSpecList() 6099451b44SJordan Rupprecht 6199451b44SJordan Rupprecht # Set a breakpoint by name "func" whose fullly qualified named matches "func" which 6299451b44SJordan Rupprecht # should pick up only functions whose basename is "func" and has no 6399451b44SJordan Rupprecht # containing context 6499451b44SJordan Rupprecht bp = target.BreakpointCreateByName( 6599451b44SJordan Rupprecht "func", lldb.eFunctionNameTypeFull, module_list, cu_list) 6699451b44SJordan Rupprecht for bp_loc in bp: 6799451b44SJordan Rupprecht name = bp_loc.GetAddress().GetFunction().GetName() 6899451b44SJordan Rupprecht self.assertTrue( 6999451b44SJordan Rupprecht name in names, 7099451b44SJordan Rupprecht "make sure breakpoint locations are correct for 'func' with eFunctionNameTypeFull") 7199451b44SJordan Rupprecht 7299451b44SJordan Rupprecht def test_breakpoints_a_func_full(self): 7399451b44SJordan Rupprecht """Test that we can set breakpoints correctly by fullname to find all functions whose fully qualified name is "A::func".""" 7499451b44SJordan Rupprecht self.build() 7599451b44SJordan Rupprecht 7699451b44SJordan Rupprecht names = ["A::func()", "A::func(int)"] 7799451b44SJordan Rupprecht 7899451b44SJordan Rupprecht # Create a target by the debugger. 7999451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 8099451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 8199451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 8299451b44SJordan Rupprecht module_list = lldb.SBFileSpecList() 8399451b44SJordan Rupprecht module_list.Append(lldb.SBFileSpec(exe, False)) 8499451b44SJordan Rupprecht cu_list = lldb.SBFileSpecList() 8599451b44SJordan Rupprecht 8699451b44SJordan Rupprecht # Set a breakpoint by name "A::func" whose fullly qualified named matches "A::func" which 8799451b44SJordan Rupprecht # should pick up only functions whose basename is "func" and is 8899451b44SJordan Rupprecht # contained in the "A" namespace 8999451b44SJordan Rupprecht bp = target.BreakpointCreateByName( 9099451b44SJordan Rupprecht "A::func", lldb.eFunctionNameTypeFull, module_list, cu_list) 9199451b44SJordan Rupprecht for bp_loc in bp: 9299451b44SJordan Rupprecht name = bp_loc.GetAddress().GetFunction().GetName() 9399451b44SJordan Rupprecht self.assertTrue( 9499451b44SJordan Rupprecht name in names, 9599451b44SJordan Rupprecht "make sure breakpoint locations are correct for 'A::func' with eFunctionNameTypeFull") 9699451b44SJordan Rupprecht 9799451b44SJordan Rupprecht 9899451b44SJordan Rupprechtclass NamespaceTestCase(TestBase): 9999451b44SJordan Rupprecht 10099451b44SJordan Rupprecht def setUp(self): 10199451b44SJordan Rupprecht # Call super's setUp(). 10299451b44SJordan Rupprecht TestBase.setUp(self) 10399451b44SJordan Rupprecht # Find the line numbers for declarations of namespace variables i and 10499451b44SJordan Rupprecht # j. 10599451b44SJordan Rupprecht self.line_var_i = line_number( 10699451b44SJordan Rupprecht 'main.cpp', '// Find the line number for anonymous namespace variable i.') 10799451b44SJordan Rupprecht self.line_var_j = line_number( 10899451b44SJordan Rupprecht 'main.cpp', '// Find the line number for named namespace variable j.') 10999451b44SJordan Rupprecht # And the line number to break at. 11099451b44SJordan Rupprecht self.line_break = line_number('main.cpp', 11199451b44SJordan Rupprecht '// Set break point at this line.') 11299451b44SJordan Rupprecht # Break inside do {} while and evaluate value 11399451b44SJordan Rupprecht self.line_break_ns1 = line_number('main.cpp', '// Evaluate ns1::value') 11499451b44SJordan Rupprecht self.line_break_ns2 = line_number('main.cpp', '// Evaluate ns2::value') 11599451b44SJordan Rupprecht 11699451b44SJordan Rupprecht def runToBkpt(self, command): 11799451b44SJordan Rupprecht self.runCmd(command, RUN_SUCCEEDED) 11899451b44SJordan Rupprecht # The stop reason of the thread should be breakpoint. 11999451b44SJordan Rupprecht self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 12099451b44SJordan Rupprecht substrs=['stopped', 12199451b44SJordan Rupprecht 'stop reason = breakpoint']) 12299451b44SJordan Rupprecht 12399451b44SJordan Rupprecht # rdar://problem/8668674 12499451b44SJordan Rupprecht @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764") 12599451b44SJordan Rupprecht def test_with_run_command(self): 12699451b44SJordan Rupprecht """Test that anonymous and named namespace variables display correctly.""" 12799451b44SJordan Rupprecht self.build() 12899451b44SJordan Rupprecht self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET) 12999451b44SJordan Rupprecht 13099451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 13199451b44SJordan Rupprecht self, 13299451b44SJordan Rupprecht "main.cpp", 13399451b44SJordan Rupprecht self.line_break_ns1, 13499451b44SJordan Rupprecht num_expected_locations=1, 13599451b44SJordan Rupprecht loc_exact=True) 13699451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 13799451b44SJordan Rupprecht self, 13899451b44SJordan Rupprecht "main.cpp", 13999451b44SJordan Rupprecht self.line_break_ns2, 14099451b44SJordan Rupprecht num_expected_locations=1, 14199451b44SJordan Rupprecht loc_exact=True) 14299451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 14399451b44SJordan Rupprecht self, 14499451b44SJordan Rupprecht "main.cpp", 14599451b44SJordan Rupprecht self.line_break, 14699451b44SJordan Rupprecht num_expected_locations=1, 14799451b44SJordan Rupprecht loc_exact=True) 14899451b44SJordan Rupprecht 14999451b44SJordan Rupprecht self.runToBkpt("run") 15099451b44SJordan Rupprecht # Evaluate ns1::value 151*42b9a683SRaphael Isemann self.expect_expr("value", result_value="100") 15299451b44SJordan Rupprecht 15399451b44SJordan Rupprecht self.runToBkpt("continue") 15499451b44SJordan Rupprecht # Evaluate ns2::value 155*42b9a683SRaphael Isemann self.expect_expr("value", result_value="200") 15699451b44SJordan Rupprecht 15799451b44SJordan Rupprecht self.runToBkpt("continue") 15899451b44SJordan Rupprecht # On Mac OS X, gcc 4.2 emits the wrong debug info with respect to 15999451b44SJordan Rupprecht # types. 16099451b44SJordan Rupprecht slist = ['(int) a = 12', 'anon_uint', 'a_uint', 'b_uint', 'y_uint'] 16199451b44SJordan Rupprecht if self.platformIsDarwin() and self.getCompiler() in [ 16299451b44SJordan Rupprecht 'clang', 'llvm-gcc']: 16399451b44SJordan Rupprecht slist = ['(int) a = 12', 16499451b44SJordan Rupprecht '::my_uint_t', 'anon_uint = 0', 16599451b44SJordan Rupprecht '(A::uint_t) a_uint = 1', 16699451b44SJordan Rupprecht '(A::B::uint_t) b_uint = 2', 16799451b44SJordan Rupprecht '(Y::uint_t) y_uint = 3'] 16899451b44SJordan Rupprecht 16999451b44SJordan Rupprecht # 'frame variable' displays the local variables with type information. 17099451b44SJordan Rupprecht self.expect('frame variable', VARIABLES_DISPLAYED_CORRECTLY, 17199451b44SJordan Rupprecht substrs=slist) 17299451b44SJordan Rupprecht 17399451b44SJordan Rupprecht # 'frame variable' with basename 'i' should work. 17499451b44SJordan Rupprecht self.expect( 17599451b44SJordan Rupprecht "frame variable --show-declaration --show-globals i", 17699451b44SJordan Rupprecht startstr="main.cpp:%d: (int) (anonymous namespace)::i = 3" % 17799451b44SJordan Rupprecht self.line_var_i) 17899451b44SJordan Rupprecht # main.cpp:12: (int) (anonymous namespace)::i = 3 17999451b44SJordan Rupprecht 18099451b44SJordan Rupprecht # 'frame variable' with basename 'j' should work, too. 18199451b44SJordan Rupprecht self.expect( 18299451b44SJordan Rupprecht "frame variable --show-declaration --show-globals j", 18399451b44SJordan Rupprecht startstr="main.cpp:%d: (int) A::B::j = 4" % 18499451b44SJordan Rupprecht self.line_var_j) 18599451b44SJordan Rupprecht # main.cpp:19: (int) A::B::j = 4 18699451b44SJordan Rupprecht 18799451b44SJordan Rupprecht # 'frame variable' should support address-of operator. 18899451b44SJordan Rupprecht self.runCmd("frame variable &i") 18999451b44SJordan Rupprecht 19099451b44SJordan Rupprecht # 'frame variable' with fully qualified name 'A::B::j' should work. 19199451b44SJordan Rupprecht self.expect("frame variable A::B::j", VARIABLES_DISPLAYED_CORRECTLY, 19299451b44SJordan Rupprecht startstr='(int) A::B::j = 4', 19399451b44SJordan Rupprecht patterns=[' = 4']) 19499451b44SJordan Rupprecht 19599451b44SJordan Rupprecht # So should the anonymous namespace case. 19699451b44SJordan Rupprecht self.expect( 19799451b44SJordan Rupprecht "frame variable '(anonymous namespace)::i'", 19899451b44SJordan Rupprecht VARIABLES_DISPLAYED_CORRECTLY, 19999451b44SJordan Rupprecht startstr='(int) (anonymous namespace)::i = 3', 20099451b44SJordan Rupprecht patterns=[' = 3']) 20199451b44SJordan Rupprecht 20299451b44SJordan Rupprecht # rdar://problem/8660275 20399451b44SJordan Rupprecht # test/namespace: 'expression -- i+j' not working 20499451b44SJordan Rupprecht # This has been fixed. 205*42b9a683SRaphael Isemann self.expect_expr("i + j", result_type="int", result_value="7") 20699451b44SJordan Rupprecht # (int) $2 = 7 20799451b44SJordan Rupprecht 208*42b9a683SRaphael Isemann self.expect_expr("i", result_value="3") 209*42b9a683SRaphael Isemann self.expect_expr("j", result_value="4") 21099451b44SJordan Rupprecht 21199451b44SJordan Rupprecht # rdar://problem/8668674 21299451b44SJordan Rupprecht # expression command with fully qualified namespace for a variable does 21399451b44SJordan Rupprecht # not work 214*42b9a683SRaphael Isemann self.expect_expr("::i", result_value="3") 215*42b9a683SRaphael Isemann self.expect_expr("A::B::j", result_value="4") 21699451b44SJordan Rupprecht 21799451b44SJordan Rupprecht # expression command with function in anonymous namespace 218*42b9a683SRaphael Isemann self.expect_expr("myanonfunc(3)", result_value="6") 21999451b44SJordan Rupprecht 22099451b44SJordan Rupprecht # global namespace qualification with function in anonymous namespace 221*42b9a683SRaphael Isemann self.expect_expr("myanonfunc(4)", result_value="8") 22299451b44SJordan Rupprecht 22399451b44SJordan Rupprecht self.expect("p myanonfunc", 22499451b44SJordan Rupprecht patterns=['\(anonymous namespace\)::myanonfunc\(int\)']) 22599451b44SJordan Rupprecht 22699451b44SJordan Rupprecht self.expect("p variadic_sum", patterns=[ 22799451b44SJordan Rupprecht '\(anonymous namespace\)::variadic_sum\(int, ...\)']) 228