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]

[commit] Simplify inside_main_func


Hello,

This re-implements inside_main_func, replacing the old pc-in-range code with the simpler frame->entry-point == main->entry-point test.

tested on PPC/NetBSD and i386 GNU/Linux.

committed,
Andrew
2004-08-31  Andrew Cagney  <cagney@gnu.org>

	* frame.c: Include "objfiles.h".
	(inside_main_func): New function.
	(get_prev_frame): Use new inside_main_func.
	* Makefile.in (frame.o): Update dependencies.
	* defs.h (inside_main_func): Delete declaration.
	* blockframe.c (inside_main_func): Delete function.

Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.611
diff -p -u -r1.611 Makefile.in
--- Makefile.in	22 Aug 2004 19:03:41 -0000	1.611
+++ Makefile.in	1 Sep 2004 14:09:03 -0000
@@ -1885,7 +1885,7 @@ frame.o: frame.c $(defs_h) $(frame_h) $(
 	$(regcache_h) $(gdb_assert_h) $(gdb_string_h) $(user_regs_h) \
 	$(gdb_obstack_h) $(dummy_frame_h) $(sentinel_frame_h) $(gdbcore_h) \
 	$(annotate_h) $(language_h) $(frame_unwind_h) $(frame_base_h) \
-	$(command_h) $(gdbcmd_h) $(observer_h)
+	$(command_h) $(gdbcmd_h) $(observer_h) $(objfiles_h)
 frame-unwind.o: frame-unwind.c $(defs_h) $(frame_h) $(frame_unwind_h) \
 	$(gdb_assert_h) $(dummy_frame_h) $(gdb_obstack_h)
 frv-linux-tdep.o: frv-linux-tdep.c $(defs_h) $(target_h) $(frame_h) \
Index: blockframe.c
===================================================================
RCS file: /cvs/src/src/gdb/blockframe.c,v
retrieving revision 1.106
diff -p -u -r1.106 blockframe.c
--- blockframe.c	2 Aug 2004 19:44:39 -0000	1.106
+++ blockframe.c	1 Sep 2004 14:09:03 -0000
@@ -43,90 +43,6 @@
 
 void _initialize_blockframe (void);
 
-/* Test whether PC is in the range of addresses that corresponds to
-   the "main" function.  */
-
-int
-inside_main_func (CORE_ADDR pc)
-{
-  struct minimal_symbol *msymbol;
-
-  if (symfile_objfile == 0)
-    return 0;
-
-  msymbol = lookup_minimal_symbol (main_name (), NULL, symfile_objfile);
-
-  /* If the address range hasn't been set up at symbol reading time,
-     set it up now.  */
-
-  if (msymbol != NULL
-      && symfile_objfile->ei.main_func_lowpc == INVALID_ENTRY_LOWPC
-      && symfile_objfile->ei.main_func_highpc == INVALID_ENTRY_HIGHPC)
-    {
-      /* brobecker/2003-10-10: We used to rely on lookup_symbol() to
-	 search the symbol associated to the "main" function.
-	 Unfortunately, lookup_symbol() uses the current-language
-	 la_lookup_symbol_nonlocal function to do the global symbol
-	 search.  Depending on the language, this can introduce
-	 certain side-effects, because certain languages, for instance
-	 Ada, may find more than one match.  Therefore we prefer to
-	 search the "main" function symbol using its address rather
-	 than its name.  */
-      struct symbol *mainsym =
-	find_pc_function (SYMBOL_VALUE_ADDRESS (msymbol));
-
-      if (mainsym && SYMBOL_CLASS (mainsym) == LOC_BLOCK)
-	{
-	  symfile_objfile->ei.main_func_lowpc =
-	    BLOCK_START (SYMBOL_BLOCK_VALUE (mainsym));
-	  symfile_objfile->ei.main_func_highpc =
-	    BLOCK_END (SYMBOL_BLOCK_VALUE (mainsym));
-	}
-    }
-
-  /* Not in the normal symbol tables, see if "main" is in the partial
-     symbol table.  If it's not, then give up.  */
-  if (msymbol != NULL && MSYMBOL_TYPE (msymbol) == mst_text)
-    {
-      CORE_ADDR maddr = SYMBOL_VALUE_ADDRESS (msymbol);
-      asection *msect = SYMBOL_BFD_SECTION (msymbol);
-      struct obj_section *osect = find_pc_sect_section (maddr, msect);
-
-      if (osect != NULL)
-	{
-	  int i;
-
-	  /* Step over other symbols at this same address, and symbols
-	     in other sections, to find the next symbol in this
-	     section with a different address.  */
-	  for (i = 1; SYMBOL_LINKAGE_NAME (msymbol + i) != NULL; i++)
-	    {
-	      if (SYMBOL_VALUE_ADDRESS (msymbol + i) != maddr
-		  && SYMBOL_BFD_SECTION (msymbol + i) == msect)
-		break;
-	    }
-
-	  symfile_objfile->ei.main_func_lowpc = maddr;
-
-	  /* Use the lesser of the next minimal symbol in the same
-	     section, or the end of the section, as the end of the
-	     function.  */
-	  if (SYMBOL_LINKAGE_NAME (msymbol + i) != NULL
-	      && SYMBOL_VALUE_ADDRESS (msymbol + i) < osect->endaddr)
-	    symfile_objfile->ei.main_func_highpc =
-	      SYMBOL_VALUE_ADDRESS (msymbol + i);
-	  else
-	    /* We got the start address from the last msymbol in the
-	       objfile.  So the end address is the end of the
-	       section.  */
-	    symfile_objfile->ei.main_func_highpc = osect->endaddr;
-	}
-    }
-
-  return (symfile_objfile->ei.main_func_lowpc <= pc
-	  && symfile_objfile->ei.main_func_highpc > pc);
-}
-
 /* Test whether THIS_FRAME is inside the process entry point function.  */
 
 int
Index: defs.h
===================================================================
RCS file: /cvs/src/src/gdb/defs.h,v
retrieving revision 1.161
diff -p -u -r1.161 defs.h
--- defs.h	14 Aug 2004 20:56:27 -0000	1.161
+++ defs.h	1 Sep 2004 14:09:03 -0000
@@ -340,8 +340,6 @@ struct frame_info;
 
 extern int inside_entry_func (struct frame_info *this_frame);
 
-extern int inside_main_func (CORE_ADDR pc);
-
 /* From utils.c */
 
 extern void initialize_utils (void);
Index: frame.c
===================================================================
RCS file: /cvs/src/src/gdb/frame.c,v
retrieving revision 1.190
diff -p -u -r1.190 frame.c
--- frame.c	2 Aug 2004 03:36:24 -0000	1.190
+++ frame.c	1 Sep 2004 14:09:03 -0000
@@ -40,6 +40,7 @@
 #include "command.h"
 #include "gdbcmd.h"
 #include "observer.h"
+#include "objfiles.h"
 
 static struct frame_info *get_prev_frame_1 (struct frame_info *this_frame);
 
@@ -1108,6 +1109,27 @@ frame_debug_got_null_frame (struct ui_fi
     }
 }
 
