summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>2004-09-01 14:13:33 +0000
committerAndrew Cagney <cagney@redhat.com>2004-09-01 14:13:33 +0000
commit71d9dad41e99685fc9473de91ceba344aaed8d45 (patch)
treee14ac65e47c78230231fdae6feee8f1f04a9268b
parent7ba7a2c50f57f303a67e9a57564703033ba861e8 (diff)
downloadgdb-71d9dad41e99685fc9473de91ceba344aaed8d45.tar.gz
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.
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/Makefile.in2
-rw-r--r--gdb/blockframe.c84
-rw-r--r--gdb/defs.h2
-rw-r--r--gdb/frame.c36
5 files changed, 37 insertions, 96 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 45c3cc1a9fe..22ab390991d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,12 @@
+2004-09-01 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.
+
2004-08-31 Jim Blandy <jimb@redhat.com>
* dwarf2read.c (is_vtable_name): New function, based on logic from
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 9aa6ff3f756..d2d7348600a 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -1885,7 +1885,7 @@ frame.o: frame.c $(defs_h) $(frame_h) $(target_h) $(value_h) $(inferior_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) \
diff --git a/gdb/blockframe.c b/gdb/blockframe.c
index 7d9618fc59f..d752c8dd27f 100644
--- a/gdb/blockframe.c
+++ b/gdb/blockframe.c
@@ -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
diff --git a/gdb/defs.h b/gdb/defs.h
index 69d96856158..7474b3da3d8 100644
--- a/gdb/defs.h
+++ b/gdb/defs.h
@@ -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);
diff --git a/gdb/frame.c b/gdb/frame.c
index a723b32111e..0d0e2c9094d 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -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_file *file,
}
}
+/* 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_frame)
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;