[llvm-branch-commits] [lldb] [lldb] Fix SBTarget::ReadInstruction with flavor (PR #136034)

2025-04-22 Thread Ebuka Ezike via llvm-branch-commits

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)

2025-04-27 Thread Ebuka Ezike via llvm-branch-commits

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)

2025-04-16 Thread Ebuka Ezike via llvm-branch-commits

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)

2025-07-15 Thread Ebuka Ezike via llvm-branch-commits

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)

2025-07-15 Thread Ebuka Ezike via llvm-branch-commits

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)

2025-07-15 Thread Ebuka Ezike via llvm-branch-commits

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