1acac075bSDimitry Andric //===-- SBBreakpointName.cpp ----------------------------------------*- C++ -*-===//
2acac075bSDimitry Andric //
3acac075bSDimitry Andric // The LLVM Compiler Infrastructure
4acac075bSDimitry Andric //
5acac075bSDimitry Andric // This file is distributed under the University of Illinois Open Source
6acac075bSDimitry Andric // License. See LICENSE.TXT for details.
7acac075bSDimitry Andric //
8acac075bSDimitry Andric //===----------------------------------------------------------------------===//
9acac075bSDimitry Andric
10acac075bSDimitry Andric #include "lldb/API/SBBreakpointName.h"
11acac075bSDimitry Andric #include "lldb/API/SBBreakpointLocation.h"
12acac075bSDimitry Andric #include "lldb/API/SBDebugger.h"
13acac075bSDimitry Andric #include "lldb/API/SBEvent.h"
14acac075bSDimitry Andric #include "lldb/API/SBProcess.h"
15acac075bSDimitry Andric #include "lldb/API/SBStream.h"
16acac075bSDimitry Andric #include "lldb/API/SBStringList.h"
17acac075bSDimitry Andric #include "lldb/API/SBThread.h"
18acac075bSDimitry Andric
19acac075bSDimitry Andric #include "lldb/Breakpoint/BreakpointName.h"
20acac075bSDimitry Andric #include "lldb/Breakpoint/StoppointCallbackContext.h"
21acac075bSDimitry Andric #include "lldb/Core/Address.h"
22acac075bSDimitry Andric #include "lldb/Core/Debugger.h"
23acac075bSDimitry Andric #include "lldb/Core/StreamFile.h"
24acac075bSDimitry Andric #include "lldb/Interpreter/CommandInterpreter.h"
25acac075bSDimitry Andric #include "lldb/Interpreter/ScriptInterpreter.h"
26acac075bSDimitry Andric #include "lldb/Target/Process.h"
27acac075bSDimitry Andric #include "lldb/Target/Target.h"
28acac075bSDimitry Andric #include "lldb/Target/Thread.h"
29acac075bSDimitry Andric #include "lldb/Target/ThreadSpec.h"
30acac075bSDimitry Andric #include "lldb/Utility/Log.h"
31acac075bSDimitry Andric #include "lldb/Utility/Stream.h"
32acac075bSDimitry Andric
33acac075bSDimitry Andric #include "lldb/lldb-enumerations.h"
34acac075bSDimitry Andric
35acac075bSDimitry Andric #include "SBBreakpointOptionCommon.h"
36acac075bSDimitry Andric
37acac075bSDimitry Andric #include "llvm/ADT/STLExtras.h"
38acac075bSDimitry Andric
39acac075bSDimitry Andric using namespace lldb;
40acac075bSDimitry Andric using namespace lldb_private;
41acac075bSDimitry Andric
SBBreakpointCallbackBaton(SBBreakpointHitCallback callback,void * baton)42acac075bSDimitry Andric SBBreakpointCallbackBaton::SBBreakpointCallbackBaton(SBBreakpointHitCallback
43acac075bSDimitry Andric callback,
44acac075bSDimitry Andric void *baton)
45acac075bSDimitry Andric : TypedBaton(llvm::make_unique<CallbackData>()) {
46acac075bSDimitry Andric getItem()->callback = callback;
47acac075bSDimitry Andric getItem()->callback_baton = baton;
48acac075bSDimitry Andric }
49acac075bSDimitry Andric
PrivateBreakpointHitCallback(void * baton,StoppointCallbackContext * ctx,lldb::user_id_t break_id,lldb::user_id_t break_loc_id)50acac075bSDimitry Andric bool SBBreakpointCallbackBaton::PrivateBreakpointHitCallback(void *baton,
51acac075bSDimitry Andric StoppointCallbackContext *ctx,
52acac075bSDimitry Andric lldb::user_id_t break_id,
53acac075bSDimitry Andric lldb::user_id_t break_loc_id)
54acac075bSDimitry Andric {
55acac075bSDimitry Andric ExecutionContext exe_ctx(ctx->exe_ctx_ref);
56acac075bSDimitry Andric BreakpointSP bp_sp(
57acac075bSDimitry Andric exe_ctx.GetTargetRef().GetBreakpointList().FindBreakpointByID(break_id));
58acac075bSDimitry Andric if (baton && bp_sp) {
59acac075bSDimitry Andric CallbackData *data = (CallbackData *)baton;
60acac075bSDimitry Andric lldb_private::Breakpoint *bp = bp_sp.get();
61acac075bSDimitry Andric if (bp && data->callback) {
62acac075bSDimitry Andric Process *process = exe_ctx.GetProcessPtr();
63acac075bSDimitry Andric if (process) {
64acac075bSDimitry Andric SBProcess sb_process(process->shared_from_this());
65acac075bSDimitry Andric SBThread sb_thread;
66acac075bSDimitry Andric SBBreakpointLocation sb_location;
67acac075bSDimitry Andric assert(bp_sp);
68acac075bSDimitry Andric sb_location.SetLocation(bp_sp->FindLocationByID(break_loc_id));
69acac075bSDimitry Andric Thread *thread = exe_ctx.GetThreadPtr();
70acac075bSDimitry Andric if (thread)
71acac075bSDimitry Andric sb_thread.SetThread(thread->shared_from_this());
72acac075bSDimitry Andric
73acac075bSDimitry Andric return data->callback(data->callback_baton, sb_process, sb_thread,
74acac075bSDimitry Andric sb_location);
75acac075bSDimitry Andric }
76acac075bSDimitry Andric }
77acac075bSDimitry Andric }
78acac075bSDimitry Andric return true; // Return true if we should stop at this breakpoint
79acac075bSDimitry Andric }
80acac075bSDimitry Andric
81acac075bSDimitry Andric SBBreakpointCallbackBaton::~SBBreakpointCallbackBaton() = default;
82