Re: RFC: Use the ARM CPSR as a fallback to determine ARM/Thumb

Richard Earnshaw
2006-02-21T11:06:00Z

On Mon, 2006-02-20 at 21:49, Daniel Jacobowitz wrote:
> I'm fishing for comments on this change. In arm_pc_is_thumb, if we can not
> find a symbol covering the supplied PC, we assume ARM mode; it seems that it
> would be strictly more useful to assume the current mode.
>
> This patch _should not be used_ as is! Paul Brook cleverly noticed that
> this will mess up breakpoint_from_pc when removing breakpoints, causing us
> to insert 2-byte breakpoints and remove 4-byte ones across a mode switch.
> I'm going to have to mess with the target_remove_breakpoint interface
> to fix that, so I wanted to get opinions on this patch first before I dig
> in.
>
> This is still a somewhat creepy thing to do. You can find quotes of me in
> the gdb@ list archives saying that this is "the way to madness". However,
> I've been debugging some code which jumps to Thumb-mode routines in ROM
> today, and my GDB doesn't yet have symbol information for the ROM code; so
> I'm well down the way to madness without this patch, and it's somewhat
> better with.
>

I can sympathise... :-) Also note that for a lot of ARM users,
defaulting to ARM is exactly the wrong choice, since all their code is
Thumb (with the possible exception of some start-up code and other small
trampolines). I think that guessing based on the current CPSR is a
better guess than just ARM, if you can sort out the 'what we guessed
last time we looked at this address problem...'.

> Maybe there should be a "set" option for the default when no symbol is
> found, allowing the user to throttle this back to ARM-only if that works
> better for them?

I certainly think we need a set option, but it's more complex than that,
since I think it needs probably four states:

arm - force to ARM mode even if things look otherwise.
thumb - force to Thumb mode even if things look otherwise.
auto-arm - Try to work it out, but guess ARM if unknown
auto-thumb - Try to work it out, but guess Thumb if unknown

Another approach would be some augmentation to a memory-region type
command, something like

add code-region [arm|thumb|auto-arm|auto-thumb] [+<extent>|<limit>]

R.