This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFC: Mostly kill FRAME_CHAIN_VALID, add user knob


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  <drow@mvista.com>

	* 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  <drow@mvista.com>

	* 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 <machine/setjmp.h>! */
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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]