@@ -498,22 +498,24 @@ DAP::SendFormattedOutput(OutputType o, const char *format, ...) {
498498}
499499
500500int32_t DAP::CreateSourceReference (lldb::addr_t address) {
501- auto iter = llvm::find (source_references, address);
502- if (iter != source_references.end ())
503- return std::distance (source_references.begin (), iter) + 1 ;
501+ std::lock_guard<std::mutex> guard (m_source_references_mutex);
502+ auto iter = llvm::find (m_source_references, address);
503+ if (iter != m_source_references.end ())
504+ return std::distance (m_source_references.begin (), iter) + 1 ;
504505
505- source_references .emplace_back (address);
506- return static_cast <int32_t >(source_references .size ());
506+ m_source_references .emplace_back (address);
507+ return static_cast <int32_t >(m_source_references .size ());
507508}
508509
509510std::optional<lldb::addr_t > DAP::GetSourceReferenceAddress (int32_t reference) {
511+ std::lock_guard<std::mutex> guard (m_source_references_mutex);
510512 if (reference <= LLDB_DAP_INVALID_SRC_REF)
511513 return std::nullopt ;
512514
513- if (static_cast <size_t >(reference) > source_references .size ())
515+ if (static_cast <size_t >(reference) > m_source_references .size ())
514516 return std::nullopt ;
515517
516- return source_references [reference - 1 ];
518+ return m_source_references [reference - 1 ];
517519}
518520
519521ExceptionBreakpoint *DAP::GetExceptionBPFromStopReason (lldb::SBThread &thread) {
@@ -621,6 +623,22 @@ ReplMode DAP::DetectReplMode(lldb::SBFrame frame, std::string &expression,
621623 llvm_unreachable (" enum cases exhausted." );
622624}
623625
626+ std::optional<protocol::Source> DAP::ResolveSource (lldb::SBAddress address) {
627+
628+ if (DisplayAssemblySource (debugger, address)) {
629+ auto create_reference = [this ](lldb::addr_t addr) {
630+ return CreateSourceReference (addr);
631+ };
632+ return CreateAssemblySource (target, address, create_reference);
633+ }
634+
635+ lldb::SBLineEntry line_entry = GetLineEntryForAddress (target, address);
636+ if (!line_entry.IsValid ())
637+ return std::nullopt ;
638+
639+ return CreateSource (line_entry.GetFileSpec ());
640+ }
641+
624642bool DAP::RunLLDBCommands (llvm::StringRef prefix,
625643 llvm::ArrayRef<std::string> commands) {
626644 bool required_command_failed = false ;
0 commit comments