mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-02-09 10:42:48 +00:00
2003-11-04 Andrew Cagney <cagney@redhat.com>
* symtab.c (find_active_alias): Delete function. (lookup_block_symbol): Delete alias code. * stabsread.c (resolve_live_range): Delete function. (add_live_range): Delete function. (resolve_symbol_reference): Delete function. (define_symbol): Delete live range and alias code. (scan_file_globals): Delete alias code. * symtab.h (SYMBOL_RANGES): Delete macro. (struct range_list): Delete structure. (struct symbol): Delete field "ranges". (SYMBOL_ALIASES): Delete macro. (struct alias_list): Delete structure. (struct symbol): Delete field "aliases".
This commit is contained in:
parent
1083b3bca3
commit
507836c0f0
@ -1,3 +1,19 @@
|
||||
2003-11-04 Andrew Cagney <cagney@redhat.com>
|
||||
|
||||
* symtab.c (find_active_alias): Delete function.
|
||||
(lookup_block_symbol): Delete alias code.
|
||||
* stabsread.c (resolve_live_range): Delete function.
|
||||
(add_live_range): Delete function.
|
||||
(resolve_symbol_reference): Delete function.
|
||||
(define_symbol): Delete live range and alias code.
|
||||
(scan_file_globals): Delete alias code.
|
||||
* symtab.h (SYMBOL_RANGES): Delete macro.
|
||||
(struct range_list): Delete structure.
|
||||
(struct symbol): Delete field "ranges".
|
||||
(SYMBOL_ALIASES): Delete macro.
|
||||
(struct alias_list): Delete structure.
|
||||
(struct symbol): Delete field "aliases".
|
||||
|
||||
2003-11-04 Michael Snyder <msnyder@redhat.com>
|
||||
|
||||
* MAINTAINERS: Remove myself as owner of breakpoints and
|
||||
|
305
gdb/stabsread.c
305
gdb/stabsread.c
@ -156,18 +156,10 @@ read_cpp_abbrev (struct field_info *, char **, struct type *,
|
||||
|
||||
static char *find_name_end (char *name);
|
||||
|
||||
static void add_live_range (struct objfile *, struct symbol *, CORE_ADDR,
|
||||
CORE_ADDR);
|
||||
|
||||
static int resolve_live_range (struct objfile *, struct symbol *, char *);
|
||||
|
||||
static int process_reference (char **string);
|
||||
|
||||
static CORE_ADDR ref_search_value (int refnum);
|
||||
|
||||
static int resolve_symbol_reference (struct objfile *, struct symbol *,
|
||||
char *);
|
||||
|
||||
void stabsread_clear_cache (void);
|
||||
|
||||
static const char vptr_name[] = "_vptr$";
|
||||
@ -475,109 +467,6 @@ read_type_number (char **pp, int *typenums)
|
||||
#define VISIBILITY_PUBLIC '2' /* Stabs character for public field */
|
||||
#define VISIBILITY_IGNORE '9' /* Optimized out or zero length */
|
||||
|
||||
/* This routine fixes up symbol references/aliases to point to the original
|
||||
symbol definition. Returns 0 on failure, non-zero on success. */
|
||||
|
||||
static int
|
||||
resolve_symbol_reference (struct objfile *objfile, struct symbol *sym, char *p)
|
||||
{
|
||||
int refnum;
|
||||
struct symbol *ref_sym = 0;
|
||||
struct alias_list *alias;
|
||||
|
||||
/* If this is not a symbol reference return now. */
|
||||
if (*p != '#')
|
||||
return 0;
|
||||
|
||||
/* Use "#<num>" as the name; we'll fix the name later.
|
||||
We stored the original symbol name as "#<id>=<name>"
|
||||
so we can now search for "#<id>" to resolving the reference.
|
||||
We'll fix the names later by removing the "#<id>" or "#<id>=" */
|
||||
|
||||
/*---------------------------------------------------------*/
|
||||
/* Get the reference id number, and
|
||||
advance p past the names so we can parse the rest.
|
||||
eg: id=2 for p : "2=", "2=z:r(0,1)" "2:r(0,1);l(#5,#6),l(#7,#4)" */
|
||||
/*---------------------------------------------------------*/
|
||||
|
||||
/* This gets reference name from string. sym may not have a name. */
|
||||
|
||||
/* Get the reference number associated with the reference id in the
|
||||
gdb stab string. From that reference number, get the main/primary
|
||||
symbol for this alias. */
|
||||
refnum = process_reference (&p);
|
||||
ref_sym = ref_search (refnum);
|
||||
if (!ref_sym)
|
||||
{
|
||||
lrs_general_complaint ("symbol for reference not found");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Parse the stab of the referencing symbol
|
||||
now that we have the referenced symbol.
|
||||
Add it as a new symbol and a link back to the referenced symbol.
|
||||
eg: p : "=", "=z:r(0,1)" ":r(0,1);l(#5,#6),l(#7,#4)" */
|
||||
|
||||
|
||||
/* If the stab symbol table and string contain:
|
||||
RSYM 0 5 00000000 868 #15=z:r(0,1)
|
||||
LBRAC 0 0 00000000 899 #5=
|
||||
SLINE 0 16 00000003 923 #6=
|
||||
Then the same symbols can be later referenced by:
|
||||
RSYM 0 5 00000000 927 #15:r(0,1);l(#5,#6)
|
||||
This is used in live range splitting to:
|
||||
1) specify that a symbol (#15) is actually just a new storage
|
||||
class for a symbol (#15=z) which was previously defined.
|
||||
2) specify that the beginning and ending ranges for a symbol
|
||||
(#15) are the values of the beginning (#5) and ending (#6)
|
||||
symbols. */
|
||||
|
||||
/* Read number as reference id.
|
||||
eg: p : "=", "=z:r(0,1)" ":r(0,1);l(#5,#6),l(#7,#4)" */
|
||||
/* FIXME! Might I want to use SYMBOL_CLASS (sym) = LOC_OPTIMIZED_OUT;
|
||||
in case of "l(0,0)"? */
|
||||
|
||||
/*--------------------------------------------------*/
|
||||
/* Add this symbol to the reference list. */
|
||||
/*--------------------------------------------------*/
|
||||
|
||||
alias = (struct alias_list *) obstack_alloc (&objfile->type_obstack,
|
||||
sizeof (struct alias_list));
|
||||
if (!alias)
|
||||
{
|
||||
lrs_general_complaint ("Unable to allocate alias list memory");
|
||||
return 0;
|
||||
}
|
||||
|
||||
alias->next = 0;
|
||||
alias->sym = sym;
|
||||
|
||||
if (!SYMBOL_ALIASES (ref_sym))
|
||||
{
|
||||
SYMBOL_ALIASES (ref_sym) = alias;
|
||||
}
|
||||
else
|
||||
{
|
||||
struct alias_list *temp;
|
||||
|
||||
/* Get to the end of the list. */
|
||||
for (temp = SYMBOL_ALIASES (ref_sym);
|
||||
temp->next;
|
||||
temp = temp->next)
|
||||
;
|
||||
temp->next = alias;
|
||||
}
|
||||
|
||||
/* Want to fix up name so that other functions (eg. valops)
|
||||
will correctly print the name.
|
||||
Don't add_symbol_to_list so that lookup_symbol won't find it.
|
||||
nope... needed for fixups. */
|
||||
DEPRECATED_SYMBOL_NAME (sym) = DEPRECATED_SYMBOL_NAME (ref_sym);
|
||||
|
||||
/* Done! */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Structure for storing pointers to reference definitions for fast lookup
|
||||
during "process_later". */
|
||||
|
||||
@ -804,41 +693,6 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
|
||||
goto normal; /* Do *something* with it */
|
||||
}
|
||||
}
|
||||
else if (string[0] == '#')
|
||||
{
|
||||
/* Special GNU C extension for referencing symbols. */
|
||||
char *s;
|
||||
int refnum, nlen;
|
||||
|
||||
/* If STRING defines a new reference id, then add it to the
|
||||
reference map. Else it must be referring to a previously
|
||||
defined symbol, so add it to the alias list of the previously
|
||||
defined symbol. */
|
||||
s = string;
|
||||
refnum = symbol_reference_defined (&s);
|
||||
if (refnum >= 0)
|
||||
ref_add (refnum, sym, string, SYMBOL_VALUE (sym));
|
||||
else if (!resolve_symbol_reference (objfile, sym, string))
|
||||
return NULL;
|
||||
|
||||
/* S..P contains the name of the symbol. We need to store
|
||||
the correct name into DEPRECATED_SYMBOL_NAME. */
|
||||
nlen = p - s;
|
||||
if (refnum >= 0)
|
||||
{
|
||||
if (nlen > 0)
|
||||
SYMBOL_SET_NAMES (sym, s, nlen, objfile);
|
||||
else
|
||||
/* FIXME! Want DEPRECATED_SYMBOL_NAME (sym) = 0;
|
||||
Get error if leave name 0. So give it something. */
|
||||
{
|
||||
nlen = p - string;
|
||||
SYMBOL_SET_NAMES (sym, string, nlen, objfile);
|
||||
}
|
||||
}
|
||||
/* Advance STRING beyond the reference id. */
|
||||
string = s;
|
||||
}
|
||||
else
|
||||
{
|
||||
normal:
|
||||
@ -1521,136 +1375,9 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
|
||||
SYMBOL_CLASS (sym) = LOC_REF_ARG;
|
||||
}
|
||||
|
||||
/* Is there more to parse? For example LRS/alias information? */
|
||||
while (*p && *p == ';')
|
||||
{
|
||||
p++;
|
||||
if (*p && p[0] == 'l' && p[1] == '(')
|
||||
{
|
||||
/* GNU extensions for live range splitting may be appended to
|
||||
the end of the stab string. eg. "l(#1,#2);l(#3,#5)" */
|
||||
|
||||
/* Resolve the live range and add it to SYM's live range list. */
|
||||
if (!resolve_live_range (objfile, sym, p))
|
||||
return NULL;
|
||||
|
||||
/* Find end of live range info. */
|
||||
p = strchr (p, ')');
|
||||
if (!*p || *p != ')')
|
||||
{
|
||||
lrs_general_complaint ("live range format not recognized");
|
||||
return NULL;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
}
|
||||
return sym;
|
||||
}
|
||||
|
||||
/* Add the live range found in P to the symbol SYM in objfile OBJFILE. Returns
|
||||
non-zero on success, zero otherwise. */
|
||||
|
||||
static int
|
||||
resolve_live_range (struct objfile *objfile, struct symbol *sym, char *p)
|
||||
{
|
||||
int refnum;
|
||||
CORE_ADDR start, end;
|
||||
|
||||
/* Sanity check the beginning of the stabs string. */
|
||||
if (!*p || *p != 'l')
|
||||
{
|
||||
lrs_general_complaint ("live range string 1");
|
||||
return 0;
|
||||
}
|
||||
p++;
|
||||
|
||||
if (!*p || *p != '(')
|
||||
{
|
||||
lrs_general_complaint ("live range string 2");
|
||||
return 0;
|
||||
}
|
||||
p++;
|
||||
|
||||
/* Get starting value of range and advance P past the reference id.
|
||||
|
||||
?!? In theory, the process_reference should never fail, but we should
|
||||
catch that case just in case the compiler scrogged the stabs. */
|
||||
refnum = process_reference (&p);
|
||||
start = ref_search_value (refnum);
|
||||
if (!start)
|
||||
{
|
||||
lrs_general_complaint ("Live range symbol not found 1");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!*p || *p != ',')
|
||||
{
|
||||
lrs_general_complaint ("live range string 3");
|
||||
return 0;
|
||||
}
|
||||
p++;
|
||||
|
||||
/* Get ending value of range and advance P past the reference id.
|
||||
|
||||
?!? In theory, the process_reference should never fail, but we should
|
||||
catch that case just in case the compiler scrogged the stabs. */
|
||||
refnum = process_reference (&p);
|
||||
end = ref_search_value (refnum);
|
||||
if (!end)
|
||||
{
|
||||
lrs_general_complaint ("Live range symbol not found 2");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!*p || *p != ')')
|
||||
{
|
||||
lrs_general_complaint ("live range string 4");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Now that we know the bounds of the range, add it to the
|
||||
symbol. */
|
||||
add_live_range (objfile, sym, start, end);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Add a new live range defined by START and END to the symbol SYM
|
||||
in objfile OBJFILE. */
|
||||
|
||||
static void
|
||||
add_live_range (struct objfile *objfile, struct symbol *sym, CORE_ADDR start,
|
||||
CORE_ADDR end)
|
||||
{
|
||||
struct range_list *r, *rs;
|
||||
|
||||
if (start >= end)
|
||||
{
|
||||
lrs_general_complaint ("end of live range follows start");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Alloc new live range structure. */
|
||||
r = (struct range_list *)
|
||||
obstack_alloc (&objfile->type_obstack,
|
||||
sizeof (struct range_list));
|
||||
r->start = start;
|
||||
r->end = end;
|
||||
r->next = 0;
|
||||
|
||||
/* Append this range to the symbol's range list. */
|
||||
if (!SYMBOL_RANGES (sym))
|
||||
SYMBOL_RANGES (sym) = r;
|
||||
else
|
||||
{
|
||||
/* Get the last range for the symbol. */
|
||||
for (rs = SYMBOL_RANGES (sym); rs->next; rs = rs->next)
|
||||
;
|
||||
rs->next = r;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Skip rest of this symbol and return an error type.
|
||||
|
||||
General notes on error recovery: error_type always skips to the
|
||||
@ -4510,7 +4237,7 @@ scan_file_globals (struct objfile *objfile)
|
||||
{
|
||||
int hash;
|
||||
struct minimal_symbol *msymbol;
|
||||
struct symbol *sym, *prev, *rsym;
|
||||
struct symbol *sym, *prev;
|
||||
struct objfile *resolve_objfile;
|
||||
|
||||
/* SVR4 based linkers copy referenced global symbols from shared
|
||||
@ -4564,9 +4291,6 @@ scan_file_globals (struct objfile *objfile)
|
||||
if (DEPRECATED_SYMBOL_NAME (msymbol)[0] == DEPRECATED_SYMBOL_NAME (sym)[0] &&
|
||||
STREQ (DEPRECATED_SYMBOL_NAME (msymbol) + 1, DEPRECATED_SYMBOL_NAME (sym) + 1))
|
||||
{
|
||||
|
||||
struct alias_list *aliases;
|
||||
|
||||
/* Splice this symbol out of the hash chain and
|
||||
assign the value we have to it. */
|
||||
if (prev)
|
||||
@ -4581,38 +4305,21 @@ scan_file_globals (struct objfile *objfile)
|
||||
/* Check to see whether we need to fix up a common block. */
|
||||
/* Note: this code might be executed several times for
|
||||
the same symbol if there are multiple references. */
|
||||
|
||||
/* If symbol has aliases, do minimal symbol fixups for each.
|
||||
These live aliases/references weren't added to
|
||||
global_sym_chain hash but may also need to be fixed up. */
|
||||
/* FIXME: Maybe should have added aliases to the global chain, resolved symbol name, then treated aliases as normal
|
||||
symbols? Still, we wouldn't want to add_to_list. */
|
||||
/* Now do the same for each alias of this symbol */
|
||||
rsym = sym;
|
||||
aliases = SYMBOL_ALIASES (sym);
|
||||
while (rsym)
|
||||
if (sym)
|
||||
{
|
||||
if (SYMBOL_CLASS (rsym) == LOC_BLOCK)
|
||||
if (SYMBOL_CLASS (sym) == LOC_BLOCK)
|
||||
{
|
||||
fix_common_block (rsym,
|
||||
fix_common_block (sym,
|
||||
SYMBOL_VALUE_ADDRESS (msymbol));
|
||||
}
|
||||
else
|
||||
{
|
||||
SYMBOL_VALUE_ADDRESS (rsym)
|
||||
SYMBOL_VALUE_ADDRESS (sym)
|
||||
= SYMBOL_VALUE_ADDRESS (msymbol);
|
||||
}
|
||||
SYMBOL_SECTION (rsym) = SYMBOL_SECTION (msymbol);
|
||||
if (aliases)
|
||||
{
|
||||
rsym = aliases->sym;
|
||||
aliases = aliases->next;
|
||||
}
|
||||
else
|
||||
rsym = NULL;
|
||||
SYMBOL_SECTION (sym) = SYMBOL_SECTION (msymbol);
|
||||
}
|
||||
|
||||
|
||||
if (prev)
|
||||
{
|
||||
sym = SYMBOL_VALUE_CHAIN (prev);
|
||||
|
57
gdb/symtab.c
57
gdb/symtab.c
@ -114,8 +114,6 @@ struct symbol *lookup_symbol_aux_minsyms (const char *name,
|
||||
struct symtab **symtab);
|
||||
#endif
|
||||
|
||||
static struct symbol *find_active_alias (struct symbol *sym, CORE_ADDR addr);
|
||||
|
||||
/* This flag is used in hppa-tdep.c, and set in hp-symtab-read.c */
|
||||
/* Signals the presence of objects compiled by HP compilers */
|
||||
int hp_som_som_object_present = 0;
|
||||
@ -1668,29 +1666,6 @@ lookup_block_symbol (const struct block *block, const char *name,
|
||||
&& (linkage_name != NULL
|
||||
? strcmp (SYMBOL_LINKAGE_NAME (sym), linkage_name) == 0 : 1))
|
||||
{
|
||||
/* If SYM has aliases, then use any alias that is active
|
||||
at the current PC. If no alias is active at the current
|
||||
PC, then use the main symbol.
|
||||
|
||||
?!? Is checking the current pc correct? Is this routine
|
||||
ever called to look up a symbol from another context?
|
||||
|
||||
FIXME: No, it's not correct. If someone sets a
|
||||
conditional breakpoint at an address, then the
|
||||
breakpoint's `struct expression' should refer to the
|
||||
`struct symbol' appropriate for the breakpoint's
|
||||
address, which may not be the PC.
|
||||
|
||||
Even if it were never called from another context,
|
||||
it's totally bizarre for lookup_symbol's behavior to
|
||||
depend on the value of the inferior's current PC. We
|
||||
should pass in the appropriate PC as well as the
|
||||
block. The interface to lookup_symbol should change
|
||||
to require the caller to provide a PC. */
|
||||
|
||||
if (SYMBOL_ALIASES (sym))
|
||||
sym = find_active_alias (sym, read_pc ());
|
||||
|
||||
sym_found = sym;
|
||||
if (SYMBOL_CLASS (sym) != LOC_ARG &&
|
||||
SYMBOL_CLASS (sym) != LOC_LOCAL_ARG &&
|
||||
@ -1708,38 +1683,6 @@ lookup_block_symbol (const struct block *block, const char *name,
|
||||
}
|
||||
}
|
||||
|
||||
/* Given a main symbol SYM and ADDR, search through the alias
|
||||
list to determine if an alias is active at ADDR and return
|
||||
the active alias.
|
||||
|
||||
If no alias is active, then return SYM. */
|
||||
|
||||
static struct symbol *
|
||||
find_active_alias (struct symbol *sym, CORE_ADDR addr)
|
||||
{
|
||||
struct range_list *r;
|
||||
struct alias_list *aliases;
|
||||
|
||||
/* If we have aliases, check them first. */
|
||||
aliases = SYMBOL_ALIASES (sym);
|
||||
|
||||
while (aliases)
|
||||
{
|
||||
if (!SYMBOL_RANGES (aliases->sym))
|
||||
return aliases->sym;
|
||||
for (r = SYMBOL_RANGES (aliases->sym); r; r = r->next)
|
||||
{
|
||||
if (r->start <= addr && r->end > addr)
|
||||
return aliases->sym;
|
||||
}
|
||||
aliases = aliases->next;
|
||||
}
|
||||
|
||||
/* Nothing found, return the main symbol. */
|
||||
return sym;
|
||||
}
|
||||
|
||||
|
||||
/* Find the symtab associated with PC and SECTION. Look through the
|
||||
psymtabs and read in another symtab if necessary. */
|
||||
|
||||
|
27
gdb/symtab.h
27
gdb/symtab.h
@ -583,22 +583,6 @@ struct location_funcs
|
||||
struct axs_value * value);
|
||||
};
|
||||
|
||||
/* Linked list of symbol's live ranges. */
|
||||
|
||||
struct range_list
|
||||
{
|
||||
CORE_ADDR start;
|
||||
CORE_ADDR end;
|
||||
struct range_list *next;
|
||||
};
|
||||
|
||||
/* Linked list of aliases for a particular main/primary symbol. */
|
||||
struct alias_list
|
||||
{
|
||||
struct symbol *sym;
|
||||
struct alias_list *next;
|
||||
};
|
||||
|
||||
/* This structure is space critical. See space comments at the top. */
|
||||
|
||||
struct symbol
|
||||
@ -651,15 +635,6 @@ struct symbol
|
||||
}
|
||||
aux_value;
|
||||
|
||||
|
||||
/* Link to a list of aliases for this symbol.
|
||||
Only a "primary/main symbol may have aliases. */
|
||||
struct alias_list *aliases;
|
||||
|
||||
/* List of ranges where this symbol is active. This is only
|
||||
used by alias symbols at the current time. */
|
||||
struct range_list *ranges;
|
||||
|
||||
struct symbol *hash_next;
|
||||
};
|
||||
|
||||
@ -670,8 +645,6 @@ struct symbol
|
||||
#define SYMBOL_LINE(symbol) (symbol)->line
|
||||
#define SYMBOL_BASEREG(symbol) (symbol)->aux_value.basereg
|
||||
#define SYMBOL_OBJFILE(symbol) (symbol)->aux_value.objfile
|
||||
#define SYMBOL_ALIASES(symbol) (symbol)->aliases
|
||||
#define SYMBOL_RANGES(symbol) (symbol)->ranges
|
||||
#define SYMBOL_LOCATION_BATON(symbol) (symbol)->aux_value.loc.baton
|
||||
#define SYMBOL_LOCATION_FUNCS(symbol) (symbol)->aux_value.loc.funcs
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user