forked from Imagelibrary/binutils-gdb
* configure.in: Check for working mmap, ansi headers, string.h,
strings.h, and memory.h. * configure: Regenerated. * gdb_stat.h: New file, "portable" <sys/stat.h>. * gdb_string.h: New file, "portable" <string.h>. * altos-xdep.c, arm-tdep.c, arm-xdep.c, convex-tdep.c, convex-xdep.c, coredep.c, cxux-nat.c, dbxread.c, exec.c, gould-xdep.c, hppa-tdep.c, i386aix-nat.c, i386b-nat.c, i386mach-nat.c, i386v-nat.c, infptrace.c, m88k-nat.c, main.c, mdebugread.c, objfiles.c, os9kread.c, procfs.c, pyr-xdep.c, rs6000-nat.c, source.c, standalone.c, stuff.c, sun386-nat.c, symfile.c, symm-nat.c, symm-tdep.c, symtab.c, top.c, ultra3-nat.c, ultra3-xdep.c, umax-xdep.c, xcoffread.c: Include "gdb_stat.h" instead of <sys/stat.h>. * alpha-tdep.c, breakpoint.c, buildsym.c, c-typeprint.c, ch-typeprint.c, coffread.c, command.c, core-sol2.c, core-svr4.c, core.c, corelow.c, cp-valprint.c, dbxread.c, dcache.c, demangle.c, dpx2-nat.c, dstread.c, dwarfread.c, elfread.c, environ.c, eval.c, exec.c, f-lang.c, f-typeprint.c, f-valprint.c, findvar.c, fork-child.c, gdbtypes.c, hpread.c, i386-tdep.c, infcmd.c, inflow.c, infptrace.c, infrun.c, irix5-nat.c, language.c, m2-typeprint.c, main.c, mdebugread.c, minsyms.c, mipsread.c, monitor.c, nlmread.c, objfiles.c, os9kread.c, osfsolib.c, parse.c, printcmd.c, procfs.c, regex.c, remote-adapt.c, remote-arc.c, remote-array.c, remote-bug.c, remote-e7000.c, remote-eb.c, remote-es.c, remote-hms.c, remote-mm.c, remote-os9k.c, remote-pa.c, remote-sim.c, remote-st.c, remote-udi.c, remote-utils.c, remote-vx.c, remote-vx29k.c, remote-vx68.c, remote-vx960.c, remote-vxmips.c, remote-vxsparc.c, remote.c, solib.c, somread.c, source.c, stabsread.c, stack.c, symfile.c, symmisc.c, symtab.c, target.c, top.c, typeprint.c, utils.c, valarith.c, valops.c, valprint.c, values.c, xcoffread.c: Include "gdb_string.h" instead of <string.h>. * gdbtk.c: Likewise. * config/xm-sysv4.h, i386/xm-ptx.h, m68k/xm-sun3os4.h, sparc/xm-sun4os4.h (HAVE_MMAP): Removed. * config/xm-lynx.h, config/i386/xm-ptx.h, config/m68k/nm-apollo68b.h, config/m68k/xm-hp300hpux.h, config/mips/xm-irix3.h, config/mips/xm-mips.h, config/mips/xm-news-mips.h, config/mips/xm-riscos.h, config/pa/hppah.h, config/rs6000/xm-rs6000.h, config/sparc/xm-sun4os4.h, config/sparc/xm-sun4sol2.h, config/vax/xm-vaxbsd.h, config/vax/xm-vaxult.h, config/vax/xm-vaxult2.h (MEM_FNS_DECLARED): Removed. * config/mips/xm-irix3.h, config/mips/xm-mips.h, config/pa/xm-hppah.h (memcpy, memset): Removed declarations.
This commit is contained in:
174
gdb/symtab.c
174
gdb/symtab.c
@@ -38,8 +38,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include "gdb_string.h"
|
||||
#include "gdb_stat.h"
|
||||
#include <ctype.h>
|
||||
|
||||
/* Prototypes for local functions */
|
||||
@@ -585,7 +585,7 @@ found:
|
||||
|
||||
if (namespace == VAR_NAMESPACE)
|
||||
{
|
||||
msymbol = lookup_minimal_symbol (name, (struct objfile *) NULL);
|
||||
msymbol = lookup_minimal_symbol (name, NULL, NULL);
|
||||
if (msymbol != NULL)
|
||||
{
|
||||
s = find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol));
|
||||
@@ -686,42 +686,6 @@ found:
|
||||
}
|
||||
}
|
||||
|
||||
/* Now search all per-file blocks for static mangled symbols.
|
||||
Do the symtabs first, then check the psymtabs. */
|
||||
|
||||
if (namespace == VAR_NAMESPACE)
|
||||
{
|
||||
ALL_SYMTABS (objfile, s)
|
||||
{
|
||||
bv = BLOCKVECTOR (s);
|
||||
block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
|
||||
sym = lookup_block_symbol (block, name, VAR_NAMESPACE);
|
||||
if (sym)
|
||||
{
|
||||
block_found = block;
|
||||
if (symtab != NULL)
|
||||
*symtab = s;
|
||||
return sym;
|
||||
}
|
||||
}
|
||||
|
||||
ALL_PSYMTABS (objfile, ps)
|
||||
{
|
||||
if (!ps->readin && lookup_partial_symbol (ps, name, 0, VAR_NAMESPACE))
|
||||
{
|
||||
s = PSYMTAB_TO_SYMTAB(ps);
|
||||
bv = BLOCKVECTOR (s);
|
||||
block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
|
||||
sym = lookup_block_symbol (block, name, VAR_NAMESPACE);
|
||||
if (!sym)
|
||||
error ("Internal: mangled static symbol `%s' found in %s psymtab but not in symtab", name, ps->filename);
|
||||
if (symtab != NULL)
|
||||
*symtab = s;
|
||||
return sym;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (symtab != NULL)
|
||||
*symtab = NULL;
|
||||
return 0;
|
||||
@@ -1282,6 +1246,10 @@ find_pc_line (pc, notcurrent)
|
||||
{
|
||||
val.symtab = alt_symtab;
|
||||
val.line = alt->line - 1;
|
||||
|
||||
/* Don't return line 0, that means that we didn't find the line. */
|
||||
if (val.line == 0) ++val.line;
|
||||
|
||||
val.pc = BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK));
|
||||
val.end = alt->pc;
|
||||
}
|
||||
@@ -1652,14 +1620,35 @@ operator_chars (p, end)
|
||||
return *end;
|
||||
}
|
||||
|
||||
/* Return the number of methods described for TYPE, including the
|
||||
methods from types it derives from. This can't be done in the symbol
|
||||
reader because the type of the baseclass might still be stubbed
|
||||
when the definition of the derived class is parsed. */
|
||||
|
||||
static int total_number_of_methods PARAMS ((struct type *type));
|
||||
|
||||
static int
|
||||
total_number_of_methods (type)
|
||||
struct type *type;
|
||||
{
|
||||
int n;
|
||||
int count;
|
||||
|
||||
check_stub_type (type);
|
||||
count = TYPE_NFN_FIELDS_TOTAL (type);
|
||||
|
||||
for (n = 0; n < TYPE_N_BASECLASSES (type); n++)
|
||||
count += total_number_of_methods (TYPE_BASECLASS (type, n));
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/* Recursive helper function for decode_line_1.
|
||||
* Look for methods named NAME in type T.
|
||||
* Return number of matches.
|
||||
* Put matches in SYM_ARR (which better be big enough!).
|
||||
* These allocations seem to define "big enough":
|
||||
* sym_arr = (struct symbol **) alloca(TYPE_NFN_FIELDS_TOTAL (t) * sizeof(struct symbol*));
|
||||
* Note that this function is g++ specific.
|
||||
*/
|
||||
Look for methods named NAME in type T.
|
||||
Return number of matches.
|
||||
Put matches in SYM_ARR, which should have been allocated with
|
||||
a size of total_number_of_methods (T) * sizeof (struct symbol *).
|
||||
Note that this function is g++ specific. */
|
||||
|
||||
int
|
||||
find_methods (t, name, sym_arr)
|
||||
@@ -2020,7 +2009,8 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical)
|
||||
sym = 0;
|
||||
i1 = 0; /* counter for the symbol array */
|
||||
t = SYMBOL_TYPE (sym_class);
|
||||
sym_arr = (struct symbol **) alloca(TYPE_NFN_FIELDS_TOTAL (t) * sizeof(struct symbol*));
|
||||
sym_arr = (struct symbol **) alloca(total_number_of_methods (t)
|
||||
* sizeof(struct symbol *));
|
||||
|
||||
/* Cfront objects don't have fieldlists. */
|
||||
if (destructor_name_p (copy, t) && TYPE_FN_FIELDLISTS (t) != NULL)
|
||||
@@ -2200,7 +2190,9 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical)
|
||||
/* Arg token is not digits => try it as a variable name
|
||||
Find the next token (everything up to end or next whitespace). */
|
||||
|
||||
if (is_quoted)
|
||||
if (**argptr == '$') /* Convenience variable */
|
||||
p = skip_quoted (*argptr + 1);
|
||||
else if (is_quoted)
|
||||
{
|
||||
p = skip_quoted (*argptr);
|
||||
if (p[-1] != '\'')
|
||||
@@ -2228,6 +2220,32 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical)
|
||||
while (*p == ' ' || *p == '\t') p++;
|
||||
*argptr = p;
|
||||
|
||||
/* See if it's a convenience variable */
|
||||
|
||||
if (*copy == '$')
|
||||
{
|
||||
value_ptr valx;
|
||||
int need_canonical = (s == 0) ? 1 : 0;
|
||||
|
||||
valx = value_of_internalvar (lookup_internalvar (copy + 1));
|
||||
if (TYPE_CODE (VALUE_TYPE (valx)) != TYPE_CODE_INT)
|
||||
error ("Convenience variables used in line specs must have integer values.");
|
||||
|
||||
val.symtab = s ? s : default_symtab;
|
||||
val.line = value_as_long (valx);
|
||||
val.pc = 0;
|
||||
|
||||
values.sals = (struct symtab_and_line *)xmalloc (sizeof val);
|
||||
values.sals[0] = val;
|
||||
values.nelts = 1;
|
||||
|
||||
if (need_canonical)
|
||||
build_canonical_line_spec (values.sals, NULL, canonical);
|
||||
|
||||
return values;
|
||||
}
|
||||
|
||||
|
||||
/* Look up that token as a variable.
|
||||
If file specified, use that file's per-file block to start with. */
|
||||
|
||||
@@ -2285,7 +2303,7 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line, canonical)
|
||||
}
|
||||
}
|
||||
|
||||
msymbol = lookup_minimal_symbol (copy, (struct objfile *) NULL);
|
||||
msymbol = lookup_minimal_symbol (copy, NULL, NULL);
|
||||
if (msymbol != NULL)
|
||||
{
|
||||
val.symtab = 0;
|
||||
@@ -3004,6 +3022,19 @@ completion_list_add_name (symname, sym_text, sym_text_len, text, word)
|
||||
strcat (new, symname);
|
||||
}
|
||||
|
||||
/* Recheck for duplicates if we intend to add a modified symbol. */
|
||||
if (word != sym_text)
|
||||
{
|
||||
for (i = 0; i < return_val_index; ++i)
|
||||
{
|
||||
if (STREQ (new, return_val[i]))
|
||||
{
|
||||
free (new);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (return_val_index + 3 > return_val_size)
|
||||
{
|
||||
newsize = (return_val_size *= 2) * sizeof (char *);
|
||||
@@ -3202,51 +3233,6 @@ make_symbol_completion_list (text, word)
|
||||
return (return_val);
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
/* Add the type of the symbol sym to the type of the current
|
||||
function whose block we are in (assumed). The type of
|
||||
this current function is contained in *TYPE.
|
||||
|
||||
This basically works as follows: When we find a function
|
||||
symbol (N_FUNC with a 'f' or 'F' in the symbol name), we record
|
||||
a pointer to its type in the global in_function_type. Every
|
||||
time we come across a parameter symbol ('p' in its name), then
|
||||
this procedure adds the name and type of that parameter
|
||||
to the function type pointed to by *TYPE. (Which should correspond
|
||||
to in_function_type if it was called correctly).
|
||||
|
||||
Note that since we are modifying a type, the result of
|
||||
lookup_function_type() should be memcpy()ed before calling
|
||||
this. When not in strict typing mode, the expression
|
||||
evaluator can choose to ignore this.
|
||||
|
||||
Assumption: All of a function's parameter symbols will
|
||||
appear before another function symbol is found. The parameters
|
||||
appear in the same order in the argument list as they do in the
|
||||
symbol table. */
|
||||
|
||||
void
|
||||
add_param_to_type (type,sym)
|
||||
struct type **type;
|
||||
struct symbol *sym;
|
||||
{
|
||||
int num = ++(TYPE_NFIELDS(*type));
|
||||
|
||||
if(TYPE_NFIELDS(*type)-1)
|
||||
TYPE_FIELDS(*type) = (struct field *)
|
||||
(*current_objfile->xrealloc) ((char *)(TYPE_FIELDS(*type)),
|
||||
num*sizeof(struct field));
|
||||
else
|
||||
TYPE_FIELDS(*type) = (struct field *)
|
||||
(*current_objfile->xmalloc) (num*sizeof(struct field));
|
||||
|
||||
TYPE_FIELD_BITPOS(*type,num-1) = num-1;
|
||||
TYPE_FIELD_BITSIZE(*type,num-1) = 0;
|
||||
TYPE_FIELD_TYPE(*type,num-1) = SYMBOL_TYPE(sym);
|
||||
TYPE_FIELD_NAME(*type,num-1) = SYMBOL_NAME(sym);
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
_initialize_symtab ()
|
||||
|
||||
Reference in New Issue
Block a user