llvm-project/lldb/tools/lldb-dap/Handler/ModuleSymbolsRequestHandler.cpp
Ely Ronnen 8b64cd8be2
[lldb-dap] Add module symbol table viewer to VS Code extension #140626 (#153836)
- VS Code extension:
- Add module symbol table viewer using
[Tabulator](https://tabulator.info/) for sorting and formatting rows.
  - Add context menu action to the modules tree.
 - lldb-dap
   -  Add `DAPGetModuleSymbolsRequest` to get symbols from a module.
 
Fixes #140626

[Screencast From 2025-08-15
19-12-33.webm](https://github.com/user-attachments/assets/75e2f229-ac82-487c-812e-3ea33a575b70)
2025-08-21 00:31:48 +02:00

90 lines
2.9 KiB
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 "DAP.h"
#include "DAPError.h"
#include "Protocol/DAPTypes.h"
#include "RequestHandler.h"
#include "lldb/API/SBAddress.h"
#include "lldb/API/SBFileSpec.h"
#include "lldb/API/SBModule.h"
#include "lldb/API/SBModuleSpec.h"
#include "lldb/Utility/UUID.h"
#include "llvm/Support/Error.h"
#include <cstddef>
using namespace lldb_dap::protocol;
namespace lldb_dap {
llvm::Expected<ModuleSymbolsResponseBody>
ModuleSymbolsRequestHandler::Run(const ModuleSymbolsArguments &args) const {
ModuleSymbolsResponseBody response;
lldb::SBModuleSpec module_spec;
if (!args.moduleId.empty()) {
llvm::SmallVector<uint8_t, 20> uuid_bytes;
if (!lldb_private::UUID::DecodeUUIDBytesFromString(args.moduleId,
uuid_bytes)
.empty())
return llvm::make_error<DAPError>("invalid module ID");
module_spec.SetUUIDBytes(uuid_bytes.data(), uuid_bytes.size());
}
if (!args.moduleName.empty()) {
lldb::SBFileSpec file_spec;
file_spec.SetFilename(args.moduleName.c_str());
module_spec.SetFileSpec(file_spec);
}
// Empty request, return empty response.
if (!module_spec.IsValid())
return response;
std::vector<Symbol> &symbols = response.symbols;
lldb::SBModule module = dap.target.FindModule(module_spec);
if (!module.IsValid())
return llvm::make_error<DAPError>("module not found");
const size_t num_symbols = module.GetNumSymbols();
const size_t start_index = args.startIndex.value_or(0);
const size_t end_index =
std::min(start_index + args.count.value_or(num_symbols), num_symbols);
for (size_t i = start_index; i < end_index; ++i) {
lldb::SBSymbol symbol = module.GetSymbolAtIndex(i);
if (!symbol.IsValid())
continue;
Symbol dap_symbol;
dap_symbol.id = symbol.GetID();
dap_symbol.type = symbol.GetType();
dap_symbol.isDebug = symbol.IsDebug();
dap_symbol.isSynthetic = symbol.IsSynthetic();
dap_symbol.isExternal = symbol.IsExternal();
lldb::SBAddress start_address = symbol.GetStartAddress();
if (start_address.IsValid()) {
lldb::addr_t file_address = start_address.GetFileAddress();
if (file_address != LLDB_INVALID_ADDRESS)
dap_symbol.fileAddress = file_address;
lldb::addr_t load_address = start_address.GetLoadAddress(dap.target);
if (load_address != LLDB_INVALID_ADDRESS)
dap_symbol.loadAddress = load_address;
}
dap_symbol.size = symbol.GetSize();
dap_symbol.name = symbol.GetName();
symbols.push_back(std::move(dap_symbol));
}
return response;
}
} // namespace lldb_dap