From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17264 invoked by alias); 26 Jan 2004 20:35:48 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 17203 invoked from network); 26 Jan 2004 20:35:46 -0000 Received: from unknown (HELO localhost.redhat.com) (66.30.197.194) by sources.redhat.com with SMTP; 26 Jan 2004 20:35:46 -0000 Received: from gnu.org (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id D42DD2B8F; Mon, 26 Jan 2004 15:35:44 -0500 (EST) Message-ID: <40157A20.90601@gnu.org> Date: Mon, 26 Jan 2004 20:35:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-US; rv:1.0.2) Gecko/20030820 MIME-Version: 1.0 To: Elena Zannoni Cc: Andrew Cagney , gdb-patches@sources.redhat.com Subject: Re: [rfa:symtab] SYMBOL_LOCATION_FUNCS -> SYMBOL_OPS References: <3FAD53AD.4030003@gnu.org> <3FB91365.8050809@redhat.com> <16401.16897.417048.555558@localhost.redhat.com> Content-Type: multipart/mixed; boundary="------------060702070803000302090603" X-SW-Source: 2004-01/txt/msg00672.txt.bz2 This is a multi-part message in MIME format. --------------060702070803000302090603 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 392 > Ok. > > elena FYI, I've so far committed the attached. Per my other post: http://sources.redhat.com/ml/gdb-patches/2004-01/msg00671.html I stumbled across a really horrible hack where by the function's symbol was being used to store the function's frame-base's location expression :-(. That immediatly stops the symbol_ops being called unconditionally when available, sigh. Andrew --------------060702070803000302090603 Content-Type: text/plain; name="diffs" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="diffs" Content-length: 11227 2004-01-26 Andrew Cagney * 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. Index: ax-gdb.c =================================================================== RCS file: /cvs/src/src/gdb/ax-gdb.c,v retrieving revision 1.23 diff -u -r1.23 ax-gdb.c --- ax-gdb.c 21 Jan 2004 15:37:11 -0000 1.23 +++ ax-gdb.c 26 Jan 2004 20:28:14 -0000 @@ -620,7 +620,12 @@ 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: Index: dwarf2loc.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2loc.c,v retrieving revision 1.13 diff -u -r1.13 dwarf2loc.c --- dwarf2loc.c 11 Sep 2003 15:02:51 -0000 1.13 +++ dwarf2loc.c 26 Jan 2004 20:28:14 -0000 @@ -154,7 +154,7 @@ 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 @@ /* 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 @@ /* 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, Index: dwarf2loc.h =================================================================== RCS file: /cvs/src/src/gdb/dwarf2loc.h,v retrieving revision 1.3 diff -u -r1.3 dwarf2loc.h --- dwarf2loc.h 22 Jul 2003 15:41:59 -0000 1.3 +++ dwarf2loc.h 26 Jan 2004 20:28:14 -0000 @@ -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 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 Index: dwarf2read.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2read.c,v retrieving revision 1.125 diff -u -r1.125 dwarf2read.c --- dwarf2read.c 26 Jan 2004 19:55:45 -0000 1.125 +++ dwarf2read.c 26 Jan 2004 20:28:16 -0000 @@ -7974,7 +7974,7 @@ 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 @@ baton->data = NULL; } - SYMBOL_LOCATION_FUNCS (sym) = &dwarf2_locexpr_funcs; + SYMBOL_OPS (sym) = &dwarf2_locexpr_funcs; SYMBOL_LOCATION_BATON (sym) = baton; } } Index: findvar.c =================================================================== RCS file: /cvs/src/src/gdb/findvar.c,v retrieving revision 1.67 diff -u -r1.67 findvar.c --- findvar.c 2 Oct 2003 20:28:29 -0000 1.67 +++ findvar.c 26 Jan 2004 20:28:17 -0000 @@ -346,11 +346,12 @@ 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 @@ 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: { Index: printcmd.c =================================================================== RCS file: /cvs/src/src/gdb/printcmd.c,v retrieving revision 1.70 diff -u -r1.70 printcmd.c --- printcmd.c 23 Jan 2004 23:25:16 -0000 1.70 +++ printcmd.c 26 Jan 2004 20:28:17 -0000 @@ -1141,7 +1141,12 @@ 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: Index: symtab.h =================================================================== RCS file: /cvs/src/src/gdb/symtab.h,v retrieving revision 1.84 diff -u -r1.84 symtab.h --- symtab.h 23 Jan 2004 23:03:30 -0000 1.84 +++ symtab.h 26 Jan 2004 20:28:18 -0000 @@ -546,21 +546,12 @@ 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 @@ 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 @@ 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 @@ #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 --------------060702070803000302090603--