[Lldb-commits] [lldb] Revert "[lldb] Implement delayed breakpoints (#192971)" (PR #195652)
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Mon May 4 06:23:27 PDT 2026
https://github.com/labath created https://github.com/llvm/llvm-project/pull/195652
and the follow-up in [lldb] Disable delayed breakpoints on Windows (#195241).
This makes lldb incompatible with stub which do not implement reference-counted breakpoints (see
https://github.com/llvm/llvm-project/pull/192971#issuecomment-4371375301 for more information).
This reverts commits 776ee6f0dd2f4bc87d565d642d95f399224a565f and f5eb7a9ef4c8832a99f696b22a00a55ba6718153.
>From a8b19f35c86b09c5719c98a614c67a8ebc230c2c Mon Sep 17 00:00:00 2001
From: Pavel Labath <pavel at labath.sk>
Date: Mon, 4 May 2026 15:17:04 +0200
Subject: [PATCH] Revert "[lldb] Implement delayed breakpoints (#192971)"
and the follow-up in [lldb] Disable delayed breakpoints on Windows (#195241).
This makes lldb incompatible with stub which do not implement
reference-counted breakpoints (see
https://github.com/llvm/llvm-project/pull/192971#issuecomment-4371375301
for more information).
This reverts commits 776ee6f0dd2f4bc87d565d642d95f399224a565f and
f5eb7a9ef4c8832a99f696b22a00a55ba6718153.
---
lldb/include/lldb/Target/Process.h | 46 -------
.../Process/MacOSX-Kernel/ProcessKDP.cpp | 4 +-
.../Process/Utility/StopInfoMachException.cpp | 8 +-
.../Process/Windows/Common/ProcessWindows.cpp | 2 +-
.../Process/Windows/Common/ProcessWindows.h | 2 -
.../Process/gdb-remote/ProcessGDBRemote.cpp | 12 +-
.../Process/scripted/ScriptedProcess.cpp | 2 +-
.../Process/scripted/ScriptedThread.cpp | 2 +-
lldb/source/Target/Process.cpp | 120 +-----------------
lldb/source/Target/TargetProperties.td | 5 -
.../Target/ThreadPlanStepOverBreakpoint.cpp | 6 +-
.../breakpoint/delayed_breakpoints/Makefile | 3 -
.../TestDelayedBreakpoint.py | 41 ------
.../breakpoint/delayed_breakpoints/main.c | 7 -
14 files changed, 21 insertions(+), 239 deletions(-)
delete mode 100644 lldb/test/API/functionalities/breakpoint/delayed_breakpoints/Makefile
delete mode 100644 lldb/test/API/functionalities/breakpoint/delayed_breakpoints/TestDelayedBreakpoint.py
delete mode 100644 lldb/test/API/functionalities/breakpoint/delayed_breakpoints/main.c
diff --git a/lldb/include/lldb/Target/Process.h b/lldb/include/lldb/Target/Process.h
index 67a9a883cd36c..fb06850d34a19 100644
--- a/lldb/include/lldb/Target/Process.h
+++ b/lldb/include/lldb/Target/Process.h
@@ -114,7 +114,6 @@ class ProcessProperties : public Properties {
Args GetAlwaysRunThreadNames() const;
FollowForkMode GetFollowForkMode() const;
bool TrackMemoryCacheChanges() const;
- bool GetUseDelayedBreakpoints() const;
protected:
Process *m_process; // Can be nullptr for global ProcessProperties
@@ -2247,9 +2246,6 @@ class Process : public std::enable_shared_from_this<Process>,
// Process Breakpoints
size_t GetSoftwareBreakpointTrapOpcode(BreakpointSite *bp_site);
- enum class BreakpointAction { Enable, Disable };
-
-protected:
virtual Status EnableBreakpointSite(BreakpointSite *bp_site) {
return Status::FromErrorStringWithFormatv(
"error: {0} does not support enabling breakpoints", GetPluginName());
@@ -2260,24 +2256,6 @@ class Process : public std::enable_shared_from_this<Process>,
"error: {0} does not support disabling breakpoints", GetPluginName());
}
- /// Compare BreakpointSiteSPs by ID, so that iteration order is independent
- /// of pointer addresses.
- struct SiteIDCmp {
- bool operator()(const lldb::BreakpointSiteSP &lhs,
- const lldb::BreakpointSiteSP &rhs) const {
- return lhs->GetID() < rhs->GetID();
- }
- };
- using BreakpointSiteToActionMap =
- std::map<lldb::BreakpointSiteSP, BreakpointAction, SiteIDCmp>;
-
- virtual llvm::Error
- UpdateBreakpointSites(const BreakpointSiteToActionMap &site_to_action);
-
-public:
- llvm::Error ExecuteBreakpointSiteAction(BreakpointSite &site,
- Process::BreakpointAction action);
-
// This is implemented completely using the lldb::Process API. Subclasses
// don't need to implement this function unless the standard flow of read
// existing opcode, write breakpoint opcode, verify breakpoint opcode doesn't
@@ -2308,15 +2286,6 @@ class Process : public std::enable_shared_from_this<Process>,
bool IsBreakpointSiteEnabled(const BreakpointSite &site);
- bool IsBreakpointSitePhysicallyEnabled(const BreakpointSite &site);
-
- /// Reports whether this process should delay physically enabling/disabling
- /// breakpoints until the process is about to resume. The default honors the
- /// user-facing `target.process.use-delayed-breakpoints` setting.
- virtual bool ShouldUseDelayedBreakpoints() const {
- return GetUseDelayedBreakpoints();
- }
-
// BreakpointLocations use RemoveConstituentFromBreakpointSite to remove
// themselves from the constituent's list of this breakpoint sites.
void RemoveConstituentFromBreakpointSite(lldb::user_id_t site_id,
@@ -3571,21 +3540,6 @@ void PruneThreadPlans();
/// GetExtendedCrashInformation.
StructuredData::DictionarySP m_crash_info_dict_sp;
- struct DelayedBreakpointCache {
- void Enqueue(lldb::BreakpointSiteSP site, BreakpointAction action);
- void RemoveSite(lldb::BreakpointSiteSP site) {
- m_site_to_action.erase(site);
- }
- void Clear() { m_site_to_action.clear(); }
-
- BreakpointSiteToActionMap m_site_to_action;
- };
-
- DelayedBreakpointCache m_delayed_breakpoints;
- std::recursive_mutex m_delayed_breakpoints_mutex;
-
- llvm::Error FlushDelayedBreakpoints();
-
size_t RemoveBreakpointOpcodesFromBuffer(lldb::addr_t addr, size_t size,
uint8_t *buf) const;
diff --git a/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp b/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
index 6166096a4e1d3..b4598a422e579 100644
--- a/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
+++ b/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
@@ -633,7 +633,7 @@ Status ProcessKDP::EnableBreakpointSite(BreakpointSite *bp_site) {
if (m_comm.LocalBreakpointsAreSupported()) {
Status error;
- if (!IsBreakpointSitePhysicallyEnabled(*bp_site)) {
+ if (!IsBreakpointSiteEnabled(*bp_site)) {
if (m_comm.SendRequestBreakpoint(true, bp_site->GetLoadAddress())) {
SetBreakpointSiteEnabled(*bp_site);
bp_site->SetType(BreakpointSite::eExternal);
@@ -649,7 +649,7 @@ Status ProcessKDP::EnableBreakpointSite(BreakpointSite *bp_site) {
Status ProcessKDP::DisableBreakpointSite(BreakpointSite *bp_site) {
if (m_comm.LocalBreakpointsAreSupported()) {
Status error;
- if (IsBreakpointSitePhysicallyEnabled(*bp_site)) {
+ if (IsBreakpointSiteEnabled(*bp_site)) {
BreakpointSite::Type bp_type = bp_site->GetType();
if (bp_type == BreakpointSite::eExternal) {
if (m_destroy_in_process && m_comm.IsRunning()) {
diff --git a/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp b/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp
index 5fbc1f62a065f..deb95d9a03ca3 100644
--- a/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp
+++ b/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp
@@ -636,7 +636,7 @@ StopInfoSP StopInfoMachException::CreateStopReasonWithMachException(
addr_t pc = reg_ctx_sp->GetPC();
BreakpointSiteSP bp_site_sp =
process_sp->GetBreakpointSiteList().FindByAddress(pc);
- if (bp_site_sp && process_sp->IsBreakpointSitePhysicallyEnabled(*bp_site_sp))
+ if (bp_site_sp && process_sp->IsBreakpointSiteEnabled(*bp_site_sp))
thread.SetThreadStoppedAtUnexecutedBP(pc);
switch (exc_type) {
@@ -771,8 +771,7 @@ StopInfoSP StopInfoMachException::CreateStopReasonWithMachException(
if (!bp_site_sp && reg_ctx_sp) {
bp_site_sp = process_sp->GetBreakpointSiteList().FindByAddress(pc);
}
- if (bp_site_sp &&
- process_sp->IsBreakpointSitePhysicallyEnabled(*bp_site_sp)) {
+ if (bp_site_sp && process_sp->IsBreakpointSiteEnabled(*bp_site_sp)) {
// We've hit this breakpoint, whether it was intended for this thread
// or not. Clear this in the Tread object so we step past it on resume.
thread.SetThreadHitBreakpointSite();
@@ -866,8 +865,7 @@ bool StopInfoMachException::WasContinueInterrupted(Thread &thread) {
// We have a hardware breakpoint -- this is the kernel bug.
auto &bp_site_list = process_sp->GetBreakpointSiteList();
for (auto &site : bp_site_list.Sites()) {
- if (site->IsHardware() &&
- process_sp->IsBreakpointSitePhysicallyEnabled(*site)) {
+ if (site->IsHardware() && process_sp->IsBreakpointSiteEnabled(*site)) {
LLDB_LOGF(log,
"Thread stopped with insn-step completed mach exception but "
"thread was not stepping; there is a hardware breakpoint set.");
diff --git a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp
index 28b5554069c90..c41547a2c0961 100644
--- a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp
+++ b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp
@@ -415,7 +415,7 @@ void ProcessWindows::RefreshStateAfterStop() {
// If we're at a BreakpointSite, mark this as an Unexecuted Breakpoint.
// We'll clear that state if we've actually executed the breakpoint.
BreakpointSiteSP site(GetBreakpointSiteList().FindByAddress(pc));
- if (site && IsBreakpointSitePhysicallyEnabled(*site))
+ if (site && IsBreakpointSiteEnabled(*site))
stop_thread->SetThreadStoppedAtUnexecutedBP(pc);
switch (active_exception->GetExceptionCode()) {
diff --git a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.h b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.h
index 228619d0e3d5e..c1478dd30c4d2 100644
--- a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.h
+++ b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.h
@@ -44,8 +44,6 @@ class ProcessWindows : public Process, public ProcessDebugger {
Status EnableBreakpointSite(BreakpointSite *bp_site) override;
Status DisableBreakpointSite(BreakpointSite *bp_site) override;
- bool ShouldUseDelayedBreakpoints() const override { return false; }
-
Status DoDetach(bool keep_stopped) override;
Status DoLaunch(Module *exe_module, ProcessLaunchInfo &launch_info) override;
Status DoAttachToProcessWithID(
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index adf108919b36e..e8f32c564ee03 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -1848,7 +1848,7 @@ ThreadSP ProcessGDBRemote::SetThreadStopInfo(
addr_t pc = thread_sp->GetRegisterContext()->GetPC();
BreakpointSiteSP bp_site_sp =
thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
- if (bp_site_sp && IsBreakpointSitePhysicallyEnabled(*bp_site_sp))
+ if (bp_site_sp && IsBreakpointSiteEnabled(*bp_site_sp))
thread_sp->SetThreadStoppedAtUnexecutedBP(pc);
if (exc_type != 0) {
@@ -2032,7 +2032,7 @@ ThreadSP ProcessGDBRemote::SetThreadStopInfo(
// BreakpointSites in any other location, but we can't know for
// sure what happened so it's a reasonable default.
if (bp_site_sp) {
- if (IsBreakpointSitePhysicallyEnabled(*bp_site_sp))
+ if (IsBreakpointSiteEnabled(*bp_site_sp))
thread_sp->SetThreadHitBreakpointSite();
if (bp_site_sp->ValidForThisThread(*thread_sp)) {
@@ -3429,7 +3429,7 @@ Status ProcessGDBRemote::EnableBreakpointSite(BreakpointSite *bp_site) {
site_id, (uint64_t)addr);
// Breakpoint already exists and is enabled
- if (IsBreakpointSitePhysicallyEnabled(*bp_site)) {
+ if (IsBreakpointSiteEnabled(*bp_site)) {
LLDB_LOGF(log,
"ProcessGDBRemote::EnableBreakpointSite (size_id = %" PRIu64
") address = 0x%" PRIx64 " -- SUCCESS (already enabled)",
@@ -3450,7 +3450,7 @@ Status ProcessGDBRemote::DisableBreakpointSite(BreakpointSite *bp_site) {
") addr = 0x%8.8" PRIx64,
site_id, (uint64_t)addr);
- if (!IsBreakpointSitePhysicallyEnabled(*bp_site)) {
+ if (!IsBreakpointSiteEnabled(*bp_site)) {
LLDB_LOGF(log,
"ProcessGDBRemote::DisableBreakpointSite (site_id = %" PRIu64
") addr = 0x%8.8" PRIx64 " -- SUCCESS (already disabled)",
@@ -6112,7 +6112,7 @@ void ProcessGDBRemote::DidForkSwitchSoftwareBreakpoints(
GetBreakpointSiteList().ForEach([this, enable, entry_addr,
log](BreakpointSite *bp_site) {
- if (IsBreakpointSitePhysicallyEnabled(*bp_site) &&
+ if (IsBreakpointSiteEnabled(*bp_site) &&
(bp_site->GetType() == BreakpointSite::eSoftware ||
bp_site->GetType() == BreakpointSite::eExternal)) {
// During expression evaluation, retain the expression-return trap
@@ -6136,7 +6136,7 @@ void ProcessGDBRemote::DidForkSwitchSoftwareBreakpoints(
void ProcessGDBRemote::DidForkSwitchHardwareTraps(bool enable) {
if (m_gdb_comm.SupportsGDBStoppointPacket(eBreakpointHardware)) {
GetBreakpointSiteList().ForEach([this, enable](BreakpointSite *bp_site) {
- if (IsBreakpointSitePhysicallyEnabled(*bp_site) &&
+ if (IsBreakpointSiteEnabled(*bp_site) &&
bp_site->GetType() == BreakpointSite::eHardware) {
m_gdb_comm.SendGDBStoppointTypePacket(
eBreakpointHardware, enable, bp_site->GetLoadAddress(),
diff --git a/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp b/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp
index c254a6841b707..ac0f451a3d5fa 100644
--- a/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp
+++ b/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp
@@ -265,7 +265,7 @@ size_t ScriptedProcess::DoWriteMemory(lldb::addr_t vm_addr, const void *buf,
Status ScriptedProcess::EnableBreakpointSite(BreakpointSite *bp_site) {
assert(bp_site != nullptr);
- if (IsBreakpointSitePhysicallyEnabled(*bp_site)) {
+ if (IsBreakpointSiteEnabled(*bp_site)) {
return {};
}
diff --git a/lldb/source/Plugins/Process/scripted/ScriptedThread.cpp b/lldb/source/Plugins/Process/scripted/ScriptedThread.cpp
index d11d134295579..35774cfa01742 100644
--- a/lldb/source/Plugins/Process/scripted/ScriptedThread.cpp
+++ b/lldb/source/Plugins/Process/scripted/ScriptedThread.cpp
@@ -316,7 +316,7 @@ bool ScriptedThread::CalculateStopInfo() {
ProcessSP proc = GetProcess();
if (BreakpointSiteSP bp_site_sp =
proc->GetBreakpointSiteList().FindByAddress(pc))
- if (proc->IsBreakpointSitePhysicallyEnabled(*bp_site_sp))
+ if (proc->IsBreakpointSiteEnabled(*bp_site_sp))
SetThreadStoppedAtUnexecutedBP(pc);
}
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index 114bbd7355f0c..58c41c2584676 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -79,17 +79,6 @@ using namespace lldb;
using namespace lldb_private;
using namespace std::chrono;
-void Process::DelayedBreakpointCache::Enqueue(lldb::BreakpointSiteSP site,
- BreakpointAction action) {
- auto [previous, inserted] = m_site_to_action.insert({site, action});
- // New site or already enqueued for the same action.
- if (inserted || previous->second == action)
- return;
- // Previously enqueued for the opposite action, don't update the site.
- m_site_to_action.erase(previous);
- assert(site->m_enabled == (action == BreakpointAction::Enable));
-}
-
class ProcessOptionValueProperties
: public Cloneable<ProcessOptionValueProperties, OptionValueProperties> {
public:
@@ -333,12 +322,6 @@ bool ProcessProperties::GetStopOnExec() const {
idx, g_process_properties[idx].default_uint_value != 0);
}
-bool ProcessProperties::GetUseDelayedBreakpoints() const {
- const uint32_t idx = ePropertyUseDelayedBreakpoints;
- return GetPropertyAtIndexAs<bool>(
- idx, g_process_properties[idx].default_uint_value != 0);
-}
-
std::chrono::seconds ProcessProperties::GetUtilityExpressionTimeout() const {
const uint32_t idx = ePropertyUtilityExpressionTimeout;
uint64_t value = GetPropertyAtIndexAs<uint64_t>(
@@ -1563,8 +1546,7 @@ Process::GetBreakpointSiteList() const {
void Process::DisableAllBreakpointSites() {
m_breakpoint_site_list.ForEach([this](BreakpointSite *bp_site) -> void {
- llvm::consumeError(
- ExecuteBreakpointSiteAction(*bp_site, BreakpointAction::Disable));
+ DisableBreakpointSite(bp_site);
});
}
@@ -1582,8 +1564,7 @@ Status Process::DisableBreakpointSiteByID(lldb::user_id_t break_id) {
BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID(break_id);
if (bp_site_sp) {
if (IsBreakpointSiteEnabled(*bp_site_sp))
- error = Status::FromError(
- ExecuteBreakpointSiteAction(*bp_site_sp, BreakpointAction::Disable));
+ error = DisableBreakpointSite(bp_site_sp.get());
} else {
error = Status::FromErrorStringWithFormat(
"invalid breakpoint site ID: %" PRIu64, break_id);
@@ -1592,40 +1573,12 @@ Status Process::DisableBreakpointSiteByID(lldb::user_id_t break_id) {
return error;
}
-llvm::Error Process::ExecuteBreakpointSiteAction(BreakpointSite &site,
- BreakpointAction action) {
- auto site_sp = site.shared_from_this();
- std::unique_lock<std::recursive_mutex> guard(m_delayed_breakpoints_mutex);
-
- // Ignore requests that won't change the Site status.
- if (IsBreakpointSiteEnabled(*site_sp) == (action == BreakpointAction::Enable))
- return llvm::Error::success();
-
- if (ShouldUseDelayedBreakpoints()) {
- m_delayed_breakpoints.Enqueue(site_sp, action);
- return llvm::Error::success();
- }
-
- m_delayed_breakpoints.RemoveSite(site_sp);
- guard.unlock();
-
- switch (action) {
- case BreakpointAction::Enable:
- return EnableBreakpointSite(site_sp.get()).takeError();
- case BreakpointAction::Disable:
- return DisableBreakpointSite(site_sp.get()).takeError();
- }
-
- llvm_unreachable("Unhandled BreakpointAction");
-}
-
Status Process::EnableBreakpointSiteByID(lldb::user_id_t break_id) {
Status error;
BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID(break_id);
if (bp_site_sp) {
if (!IsBreakpointSiteEnabled(*bp_site_sp))
- error = Status::FromError(
- ExecuteBreakpointSiteAction(*bp_site_sp, BreakpointAction::Enable));
+ error = EnableBreakpointSite(bp_site_sp.get());
} else {
error = Status::FromErrorStringWithFormat(
"invalid breakpoint site ID: %" PRIu64, break_id);
@@ -1634,20 +1587,6 @@ Status Process::EnableBreakpointSiteByID(lldb::user_id_t break_id) {
}
bool Process::IsBreakpointSiteEnabled(const BreakpointSite &site) {
- std::lock_guard<std::recursive_mutex> guard(m_delayed_breakpoints_mutex);
-
- // `site` won't be mutated, but the cache stores mutable pointers.
- auto it = m_delayed_breakpoints.m_site_to_action.find(
- const_cast<BreakpointSite &>(site).shared_from_this());
-
- // If no actions are delayed, use the current state of the site.
- if (it == m_delayed_breakpoints.m_site_to_action.end())
- return site.m_enabled;
-
- return it->second == BreakpointAction::Enable;
-}
-
-bool Process::IsBreakpointSitePhysicallyEnabled(const BreakpointSite &site) {
return site.m_enabled;
}
@@ -1709,35 +1648,6 @@ static addr_t ComputeConstituentLoadAddress(BreakpointLocation &constituent,
return resolved_address.GetOpcodeLoadAddress(&target);
}
-llvm::Error Process::FlushDelayedBreakpoints() {
- std::unique_lock<std::recursive_mutex> guard(m_delayed_breakpoints_mutex);
-
- // Clear the cache in m_delayed_breakpoints so it can't affect the actual
- // enabling of breakpoints. For example, if `EnableSoftwareBreakpoint` is
- // called outside of FlushDelayedBreakpoints, it needs to check the delayed
- // breakpoints and possibly early return. However, when called from
- // FlushDelayedBreakpoints, the queue better be empty so that no early returns
- // take place.
- auto site_to_action = std::move(m_delayed_breakpoints.m_site_to_action);
- m_delayed_breakpoints.m_site_to_action.clear();
-
- guard.unlock();
- // Use a copy of the cache so that iteration is safe.
- return UpdateBreakpointSites(site_to_action);
-}
-
-llvm::Error Process::UpdateBreakpointSites(
- const BreakpointSiteToActionMap &site_to_action) {
- llvm::Error error = llvm::Error::success();
- for (auto [site, action] : site_to_action) {
- Status new_error = action == BreakpointAction::Enable
- ? EnableBreakpointSite(site.get())
- : DisableBreakpointSite(site.get());
- error = llvm::joinErrors(std::move(error), new_error.takeError());
- }
- return error;
-}
-
lldb::break_id_t
Process::CreateBreakpointSite(const BreakpointLocationSP &constituent,
bool use_hardware) {
@@ -1757,15 +1667,7 @@ Process::CreateBreakpointSite(const BreakpointLocationSP &constituent,
BreakpointSiteSP bp_site_sp(
new BreakpointSite(constituent, load_addr, use_hardware));
-
- bool bp_from_address =
- constituent->GetBreakpoint().GetResolver()->GetResolverTy() ==
- BreakpointResolver::ResolverTy::AddressResolver;
- bool should_be_eager = use_hardware || bp_from_address;
-
- auto error = should_be_eager ? EnableBreakpointSite(bp_site_sp.get())
- : Status::FromError(ExecuteBreakpointSiteAction(
- *bp_site_sp, BreakpointAction::Enable));
+ Status error = EnableBreakpointSite(bp_site_sp.get());
if (error.Success()) {
constituent->SetBreakpointSite(bp_site_sp);
return m_breakpoint_site_list.Add(bp_site_sp);
@@ -1790,8 +1692,7 @@ void Process::RemoveConstituentFromBreakpointSite(
if (num_constituents == 0) {
// Don't try to disable the site if we don't have a live process anymore.
if (IsAlive())
- llvm::consumeError(
- ExecuteBreakpointSiteAction(*bp_site_sp, BreakpointAction::Disable));
+ DisableBreakpointSite(bp_site_sp.get());
m_breakpoint_site_list.RemoveByAddress(bp_site_sp->GetLoadAddress());
}
}
@@ -3534,9 +3435,6 @@ Status Process::PrivateResume() {
"Process::PrivateResume PreResumeActions failed, not resuming.");
} else {
m_mod_id.BumpResumeID();
- if (auto E = FlushDelayedBreakpoints())
- LLDB_LOG_ERROR(log, std::move(E),
- "Failed to update some delayed breakpoints: {0}");
error = DoResume(direction);
if (error.Success()) {
DidResume();
@@ -3743,10 +3641,6 @@ Status Process::Detach(bool keep_stopped) {
m_thread_list.DiscardThreadPlans();
DisableAllBreakpointSites();
- if (auto error = FlushDelayedBreakpoints())
- LLDB_LOG_ERROR(
- GetLog(LLDBLog::Process), std::move(error),
- "Failed to update some delayed breakpoints during detach: {0}");
error = DoDetach(keep_stopped);
if (error.Success()) {
@@ -3816,10 +3710,6 @@ Status Process::DestroyImpl(bool force_kill) {
// doing this now.
m_thread_list.DiscardThreadPlans();
DisableAllBreakpointSites();
- if (auto error = FlushDelayedBreakpoints())
- LLDB_LOG_ERROR(
- GetLog(LLDBLog::Process), std::move(error),
- "Failed to update some delayed breakpoints during destroy: {0}");
}
error = DoDestroy();
diff --git a/lldb/source/Target/TargetProperties.td b/lldb/source/Target/TargetProperties.td
index 23a1bb0b3ce4a..223a12e059258 100644
--- a/lldb/source/Target/TargetProperties.td
+++ b/lldb/source/Target/TargetProperties.td
@@ -319,11 +319,6 @@ let Definition = "process", Path = "target.process" in {
Desc<"A list of thread names. Threads with any of these names will "
"always be resumed when the process resumes, even when other "
"threads are suspended during single-stepping operations.">;
- def UseDelayedBreakpoints
- : Property<"use-delayed-breakpoints", "Boolean">,
- DefaultTrue,
- Desc<"Specify whether updating breakpoints may be delayed until the "
- "process is about to resume.">;
}
let Definition = "platform", Path = "platform" in {
diff --git a/lldb/source/Target/ThreadPlanStepOverBreakpoint.cpp b/lldb/source/Target/ThreadPlanStepOverBreakpoint.cpp
index 878aba2634f49..572454f9b897a 100644
--- a/lldb/source/Target/ThreadPlanStepOverBreakpoint.cpp
+++ b/lldb/source/Target/ThreadPlanStepOverBreakpoint.cpp
@@ -121,8 +121,7 @@ bool ThreadPlanStepOverBreakpoint::DoWillResume(StateType resume_state,
BreakpointSiteSP bp_site_sp(
m_process.GetBreakpointSiteList().FindByAddress(m_breakpoint_addr));
if (bp_site_sp && m_process.IsBreakpointSiteEnabled(*bp_site_sp)) {
- llvm::consumeError(m_process.ExecuteBreakpointSiteAction(
- *bp_site_sp, Process::BreakpointAction::Disable));
+ m_process.DisableBreakpointSite(bp_site_sp.get());
m_reenabled_breakpoint_site = false;
}
}
@@ -168,8 +167,7 @@ void ThreadPlanStepOverBreakpoint::ReenableBreakpointSite() {
if (BreakpointSiteSP bp_site_sp =
m_process.GetBreakpointSiteList().FindByAddress(
m_breakpoint_addr))
- llvm::consumeError(m_process.ExecuteBreakpointSiteAction(
- *bp_site_sp, Process::BreakpointAction::Enable));
+ m_process.EnableBreakpointSite(bp_site_sp.get());
}
}
}
diff --git a/lldb/test/API/functionalities/breakpoint/delayed_breakpoints/Makefile b/lldb/test/API/functionalities/breakpoint/delayed_breakpoints/Makefile
deleted file mode 100644
index 10495940055b6..0000000000000
--- a/lldb/test/API/functionalities/breakpoint/delayed_breakpoints/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-C_SOURCES := main.c
-
-include Makefile.rules
diff --git a/lldb/test/API/functionalities/breakpoint/delayed_breakpoints/TestDelayedBreakpoint.py b/lldb/test/API/functionalities/breakpoint/delayed_breakpoints/TestDelayedBreakpoint.py
deleted file mode 100644
index 70a28bb935027..0000000000000
--- a/lldb/test/API/functionalities/breakpoint/delayed_breakpoints/TestDelayedBreakpoint.py
+++ /dev/null
@@ -1,41 +0,0 @@
-import lldb
-from lldbsuite.test.decorators import *
-from lldbsuite.test.lldbtest import *
-from lldbsuite.test import lldbutil
-import os
-
-
- at skipIfWindows
-class TestDelayedBreakpoint(TestBase):
- def test(self):
- self.build()
- logfile = os.path.join(self.getBuildDir(), "log.txt")
- self.runCmd(f"log enable -f {logfile} gdb-remote packets")
-
- target, process, _, _ = lldbutil.run_to_source_breakpoint(
- self, "main", lldb.SBFileSpec("main.c")
- )
-
- self.runCmd(f"proc plugin packet send BEFORE_BPS", check=False)
-
- breakpoint = target.BreakpointCreateByLocation("main.c", 1)
- self.assertGreater(breakpoint.GetNumResolvedLocations(), 0)
-
- self.runCmd(f"proc plugin packet send AFTER_BPS", check=False)
-
- lldbutil.continue_to_breakpoint(process, breakpoint)
- self.runCmd(f"log disable all")
-
- self.runCmd(f"proc plugin packet send AFTER_CONTINUE", check=False)
-
- self.assertTrue(os.path.exists(logfile))
- log_text = open(logfile).read()
-
- log_before_continue = log_text.split("BEFORE_BPS", 1)[-1].split("AFTER_BPS", 1)[
- 0
- ]
- self.assertNotIn("send packet: $Z", log_before_continue)
- self.assertNotIn("send packet: $z", log_before_continue)
-
- log_after = log_text.split("AFTER_BPS", 1)[-1].split("AFTER_CONTINUE", 1)[0]
- self.assertIn("send packet: $Z", log_after)
diff --git a/lldb/test/API/functionalities/breakpoint/delayed_breakpoints/main.c b/lldb/test/API/functionalities/breakpoint/delayed_breakpoints/main.c
deleted file mode 100644
index a9086f89af86a..0000000000000
--- a/lldb/test/API/functionalities/breakpoint/delayed_breakpoints/main.c
+++ /dev/null
@@ -1,7 +0,0 @@
-int break_on_me() {
- int i = 10; // breakhere
- i++;
- return i; // secondbreak
-}
-
-int main() { return break_on_me(); }
More information about the lldb-commits
mailing list