8858f67cd18174132a67c8f24ff07bd2c0483dd1
[openbsd] /
1 """Test that types defined in shared libraries with stripped symbols work correctly."""
2
3
4
5 import unittest2
6 import lldb
7 from lldbsuite.test.decorators import *
8 from lldbsuite.test.lldbtest import *
9 from lldbsuite.test import lldbutil
10
11
12 class SharedLibStrippedTestCase(TestBase):
13
14     mydir = TestBase.compute_mydir(__file__)
15
16     @expectedFailureAll(oslist=["windows"])
17     def test_expr(self):
18         """Test that types work when defined in a shared library and forwa/d-declared in the main executable"""
19         if "clang" in self.getCompiler() and "3.4" in self.getCompilerVersion():
20             self.skipTest(
21                 "llvm.org/pr16214 -- clang emits partial DWARF for structures referenced via typedef")
22
23         self.build()
24         self.common_setup()
25
26         # This should display correctly.
27         self.expect(
28             "expression --show-types -- *my_foo_ptr",
29             VARIABLES_DISPLAYED_CORRECTLY,
30             substrs=[
31                 "(foo)",
32                 "(sub_foo)",
33                 "other_element = 3"])
34
35     @expectedFailureAll(oslist=["windows"])
36     @unittest2.expectedFailure("llvm.org/PR36712")
37     def test_frame_variable(self):
38         """Test that types work when defined in a shared library and forward-declared in the main executable"""
39         self.build()
40         self.common_setup()
41
42         # This should display correctly.
43         self.expect(
44             "frame variable --show-types -- *my_foo_ptr",
45             VARIABLES_DISPLAYED_CORRECTLY,
46             substrs=[
47                 "(foo)",
48                 "(sub_foo)",
49                 "other_element = 3"])
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):
60         # Run in synchronous mode
61         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         # Break inside the foo function which takes a bar_ptr argument.
68         lldbutil.run_break_set_by_file_and_line(
69             self, self.source, self.line, num_expected_locations=1, loc_exact=True)
70
71         # Register our shared libraries for remote targets so they get
72         # automatically uploaded
73         environment = self.registerSharedLibrariesWithTarget(
74             target, self.shlib_names)
75
76         # Now launch the process, and do not stop at entry point.
77         process = target.LaunchSimple(
78             None, environment, self.get_process_working_directory())
79         self.assertTrue(process, PROCESS_IS_VALID)
80
81         # The stop reason of the thread should be breakpoint.
82         self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
83                     substrs=['stopped',
84                              'stop reason = breakpoint'])
85
86         # The breakpoint should have a hit count of 1.
87         self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
88                     substrs=[' resolved, hit count = 1'])