brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.3 KiB · 4e75603 Raw
159 lines · python
1"""2Test 'target modules dump separate-debug-info' for oso files.3"""4 5import json6import os7 8from lldbsuite.test import lldbtest, lldbutil9from lldbsuite.test.decorators import *10 11 12class TestDumpOso(lldbtest.TestBase):13    NO_DEBUG_INFO_TESTCASE = True14 15    def get_osos_from_json_output(self):16        """Returns a dictionary of `symfile` -> {`OSO_PATH` -> oso_info object}."""17        result = {}18        output = json.loads(self.res.GetOutput())19        for symfile_entry in output:20            oso_dict = {}21            for oso_entry in symfile_entry["separate-debug-info-files"]:22                oso_dict[oso_entry["oso_path"]] = oso_entry23            result[symfile_entry["symfile"]] = oso_dict24        return result25 26    @skipIfRemote27    @skipUnlessDarwin28    def test_shows_oso_loaded_json_output(self):29        self.build(debug_info="dwarf")30        exe = self.getBuildArtifact("a.out")31        main_o = self.getBuildArtifact("main.o")32        foo_o = self.getBuildArtifact("foo.o")33 34        # Make sure o files exist35        self.assertTrue(os.path.exists(main_o), f'Make sure "{main_o}" file exists')36        self.assertTrue(os.path.exists(foo_o), f'Make sure "{foo_o}" file exists')37 38        target = self.dbg.CreateTarget(exe)39        self.assertTrue(target, lldbtest.VALID_TARGET)40 41        self.runCmd("target modules dump separate-debug-info --json")42 43        # Check the output44        osos = self.get_osos_from_json_output()45        self.assertTrue(osos[exe][main_o]["loaded"])46        self.assertTrue(osos[exe][foo_o]["loaded"])47 48    @skipIfRemote49    @skipUnlessDarwin50    def test_shows_oso_not_loaded_json_output(self):51        self.build(debug_info="dwarf")52        exe = self.getBuildArtifact("a.out")53        main_o = self.getBuildArtifact("main.o")54        foo_o = self.getBuildArtifact("foo.o")55 56        # REMOVE the o files57        os.unlink(main_o)58 59        target = self.dbg.CreateTarget(exe)60        self.assertTrue(target, lldbtest.VALID_TARGET)61 62        self.runCmd("target modules dump separate-debug-info --json")63 64        # Check the output65        osos = self.get_osos_from_json_output()66        self.assertFalse(osos[exe][main_o]["loaded"])67        self.assertIn("error", osos[exe][main_o])68        self.assertTrue(osos[exe][foo_o]["loaded"])69        self.assertNotIn("error", osos[exe][foo_o])70 71        # Check with --errors-only72        self.runCmd("target modules dump separate-debug-info --json --errors-only")73        output = self.get_osos_from_json_output()74        self.assertFalse(output[exe][main_o]["loaded"])75        self.assertIn("error", output[exe][main_o])76        self.assertNotIn(foo_o, output[exe])77 78    @skipIfRemote79    @skipUnlessDarwin80    def test_shows_oso_loaded_table_output(self):81        self.build(debug_info="dwarf")82        exe = self.getBuildArtifact("a.out")83        main_o = self.getBuildArtifact("main.o")84        foo_o = self.getBuildArtifact("foo.o")85 86        # Make sure o files exist87        self.assertTrue(os.path.exists(main_o), f'Make sure "{main_o}" file exists')88        self.assertTrue(os.path.exists(foo_o), f'Make sure "{foo_o}" file exists')89 90        target = self.dbg.CreateTarget(exe)91        self.assertTrue(target, lldbtest.VALID_TARGET)92 93        self.expect(94            "target modules dump separate-debug-info",95            patterns=[96                r"Symbol file: .*?a\.out",97                'Type: "oso"',98                r"Mod Time\s+Err\s+Oso Path",99                r"0x[a-zA-Z0-9]{16}\s+.*main\.o",100                r"0x[a-zA-Z0-9]{16}\s+.*foo\.o",101            ],102        )103 104    @skipIfRemote105    @skipUnlessDarwin106    def test_shows_oso_not_loaded_table_output(self):107        self.build(debug_info="dwarf")108        exe = self.getBuildArtifact("a.out")109        main_o = self.getBuildArtifact("main.o")110        foo_o = self.getBuildArtifact("foo.o")111 112        # REMOVE the o files113        os.unlink(main_o)114        os.unlink(foo_o)115 116        target = self.dbg.CreateTarget(exe)117        self.assertTrue(target, lldbtest.VALID_TARGET)118 119        self.expect(120            "target modules dump separate-debug-info",121            patterns=[122                r"Symbol file: .*?a\.out",123                'Type: "oso"',124                r"Mod Time\s+Err\s+Oso Path",125                r"0x[a-zA-Z0-9]{16}\s+E\s+.*main\.o",126                r"0x[a-zA-Z0-9]{16}\s+E\s+.*foo\.o",127            ],128        )129 130    @skipIfRemote131    @skipUnlessDarwin132    def test_osos_loaded_symbols_on_demand(self):133        self.build(debug_info="dwarf")134        exe = self.getBuildArtifact("a.out")135        main_o = self.getBuildArtifact("main.o")136        foo_o = self.getBuildArtifact("foo.o")137 138        # Make sure o files exist139        self.assertTrue(os.path.exists(main_o), f'Make sure "{main_o}" file exists')140        self.assertTrue(os.path.exists(foo_o), f'Make sure "{foo_o}" file exists')141 142        target = self.dbg.CreateTarget(exe)143        self.assertTrue(target, lldbtest.VALID_TARGET)144 145        self.runCmd("target modules dump separate-debug-info --json")146 147        # Load symbols on-demand148        self.runCmd("settings set symbols.load-on-demand true")149 150        target = self.dbg.CreateTarget(exe)151        self.assertTrue(target, lldbtest.VALID_TARGET)152 153        self.runCmd("target modules dump separate-debug-info --json")154 155        # Check the output156        osos = self.get_osos_from_json_output()157        self.assertTrue(osos[exe][main_o]["loaded"])158        self.assertTrue(osos[exe][foo_o]["loaded"])159