129 lines · python
1"""Test that conflicting symbols in different shared libraries work correctly"""2 3 4import lldb5from lldbsuite.test.decorators import *6from lldbsuite.test.lldbtest import *7from lldbsuite.test import lldbutil8 9 10class TestConflictingSymbols(TestBase):11 NO_DEBUG_INFO_TESTCASE = True12 13 def setUp(self):14 TestBase.setUp(self)15 lldbutil.mkdir_p(self.getBuildArtifact("One"))16 lldbutil.mkdir_p(self.getBuildArtifact("Two"))17 18 @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24489")19 def test_conflicting_symbols(self):20 self.build()21 exe = self.getBuildArtifact("a.out")22 target = self.dbg.CreateTarget(exe)23 self.assertTrue(target, VALID_TARGET)24 25 # Register our shared libraries for remote targets so they get26 # automatically uploaded27 environment = self.registerSharedLibrariesWithTarget(target, ["One", "Two"])28 29 lldbutil.run_break_set_by_source_regexp(30 self, "// break here", extra_options="-f One.c", num_expected_locations=-231 )32 lldbutil.run_break_set_by_source_regexp(33 self, "// break here", extra_options="-f Two.c", num_expected_locations=-234 )35 lldbutil.run_break_set_by_source_regexp(36 self, "// break here", extra_options="-f main.c", num_expected_locations=137 )38 39 process = target.LaunchSimple(40 None, environment, self.get_process_working_directory()41 )42 self.assertTrue(process, PROCESS_IS_VALID)43 44 # The stop reason of the thread should be breakpoint.45 self.expect(46 "thread list",47 STOPPED_DUE_TO_BREAKPOINT,48 substrs=["stopped", "stop reason = breakpoint"],49 )50 51 lldbutil.check_breakpoint(self, bpno=1, expected_hit_count=1)52 53 # This should display correctly.54 self.expect(55 "expr (unsigned long long)conflicting_symbol",56 "Symbol from One should be found",57 substrs=["11111"],58 )59 60 self.runCmd("continue", RUN_SUCCEEDED)61 62 # The stop reason of the thread should be breakpoint.63 self.expect(64 "thread list",65 STOPPED_DUE_TO_BREAKPOINT,66 substrs=["stopped", "stop reason = breakpoint"],67 )68 69 lldbutil.check_breakpoint(self, bpno=1, expected_hit_count=1)70 71 self.expect(72 "expr (unsigned long long)conflicting_symbol",73 "Symbol from Two should be found",74 substrs=["22222"],75 )76 77 self.runCmd("continue", RUN_SUCCEEDED)78 79 # The stop reason of the thread should be breakpoint.80 self.expect(81 "thread list",82 STOPPED_DUE_TO_BREAKPOINT,83 substrs=["stopped", "stop reason = breakpoint"],84 )85 86 lldbutil.check_breakpoint(self, bpno=1, expected_hit_count=1)87 88 self.expect(89 "expr (unsigned long long)conflicting_symbol",90 "An error should be printed when symbols can't be ordered",91 error=True,92 substrs=["Multiple internal symbols"],93 )94 95 @expectedFailureAll(bugnumber="llvm.org/pr35043")96 @skipIfWindows # This test is "passing" on Windows, but it is a false positive.97 def test_shadowed(self):98 self.build()99 exe = self.getBuildArtifact("a.out")100 target = self.dbg.CreateTarget(exe)101 self.assertTrue(target, VALID_TARGET)102 103 # Register our shared libraries for remote targets so they get104 # automatically uploaded105 environment = self.registerSharedLibrariesWithTarget(target, ["One", "Two"])106 107 lldbutil.run_break_set_by_source_regexp(108 self, "// break here", extra_options="-f main.c", num_expected_locations=1109 )110 111 process = target.LaunchSimple(112 None, environment, self.get_process_working_directory()113 )114 self.assertTrue(process, PROCESS_IS_VALID)115 116 # The stop reason of the thread should be breakpoint.117 self.expect(118 "thread list",119 STOPPED_DUE_TO_BREAKPOINT,120 substrs=["stopped", "stop reason = breakpoint"],121 )122 123 # As we are shadowing the conflicting symbol, there should be no124 # ambiguity in this expression.125 self.expect(126 "expr int conflicting_symbol = 474747; conflicting_symbol",127 substrs=["474747"],128 )129