Author: emaste Date: Thu May 28 08:06:09 2015 New Revision: 238420 URL: http://llvm.org/viewvc/llvm-project?rev=238420&view=rev Log: Add thumb breakpoint for FreeBSD (currently disabled)
Patch by Tom Rix, with additional changes to sync whitespace/style with PlatformLinux.cpp. It is currently disabled pending kernel support. Differential Revision: http://reviews.llvm.org/D9170 Modified: lldb/trunk/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp Modified: lldb/trunk/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp?rev=238420&r1=238419&r2=238420&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp (original) +++ lldb/trunk/source/Plugins/Platform/FreeBSD/PlatformFreeBSD.cpp Thu May 28 08:06:09 2015 @@ -21,6 +21,7 @@ // C++ Includes // Other libraries and framework includes // Project includes +#include "lldb/Breakpoint/BreakpointLocation.h" #include "lldb/Breakpoint/BreakpointSite.h" #include "lldb/Core/Error.h" #include "lldb/Core/Debugger.h" @@ -630,11 +631,31 @@ PlatformFreeBSD::GetSoftwareBreakpointTr trap_opcode_size = sizeof(g_aarch64_opcode); } break; + // TODO: support big-endian arm and thumb trap codes. case llvm::Triple::arm: { - static const uint8_t g_arm_opcode[] = { 0xfe, 0xde, 0xff, 0xe7 }; - trap_opcode = g_arm_opcode; - trap_opcode_size = sizeof(g_arm_opcode); + static const uint8_t g_arm_breakpoint_opcode[] = { 0xfe, 0xde, 0xff, 0xe7 }; + static const uint8_t g_thumb_breakpoint_opcode[] = { 0x01, 0xde }; + + lldb::BreakpointLocationSP bp_loc_sp (bp_site->GetOwnerAtIndex (0)); + AddressClass addr_class = eAddressClassUnknown; + + if (bp_loc_sp) + addr_class = bp_loc_sp->GetAddress ().GetAddressClass (); + + if (addr_class == eAddressClassCodeAlternateISA + || (addr_class == eAddressClassUnknown && (bp_site->GetLoadAddress() & 1))) + { + // TODO: Enable when FreeBSD supports thumb breakpoints. + // FreeBSD kernel as of 10.x, does not support thumb breakpoints + trap_opcode = g_thumb_breakpoint_opcode; + trap_opcode_size = 0; + } + else + { + trap_opcode = g_arm_breakpoint_opcode; + trap_opcode_size = sizeof(g_arm_breakpoint_opcode); + } } break; case llvm::Triple::mips64: _______________________________________________ lldb-commits mailing list lldb-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits