File: TestDumpOso.py

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 1,998,520 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (158 lines) | stat: -rw-r--r-- 5,470 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
"""
Test 'target modules dump separate-debug-info' for oso files.
"""

import json
import os

from lldbsuite.test import lldbtest, lldbutil
from lldbsuite.test.decorators import *


class TestDumpOso(lldbtest.TestBase):
    NO_DEBUG_INFO_TESTCASE = True

    def get_osos_from_json_output(self):
        """Returns a dictionary of `symfile` -> {`OSO_PATH` -> oso_info object}."""
        result = {}
        output = json.loads(self.res.GetOutput())
        for symfile_entry in output:
            oso_dict = {}
            for oso_entry in symfile_entry["separate-debug-info-files"]:
                oso_dict[oso_entry["oso_path"]] = oso_entry
            result[symfile_entry["symfile"]] = oso_dict
        return result

    @skipIfRemote
    @skipUnlessDarwin
    def test_shows_oso_loaded_json_output(self):
        self.build(debug_info="dwarf")
        exe = self.getBuildArtifact("a.out")
        main_o = self.getBuildArtifact("main.o")
        foo_o = self.getBuildArtifact("foo.o")

        # Make sure o files exist
        self.assertTrue(os.path.exists(main_o), f'Make sure "{main_o}" file exists')
        self.assertTrue(os.path.exists(foo_o), f'Make sure "{foo_o}" file exists')

        target = self.dbg.CreateTarget(exe)
        self.assertTrue(target, lldbtest.VALID_TARGET)

        self.runCmd("target modules dump separate-debug-info --json")

        # Check the output
        osos = self.get_osos_from_json_output()
        self.assertTrue(osos[exe][main_o]["loaded"])
        self.assertTrue(osos[exe][foo_o]["loaded"])

    @skipIfRemote
    @skipUnlessDarwin
    def test_shows_oso_not_loaded_json_output(self):
        self.build(debug_info="dwarf")
        exe = self.getBuildArtifact("a.out")
        main_o = self.getBuildArtifact("main.o")
        foo_o = self.getBuildArtifact("foo.o")

        # REMOVE the o files
        os.unlink(main_o)

        target = self.dbg.CreateTarget(exe)
        self.assertTrue(target, lldbtest.VALID_TARGET)

        self.runCmd("target modules dump separate-debug-info --json")

        # Check the output
        osos = self.get_osos_from_json_output()
        self.assertFalse(osos[exe][main_o]["loaded"])
        self.assertIn("error", osos[exe][main_o])
        self.assertTrue(osos[exe][foo_o]["loaded"])
        self.assertNotIn("error", osos[exe][foo_o])

        # Check with --errors-only
        self.runCmd("target modules dump separate-debug-info --json --errors-only")
        output = self.get_osos_from_json_output()
        self.assertFalse(output[exe][main_o]["loaded"])
        self.assertIn("error", output[exe][main_o])
        self.assertNotIn(foo_o, output[exe])

    @skipIfRemote
    @skipUnlessDarwin
    def test_shows_oso_loaded_table_output(self):
        self.build(debug_info="dwarf")
        exe = self.getBuildArtifact("a.out")
        main_o = self.getBuildArtifact("main.o")
        foo_o = self.getBuildArtifact("foo.o")

        # Make sure o files exist
        self.assertTrue(os.path.exists(main_o), f'Make sure "{main_o}" file exists')
        self.assertTrue(os.path.exists(foo_o), f'Make sure "{foo_o}" file exists')

        target = self.dbg.CreateTarget(exe)
        self.assertTrue(target, lldbtest.VALID_TARGET)

        self.expect(
            "target modules dump separate-debug-info",
            patterns=[
                "Symbol file: .*?a\.out",
                'Type: "oso"',
                "Mod Time\s+Err\s+Oso Path",
                "0x[a-zA-Z0-9]{16}\s+.*main\.o",
                "0x[a-zA-Z0-9]{16}\s+.*foo\.o",
            ],
        )

    @skipIfRemote
    @skipUnlessDarwin
    def test_shows_oso_not_loaded_table_output(self):
        self.build(debug_info="dwarf")
        exe = self.getBuildArtifact("a.out")
        main_o = self.getBuildArtifact("main.o")
        foo_o = self.getBuildArtifact("foo.o")

        # REMOVE the o files
        os.unlink(main_o)
        os.unlink(foo_o)

        target = self.dbg.CreateTarget(exe)
        self.assertTrue(target, lldbtest.VALID_TARGET)

        self.expect(
            "target modules dump separate-debug-info",
            patterns=[
                "Symbol file: .*?a\.out",
                'Type: "oso"',
                "Mod Time\s+Err\s+Oso Path",
                "0x[a-zA-Z0-9]{16}\s+E\s+.*main\.o",
                "0x[a-zA-Z0-9]{16}\s+E\s+.*foo\.o",
            ],
        )

    @skipIfRemote
    @skipUnlessDarwin
    def test_osos_loaded_symbols_on_demand(self):
        self.build(debug_info="dwarf")
        exe = self.getBuildArtifact("a.out")
        main_o = self.getBuildArtifact("main.o")
        foo_o = self.getBuildArtifact("foo.o")

        # Make sure o files exist
        self.assertTrue(os.path.exists(main_o), f'Make sure "{main_o}" file exists')
        self.assertTrue(os.path.exists(foo_o), f'Make sure "{foo_o}" file exists')

        target = self.dbg.CreateTarget(exe)
        self.assertTrue(target, lldbtest.VALID_TARGET)

        self.runCmd("target modules dump separate-debug-info --json")

        # Load symbols on-demand
        self.runCmd("settings set symbols.load-on-demand true")

        target = self.dbg.CreateTarget(exe)
        self.assertTrue(target, lldbtest.VALID_TARGET)

        self.runCmd("target modules dump separate-debug-info --json")

        # Check the output
        osos = self.get_osos_from_json_output()
        self.assertTrue(osos[exe][main_o]["loaded"])
        self.assertTrue(osos[exe][foo_o]["loaded"])