Skip to content

Commit f8b65c4

Browse files
committed
Do in fact need adjustbreakpoint
1 parent 8093a60 commit f8b65c4

File tree

4 files changed

+32
-13
lines changed

4 files changed

+32
-13
lines changed

lldb/source/Plugins/Process/Utility/NativeRegisterContextDBReg.cpp

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,9 @@ uint32_t NativeRegisterContextDBReg::SetHardwareBreakpoint(lldb::addr_t addr,
4848
return LLDB_INVALID_INDEX32;
4949

5050
uint32_t control_value = MakeBreakControlValue(size);
51-
52-
// LLDB does this before making the request, but other clients may not.
53-
switch (size) {
54-
case 2:
55-
addr &= ~1;
56-
break;
57-
case 4:
58-
addr &= ~3;
59-
break;
60-
default:
61-
// ValidateBreakpoint should have rejected this.
62-
llvm_unreachable("Invalid breakpoint size.");
63-
}
51+
auto details = AdjustBreakpoint({size, addr});
52+
size = details.size;
53+
addr = details.addr;
6454

6555
// Iterate over stored breakpoints and find a free bp_index
6656
uint32_t bp_index = LLDB_INVALID_INDEX32;

lldb/source/Plugins/Process/Utility/NativeRegisterContextDBReg.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,12 @@ class NativeRegisterContextDBReg
8787
};
8888
virtual std::optional<WatchpointDetails>
8989
AdjustWatchpoint(const WatchpointDetails &details) = 0;
90+
91+
using BreakpointDetails = WatchpointDetails;
92+
virtual BreakpointDetails AdjustBreakpoint(const BreakpointDetails &details) {
93+
return details;
94+
}
95+
9096
virtual uint32_t MakeBreakControlValue(size_t size) = 0;
9197
virtual uint32_t MakeWatchControlValue(size_t size, uint32_t watch_flags) = 0;
9298
virtual uint32_t GetWatchpointSize(uint32_t wp_index) = 0;

lldb/source/Plugins/Process/Utility/NativeRegisterContextDBReg_arm.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,27 @@ NativeRegisterContextDBReg_arm::AdjustWatchpoint(
5858
return WatchpointDetails{size, addr};
5959
}
6060

61+
NativeRegisterContextDBReg::BreakpointDetails
62+
NativeRegisterContextDBReg_arm::AdjustBreakpoint(
63+
const BreakpointDetails &details) {
64+
BreakpointDetails bd = details;
65+
// Use size to get a hint of arm vs thumb modes.
66+
// LLDB usually aligns this client side, but other clients may not.
67+
switch (bd.size) {
68+
case 2:
69+
bd.addr &= ~1;
70+
break;
71+
case 4:
72+
bd.addr &= ~3;
73+
break;
74+
default:
75+
// We assume that ValidateBreakpoint would have caught this earlier.
76+
llvm_unreachable("Invalid breakpoint size!");
77+
}
78+
79+
return bd;
80+
}
81+
6182
uint32_t NativeRegisterContextDBReg_arm::MakeBreakControlValue(size_t size) {
6283
switch (size) {
6384
case 2:

lldb/source/Plugins/Process/Utility/NativeRegisterContextDBReg_arm.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class NativeRegisterContextDBReg_arm : public NativeRegisterContextDBReg {
2424
std::optional<WatchpointDetails>
2525
AdjustWatchpoint(const WatchpointDetails &details) override;
2626

27+
BreakpointDetails AdjustBreakpoint(const BreakpointDetails &details) override;
28+
2729
uint32_t MakeBreakControlValue(size_t size) override;
2830

2931
uint32_t MakeWatchControlValue(size_t size, uint32_t watch_flags) override;

0 commit comments

Comments
 (0)