diff --git a/lldb/tools/lldb-vscode/JSONUtils.cpp b/lldb/tools/lldb-vscode/JSONUtils.cpp --- a/lldb/tools/lldb-vscode/JSONUtils.cpp +++ b/lldb/tools/lldb-vscode/JSONUtils.cpp @@ -289,7 +289,7 @@ return llvm::json::Value(std::move(object)); object.try_emplace("verified", true); - const auto vs_id = MakeVSCodeBreakpointID(bp_loc); + const auto vs_id = bp_loc.GetBreakpoint().GetID(); object.try_emplace("id", vs_id); auto bp_addr = bp_loc.GetAddress(); if (bp_addr.IsValid()) { @@ -308,10 +308,12 @@ const auto num_locations = bp.GetNumLocations(); if (num_locations == 0) return; - for (size_t i = 0; i < num_locations; ++i) { - auto bp_loc = bp.GetLocationAtIndex(i); - breakpoints.emplace_back(CreateBreakpoint(bp_loc)); - } + // VS Code DAP doesn't currently allow one breakpoint to have multiple + // locations so we just report the first one. If we report all locations + // then the IDE starts showing the wrong line numbers and locations for + // other source file and line breakpoints in the same file. + auto bp_loc = bp.GetLocationAtIndex(0); + breakpoints.emplace_back(CreateBreakpoint(bp_loc)); } // "Event": { @@ -870,4 +872,3 @@ } } // namespace lldb_vscode - diff --git a/lldb/tools/lldb-vscode/LLDBUtils.h b/lldb/tools/lldb-vscode/LLDBUtils.h --- a/lldb/tools/lldb-vscode/LLDBUtils.h +++ b/lldb/tools/lldb-vscode/LLDBUtils.h @@ -106,46 +106,6 @@ /// The LLDB frame index ID. uint32_t GetLLDBFrameID(uint64_t dap_frame_id); -/// Given a LLDB breakpoint, make a breakpoint ID that is unique to a -/// specific breakpoint and breakpoint location. -/// -/// VSCode requires a Breakpoint "id" to be unique, so we use the -/// breakpoint ID in the lower BREAKPOINT_ID_SHIFT bits and the -/// breakpoint location ID in the upper BREAKPOINT_ID_SHIFT bits. -/// -/// \param[in] bp_loc -/// The LLDB break point location. -/// -/// \return -/// A unique integer that allows us to easily find the right -/// stack frame within a thread on subsequent VS code requests. -int64_t MakeVSCodeBreakpointID(lldb::SBBreakpointLocation &bp_loc); - -/// Given a VSCode breakpoint ID, convert to a LLDB breakpoint ID. -/// -/// VSCode requires a Breakpoint "id" to be unique, so we use the -/// breakpoint ID in the lower BREAKPOINT_ID_SHIFT bits and the -/// breakpoint location ID in the upper BREAKPOINT_ID_SHIFT bits. -/// -/// \param[in] dap_breakpoint_id -/// The VSCode breakpoint ID to convert to an LLDB breakpoint ID. -/// -/// \return -/// The LLDB breakpoint ID. -uint32_t GetLLDBBreakpointID(uint64_t dap_breakpoint_id); - -/// Given a VSCode breakpoint ID, convert to a LLDB breakpoint location ID. -/// -/// VSCode requires a Breakpoint "id" to be unique, so we use the -/// breakpoint ID in the lower BREAKPOINT_ID_SHIFT bits and the -/// breakpoint location ID in the upper BREAKPOINT_ID_SHIFT bits. -/// -/// \param[in] dap_breakpoint_id -/// The VSCode frame ID to convert to a breakpoint location ID. -/// -/// \return -/// The LLDB breakpoint location ID. -uint32_t GetLLDBBreakpointLocationID(uint64_t dap_breakpoint_id); } // namespace lldb_vscode #endif diff --git a/lldb/tools/lldb-vscode/LLDBUtils.cpp b/lldb/tools/lldb-vscode/LLDBUtils.cpp --- a/lldb/tools/lldb-vscode/LLDBUtils.cpp +++ b/lldb/tools/lldb-vscode/LLDBUtils.cpp @@ -79,19 +79,4 @@ 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