reference, declaration → definition definition → references, declarations, derived classes, virtual overrides reference to multiple definitions → definitions unreferenced
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
//===-- LLDBUtils.cpp -------------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "LLDBUtils.h" #include "VSCode.h" namespace lldb_vscode { void RunLLDBCommands(llvm::StringRef prefix, const llvm::ArrayRef<std::string> &commands, llvm::raw_ostream &strm) { if (commands.empty()) return; lldb::SBCommandInterpreter interp = g_vsc.debugger.GetCommandInterpreter(); if (!prefix.empty()) strm << prefix << "\n"; for (const auto &command : commands) { lldb::SBCommandReturnObject result; strm << "(lldb) " << command << "\n"; interp.HandleCommand(command.c_str(), result); auto output_len = result.GetOutputSize(); if (output_len) { const char *output = result.GetOutput(); strm << output; } auto error_len = result.GetErrorSize(); if (error_len) { const char *error = result.GetError(); strm << error; } } } std::string RunLLDBCommands(llvm::StringRef prefix, const llvm::ArrayRef<std::string> &commands) { std::string s; llvm::raw_string_ostream strm(s); RunLLDBCommands(prefix, commands, strm); strm.flush(); return s; } bool ThreadHasStopReason(lldb::SBThread &thread) { switch (thread.GetStopReason()) { case lldb::eStopReasonTrace: case lldb::eStopReasonPlanComplete: case lldb::eStopReasonBreakpoint: case lldb::eStopReasonWatchpoint: case lldb::eStopReasonInstrumentation: case lldb::eStopReasonSignal: case lldb::eStopReasonException: case lldb::eStopReasonExec: return true; case lldb::eStopReasonThreadExiting: case lldb::eStopReasonInvalid: case lldb::eStopReasonNone: break; } return false; } static uint32_t constexpr THREAD_INDEX_SHIFT = 19; uint32_t GetLLDBThreadIndexID(uint64_t dap_frame_id) { return dap_frame_id >> THREAD_INDEX_SHIFT; } uint32_t GetLLDBFrameID(uint64_t dap_frame_id) { return dap_frame_id & ((1u << THREAD_INDEX_SHIFT) - 1); } int64_t MakeVSCodeFrameID(lldb::SBFrame &frame) { return (int64_t)(frame.GetThread().GetIndexID() << THREAD_INDEX_SHIFT | frame.GetFrameID()); } static uint32_t constexpr BREAKPOINT_ID_SHIFT = 22; uint32_t GetLLDBBreakpointID(uint64_t dap_breakpoint_id) { return dap_breakpoint_id >> BREAKPOINT_ID_SHIFT; } uint32_t GetLLDBBreakpointLocationID(uint64_t dap_breakpoint_id) { return dap_breakpoint_id & ((1u << BREAKPOINT_ID_SHIFT) - 1); } int64_t MakeVSCodeBreakpointID(lldb::SBBreakpointLocation &bp_loc) { return (int64_t)(bp_loc.GetBreakpoint().GetID() << BREAKPOINT_ID_SHIFT | bp_loc.GetID()); } } // namespace lldb_vscode