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