From a4b4f5205874ff2b856aad63a4298f7eb205262f Mon Sep 17 00:00:00 2001 From: Stu Grossman Date: Thu, 9 Jun 1994 06:30:38 +0000 Subject: [PATCH] * nlmread.c (nlm_symtab_read): Clean up a bit. * (nlm_symfile_read): Record bounds of main() so that backtrace command will know where to stop. * objfiles.c (objfile_relocate): Relocate entry point/func info for backtrace as well. * objfiles.h: Define values for invalid PCs for entry point info. * symfile.c (init_entry_point_info): Initialize invalid values with aforementioned macros. * config/alpha/tm-alphanw.h: Turn on FRAME_CHAIN_VALID_ALTERNATE to cause backtrace to stop when it gets back to main(). * config/i386/tm-i386nw.h: Ditto. --- gdb/ChangeLog | 14 ++++++++++++++ gdb/config/alpha/tm-alphanw.h | 4 ++++ gdb/config/i386/tm-i386nw.h | 8 ++++++-- gdb/nlmread.c | 29 ++++++++++++++++------------- gdb/objfiles.c | 21 +++++++++++++++++++++ gdb/objfiles.h | 11 +++++++++++ 6 files changed, 72 insertions(+), 15 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 25ac157aef..8964125a57 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +Wed Jun 8 23:20:45 1994 Stu Grossman (grossman@cygnus.com) + + * nlmread.c (nlm_symtab_read): Clean up a bit. + * (nlm_symfile_read): Record bounds of main() so that backtrace + command will know where to stop. + * objfiles.c (objfile_relocate): Relocate entry point/func info + for backtrace as well. + * objfiles.h: Define values for invalid PCs for entry point info. + * symfile.c (init_entry_point_info): Initialize invalid values + with aforementioned macros. + * config/alpha/tm-alphanw.h: Turn on FRAME_CHAIN_VALID_ALTERNATE + to cause backtrace to stop when it gets back to main(). + * config/i386/tm-i386nw.h: Ditto. + Sat Jun 4 18:17:03 1994 Per Bothner (bothner@kalessin.cygnus.com) Fix value_print, which used to be ostensibly langauge-indepentdent, diff --git a/gdb/config/alpha/tm-alphanw.h b/gdb/config/alpha/tm-alphanw.h index cf3075e463..6ee46511d4 100644 --- a/gdb/config/alpha/tm-alphanw.h +++ b/gdb/config/alpha/tm-alphanw.h @@ -8,3 +8,7 @@ #define VM_MIN_ADDRESS ((CORE_ADDR)0) #include "alpha/tm-alpha.h" + +/* Stop backtracing when we wander into main. */ + +#define FRAME_CHAIN_VALID_ALTERNATE diff --git a/gdb/config/i386/tm-i386nw.h b/gdb/config/i386/tm-i386nw.h index 8cab416933..45af050bbd 100644 --- a/gdb/config/i386/tm-i386nw.h +++ b/gdb/config/i386/tm-i386nw.h @@ -1,5 +1,5 @@ -/* Macro definitions for i386 running under Univel NetWare. - Copyright 1993 Free Software Foundation, Inc. +/* Macro definitions for i386 running NetWare. + Copyright 1993, 1994 Free Software Foundation, Inc. This file is part of GDB. @@ -25,3 +25,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ be extracted out and placed in a tm-i386.h file that all the others, including tm-i386v.h, includes as needed. */ #include "i386/tm-i386v.h" + +/* Stop backtracing when we wander into main. */ + +#define FRAME_CHAIN_VALID_ALTERNATE diff --git a/gdb/nlmread.c b/gdb/nlmread.c index 3895053282..a5d6186722 100644 --- a/gdb/nlmread.c +++ b/gdb/nlmread.c @@ -150,25 +150,18 @@ nlm_symtab_read (abfd, addr, objfile) symaddr = sym -> value + sym -> section -> vma; /* Relocate all non-absolute symbols by base address. */ if (sym -> section != &bfd_abs_section) - { - symaddr += addr; - } + symaddr += addr; /* For non-absolute symbols, use the type of the section - they are relative to, to intuit text/data. Bfd provides + they are relative to, to intuit text/data. BFD provides no way of figuring this out for absolute symbols. */ if (sym -> section -> flags & SEC_CODE) - { - ms_type = mst_text; - } + ms_type = mst_text; else if (sym -> section -> flags & SEC_DATA) - { - ms_type = mst_data; - } + ms_type = mst_data; else - { - ms_type = mst_unknown; - } + ms_type = mst_unknown; + record_minimal_symbol ((char *) sym -> name, symaddr, ms_type, objfile); } @@ -214,6 +207,7 @@ nlm_symfile_read (objfile, section_offsets, mainline) bfd *abfd = objfile -> obfd; struct cleanup *back_to; CORE_ADDR offset; + struct symbol *mainsym; init_minimal_symbol_collection (); back_to = make_cleanup (discard_minimal_symbols, 0); @@ -230,6 +224,15 @@ nlm_symfile_read (objfile, section_offsets, mainline) stabsect_build_psymtabs (objfile, section_offsets, mainline, ".stab", ".stabstr"); + mainsym = lookup_symbol ("main", NULL, VAR_NAMESPACE, NULL, NULL); + + if (mainsym + && mainsym->class == LOC_BLOCK) + { + objfile->ei.main_func_lowpc = BLOCK_START (SYMBOL_BLOCK_VALUE (mainsym)); + objfile->ei.main_func_highpc = BLOCK_END (SYMBOL_BLOCK_VALUE (mainsym)); + } + /* FIXME: We could locate and read the optional native debugging format here and add the symbols to the minimal symbol table. */ diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 530e19b054..5e9e354678 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -578,6 +578,27 @@ objfile_relocate (objfile, new_offsets) } } } + + if (objfile->ei.entry_point != ~0) + objfile->ei.entry_point += ANOFFSET (delta, SECT_OFF_TEXT); + + if (objfile->ei.entry_func_lowpc != INVALID_ENTRY_LOWPC) + { + objfile->ei.entry_func_lowpc += ANOFFSET (delta, SECT_OFF_TEXT); + objfile->ei.entry_func_highpc += ANOFFSET (delta, SECT_OFF_TEXT); + } + + if (objfile->ei.entry_file_lowpc != INVALID_ENTRY_LOWPC) + { + objfile->ei.entry_file_lowpc += ANOFFSET (delta, SECT_OFF_TEXT); + objfile->ei.entry_file_highpc += ANOFFSET (delta, SECT_OFF_TEXT); + } + + if (objfile->ei.main_func_lowpc != INVALID_ENTRY_LOWPC) + { + objfile->ei.main_func_lowpc += ANOFFSET (delta, SECT_OFF_TEXT); + objfile->ei.main_func_highpc += ANOFFSET (delta, SECT_OFF_TEXT); + } } /* Many places in gdb want to test just to see if we have any partial diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 252a75d1e4..8a1fdc632f 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -93,6 +93,8 @@ struct entry_info CORE_ADDR entry_point; +#define INVALID_ENTRY_POINT (~0) /* ~0 will not be in any file, we hope. */ + /* Start (inclusive) and end (exclusive) of function containing the entry point. */ @@ -110,6 +112,15 @@ struct entry_info CORE_ADDR main_func_lowpc; CORE_ADDR main_func_highpc; +/* Use these values when any of the above ranges is invalid. */ + +/* We use these values because it guarantees that there is no number that is + both >= LOWPC && < HIGHPC. It is also highly unlikely that 3 is a valid + module or function start address (as opposed to 0). */ + +#define INVALID_ENTRY_LOWPC (3) +#define INVALID_ENTRY_HIGHPC (1) + }; -- 2.34.1