1*0b57cec5SDimitry 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/Core/StreamFile.h"
23*0b57cec5SDimitry Andric #include "lldb/Interpreter/CommandInterpreter.h"
24*0b57cec5SDimitry Andric #include "lldb/Interpreter/ScriptInterpreter.h"
25*0b57cec5SDimitry Andric #include "lldb/Target/Process.h"
26*0b57cec5SDimitry Andric #include "lldb/Target/Target.h"
27*0b57cec5SDimitry Andric #include "lldb/Target/Thread.h"
28*0b57cec5SDimitry Andric #include "lldb/Target/ThreadSpec.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)41*0b57cec5SDimitry Andric SBBreakpointCallbackBaton::SBBreakpointCallbackBaton(SBBreakpointHitCallback
42*0b57cec5SDimitry Andric callback,
43*0b57cec5SDimitry Andric void *baton)
44*0b57cec5SDimitry Andric : TypedBaton(std::make_unique<CallbackData>()) {
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)49*0b57cec5SDimitry Andric bool SBBreakpointCallbackBaton::PrivateBreakpointHitCallback(void *baton,
50*0b57cec5SDimitry Andric StoppointCallbackContext *ctx,
51*0b57cec5SDimitry Andric lldb::user_id_t break_id,
52*0b57cec5SDimitry Andric lldb::user_id_t break_loc_id)
53*0b57cec5SDimitry Andric {
54*0b57cec5SDimitry Andric ExecutionContext exe_ctx(ctx->exe_ctx_ref);
55*0b57cec5SDimitry Andric BreakpointSP bp_sp(
56*0b57cec5SDimitry Andric exe_ctx.GetTargetRef().GetBreakpointList().FindBreakpointByID(break_id));
57*0b57cec5SDimitry Andric if (baton && bp_sp) {
58*0b57cec5SDimitry Andric CallbackData *data = (CallbackData *)baton;
59*0b57cec5SDimitry Andric lldb_private::Breakpoint *bp = bp_sp.get();
60*0b57cec5SDimitry Andric if (bp && data->callback) {
61*0b57cec5SDimitry Andric Process *process = exe_ctx.GetProcessPtr();
62*0b57cec5SDimitry Andric if (process) {
63*0b57cec5SDimitry Andric SBProcess sb_process(process->shared_from_this());
64*0b57cec5SDimitry Andric SBThread sb_thread;
65*0b57cec5SDimitry Andric SBBreakpointLocation sb_location;
66*0b57cec5SDimitry Andric assert(bp_sp);
67*0b57cec5SDimitry Andric sb_location.SetLocation(bp_sp->FindLocationByID(break_loc_id));
68*0b57cec5SDimitry Andric Thread *thread = exe_ctx.GetThreadPtr();
69*0b57cec5SDimitry Andric if (thread)
70*0b57cec5SDimitry Andric sb_thread.SetThread(thread->shared_from_this());
71*0b57cec5SDimitry Andric
72*0b57cec5SDimitry Andric return data->callback(data->callback_baton, sb_process, sb_thread,
73*0b57cec5SDimitry Andric sb_location);
74*0b57cec5SDimitry Andric }
75*0b57cec5SDimitry Andric }
76*0b57cec5SDimitry Andric }
77*0b57cec5SDimitry Andric return true; // Return true if we should stop at this breakpoint
78*0b57cec5SDimitry Andric }
79*0b57cec5SDimitry Andric
80*0b57cec5SDimitry Andric SBBreakpointCallbackBaton::~SBBreakpointCallbackBaton() = default;
81