95 lines · python
1"""Test that types defined in shared libraries work correctly."""2 3 4import unittest5import lldb6from lldbsuite.test.decorators import *7from lldbsuite.test.lldbtest import *8import lldbsuite.test.lldbutil as lldbutil9 10 11class SharedLibTestCase(TestBase):12 def common_test_expr(self, preload_symbols):13 if "clang" in self.getCompiler() and "3.4" in self.getCompilerVersion():14 self.skipTest(15 "llvm.org/pr16214 -- clang emits partial DWARF for structures referenced via typedef"16 )17 18 self.build()19 self.common_setup(preload_symbols)20 21 # This should display correctly.22 self.expect(23 "expression --show-types -- *my_foo_ptr",24 VARIABLES_DISPLAYED_CORRECTLY,25 substrs=["(foo)", "(sub_foo)", "other_element = 3"],26 )27 28 self.expect("expression GetMeASubFoo(my_foo_ptr)", startstr="(sub_foo *) $")29 30 def test_expr(self):31 """Test that types work when defined in a shared library and forward-declared in the main executable"""32 self.common_test_expr(True)33 34 def test_expr_no_preload(self):35 """Test that types work when defined in a shared library and forward-declared in the main executable, but with preloading disabled"""36 self.common_test_expr(False)37 38 @unittest.expectedFailure # llvm.org/PR3671239 def test_frame_variable(self):40 """Test that types work when defined in a shared library and forward-declared in the main executable"""41 self.build()42 self.common_setup()43 44 # This should display correctly.45 self.expect(46 "frame variable --show-types -- *my_foo_ptr",47 VARIABLES_DISPLAYED_CORRECTLY,48 substrs=["(foo)", "(sub_foo)", "other_element = 3"],49 )50 51 def setUp(self):52 # Call super's setUp().53 TestBase.setUp(self)54 # Find the line number to break inside main().55 self.source = "main.c"56 self.line = line_number(self.source, "// Set breakpoint 0 here.")57 self.shlib_names = ["foo"]58 59 def common_setup(self, preload_symbols=True):60 # Run in synchronous mode61 self.dbg.SetAsync(False)62 63 # Create a target by the debugger.64 target = self.dbg.CreateTarget(self.getBuildArtifact("a.out"))65 self.assertTrue(target, VALID_TARGET)66 67 self.runCmd(68 "settings set target.preload-symbols " + str(preload_symbols).lower()69 )70 71 # Break inside the foo function which takes a bar_ptr argument.72 lldbutil.run_break_set_by_file_and_line(73 self, self.source, self.line, num_expected_locations=1, loc_exact=True74 )75 76 # Register our shared libraries for remote targets so they get77 # automatically uploaded78 environment = self.registerSharedLibrariesWithTarget(target, self.shlib_names)79 80 # Now launch the process, and do not stop at entry point.81 process = target.LaunchSimple(82 None, environment, self.get_process_working_directory()83 )84 self.assertTrue(process, PROCESS_IS_VALID)85 86 # The stop reason of the thread should be breakpoint.87 self.expect(88 "thread list",89 STOPPED_DUE_TO_BREAKPOINT,90 substrs=["stopped", "stop reason = breakpoint"],91 )92 93 # The breakpoint should have a hit count of 1.94 lldbutil.check_breakpoint(self, bpno=1, expected_hit_count=1)95