199451b44SJordan Rupprecht"""Test that types defined in shared libraries work correctly.""" 299451b44SJordan Rupprecht 399451b44SJordan Rupprecht 4*5b386158SJordan Rupprechtimport unittest 599451b44SJordan Rupprechtimport lldb 699451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 799451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 899451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil 999451b44SJordan Rupprecht 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprechtclass SharedLibTestCase(TestBase): 1299451b44SJordan Rupprecht def common_test_expr(self, preload_symbols): 1399451b44SJordan Rupprecht if "clang" in self.getCompiler() and "3.4" in self.getCompilerVersion(): 1499451b44SJordan Rupprecht self.skipTest( 152238dcc3SJonas Devlieghere "llvm.org/pr16214 -- clang emits partial DWARF for structures referenced via typedef" 162238dcc3SJonas Devlieghere ) 1799451b44SJordan Rupprecht 1899451b44SJordan Rupprecht self.build() 1999451b44SJordan Rupprecht self.common_setup(preload_symbols) 2099451b44SJordan Rupprecht 2199451b44SJordan Rupprecht # This should display correctly. 2299451b44SJordan Rupprecht self.expect( 2399451b44SJordan Rupprecht "expression --show-types -- *my_foo_ptr", 2499451b44SJordan Rupprecht VARIABLES_DISPLAYED_CORRECTLY, 252238dcc3SJonas Devlieghere substrs=["(foo)", "(sub_foo)", "other_element = 3"], 262238dcc3SJonas Devlieghere ) 2799451b44SJordan Rupprecht 282238dcc3SJonas Devlieghere self.expect("expression GetMeASubFoo(my_foo_ptr)", startstr="(sub_foo *) $") 2999451b44SJordan Rupprecht 3099451b44SJordan Rupprecht def test_expr(self): 3199451b44SJordan Rupprecht """Test that types work when defined in a shared library and forward-declared in the main executable""" 3299451b44SJordan Rupprecht self.common_test_expr(True) 3399451b44SJordan Rupprecht 3499451b44SJordan Rupprecht def test_expr_no_preload(self): 3599451b44SJordan Rupprecht """Test that types work when defined in a shared library and forward-declared in the main executable, but with preloading disabled""" 3699451b44SJordan Rupprecht self.common_test_expr(False) 3799451b44SJordan Rupprecht 38*5b386158SJordan Rupprecht @unittest.expectedFailure # llvm.org/PR36712 3999451b44SJordan Rupprecht def test_frame_variable(self): 4099451b44SJordan Rupprecht """Test that types work when defined in a shared library and forward-declared in the main executable""" 4199451b44SJordan Rupprecht self.build() 4299451b44SJordan Rupprecht self.common_setup() 4399451b44SJordan Rupprecht 4499451b44SJordan Rupprecht # This should display correctly. 4599451b44SJordan Rupprecht self.expect( 4699451b44SJordan Rupprecht "frame variable --show-types -- *my_foo_ptr", 4799451b44SJordan Rupprecht VARIABLES_DISPLAYED_CORRECTLY, 482238dcc3SJonas Devlieghere substrs=["(foo)", "(sub_foo)", "other_element = 3"], 492238dcc3SJonas Devlieghere ) 5099451b44SJordan Rupprecht 5199451b44SJordan Rupprecht def setUp(self): 5299451b44SJordan Rupprecht # Call super's setUp(). 5399451b44SJordan Rupprecht TestBase.setUp(self) 5499451b44SJordan Rupprecht # Find the line number to break inside main(). 552238dcc3SJonas Devlieghere self.source = "main.c" 562238dcc3SJonas Devlieghere self.line = line_number(self.source, "// Set breakpoint 0 here.") 5799451b44SJordan Rupprecht self.shlib_names = ["foo"] 5899451b44SJordan Rupprecht 5999451b44SJordan Rupprecht def common_setup(self, preload_symbols=True): 6099451b44SJordan Rupprecht # Run in synchronous mode 6199451b44SJordan Rupprecht self.dbg.SetAsync(False) 6299451b44SJordan Rupprecht 6399451b44SJordan Rupprecht # Create a target by the debugger. 6499451b44SJordan Rupprecht target = self.dbg.CreateTarget(self.getBuildArtifact("a.out")) 6599451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 6699451b44SJordan Rupprecht 672238dcc3SJonas Devlieghere self.runCmd( 682238dcc3SJonas Devlieghere "settings set target.preload-symbols " + str(preload_symbols).lower() 692238dcc3SJonas Devlieghere ) 7099451b44SJordan Rupprecht 7199451b44SJordan Rupprecht # Break inside the foo function which takes a bar_ptr argument. 7299451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 732238dcc3SJonas Devlieghere self, self.source, self.line, num_expected_locations=1, loc_exact=True 742238dcc3SJonas Devlieghere ) 7599451b44SJordan Rupprecht 7699451b44SJordan Rupprecht # Register our shared libraries for remote targets so they get 7799451b44SJordan Rupprecht # automatically uploaded 782238dcc3SJonas Devlieghere environment = self.registerSharedLibrariesWithTarget(target, self.shlib_names) 7999451b44SJordan Rupprecht 8099451b44SJordan Rupprecht # Now launch the process, and do not stop at entry point. 8199451b44SJordan Rupprecht process = target.LaunchSimple( 822238dcc3SJonas Devlieghere None, environment, self.get_process_working_directory() 832238dcc3SJonas Devlieghere ) 8499451b44SJordan Rupprecht self.assertTrue(process, PROCESS_IS_VALID) 8599451b44SJordan Rupprecht 8699451b44SJordan Rupprecht # The stop reason of the thread should be breakpoint. 872238dcc3SJonas Devlieghere self.expect( 882238dcc3SJonas Devlieghere "thread list", 892238dcc3SJonas Devlieghere STOPPED_DUE_TO_BREAKPOINT, 902238dcc3SJonas Devlieghere substrs=["stopped", "stop reason = breakpoint"], 912238dcc3SJonas Devlieghere ) 9299451b44SJordan Rupprecht 9399451b44SJordan Rupprecht # The breakpoint should have a hit count of 1. 949f0b5f9aSSYNOPSYS\georgiev lldbutil.check_breakpoint(self, bpno=1, expected_hit_count=1) 95