summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog21
-rw-r--r--gdb/ax-gdb.c7
-rw-r--r--gdb/dwarf2loc.c6
-rw-r--r--gdb/dwarf2loc.h6
-rw-r--r--gdb/dwarf2read.c4
-rw-r--r--gdb/findvar.c28
-rw-r--r--gdb/printcmd.c7
-rw-r--r--gdb/symtab.h61
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