* 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.
This commit is contained in:
Stu Grossman 1994-06-09 06:30:38 +00:00
parent 5005cbca02
commit a4b4f52058
6 changed files with 72 additions and 15 deletions

View file

@ -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) Sat Jun 4 18:17:03 1994 Per Bothner (bothner@kalessin.cygnus.com)
Fix value_print, which used to be ostensibly langauge-indepentdent, Fix value_print, which used to be ostensibly langauge-indepentdent,

View file

@ -8,3 +8,7 @@
#define VM_MIN_ADDRESS ((CORE_ADDR)0) #define VM_MIN_ADDRESS ((CORE_ADDR)0)
#include "alpha/tm-alpha.h" #include "alpha/tm-alpha.h"
/* Stop backtracing when we wander into main. */
#define FRAME_CHAIN_VALID_ALTERNATE

View file

@ -1,5 +1,5 @@
/* Macro definitions for i386 running under Univel NetWare. /* Macro definitions for i386 running NetWare.
Copyright 1993 Free Software Foundation, Inc. Copyright 1993, 1994 Free Software Foundation, Inc.
This file is part of GDB. 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, be extracted out and placed in a tm-i386.h file that all the others,
including tm-i386v.h, includes as needed. */ including tm-i386v.h, includes as needed. */
#include "i386/tm-i386v.h" #include "i386/tm-i386v.h"
/* Stop backtracing when we wander into main. */
#define FRAME_CHAIN_VALID_ALTERNATE

View file

@ -150,25 +150,18 @@ nlm_symtab_read (abfd, addr, objfile)
symaddr = sym -> value + sym -> section -> vma; symaddr = sym -> value + sym -> section -> vma;
/* Relocate all non-absolute symbols by base address. */ /* Relocate all non-absolute symbols by base address. */
if (sym -> section != &bfd_abs_section) if (sym -> section != &bfd_abs_section)
{ symaddr += addr;
symaddr += addr;
}
/* For non-absolute symbols, use the type of the section /* 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. */ no way of figuring this out for absolute symbols. */
if (sym -> section -> flags & SEC_CODE) if (sym -> section -> flags & SEC_CODE)
{ ms_type = mst_text;
ms_type = mst_text;
}
else if (sym -> section -> flags & SEC_DATA) else if (sym -> section -> flags & SEC_DATA)
{ ms_type = mst_data;
ms_type = mst_data;
}
else else
{ ms_type = mst_unknown;
ms_type = mst_unknown;
}
record_minimal_symbol ((char *) sym -> name, symaddr, ms_type, record_minimal_symbol ((char *) sym -> name, symaddr, ms_type,
objfile); objfile);
} }
@ -214,6 +207,7 @@ nlm_symfile_read (objfile, section_offsets, mainline)
bfd *abfd = objfile -> obfd; bfd *abfd = objfile -> obfd;
struct cleanup *back_to; struct cleanup *back_to;
CORE_ADDR offset; CORE_ADDR offset;
struct symbol *mainsym;
init_minimal_symbol_collection (); init_minimal_symbol_collection ();
back_to = make_cleanup (discard_minimal_symbols, 0); 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", stabsect_build_psymtabs (objfile, section_offsets, mainline, ".stab",
".stabstr"); ".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 /* FIXME: We could locate and read the optional native debugging format
here and add the symbols to the minimal symbol table. */ here and add the symbols to the minimal symbol table. */

View file

@ -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 /* Many places in gdb want to test just to see if we have any partial

View file

@ -93,6 +93,8 @@ struct entry_info
CORE_ADDR entry_point; 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 /* Start (inclusive) and end (exclusive) of function containing the
entry point. */ entry point. */
@ -110,6 +112,15 @@ struct entry_info
CORE_ADDR main_func_lowpc; CORE_ADDR main_func_lowpc;
CORE_ADDR main_func_highpc; 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)
}; };