diff options
author | Pedro Alves <palves@redhat.com> | 2007-09-03 22:24:24 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2007-09-03 22:24:24 +0000 |
commit | 6dc134122f43d3607284c0e372e239321b4ab7fb (patch) | |
tree | 431c7aec6b3c25fbfcd65aff35afc85596df26e8 /gdb/arm-wince-tdep.c | |
parent | aec18585f04e9410cc3c965b1e33e8b5b056e018 (diff) | |
download | gdb-6dc134122f43d3607284c0e372e239321b4ab7fb.zip gdb-6dc134122f43d3607284c0e372e239321b4ab7fb.tar.gz gdb-6dc134122f43d3607284c0e372e239321b4ab7fb.tar.bz2 |
* arm-tdep.h (arm_skip_stub): Declare.
* arm-wince-tdep.c: Don't include "solib-svr4.h". Include
"gdbcore.h".
(arm_pe_skip_trampoline_code): New function.
(arm_wince_init_abi): Register arm_pe_skip_trampoline_code as
gdbarch_skip_trampoline_code callback.
* Makefile.in (arm-wince-tdep.o): Update dependencies.
Diffstat (limited to 'gdb/arm-wince-tdep.c')
-rw-r--r-- | gdb/arm-wince-tdep.c | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/gdb/arm-wince-tdep.c b/gdb/arm-wince-tdep.c index 4235896..dd7e3ef 100644 --- a/gdb/arm-wince-tdep.c +++ b/gdb/arm-wince-tdep.c @@ -20,7 +20,7 @@ #include "defs.h" #include "osabi.h" -#include "solib-svr4.h" +#include "gdbcore.h" #include "target.h" #include "gdb_string.h" @@ -34,6 +34,44 @@ static const char arm_wince_thumb_le_breakpoint[] = { 0xfe, 0xdf }; #define ARM_WINCE_JB_ELEMENT_SIZE INT_REGISTER_SIZE #define ARM_WINCE_JB_PC 10 +static CORE_ADDR +arm_pe_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc) +{ + ULONGEST indirect; + struct minimal_symbol *indsym; + char *symname; + CORE_ADDR next_pc; + + /* The format of an ARM DLL trampoline is: + ldr ip, [pc] + ldr pc, [ip] + .dw __imp_<func> */ + + if (pc == 0 + || read_memory_unsigned_integer (pc + 0, 4) != 0xe59fc000 + || read_memory_unsigned_integer (pc + 4, 4) != 0xe59cf000) + return 0; + + indirect = read_memory_unsigned_integer (pc + 8, 4); + if (indirect == 0) + return 0; + + indsym = lookup_minimal_symbol_by_pc (indirect); + if (indsym == NULL) + return 0; + + symname = SYMBOL_LINKAGE_NAME (indsym); + if (symname == NULL || strncmp (symname, "__imp_", 6) != 0) + return 0; + + next_pc = read_memory_unsigned_integer (indirect, 4); + if (next_pc != 0) + return next_pc; + + /* Check with the default arm gdbarch_skip_trampoline. */ + return arm_skip_stub (frame, pc); +} + static void arm_wince_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { @@ -54,7 +92,7 @@ arm_wince_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_char_signed (gdbarch, 1); /* Shared library handling. */ - set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); + set_gdbarch_skip_trampoline_code (gdbarch, arm_pe_skip_trampoline_code); /* Single stepping. */ set_gdbarch_software_single_step (gdbarch, arm_software_single_step); |