Skip to content

Commit a6f9c53

Browse files
committed
[lldb][lldb-dap] add the access types only if it is supported.
1 parent e77bc42 commit a6f9c53

File tree

1 file changed

+35
-15
lines changed

1 file changed

+35
-15
lines changed

lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,24 @@
1515

1616
namespace 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>
1933
HandleDataBreakpointBytes(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

Comments
 (0)