https://github.com/zhyty updated https://github.com/llvm/llvm-project/pull/71230
>From 68c8884696efab8991e71dfd892463b9873b5e46 Mon Sep 17 00:00:00 2001 From: Tom Yang <toy...@fb.com> Date: Fri, 3 Nov 2023 13:45:37 -0700 Subject: [PATCH 1/5] [lldb][split-dwarf] implement GetSeparateDebugInfo for SymbolFileOnDemand --- lldb/include/lldb/Symbol/SymbolFileOnDemand.h | 5 ++++ lldb/source/Commands/CommandObjectTarget.cpp | 1 + .../dwo/TestDumpDwo.py | 26 +++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/lldb/include/lldb/Symbol/SymbolFileOnDemand.h b/lldb/include/lldb/Symbol/SymbolFileOnDemand.h index adf1017ce73c11b..9cbcef2a111d320 100644 --- a/lldb/include/lldb/Symbol/SymbolFileOnDemand.h +++ b/lldb/include/lldb/Symbol/SymbolFileOnDemand.h @@ -228,6 +228,11 @@ class SymbolFileOnDemand : public lldb_private::SymbolFile { return m_sym_file_impl->SetDebugInfoHadFrameVariableErrors(); } + bool GetSeparateDebugInfo(StructuredData::Dictionary &d, + bool errors_only) override { + return m_sym_file_impl->GetSeparateDebugInfo(d, errors_only); + } + lldb::TypeSP MakeType(lldb::user_id_t uid, ConstString name, std::optional<uint64_t> byte_size, SymbolContextScope *context, diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index 8f052d0a7b837e2..31ad485ac236878 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -2691,6 +2691,7 @@ class CommandObjectTargetModulesDumpSeparateDebugInfoFiles "Found unsupported debug info type '%s'.\n", type.str().c_str()); } + strm.EOL(); return true; }); } diff --git a/lldb/test/API/commands/target/dump-separate-debug-info/dwo/TestDumpDwo.py b/lldb/test/API/commands/target/dump-separate-debug-info/dwo/TestDumpDwo.py index 163f5a112367693..881ee7b1dc71adf 100644 --- a/lldb/test/API/commands/target/dump-separate-debug-info/dwo/TestDumpDwo.py +++ b/lldb/test/API/commands/target/dump-separate-debug-info/dwo/TestDumpDwo.py @@ -130,3 +130,29 @@ def test_dwos_not_loaded_table_output(self): "0x[a-zA-Z0-9]{16}\s+E\s+.*foo\.dwo", ], ) + + @skipIfRemote + @skipIfDarwin + @skipIfWindows + def test_dwos_loaded_symbols_on_demand(self): + self.build() + exe = self.getBuildArtifact("a.out") + main_dwo = self.getBuildArtifact("main.dwo") + foo_dwo = self.getBuildArtifact("foo.dwo") + + # Make sure dwo files exist + self.assertTrue(os.path.exists(main_dwo), f'Make sure "{main_dwo}" file exists') + self.assertTrue(os.path.exists(foo_dwo), f'Make sure "{foo_dwo}" file exists') + + # 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 + output = self.get_dwos_from_json_output() + self.assertTrue(output[exe]["main.dwo"]["loaded"]) + self.assertTrue(output[exe]["foo.dwo"]["loaded"]) >From f2e2b100144dad2bfeb2d71efd8559a0a003bd27 Mon Sep 17 00:00:00 2001 From: Tom Yang <toy...@fb.com> Date: Sun, 5 Nov 2023 10:06:12 -0800 Subject: [PATCH 2/5] add symbol on demand Darwin OSO tests --- .../oso/TestDumpOso.py | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lldb/test/API/commands/target/dump-separate-debug-info/oso/TestDumpOso.py b/lldb/test/API/commands/target/dump-separate-debug-info/oso/TestDumpOso.py index b69938454659bda..06dc8234591844b 100644 --- a/lldb/test/API/commands/target/dump-separate-debug-info/oso/TestDumpOso.py +++ b/lldb/test/API/commands/target/dump-separate-debug-info/oso/TestDumpOso.py @@ -126,3 +126,33 @@ def test_shows_oso_not_loaded_table_output(self): "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"]) >From da7cf854335ac93ce15fe457b3432f268f1cd36f Mon Sep 17 00:00:00 2001 From: Tom Yang <toy...@fb.com> Date: Sun, 5 Nov 2023 10:22:16 -0800 Subject: [PATCH 3/5] Remove extra EOL --- lldb/source/Commands/CommandObjectTarget.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index 31ad485ac236878..8f052d0a7b837e2 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -2691,7 +2691,6 @@ class CommandObjectTargetModulesDumpSeparateDebugInfoFiles "Found unsupported debug info type '%s'.\n", type.str().c_str()); } - strm.EOL(); return true; }); } >From 2efa56974ee171b5f34f19607eefa652ef1b344a Mon Sep 17 00:00:00 2001 From: Tom Yang <toy...@fb.com> Date: Sun, 19 Nov 2023 15:59:34 -0800 Subject: [PATCH 4/5] change dwo test to include other platforms, skipping if build failure --- .../dump-separate-debug-info/dwo/Makefile | 6 +- .../dwo/TestDumpDwo.py | 74 +++++++++---------- 2 files changed, 36 insertions(+), 44 deletions(-) diff --git a/lldb/test/API/commands/target/dump-separate-debug-info/dwo/Makefile b/lldb/test/API/commands/target/dump-separate-debug-info/dwo/Makefile index 3b6d788b2b0130a..ea236b3d975e047 100644 --- a/lldb/test/API/commands/target/dump-separate-debug-info/dwo/Makefile +++ b/lldb/test/API/commands/target/dump-separate-debug-info/dwo/Makefile @@ -1,4 +1,4 @@ -CXX_SOURCES := main.cpp foo.cpp -CFLAGS_EXTRAS := -gsplit-dwarf - include Makefile.rules + +a.out: + $(CC) -target x86_64-pc-linux-elf -g -gsplit-dwarf -o $@ $(SRCDIR)/main.cpp $(SRCDIR)/foo.cpp diff --git a/lldb/test/API/commands/target/dump-separate-debug-info/dwo/TestDumpDwo.py b/lldb/test/API/commands/target/dump-separate-debug-info/dwo/TestDumpDwo.py index 881ee7b1dc71adf..a8f2dd4e92e8f8c 100644 --- a/lldb/test/API/commands/target/dump-separate-debug-info/dwo/TestDumpDwo.py +++ b/lldb/test/API/commands/target/dump-separate-debug-info/dwo/TestDumpDwo.py @@ -7,6 +7,7 @@ from lldbsuite.test import lldbtest, lldbutil from lldbsuite.test.decorators import * +from lldbsuite.test_event.build_exception import BuildError class TestDumpDWO(lldbtest.TestBase): @@ -23,14 +24,17 @@ def get_dwos_from_json_output(self): result[symfile_entry["symfile"]] = dwo_dict return result - @skipIfRemote - @skipIfDarwin - @skipIfWindows + def build_and_skip_if_error(self): + try: + self.build() + except BuildError as e: + self.skipTest(f"Skipping test due to build exception: {e}") + def test_dwos_loaded_json_output(self): - self.build() + self.build_and_skip_if_error() exe = self.getBuildArtifact("a.out") - main_dwo = self.getBuildArtifact("main.dwo") - foo_dwo = self.getBuildArtifact("foo.dwo") + main_dwo = self.getBuildArtifact("a.out-main.dwo") + foo_dwo = self.getBuildArtifact("a.out-foo.dwo") # Make sure dwo files exist self.assertTrue(os.path.exists(main_dwo), f'Make sure "{main_dwo}" file exists') @@ -43,17 +47,14 @@ def test_dwos_loaded_json_output(self): # Check the output output = self.get_dwos_from_json_output() - self.assertTrue(output[exe]["main.dwo"]["loaded"]) - self.assertTrue(output[exe]["foo.dwo"]["loaded"]) + self.assertTrue(output[exe]["a.out-main.dwo"]["loaded"]) + self.assertTrue(output[exe]["a.out-foo.dwo"]["loaded"]) - @skipIfRemote - @skipIfDarwin - @skipIfWindows def test_dwos_not_loaded_json_output(self): - self.build() + self.build_and_skip_if_error() exe = self.getBuildArtifact("a.out") - main_dwo = self.getBuildArtifact("main.dwo") - foo_dwo = self.getBuildArtifact("foo.dwo") + main_dwo = self.getBuildArtifact("a.out-main.dwo") + foo_dwo = self.getBuildArtifact("a.out-foo.dwo") # REMOVE one of the dwo files os.unlink(main_dwo) @@ -65,26 +66,23 @@ def test_dwos_not_loaded_json_output(self): # Check the output output = self.get_dwos_from_json_output() - self.assertFalse(output[exe]["main.dwo"]["loaded"]) - self.assertIn("error", output[exe]["main.dwo"]) - self.assertTrue(output[exe]["foo.dwo"]["loaded"]) - self.assertNotIn("error", output[exe]["foo.dwo"]) + self.assertFalse(output[exe]["a.out-main.dwo"]["loaded"]) + self.assertIn("error", output[exe]["a.out-main.dwo"]) + self.assertTrue(output[exe]["a.out-foo.dwo"]["loaded"]) + self.assertNotIn("error", output[exe]["a.out-foo.dwo"]) # Check with --errors-only self.runCmd("target modules dump separate-debug-info --json --errors-only") output = self.get_dwos_from_json_output() - self.assertFalse(output[exe]["main.dwo"]["loaded"]) - self.assertIn("error", output[exe]["main.dwo"]) - self.assertNotIn("foo.dwo", output[exe]) + self.assertFalse(output[exe]["a.out-main.dwo"]["loaded"]) + self.assertIn("error", output[exe]["a.out-main.dwo"]) + self.assertNotIn("a.out-foo.dwo", output[exe]) - @skipIfRemote - @skipIfDarwin - @skipIfWindows def test_dwos_loaded_table_output(self): - self.build() + self.build_and_skip_if_error() exe = self.getBuildArtifact("a.out") - main_dwo = self.getBuildArtifact("main.dwo") - foo_dwo = self.getBuildArtifact("foo.dwo") + main_dwo = self.getBuildArtifact("a.out-main.dwo") + foo_dwo = self.getBuildArtifact("a.out-foo.dwo") # Make sure dwo files exist self.assertTrue(os.path.exists(main_dwo), f'Make sure "{main_dwo}" file exists') @@ -104,14 +102,11 @@ def test_dwos_loaded_table_output(self): ], ) - @skipIfRemote - @skipIfDarwin - @skipIfWindows def test_dwos_not_loaded_table_output(self): - self.build() + self.build_and_skip_if_error() exe = self.getBuildArtifact("a.out") - main_dwo = self.getBuildArtifact("main.dwo") - foo_dwo = self.getBuildArtifact("foo.dwo") + main_dwo = self.getBuildArtifact("a.out-main.dwo") + foo_dwo = self.getBuildArtifact("a.out-foo.dwo") # REMOVE the dwo files os.unlink(main_dwo) @@ -131,14 +126,11 @@ def test_dwos_not_loaded_table_output(self): ], ) - @skipIfRemote - @skipIfDarwin - @skipIfWindows def test_dwos_loaded_symbols_on_demand(self): - self.build() + self.build_and_skip_if_error() exe = self.getBuildArtifact("a.out") - main_dwo = self.getBuildArtifact("main.dwo") - foo_dwo = self.getBuildArtifact("foo.dwo") + main_dwo = self.getBuildArtifact("a.out-main.dwo") + foo_dwo = self.getBuildArtifact("a.out-foo.dwo") # Make sure dwo files exist self.assertTrue(os.path.exists(main_dwo), f'Make sure "{main_dwo}" file exists') @@ -154,5 +146,5 @@ def test_dwos_loaded_symbols_on_demand(self): # Check the output output = self.get_dwos_from_json_output() - self.assertTrue(output[exe]["main.dwo"]["loaded"]) - self.assertTrue(output[exe]["foo.dwo"]["loaded"]) + self.assertTrue(output[exe]["a.out-main.dwo"]["loaded"]) + self.assertTrue(output[exe]["a.out-foo.dwo"]["loaded"]) >From d3e5d26f1638d355f596a02b447fd045a0595dd9 Mon Sep 17 00:00:00 2001 From: Tom Yang <toy...@fb.com> Date: Sun, 19 Nov 2023 19:55:52 -0800 Subject: [PATCH 5/5] formatting issues, rename the cpp to c since we're using $(CC) --- .../API/commands/target/dump-separate-debug-info/dwo/Makefile | 2 +- .../target/dump-separate-debug-info/dwo/TestDumpDwo.py | 2 +- .../target/dump-separate-debug-info/dwo/{foo.cpp => foo.c} | 0 .../API/commands/target/dump-separate-debug-info/dwo/main.c | 3 +++ .../API/commands/target/dump-separate-debug-info/dwo/main.cpp | 3 --- 5 files changed, 5 insertions(+), 5 deletions(-) rename lldb/test/API/commands/target/dump-separate-debug-info/dwo/{foo.cpp => foo.c} (100%) create mode 100644 lldb/test/API/commands/target/dump-separate-debug-info/dwo/main.c delete mode 100644 lldb/test/API/commands/target/dump-separate-debug-info/dwo/main.cpp diff --git a/lldb/test/API/commands/target/dump-separate-debug-info/dwo/Makefile b/lldb/test/API/commands/target/dump-separate-debug-info/dwo/Makefile index ea236b3d975e047..99b3fb3bd7762f7 100644 --- a/lldb/test/API/commands/target/dump-separate-debug-info/dwo/Makefile +++ b/lldb/test/API/commands/target/dump-separate-debug-info/dwo/Makefile @@ -1,4 +1,4 @@ include Makefile.rules a.out: - $(CC) -target x86_64-pc-linux-elf -g -gsplit-dwarf -o $@ $(SRCDIR)/main.cpp $(SRCDIR)/foo.cpp + $(CC) -target x86_64-pc-linux-elf -g -gsplit-dwarf -o $@ $(SRCDIR)/main.c $(SRCDIR)/foo.c diff --git a/lldb/test/API/commands/target/dump-separate-debug-info/dwo/TestDumpDwo.py b/lldb/test/API/commands/target/dump-separate-debug-info/dwo/TestDumpDwo.py index a8f2dd4e92e8f8c..05c72945b14390e 100644 --- a/lldb/test/API/commands/target/dump-separate-debug-info/dwo/TestDumpDwo.py +++ b/lldb/test/API/commands/target/dump-separate-debug-info/dwo/TestDumpDwo.py @@ -26,7 +26,7 @@ def get_dwos_from_json_output(self): def build_and_skip_if_error(self): try: - self.build() + self.build() except BuildError as e: self.skipTest(f"Skipping test due to build exception: {e}") diff --git a/lldb/test/API/commands/target/dump-separate-debug-info/dwo/foo.cpp b/lldb/test/API/commands/target/dump-separate-debug-info/dwo/foo.c similarity index 100% rename from lldb/test/API/commands/target/dump-separate-debug-info/dwo/foo.cpp rename to lldb/test/API/commands/target/dump-separate-debug-info/dwo/foo.c diff --git a/lldb/test/API/commands/target/dump-separate-debug-info/dwo/main.c b/lldb/test/API/commands/target/dump-separate-debug-info/dwo/main.c new file mode 100644 index 000000000000000..2505586c52e43a9 --- /dev/null +++ b/lldb/test/API/commands/target/dump-separate-debug-info/dwo/main.c @@ -0,0 +1,3 @@ +#include "foo.h" + +int main(void) { return foo(); } diff --git a/lldb/test/API/commands/target/dump-separate-debug-info/dwo/main.cpp b/lldb/test/API/commands/target/dump-separate-debug-info/dwo/main.cpp deleted file mode 100644 index 8087e682432798b..000000000000000 --- a/lldb/test/API/commands/target/dump-separate-debug-info/dwo/main.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "foo.h" - -int main() { return foo(); } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits