+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,
#define VM_MIN_ADDRESS ((CORE_ADDR)0)
#include "alpha/tm-alpha.h"
+
+/* Stop backtracing when we wander into main. */
+
+#define FRAME_CHAIN_VALID_ALTERNATE
-/* 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.
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
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);
}
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);
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. */
}
}
}
+
+ 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);
+ }
}
\f
/* Many places in gdb want to test just to see if we have any partial
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. */
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)
+
};