+/* Is this (non-sentinel) frame in the "main"() function?  */
+
+static int
+inside_main_func (struct frame_info *this_frame)
+{
+  struct minimal_symbol *msymbol;
+  CORE_ADDR maddr;
+
+  if (symfile_objfile == 0)
+    return 0;
+  msymbol = lookup_minimal_symbol (main_name (), NULL, symfile_objfile);
+  if (msymbol == NULL)
+    return 0;
+  /* Make certain that the code, and not descriptor, address is
+     returned.  */
+  maddr = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
+					      SYMBOL_VALUE_ADDRESS (msymbol),
+					      &current_target);
+  return maddr == get_frame_func (this_frame);
+}
+
 /* Return a structure containing various interesting information about
    the frame that called THIS_FRAME.  Returns NULL if there is entier
    no such frame or the frame fails any of a set of target-independent
@@ -1163,17 +1185,13 @@ get_prev_frame (struct frame_info *this_
      get_current_frame().  */
   gdb_assert (this_frame != NULL);
 
-  /* Make sure we pass an address within THIS_FRAME's code block to
-     inside_main_func().  Otherwise, we might stop unwinding at a
-     function which has a call instruction as its last instruction if
-     that function immediately precedes main().  */
   if (this_frame->level >= 0
       && !backtrace_past_main
-      && inside_main_func (get_frame_address_in_block (this_frame)))
-    /* Don't unwind past main(), but always unwind the sentinel frame.
-       Note, this is done _before_ the frame has been marked as
-       previously unwound.  That way if the user later decides to
-       allow unwinds past main(), that just happens.  */
+      && inside_main_func (this_frame))
+    /* Don't unwind past main().  Note, this is done _before_ the
+       frame has been marked as previously unwound.  That way if the
+       user later decides to enable unwinds past main(), that will
+       automatically happen.  */
     {
       frame_debug_got_null_frame (gdb_stdlog, this_frame, "inside main func");
       return NULL;

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