[llvm-branch-commits] [lldb] [lldb] Fix SBTarget::ReadInstruction with flavor (PR #136034)
da-viper wrote: @JDevlieghere I do not have the right permission to merge this to the 20.X branch as it is protected. https://github.com/llvm/llvm-project/pull/136034 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [lldb] [lldb] Fix SBTarget::ReadInstruction with flavor (PR #136034)
da-viper wrote: Fix crash when calling `SBTarget::GetInstruction()` with the flavor parameter. https://github.com/llvm/llvm-project/pull/136034 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [lldb] [lldb] Fix SBTarget::ReadInstruction with flavor (PR #136034)
https://github.com/da-viper created https://github.com/llvm/llvm-project/pull/136034 Backported #134626 to 20.X >From be595e63f7050a204e5c588e656c5b6e40fb024b Mon Sep 17 00:00:00 2001 From: Ebuka Ezike Date: Fri, 11 Apr 2025 13:45:19 +0100 Subject: [PATCH 1/2] [lldb] Fix SBTarget::ReadInstruction with flavor (#134626) When you call the `SBTarget::ReadInstructions` with flavor from lldb crashes. This is because the wrong order of the `DisassemblyBytes` constructor this fixes that - Signed-off-by: Ebuka Ezike --- lldb/source/API/SBTarget.cpp | 6 +-- .../target/read-instructions-flavor/Makefile | 3 ++ .../TestTargetReadInstructionsFlavor.py | 39 +++ .../target/read-instructions-flavor/main.c| 21 ++ 4 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 lldb/test/API/python_api/target/read-instructions-flavor/Makefile create mode 100644 lldb/test/API/python_api/target/read-instructions-flavor/TestTargetReadInstructionsFlavor.py create mode 100644 lldb/test/API/python_api/target/read-instructions-flavor/main.c diff --git a/lldb/source/API/SBTarget.cpp b/lldb/source/API/SBTarget.cpp index 2a33161bc21ed..665b903aff79d 100644 --- a/lldb/source/API/SBTarget.cpp +++ b/lldb/source/API/SBTarget.cpp @@ -2020,9 +2020,9 @@ lldb::SBInstructionList SBTarget::ReadInstructions(lldb::SBAddress base_addr, error, force_live_memory, &load_addr); const bool data_from_file = load_addr == LLDB_INVALID_ADDRESS; sb_instructions.SetDisassembler(Disassembler::DisassembleBytes( - target_sp->GetArchitecture(), nullptr, target_sp->GetDisassemblyCPU(), - target_sp->GetDisassemblyFeatures(), flavor_string, *addr_ptr, - data.GetBytes(), bytes_read, count, data_from_file)); + target_sp->GetArchitecture(), nullptr, flavor_string, + target_sp->GetDisassemblyCPU(), target_sp->GetDisassemblyFeatures(), + *addr_ptr, data.GetBytes(), bytes_read, count, data_from_file)); } } diff --git a/lldb/test/API/python_api/target/read-instructions-flavor/Makefile b/lldb/test/API/python_api/target/read-instructions-flavor/Makefile new file mode 100644 index 0..10495940055b6 --- /dev/null +++ b/lldb/test/API/python_api/target/read-instructions-flavor/Makefile @@ -0,0 +1,3 @@ +C_SOURCES := main.c + +include Makefile.rules diff --git a/lldb/test/API/python_api/target/read-instructions-flavor/TestTargetReadInstructionsFlavor.py b/lldb/test/API/python_api/target/read-instructions-flavor/TestTargetReadInstructionsFlavor.py new file mode 100644 index 0..40edc57df21ce --- /dev/null +++ b/lldb/test/API/python_api/target/read-instructions-flavor/TestTargetReadInstructionsFlavor.py @@ -0,0 +1,39 @@ +""" +Test SBTarget Read Instruction. +""" + +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * + + +class TargetReadInstructionsFlavor(TestBase): +@skipIf(archs=no_match(["x86_64", "x86", "i386"]), oslist=["windows"]) +def test_read_instructions_with_flavor(self): +self.build() +executable = self.getBuildArtifact("a.out") + +# create a target +target = self.dbg.CreateTarget(executable) +self.assertTrue(target.IsValid(), "target is not valid") + +functions = target.FindFunctions("test_add") +self.assertEqual(len(functions), 1) +test_add = functions[0] + +test_add_symbols = test_add.GetSymbol() +self.assertTrue( +test_add_symbols.IsValid(), "test_add function symbols is not valid" +) + +expected_instructions = (("mov", "eax, edi"), ("add", "eax, esi"), ("ret", "")) +test_add_insts = test_add_symbols.GetInstructions(target, "intel") +# clang adds an extra nop instruction but gcc does not. It makes more sense +# to check if it is at least 3 +self.assertLessEqual(len(expected_instructions), len(test_add_insts)) + +# compares only the expected instructions +for expected_instr, instr in zip(expected_instructions, test_add_insts): +self.assertTrue(instr.IsValid(), "instruction is not valid") +expected_mnemonic, expected_op_str = expected_instr +self.assertEqual(instr.GetMnemonic(target), expected_mnemonic) +self.assertEqual(instr.GetOperands(target), expected_op_str) diff --git a/lldb/test/API/python_api/target/read-instructions-flavor/main.c b/lldb/test/API/python_api/target/read-instructions-flavor/main.c new file mode 100644 index 0..6022d63fb6ed7 --- /dev/null +++ b/lldb/test/API/python_api/target/read-instructions-flavor/main.c @@ -0,0 +1,21 @@ + +// This simple program is to test the lldb Python API SBTarget ReadInstruction +// function. +// +// When the target is create we get all the instructions using the intel +// flavor and see if it is correct. + +int test_add(int a, int b); + +__a
[llvm-branch-commits] [lldb] [lldb-dap] fix crash if disconnect request is not sent. (PR #148878)
https://github.com/da-viper updated https://github.com/llvm/llvm-project/pull/148878 >From 5087ed54b6f1e81493524cca00500f615b1d8754 Mon Sep 17 00:00:00 2001 From: Ebuka Ezike Date: Tue, 15 Jul 2025 16:56:03 +0100 Subject: [PATCH] [lldb-dap] fix crash if disconnect request is not sent. It crashes because the event_thread and progress_event_thread not joined before calling DAP struct deconstructor. It now joins when we leave the main loop. --- lldb/tools/lldb-dap/DAP.cpp | 12 lldb/tools/lldb-dap/lldb-dap.cpp | 9 - 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp index a67abe582abd4..134ddaa4c8f59 100644 --- a/lldb/tools/lldb-dap/DAP.cpp +++ b/lldb/tools/lldb-dap/DAP.cpp @@ -22,6 +22,7 @@ #include "lldb/lldb-defines.h" #include "lldb/lldb-enumerations.h" #include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/Twine.h" #include "llvm/Support/Error.h" @@ -224,6 +225,16 @@ llvm::Error DAP::ConfigureIO(std::FILE *overrideOut, std::FILE *overrideErr) { void DAP::StopIO() { out.Stop(); err.Stop(); + + if (event_thread.joinable()) { +broadcaster.BroadcastEventByType(eBroadcastBitStopEventThread); +event_thread.join(); + } + + if (progress_event_thread.joinable()) { +broadcaster.BroadcastEventByType(eBroadcastBitStopProgressThread); +progress_event_thread.join(); + } } // Send the JSON in "json_str" to the "out" stream. Correctly send the @@ -794,6 +805,7 @@ bool DAP::HandleObject(const llvm::json::Object &object) { } llvm::Error DAP::Loop() { + auto stop_io = llvm::make_scope_exit([this]() { StopIO(); }); while (!disconnecting) { llvm::json::Object object; lldb_dap::PacketStatus status = GetNextObject(object); diff --git a/lldb/tools/lldb-dap/lldb-dap.cpp b/lldb/tools/lldb-dap/lldb-dap.cpp index 9e0e7f21ce4fc..02688fc858f6b 100644 --- a/lldb/tools/lldb-dap/lldb-dap.cpp +++ b/lldb/tools/lldb-dap/lldb-dap.cpp @@ -1096,15 +1096,6 @@ void request_disconnect(DAP &dap, const llvm::json::Object &request) { } SendTerminatedEvent(dap); dap.SendJSON(llvm::json::Value(std::move(response))); - if (dap.event_thread.joinable()) { -dap.broadcaster.BroadcastEventByType(eBroadcastBitStopEventThread); -dap.event_thread.join(); - } - if (dap.progress_event_thread.joinable()) { -dap.broadcaster.BroadcastEventByType(eBroadcastBitStopProgressThread); -dap.progress_event_thread.join(); - } - dap.StopIO(); dap.disconnecting = true; } ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [lldb] [lldb-dap] fix crash if disconnect request is not sent. (PR #148878)
https://github.com/da-viper created https://github.com/llvm/llvm-project/pull/148878 It crashes because the event_thread and progress_event_thread not joined before calling `DAP` struct deconstructor. It now joins when we leave the `DAP::Loop` function. from [Discourse](https://discourse.llvm.org/t/is-lldb-dap-usable/87320) >From 3dcb5fffc21e9f9c44f4d03b4ee0cc27c8cfd9d2 Mon Sep 17 00:00:00 2001 From: Ebuka Ezike Date: Tue, 15 Jul 2025 16:56:03 +0100 Subject: [PATCH] [lldb-dap] fix crash if disconnect request is not sent. It crashes because the event_thread and progress_event_thread not joined before calling DAP struct deconstructor. It now joins when we leave the main loop. --- lldb/tools/lldb-dap/DAP.cpp | 12 lldb/tools/lldb-dap/lldb-dap.cpp | 9 - 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp index a67abe582abd4..134ddaa4c8f59 100644 --- a/lldb/tools/lldb-dap/DAP.cpp +++ b/lldb/tools/lldb-dap/DAP.cpp @@ -22,6 +22,7 @@ #include "lldb/lldb-defines.h" #include "lldb/lldb-enumerations.h" #include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/Twine.h" #include "llvm/Support/Error.h" @@ -224,6 +225,16 @@ llvm::Error DAP::ConfigureIO(std::FILE *overrideOut, std::FILE *overrideErr) { void DAP::StopIO() { out.Stop(); err.Stop(); + + if (event_thread.joinable()) { +broadcaster.BroadcastEventByType(eBroadcastBitStopEventThread); +event_thread.join(); + } + + if (progress_event_thread.joinable()) { +broadcaster.BroadcastEventByType(eBroadcastBitStopProgressThread); +progress_event_thread.join(); + } } // Send the JSON in "json_str" to the "out" stream. Correctly send the @@ -794,6 +805,7 @@ bool DAP::HandleObject(const llvm::json::Object &object) { } llvm::Error DAP::Loop() { + auto stop_io = llvm::make_scope_exit([this]() { StopIO(); }); while (!disconnecting) { llvm::json::Object object; lldb_dap::PacketStatus status = GetNextObject(object); diff --git a/lldb/tools/lldb-dap/lldb-dap.cpp b/lldb/tools/lldb-dap/lldb-dap.cpp index 9e0e7f21ce4fc..02688fc858f6b 100644 --- a/lldb/tools/lldb-dap/lldb-dap.cpp +++ b/lldb/tools/lldb-dap/lldb-dap.cpp @@ -1096,15 +1096,6 @@ void request_disconnect(DAP &dap, const llvm::json::Object &request) { } SendTerminatedEvent(dap); dap.SendJSON(llvm::json::Value(std::move(response))); - if (dap.event_thread.joinable()) { -dap.broadcaster.BroadcastEventByType(eBroadcastBitStopEventThread); -dap.event_thread.join(); - } - if (dap.progress_event_thread.joinable()) { -dap.broadcaster.BroadcastEventByType(eBroadcastBitStopProgressThread); -dap.progress_event_thread.join(); - } - dap.StopIO(); dap.disconnecting = true; } ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [lldb] [lldb-dap] fix crash if disconnect request is not sent. (PR #148878)
https://github.com/da-viper milestoned https://github.com/llvm/llvm-project/pull/148878 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits