diff options
-rw-r--r-- | gdb/ChangeLog | 21 | ||||
-rw-r--r-- | gdb/ax-gdb.c | 7 | ||||
-rw-r--r-- | gdb/dwarf2loc.c | 6 | ||||
-rw-r--r-- | gdb/dwarf2loc.h | 6 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 4 | ||||
-rw-r--r-- | gdb/findvar.c | 28 | ||||
-rw-r--r-- | gdb/printcmd.c | 7 | ||||
-rw-r--r-- | gdb/symtab.h | 61 |
8 files changed, 86 insertions, 54 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 296dbc0f01c..00ac4917420 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,26 @@ 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. 2004-01-25 Mark Kettenis <kettenis@gnu.org> diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c index cacf308f5fd..d828895bf72 100644 --- a/gdb/ax-gdb.c +++ b/gdb/ax-gdb.c @@ -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: diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index fac5c4ac1a1..ef333f7e770 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -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, diff --git a/gdb/dwarf2loc.h b/gdb/dwarf2loc.h index 321cb037528..ce0a8ef0bed 100644 --- a/gdb/dwarf2loc.h +++ b/gdb/dwarf2loc.h @@ -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 diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 3acbc583a30..d47f93ae824 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -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; } } diff --git a/gdb/findvar.c b/gdb/findvar.c index 34b4a5b50e6..397a56fd7c1 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -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: { diff --git a/gdb/printcmd.c b/gdb/printcmd.c index 0502cf1cb24..dba7bdd1b7f 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -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: diff --git a/gdb/symtab.h b/gdb/symtab.h index 95813bdd3ef..c56c05366d3 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -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. - - 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. */ - -struct location_funcs +/* The methods needed to implement a symbol class. These methods can + use the symbol's .aux_value for additional per-symbol information. + + At present this is only used to implement location expressions. */ + +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 |