diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ba5ea4cbca..b8c504f7b9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2006-01-22 Daniel Jacobowitz + + PR tdep/2029 + Suggested by Till Straumann : + * rs6000-tdep.c (skip_prologue): Update check for later mtlr + instructions. Handle PIC bcl. + 2006-01-22 Daniel Jacobowitz * config/djgpp/README: Typo fix. diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c index 54b33b36da..1d4a437ac5 100644 --- a/gdb/rs6000-tdep.c +++ b/gdb/rs6000-tdep.c @@ -1,8 +1,8 @@ /* Target-dependent code for GDB, the GNU debugger. Copyright (C) 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, - 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software - Foundation, Inc. + 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. This file is part of GDB. @@ -1013,7 +1013,7 @@ skip_prologue (CORE_ADDR pc, CORE_ADDR lim_pc, struct rs6000_framedata *fdata) remember just the first one, but skip over additional ones. */ - if (lr_reg < 0) + if (lr_reg == -1) lr_reg = (op & 0x03e00000); if (lr_reg == 0) r0_contains_arg = 0; @@ -1126,6 +1126,13 @@ skip_prologue (CORE_ADDR pc, CORE_ADDR lim_pc, struct rs6000_framedata *fdata) continue; } + else if ((op & 0xfe80ffff) == 0x42800005 && lr_reg != -1) + { + /* bcl 20,xx,.+4 is used to get the current PC, with or without + prediction bits. If the LR has already been saved, we can + skip it. */ + continue; + } else if (op == 0x48000005) { /* bl .+4 used in -mrelocatable */