Module Name: src Committed By: rin Date: Thu Dec 15 10:01:16 UTC 2016
Modified Files: src/external/gpl3/gdb/dist/gdb: alpha-tdep.c Log Message: Skip the initial GP load in function prologue when inserting a breakpoint. GNU ld for alpha is so clever that the redundant GP load in function entrypoint is skipped. we must therefore skip initial GP loads; otherwise breakpoints in function entrypoints can also be skipped. Reported to upstream (Bug 20969): https://sourceware.org/bugzilla/show_bug.cgi?id=20969 ok martin To generate a diff of this commit: cvs rdiff -u -r1.1.1.5 -r1.2 src/external/gpl3/gdb/dist/gdb/alpha-tdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/gpl3/gdb/dist/gdb/alpha-tdep.c diff -u src/external/gpl3/gdb/dist/gdb/alpha-tdep.c:1.1.1.5 src/external/gpl3/gdb/dist/gdb/alpha-tdep.c:1.2 --- src/external/gpl3/gdb/dist/gdb/alpha-tdep.c:1.1.1.5 Wed Oct 12 16:47:13 2016 +++ src/external/gpl3/gdb/dist/gdb/alpha-tdep.c Thu Dec 15 10:01:16 2016 @@ -757,6 +757,31 @@ alpha_skip_prologue (struct gdbarch *gdb return pc + offset; } +/* GNU ld for alpha is so clever that the redundant GP load in function + entrypoint is skipped. We must therefore skip initial GP loads; otherwise + breakpoints in function entrypoints can also be skipped. */ + +static CORE_ADDR +alpha_skip_entrypoint (struct gdbarch *gdbarch, CORE_ADDR pc) +{ + unsigned long inst; + gdb_byte buf[ALPHA_INSN_SIZE]; + + /* Refer to the comment in alpha_skip_prologue above. */ + if (target_read_memory (pc, buf, sizeof (buf))) + return pc; + + /* Skip a GP load in the first two words in the function entrypoint. */ + inst = alpha_read_insn (gdbarch, pc); + if ((inst & 0xffff0000) != 0x27bb0000) /* ldah $gp,n($t12) */ + return pc; + inst = alpha_read_insn (gdbarch, pc + ALPHA_INSN_SIZE); + if ((inst & 0xffff0000) != 0x23bd0000) /* lda $gp,n($gp) */ + return pc; + + return pc + 2 * ALPHA_INSN_SIZE; +} + static const int ldl_l_opcode = 0x2a; static const int ldq_l_opcode = 0x2b; @@ -1802,6 +1827,9 @@ alpha_gdbarch_init (struct gdbarch_info /* Prologue heuristics. */ set_gdbarch_skip_prologue (gdbarch, alpha_skip_prologue); + /* Entrypoint heuristics. */ + set_gdbarch_skip_entrypoint (gdbarch, alpha_skip_entrypoint); + /* Disassembler. */ set_gdbarch_print_insn (gdbarch, print_insn_alpha);