From 3c410a5a391cb19880774cbe247535f4fd3c956c Mon Sep 17 00:00:00 2001 From: cagney Date: Sat, 8 Jun 2002 18:30:13 +0000 Subject: [PATCH] * gdbarch.sh (FRAME_CHAIN_VALID): Set default to generic_func_frame_chain_valid. * gdbarch.h, gdbarch.c: Re-generate. * blockframe.c (generic_func_frame_chain_valid): Only check PC_IN_CALL_DUMMY when generic dummy frames. Don't worry about passing FP to PC_IN_CALL_DUMMY. Fix PR gdb/360. --- gdb/ChangeLog | 10 ++++++++++ gdb/blockframe.c | 12 +++++++++++- gdb/gdbarch.c | 2 +- gdb/gdbarch.h | 2 +- gdb/gdbarch.sh | 2 +- 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e0af2ad9fb..b6e5882cdc 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,15 @@ 2002-06-08 Andrew Cagney + * gdbarch.sh (FRAME_CHAIN_VALID): Set default to + generic_func_frame_chain_valid. + * gdbarch.h, gdbarch.c: Re-generate. + * blockframe.c (generic_func_frame_chain_valid): Only check + PC_IN_CALL_DUMMY when generic dummy frames. Don't worry about + passing FP to PC_IN_CALL_DUMMY. + Fix PR gdb/360. + +2002-06-08 Andrew Cagney + * gdbarch.sh (struct gdbarch_data): Add field init_p. (register_gdbarch_data): Initialize init_p. (gdbarch_data): Initialize data pointer using the init function. diff --git a/gdb/blockframe.c b/gdb/blockframe.c index deeda4c7df..526184e980 100644 --- a/gdb/blockframe.c +++ b/gdb/blockframe.c @@ -414,6 +414,15 @@ get_prev_frame (struct frame_info *next_frame) start go curfluy than have an abort called from main not show main. */ address = FRAME_CHAIN (next_frame); + + /* FIXME: cagney/2002-06-08: There should be two tests here. + The first would check for a valid frame chain based on a user + selectable policy. The default being ``stop at main'' (as + implemented by generic_func_frame_chain_valid()). Other + policies would be available - stop at NULL, .... The second + test, if provided by the target architecture, would check for + more exotic cases - most target architectures wouldn't bother + with this second case. */ if (!FRAME_CHAIN_VALID (address, next_frame)) return 0; } @@ -1298,7 +1307,8 @@ generic_file_frame_chain_valid (CORE_ADDR fp, struct frame_info *fi) int generic_func_frame_chain_valid (CORE_ADDR fp, struct frame_info *fi) { - if (PC_IN_CALL_DUMMY ((fi)->pc, fp, fp)) + if (USE_GENERIC_DUMMY_FRAMES + && PC_IN_CALL_DUMMY ((fi)->pc, 0, 0)) return 1; /* don't prune CALL_DUMMY frames */ else /* fall back to default algorithm (see frame.h) */ return (fp != 0 diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index 2622a806ce..755ae320fc 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -523,7 +523,7 @@ gdbarch_alloc (const struct gdbarch_info *info, current_gdbarch->remote_translate_xfer_address = generic_remote_translate_xfer_address; current_gdbarch->frame_args_skip = -1; current_gdbarch->frameless_function_invocation = generic_frameless_function_invocation_not; - current_gdbarch->frame_chain_valid = func_frame_chain_valid; + current_gdbarch->frame_chain_valid = generic_func_frame_chain_valid; current_gdbarch->extra_stack_alignment_needed = 1; current_gdbarch->convert_from_func_ptr_addr = core_addr_identity; current_gdbarch->addr_bits_remove = core_addr_identity; diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index 02bf7c77d2..d693839d7d 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -1887,7 +1887,7 @@ extern void set_gdbarch_frame_chain (struct gdbarch *gdbarch, gdbarch_frame_chai /* Default (function) for non- multi-arch platforms. */ #if (!GDB_MULTI_ARCH) && !defined (FRAME_CHAIN_VALID) -#define FRAME_CHAIN_VALID(chain, thisframe) (func_frame_chain_valid (chain, thisframe)) +#define FRAME_CHAIN_VALID(chain, thisframe) (generic_func_frame_chain_valid (chain, thisframe)) #endif typedef int (gdbarch_frame_chain_valid_ftype) (CORE_ADDR chain, struct frame_info *thisframe); diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index abe50e9608..3a36edbd81 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -567,7 +567,7 @@ f:2:FRAME_CHAIN:CORE_ADDR:frame_chain:struct frame_info *frame:frame::0:0 # XXXX - both default and alternate frame_chain_valid functions are # deprecated. New code should use dummy frames and one of the generic # functions. -f:2:FRAME_CHAIN_VALID:int:frame_chain_valid:CORE_ADDR chain, struct frame_info *thisframe:chain, thisframe:::func_frame_chain_valid::0 +f:2:FRAME_CHAIN_VALID:int:frame_chain_valid:CORE_ADDR chain, struct frame_info *thisframe:chain, thisframe:::generic_func_frame_chain_valid::0 f:2:FRAME_SAVED_PC:CORE_ADDR:frame_saved_pc:struct frame_info *fi:fi::0:0 f:2:FRAME_ARGS_ADDRESS:CORE_ADDR:frame_args_address:struct frame_info *fi:fi::0:0 f:2:FRAME_LOCALS_ADDRESS:CORE_ADDR:frame_locals_address:struct frame_info *fi:fi::0:0 -- 2.11.0