2004-01-26 Andrew Cagney <cagney@redhat.com>

* dwarf2loc.c (dwarf_expr_frame_base): Use SYMBOL_OPS instead of
	SYMBOL_LOCATION_FUNCS
	(dwarf2_loclist_funcs, dwarf2_locexpr_funcs): Change type to
	"struct symbol_ops".
	* dwarf2loc.h (dwarf2_locexpr_funcs, dwarf2_loclist_funcs): Change
	type to "struct symbol_ops".
	* symtab.h (struct symbol_ops): Rename "struct location_funcs".
	(struct symbol): Replace ".aux_value.loc.funcs" and
	".aux_value.loc.baton" with ".ops" and ".aux_value.ptr".
	(SYMBOL_OBJFILE): Delete macro.
	(SYMBOL_LOCATION_FUNCS): Delete macro.
	(SYMBOL_LOCATION_BATON): Update.
	* dwarf2read.c (dwarf2_symbol_mark_computed): Set SYMBOL_OPS
	intead of SYMBOL_LOCATION_FUNCS.
	* ax-gdb.c (gen_var_ref): Ditto.
	* printcmd.c (address_info): Ditto.
	* findvar.c (read_var_value): Ditto.
	(symbol_read_needs_frame): Ditto.
This commit is contained in:
Andrew Cagney 2004-01-26 20:36:32 +00:00
parent 838e70c548
commit a67af2b9de
8 changed files with 84 additions and 52 deletions

View file

@ -1,3 +1,24 @@
2004-01-26 Andrew Cagney <cagney@redhat.com>
* dwarf2loc.c (dwarf_expr_frame_base): Use SYMBOL_OPS instead of
SYMBOL_LOCATION_FUNCS
(dwarf2_loclist_funcs, dwarf2_locexpr_funcs): Change type to
"struct symbol_ops".
* dwarf2loc.h (dwarf2_locexpr_funcs, dwarf2_loclist_funcs): Change
type to "struct symbol_ops".
* symtab.h (struct symbol_ops): Rename "struct location_funcs".
(struct symbol): Replace ".aux_value.loc.funcs" and
".aux_value.loc.baton" with ".ops" and ".aux_value.ptr".
(SYMBOL_OBJFILE): Delete macro.
(SYMBOL_LOCATION_FUNCS): Delete macro.
(SYMBOL_LOCATION_BATON): Update.
* dwarf2read.c (dwarf2_symbol_mark_computed): Set SYMBOL_OPS
intead of SYMBOL_LOCATION_FUNCS.
* ax-gdb.c (gen_var_ref): Ditto.
* printcmd.c (address_info): Ditto.
* findvar.c (read_var_value): Ditto.
(symbol_read_needs_frame): Ditto.
2004-01-26 Andrew Cagney <cagney@redhat.com>
* dwarf2read.c (read_func_scope): Document frame-base hack.

View file

@ -620,7 +620,12 @@ gen_var_ref (struct agent_expr *ax, struct axs_value *value, struct symbol *var)
case LOC_COMPUTED:
case LOC_COMPUTED_ARG:
(*SYMBOL_LOCATION_FUNCS (var)->tracepoint_var_ref) (var, ax, value);
/* FIXME: cagney/2004-01-26: It should be possible to
unconditionally call the SYMBOL_OPS method when available.
Unfortunatly DWARF 2 stores the frame-base (instead of the
function) location in a function's symbol. Oops! For the
moment enable this when/where applicable. */
SYMBOL_OPS (var)->tracepoint_var_ref (var, ax, value);
break;
case LOC_OPTIMIZED_OUT:

View file

