xref: /freebsd/contrib/llvm-project/lldb/source/API/SBBreakpointOptionCommon.cpp (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
15ffd83dbSDimitry Andric //===-- SBBreakpointOptionCommon.cpp --------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "lldb/API/SBBreakpointName.h"
100b57cec5SDimitry Andric #include "lldb/API/SBBreakpointLocation.h"
110b57cec5SDimitry Andric #include "lldb/API/SBDebugger.h"
120b57cec5SDimitry Andric #include "lldb/API/SBEvent.h"
130b57cec5SDimitry Andric #include "lldb/API/SBProcess.h"
140b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
150b57cec5SDimitry Andric #include "lldb/API/SBStringList.h"
160b57cec5SDimitry Andric #include "lldb/API/SBThread.h"
170b57cec5SDimitry Andric 
180b57cec5SDimitry Andric #include "lldb/Breakpoint/BreakpointName.h"
190b57cec5SDimitry Andric #include "lldb/Breakpoint/StoppointCallbackContext.h"
200b57cec5SDimitry Andric #include "lldb/Core/Address.h"
210b57cec5SDimitry Andric #include "lldb/Core/Debugger.h"
220b57cec5SDimitry Andric #include "lldb/Interpreter/CommandInterpreter.h"
230b57cec5SDimitry Andric #include "lldb/Interpreter/ScriptInterpreter.h"
240b57cec5SDimitry Andric #include "lldb/Target/Process.h"
250b57cec5SDimitry Andric #include "lldb/Target/Target.h"
260b57cec5SDimitry Andric #include "lldb/Target/Thread.h"
270b57cec5SDimitry Andric #include "lldb/Target/ThreadSpec.h"
28*04eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h"
290b57cec5SDimitry Andric #include "lldb/Utility/Log.h"
300b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
310b57cec5SDimitry Andric 
320b57cec5SDimitry Andric #include "lldb/lldb-enumerations.h"
330b57cec5SDimitry Andric 
340b57cec5SDimitry Andric #include "SBBreakpointOptionCommon.h"
350b57cec5SDimitry Andric 
360b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h"
370b57cec5SDimitry Andric 
380b57cec5SDimitry Andric using namespace lldb;
390b57cec5SDimitry Andric using namespace lldb_private;
400b57cec5SDimitry Andric 
41*04eeddc0SDimitry Andric SBBreakpointCallbackBaton::SBBreakpointCallbackBaton(
42*04eeddc0SDimitry Andric     SBBreakpointHitCallback callback, void *baton)
439dba64beSDimitry Andric     : TypedBaton(std::make_unique<CallbackData>()) {
44*04eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, callback, baton);
450b57cec5SDimitry Andric   getItem()->callback = callback;
460b57cec5SDimitry Andric   getItem()->callback_baton = baton;
470b57cec5SDimitry Andric }
480b57cec5SDimitry Andric 
49*04eeddc0SDimitry Andric bool SBBreakpointCallbackBaton::PrivateBreakpointHitCallback(
50*04eeddc0SDimitry Andric     void *baton, StoppointCallbackContext *ctx, lldb::user_id_t break_id,
51*04eeddc0SDimitry Andric     lldb::user_id_t break_loc_id) {
52*04eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(baton, ctx, break_id, break_loc_id);
530b57cec5SDimitry Andric   ExecutionContext exe_ctx(ctx->exe_ctx_ref);
540b57cec5SDimitry Andric   BreakpointSP bp_sp(
550b57cec5SDimitry Andric       exe_ctx.GetTargetRef().GetBreakpointList().FindBreakpointByID(break_id));
560b57cec5SDimitry Andric   if (baton && bp_sp) {
570b57cec5SDimitry Andric     CallbackData *data = (CallbackData *)baton;
580b57cec5SDimitry Andric     lldb_private::Breakpoint *bp = bp_sp.get();
590b57cec5SDimitry Andric     if (bp && data->callback) {
600b57cec5SDimitry Andric       Process *process = exe_ctx.GetProcessPtr();
610b57cec5SDimitry Andric       if (process) {
620b57cec5SDimitry Andric         SBProcess sb_process(process->shared_from_this());
630b57cec5SDimitry Andric         SBThread sb_thread;
640b57cec5SDimitry Andric         SBBreakpointLocation sb_location;
650b57cec5SDimitry Andric         assert(bp_sp);
660b57cec5SDimitry Andric         sb_location.SetLocation(bp_sp->FindLocationByID(break_loc_id));
670b57cec5SDimitry Andric         Thread *thread = exe_ctx.GetThreadPtr();
680b57cec5SDimitry Andric         if (thread)
690b57cec5SDimitry Andric           sb_thread.SetThread(thread->shared_from_this());
700b57cec5SDimitry Andric 
710b57cec5SDimitry Andric         return data->callback(data->callback_baton, sb_process, sb_thread,
720b57cec5SDimitry Andric                               sb_location);
730b57cec5SDimitry Andric       }
740b57cec5SDimitry Andric     }
750b57cec5SDimitry Andric   }
760b57cec5SDimitry Andric   return true; // Return true if we should stop at this breakpoint
770b57cec5SDimitry Andric }
780b57cec5SDimitry Andric 
790b57cec5SDimitry Andric SBBreakpointCallbackBaton::~SBBreakpointCallbackBaton() = default;
80