diff options
author | Andrew Cagney <cagney@redhat.com> | 2003-07-02 17:20:24 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2003-07-02 17:20:24 +0000 |
commit | fd13a04acf73b5a59f9212c8a0fac24ddd0d434a (patch) | |
tree | 5d9f1a499c818930be8dfdbb1b74f235e0702623 /gdb/i386-tdep.c | |
parent | 3f8091c1f6491ef8464e496069eff839804451fa (diff) | |
download | gdb-fd13a04acf73b5a59f9212c8a0fac24ddd0d434a.zip gdb-fd13a04acf73b5a59f9212c8a0fac24ddd0d434a.tar.gz gdb-fd13a04acf73b5a59f9212c8a0fac24ddd0d434a.tar.bz2 |
2003-07-02 Andrew Cagney <cagney@redhat.com>
* i386-tdep.c: Revert change committed as part of trad-frame code
below.
Diffstat (limited to 'gdb/i386-tdep.c')
-rw-r--r-- | gdb/i386-tdep.c | 59 |
1 files changed, 34 insertions, 25 deletions
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index a639b17..3b98180 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -41,7 +41,6 @@ #include "symtab.h" #include "target.h" #include "value.h" -#include "trad-frame.h" #include "gdb_assert.h" #include "gdb_string.h" @@ -249,10 +248,8 @@ struct i386_frame_cache CORE_ADDR sp_offset; CORE_ADDR pc; - /* Saved registers. While trad-frame allocates space for the full - NUM_REGS + NUM_PSEUDOREGS, some of the code below cheats and - allocates space for only I386_NUM_SAVED_REGS. */ - struct trad_frame_saved_reg *saved_regs; + /* Saved registers. */ + CORE_ADDR saved_regs[I386_NUM_SAVED_REGS]; CORE_ADDR saved_sp; int pc_in_eax; @@ -263,7 +260,7 @@ struct i386_frame_cache /* Allocate and initialize a frame cache. */ static struct i386_frame_cache * -i386_alloc_frame_cache (struct frame_info *next_frame) +i386_alloc_frame_cache (void) { struct i386_frame_cache *cache; int i; @@ -275,7 +272,10 @@ i386_alloc_frame_cache (struct frame_info *next_frame) cache->sp_offset = -4; cache->pc = 0; - cache->saved_regs = trad_frame_alloc_saved_regs (next_frame); + /* Saved registers. We initialize these to -1 since zero is a valid + offset (that's where %ebp is supposed to be stored). */ + for (i = 0; i < I386_NUM_SAVED_REGS; i++) + cache->saved_regs[i] = -1; cache->saved_sp = 0; cache->pc_in_eax = 0; @@ -449,7 +449,7 @@ i386_analyze_frame_setup (CORE_ADDR pc, CORE_ADDR current_pc, { /* Take into account that we've executed the `pushl %ebp' that starts this instruction sequence. */ - cache->saved_regs[I386_EBP_REGNUM].addr = 0; + cache->saved_regs[I386_EBP_REGNUM] = 0; cache->sp_offset += 4; /* If that's all, return now. */ @@ -547,7 +547,7 @@ i386_analyze_register_saves (CORE_ADDR pc, CORE_ADDR current_pc, if (op < 0x50 || op > 0x57) break; - cache->saved_regs[op - 0x50].addr = offset; + cache->saved_regs[op - 0x50] = offset; offset -= 4; pc++; } @@ -609,11 +609,6 @@ i386_skip_prologue (CORE_ADDR start_pc) unsigned char op; int i; - /* Allocate space for the maximum number of saved registers. This - should include all registers mentioned above, and %eip. */ - cache.saved_regs = alloca (I386_NUM_SAVED_REGS - * sizeof (cache.saved_regs[0])); - cache.locals = -1; pc = i386_analyze_prologue (start_pc, 0xffffffff, &cache); if (cache.locals < 0) @@ -695,7 +690,7 @@ i386_frame_cache (struct frame_info *next_frame, void **this_cache) if (*this_cache) return *this_cache; - cache = i386_alloc_frame_cache (next_frame); + cache = i386_alloc_frame_cache (); *this_cache = cache; /* In principle, for normal frames, %ebp holds the frame pointer, @@ -713,7 +708,7 @@ i386_frame_cache (struct frame_info *next_frame, void **this_cache) return cache; /* For normal frames, %eip is stored at 4(%ebp). */ - cache->saved_regs[I386_EIP_REGNUM].addr = 4; + cache->saved_regs[I386_EIP_REGNUM] = 4; cache->pc = frame_func_unwind (next_frame); if (cache->pc != 0) @@ -740,9 +735,8 @@ i386_frame_cache (struct frame_info *next_frame, void **this_cache) /* Adjust all the saved registers such that they contain addresses instead of offsets. */ for (i = 0; i < I386_NUM_SAVED_REGS; i++) - if (cache->saved_regs[i].realnum >= 0 - && cache->saved_regs[i].addr != -1) - cache->saved_regs[i].addr += cache->base; + if (cache->saved_regs[i] != -1) + cache->saved_regs[i] += cache->base; return cache; } @@ -830,8 +824,23 @@ i386_frame_prev_register (struct frame_info *next_frame, void **this_cache, return; } - trad_frame_prev_register (next_frame, cache->saved_regs, regnum, - optimizedp, lvalp, addrp, realnump, valuep); + if (regnum < I386_NUM_SAVED_REGS && cache->saved_regs[regnum] != -1) + { + *optimizedp = 0; + *lvalp = lval_memory; + *addrp = cache->saved_regs[regnum]; + *realnump = -1; + if (valuep) + { + /* Read the value in from memory. */ + read_memory (*addrp, valuep, + register_size (current_gdbarch, regnum)); + } + return; + } + + frame_register_unwind (next_frame, regnum, + optimizedp, lvalp, addrp, realnump, valuep); } static const struct frame_unwind i386_frame_unwind = @@ -861,7 +870,7 @@ i386_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache) if (*this_cache) return *this_cache; - cache = i386_alloc_frame_cache (next_frame); + cache = i386_alloc_frame_cache (); frame_unwind_register (next_frame, I386_ESP_REGNUM, buf); cache->base = extract_unsigned_integer (buf, 4) - 4; @@ -875,12 +884,12 @@ i386_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache) for (i = 0; i < tdep->sc_num_regs; i++) if (tdep->sc_reg_offset[i] != -1) - cache->saved_regs[i].addr = addr + tdep->sc_reg_offset[i]; + cache->saved_regs[i] = addr + tdep->sc_reg_offset[i]; } else { - cache->saved_regs[I386_EIP_REGNUM].addr = addr + tdep->sc_pc_offset; - cache->saved_regs[I386_ESP_REGNUM].addr = addr + tdep->sc_sp_offset; + cache->saved_regs[I386_EIP_REGNUM] = addr + tdep->sc_pc_offset; + cache->saved_regs[I386_ESP_REGNUM] = addr + tdep->sc_sp_offset; } *this_cache = cache; |