* coffread.c (coff_symfile_read): Use xmalloc, not malloc.
* language.c, printcmd.c: Lint. * language.h (get_frame_language): Declare. * saber.suppress: update. * stack.c (find_relative_frame): Remove complex code that was #if 0'd, stick with simple code. Lint. * saber.suppress: Update a bit. * symfile.c (add_symbol_file_command): Add "?" to question. * utils.c (parse_escape): Avoid \a due to bdead compilers. * value.h: Declare typedef_print. * valprint.c (val_print, type_print_base): TYPE_CODE_RANGE less kludgey.
This commit is contained in:
parent
dad0e12d57
commit
d8ce13268e
6 changed files with 246 additions and 124 deletions
183
gdb/coffread.c
183
gdb/coffread.c
|
@ -1,7 +1,5 @@
|
||||||
/* Read coff symbol tables and convert to internal format, for GDB.
|
/* Read coff symbol tables and convert to internal format, for GDB.
|
||||||
Design and support routines derived from dbxread.c, and UMAX COFF
|
Contributed by David D. Johnson, Brown University (ddj@cs.brown.edu).
|
||||||
specific routines written 9/1/87 by David D. Johnson, Brown University.
|
|
||||||
Revised 11/27/87 ddj@cs.brown.edu
|
|
||||||
Copyright (C) 1987-1991 Free Software Foundation, Inc.
|
Copyright (C) 1987-1991 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GDB.
|
This file is part of GDB.
|
||||||
|
@ -29,10 +27,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#include "symfile.h"
|
#include "symfile.h"
|
||||||
|
|
||||||
#if defined (TDESC)
|
#if defined (TDESC)
|
||||||
/* Need to get C_VERSION and friends. */
|
/* Need to get C_VERSION and friends. FIXME, should be in internalcoff.h */
|
||||||
#include <a.out.h>
|
#include "m88k-bcs.h"
|
||||||
#else /* not TDESC */
|
|
||||||
#include <intel-coff.h>
|
|
||||||
#endif /* not TDESC */
|
#endif /* not TDESC */
|
||||||
|
|
||||||
#include <obstack.h>
|
#include <obstack.h>
|
||||||
|
@ -71,6 +67,15 @@ extern void free_all_psymtabs ();
|
||||||
|
|
||||||
#define SDB_TYPE(type) (BTYPE(type) | (type & N_TMASK))
|
#define SDB_TYPE(type) (BTYPE(type) | (type & N_TMASK))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert from an sdb register number to an internal gdb register number.
|
||||||
|
* This should be defined in tm.h, if REGISTER_NAMES is not set up
|
||||||
|
* to map one to one onto the sdb register numbers.
|
||||||
|
*/
|
||||||
|
#ifndef SDB_REG_TO_REGNUM
|
||||||
|
# define SDB_REG_TO_REGNUM(value) (value)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Name of source file whose symbol data we are now processing.
|
/* Name of source file whose symbol data we are now processing.
|
||||||
This comes from a symbol named ".file". */
|
This comes from a symbol named ".file". */
|
||||||
|
|
||||||
|
@ -85,11 +90,6 @@ static CORE_ADDR cur_src_end_addr;
|
||||||
/* Core address of the end of the first object file. */
|
/* Core address of the end of the first object file. */
|
||||||
static CORE_ADDR first_object_file_end;
|
static CORE_ADDR first_object_file_end;
|
||||||
|
|
||||||
/* End of the text segment of the executable file,
|
|
||||||
as found in the symbol _etext. */
|
|
||||||
|
|
||||||
static CORE_ADDR end_of_text_addr;
|
|
||||||
|
|
||||||
/* The addresses of the symbol table stream and number of symbols
|
/* The addresses of the symbol table stream and number of symbols
|
||||||
of the object file we are reading (as copied into core). */
|
of the object file we are reading (as copied into core). */
|
||||||
|
|
||||||
|
@ -128,6 +128,37 @@ static int prev_line_number;
|
||||||
|
|
||||||
static int line_vector_length;
|
static int line_vector_length;
|
||||||
|
|
||||||
|
/* Pointers to scratch storage, used for reading raw symbols and auxents. */
|
||||||
|
|
||||||
|
static char *temp_sym;
|
||||||
|
static char *temp_aux;
|
||||||
|
|
||||||
|
/* Local variables that hold the shift and mask values for the
|
||||||
|
COFF file that we are currently reading. These come back to us
|
||||||
|
from BFD, and are referenced by their macro names, as well as
|
||||||
|
internally to the BTYPE, ISPTR, ISFCN, ISARY, ISTAG, and DECREF
|
||||||
|
macros from ../internalcoff.h . */
|
||||||
|
|
||||||
|
static unsigned local_n_btmask;
|
||||||
|
static unsigned local_n_btshft;
|
||||||
|
static unsigned local_n_tmask;
|
||||||
|
static unsigned local_n_tshift;
|
||||||
|
|
||||||
|
#define N_BTMASK local_n_btmask
|
||||||
|
#define N_BTSHFT local_n_btshft
|
||||||
|
#define N_TMASK local_n_tmask
|
||||||
|
#define N_TSHIFT local_n_tshift
|
||||||
|
|
||||||
|
/* Local variables that hold the sizes in the file of various COFF structures.
|
||||||
|
(We only need to know this to read them from the file -- BFD will then
|
||||||
|
translate the data in them, into `internal_xxx' structs in the right
|
||||||
|
byte order, alignment, etc.) */
|
||||||
|
|
||||||
|
static unsigned local_linesz;
|
||||||
|
static unsigned local_symesz;
|
||||||
|
static unsigned local_auxesz;
|
||||||
|
|
||||||
|
|
||||||
#ifdef TDESC
|
#ifdef TDESC
|
||||||
#include "tdesc.h"
|
#include "tdesc.h"
|
||||||
#define SEM
|
#define SEM
|
||||||
|
@ -187,6 +218,13 @@ struct context_stack *context_stack;
|
||||||
|
|
||||||
int within_function;
|
int within_function;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* The type of the function we are currently reading in. This is
|
||||||
|
used by define_symbol to record the type of arguments to a function. */
|
||||||
|
|
||||||
|
struct type *in_function_type;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* List of blocks already made (lexical contexts already closed).
|
/* List of blocks already made (lexical contexts already closed).
|
||||||
This is used at the end to make the blockvector. */
|
This is used at the end to make the blockvector. */
|
||||||
|
|
||||||
|
@ -518,12 +556,12 @@ end_symtab ()
|
||||||
blockvector = make_blockvector ();
|
blockvector = make_blockvector ();
|
||||||
|
|
||||||
/* Now create the symtab object for this source file. */
|
/* Now create the symtab object for this source file. */
|
||||||
symtab = (struct symtab *) xmalloc (sizeof (struct symtab));
|
symtab = allocate_symtab (last_source_file);
|
||||||
symtab->free_ptr = 0;
|
|
||||||
|
|
||||||
/* Fill in its components. */
|
/* Fill in its components. */
|
||||||
symtab->blockvector = blockvector;
|
symtab->blockvector = blockvector;
|
||||||
symtab->free_code = free_linetable;
|
symtab->free_code = free_linetable;
|
||||||
|
symtab->free_ptr = 0;
|
||||||
symtab->filename = last_source_file;
|
symtab->filename = last_source_file;
|
||||||
symtab->dirname = NULL;
|
symtab->dirname = NULL;
|
||||||
lv = line_vector;
|
lv = line_vector;
|
||||||
|
@ -531,11 +569,6 @@ end_symtab ()
|
||||||
symtab->linetable = (struct linetable *)
|
symtab->linetable = (struct linetable *)
|
||||||
xrealloc (lv, (sizeof (struct linetable)
|
xrealloc (lv, (sizeof (struct linetable)
|
||||||
+ lv->nitems * sizeof (struct linetable_entry)));
|
+ lv->nitems * sizeof (struct linetable_entry)));
|
||||||
symtab->nlines = 0;
|
|
||||||
symtab->line_charpos = 0;
|
|
||||||
|
|
||||||
symtab->language = language_unknown;
|
|
||||||
symtab->fullname = NULL;
|
|
||||||
|
|
||||||
#ifdef TDESC
|
#ifdef TDESC
|
||||||
symtab->coffsem = last_coffsem;
|
symtab->coffsem = last_coffsem;
|
||||||
|
@ -592,10 +625,13 @@ struct coff_symfile_info {
|
||||||
file_ptr max_lineno_offset; /* 1+last byte of line#s in file */
|
file_ptr max_lineno_offset; /* 1+last byte of line#s in file */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int text_bfd_scnum;
|
||||||
|
|
||||||
void
|
void
|
||||||
coff_symfile_init (sf)
|
coff_symfile_init (sf)
|
||||||
struct sym_fns *sf;
|
struct sym_fns *sf;
|
||||||
{
|
{
|
||||||
|
asection *section;
|
||||||
bfd *abfd = sf->sym_bfd;
|
bfd *abfd = sf->sym_bfd;
|
||||||
|
|
||||||
/* Allocate struct to keep track of the symfile */
|
/* Allocate struct to keep track of the symfile */
|
||||||
|
@ -623,6 +659,11 @@ coff_symfile_init (sf)
|
||||||
startup_file_start = 0;
|
startup_file_start = 0;
|
||||||
startup_file_end = 0;
|
startup_file_end = 0;
|
||||||
}
|
}
|
||||||
|
/* Save the section number for the text section */
|
||||||
|
if (section = bfd_get_section_by_name(abfd,".text"))
|
||||||
|
text_bfd_scnum = section->index;
|
||||||
|
else
|
||||||
|
text_bfd_scnum = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function is called for every section; it finds the outer limits
|
/* This function is called for every section; it finds the outer limits
|
||||||
|
@ -646,12 +687,7 @@ find_linenos (abfd, asect, vpinfo)
|
||||||
|
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
return;
|
return;
|
||||||
#if !defined (LINESZ)
|
size = count * local_linesz;
|
||||||
/* Just in case, you never know what to expect from those
|
|
||||||
COFF header files. */
|
|
||||||
#define LINESZ (sizeof (struct lineno))
|
|
||||||
#endif /* No LINESZ. */
|
|
||||||
size = count * LINESZ;
|
|
||||||
|
|
||||||
info = (struct coff_symfile_info *)vpinfo;
|
info = (struct coff_symfile_info *)vpinfo;
|
||||||
/* WARNING WILL ROBINSON! ACCESSING BFD-PRIVATE DATA HERE! FIXME! */
|
/* WARNING WILL ROBINSON! ACCESSING BFD-PRIVATE DATA HERE! FIXME! */
|
||||||
|
@ -700,6 +736,7 @@ coff_symfile_read (sf, addr, mainline)
|
||||||
{
|
{
|
||||||
struct coff_symfile_info *info = (struct coff_symfile_info *)sf->sym_private;
|
struct coff_symfile_info *info = (struct coff_symfile_info *)sf->sym_private;
|
||||||
bfd *abfd = sf->sym_bfd;
|
bfd *abfd = sf->sym_bfd;
|
||||||
|
coff_data_type *cdata = coff_data (abfd);
|
||||||
char *name = bfd_get_filename (abfd);
|
char *name = bfd_get_filename (abfd);
|
||||||
int desc;
|
int desc;
|
||||||
register int val;
|
register int val;
|
||||||
|
@ -710,10 +747,29 @@ coff_symfile_read (sf, addr, mainline)
|
||||||
symfile_bfd = abfd; /* Kludge for swap routines */
|
symfile_bfd = abfd; /* Kludge for swap routines */
|
||||||
|
|
||||||
/* WARNING WILL ROBINSON! ACCESSING BFD-PRIVATE DATA HERE! FIXME! */
|
/* WARNING WILL ROBINSON! ACCESSING BFD-PRIVATE DATA HERE! FIXME! */
|
||||||
desc = fileno ((FILE *)(abfd->iostream)); /* File descriptor */
|
desc = fileno ((FILE *)(abfd->iostream)); /* File descriptor */
|
||||||
num_symbols = bfd_get_symcount (abfd); /* How many syms */
|
num_symbols = bfd_get_symcount (abfd); /* How many syms */
|
||||||
symtab_offset = obj_sym_filepos (abfd); /* Symbol table file offset */
|
symtab_offset = cdata->sym_filepos; /* Symbol table file offset */
|
||||||
stringtab_offset = symtab_offset + num_symbols * SYMESZ; /* String tab */
|
stringtab_offset = symtab_offset + /* String table file offset */
|
||||||
|
num_symbols * cdata->local_symesz;
|
||||||
|
|
||||||
|
/* Set a few file-statics that give us specific information about
|
||||||
|
the particular COFF file format we're reading. */
|
||||||
|
local_linesz = cdata->local_linesz;
|
||||||
|
local_n_btmask = cdata->local_n_btmask;
|
||||||
|
local_n_btshft = cdata->local_n_btshft;
|
||||||
|
local_n_tmask = cdata->local_n_tmask;
|
||||||
|
local_n_tshift = cdata->local_n_tshift;
|
||||||
|
local_linesz = cdata->local_linesz;
|
||||||
|
local_symesz = cdata->local_symesz;
|
||||||
|
local_auxesz = cdata->local_auxesz;
|
||||||
|
|
||||||
|
/* Allocate space for raw symbol and aux entries, based on their
|
||||||
|
space requirements as reported by BFD. */
|
||||||
|
temp_sym = (char *) xmalloc
|
||||||
|
(cdata->local_symesz + cdata->local_auxesz);
|
||||||
|
temp_aux = temp_sym + cdata->local_symesz;
|
||||||
|
make_cleanup (free_current_contents, &temp_sym);
|
||||||
/* End of warning */
|
/* End of warning */
|
||||||
|
|
||||||
/* Read the line number table, all at once. */
|
/* Read the line number table, all at once. */
|
||||||
|
@ -920,7 +976,9 @@ read_coff_symtab (desc, nsyms)
|
||||||
|
|
||||||
case C_STAT:
|
case C_STAT:
|
||||||
if (cs->c_name[0] == '.') {
|
if (cs->c_name[0] == '.') {
|
||||||
if (strcmp (cs->c_name, _TEXT) == 0) {
|
if (strcmp (cs->c_name, ".text") == 0) {
|
||||||
|
/* FIXME: don't wire in ".text" as section name
|
||||||
|
or symbol name! */
|
||||||
if (++num_object_files == 1) {
|
if (++num_object_files == 1) {
|
||||||
/* last address of startup file */
|
/* last address of startup file */
|
||||||
first_object_file_end = cs->c_value +
|
first_object_file_end = cs->c_value +
|
||||||
|
@ -952,12 +1010,14 @@ read_coff_symtab (desc, nsyms)
|
||||||
break;
|
break;
|
||||||
/* fall in for static symbols that don't start with '.' */
|
/* fall in for static symbols that don't start with '.' */
|
||||||
case C_EXT:
|
case C_EXT:
|
||||||
if (cs->c_sclass == C_EXT &&
|
|
||||||
cs->c_secnum == N_ABS &&
|
|
||||||
strcmp (cs->c_name, _ETEXT) == 0)
|
|
||||||
end_of_text_addr = cs->c_value;
|
|
||||||
if (!SDB_TYPE (cs->c_type)) {
|
if (!SDB_TYPE (cs->c_type)) {
|
||||||
if (cs->c_secnum <= 1) { /* text or abs */
|
/* FIXME: This is BOGUS Will Robinson!
|
||||||
|
Coff should provide the SEC_CODE flag for executable sections,
|
||||||
|
then if we could look up sections by section number we
|
||||||
|
could see if the flags indicate SEC_CODE. If so, then
|
||||||
|
record this symbol as a miscellaneous function. But why
|
||||||
|
are absolute syms recorded as functions, anyway? */
|
||||||
|
if (cs->c_secnum <= text_bfd_scnum+1) {/* text or abs */
|
||||||
record_misc_function (cs->c_name, cs->c_value);
|
record_misc_function (cs->c_name, cs->c_value);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1168,22 +1228,21 @@ read_one_sym (cs, sym, aux)
|
||||||
register struct internal_syment *sym;
|
register struct internal_syment *sym;
|
||||||
register union internal_auxent *aux;
|
register union internal_auxent *aux;
|
||||||
{
|
{
|
||||||
struct external_syment temp_sym[1];
|
|
||||||
union external_auxent temp_aux[1];
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
cs->c_symnum = symnum;
|
cs->c_symnum = symnum;
|
||||||
fread ((char *)temp_sym, SYMESZ, 1, nlist_stream_global);
|
fread (temp_sym, local_symesz, 1, nlist_stream_global);
|
||||||
bfd_coff_swap_sym_in (symfile_bfd, temp_sym, sym);
|
bfd_coff_swap_sym_in (symfile_bfd, temp_sym, (char *)sym);
|
||||||
cs->c_nsyms = (sym->n_numaux & 0xff) + 1;
|
cs->c_nsyms = (sym->n_numaux & 0xff) + 1;
|
||||||
if (cs->c_nsyms >= 2)
|
if (cs->c_nsyms >= 2)
|
||||||
{
|
{
|
||||||
fread ((char *)temp_aux, AUXESZ, 1, nlist_stream_global);
|
fread (temp_aux, local_auxesz, 1, nlist_stream_global);
|
||||||
bfd_coff_swap_aux_in (symfile_bfd, temp_aux, sym->n_type, sym->n_sclass, aux);
|
bfd_coff_swap_aux_in (symfile_bfd, temp_aux, sym->n_type, sym->n_sclass,
|
||||||
|
(char *)aux);
|
||||||
/* If more than one aux entry, read past it (only the first aux
|
/* If more than one aux entry, read past it (only the first aux
|
||||||
is important). */
|
is important). */
|
||||||
for (i = 2; i < cs->c_nsyms; i++)
|
for (i = 2; i < cs->c_nsyms; i++)
|
||||||
fread ((char *)temp_aux, AUXESZ, 1, nlist_stream_global);
|
fread (temp_aux, local_auxesz, 1, nlist_stream_global);
|
||||||
}
|
}
|
||||||
cs->c_name = getsymname (sym);
|
cs->c_name = getsymname (sym);
|
||||||
cs->c_value = sym->n_value;
|
cs->c_value = sym->n_value;
|
||||||
|
@ -1364,13 +1423,13 @@ enter_linenos (file_offset, first_line, last_line)
|
||||||
rawptr = &linetab[file_offset - linetab_offset];
|
rawptr = &linetab[file_offset - linetab_offset];
|
||||||
|
|
||||||
/* skip first line entry for each function */
|
/* skip first line entry for each function */
|
||||||
rawptr += LINESZ;
|
rawptr += local_linesz;
|
||||||
/* line numbers start at one for the first line of the function */
|
/* line numbers start at one for the first line of the function */
|
||||||
first_line--;
|
first_line--;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
bfd_coff_swap_lineno_in (symfile_bfd, (LINENO *)rawptr, &lptr);
|
bfd_coff_swap_lineno_in (symfile_bfd, rawptr, &lptr);
|
||||||
rawptr += LINESZ;
|
rawptr += local_linesz;
|
||||||
if (L_LNNO32 (&lptr) && L_LNNO32 (&lptr) <= last_line)
|
if (L_LNNO32 (&lptr) && L_LNNO32 (&lptr) <= last_line)
|
||||||
record_line (first_line + L_LNNO32 (&lptr), lptr.l_addr.l_paddr);
|
record_line (first_line + L_LNNO32 (&lptr), lptr.l_addr.l_paddr);
|
||||||
else
|
else
|
||||||
|
@ -1515,8 +1574,23 @@ process_coff_symbol (cs, aux)
|
||||||
|
|
||||||
if (ISFCN (cs->c_type))
|
if (ISFCN (cs->c_type))
|
||||||
{
|
{
|
||||||
SYMBOL_TYPE (sym) =
|
#if 0
|
||||||
lookup_function_type (decode_function_type (cs, cs->c_type, aux));
|
/* FIXME: This has NOT been tested. The DBX version has.. */
|
||||||
|
/* Generate a template for the type of this function. The
|
||||||
|
types of the arguments will be added as we read the symbol
|
||||||
|
table. */
|
||||||
|
struct type *new = (struct type *)
|
||||||
|
obstack_alloc (symbol_obstack, sizeof (struct type));
|
||||||
|
|
||||||
|
bcopy(lookup_function_type (decode_function_type (cs, cs->c_type, aux)),
|
||||||
|
new, sizeof(struct type));
|
||||||
|
SYMBOL_TYPE (sym) = new;
|
||||||
|
in_function_type = SYMBOL_TYPE(sym);
|
||||||
|
#else
|
||||||
|
SYMBOL_TYPE(sym) =
|
||||||
|
lookup_function_type (decode_function_type (cs, cs->c_type, aux));
|
||||||
|
#endif
|
||||||
|
|
||||||
SYMBOL_CLASS (sym) = LOC_BLOCK;
|
SYMBOL_CLASS (sym) = LOC_BLOCK;
|
||||||
if (cs->c_sclass == C_STAT)
|
if (cs->c_sclass == C_STAT)
|
||||||
add_symbol_to_list (sym, &file_symbols);
|
add_symbol_to_list (sym, &file_symbols);
|
||||||
|
@ -1555,8 +1629,12 @@ process_coff_symbol (cs, aux)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef C_GLBLREG /* AMD coff */
|
||||||
|
case C_GLBLREG:
|
||||||
|
#endif
|
||||||
case C_REG:
|
case C_REG:
|
||||||
SYMBOL_CLASS (sym) = LOC_REGISTER;
|
SYMBOL_CLASS (sym) = LOC_REGISTER;
|
||||||
|
SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM(cs->c_value);
|
||||||
add_symbol_to_list (sym, &local_symbols);
|
add_symbol_to_list (sym, &local_symbols);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1565,6 +1643,11 @@ process_coff_symbol (cs, aux)
|
||||||
|
|
||||||
case C_ARG:
|
case C_ARG:
|
||||||
SYMBOL_CLASS (sym) = LOC_ARG;
|
SYMBOL_CLASS (sym) = LOC_ARG;
|
||||||
|
#if 0
|
||||||
|
/* FIXME: This has not bee tested. */
|
||||||
|
/* Add parameter to function. */
|
||||||
|
add_param_to_type(&in_function_type,sym);
|
||||||
|
#endif
|
||||||
add_symbol_to_list (sym, &local_symbols);
|
add_symbol_to_list (sym, &local_symbols);
|
||||||
#if !defined (BELIEVE_PCC_PROMOTION)
|
#if !defined (BELIEVE_PCC_PROMOTION)
|
||||||
/* If PCC says a parameter is a short or a char,
|
/* If PCC says a parameter is a short or a char,
|
||||||
|
@ -1580,6 +1663,7 @@ process_coff_symbol (cs, aux)
|
||||||
|
|
||||||
case C_REGPARM:
|
case C_REGPARM:
|
||||||
SYMBOL_CLASS (sym) = LOC_REGPARM;
|
SYMBOL_CLASS (sym) = LOC_REGPARM;
|
||||||
|
SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM(cs->c_value);
|
||||||
add_symbol_to_list (sym, &local_symbols);
|
add_symbol_to_list (sym, &local_symbols);
|
||||||
#if !defined (BELIEVE_PCC_PROMOTION)
|
#if !defined (BELIEVE_PCC_PROMOTION)
|
||||||
/* If PCC says a parameter is a short or a char,
|
/* If PCC says a parameter is a short or a char,
|
||||||
|
@ -2021,6 +2105,13 @@ read_enum_type (index, length, lastsym)
|
||||||
TYPE_FIELD_BITPOS (type, n) = SYMBOL_VALUE (syms->symbol);
|
TYPE_FIELD_BITPOS (type, n) = SYMBOL_VALUE (syms->symbol);
|
||||||
TYPE_FIELD_BITSIZE (type, n) = 0;
|
TYPE_FIELD_BITSIZE (type, n) = 0;
|
||||||
}
|
}
|
||||||
|
/* Is this Modula-2's BOOLEAN type? Flag it as such if so. */
|
||||||
|
if(TYPE_NFIELDS(type) == 2 &&
|
||||||
|
((!strcmp(TYPE_FIELD_NAME(type,0),"TRUE") &&
|
||||||
|
!strcmp(TYPE_FIELD_NAME(type,1),"FALSE")) ||
|
||||||
|
(!strcmp(TYPE_FIELD_NAME(type,1),"TRUE") &&
|
||||||
|
!strcmp(TYPE_FIELD_NAME(type,0),"FALSE"))))
|
||||||
|
TYPE_CODE(type) = TYPE_CODE_BOOL;
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -94,8 +94,8 @@ void set_range_str();
|
||||||
/* Show command. Display a warning if the language set
|
/* Show command. Display a warning if the language set
|
||||||
does not match the frame. */
|
does not match the frame. */
|
||||||
void
|
void
|
||||||
show_language_command (str, from_tty)
|
show_language_command (ignore, from_tty)
|
||||||
char *str;
|
char *ignore;
|
||||||
int from_tty;
|
int from_tty;
|
||||||
{
|
{
|
||||||
enum language flang; /* The language of the current frame */
|
enum language flang; /* The language of the current frame */
|
||||||
|
@ -109,8 +109,8 @@ show_language_command (str, from_tty)
|
||||||
|
|
||||||
/* Set command. Change the current working language. */
|
/* Set command. Change the current working language. */
|
||||||
void
|
void
|
||||||
set_language_command (str, from_tty)
|
set_language_command (ignore, from_tty)
|
||||||
char *str;
|
char *ignore;
|
||||||
int from_tty;
|
int from_tty;
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -161,8 +161,8 @@ modula-2 Use the Modula-2 language\n");
|
||||||
/* Show command. Display a warning if the type setting does
|
/* Show command. Display a warning if the type setting does
|
||||||
not match the current language. */
|
not match the current language. */
|
||||||
void
|
void
|
||||||
show_type_command(str, from_tty)
|
show_type_command(ignore, from_tty)
|
||||||
char *str;
|
char *ignore;
|
||||||
int from_tty;
|
int from_tty;
|
||||||
{
|
{
|
||||||
if (type_check != current_language->la_type_check)
|
if (type_check != current_language->la_type_check)
|
||||||
|
@ -172,8 +172,8 @@ show_type_command(str, from_tty)
|
||||||
|
|
||||||
/* Set command. Change the setting for type checking. */
|
/* Set command. Change the setting for type checking. */
|
||||||
void
|
void
|
||||||
set_type_command(str, from_tty)
|
set_type_command(ignore, from_tty)
|
||||||
char *str;
|
char *ignore;
|
||||||
int from_tty;
|
int from_tty;
|
||||||
{
|
{
|
||||||
if (!strcmp(type,"on"))
|
if (!strcmp(type,"on"))
|
||||||
|
@ -200,14 +200,14 @@ set_type_command(str, from_tty)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
set_type_str();
|
set_type_str();
|
||||||
show_type_command();
|
show_type_command((char *)NULL, from_tty);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Show command. Display a warning if the range setting does
|
/* Show command. Display a warning if the range setting does
|
||||||
not match the current language. */
|
not match the current language. */
|
||||||
void
|
void
|
||||||
show_range_command(str, from_tty)
|
show_range_command(ignore, from_tty)
|
||||||
char *str;
|
char *ignore;
|
||||||
int from_tty;
|
int from_tty;
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -218,8 +218,8 @@ show_range_command(str, from_tty)
|
||||||
|
|
||||||
/* Set command. Change the setting for range checking. */
|
/* Set command. Change the setting for range checking. */
|
||||||
void
|
void
|
||||||
set_range_command(str, from_tty)
|
set_range_command(ignore, from_tty)
|
||||||
char *str;
|
char *ignore;
|
||||||
int from_tty;
|
int from_tty;
|
||||||
{
|
{
|
||||||
if (!strcmp(range,"on"))
|
if (!strcmp(range,"on"))
|
||||||
|
@ -246,7 +246,7 @@ set_range_command(str, from_tty)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
set_range_str();
|
set_range_str();
|
||||||
show_range_command();
|
show_range_command((char *)0, from_tty);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the status of range and type checking based on
|
/* Set the status of range and type checking based on
|
||||||
|
@ -256,7 +256,6 @@ set_range_command(str, from_tty)
|
||||||
static void
|
static void
|
||||||
set_type_range()
|
set_type_range()
|
||||||
{
|
{
|
||||||
char *rtmp, *ttmp;
|
|
||||||
|
|
||||||
if (range_mode == range_mode_auto)
|
if (range_mode == range_mode_auto)
|
||||||
range_check = current_language->la_range_check;
|
range_check = current_language->la_range_check;
|
||||||
|
@ -290,7 +289,7 @@ set_language(lang)
|
||||||
void
|
void
|
||||||
set_lang_str()
|
set_lang_str()
|
||||||
{
|
{
|
||||||
char *tmp, *prefix = "";
|
char *prefix = "";
|
||||||
|
|
||||||
free (language);
|
free (language);
|
||||||
if (language_mode == language_mode_auto)
|
if (language_mode == language_mode_auto)
|
||||||
|
@ -360,11 +359,11 @@ void
|
||||||
language_info ()
|
language_info ()
|
||||||
{
|
{
|
||||||
printf("Current Language: %s\n",language);
|
printf("Current Language: %s\n",language);
|
||||||
show_language_command();
|
show_language_command((char *)0, 1);
|
||||||
printf("Type checking: %s\n",type);
|
printf("Type checking: %s\n",type);
|
||||||
show_type_command();
|
show_type_command((char *)0, 1);
|
||||||
printf("Range checking: %s\n",range);
|
printf("Range checking: %s\n",range);
|
||||||
show_range_command();
|
show_range_command((char *)0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the result of a binary operation. */
|
/* Return the result of a binary operation. */
|
||||||
|
@ -374,10 +373,8 @@ binop_result_type(v1,v2)
|
||||||
{
|
{
|
||||||
int l1,l2,size,uns;
|
int l1,l2,size,uns;
|
||||||
|
|
||||||
l1=TYPE_LENGTH(VALUE_TYPE(v1));
|
l1 = TYPE_LENGTH(VALUE_TYPE(v1));
|
||||||
l2=TYPE_LENGTH(VALUE_TYPE(v2));
|
l2 = TYPE_LENGTH(VALUE_TYPE(v2));
|
||||||
size = l1 > l2 ? l1 : l2;
|
|
||||||
uns = TYPE_UNSIGNED(VALUE_TYPE(v1)) || TYPE_UNSIGNED(VALUE_TYPE(v2));
|
|
||||||
|
|
||||||
switch(current_language->la_language)
|
switch(current_language->la_language)
|
||||||
{
|
{
|
||||||
|
@ -401,6 +398,8 @@ binop_result_type(v1,v2)
|
||||||
return l1 > l2 ? VALUE_TYPE(v1) : VALUE_TYPE(v2);
|
return l1 > l2 ? VALUE_TYPE(v1) : VALUE_TYPE(v2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
abort();
|
||||||
|
return (struct type *)0; /* For lint */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This page contains functions that return format strings for
|
/* This page contains functions that return format strings for
|
||||||
|
@ -921,8 +920,8 @@ struct cmd_list_element *setchecklist = NULL;
|
||||||
struct cmd_list_element *showchecklist = NULL;
|
struct cmd_list_element *showchecklist = NULL;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_check (arg, from_tty)
|
set_check (ignore, from_tty)
|
||||||
char *arg;
|
char *ignore;
|
||||||
int from_tty;
|
int from_tty;
|
||||||
{
|
{
|
||||||
printf(
|
printf(
|
||||||
|
|
|
@ -166,3 +166,5 @@ char *language_str();
|
||||||
|
|
||||||
/* Add a language to the set known by GDB (at initialization time). */
|
/* Add a language to the set known by GDB (at initialization time). */
|
||||||
void add_language (); /* Arg is &language_defn */
|
void add_language (); /* Arg is &language_defn */
|
||||||
|
|
||||||
|
extern enum language get_frame_language (); /* In stack.c */
|
||||||
|
|
|
@ -368,26 +368,36 @@ suppress 68 on complain
|
||||||
/* Benign type mismatch */
|
/* Benign type mismatch */
|
||||||
suppress 3 in read_range_type
|
suppress 3 in read_range_type
|
||||||
/* Over/underflow unary minus */
|
/* Over/underflow unary minus */
|
||||||
suppress 594 ../expread.tab.c
|
suppress 442 ../bfd/archive.c
|
||||||
/* Set but not used */
|
|
||||||
suppress 593 ../expread.tab.c
|
|
||||||
/* Label not used */
|
|
||||||
suppress 590 ../expread.tab.c
|
|
||||||
/* Formal param not used */
|
|
||||||
suppress 442 ../../bfd/archive.c
|
|
||||||
/* \0 in string */
|
/* \0 in string */
|
||||||
suppress 558 ../../bfd/b.out.c
|
suppress 558 ../bfd/b.out.c
|
||||||
/* Conditional if always true */
|
/* Conditional if always true */
|
||||||
suppress 558 ../../bfd/coffswap.c
|
suppress 558 ../bfd/coffswap.c
|
||||||
/* Conditional if always true -- bfd_h_put_x */
|
/* Conditional if always true -- bfd_h_put_x */
|
||||||
suppress 529 ../../bfd/coffswap.c
|
suppress 529 ../bfd/coffswap.c
|
||||||
/* Stmt unreach -- bfd_h_put_x */
|
/* Stmt unreach -- bfd_h_put_x */
|
||||||
suppress 590 ../../bfd/ecoff.c
|
suppress 590 ../bfd/ecoff.c
|
||||||
/* Formal parameter not used */
|
/* Formal parameter not used */
|
||||||
suppress 590 on ignore
|
suppress 590 on ignore
|
||||||
/* Formal param not used */
|
/* Formal param not used */
|
||||||
|
suppress 590 on ignore_exec_bfd
|
||||||
|
/* Formal param not used */
|
||||||
|
suppress 590 on ignore_core_bfd
|
||||||
|
/* Formal param not used */
|
||||||
|
suppress 590 on ignore_input_section
|
||||||
|
/* Formal param not used */
|
||||||
suppress 590 on ignore_newsect
|
suppress 590 on ignore_newsect
|
||||||
/* Formal param not used */
|
/* Formal param not used */
|
||||||
|
suppress 590 on ignore_abfd
|
||||||
|
/* Formal param not used */
|
||||||
|
suppress 590 on ignore_symbol
|
||||||
|
/* Formal param not used */
|
||||||
|
suppress 590 on ignore_symbols
|
||||||
|
/* Formal param not used */
|
||||||
|
suppress 652 in ../bfd/libaout.h
|
||||||
|
/* The declaration has no effect */
|
||||||
|
suppress 442 in ../bfd/archive.c
|
||||||
|
/* Escape sequence in string literal has null value */
|
||||||
|
|
||||||
/* Signals caught and ignored */
|
/* Signals caught and ignored */
|
||||||
catch HUP
|
catch HUP
|
||||||
|
|
34
gdb/stack.c
34
gdb/stack.c
|
@ -32,7 +32,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
extern int addressprint; /* Print addresses, or stay symbolic only? */
|
extern int addressprint; /* Print addresses, or stay symbolic only? */
|
||||||
extern int info_verbose; /* Verbosity of symbol reading msgs */
|
extern int info_verbose; /* Verbosity of symbol reading msgs */
|
||||||
extern unsigned lines_to_list; /* # of lines "list" command shows by default */
|
extern int lines_to_list; /* # of lines "list" command shows by default */
|
||||||
extern char *reg_names[]; /* Names of registers */
|
extern char *reg_names[]; /* Names of registers */
|
||||||
|
|
||||||
/* Thie "selected" stack frame is used by default for local and arg access.
|
/* Thie "selected" stack frame is used by default for local and arg access.
|
||||||
|
@ -899,7 +899,7 @@ find_relative_frame (frame, level_offset_ptr)
|
||||||
register int* level_offset_ptr;
|
register int* level_offset_ptr;
|
||||||
{
|
{
|
||||||
register FRAME prev;
|
register FRAME prev;
|
||||||
register FRAME frame1, frame2;
|
register FRAME frame1;
|
||||||
|
|
||||||
/* Going up is simple: just do get_prev_frame enough times
|
/* Going up is simple: just do get_prev_frame enough times
|
||||||
or until initial frame is reached. */
|
or until initial frame is reached. */
|
||||||
|
@ -911,36 +911,9 @@ find_relative_frame (frame, level_offset_ptr)
|
||||||
(*level_offset_ptr)--;
|
(*level_offset_ptr)--;
|
||||||
frame = prev;
|
frame = prev;
|
||||||
}
|
}
|
||||||
/* Going down could be done by iterating get_frame_info to
|
/* Going down is just as simple. */
|
||||||
find the next frame, but that would be quadratic
|
|
||||||
since get_frame_info must scan all the way from the current frame.
|
|
||||||
The following algorithm is linear. */
|
|
||||||
if (*level_offset_ptr < 0)
|
if (*level_offset_ptr < 0)
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
/* This is ancient and unnecessary? -- gnu@cygnus.com
|
|
||||||
It also loops forever if frame #0 is not current_frame (e.g. when we have
|
|
||||||
used the "frame" command after the stack was invalid). */
|
|
||||||
|
|
||||||
/* First put frame1 at innermost frame
|
|
||||||
and frame2 N levels up from there. */
|
|
||||||
frame1 = get_current_frame ();
|
|
||||||
frame2 = frame1;
|
|
||||||
while (*level_offset_ptr < 0 && frame2 != frame)
|
|
||||||
{
|
|
||||||
frame2 = get_prev_frame (frame2);
|
|
||||||
(*level_offset_ptr) ++;
|
|
||||||
}
|
|
||||||
/* Then slide frame1 and frame2 up in synchrony
|
|
||||||
and when frame2 reaches our starting point
|
|
||||||
frame1 must be N levels down from there. */
|
|
||||||
while (frame2 != frame)
|
|
||||||
{
|
|
||||||
frame1 = get_prev_frame (frame1);
|
|
||||||
frame2 = get_prev_frame (frame2);
|
|
||||||
}
|
|
||||||
return frame1;
|
|
||||||
#else
|
|
||||||
while (*level_offset_ptr < 0) {
|
while (*level_offset_ptr < 0) {
|
||||||
frame1 = get_next_frame (frame);
|
frame1 = get_next_frame (frame);
|
||||||
if (!frame1)
|
if (!frame1)
|
||||||
|
@ -948,7 +921,6 @@ find_relative_frame (frame, level_offset_ptr)
|
||||||
frame = frame1;
|
frame = frame1;
|
||||||
(*level_offset_ptr)++;
|
(*level_offset_ptr)++;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,7 @@ extern int info_verbose;
|
||||||
|
|
||||||
extern void qsort ();
|
extern void qsort ();
|
||||||
extern char *getenv ();
|
extern char *getenv ();
|
||||||
|
extern char *rindex ();
|
||||||
|
|
||||||
/* Functions this file defines */
|
/* Functions this file defines */
|
||||||
static bfd *symfile_open();
|
static bfd *symfile_open();
|
||||||
|
@ -364,8 +365,6 @@ struct symtab *
|
||||||
psymtab_to_symtab (pst)
|
psymtab_to_symtab (pst)
|
||||||
register struct partial_symtab *pst;
|
register struct partial_symtab *pst;
|
||||||
{
|
{
|
||||||
register struct symtab *result;
|
|
||||||
|
|
||||||
/* If it's been looked up before, return it. */
|
/* If it's been looked up before, return it. */
|
||||||
if (pst->symtab)
|
if (pst->symtab)
|
||||||
return pst->symtab;
|
return pst->symtab;
|
||||||
|
@ -645,8 +644,8 @@ add_symbol_file_command (arg_string, from_tty)
|
||||||
|
|
||||||
dont_repeat ();
|
dont_repeat ();
|
||||||
|
|
||||||
if (!query ("add symbol table from file \"%s\" at text_addr = 0x%x\n",
|
if (!query ("add symbol table from file \"%s\" at text_addr = %s?\n",
|
||||||
name, text_addr))
|
name, local_hex_string (text_addr)))
|
||||||
error ("Not confirmed.");
|
error ("Not confirmed.");
|
||||||
|
|
||||||
symbol_file_add (name, 0, text_addr, 0);
|
symbol_file_add (name, 0, text_addr, 0);
|
||||||
|
@ -748,6 +747,53 @@ clear_complaints ()
|
||||||
p->counter = 0;
|
p->counter = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* allocate_symtab:
|
||||||
|
|
||||||
|
Allocate and partly initialize a new symbol table. Return a pointer
|
||||||
|
to it. error() if no space.
|
||||||
|
|
||||||
|
Caller must set these fields:
|
||||||
|
LINETABLE(symtab)
|
||||||
|
symtab->blockvector
|
||||||
|
symtab->typevector
|
||||||
|
symtab->dirname
|
||||||
|
symtab->free_code
|
||||||
|
symtab->free_ptr
|
||||||
|
initialize any EXTRA_SYMTAB_INFO
|
||||||
|
possibly free_named_symtabs (symtab->filename);
|
||||||
|
symtab->next = symtab_list;
|
||||||
|
symtab_list = symtab;
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct symtab *
|
||||||
|
allocate_symtab(name)
|
||||||
|
char *name;
|
||||||
|
{
|
||||||
|
register struct symtab *symtab;
|
||||||
|
char *c;
|
||||||
|
|
||||||
|
symtab = (struct symtab *) xmalloc (sizeof (struct symtab));
|
||||||
|
bzero (symtab, sizeof (*symtab));
|
||||||
|
symtab->filename = name;
|
||||||
|
symtab->fullname = NULL;
|
||||||
|
symtab->nlines = 0;
|
||||||
|
symtab->line_charpos = 0;
|
||||||
|
symtab->version = 0;
|
||||||
|
symtab->language = language_unknown; /* default */
|
||||||
|
|
||||||
|
c = rindex (name, '.');
|
||||||
|
|
||||||
|
if (!c) {
|
||||||
|
; /* Don't know language of file. */
|
||||||
|
} else if(!strcmp(c,".mod")) {
|
||||||
|
symtab->language = language_m2;
|
||||||
|
} else if(!strcmp(c,".c") || !strcmp(c,".cc")) {
|
||||||
|
symtab->language = language_c;
|
||||||
|
}
|
||||||
|
|
||||||
|
return symtab;
|
||||||
|
}
|
||||||
|
|
||||||
/* clear_symtab_users_once:
|
/* clear_symtab_users_once:
|
||||||
|
|
||||||
This function is run after symbol reading, or from a cleanup.
|
This function is run after symbol reading, or from a cleanup.
|
||||||
|
@ -921,13 +967,15 @@ again2:
|
||||||
free_symtab (s);
|
free_symtab (s);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* It is still possible that some breakpoints will be affected
|
{
|
||||||
even though no symtab was found, since the file might have
|
/* It is still possible that some breakpoints will be affected
|
||||||
been compiled without debugging, and hence not be associated
|
even though no symtab was found, since the file might have
|
||||||
with a symtab. In order to handle this correctly, we would need
|
been compiled without debugging, and hence not be associated
|
||||||
to keep a list of text address ranges for undebuggable files.
|
with a symtab. In order to handle this correctly, we would need
|
||||||
For now, we do nothing, since this is a fairly obscure case. */
|
to keep a list of text address ranges for undebuggable files.
|
||||||
;
|
For now, we do nothing, since this is a fairly obscure case. */
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
/* FIXME, what about the misc function vector? */
|
/* FIXME, what about the misc function vector? */
|
||||||
return blewit;
|
return blewit;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue