1515
1616namespace lldb_dap {
1717
18- static llvm::Expected<protocol::DataBreakpointInfoResponseBody>
18+ namespace {
19+ std::vector<protocol::DataBreakpointAccessType>
20+ GetBreakpointAccessTypes (lldb::SBMemoryRegionInfo region) {
21+ std::vector<protocol::DataBreakpointAccessType> types;
22+ if (region.IsReadable ())
23+ types.emplace_back (protocol::eDataBreakpointAccessTypeRead);
24+ if (region.IsWritable ())
25+ types.emplace_back (protocol::eDataBreakpointAccessTypeWrite);
26+ if (region.IsReadable () && region.IsWritable ())
27+ types.emplace_back (protocol::eDataBreakpointAccessTypeReadWrite);
28+
29+ return types;
30+ }
31+
32+ llvm::Expected<protocol::DataBreakpointInfoResponseBody>
1933HandleDataBreakpointBytes (DAP &dap,
2034 const protocol::DataBreakpointInfoArguments &args) {
21- llvm::StringRef raw_address = args.name ;
35+ const llvm::StringRef raw_address = args.name ;
2236
2337 lldb::addr_t load_addr = LLDB_INVALID_ADDRESS;
2438 if (raw_address.getAsInteger <lldb::addr_t >(0 , load_addr)) {
@@ -35,29 +49,35 @@ HandleDataBreakpointBytes(DAP &dap,
3549 const uint32_t byte_size =
3650 args.bytes .value_or (dap.target .GetAddressByteSize ());
3751
38- protocol::DataBreakpointInfoResponseBody response;
39- response.dataId = llvm::formatv (" {:x-}/{}" , load_addr, byte_size);
40-
4152 lldb::SBMemoryRegionInfo region;
4253 lldb::SBError err =
4354 dap.target .GetProcess ().GetMemoryRegionInfo (load_addr, region);
44- // Only lldb-server supports "qMemoryRegionInfo". So, don't fail this
45- // request if SBProcess::GetMemoryRegionInfo returns error.
46- if (err.Success () && !(region.IsReadable () || region.IsWritable ())) {
55+ std::vector<protocol::DataBreakpointAccessType> access_types =
56+ GetBreakpointAccessTypes (region);
57+
58+ protocol::DataBreakpointInfoResponseBody response;
59+ if (err.Fail ()) {
60+ response.dataId = std::nullopt ;
61+ response.description = err.GetCString ();
62+ return response;
63+ }
64+
65+ if (access_types.empty ()) {
66+ response.dataId = std::nullopt ;
4767 response.description = llvm::formatv (
4868 " memory region for address {} has no read or write permissions" ,
4969 load_addr);
50-
51- } else {
52- response.description =
53- llvm::formatv (" {} bytes at {:x}" , byte_size, load_addr);
54- response.accessTypes = {protocol::eDataBreakpointAccessTypeRead,
55- protocol::eDataBreakpointAccessTypeWrite,
56- protocol::eDataBreakpointAccessTypeReadWrite};
70+ return response;
5771 }
5872
73+ response.dataId = llvm::formatv (" {:x-}/{}" , load_addr, byte_size);
74+ response.description =
75+ llvm::formatv (" {} bytes at {:x}" , byte_size, load_addr);
76+ response.accessTypes = std::move (access_types);
77+
5978 return response;
6079}
80+ } // namespace
6181
6282// / Obtains information on a possible data breakpoint that could be set on an
6383// / expression or variable. Clients should only call this request if the
0 commit comments