@ -1910,11 +1910,9 @@ i386_epilogue_frame_sniffer (const struct frame_unwind *self,
static struct i386_frame_cache *
i386_epilogue_frame_cache ( struct frame_info * this_frame , void * * this_cache )
{
struct gdbarch * gdbarch = get_frame_arch ( this_frame ) ;
enum bfd_endian byte_order = gdbarch_byte_order ( gdbarch ) ;
volatile struct gdb_exception ex ;
struct i386_frame_cache * cache ;
gdb_byte buf [ 4 ] ;
CORE_ADDR sp ;
if ( * this_cache )
return * this_cache ;
@ -1924,18 +1922,14 @@ i386_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
TRY_CATCH ( ex , RETURN_MASK_ERROR )
{
/* Cache base will be %esp plus cache->sp_offset (-4). */
get_frame_register ( this_frame , I386_ESP_REGNUM , buf ) ;
cache - > base = extract_unsigned_integer ( buf , 4 ,
byte_order ) + cache - > sp_offset ;
/* Cache pc will be the frame func. */
cache - > pc = get_frame_pc ( this_frame ) ;
cache - > pc = get_frame_func ( this_frame ) ;
/* The saved %esp will be at cache->base plus 8. */
/* At this point the stack looks as if we just entered the
function , with the return address at the top of the
stack . */
sp = get_frame_register_unsigned ( this_frame , I386_ESP_REGNUM ) ;
cache - > base = sp + cache - > sp_offset ;
cache - > saved_sp = cache - > base + 8 ;
/* The saved %eip will be at cache->base plus 4. */
cache - > saved_regs [ I386_EIP_REGNUM ] = cache - > base + 4 ;
cache - > base_p = 1 ;
@ -1950,8 +1944,8 @@ static enum unwind_stop_reason
i386_epilogue_frame_unwind_stop_reason ( struct frame_info * this_frame ,
void * * this_cache )
{
struct i386_frame_cache * cache
= i386_epilogue_frame_cache ( this_frame , this_cache ) ;
struct i386_frame_cache * cache =
i386_epilogue_frame_cache ( this_frame , this_cache ) ;
if ( ! cache - > base_p )
return UNWIND_UNAVAILABLE ;
@ -1964,8 +1958,8 @@ i386_epilogue_frame_this_id (struct frame_info *this_frame,
void * * this_cache ,
struct frame_id * this_id )
{
struct i386_frame_cache * cache = i386_epilogue_frame_cache ( this_frame ,
this_cache ) ;
struct i386_frame_cache * cache =
i386_epilogue_frame_cache ( this_frame , this_cache ) ;
if ( ! cache - > base_p )
return ;
@ -1973,12 +1967,22 @@ i386_epilogue_frame_this_id (struct frame_info *this_frame,
( * this_id ) = frame_id_build ( cache - > base + 8 , cache - > pc ) ;
}
static struct value *
i386_epilogue_frame_prev_register ( struct frame_info * this_frame ,
void * * this_cache , int regnum )
{
/* Make sure we've initialized the cache. */
i386_epilogue_frame_cache ( this_frame , this_cache ) ;
return i386_frame_prev_register ( this_frame , this_cache , regnum ) ;
}
static const struct frame_unwind i386_epilogue_frame_unwind =
{
NORMAL_FRAME ,
i386_epilogue_frame_unwind_stop_reason ,
i386_epilogue_frame_this_id ,
i386_frame_prev_register ,
i386_epilogue_ frame_prev_register ,
NULL ,
i386_epilogue_frame_sniffer
} ;
@ -2045,8 +2049,8 @@ i386_in_stack_tramp_p (struct gdbarch *gdbarch, CORE_ADDR pc)
static int
i386_stack_tramp_frame_sniffer ( const struct frame_unwind * self ,
struct frame_info * this_frame ,
void * * this_prologue _cache )
struct frame_info * this_frame ,
void * * this_cache )
{
if ( frame_relative_level ( this_frame ) = = 0 )
return i386_in_stack_tramp_p ( get_frame_arch ( this_frame ) ,
@ -2060,7 +2064,7 @@ static const struct frame_unwind i386_stack_tramp_frame_unwind =
NORMAL_FRAME ,
i386_epilogue_frame_unwind_stop_reason ,
i386_epilogue_frame_this_id ,
i386_frame_prev_register ,
i386_epilogue_ frame_prev_register ,
NULL ,
i386_stack_tramp_frame_sniffer
} ;
@ -7311,13 +7315,13 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_fetch_pointer_argument ( gdbarch , i386_fetch_pointer_argument ) ;
/* Hook the function epilogue frame unwinder. This unwinder is
appended to the list first , so that it supercedes the Dwarf
unwinder in function epilogues ( where the Dwarf unwinder
appended to the list first , so that it supercedes the DWARF
unwinder in function epilogues ( where the DWARF unwinder
currently fails ) . */
frame_unwind_append_unwinder ( gdbarch , & i386_epilogue_frame_unwind ) ;
/* Hook in the DWARF CFI frame unwinder. This unwinder is appended
to the list before the prologue - based unwinders , so that Dwarf
to the list before the prologue - based unwinders , so that DWARF
CFI info will be used if it is available . */
dwarf2_append_unwinders ( gdbarch ) ;