15ffd83dbSDimitry Andric //===-- SBBreakpointOptionCommon.cpp --------------------------------------===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric
9*0b57cec5SDimitry Andric #include "lldb/API/SBBreakpointName.h"
10*0b57cec5SDimitry Andric #include "lldb/API/SBBreakpointLocation.h"
11*0b57cec5SDimitry Andric #include "lldb/API/SBDebugger.h"
12*0b57cec5SDimitry Andric #include "lldb/API/SBEvent.h"
13*0b57cec5SDimitry Andric #include "lldb/API/SBProcess.h"
14*0b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
15*0b57cec5SDimitry Andric #include "lldb/API/SBStringList.h"
16*0b57cec5SDimitry Andric #include "lldb/API/SBThread.h"
17*0b57cec5SDimitry Andric
18*0b57cec5SDimitry Andric #include "lldb/Breakpoint/BreakpointName.h"
19*0b57cec5SDimitry Andric #include "lldb/Breakpoint/StoppointCallbackContext.h"
20*0b57cec5SDimitry Andric #include "lldb/Core/Address.h"
21*0b57cec5SDimitry Andric #include "lldb/Core/Debugger.h"
22*0b57cec5SDimitry Andric #include "lldb/Interpreter/CommandInterpreter.h"
23*0b57cec5SDimitry Andric #include "lldb/Interpreter/ScriptInterpreter.h"
24*0b57cec5SDimitry Andric #include "lldb/Target/Process.h"
25*0b57cec5SDimitry Andric #include "lldb/Target/Target.h"
26*0b57cec5SDimitry Andric #include "lldb/Target/Thread.h"
27*0b57cec5SDimitry Andric #include "lldb/Target/ThreadSpec.h"
2804eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h"
29*0b57cec5SDimitry Andric #include "lldb/Utility/Log.h"
30*0b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
31*0b57cec5SDimitry Andric
32*0b57cec5SDimitry Andric #include "lldb/lldb-enumerations.h"
33*0b57cec5SDimitry Andric
34*0b57cec5SDimitry Andric #include "SBBreakpointOptionCommon.h"
35*0b57cec5SDimitry Andric
36*0b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h"
37*0b57cec5SDimitry Andric
38*0b57cec5SDimitry Andric using namespace lldb;
39*0b57cec5SDimitry Andric using namespace lldb_private;
40*0b57cec5SDimitry Andric
SBBreakpointCallbackBaton(SBBreakpointHitCallback callback,void * baton)4104eeddc0SDimitry Andric SBBreakpointCallbackBaton::SBBreakpointCallbackBaton(
4204eeddc0SDimitry Andric SBBreakpointHitCallback callback, void *baton)
439dba64beSDimitry Andric : TypedBaton(std::make_unique<CallbackData>()) {
4404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, callback, baton);
45*0b57cec5SDimitry Andric getItem()->callback = callback;
46*0b57cec5SDimitry Andric getItem()->callback_baton = baton;
47*0b57cec5SDimitry Andric }
48*0b57cec5SDimitry Andric
PrivateBreakpointHitCallback(void * baton,StoppointCallbackContext * ctx,lldb::user_id_t break_id,lldb::user_id_t break_loc_id)4904eeddc0SDimitry Andric bool SBBreakpointCallbackBaton::PrivateBreakpointHitCallback(
5004eeddc0SDimitry Andric void *baton, StoppointCallbackContext *ctx, lldb::user_id_t break_id,
5104eeddc0SDimitry Andric lldb::user_id_t break_loc_id) {
5204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(baton, ctx, break_id, break_loc_id);
53*0b57cec5SDimitry Andric ExecutionContext exe_ctx(ctx->exe_ctx_ref);
54*0b57cec5SDimitry Andric BreakpointSP bp_sp(
55*0b57cec5SDimitry Andric exe_ctx.GetTargetRef().GetBreakpointList().FindBreakpointByID(break_id));
56*0b57cec5SDimitry Andric if (baton && bp_sp) {
57*0b57cec5SDimitry Andric CallbackData *data = (CallbackData *)baton;
58*0b57cec5SDimitry Andric lldb_private::Breakpoint *bp = bp_sp.get();
59*0b57cec5SDimitry Andric if (bp && data->callback) {
60*0b57cec5SDimitry Andric Process *process = exe_ctx.GetProcessPtr();
61*0b57cec5SDimitry Andric if (process) {
62*0b57cec5SDimitry Andric SBProcess sb_process(process->shared_from_this());
63*0b57cec5SDimitry Andric SBThread sb_thread;
64*0b57cec5SDimitry Andric SBBreakpointLocation sb_location;
65*0b57cec5SDimitry Andric assert(bp_sp);
66*0b57cec5SDimitry Andric sb_location.SetLocation(bp_sp->FindLocationByID(break_loc_id));
67*0b57cec5SDimitry Andric Thread *thread = exe_ctx.GetThreadPtr();
68*0b57cec5SDimitry Andric if (thread)
69*0b57cec5SDimitry Andric sb_thread.SetThread(thread->shared_from_this());
70*0b57cec5SDimitry Andric
71*0b57cec5SDimitry Andric return data->callback(data->callback_baton, sb_process, sb_thread,
72*0b57cec5SDimitry Andric sb_location);
73*0b57cec5SDimitry Andric }
74*0b57cec5SDimitry Andric }
75*0b57cec5SDimitry Andric }
76*0b57cec5SDimitry Andric return true; // Return true if we should stop at this breakpoint
77*0b57cec5SDimitry Andric }
78*0b57cec5SDimitry Andric
79*0b57cec5SDimitry Andric SBBreakpointCallbackBaton::~SBBreakpointCallbackBaton() = default;
80