Remove the object file specific fields from the partial symbol table
structure and replace them with a pointer to private data for each different flavor of object file reader to initialize appropriately.
This commit is contained in:
parent
ba04ec6e77
commit
4a35d6e91b
|
@ -1,3 +1,10 @@
|
||||||
|
Thu Oct 24 01:32:51 1991 Fred Fish (fnf at cygnus.com)
|
||||||
|
|
||||||
|
* dbxread.c, mipsread.c symmisc.c, symtab.c: Remove the object
|
||||||
|
file specific fields from the partial symbol table structure and
|
||||||
|
replace them with a pointer to private data for each different
|
||||||
|
flavor of object file reader to initialize appropriately.
|
||||||
|
|
||||||
Tue Oct 22 18:04:32 1991 Stu Grossman (grossman at cygnus.com)
|
Tue Oct 22 18:04:32 1991 Stu Grossman (grossman at cygnus.com)
|
||||||
|
|
||||||
* infrun.c (wait_for_inferior): Check return value from
|
* infrun.c (wait_for_inferior): Check return value from
|
||||||
|
|
|
@ -126,6 +126,25 @@ struct dbx_symfile_info {
|
||||||
int desc; /* File descriptor of symbol file */
|
int desc; /* File descriptor of symbol file */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Each partial symbol table entry contains a pointer to private data for the
|
||||||
|
read_symtab() function to use when expanding a partial symbol table entry
|
||||||
|
to a full symbol table entry.
|
||||||
|
|
||||||
|
For dbxread this structure contains the offset within the file symbol table
|
||||||
|
of first local symbol for this file, and length (in bytes) of the section
|
||||||
|
of the symbol table devoted to this file's symbols (actually, the section
|
||||||
|
bracketed may contain more than just this file's symbols). If ldsymlen is
|
||||||
|
0, the only reason for this thing's existence is the dependency list.
|
||||||
|
Nothing else will happen when it is read in. */
|
||||||
|
|
||||||
|
#define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
|
||||||
|
#define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen)
|
||||||
|
|
||||||
|
struct symloc {
|
||||||
|
int ldsymoff;
|
||||||
|
int ldsymlen;
|
||||||
|
};
|
||||||
|
|
||||||
extern void qsort ();
|
extern void qsort ();
|
||||||
extern double atof ();
|
extern double atof ();
|
||||||
extern struct cmd_list_element *cmdlist;
|
extern struct cmd_list_element *cmdlist;
|
||||||
|
@ -2017,7 +2036,7 @@ read_dbx_symtab (symfile_name, addr,
|
||||||
things like "break c-exp.y:435" need to work (I
|
things like "break c-exp.y:435" need to work (I
|
||||||
suppose the psymtab_include_list could be hashed or put
|
suppose the psymtab_include_list could be hashed or put
|
||||||
in a binary tree, if profiling shows this is a major hog). */
|
in a binary tree, if profiling shows this is a major hog). */
|
||||||
if (!strcmp (namestring, pst->filename))
|
if (pst && !strcmp (namestring, pst->filename))
|
||||||
continue;
|
continue;
|
||||||
{
|
{
|
||||||
register int i;
|
register int i;
|
||||||
|
@ -2357,13 +2376,14 @@ read_dbx_symtab (symfile_name, addr,
|
||||||
discard_cleanups (old_chain);
|
discard_cleanups (old_chain);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Allocate and partially fill a partial symtab. It will be
|
||||||
* Allocate and partially fill a partial symtab. It will be
|
completely filled at the end of the symbol list.
|
||||||
* completely filled at the end of the symbol list.
|
|
||||||
|
SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
|
||||||
|
is the address relative to which its symbols are (incremental) or 0
|
||||||
|
(normal). */
|
||||||
|
|
||||||
|
|
||||||
SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
|
|
||||||
is the address relative to which its symbols are (incremental) or 0
|
|
||||||
(normal). */
|
|
||||||
static struct partial_symtab *
|
static struct partial_symtab *
|
||||||
start_psymtab (symfile_name, addr,
|
start_psymtab (symfile_name, addr,
|
||||||
filename, textlow, ldsymoff, global_syms, static_syms)
|
filename, textlow, ldsymoff, global_syms, static_syms)
|
||||||
|
@ -2392,7 +2412,9 @@ start_psymtab (symfile_name, addr,
|
||||||
strcpy (result->filename, filename);
|
strcpy (result->filename, filename);
|
||||||
|
|
||||||
result->textlow = textlow;
|
result->textlow = textlow;
|
||||||
result->ldsymoff = ldsymoff;
|
result->read_symtab_private = (char *) obstack_alloc (psymbol_obstack,
|
||||||
|
sizeof (struct symloc));
|
||||||
|
LDSYMOFF(result) = ldsymoff;
|
||||||
|
|
||||||
result->readin = 0;
|
result->readin = 0;
|
||||||
result->symtab = 0;
|
result->symtab = 0;
|
||||||
|
@ -2450,7 +2472,7 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
pst->ldsymlen = capping_symbol_offset - pst->ldsymoff;
|
LDSYMLEN(pst) = capping_symbol_offset - LDSYMOFF(pst);
|
||||||
pst->texthigh = capping_text;
|
pst->texthigh = capping_text;
|
||||||
|
|
||||||
pst->n_global_syms =
|
pst->n_global_syms =
|
||||||
|
@ -2485,8 +2507,10 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
|
||||||
|
|
||||||
subpst->symfile_name = pst->symfile_name;
|
subpst->symfile_name = pst->symfile_name;
|
||||||
subpst->addr = pst->addr;
|
subpst->addr = pst->addr;
|
||||||
subpst->ldsymoff =
|
subpst->read_symtab_private = (char *) obstack_alloc (psymbol_obstack,
|
||||||
subpst->ldsymlen =
|
sizeof (struct symloc));
|
||||||
|
LDSYMOFF(subpst) =
|
||||||
|
LDSYMLEN(subpst) =
|
||||||
subpst->textlow =
|
subpst->textlow =
|
||||||
subpst->texthigh = 0;
|
subpst->texthigh = 0;
|
||||||
|
|
||||||
|
@ -2565,7 +2589,7 @@ psymtab_to_symtab_1 (pst, desc, stringtab, stringtab_size, sym_offset)
|
||||||
stringtab, stringtab_size, sym_offset);
|
stringtab, stringtab_size, sym_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pst->ldsymlen) /* Otherwise it's a dummy */
|
if (LDSYMLEN(pst)) /* Otherwise it's a dummy */
|
||||||
{
|
{
|
||||||
/* Init stuff necessary for reading in symbols */
|
/* Init stuff necessary for reading in symbols */
|
||||||
free_pendings = 0;
|
free_pendings = 0;
|
||||||
|
@ -2578,8 +2602,8 @@ psymtab_to_symtab_1 (pst, desc, stringtab, stringtab_size, sym_offset)
|
||||||
lseek (desc, sym_offset, L_SET);
|
lseek (desc, sym_offset, L_SET);
|
||||||
pst->symtab =
|
pst->symtab =
|
||||||
read_ofile_symtab (desc, stringtab, stringtab_size,
|
read_ofile_symtab (desc, stringtab, stringtab_size,
|
||||||
pst->ldsymoff,
|
LDSYMOFF(pst),
|
||||||
pst->ldsymlen, pst->textlow,
|
LDSYMLEN(pst), pst->textlow,
|
||||||
pst->texthigh - pst->textlow, pst->addr);
|
pst->texthigh - pst->textlow, pst->addr);
|
||||||
sort_symtab_syms (pst->symtab);
|
sort_symtab_syms (pst->symtab);
|
||||||
|
|
||||||
|
@ -2615,7 +2639,7 @@ dbx_psymtab_to_symtab (pst)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pst->ldsymlen || pst->number_of_dependencies)
|
if (LDSYMLEN(pst) || pst->number_of_dependencies)
|
||||||
{
|
{
|
||||||
/* Print the message now, before reading the string table,
|
/* Print the message now, before reading the string table,
|
||||||
to avoid disconcerting pauses. */
|
to avoid disconcerting pauses. */
|
||||||
|
|
|
@ -57,6 +57,24 @@ struct coff_exec {
|
||||||
struct external_aouthdr a;
|
struct external_aouthdr a;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Each partial symbol table entry contains a pointer to private data for the
|
||||||
|
read_symtab() function to use when expanding a partial symbol table entry
|
||||||
|
to a full symbol table entry.
|
||||||
|
|
||||||
|
For mipsread this structure contains the index of the FDR that this psymtab
|
||||||
|
represents and a pointer to the symbol table header HDRR from the symbol
|
||||||
|
file that the psymtab was created from.
|
||||||
|
|
||||||
|
Note: This code is currently untested. -fnf */
|
||||||
|
|
||||||
|
#define FDR_IDX(p) (((struct symloc *)((p)->read_symtab_private))->fdr_idx)
|
||||||
|
#define CUR_HDR(p) (((struct symloc *)((p)->read_symtab_private))->cur_hdr)
|
||||||
|
|
||||||
|
struct symloc {
|
||||||
|
int fdr_idx;
|
||||||
|
HDRR *cur_hdr;
|
||||||
|
};
|
||||||
|
|
||||||
/* Things we import explicitly from other modules */
|
/* Things we import explicitly from other modules */
|
||||||
|
|
||||||
extern int info_verbose;
|
extern int info_verbose;
|
||||||
|
@ -305,8 +323,7 @@ mipscoff_psymtab_to_symtab(pst)
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
/* Restore the header and list of pending typedefs */
|
/* Restore the header and list of pending typedefs */
|
||||||
/* FIXME, we should use private data that is a proper pointer. */
|
cur_hdr = CUR_HDR(pst);
|
||||||
cur_hdr = (HDRR *) pst->ldsymlen;
|
|
||||||
|
|
||||||
psymtab_to_symtab_1(pst, pst->filename);
|
psymtab_to_symtab_1(pst, pst->filename);
|
||||||
|
|
||||||
|
@ -1497,6 +1514,8 @@ parse_lines(fh, lt)
|
||||||
delta -= 16;
|
delta -= 16;
|
||||||
if (delta == -8) {
|
if (delta == -8) {
|
||||||
delta = (base[0] << 8) | base[1];
|
delta = (base[0] << 8) | base[1];
|
||||||
|
if (delta >= 0x8000)
|
||||||
|
delta -= 0x10000;
|
||||||
base += 2;
|
base += 2;
|
||||||
}
|
}
|
||||||
lineno += delta;/* first delta is 0 */
|
lineno += delta;/* first delta is 0 */
|
||||||
|
@ -1556,7 +1575,6 @@ parse_partial_symbols(end_of_text_seg)
|
||||||
int end_of_text_seg;
|
int end_of_text_seg;
|
||||||
{
|
{
|
||||||
int f_idx, s_idx, h_max, stat_idx;
|
int f_idx, s_idx, h_max, stat_idx;
|
||||||
CORE_ADDR dummy, *prevhigh;
|
|
||||||
HDRR *hdr;
|
HDRR *hdr;
|
||||||
/* Running pointers */
|
/* Running pointers */
|
||||||
FDR *fh;
|
FDR *fh;
|
||||||
|
@ -1586,7 +1604,7 @@ parse_partial_symbols(end_of_text_seg)
|
||||||
{
|
{
|
||||||
struct partial_symtab * pst = new_psymtab("");
|
struct partial_symtab * pst = new_psymtab("");
|
||||||
fdr_to_pst[-1].pst = pst;
|
fdr_to_pst[-1].pst = pst;
|
||||||
pst->ldsymoff = -1;
|
FDR_IDX(pst) = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now scan the FDRs, mostly for dependencies */
|
/* Now scan the FDRs, mostly for dependencies */
|
||||||
|
@ -1696,6 +1714,7 @@ parse_partial_symbols(end_of_text_seg)
|
||||||
for (f_idx = 0; f_idx < hdr->ifdMax; f_idx++) {
|
for (f_idx = 0; f_idx < hdr->ifdMax; f_idx++) {
|
||||||
fh = f_idx + (FDR *)(cur_hdr->cbFdOffset);
|
fh = f_idx + (FDR *)(cur_hdr->cbFdOffset);
|
||||||
pst = fdr_to_pst[f_idx].pst;
|
pst = fdr_to_pst[f_idx].pst;
|
||||||
|
pst->texthigh = pst->textlow;
|
||||||
|
|
||||||
for (s_idx = 0; s_idx < fh->csym; ) {
|
for (s_idx = 0; s_idx < fh->csym; ) {
|
||||||
register struct partial_symbol *p;
|
register struct partial_symbol *p;
|
||||||
|
@ -1723,6 +1742,17 @@ parse_partial_symbols(end_of_text_seg)
|
||||||
/* Skip over procedure to next one. */
|
/* Skip over procedure to next one. */
|
||||||
s_idx = (sh->index + (AUXU *)fh->iauxBase)
|
s_idx = (sh->index + (AUXU *)fh->iauxBase)
|
||||||
->isym;
|
->isym;
|
||||||
|
{
|
||||||
|
long high;
|
||||||
|
long procaddr = sh->value;
|
||||||
|
|
||||||
|
sh = s_idx + (SYMR *) fh->isymBase - 1;
|
||||||
|
if (sh->st != stEnd)
|
||||||
|
continue;
|
||||||
|
high = procaddr + sh->value;
|
||||||
|
if (high > pst->texthigh)
|
||||||
|
pst->texthigh = high;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
case stStatic: /* Variable */
|
case stStatic: /* Variable */
|
||||||
SYMBOL_CLASS(p) = LOC_STATIC;
|
SYMBOL_CLASS(p) = LOC_STATIC;
|
||||||
|
@ -1734,9 +1764,12 @@ parse_partial_symbols(end_of_text_seg)
|
||||||
case stConstant: /* Constant decl */
|
case stConstant: /* Constant decl */
|
||||||
SYMBOL_CLASS(p) = LOC_CONST;
|
SYMBOL_CLASS(p) = LOC_CONST;
|
||||||
break;
|
break;
|
||||||
case stBlock: /* { }, str, un, enum */
|
case stBlock: /* { }, str, un, enum*/
|
||||||
/* Eventually we want struct names and enum
|
if (sh->sc == scInfo) {
|
||||||
values out of here. FIXME */
|
SYMBOL_NAMESPACE(p) = STRUCT_NAMESPACE;
|
||||||
|
SYMBOL_CLASS(p) = LOC_TYPEDEF;
|
||||||
|
pst->n_static_syms++;
|
||||||
|
}
|
||||||
/* Skip over the block */
|
/* Skip over the block */
|
||||||
s_idx = sh->index;
|
s_idx = sh->index;
|
||||||
continue;
|
continue;
|
||||||
|
@ -1762,40 +1795,19 @@ parse_partial_symbols(end_of_text_seg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The array (of lists) of globals must be sorted.
|
/* The array (of lists) of globals must be sorted. */
|
||||||
Take care, since we are at it, of pst->texthigh.
|
|
||||||
|
|
||||||
NOTE: The way we handle textlow/high is incorrect, but good
|
|
||||||
enough for a first approximation. The case we fail is on a
|
|
||||||
file "foo.c" that looks like
|
|
||||||
proc1() {...}
|
|
||||||
#include "bar.c" -- this contains proc2()
|
|
||||||
proc3() {...}
|
|
||||||
where proc3() is attributed to bar.c. But since this is a
|
|
||||||
dependent file it will cause loading of foo.c as well, so
|
|
||||||
everything will be fine at the end. */
|
|
||||||
|
|
||||||
/* First, sort the psymtabs by their textlow addresses. */
|
|
||||||
reorder_psymtabs();
|
reorder_psymtabs();
|
||||||
|
|
||||||
/* Now, rip through and fill in "texthigh" from the textlow
|
/* Now sort the global psymbols. */
|
||||||
of the following psymtab. Slimy but it might work.
|
|
||||||
Sort the global psymbols while we're at it. */
|
|
||||||
prevhigh = &dummy;
|
|
||||||
for (f_idx = 0; f_idx < hdr->ifdMax; f_idx++) {
|
for (f_idx = 0; f_idx < hdr->ifdMax; f_idx++) {
|
||||||
struct partial_symtab *pst = fdr_to_pst[f_idx].pst;
|
struct partial_symtab *pst = fdr_to_pst[f_idx].pst;
|
||||||
if (pst->n_global_syms > 1)
|
if (pst->n_global_syms > 1)
|
||||||
qsort (global_psymbols.list + pst->globals_offset,
|
qsort (global_psymbols.list + pst->globals_offset,
|
||||||
pst->n_global_syms, sizeof (struct partial_symbol),
|
pst->n_global_syms, sizeof (struct partial_symbol),
|
||||||
compare_psymbols);
|
compare_psymbols);
|
||||||
if (pst->textlow) {
|
|
||||||
*prevhigh = pst->textlow;
|
|
||||||
prevhigh = &pst->texthigh;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mark the last code address, and remember it for later */
|
/* Mark the last code address, and remember it for later */
|
||||||
*prevhigh = end_of_text_seg;
|
|
||||||
hdr->cbDnOffset = end_of_text_seg;
|
hdr->cbDnOffset = end_of_text_seg;
|
||||||
|
|
||||||
free(&fdr_to_pst[-1]);
|
free(&fdr_to_pst[-1]);
|
||||||
|
@ -1837,7 +1849,7 @@ parse_fdr(f_idx, lev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make everything point to everything. */
|
/* Make everything point to everything. */
|
||||||
pst->ldsymoff = f_idx;
|
FDR_IDX(pst) = f_idx;
|
||||||
fdr_to_pst[f_idx].pst = pst;
|
fdr_to_pst[f_idx].pst = pst;
|
||||||
fh->ioptBase = (int)pst;
|
fh->ioptBase = (int)pst;
|
||||||
|
|
||||||
|
@ -1900,11 +1912,11 @@ psymtab_to_symtab_1(pst, filename)
|
||||||
/* How many symbols will we need */
|
/* How many symbols will we need */
|
||||||
/* FIXME, this does not count enum values. */
|
/* FIXME, this does not count enum values. */
|
||||||
f_max = pst->n_global_syms + pst->n_static_syms;
|
f_max = pst->n_global_syms + pst->n_static_syms;
|
||||||
if (pst->ldsymoff == -1) {
|
if (FDR_IDX(pst) == -1) {
|
||||||
fh = 0;
|
fh = 0;
|
||||||
st = new_symtab( "unknown", f_max, 0);
|
st = new_symtab( "unknown", f_max, 0);
|
||||||
} else {
|
} else {
|
||||||
fh = (FDR *) (cur_hdr->cbFdOffset) + pst->ldsymoff;
|
fh = (FDR *) (cur_hdr->cbFdOffset) + FDR_IDX(pst);
|
||||||
f_max += fh->csym + fh->cpd;
|
f_max += fh->csym + fh->cpd;
|
||||||
st = new_symtab(pst->filename, 2 * f_max, 2 * fh->cline);
|
st = new_symtab(pst->filename, 2 * f_max, 2 * fh->cline);
|
||||||
}
|
}
|
||||||
|
@ -1934,7 +1946,7 @@ psymtab_to_symtab_1(pst, filename)
|
||||||
|
|
||||||
/* Now read the symbols for this symtab */
|
/* Now read the symbols for this symtab */
|
||||||
|
|
||||||
cur_fd = pst->ldsymoff;
|
cur_fd = FDR_IDX(pst);
|
||||||
cur_fdr = fh;
|
cur_fdr = fh;
|
||||||
cur_stab = st;
|
cur_stab = st;
|
||||||
|
|
||||||
|
@ -2405,8 +2417,9 @@ new_psymtab(name)
|
||||||
partial_symtab_list = pst;
|
partial_symtab_list = pst;
|
||||||
|
|
||||||
/* Keep a backpointer to the file's symbols */
|
/* Keep a backpointer to the file's symbols */
|
||||||
/* FIXME, we should use private data that is a proper pointer. */
|
pst->read_symtab_private = (char *) obstack_alloc (psymbol_obstack,
|
||||||
pst->ldsymlen = (int)cur_hdr;
|
sizeof (struct symloc));
|
||||||
|
CUR_HDR(pst) = cur_hdr;
|
||||||
|
|
||||||
/* The way to turn this into a symtab is to call... */
|
/* The way to turn this into a symtab is to call... */
|
||||||
pst->read_symtab = mipscoff_psymtab_to_symtab;
|
pst->read_symtab = mipscoff_psymtab_to_symtab;
|
||||||
|
@ -2527,6 +2540,7 @@ new_type(name)
|
||||||
obstack_alloc (symbol_obstack, sizeof (struct type));
|
obstack_alloc (symbol_obstack, sizeof (struct type));
|
||||||
|
|
||||||
bzero (t, sizeof (*t));
|
bzero (t, sizeof (*t));
|
||||||
|
TYPE_VPTR_FIELDNO (t) = -1;
|
||||||
TYPE_NAME(t) = name;
|
TYPE_NAME(t) = name;
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
@ -2549,6 +2563,7 @@ make_type(code, length, uns, name)
|
||||||
TYPE_LENGTH(type) = length;
|
TYPE_LENGTH(type) = length;
|
||||||
TYPE_FLAGS(type) = uns ? TYPE_FLAG_UNSIGNED : 0;
|
TYPE_FLAGS(type) = uns ? TYPE_FLAG_UNSIGNED : 0;
|
||||||
TYPE_NAME(type) = name;
|
TYPE_NAME(type) = name;
|
||||||
|
TYPE_VPTR_FIELDNO (type) = -1;
|
||||||
|
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
161
gdb/symmisc.c
161
gdb/symmisc.c
|
@ -3,28 +3,30 @@
|
||||||
|
|
||||||
This file is part of GDB.
|
This file is part of GDB.
|
||||||
|
|
||||||
GDB is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 1, or (at your option)
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
GDB is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with GDB; see the file COPYING. If not, write to
|
along with this program; if not, write to the Free Software
|
||||||
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
|
#include "bfd.h"
|
||||||
|
#include "symfile.h"
|
||||||
#include "breakpoint.h"
|
#include "breakpoint.h"
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <obstack.h>
|
#include <obstack.h>
|
||||||
|
|
||||||
/* Free all the symtabs that are currently installed,
|
/* Free all the symtabs that are currently installed,
|
||||||
|
@ -94,7 +96,6 @@ free_symtab (s)
|
||||||
{
|
{
|
||||||
register int i, n;
|
register int i, n;
|
||||||
register struct blockvector *bv;
|
register struct blockvector *bv;
|
||||||
register struct typevector *tv;
|
|
||||||
|
|
||||||
switch (s->free_code)
|
switch (s->free_code)
|
||||||
{
|
{
|
||||||
|
@ -114,9 +115,6 @@ free_symtab (s)
|
||||||
free_symtab_block (BLOCKVECTOR_BLOCK (bv, i));
|
free_symtab_block (BLOCKVECTOR_BLOCK (bv, i));
|
||||||
/* Free the blockvector itself. */
|
/* Free the blockvector itself. */
|
||||||
free (bv);
|
free (bv);
|
||||||
/* Free the type vector. */
|
|
||||||
tv = TYPEVECTOR (s);
|
|
||||||
free (tv);
|
|
||||||
/* Also free the linetable. */
|
/* Also free the linetable. */
|
||||||
|
|
||||||
case free_linetable:
|
case free_linetable:
|
||||||
|
@ -141,6 +139,7 @@ free_symtab (s)
|
||||||
|
|
||||||
static int block_depth ();
|
static int block_depth ();
|
||||||
static void print_symbol ();
|
static void print_symbol ();
|
||||||
|
static void print_partial_symbol ();
|
||||||
|
|
||||||
void
|
void
|
||||||
print_symtabs (filename)
|
print_symtabs (filename)
|
||||||
|
@ -314,10 +313,6 @@ print_symbol (symbol, depth, outfile)
|
||||||
BLOCK_START (SYMBOL_BLOCK_VALUE (symbol)));
|
BLOCK_START (SYMBOL_BLOCK_VALUE (symbol)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LOC_EXTERNAL:
|
|
||||||
fprintf (outfile, "external at 0x%x", SYMBOL_VALUE_ADDRESS (symbol));
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
fprintf (outfile, "botched symbol class %x", SYMBOL_CLASS (symbol));
|
fprintf (outfile, "botched symbol class %x", SYMBOL_CLASS (symbol));
|
||||||
break;
|
break;
|
||||||
|
@ -326,6 +321,140 @@ print_symbol (symbol, depth, outfile)
|
||||||
fprintf (outfile, "\n");
|
fprintf (outfile, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
print_partial_symtabs (filename)
|
||||||
|
char *filename;
|
||||||
|
{
|
||||||
|
FILE *outfile;
|
||||||
|
struct partial_symtab *p;
|
||||||
|
struct cleanup *cleanups;
|
||||||
|
extern int fclose();
|
||||||
|
|
||||||
|
if (filename == 0)
|
||||||
|
error_no_arg ("file to write partial symbol data in");
|
||||||
|
|
||||||
|
filename = tilde_expand (filename);
|
||||||
|
make_cleanup (free, filename);
|
||||||
|
|
||||||
|
outfile = fopen (filename, "w");
|
||||||
|
if (outfile == 0)
|
||||||
|
perror_with_name (filename);
|
||||||
|
|
||||||
|
cleanups = make_cleanup (fclose, outfile);
|
||||||
|
immediate_quit++;
|
||||||
|
|
||||||
|
for (p = partial_symtab_list; p; p = p->next)
|
||||||
|
{
|
||||||
|
fprintf_filtered (outfile, "Partial symtab for source file %s ",
|
||||||
|
p->filename);
|
||||||
|
fprintf_filtered (outfile, "(object 0x%x)\n\n", p);
|
||||||
|
fprintf_filtered (outfile, " Full symbol table %s been read from %s\n",
|
||||||
|
p->readin ? "has" : "has not yet",
|
||||||
|
p->symfile_name);
|
||||||
|
if (p->readin)
|
||||||
|
fprintf_filtered (outfile, " Was read into symtab at 0x%x by function at 0x%x\n",
|
||||||
|
p->symtab, p->read_symtab);
|
||||||
|
fprintf_filtered (outfile, " Relocate symbols by 0x%x\n", p->addr);
|
||||||
|
fprintf_filtered (outfile, " Symbols cover text addresses 0x%x-0x%x\n",
|
||||||
|
p->textlow, p->texthigh);
|
||||||
|
fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n",
|
||||||
|
p->number_of_dependencies);
|
||||||
|
if (p->n_global_syms > 0)
|
||||||
|
print_partial_symbol (global_psymbols.list + p->globals_offset,
|
||||||
|
p->n_global_syms, "Global", outfile);
|
||||||
|
if (p->n_static_syms > 0)
|
||||||
|
print_partial_symbol (static_psymbols.list + p->statics_offset,
|
||||||
|
p->n_static_syms, "Static", outfile);
|
||||||
|
fprintf_filtered (outfile, "\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
immediate_quit--;
|
||||||
|
do_cleanups (cleanups);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_partial_symbol (p, count, what, outfile)
|
||||||
|
struct partial_symbol *p;
|
||||||
|
int count;
|
||||||
|
char *what;
|
||||||
|
FILE *outfile;
|
||||||
|
{
|
||||||
|
char *space;
|
||||||
|
char *class;
|
||||||
|
|
||||||
|
fprintf_filtered (outfile, " %s partial symbols:\n", what);
|
||||||
|
while (count-- > 0)
|
||||||
|
{
|
||||||
|
fprintf_filtered (outfile, " `%s', ", SYMBOL_NAME(p));
|
||||||
|
switch (SYMBOL_NAMESPACE (p))
|
||||||
|
{
|
||||||
|
case UNDEF_NAMESPACE:
|
||||||
|
fputs_filtered ("undefined namespace, ", outfile);
|
||||||
|
break;
|
||||||
|
case VAR_NAMESPACE:
|
||||||
|
/* This is the usual thing -- don't print it */
|
||||||
|
break;
|
||||||
|
case STRUCT_NAMESPACE:
|
||||||
|
fputs_filtered ("struct namespace, ", outfile);
|
||||||
|
break;
|
||||||
|
case LABEL_NAMESPACE:
|
||||||
|
fputs_filtered ("label namespace, ", outfile);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fputs_filtered ("<invalid namespace>, ", outfile);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (SYMBOL_CLASS (p))
|
||||||
|
{
|
||||||
|
case LOC_UNDEF:
|
||||||
|
fputs_filtered ("undefined", outfile);
|
||||||
|
break;
|
||||||
|
case LOC_CONST:
|
||||||
|
fputs_filtered ("constant int", outfile);
|
||||||
|
break;
|
||||||
|
case LOC_STATIC:
|
||||||
|
fputs_filtered ("static", outfile);
|
||||||
|
break;
|
||||||
|
case LOC_REGISTER:
|
||||||
|
fputs_filtered ("register", outfile);
|
||||||
|
break;
|
||||||
|
case LOC_ARG:
|
||||||
|
fputs_filtered ("pass by value", outfile);
|
||||||
|
break;
|
||||||
|
case LOC_REF_ARG:
|
||||||
|
fputs_filtered ("pass by reference", outfile);
|
||||||
|
break;
|
||||||
|
case LOC_REGPARM:
|
||||||
|
fputs_filtered ("register parameter", outfile);
|
||||||
|
break;
|
||||||
|
case LOC_LOCAL:
|
||||||
|
fputs_filtered ("stack parameter", outfile);
|
||||||
|
break;
|
||||||
|
case LOC_TYPEDEF:
|
||||||
|
fputs_filtered ("type", outfile);
|
||||||
|
break;
|
||||||
|
case LOC_LABEL:
|
||||||
|
fputs_filtered ("label", outfile);
|
||||||
|
break;
|
||||||
|
case LOC_BLOCK:
|
||||||
|
fputs_filtered ("function", outfile);
|
||||||
|
break;
|
||||||
|
case LOC_CONST_BYTES:
|
||||||
|
fputs_filtered ("constant bytes", outfile);
|
||||||
|
break;
|
||||||
|
case LOC_LOCAL_ARG:
|
||||||
|
fputs_filtered ("shuffled arg", outfile);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fputs_filtered ("<invalid location>", outfile);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fputs_filtered (", ", outfile);
|
||||||
|
fprintf_filtered (outfile, "0x%x\n", SYMBOL_VALUE (p));
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Return the nexting depth of a block within other blocks in its symtab. */
|
/* Return the nexting depth of a block within other blocks in its symtab. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -356,5 +485,7 @@ _initialize_symmisc ()
|
||||||
|
|
||||||
add_com ("printsyms", class_obscure, print_symtabs,
|
add_com ("printsyms", class_obscure, print_symtabs,
|
||||||
"Print dump of current symbol definitions to file OUTFILE.");
|
"Print dump of current symbol definitions to file OUTFILE.");
|
||||||
|
add_com ("printpsyms", class_obscure, print_partial_symtabs,
|
||||||
|
"Print dump of current partial symbol definitions to file OUTFILE.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
83
gdb/symtab.h
83
gdb/symtab.h
|
@ -1,21 +1,21 @@
|
||||||
/* Symbol table definitions for GDB.
|
/* Symbol table definitions for GDB.
|
||||||
Copyright (C) 1986, 1989 Free Software Foundation, Inc.
|
Copyright (C) 1986, 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GDB.
|
This file is part of GDB.
|
||||||
|
|
||||||
GDB is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 1, or (at your option)
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
GDB is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with GDB; see the file COPYING. If not, write to
|
along with this program; if not, write to the Free Software
|
||||||
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
#if !defined (SYMTAB_H)
|
#if !defined (SYMTAB_H)
|
||||||
#define SYMTAB_H 1
|
#define SYMTAB_H 1
|
||||||
|
@ -59,7 +59,7 @@ extern void free ();
|
||||||
/* Actually, the misc function list is used to store *all* of the
|
/* Actually, the misc function list is used to store *all* of the
|
||||||
global symbols (text, data, bss, and abs). It is sometimes used
|
global symbols (text, data, bss, and abs). It is sometimes used
|
||||||
to figure out what symtabs to read in. The "type" field is used
|
to figure out what symtabs to read in. The "type" field is used
|
||||||
occasionally.
|
occasionally. Calling it the misc "function" vector is now a misnomer.
|
||||||
|
|
||||||
The misc_info field is available for machine-specific information
|
The misc_info field is available for machine-specific information
|
||||||
that can be cached along with a misc function vector entry. The
|
that can be cached along with a misc function vector entry. The
|
||||||
|
@ -83,19 +83,6 @@ struct misc_function
|
||||||
struct misc_function *misc_function_vector;
|
struct misc_function *misc_function_vector;
|
||||||
int misc_function_count;
|
int misc_function_count;
|
||||||
|
|
||||||
enum language {language_unknown, language_c};
|
|
||||||
|
|
||||||
/* All data types of symbols in the compiled program
|
|
||||||
are represented by `struct type' objects.
|
|
||||||
All of these objects are pointed to by the typevector.
|
|
||||||
The type vector may have empty slots that contain zero. */
|
|
||||||
|
|
||||||
struct typevector
|
|
||||||
{
|
|
||||||
int length; /* Number of types described */
|
|
||||||
struct type *type[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Different kinds of data types are distinguished by the `code' field. */
|
/* Different kinds of data types are distinguished by the `code' field. */
|
||||||
|
|
||||||
enum type_code
|
enum type_code
|
||||||
|
@ -119,6 +106,10 @@ enum type_code
|
||||||
TYPE_CODE_MEMBER, /* Member type */
|
TYPE_CODE_MEMBER, /* Member type */
|
||||||
TYPE_CODE_METHOD, /* Method type */
|
TYPE_CODE_METHOD, /* Method type */
|
||||||
TYPE_CODE_REF, /* C++ Reference types */
|
TYPE_CODE_REF, /* C++ Reference types */
|
||||||
|
|
||||||
|
/* Modula-2 */
|
||||||
|
TYPE_CODE_CHAR, /* *real* character type */
|
||||||
|
TYPE_CODE_BOOL, /* Builtin Modula-2 BOOLEAN */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* This appears in a type's flags word for an unsigned integer type. */
|
/* This appears in a type's flags word for an unsigned integer type. */
|
||||||
|
@ -403,11 +394,6 @@ enum address_class
|
||||||
LOC_LABEL, /* Value is address SYMBOL_VALUE_ADDRESS in the code */
|
LOC_LABEL, /* Value is address SYMBOL_VALUE_ADDRESS in the code */
|
||||||
LOC_BLOCK, /* Value is address SYMBOL_VALUE_BLOCK of a
|
LOC_BLOCK, /* Value is address SYMBOL_VALUE_BLOCK of a
|
||||||
`struct block'. Function names have this class. */
|
`struct block'. Function names have this class. */
|
||||||
LOC_EXTERNAL, /* Value is at address SYMBOL_VALUE_ADDRESS not in
|
|
||||||
this compilation.
|
|
||||||
This is used only in psymtabs; in symtabs
|
|
||||||
LOC_STATIC is used instead (since in that case
|
|
||||||
we take the time to find the address). */
|
|
||||||
LOC_CONST_BYTES, /* Value is a constant byte-sequence pointed to by
|
LOC_CONST_BYTES, /* Value is a constant byte-sequence pointed to by
|
||||||
SYMBOL_VALUE_ADDRESS, in target byte order. */
|
SYMBOL_VALUE_ADDRESS, in target byte order. */
|
||||||
LOC_LOCAL_ARG, /* Value is arg at spec'd offset in stack frame.
|
LOC_LOCAL_ARG, /* Value is arg at spec'd offset in stack frame.
|
||||||
|
@ -442,7 +428,7 @@ struct symbol
|
||||||
LOC_REF_ARG, LOC_REGPARM, LOC_LOCAL */
|
LOC_REF_ARG, LOC_REGPARM, LOC_LOCAL */
|
||||||
struct block *block; /* for LOC_BLOCK */
|
struct block *block; /* for LOC_BLOCK */
|
||||||
char *bytes; /* for LOC_CONST_BYTES */
|
char *bytes; /* for LOC_CONST_BYTES */
|
||||||
CORE_ADDR address; /* for LOC_STATIC, LOC_LABEL, LOC_EXTERNAL */
|
CORE_ADDR address; /* for LOC_STATIC, LOC_LABEL */
|
||||||
struct symbol *chain; /* for opaque typedef struct chain */
|
struct symbol *chain; /* for opaque typedef struct chain */
|
||||||
}
|
}
|
||||||
value;
|
value;
|
||||||
|
@ -528,8 +514,6 @@ struct symtab
|
||||||
struct blockvector *blockvector;
|
struct blockvector *blockvector;
|
||||||
/* Table mapping core addresses to line numbers for this file. */
|
/* Table mapping core addresses to line numbers for this file. */
|
||||||
struct linetable *linetable;
|
struct linetable *linetable;
|
||||||
/* Vector containing all types defined for this symtab. */
|
|
||||||
struct typevector *typevector;
|
|
||||||
/* Name of this source file. */
|
/* Name of this source file. */
|
||||||
char *filename;
|
char *filename;
|
||||||
/* Directory in which it was compiled, or NULL if we don't know. */
|
/* Directory in which it was compiled, or NULL if we don't know. */
|
||||||
|
@ -587,15 +571,6 @@ struct partial_symtab
|
||||||
relocate by this amount when reading in symbols from the symbol
|
relocate by this amount when reading in symbols from the symbol
|
||||||
file. */
|
file. */
|
||||||
CORE_ADDR addr;
|
CORE_ADDR addr;
|
||||||
|
|
||||||
/* Offset within loader symbol table of first local symbol for this
|
|
||||||
file and length (in bytes) of the section of the symbol table
|
|
||||||
devoted to this file's symbols (actually, the section bracketed
|
|
||||||
may contain more than just this files symbols
|
|
||||||
If ldsymlen is 0, the only reason for this things existence is
|
|
||||||
the dependency list below. Nothing else will happen when it is
|
|
||||||
read in. */
|
|
||||||
int ldsymoff, ldsymlen;
|
|
||||||
/* Range of text addresses covered by this file; texthigh is the
|
/* Range of text addresses covered by this file; texthigh is the
|
||||||
beginning of the next section. */
|
beginning of the next section. */
|
||||||
CORE_ADDR textlow, texthigh;
|
CORE_ADDR textlow, texthigh;
|
||||||
|
@ -608,14 +583,15 @@ struct partial_symtab
|
||||||
/* Global symbol list. This list will be sorted after readin to
|
/* Global symbol list. This list will be sorted after readin to
|
||||||
improve access. Binary search will be the usual method of
|
improve access. Binary search will be the usual method of
|
||||||
finding a symbol within it. globals_offset is an integer offset
|
finding a symbol within it. globals_offset is an integer offset
|
||||||
within ps_globals */
|
within global_psymbols[]. */
|
||||||
int globals_offset, n_global_syms;
|
int globals_offset, n_global_syms;
|
||||||
/* Static symbol list. This list will *not* be sorted after readin;
|
/* Static symbol list. This list will *not* be sorted after readin;
|
||||||
to find a symbol in it, exhaustive search must be used. This is
|
to find a symbol in it, exhaustive search must be used. This is
|
||||||
reasonable because searches through this list will eventually
|
reasonable because searches through this list will eventually
|
||||||
lead to either the read in of a files symbols for real (assumed
|
lead to either the read in of a files symbols for real (assumed
|
||||||
to take a *lot* of time; check) or an error (and we don't care
|
to take a *lot* of time; check) or an error (and we don't care
|
||||||
how long errors take). */
|
how long errors take). This is an offset and size within
|
||||||
|
static_psymbols[]. */
|
||||||
int statics_offset, n_static_syms;
|
int statics_offset, n_static_syms;
|
||||||
/* Pointer to symtab eventually allocated for this source file, 0 if
|
/* Pointer to symtab eventually allocated for this source file, 0 if
|
||||||
!readin or if we haven't looked for the symtab after it was readin. */
|
!readin or if we haven't looked for the symtab after it was readin. */
|
||||||
|
@ -623,6 +599,12 @@ struct partial_symtab
|
||||||
/* Pointer to function which will read in the symtab corresponding to
|
/* Pointer to function which will read in the symtab corresponding to
|
||||||
this psymtab. */
|
this psymtab. */
|
||||||
void (*read_symtab) ();
|
void (*read_symtab) ();
|
||||||
|
/* Information that lets read_symtab() locate the part of the symbol table
|
||||||
|
that this psymtab corresponds to. This information is private to the
|
||||||
|
format-dependent symbol reading routines. For further detail examine
|
||||||
|
the various symbol reading modules. Should really be (void *) but is
|
||||||
|
(char *) as with other such gdb variables. (FIXME) */
|
||||||
|
char *read_symtab_private;
|
||||||
/* Non-zero if the symtab corresponding to this psymtab has been
|
/* Non-zero if the symtab corresponding to this psymtab has been
|
||||||
readin */
|
readin */
|
||||||
unsigned char readin;
|
unsigned char readin;
|
||||||
|
@ -652,8 +634,6 @@ int current_source_line;
|
||||||
#define BLOCKLIST(symtab) (symtab)->blockvector
|
#define BLOCKLIST(symtab) (symtab)->blockvector
|
||||||
#define BLOCKVECTOR(symtab) (symtab)->blockvector
|
#define BLOCKVECTOR(symtab) (symtab)->blockvector
|
||||||
|
|
||||||
#define TYPEVECTOR(symtab) (symtab)->typevector
|
|
||||||
|
|
||||||
#define LINELIST(symtab) (symtab)->linetable
|
#define LINELIST(symtab) (symtab)->linetable
|
||||||
#define LINETABLE(symtab) (symtab)->linetable
|
#define LINETABLE(symtab) (symtab)->linetable
|
||||||
|
|
||||||
|
@ -664,9 +644,6 @@ int current_source_line;
|
||||||
#define BLOCKVECTOR_NBLOCKS(blocklist) (blocklist)->nblocks
|
#define BLOCKVECTOR_NBLOCKS(blocklist) (blocklist)->nblocks
|
||||||
#define BLOCKVECTOR_BLOCK(blocklist,n) (blocklist)->block[n]
|
#define BLOCKVECTOR_BLOCK(blocklist,n) (blocklist)->block[n]
|
||||||
|
|
||||||
#define TYPEVECTOR_NTYPES(typelist) (typelist)->length
|
|
||||||
#define TYPEVECTOR_TYPE(typelist,n) (typelist)->type[n]
|
|
||||||
|
|
||||||
#define BLOCK_START(bl) (bl)->startaddr
|
#define BLOCK_START(bl) (bl)->startaddr
|
||||||
#define BLOCK_END(bl) (bl)->endaddr
|
#define BLOCK_END(bl) (bl)->endaddr
|
||||||
#define BLOCK_NSYMS(bl) (bl)->nsyms
|
#define BLOCK_NSYMS(bl) (bl)->nsyms
|
||||||
|
@ -809,7 +786,7 @@ extern struct type *create_array_type ();
|
||||||
extern struct symbol *block_function ();
|
extern struct symbol *block_function ();
|
||||||
extern struct symbol *find_pc_function ();
|
extern struct symbol *find_pc_function ();
|
||||||
extern int find_pc_partial_function ();
|
extern int find_pc_partial_function ();
|
||||||
extern void clearpc_function_cache ();
|
extern void clear_pc_function_cache ();
|
||||||
extern struct partial_symtab *lookup_partial_symtab ();
|
extern struct partial_symtab *lookup_partial_symtab ();
|
||||||
extern struct partial_symtab *find_pc_psymtab ();
|
extern struct partial_symtab *find_pc_psymtab ();
|
||||||
extern struct symtab *find_pc_symtab ();
|
extern struct symtab *find_pc_symtab ();
|
||||||
|
@ -856,6 +833,13 @@ extern struct type *builtin_type_error;
|
||||||
extern struct type *builtin_type_long_long;
|
extern struct type *builtin_type_long_long;
|
||||||
extern struct type *builtin_type_unsigned_long_long;
|
extern struct type *builtin_type_unsigned_long_long;
|
||||||
|
|
||||||
|
/* Modula-2 types */
|
||||||
|
extern struct type *builtin_type_m2_char;
|
||||||
|
extern struct type *builtin_type_m2_int;
|
||||||
|
extern struct type *builtin_type_m2_card;
|
||||||
|
extern struct type *builtin_type_m2_real;
|
||||||
|
extern struct type *builtin_type_m2_bool;
|
||||||
|
|
||||||
/* LONG_LONG is defined if the host has "long long". */
|
/* LONG_LONG is defined if the host has "long long". */
|
||||||
#ifdef LONG_LONG
|
#ifdef LONG_LONG
|
||||||
#define BUILTIN_TYPE_LONGEST builtin_type_long_long
|
#define BUILTIN_TYPE_LONGEST builtin_type_long_long
|
||||||
|
@ -930,4 +914,11 @@ char **make_symbol_completion_list ();
|
||||||
/* The entry point of a file we are reading. */
|
/* The entry point of a file we are reading. */
|
||||||
extern CORE_ADDR entry_point;
|
extern CORE_ADDR entry_point;
|
||||||
|
|
||||||
|
/* Maximum and minimum values of built-in types */
|
||||||
|
#define MAX_OF_TYPE(t) \
|
||||||
|
TYPE_UNSIGNED(t) ? UMAX_OF_SIZE(TYPE_LENGTH(t)) : MAX_OF_SIZE(TYPE_LENGTH(t))
|
||||||
|
|
||||||
|
#define MIN_OF_TYPE(t) \
|
||||||
|
TYPE_UNSIGNED(t) ? UMIN_OF_SIZE(TYPE_LENGTH(t)) : MIN_OF_SIZE(TYPE_LENGTH(t))
|
||||||
|
|
||||||
#endif /* symtab.h not already included. */
|
#endif /* symtab.h not already included. */
|
||||||
|
|
Loading…
Reference in New Issue