Skip to content

Commit

Permalink
Use BKPT instead of UDF for arm/thumb breakpoints
Browse files Browse the repository at this point in the history
The UDF instruction is deprecated in armv7 and in case of thumb2
instructions set it don't work well together with the IT instruction.

Differential revision: http://reviews.llvm.org/D16853

llvm-svn: 260367
  • Loading branch information
Tamas Berghammer committed Feb 10, 2016
1 parent 2e912ec commit 1b6dacb
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 10 deletions.
6 changes: 2 additions & 4 deletions lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp
Expand Up @@ -560,10 +560,8 @@ PlatformLinux::GetSoftwareBreakpointTrapOpcode (Target &target,
break;
case llvm::Triple::arm:
{
// The ARM reference recommends the use of 0xe7fddefe and 0xdefe
// but the linux kernel does otherwise.
static const uint8_t g_arm_breakpoint_opcode[] = { 0xf0, 0x01, 0xf0, 0xe7 };
static const uint8_t g_thumb_breakpoint_opcode[] = { 0x01, 0xde };
static const uint8_t g_arm_breakpoint_opcode[] = { 0x70, 0xbe, 0x20, 0xe1 };
static const uint8_t g_thumb_breakpoint_opcode[] = { 0x70, 0xbe };

lldb::BreakpointLocationSP bp_loc_sp (bp_site->GetOwnerAtIndex (0));
AddressClass addr_class = eAddressClassUnknown;
Expand Down
12 changes: 6 additions & 6 deletions lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp
Expand Up @@ -1294,8 +1294,10 @@ NativeProcessLinux::MonitorSIGTRAP(const siginfo_t &info, NativeThreadLinux &thr
break;
}

// Otherwise, report step over
MonitorTrace(thread);
if (m_arch.GetMachine() == llvm::Triple::arm)
MonitorBreakpoint(thread); // Arm linux reports trace for breakpoint hits
else
MonitorTrace(thread); // Report the trace
break;
}

Expand Down Expand Up @@ -2289,13 +2291,11 @@ NativeProcessLinux::GetSoftwareBreakpointTrapOpcode (size_t trap_opcode_size_hin
// FIXME put this behind a breakpoint protocol class that can be set per
// architecture. Need MIPS support here.
static const uint8_t g_aarch64_opcode[] = { 0x00, 0x00, 0x20, 0xd4 };
// The ARM reference recommends the use of 0xe7fddefe and 0xdefe but the
// linux kernel does otherwise.
static const uint8_t g_arm_breakpoint_opcode[] = { 0xf0, 0x01, 0xf0, 0xe7 };
static const uint8_t g_arm_breakpoint_opcode[] = { 0x70, 0xbe, 0x20, 0xe1 };
static const uint8_t g_i386_opcode [] = { 0xCC };
static const uint8_t g_mips64_opcode[] = { 0x00, 0x00, 0x00, 0x0d };
static const uint8_t g_mips64el_opcode[] = { 0x0d, 0x00, 0x00, 0x00 };
static const uint8_t g_thumb_breakpoint_opcode[] = { 0x01, 0xde };
static const uint8_t g_thumb_breakpoint_opcode[] = { 0x70, 0xbe };

switch (m_arch.GetMachine ())
{
Expand Down

0 comments on commit 1b6dacb

Please sign in to comment.