@ -154,7 +154,7 @@ dwarf_expr_frame_base (void *baton, unsigned char **start, size_t * length)
framefunc = get_frame_function (debaton->frame);
if (SYMBOL_LOCATION_FUNCS (framefunc) == &dwarf2_loclist_funcs)
if (SYMBOL_OPS (framefunc) == &dwarf2_loclist_funcs)
{
struct dwarf2_loclist_baton *symbaton;
symbaton = SYMBOL_LOCATION_BATON (framefunc);
@ -465,7 +465,7 @@ locexpr_tracepoint_var_ref (struct symbol * symbol, struct agent_expr * ax,
/* The set of location functions used with the DWARF-2 expression
evaluator. */
struct location_funcs dwarf2_locexpr_funcs = {
const struct symbol_ops dwarf2_locexpr_funcs = {
locexpr_read_variable,
locexpr_read_needs_frame,
locexpr_describe_location,
@ -537,7 +537,7 @@ loclist_tracepoint_var_ref (struct symbol * symbol, struct agent_expr * ax,
/* The set of location functions used with the DWARF-2 expression
evaluator and location lists. */
struct location_funcs dwarf2_loclist_funcs = {
const struct symbol_ops dwarf2_loclist_funcs = {
loclist_read_variable,
loclist_read_needs_frame,
loclist_describe_location,

View file

@ -21,6 +21,8 @@
#if !defined (DWARF2LOC_H)
#define DWARF2LOC_H
struct symbol_ops;
/* This header is private to the DWARF-2 reader. It is shared between
dwarf2read.c and dwarf2loc.c. */
@ -62,7 +64,7 @@ struct dwarf2_loclist_baton
struct objfile *objfile;
};
extern struct location_funcs dwarf2_locexpr_funcs;
extern struct location_funcs dwarf2_loclist_funcs;
extern const struct symbol_ops dwarf2_locexpr_funcs;
extern const struct symbol_ops dwarf2_loclist_funcs;
#endif

View file

@ -7974,7 +7974,7 @@ dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym,
complaint (&symfile_complaints,
"Location list used without specifying the CU base address.");
SYMBOL_LOCATION_FUNCS (sym) = &dwarf2_loclist_funcs;
SYMBOL_OPS (sym) = &dwarf2_loclist_funcs;
SYMBOL_LOCATION_BATON (sym) = baton;
}
else
@ -8003,7 +8003,7 @@ dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym,
baton->data = NULL;
}
SYMBOL_LOCATION_FUNCS (sym) = &dwarf2_locexpr_funcs;
SYMBOL_OPS (sym) = &dwarf2_locexpr_funcs;
SYMBOL_LOCATION_BATON (sym) = baton;
}
}

View file

@ -346,11 +346,12 @@ symbol_read_needs_frame (struct symbol *sym)
we failed to consider one. */
case LOC_COMPUTED:
case LOC_COMPUTED_ARG:
{
struct location_funcs *symfuncs = SYMBOL_LOCATION_FUNCS (sym);
return (symfuncs->read_needs_frame) (sym);
}
break;
/* FIXME: cagney/2004-01-26: It should be possible to
unconditionally call the SYMBOL_OPS method when available.
Unfortunatly DWARF 2 stores the frame-base (instead of the
function) location in a function's symbol. Oops! For the
moment enable this when/where applicable. */
return SYMBOL_OPS (sym)->read_needs_frame (sym);
case LOC_REGISTER:
case LOC_ARG:
@ -564,15 +565,14 @@ addresses have not been bound by the dynamic loader. Try again when executable i
case LOC_COMPUTED:
case LOC_COMPUTED_ARG:
{
struct location_funcs *funcs = SYMBOL_LOCATION_FUNCS (var);
if (frame == 0 && (funcs->read_needs_frame) (var))
return 0;
return (funcs->read_variable) (var, frame);
}
break;
/* FIXME: cagney/2004-01-26: It should be possible to
unconditionally call the SYMBOL_OPS method when available.
Unfortunatly DWARF 2 stores the frame-base (instead of the
function) location in a function's symbol. Oops! For the
moment enable this when/where applicable. */
if (frame == 0 && SYMBOL_OPS (var)->read_needs_frame (var))
return 0;
return SYMBOL_OPS (var)->read_variable (var, frame);
case LOC_UNRESOLVED:
{

View file

@ -1141,7 +1141,12 @@ address_info (char *exp, int from_tty)
case LOC_COMPUTED:
case LOC_COMPUTED_ARG:
(SYMBOL_LOCATION_FUNCS (sym)->describe_location) (sym, gdb_stdout);
/* FIXME: cagney/2004-01-26: It should be possible to
unconditionally call the SYMBOL_OPS method when available.
Unfortunatly DWARF 2 stores the frame-base (instead of the
function) location in a function's symbol. Oops! For the
moment enable this when/where applicable. */
SYMBOL_OPS (sym)->describe_location (sym, gdb_stdout);
break;
case LOC_REGISTER:

View file

@ -546,21 +546,12 @@ enum address_class
LOC_COMPUTED_ARG
};
/* A structure of function pointers describing the location of a
variable, structure member, or structure base class.
/* The methods needed to implement a symbol class. These methods can
use the symbol's .aux_value for additional per-symbol information.
These functions' BATON arguments are generic data pointers, holding
whatever data the functions need --- the code which provides this
structure also provides the actual contents of the baton, and
decides its form. However, there may be other rules about where
the baton data must be allocated; whoever is pointing to this
`struct location_funcs' object will know the rules. For example,
when a symbol S's location is LOC_COMPUTED, then
SYMBOL_LOCATION_FUNCS(S) is pointing to a location_funcs structure,
and SYMBOL_LOCATION_BATON(S) is the baton, which must be allocated
on the same obstack as the symbol itself. */
At present this is only used to implement location expressions. */
struct location_funcs
struct symbol_ops
{
/* Return the value of the variable SYMBOL, relative to the stack
@ -608,6 +599,12 @@ struct symbol
ENUM_BITFIELD(domain_enum_tag) domain : 6;
/* Address class */
/* NOTE: cagney/2003-11-02: The fields "aclass" and "ops" contain
overlapping information. By creating a per-aclass ops vector, or
using the aclass as an index into an ops table, the aclass and
ops fields can be merged. The latter, for instance, would shave
32-bits from each symbol (relative to a symbol lookup, any table
index overhead would be in the noise). */
ENUM_BITFIELD(address_class) aclass : 6;
@ -617,28 +614,30 @@ struct symbol
unsigned short line;
/* Some symbols require an additional value to be recorded on a per-
symbol basis. Stash those values here. */
/* Method's for symbol's of this class. */
/* NOTE: cagney/2003-11-02: See comment above attached to "aclass". */
const struct symbol_ops *ops;
/* Some symbols require additional information to be recorded on a
per- symbol basis. Stash those values here. */
union
{
/* Used by LOC_BASEREG and LOC_BASEREG_ARG. */
short basereg;
/* For a LOC_COMPUTED or LOC_COMPUTED_ARG symbol, this is the
baton and location_funcs structure to find its location. For a
LOC_BLOCK symbol for a function in a compilation unit compiled
with DWARF 2 information, this is information used internally
by the DWARF 2 code --- specifically, the location expression
for the frame base for this function. */
/* An arbitrary data pointer. Note that this data must be
allocated using the same obstack as the symbol itself. */
/* So far it is only used by LOC_COMPUTED and LOC_COMPUTED_ARG to
find the location location information. For a LOC_BLOCK symbol
for a function in a compilation unit compiled with DWARF 2
information, this is information used internally by the DWARF 2
code --- specifically, the location expression for the frame
base for this function. */
/* FIXME drow/2003-02-21: For the LOC_BLOCK case, it might be better
to add a magic symbol to the block containing this information,
or to have a generic debug info annotation slot for symbols. */
struct
{
void *baton;
struct location_funcs *funcs;
} loc;
void *ptr;
}
aux_value;
@ -652,8 +651,8 @@ 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_LOCATION_BATON(symbol) (symbol)->aux_value.loc.baton
#define SYMBOL_LOCATION_FUNCS(symbol) (symbol)->aux_value.loc.funcs
#define SYMBOL_OPS(symbol) (symbol)->ops
#define SYMBOL_LOCATION_BATON(symbol) (symbol)->aux_value.ptr
/* A partial_symbol records the name, domain, and address class of
symbols whose types we have not parsed yet. For functions, it also