summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2003-08-17 23:16:44 +0000
committerMark Kettenis <kettenis@gnu.org>2003-08-17 23:16:44 +0000
commit10b4dcffb13a9a25f548a9f30fe35f4acdc7bbf5 (patch)
tree62e17b13cf2265e3181171c28329828a502a397d
parent839edf9bffe07e4c13e2b0d023cadc7314d79751 (diff)
downloadgdb-10b4dcffb13a9a25f548a9f30fe35f4acdc7bbf5.tar.gz
* i386-tdep.c (i386_analyze_register_saves): Handle register saves
at the start of a frameless function. This probably fixes PR backtrace/1338.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/i386-tdep.c29
2 files changed, 20 insertions, 15 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index f8d0e2c787a..4ac481d4136 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2003-08-18 Mark Kettenis <kettenis@gnu.org>
+
+ * i386-tdep.c (i386_analyze_register_saves): Handle register saves
+ at the start of a frameless function. This probably fixes PR
+ backtrace/1338.
+
2003-08-17 Michael Chastain <mec@shout.net>
* symfile.c (find_sym_fns): Remove special case for apollo target.
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index 2c7afca7a33..9aa20d6e1b8 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -571,23 +571,22 @@ static CORE_ADDR
i386_analyze_register_saves (CORE_ADDR pc, CORE_ADDR current_pc,
struct i386_frame_cache *cache)
{
- if (cache->locals >= 0)
- {
- CORE_ADDR offset;
- unsigned char op;
- int i;
+ CORE_ADDR offset = 0;
+ unsigned char op;
+ int i;
- offset = - 4 - cache->locals;
- for (i = 0; i < 8 && pc < current_pc; i++)
- {
- op = read_memory_unsigned_integer (pc, 1);
- if (op < 0x50 || op > 0x57)
- break;
+ if (cache->locals > 0)
+ offset -= cache->locals;
+ for (i = 0; i < 8 && pc < current_pc; i++)
+ {
+ op = read_memory_unsigned_integer (pc, 1);
+ if (op < 0x50 || op > 0x57)
+ break;
- cache->saved_regs[op - 0x50] = offset;
- offset -= 4;
- pc++;
- }
+ offset -= 4;
+ cache->saved_regs[op - 0x50] = offset;
+ cache->sp_offset += 4;
+ pc++;
}
return pc;