* alpha-tdep.c (heuristic_proc_desc): Increase search limit

for return address register, handle `ret' instruction.
This commit is contained in:
Peter Schauer 1997-04-26 10:41:14 +00:00
parent 95b7107182
commit fc3622611e
2 changed files with 18 additions and 8 deletions

View file

@ -1,4 +1,7 @@
Sat Apr 26 02:42:52 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
Sat Apr 26 03:38:02 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
* alpha-tdep.c (heuristic_proc_desc): Increase search limit
for return address register, handle `ret' instruction.
* corelow.c (get_core_registers): Initialize cf.

View file

@ -1,5 +1,5 @@
/* Target-dependent code for the ALPHA architecture, for GDB, the GNU Debugger.
Copyright 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
Copyright 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of GDB.
@ -519,14 +519,18 @@ heuristic_proc_desc(start_pc, limit_pc, next_frame)
rearrange the register saves.
So we recognize only a few registers (t7, t9, ra) within
the procedure prologue as valid return address registers.
If we encounter a return instruction, we extract the
the return address register from it.
FIXME: Rewriting GDB to access the procedure descriptors,
e.g. via the minimal symbol table, might obviate this hack. */
if (pcreg == -1
&& cur_pc < (start_pc + 20)
&& cur_pc < (start_pc + 80)
&& (reg == T7_REGNUM || reg == T9_REGNUM || reg == RA_REGNUM))
pcreg = reg;
}
else if ((word & 0xffe0ffff) == 0x6be08001) /* ret zero,reg,1 */
pcreg = (word >> 16) & 0x1f;
else if (word == 0x47de040f) /* bis sp,sp fp */
has_frame_reg = 1;
}
@ -534,15 +538,13 @@ heuristic_proc_desc(start_pc, limit_pc, next_frame)
{
/* If we haven't found a valid return address register yet,
keep searching in the procedure prologue. */
while (cur_pc < (limit_pc + 20) && cur_pc < (start_pc + 20))
while (cur_pc < (limit_pc + 80) && cur_pc < (start_pc + 80))
{
char buf[4];
unsigned long word;
int status;
status = read_memory_nobpt (cur_pc, buf, 4);
if (status)
memory_error (status, cur_pc);
if (read_memory_nobpt (cur_pc, buf, 4))
break;
cur_pc += 4;
word = extract_unsigned_integer (buf, 4);
@ -556,6 +558,11 @@ heuristic_proc_desc(start_pc, limit_pc, next_frame)
break;
}
}
else if ((word & 0xffe0ffff) == 0x6be08001) /* ret zero,reg,1 */
{
pcreg = (word >> 16) & 0x1f;
break;
}
}
}