From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17832 invoked by alias); 26 Dec 2002 19:14:32 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 17824 invoked from network); 26 Dec 2002 19:14:30 -0000 Received: from unknown (HELO crack.them.org) (65.125.64.184) by 209.249.29.67 with SMTP; 26 Dec 2002 19:14:30 -0000 Received: from nevyn.them.org ([66.93.61.169] ident=mail) by crack.them.org with asmtp (Exim 3.12 #1 (Debian)) id 18RfL5-00017O-00 for ; Thu, 26 Dec 2002 15:14:47 -0600 Received: from drow by nevyn.them.org with local (Exim 3.36 #1 (Debian)) id 18RdTp-0002G6-00 for ; Thu, 26 Dec 2002 14:15:41 -0500 Date: Thu, 26 Dec 2002 12:20:00 -0000 From: Daniel Jacobowitz To: gdb-patches@sources.redhat.com Subject: RFC: Mostly kill FRAME_CHAIN_VALID, add user knob Message-ID: <20021226191541.GA8483@nevyn.them.org> Mail-Followup-To: gdb-patches@sources.redhat.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.1i X-SW-Source: 2002-12/txt/msg00684.txt.bz2 This was discussed a couple of times on the lists in the past; if you can't tell, I'm going through my old mail and todo lists this week... First of all, here's the current list of targets and their frame_chain_valid methods, roughly speaking: ./arm-tdep.c arm_frame_chain_valid ./d10v-tdep.c d10v_frame_chain_valid ./config/pa/tm-hppa.h hppa_frame_chain_valid ./i386-interix-tdep.c i386_interix_frame_chain_valid ./xstormy16-tdep.c xstormy16_frame_chain_valid ./rs6000-tdep.c file_frame_chain_valid ./sparc-tdep.c file_frame_chain_valid ./sparc-tdep.c file_frame_chain_valid ./sparc-tdep.c file_frame_chain_valid ./sparc-tdep.c file_frame_chain_valid ./sparc-tdep.c file_frame_chain_valid ./sparc-tdep.c file_frame_chain_valid ./x86-64-tdep.c file_frame_chain_valid ./alpha-tdep.c func_frame_chain_valid ./config/m68k/tm-m68kv4.h func_frame_chain_valid ./config/m68k/tm-monitor.h func_frame_chain_valid ./config/sparc/tm-sparclite.h func_frame_chain_valid ./frv-tdep.c func_frame_chain_valid ./h8300-tdep.c func_frame_chain_valid ./m68hc11-tdep.c func_frame_chain_valid ./mips-tdep.c func_frame_chain_valid ./ns32k-tdep.c func_frame_chain_valid ./s390-tdep.c func_frame_chain_valid ./sparc-tdep.c func_frame_chain_valid ./sparc-tdep.c func_frame_chain_valid ./vax-tdep.c func_frame_chain_valid ./config/m32r/tm-m32r.h generic_file_frame_chain_valid ./config/mn10200/tm-mn10200.h generic_file_frame_chain_valid ./cris-tdep.c generic_file_frame_chain_valid ./i386-tdep.c generic_file_frame_chain_valid ./m68hc11-tdep.c generic_file_frame_chain_valid ./mn10300-tdep.c generic_file_frame_chain_valid ./mn10300-tdep.c generic_file_frame_chain_valid ./sh-tdep.c generic_file_frame_chain_valid ./v850-tdep.c generic_file_frame_chain_valid ./avr-tdep.c generic_func_frame_chain_valid ./i386-tdep.c generic_func_frame_chain_valid ./i386-tdep.c generic_func_frame_chain_valid ./ia64-tdep.c generic_func_frame_chain_valid ./m68k-tdep.c generic_func_frame_chain_valid ./mcore-tdep.c generic_func_frame_chain_valid ./ppcnbsd-tdep.c generic_func_frame_chain_valid ./config/m68k/tm-apollo68b.h nonnull_frame_chain_valid ./config/m68k/tm-os68k.h nonnull_frame_chain_valid ./config/m68k/tm-vx68.h nonnull_frame_chain_valid Pretty gross, neh? Well, file vs. func is merely a question of whether we stop at main or not, so I added "set backtrace-below-main" in order to let the user choose. Generic vs. not is a question of dummy frames, and the generic versions work with non-generic dummy frames, so there's no reason for that distinction earlier. It won't harm those three m68k targets (if they still work) to use a more comprehensive frame_chain_valid. And the five more specific ones up above can be retained, since they are only _additional_ checks. I'm not entirely convinced that the Interix one is necessary but I left it alone. So, after this patch we have FRAME_CHAIN_VALID as a predicated function that only five architectures define; everything else just uses the new frame_chain_valid () function, which is a more general version of generic_func_frame_chain_valid. I'm more confident I got the texinfo right this time :) I tested the patch and the new functionality on i386-linux and arm-elf, to make sure I got the details of FRAME_CHAIN_VALID_P () right. I'll look to commit this in January, if no one has any comments. Andrew, would you rather this went in frame.c? Since a purpose of that file seems to be moving things from blockframe.c to it... -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer 2002-12-26 Daniel Jacobowitz * arm-tdep.c (arm_frame_chain_valid): Remove unnecessary test. * d10v-tdep.c (d10v_frame_chain_valid): Remove unnecessary tests. * hppa-tdep.c (hppa_frame_chain_valid): Remove unnecessary test. * blockframe.c: Include "gdbcmd.h" and "command.h". (backtrace_below_main): New variable. (file_frame_chain_valid, func_frame_chain_valid) (nonnull_frame_chain_valid, generic_file_frame_chain_valid) (generic_func_frame_chain_valid): Remove functions. (frame_chain_valid, do_flush_frames_sfunc): New functions. (_initialize_blockframe): New function. * Makefile.in (blockframe.o): Update dependencies. * frame.c (frame_saved_regs_id_unwind, get_prev_frame): Remove FIXME comment. Call frame_chain_valid (). * frame.h: Remove old prototypes. Add prototype for frame_chain_valid and update comments to match. * gdbarch.sh: Change FRAME_CHAIN_VALID into a predicated function. Remove old comment. * gdbarch.h: Regenerated. * gdbarch.c: Regenerated. * alpha-tdep.c (alpha_gdbarch_init): Don't call set_gdbarch_frame_chain_valid. * avr-tdep.c (avr_gdbarch_init): Likewise. * cris-tdep.c (cris_gdbarch_init): Likewise. * frv-tdep.c (frv_gdbarch_init): Likewise. * h8300-tdep.c (h8300_gdbarch_init): Likewise. * i386-tdep.c (i386_svr4_init_abi): Likewise. (i386_nw_init_abi): Likewise. (i386_gdbarch_init): Likewise. * ia64-tdep.c (ia64_gdbarch_init): Likewise. * m68hc11-tdep.c (m68hc11_gdbarch_init): Likewise. * m68k-tdep.c (m68k_gdbarch_init): Likewise. * mcore-tdep.c (mcore_gdbarch_init): Likewise. * mips-tdep.c (mips_gdbarch_init): Likewise. * mn10300-tdep.c (mn10300_gdbarch_init): Likewise. * ns32k-tdep.c (ns32k_gdbarch_init): Likewise. * ppcnbsd-tdep.c (ppcnbsd_init_abi): Likewise. * rs6000-tdep.c (rs6000_gdbarch_init): Likewise. * s390-tdep.c (s390_gdbarch_init): Likewise. * sh-tdep.c (sh_gdbarch_init): Likewise. * sparc-tdep.c (sparc_gdbarch_init): Likewise. * v850-tdep.c (v850_gdbarch_init): Likewise. * vax-tdep.c (vax_gdbarch_init): Likewise. * x86-64-tdep.c (x86_64_init_abi): Likewise. * config/m32r/tm-m32r.h (FRAME_CHAIN_VALID): Don't define. * config/m68k/tm-apollo68b.h (FRAME_CHAIN_VALID): Likewise. * config/m68k/tm-m68kv4.h (FRAME_CHAIN_VALID): Likewise. * config/m68k/tm-monitor.h (FRAME_CHAIN_VALID): Likewise. * config/m68k/tm-os68k.h (FRAME_CHAIN_VALID): Likewise. * config/m68k/tm-vx68.h (FRAME_CHAIN_VALID): Likewise. * config/mn10200/tm-mn10200.h (FRAME_CHAIN_VALID): Likewise. * config/sparc/tm-sparclite.h (FRAME_CHAIN_VALID): Likewise. 2002-12-26 Daniel Jacobowitz * gdb.texinfo (Backtraces): Document "set backtrace-below-main". * gdbint.texinfo (FRAME_CHAIN_VALID): Update documentation. Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.298 diff -u -p -r1.298 Makefile.in --- Makefile.in 24 Dec 2002 19:21:10 -0000 1.298 +++ Makefile.in 26 Dec 2002 19:02:02 -0000 @@ -1569,7 +1569,7 @@ bcache.o: bcache.c $(defs_h) $(gdb_obsta blockframe.o: blockframe.c $(defs_h) $(symtab_h) $(bfd_h) $(symfile_h) \ $(objfiles_h) $(frame_h) $(gdbcore_h) $(value_h) $(target_h) \ $(inferior_h) $(annotate_h) $(regcache_h) $(gdb_assert_h) \ - $(dummy_frame_h) + $(dummy_frame_h) $(command_h) $(gdbcmd_h) breakpoint.o: breakpoint.c $(defs_h) $(symtab_h) $(frame_h) $(breakpoint_h) \ $(gdbtypes_h) $(expression_h) $(gdbcore_h) $(gdbcmd_h) $(value_h) \ $(command_h) $(inferior_h) $(gdbthread_h) $(target_h) $(language_h) \ Index: alpha-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/alpha-tdep.c,v retrieving revision 1.48 diff -u -p -r1.48 alpha-tdep.c --- alpha-tdep.c 11 Dec 2002 02:26:34 -0000 1.48 +++ alpha-tdep.c 26 Dec 2002 19:02:03 -0000 @@ -1854,7 +1854,6 @@ alpha_gdbarch_init (struct gdbarch_info set_gdbarch_saved_pc_after_call (gdbarch, alpha_saved_pc_after_call); set_gdbarch_frame_chain (gdbarch, alpha_frame_chain); - set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid); set_gdbarch_frame_saved_pc (gdbarch, alpha_frame_saved_pc); set_gdbarch_frame_init_saved_regs (gdbarch, alpha_frame_init_saved_regs); Index: arm-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/arm-tdep.c,v retrieving revision 1.84 diff -u -p -r1.84 arm-tdep.c --- arm-tdep.c 21 Dec 2002 19:58:07 -0000 1.84 +++ arm-tdep.c 26 Dec 2002 19:02:04 -0000 @@ -158,7 +158,7 @@ struct frame_extra_info static int arm_frame_chain_valid (CORE_ADDR chain, struct frame_info *thisframe) { - return (chain != 0 && (FRAME_SAVED_PC (thisframe) >= LOWEST_PC)); + return (FRAME_SAVED_PC (thisframe) >= LOWEST_PC); } /* Set to true if the 32-bit mode is in use. */ Index: avr-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/avr-tdep.c,v retrieving revision 1.14 diff -u -p -r1.14 avr-tdep.c --- avr-tdep.c 11 Dec 2002 02:26:34 -0000 1.14 +++ avr-tdep.c 26 Dec 2002 19:02:04 -0000 @@ -1263,7 +1263,6 @@ avr_gdbarch_init (struct gdbarch_info in set_gdbarch_frame_args_skip (gdbarch, 0); set_gdbarch_frameless_function_invocation (gdbarch, frameless_look_for_prologue); /* ??? */ set_gdbarch_frame_chain (gdbarch, avr_frame_chain); - set_gdbarch_frame_chain_valid (gdbarch, generic_func_frame_chain_valid); set_gdbarch_frame_saved_pc (gdbarch, avr_frame_saved_pc); set_gdbarch_frame_args_address (gdbarch, avr_frame_address); set_gdbarch_frame_locals_address (gdbarch, avr_frame_address); Index: blockframe.c =================================================================== RCS file: /cvs/src/src/gdb/blockframe.c,v retrieving revision 1.59 diff -u -p -r1.59 blockframe.c --- blockframe.c 9 Dec 2002 03:30:44 -0000 1.59 +++ blockframe.c 26 Dec 2002 19:02:04 -0000 @@ -36,41 +36,16 @@ #include "regcache.h" #include "gdb_assert.h" #include "dummy-frame.h" +#include "command.h" +#include "gdbcmd.h" -/* Prototypes for exported functions. */ - -void _initialize_blockframe (void); +/* Flag to indicate whether backtraces should stop at main. */ -/* A default FRAME_CHAIN_VALID, in the form that is suitable for most - targets. If FRAME_CHAIN_VALID returns zero it means that the given - frame is the outermost one and has no caller. */ - -int -file_frame_chain_valid (CORE_ADDR chain, struct frame_info *thisframe) -{ - return ((chain) != 0 - && !inside_entry_file (frame_pc_unwind (thisframe))); -} - -/* Use the alternate method of avoiding running up off the end of the - frame chain or following frames back into the startup code. See - the comments in objfiles.h. */ - -int -func_frame_chain_valid (CORE_ADDR chain, struct frame_info *thisframe) -{ - return ((chain) != 0 - && !inside_main_func (get_frame_pc (thisframe)) - && !inside_entry_func (get_frame_pc (thisframe))); -} +static int backtrace_below_main; -/* A very simple method of determining a valid frame */ +/* Prototypes for exported functions. */ -int -nonnull_frame_chain_valid (CORE_ADDR chain, struct frame_info *thisframe) -{ - return ((chain) != 0); -} +void _initialize_blockframe (void); /* Is ADDR inside the startup file? Note that if your machine has a way to detect the bottom of the stack, there is no need @@ -689,34 +664,86 @@ deprecated_pc_in_call_dummy_at_entry_poi && (pc) <= (CALL_DUMMY_ADDRESS () + DECR_PC_AFTER_BREAK)); } - /* Function: frame_chain_valid Returns true for a user frame or a call_function_by_hand dummy frame, - and false for the CRT0 start-up frame. Purpose is to terminate backtrace */ + and false for the CRT0 start-up frame. Purpose is to terminate backtrace. */ int -generic_file_frame_chain_valid (CORE_ADDR fp, struct frame_info *fi) +frame_chain_valid (CORE_ADDR fp, struct frame_info *fi) { - if (DEPRECATED_PC_IN_CALL_DUMMY (frame_pc_unwind (fi), fp, fp)) - return 1; /* don't prune CALL_DUMMY frames */ - else /* fall back to default algorithm (see frame.h) */ - return (fp != 0 - && (INNER_THAN (get_frame_base (fi), fp) - || get_frame_base (fi) == fp) - && !inside_entry_file (frame_pc_unwind (fi))); + /* Don't prune CALL_DUMMY frames. */ + if (DEPRECATED_USE_GENERIC_DUMMY_FRAMES + && DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), 0, 0)) + return 1; + + /* If the new frame pointer is zero, then it isn't valid. */ + if (fp == 0) + return 0; + + /* If the new frame would be inside (younger than) the previous frame, + then it isn't valid. */ + if (INNER_THAN (fp, get_frame_base (fi))) + return 0; + + /* If we're already inside the entry function for the main objfile, then it + isn't valid. */ + if (inside_entry_func (get_frame_pc (fi))) + return 0; + + /* If we're inside the entry file, it isn't valid. */ + /* NOTE/drow 2002-12-25: should there be a way to disable this check? It + assumes a single small entry file, and the way some debug readers (e.g. + dbxread) figure out which object is the entry file is somewhat hokey. */ + if (inside_entry_file (frame_pc_unwind (fi))) + return 0; + + /* If we want backtraces to stop at main, and we're inside main, then it + isn't valid. */ + if (!backtrace_below_main && inside_main_func (get_frame_pc (fi))) + return 0; + + /* If the architecture has a custom FRAME_CHAIN_VALID, call it now. */ + if (FRAME_CHAIN_VALID_P ()) + return FRAME_CHAIN_VALID (fp, fi); + + return 1; } -int -generic_func_frame_chain_valid (CORE_ADDR fp, struct frame_info *fi) +void +do_flush_frames_sfunc (char *args, int from_tty, struct cmd_list_element *c) { - if (DEPRECATED_USE_GENERIC_DUMMY_FRAMES - && DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), 0, 0)) - return 1; /* don't prune CALL_DUMMY frames */ - else /* fall back to default algorithm (see frame.h) */ - return (fp != 0 - && (INNER_THAN (get_frame_base (fi), fp) - || get_frame_base (fi) == fp) - && !inside_main_func (get_frame_pc (fi)) - && !inside_entry_func (get_frame_pc (fi))); + int saved_level; + struct frame_info *cur_frame; + + if (! target_has_stack) + return; + + saved_level = frame_relative_level (get_selected_frame ()); + + flush_cached_frames (); + + cur_frame = find_relative_frame (get_current_frame (), &saved_level); + select_frame (cur_frame); + + /* If we were below main and backtrace-below-main was turned off, + SAVED_LEVEL will be non-zero. CUR_FRAME will point to main. + Accept this but print the new frame. */ + if (saved_level != 0) + print_stack_frame (get_selected_frame (), -1, 0); } +void +_initialize_blockframe (void) +{ + add_setshow_boolean_cmd ("backtrace-below-main", class_obscure, + &backtrace_below_main, + "Set whether backtraces should continue past \"main\".\n" + "Normally the caller of \"main\" is not of interest, so GDB will terminate\n" + "the backtrace at \"main\". Set this variable if you need to see the rest\n" + "of the stack trace.", + "Show whether backtraces should continue past \"main\".\n" + "Normally the caller of \"main\" is not of interest, so GDB will terminate\n" + "the backtrace at \"main\". Set this variable if you need to see the rest\n" + "of the stack trace.", + do_flush_frames_sfunc, NULL, &setlist, &showlist); +} Index: cris-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/cris-tdep.c,v retrieving revision 1.33 diff -u -p -r1.33 cris-tdep.c --- cris-tdep.c 11 Dec 2002 02:26:35 -0000 1.33 +++ cris-tdep.c 26 Dec 2002 19:02:05 -0000 @@ -4312,7 +4312,6 @@ cris_gdbarch_init (struct gdbarch_info i set_gdbarch_frameless_function_invocation (gdbarch, cris_frameless_function_invocation); set_gdbarch_frame_chain (gdbarch, cris_frame_chain); - set_gdbarch_frame_chain_valid (gdbarch, generic_file_frame_chain_valid); set_gdbarch_frame_saved_pc (gdbarch, cris_frame_saved_pc); set_gdbarch_saved_pc_after_call (gdbarch, cris_saved_pc_after_call); Index: d10v-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/d10v-tdep.c,v retrieving revision 1.60 diff -u -p -r1.60 d10v-tdep.c --- d10v-tdep.c 11 Dec 2002 02:26:35 -0000 1.60 +++ d10v-tdep.c 26 Dec 2002 19:02:05 -0000 @@ -112,14 +112,7 @@ static void do_d10v_pop_frame (struct fr static int d10v_frame_chain_valid (CORE_ADDR chain, struct frame_info *frame) { - if (chain != 0 && frame != NULL) - { - if (DEPRECATED_PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame)) - return 1; /* Path back from a call dummy must be valid. */ - return ((frame)->pc > IMEM_START - && !inside_main_func (frame->pc)); - } - else return 0; + return ((frame)->pc > IMEM_START); } static CORE_ADDR Index: frame.c =================================================================== RCS file: /cvs/src/src/gdb/frame.c,v retrieving revision 1.48 diff -u -p -r1.48 frame.c --- frame.c 18 Dec 2002 18:03:41 -0000 1.48 +++ frame.c 26 Dec 2002 19:02:05 -0000 @@ -693,15 +693,7 @@ frame_saved_regs_id_unwind (struct frame main. */ id.base = 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 (id.base, next_frame)) + if (!frame_chain_valid (id.base, next_frame)) return null_frame_id; } if (id.base == 0) @@ -1019,15 +1011,7 @@ get_prev_frame (struct frame_info *next_ 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)) + if (!frame_chain_valid (address, next_frame)) return 0; } if (address == 0) Index: frame.h =================================================================== RCS file: /cvs/src/src/gdb/frame.h,v retrieving revision 1.53 diff -u -p -r1.53 frame.h --- frame.h 18 Dec 2002 18:03:41 -0000 1.53 +++ frame.h 26 Dec 2002 19:02:05 -0000 @@ -474,21 +474,12 @@ enum print_what extern void *frame_obstack_alloc (unsigned long size); -/* Define a default FRAME_CHAIN_VALID, in the form that is suitable for most - targets. If FRAME_CHAIN_VALID returns zero it means that the given frame - is the outermost one and has no caller. +/* If FRAME_CHAIN_VALID returns zero it means that the given frame + is the outermost one and has no caller. */ - XXXX - both default and alternate frame_chain_valid functions are - deprecated. New code should use dummy frames and one of the - generic functions. */ +extern int frame_chain_valid (CORE_ADDR, struct frame_info *); -extern int file_frame_chain_valid (CORE_ADDR, struct frame_info *); -extern int func_frame_chain_valid (CORE_ADDR, struct frame_info *); -extern int nonnull_frame_chain_valid (CORE_ADDR, struct frame_info *); -extern int generic_file_frame_chain_valid (CORE_ADDR, struct frame_info *); -extern int generic_func_frame_chain_valid (CORE_ADDR, struct frame_info *); extern void generic_save_dummy_frame_tos (CORE_ADDR sp); - #ifdef FRAME_FIND_SAVED_REGS Index: frv-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/frv-tdep.c,v retrieving revision 1.11 diff -u -p -r1.11 frv-tdep.c --- frv-tdep.c 11 Dec 2002 02:26:35 -0000 1.11 +++ frv-tdep.c 26 Dec 2002 19:02:06 -0000 @@ -1083,7 +1083,6 @@ frv_gdbarch_init (struct gdbarch_info in set_gdbarch_saved_pc_after_call (gdbarch, frv_saved_pc_after_call); set_gdbarch_frame_chain (gdbarch, frv_frame_chain); - set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid); set_gdbarch_frame_saved_pc (gdbarch, frv_frame_saved_pc); set_gdbarch_frame_init_saved_regs (gdbarch, frv_frame_init_saved_regs); Index: gdbarch.c =================================================================== RCS file: /cvs/src/src/gdb/gdbarch.c,v retrieving revision 1.173 diff -u -p -r1.173 gdbarch.c --- gdbarch.c 11 Dec 2002 20:19:39 -0000 1.173 +++ gdbarch.c 26 Dec 2002 19:02:06 -0000 @@ -555,7 +555,6 @@ gdbarch_alloc (const struct gdbarch_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 = generic_func_frame_chain_valid; current_gdbarch->frame_args_address = get_frame_base; current_gdbarch->frame_locals_address = get_frame_base; current_gdbarch->extra_stack_alignment_needed = 1; @@ -769,7 +768,7 @@ verify_gdbarch (struct gdbarch *gdbarch) if ((GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) && (gdbarch->frame_chain == 0)) fprintf_unfiltered (log, "\n\tframe_chain"); - /* Skip verify of frame_chain_valid, invalid_p == 0 */ + /* Skip verify of frame_chain_valid, has predicate */ if ((GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) && (gdbarch->frame_saved_pc == 0)) fprintf_unfiltered (log, "\n\tframe_saved_pc"); @@ -1456,6 +1455,15 @@ gdbarch_dump (struct gdbarch *gdbarch, s (long) current_gdbarch->frame_chain /*FRAME_CHAIN ()*/); #endif +#ifdef FRAME_CHAIN_VALID_P + fprintf_unfiltered (file, + "gdbarch_dump: %s # %s\n", + "FRAME_CHAIN_VALID_P()", + XSTRING (FRAME_CHAIN_VALID_P ())); + fprintf_unfiltered (file, + "gdbarch_dump: FRAME_CHAIN_VALID_P() = %d\n", + FRAME_CHAIN_VALID_P ()); +#endif #ifdef FRAME_CHAIN_VALID fprintf_unfiltered (file, "gdbarch_dump: %s # %s\n", @@ -4651,6 +4659,13 @@ set_gdbarch_frame_chain (struct gdbarch gdbarch_frame_chain_ftype frame_chain) { gdbarch->frame_chain = frame_chain; +} + +int +gdbarch_frame_chain_valid_p (struct gdbarch *gdbarch) +{ + gdb_assert (gdbarch != NULL); + return gdbarch->frame_chain_valid != 0; } int Index: gdbarch.h =================================================================== RCS file: /cvs/src/src/gdb/gdbarch.h,v retrieving revision 1.134 diff -u -p -r1.134 gdbarch.h --- gdbarch.h 11 Dec 2002 20:19:39 -0000 1.134 +++ gdbarch.h 26 Dec 2002 19:02:07 -0000 @@ -1994,17 +1994,29 @@ extern void set_gdbarch_frame_chain (str #endif #endif -/* Define a default FRAME_CHAIN_VALID, in the form that is suitable for - most targets. If FRAME_CHAIN_VALID returns zero it means that the - given frame is the outermost one and has no caller. - - XXXX - both default and alternate frame_chain_valid functions are - deprecated. New code should use dummy frames and one of the generic - functions. */ +#if defined (FRAME_CHAIN_VALID) +/* Legacy for systems yet to multi-arch FRAME_CHAIN_VALID */ +#if !defined (FRAME_CHAIN_VALID_P) +#define FRAME_CHAIN_VALID_P() (1) +#endif +#endif + +/* Default predicate for non- multi-arch targets. */ +#if (!GDB_MULTI_ARCH) && !defined (FRAME_CHAIN_VALID_P) +#define FRAME_CHAIN_VALID_P() (0) +#endif + +extern int gdbarch_frame_chain_valid_p (struct gdbarch *gdbarch); +#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) && defined (FRAME_CHAIN_VALID_P) +#error "Non multi-arch definition of FRAME_CHAIN_VALID" +#endif +#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) || !defined (FRAME_CHAIN_VALID_P) +#define FRAME_CHAIN_VALID_P() (gdbarch_frame_chain_valid_p (current_gdbarch)) +#endif /* Default (function) for non- multi-arch platforms. */ #if (!GDB_MULTI_ARCH) && !defined (FRAME_CHAIN_VALID) -#define FRAME_CHAIN_VALID(chain, thisframe) (generic_func_frame_chain_valid (chain, thisframe)) +#define FRAME_CHAIN_VALID(chain, thisframe) (internal_error (__FILE__, __LINE__, "FRAME_CHAIN_VALID"), 0) #endif typedef int (gdbarch_frame_chain_valid_ftype) (CORE_ADDR chain, struct frame_info *thisframe); Index: gdbarch.sh =================================================================== RCS file: /cvs/src/src/gdb/gdbarch.sh,v retrieving revision 1.185 diff -u -p -r1.185 gdbarch.sh --- gdbarch.sh 11 Dec 2002 20:19:39 -0000 1.185 +++ gdbarch.sh 26 Dec 2002 19:02:07 -0000 @@ -568,14 +568,7 @@ f:2:REMOTE_TRANSLATE_XFER_ADDRESS:void:r v:2:FRAME_ARGS_SKIP:CORE_ADDR:frame_args_skip::::0:-1 f:2:FRAMELESS_FUNCTION_INVOCATION:int:frameless_function_invocation:struct frame_info *fi:fi:::generic_frameless_function_invocation_not::0 f:2:FRAME_CHAIN:CORE_ADDR:frame_chain:struct frame_info *frame:frame::0:0 -# Define a default FRAME_CHAIN_VALID, in the form that is suitable for -# most targets. If FRAME_CHAIN_VALID returns zero it means that the -# given frame is the outermost one and has no caller. -# -# 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:::generic_func_frame_chain_valid::0 +F:2:FRAME_CHAIN_VALID:int:frame_chain_valid:CORE_ADDR chain, struct frame_info *thisframe:chain, thisframe::0: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:get_frame_base::0 f:2:FRAME_LOCALS_ADDRESS:CORE_ADDR:frame_locals_address:struct frame_info *fi:fi::0:get_frame_base::0 Index: h8300-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/h8300-tdep.c,v retrieving revision 1.28 diff -u -p -r1.28 h8300-tdep.c --- h8300-tdep.c 11 Dec 2002 02:26:35 -0000 1.28 +++ h8300-tdep.c 26 Dec 2002 19:02:08 -0000 @@ -1114,7 +1114,6 @@ h8300_gdbarch_init (struct gdbarch_info set_gdbarch_saved_pc_after_call (gdbarch, h8300_saved_pc_after_call); set_gdbarch_frame_saved_pc (gdbarch, h8300_frame_saved_pc); set_gdbarch_skip_prologue (gdbarch, h8300_skip_prologue); - set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid); set_gdbarch_frame_args_address (gdbarch, h8300_frame_args_address); set_gdbarch_frame_locals_address (gdbarch, h8300_frame_locals_address); Index: hppa-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/hppa-tdep.c,v retrieving revision 1.41 diff -u -p -r1.41 hppa-tdep.c --- hppa-tdep.c 16 Dec 2002 16:51:45 -0000 1.41 +++ hppa-tdep.c 26 Dec 2002 19:02:09 -0000 @@ -1353,9 +1353,6 @@ hppa_frame_chain_valid (CORE_ADDR chain, struct unwind_table_entry *u, *next_u = NULL; struct frame_info *next; - if (!chain) - return 0; - u = find_unwind_entry (thisframe->pc); if (u == NULL) Index: i386-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/i386-tdep.c,v retrieving revision 1.104 diff -u -p -r1.104 i386-tdep.c --- i386-tdep.c 21 Dec 2002 19:58:07 -0000 1.104 +++ i386-tdep.c 26 Dec 2002 19:02:09 -0000 @@ -1407,9 +1407,6 @@ i386_svr4_init_abi (struct gdbarch_info set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section); set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); - /* FIXME: kettenis/20020511: Why do we override this function here? */ - set_gdbarch_frame_chain_valid (gdbarch, generic_func_frame_chain_valid); - set_gdbarch_pc_in_sigtramp (gdbarch, i386_svr4_pc_in_sigtramp); tdep->sigcontext_addr = i386_svr4_sigcontext_addr; tdep->sc_pc_offset = 14 * 4; @@ -1437,9 +1434,6 @@ i386_nw_init_abi (struct gdbarch_info in { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - /* FIXME: kettenis/20020511: Why do we override this function here? */ - set_gdbarch_frame_chain_valid (gdbarch, generic_func_frame_chain_valid); - tdep->jb_pc_offset = 24; } @@ -1634,7 +1628,6 @@ i386_gdbarch_init (struct gdbarch_info i set_gdbarch_frameless_function_invocation (gdbarch, i386_frameless_function_invocation); set_gdbarch_frame_chain (gdbarch, i386_frame_chain); - set_gdbarch_frame_chain_valid (gdbarch, generic_file_frame_chain_valid); set_gdbarch_frame_saved_pc (gdbarch, i386_frame_saved_pc); set_gdbarch_saved_pc_after_call (gdbarch, i386_saved_pc_after_call); set_gdbarch_frame_num_args (gdbarch, i386_frame_num_args); Index: ia64-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/ia64-tdep.c,v retrieving revision 1.41 diff -u -p -r1.41 ia64-tdep.c --- ia64-tdep.c 11 Dec 2002 02:26:36 -0000 1.41 +++ ia64-tdep.c 26 Dec 2002 19:02:09 -0000 @@ -2183,7 +2183,6 @@ ia64_gdbarch_init (struct gdbarch_info i set_gdbarch_saved_pc_after_call (gdbarch, ia64_saved_pc_after_call); set_gdbarch_frame_chain (gdbarch, ia64_frame_chain); - set_gdbarch_frame_chain_valid (gdbarch, generic_func_frame_chain_valid); set_gdbarch_frame_saved_pc (gdbarch, ia64_frame_saved_pc); set_gdbarch_frame_init_saved_regs (gdbarch, ia64_frame_init_saved_regs); Index: m68hc11-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/m68hc11-tdep.c,v retrieving revision 1.35 diff -u -p -r1.35 m68hc11-tdep.c --- m68hc11-tdep.c 11 Dec 2002 02:26:36 -0000 1.35 +++ m68hc11-tdep.c 26 Dec 2002 19:02:10 -0000 @@ -1331,14 +1331,12 @@ m68hc11_gdbarch_init (struct gdbarch_inf set_gdbarch_frame_chain (gdbarch, m68hc11_frame_chain); - set_gdbarch_frame_chain_valid (gdbarch, generic_file_frame_chain_valid); set_gdbarch_frame_saved_pc (gdbarch, m68hc11_frame_saved_pc); set_gdbarch_frame_args_address (gdbarch, m68hc11_frame_args_address); set_gdbarch_frame_locals_address (gdbarch, m68hc11_frame_locals_address); set_gdbarch_saved_pc_after_call (gdbarch, m68hc11_saved_pc_after_call); set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown); - set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid); set_gdbarch_get_saved_register (gdbarch, deprecated_generic_get_saved_register); set_gdbarch_store_struct_return (gdbarch, m68hc11_store_struct_return); Index: m68k-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/m68k-tdep.c,v retrieving revision 1.37 diff -u -p -r1.37 m68k-tdep.c --- m68k-tdep.c 11 Dec 2002 02:26:36 -0000 1.37 +++ m68k-tdep.c 26 Dec 2002 19:02:10 -0000 @@ -1010,7 +1010,6 @@ m68k_gdbarch_init (struct gdbarch_info i set_gdbarch_deprecated_store_return_value (gdbarch, m68k_store_return_value); set_gdbarch_frame_chain (gdbarch, m68k_frame_chain); - set_gdbarch_frame_chain_valid (gdbarch, generic_func_frame_chain_valid); set_gdbarch_frame_saved_pc (gdbarch, m68k_frame_saved_pc); set_gdbarch_frame_init_saved_regs (gdbarch, m68k_frame_init_saved_regs); set_gdbarch_frameless_function_invocation (gdbarch, Index: mcore-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/mcore-tdep.c,v retrieving revision 1.27 diff -u -p -r1.27 mcore-tdep.c --- mcore-tdep.c 11 Dec 2002 02:26:36 -0000 1.27 +++ mcore-tdep.c 26 Dec 2002 19:02:10 -0000 @@ -1131,7 +1131,6 @@ mcore_gdbarch_init (struct gdbarch_info set_gdbarch_init_extra_frame_info (gdbarch, mcore_init_extra_frame_info); set_gdbarch_frame_chain (gdbarch, mcore_frame_chain); - set_gdbarch_frame_chain_valid (gdbarch, generic_func_frame_chain_valid); set_gdbarch_frame_init_saved_regs (gdbarch, mcore_frame_init_saved_regs); set_gdbarch_frame_saved_pc (gdbarch, mcore_frame_saved_pc); set_gdbarch_deprecated_store_return_value (gdbarch, mcore_store_return_value); Index: mips-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/mips-tdep.c,v retrieving revision 1.148 diff -u -p -r1.148 mips-tdep.c --- mips-tdep.c 21 Dec 2002 06:36:02 -0000 1.148 +++ mips-tdep.c 26 Dec 2002 19:02:11 -0000 @@ -6016,7 +6016,6 @@ mips_gdbarch_init (struct gdbarch_info i set_gdbarch_coerce_float_to_double (gdbarch, mips_coerce_float_to_double); set_gdbarch_frame_chain (gdbarch, mips_frame_chain); - set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid); set_gdbarch_frameless_function_invocation (gdbarch, generic_frameless_function_invocation_not); set_gdbarch_frame_saved_pc (gdbarch, mips_frame_saved_pc); Index: mn10300-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/mn10300-tdep.c,v retrieving revision 1.41 diff -u -p -r1.41 mn10300-tdep.c --- mn10300-tdep.c 11 Dec 2002 02:26:36 -0000 1.41 +++ mn10300-tdep.c 26 Dec 2002 19:02:12 -0000 @@ -1162,9 +1162,7 @@ mn10300_gdbarch_init (struct gdbarch_inf set_gdbarch_decr_pc_after_break (gdbarch, 0); /* Stack unwinding. */ - set_gdbarch_frame_chain_valid (gdbarch, generic_file_frame_chain_valid); set_gdbarch_inner_than (gdbarch, core_addr_lessthan); - set_gdbarch_frame_chain_valid (gdbarch, generic_file_frame_chain_valid); set_gdbarch_saved_pc_after_call (gdbarch, mn10300_saved_pc_after_call); set_gdbarch_init_extra_frame_info (gdbarch, mn10300_init_extra_frame_info); set_gdbarch_deprecated_init_frame_pc (gdbarch, init_frame_pc_noop); Index: ns32k-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/ns32k-tdep.c,v retrieving revision 1.25 diff -u -p -r1.25 ns32k-tdep.c --- ns32k-tdep.c 11 Dec 2002 02:26:36 -0000 1.25 +++ ns32k-tdep.c 26 Dec 2002 19:02:12 -0000 @@ -590,7 +590,6 @@ ns32k_gdbarch_init (struct gdbarch_info generic_frameless_function_invocation_not); set_gdbarch_frame_chain (gdbarch, ns32k_frame_chain); - set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid); set_gdbarch_frame_saved_pc (gdbarch, ns32k_frame_saved_pc); set_gdbarch_frame_args_address (gdbarch, ns32k_frame_args_address); Index: ppcnbsd-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/ppcnbsd-tdep.c,v retrieving revision 1.5 diff -u -p -r1.5 ppcnbsd-tdep.c --- ppcnbsd-tdep.c 21 Dec 2002 19:58:07 -0000 1.5 +++ ppcnbsd-tdep.c 26 Dec 2002 19:02:12 -0000 @@ -207,9 +207,6 @@ static void ppcnbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { - /* Stop at main. */ - set_gdbarch_frame_chain_valid (gdbarch, generic_func_frame_chain_valid); - set_gdbarch_pc_in_sigtramp (gdbarch, ppcnbsd_pc_in_sigtramp); set_solib_svr4_fetch_link_map_offsets (gdbarch, Index: rs6000-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/rs6000-tdep.c,v retrieving revision 1.100 diff -u -p -r1.100 rs6000-tdep.c --- rs6000-tdep.c 18 Dec 2002 15:23:22 -0000 1.100 +++ rs6000-tdep.c 26 Dec 2002 19:02:12 -0000 @@ -2944,8 +2944,6 @@ rs6000_gdbarch_init (struct gdbarch_info set_gdbarch_use_struct_convention (gdbarch, generic_use_struct_convention); - set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); - set_gdbarch_frameless_function_invocation (gdbarch, rs6000_frameless_function_invocation); set_gdbarch_frame_chain (gdbarch, rs6000_frame_chain); Index: s390-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/s390-tdep.c,v retrieving revision 1.62 diff -u -p -r1.62 s390-tdep.c --- s390-tdep.c 11 Dec 2002 02:26:36 -0000 1.62 +++ s390-tdep.c 26 Dec 2002 19:02:13 -0000 @@ -1815,7 +1815,6 @@ s390_gdbarch_init (struct gdbarch_info i set_gdbarch_cannot_fetch_register (gdbarch, s390_cannot_fetch_register); set_gdbarch_cannot_store_register (gdbarch, s390_cannot_fetch_register); set_gdbarch_use_struct_convention (gdbarch, s390_use_struct_convention); - set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid); set_gdbarch_register_name (gdbarch, s390_register_name); set_gdbarch_stab_reg_to_regnum (gdbarch, s390_stab_reg_to_regnum); set_gdbarch_dwarf_reg_to_regnum (gdbarch, s390_stab_reg_to_regnum); Index: sh-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/sh-tdep.c,v retrieving revision 1.82 diff -u -p -r1.82 sh-tdep.c --- sh-tdep.c 11 Dec 2002 02:26:36 -0000 1.82 +++ sh-tdep.c 26 Dec 2002 19:02:13 -0000 @@ -4589,7 +4589,6 @@ sh_gdbarch_init (struct gdbarch_info inf set_gdbarch_frame_args_skip (gdbarch, 0); set_gdbarch_frameless_function_invocation (gdbarch, frameless_look_for_prologue); - set_gdbarch_frame_chain_valid (gdbarch, generic_file_frame_chain_valid); set_gdbarch_frame_saved_pc (gdbarch, sh_frame_saved_pc); set_gdbarch_saved_pc_after_call (gdbarch, sh_saved_pc_after_call); set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown); Index: sparc-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/sparc-tdep.c,v retrieving revision 1.53 diff -u -p -r1.53 sparc-tdep.c --- sparc-tdep.c 11 Dec 2002 20:35:43 -0000 1.53 +++ sparc-tdep.c 26 Dec 2002 19:02:14 -0000 @@ -3356,7 +3356,6 @@ sparc_gdbarch_init (struct gdbarch_info { case bfd_mach_sparc: set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value); - set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); set_gdbarch_num_regs (gdbarch, 72); set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4); set_gdbarch_register_name (gdbarch, sparc32_register_name); @@ -3367,7 +3366,6 @@ sparc_gdbarch_init (struct gdbarch_info break; case bfd_mach_sparc_sparclet: set_gdbarch_deprecated_extract_return_value (gdbarch, sparclet_extract_return_value); - set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); set_gdbarch_num_regs (gdbarch, 32 + 32 + 8 + 8 + 8); set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4 + 8*4); set_gdbarch_register_name (gdbarch, sparclet_register_name); @@ -3378,7 +3376,6 @@ sparc_gdbarch_init (struct gdbarch_info break; case bfd_mach_sparc_sparclite: set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value); - set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid); set_gdbarch_num_regs (gdbarch, 80); set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4); set_gdbarch_register_name (gdbarch, sparclite_register_name); @@ -3389,7 +3386,6 @@ sparc_gdbarch_init (struct gdbarch_info break; case bfd_mach_sparc_v8plus: set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value); - set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); set_gdbarch_num_regs (gdbarch, 72); set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4); set_gdbarch_register_name (gdbarch, sparc32_register_name); @@ -3400,7 +3396,6 @@ sparc_gdbarch_init (struct gdbarch_info break; case bfd_mach_sparc_v8plusa: set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value); - set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); set_gdbarch_num_regs (gdbarch, 72); set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4); set_gdbarch_register_name (gdbarch, sparc32_register_name); @@ -3411,7 +3406,6 @@ sparc_gdbarch_init (struct gdbarch_info break; case bfd_mach_sparc_sparclite_le: set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value); - set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid); set_gdbarch_num_regs (gdbarch, 80); set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4); set_gdbarch_register_name (gdbarch, sparclite_register_name); @@ -3422,7 +3416,6 @@ sparc_gdbarch_init (struct gdbarch_info break; case bfd_mach_sparc_v9: set_gdbarch_deprecated_extract_return_value (gdbarch, sparc64_extract_return_value); - set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); set_gdbarch_num_regs (gdbarch, 125); set_gdbarch_register_bytes (gdbarch, 32*8 + 32*8 + 45*8); set_gdbarch_register_name (gdbarch, sparc64_register_name); @@ -3433,7 +3426,6 @@ sparc_gdbarch_init (struct gdbarch_info break; case bfd_mach_sparc_v9a: set_gdbarch_deprecated_extract_return_value (gdbarch, sparc64_extract_return_value); - set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); set_gdbarch_num_regs (gdbarch, 125); set_gdbarch_register_bytes (gdbarch, 32*8 + 32*8 + 45*8); set_gdbarch_register_name (gdbarch, sparc64_register_name); Index: v850-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/v850-tdep.c,v retrieving revision 1.30 diff -u -p -r1.30 v850-tdep.c --- v850-tdep.c 11 Dec 2002 02:26:36 -0000 1.30 +++ v850-tdep.c 26 Dec 2002 19:02:15 -0000 @@ -1240,7 +1240,6 @@ v850_gdbarch_init (struct gdbarch_info i set_gdbarch_saved_pc_after_call (gdbarch, v850_saved_pc_after_call); set_gdbarch_frame_saved_pc (gdbarch, v850_frame_saved_pc); set_gdbarch_skip_prologue (gdbarch, v850_skip_prologue); - set_gdbarch_frame_chain_valid (gdbarch, generic_file_frame_chain_valid); /* * Miscelany Index: vax-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/vax-tdep.c,v retrieving revision 1.26 diff -u -p -r1.26 vax-tdep.c --- vax-tdep.c 11 Dec 2002 02:26:36 -0000 1.26 +++ vax-tdep.c 26 Dec 2002 19:02:15 -0000 @@ -665,7 +665,6 @@ vax_gdbarch_init (struct gdbarch_info in generic_frameless_function_invocation_not); set_gdbarch_frame_chain (gdbarch, vax_frame_chain); - set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid); set_gdbarch_frame_saved_pc (gdbarch, vax_frame_saved_pc); set_gdbarch_frame_args_address (gdbarch, vax_frame_args_address); Index: x86-64-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/x86-64-tdep.c,v retrieving revision 1.44 diff -u -p -r1.44 x86-64-tdep.c --- x86-64-tdep.c 21 Dec 2002 21:09:58 -0000 1.44 +++ x86-64-tdep.c 26 Dec 2002 19:02:15 -0000 @@ -1005,9 +1005,6 @@ x86_64_init_abi (struct gdbarch_info inf set_gdbarch_frame_chain (gdbarch, x86_64_linux_frame_chain); set_gdbarch_frameless_function_invocation (gdbarch, x86_64_frameless_function_invocation); - /* FIXME: kettenis/20021025: Shouldn't this be set to - generic_file_frame_chain_valid? */ - set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); /* FIXME: kettenis/20021026: These two are GNU/Linux-specific and should be moved elsewhere. */ set_gdbarch_frame_saved_pc (gdbarch, x86_64_linux_frame_saved_pc); Index: config/m32r/tm-m32r.h =================================================================== RCS file: /cvs/src/src/gdb/config/m32r/tm-m32r.h,v retrieving revision 1.13 diff -u -p -r1.13 tm-m32r.h --- config/m32r/tm-m32r.h 11 Dec 2002 02:26:37 -0000 1.13 +++ config/m32r/tm-m32r.h 26 Dec 2002 19:02:15 -0000 @@ -130,8 +130,6 @@ extern CORE_ADDR m32r_frame_chain (struc /* mvs_check FRAME_CHAIN */ #define FRAME_CHAIN(fi) m32r_frame_chain (fi) -#define FRAME_CHAIN_VALID(fp, frame) generic_file_frame_chain_valid (fp, frame) - extern CORE_ADDR m32r_find_callers_reg (struct frame_info *fi, int regnum); extern CORE_ADDR m32r_frame_saved_pc (struct frame_info *); /* mvs_check FRAME_SAVED_PC */ Index: config/m68k/tm-apollo68b.h =================================================================== RCS file: /cvs/src/src/gdb/config/m68k/tm-apollo68b.h,v retrieving revision 1.2 diff -u -p -r1.2 tm-apollo68b.h --- config/m68k/tm-apollo68b.h 6 Mar 2001 08:21:30 -0000 1.2 +++ config/m68k/tm-apollo68b.h 26 Dec 2002 19:02:15 -0000 @@ -26,8 +26,6 @@ #include "m68k/tm-m68k.h" -#define FRAME_CHAIN_VALID(chain, thisframe) nonnull_frame_chain_valid (chain, thisframe) - /* These are the jmp_buf registers I could guess. There are 13 registers * in the buffer. There are 8 data registers, 6 general address registers, * the Frame Pointer, the Stack Pointer, the PC and the SR in the chip. I would Index: config/m68k/tm-m68kv4.h =================================================================== RCS file: /cvs/src/src/gdb/config/m68k/tm-m68kv4.h,v retrieving revision 1.5 diff -u -p -r1.5 tm-m68kv4.h --- config/m68k/tm-m68kv4.h 5 Jun 2002 19:18:23 -0000 1.5 +++ config/m68k/tm-m68kv4.h 26 Dec 2002 19:02:15 -0000 @@ -30,10 +30,6 @@ #define DECR_PC_AFTER_BREAK 0 /* No decrement required */ -/* Use the alternate method of determining valid frame chains. */ - -#define FRAME_CHAIN_VALID(fp,fi) func_frame_chain_valid (fp, fi) - #include "config/tm-sysv4.h" #include "m68k/tm-m68k.h" Index: config/m68k/tm-monitor.h =================================================================== RCS file: /cvs/src/src/gdb/config/m68k/tm-monitor.h,v retrieving revision 1.2 diff -u -p -r1.2 tm-monitor.h --- config/m68k/tm-monitor.h 6 Mar 2001 08:21:30 -0000 1.2 +++ config/m68k/tm-monitor.h 26 Dec 2002 19:02:15 -0000 @@ -38,9 +38,4 @@ #include "m68k/tm-m68k.h" -/* Need to do this for ELF targets, where we can't figure out the boundaries of - the entry file. This method stops the backtrace when we reach main. */ - -#define FRAME_CHAIN_VALID(fp,fi) func_frame_chain_valid (fp, fi) - /* FIXME, should do GET_LONGJMP_TARGET for newlib. */ Index: config/m68k/tm-os68k.h =================================================================== RCS file: /cvs/src/src/gdb/config/m68k/tm-os68k.h,v retrieving revision 1.2 diff -u -p -r1.2 tm-os68k.h --- config/m68k/tm-os68k.h 6 Mar 2001 08:21:30 -0000 1.2 +++ config/m68k/tm-os68k.h 26 Dec 2002 19:02:15 -0000 @@ -37,11 +37,3 @@ #undef FRAME_CHAIN #define FRAME_CHAIN(thisframe) ((thisframe)->frame? read_memory_integer ((thisframe)->frame, 4): 0) - -/* If the chain pointer is zero (either because the saved value fetched - by FRAME_CHAIN was zero, or because the current FP was zero so FRAME_CHAIN - never fetched anything), we are at the top of the stack. */ -/* We are guaranteed to have a zero frame pointer at bottom of stack, too. */ - -#undef FRAME_CHAIN_VALID -#define FRAME_CHAIN_VALID(chain, thisframe) nonnull_frame_chain_valid (chain, thisframe) Index: config/m68k/tm-vx68.h =================================================================== RCS file: /cvs/src/src/gdb/config/m68k/tm-vx68.h,v retrieving revision 1.5 diff -u -p -r1.5 tm-vx68.h --- config/m68k/tm-vx68.h 5 Jun 2002 19:18:23 -0000 1.5 +++ config/m68k/tm-vx68.h 26 Dec 2002 19:02:15 -0000 @@ -41,14 +41,6 @@ #undef FRAME_CHAIN #define FRAME_CHAIN(thisframe) ((thisframe)->frame? read_memory_integer ((thisframe)->frame, 4): 0) -/* If the chain pointer is zero (either because the saved value fetched - by FRAME_CHAIN was zero, or because the current FP was zero so FRAME_CHAIN - never fetched anything), we are at the top of the stack. */ -/* We are guaranteed to have a zero frame pointer at bottom of stack, too. */ - -#undef FRAME_CHAIN_VALID -#define FRAME_CHAIN_VALID(chain, thisframe) nonnull_frame_chain_valid (chain, thisframe) - /* FIXME, Longjmp information stolen from Sun-3 config. Dunno if right. */ /* Offsets (in target ints) into jmp_buf. Not defined by Sun, but at least documented in a comment in ! */ Index: config/mn10200/tm-mn10200.h =================================================================== RCS file: /cvs/src/src/gdb/config/mn10200/tm-mn10200.h,v retrieving revision 1.21 diff -u -p -r1.21 tm-mn10200.h --- config/mn10200/tm-mn10200.h 11 Dec 2002 02:26:37 -0000 1.21 +++ config/mn10200/tm-mn10200.h 26 Dec 2002 19:02:15 -0000 @@ -116,7 +116,6 @@ extern void mn10200_frame_find_saved_reg extern CORE_ADDR mn10200_frame_chain (struct frame_info *); #define FRAME_CHAIN(fi) mn10200_frame_chain (fi) -#define FRAME_CHAIN_VALID(FP, FI) generic_file_frame_chain_valid (FP, FI) extern CORE_ADDR mn10200_find_callers_reg (struct frame_info *, int); extern CORE_ADDR mn10200_frame_saved_pc (struct frame_info *); Index: config/sparc/tm-sparclite.h =================================================================== RCS file: /cvs/src/src/gdb/config/sparc/tm-sparclite.h,v retrieving revision 1.5 diff -u -p -r1.5 tm-sparclite.h --- config/sparc/tm-sparclite.h 20 Jan 2002 19:26:50 -0000 1.5 +++ config/sparc/tm-sparclite.h 26 Dec 2002 19:02:15 -0000 @@ -63,9 +63,6 @@ enum { * The following defines must go away for MULTI_ARCH. */ -#undef FRAME_CHAIN_VALID -#define FRAME_CHAIN_VALID(FP,FI) func_frame_chain_valid (FP, FI) - #undef NUM_REGS #define NUM_REGS 80 Index: doc/gdb.texinfo =================================================================== RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v retrieving revision 1.131 diff -u -p -r1.131 gdb.texinfo --- doc/gdb.texinfo 11 Oct 2002 16:13:15 -0000 1.131 +++ doc/gdb.texinfo 26 Dec 2002 19:02:19 -0000 @@ -3860,6 +3860,26 @@ The display for frame zero does not begi value, indicating that your program has stopped at the beginning of the code for line @code{993} of @code{builtin.c}. +Most programs have a standard entry point---a place where system libraries +and startup code transition into user code. For C this is @code{main}. +When @value{GDBN} finds the entry function in a backtrace it will terminate +the backtrace, to avoid tracing into highly system-specific (and generally +uninteresting) code. If you need to examine the startup code, then you can +change this behavior. + +@table @code +@item set backtrace-below-main off +Backtraces will stop when they encounter the user entry point. This is the +default. + +@item set backtrace-below-main +@itemx set backtrace-below-main on +Backtraces will continue past the user entry point to the top of the stack. + +@item show backtrace-below-main +Display the current backtrace policy. +@end table + @node Selection @section Selecting a frame Index: doc/gdbint.texinfo =================================================================== RCS file: /cvs/src/src/gdb/doc/gdbint.texinfo,v retrieving revision 1.111 diff -u -p -r1.111 gdbint.texinfo --- doc/gdbint.texinfo 23 Dec 2002 18:53:16 -0000 1.111 +++ doc/gdbint.texinfo 26 Dec 2002 19:02:21 -0000 @@ -3322,26 +3322,12 @@ Given @var{frame}, return a pointer to t @item FRAME_CHAIN_VALID(@var{chain}, @var{thisframe}) @findex FRAME_CHAIN_VALID -Define this to be an expression that returns zero if the given frame is -an outermost frame, with no caller, and nonzero otherwise. Several -common definitions are available: - -@itemize @bullet -@item -@code{file_frame_chain_valid} is nonzero if the chain pointer is nonzero -and given frame's PC is not inside the startup file (such as -@file{crt0.o}). - -@item -@code{func_frame_chain_valid} is nonzero if the chain -pointer is nonzero and the given frame's PC is not in @code{main} or a -known entry point function (such as @code{_start}). - -@item -@code{generic_file_frame_chain_valid} and -@code{generic_func_frame_chain_valid} are equivalent implementations for -targets using generic dummy frames. -@end itemize +Define this to be an expression that returns zero if the given frame is an +outermost frame, with no caller, and nonzero otherwise. Most normal +situations can be handled without defining this macro, including @code{NULL} +chain pointers, dummy frames, and frames whose PC values are inside the +startup file (e.g.@: @file{crt0.o}), inside @code{main}, or inside +@code{_start}. @item FRAME_INIT_SAVED_REGS(@var{frame}) @findex FRAME_INIT_SAVED_REGS