From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6230 invoked by alias); 17 Dec 2012 19:22:48 -0000 Mailing-List: contact archer-commits-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: Received: (qmail 6176 invoked by uid 306); 17 Dec 2012 19:22:44 -0000 Date: Mon, 17 Dec 2012 19:22:00 -0000 Message-ID: <20121217192244.6161.qmail@sourceware.org> From: tromey@sourceware.org To: archer-commits@sourceware.org Subject: [SCM] archer-tromey-remove-obj_section: restore Ada symbol-caching functionality X-Git-Refname: refs/heads/archer-tromey-remove-obj_section X-Git-Reftype: branch X-Git-Oldrev: 6ced7a1920b9e0310239345d71e9b2a8f9242cbd X-Git-Newrev: 5876f76397640b48e80bcbe5b30f0fbc7459f462 X-SW-Source: 2012-q4/txt/msg00031.txt.bz2 List-Id: The branch, archer-tromey-remove-obj_section has been updated via 5876f76397640b48e80bcbe5b30f0fbc7459f462 (commit) via e09a0ce21ed15da8893897a63915e4d45332b877 (commit) via 02ef61ca7b0f0f774b8bcb84abce0848df21c281 (commit) via 01bf7382f5c294ecd3dd41643f280d7dfbb1aab3 (commit) from 6ced7a1920b9e0310239345d71e9b2a8f9242cbd (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 5876f76397640b48e80bcbe5b30f0fbc7459f462 Author: Tom Tromey Date: Mon Dec 17 12:22:30 2012 -0700 restore Ada symbol-caching functionality commit e09a0ce21ed15da8893897a63915e4d45332b877 Author: Tom Tromey Date: Mon Dec 17 12:18:06 2012 -0700 constify ada_decode_symbol commit 02ef61ca7b0f0f774b8bcb84abce0848df21c281 Author: Tom Tromey Date: Mon Dec 17 11:55:20 2012 -0700 make symbol_set_demangled_name take an obstack commit 01bf7382f5c294ecd3dd41643f280d7dfbb1aab3 Author: Tom Tromey Date: Mon Dec 17 11:52:39 2012 -0700 constify symbol_set_demangled_name ----------------------------------------------------------------------- Summary of changes: gdb/ada-lang.c | 35 ++++++++++++++++------------------- gdb/ada-lang.h | 2 +- gdb/coffread.c | 3 ++- gdb/dwarf2read.c | 4 ++-- gdb/jv-lang.c | 2 +- gdb/mdebugread.c | 3 ++- gdb/minsyms.c | 4 ++-- gdb/psymtab.c | 2 +- gdb/stabsread.c | 6 ++++-- gdb/symtab.c | 27 +++++++++++++++++---------- gdb/symtab.h | 22 +++++++++++++++++----- 11 files changed, 65 insertions(+), 45 deletions(-) First 500 lines of diff: diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index ce7aa64..b411d9b 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -1297,32 +1297,29 @@ static struct htab *decoded_names_store; const, but nevertheless modified to a semantically equivalent form when a decoded name is cached in it. */ -char * -ada_decode_symbol (const struct general_symbol_info *gsymbol) +const char * +ada_decode_symbol (const struct general_symbol_info *arg) { - char **resultp = - (char **) &gsymbol->language_specific.mangled_lang.demangled_name; + struct general_symbol_info *gsymbol = (struct general_symbol_info *) arg; + const char **resultp = + &gsymbol->language_specific.mangled_lang.demangled_name; - if (*resultp == NULL) + if (!gsymbol->ada_mangled) { const char *decoded = ada_decode (gsymbol->name); + struct obstack *obstack = gsymbol->language_specific.obstack; -#if 0 - /* FIXME */ - if (gsymbol->obj_section != NULL) - { - struct objfile *objf = gsymbol->obj_section->objfile; + gsymbol->ada_mangled = 1; - *resultp = obsavestring (decoded, strlen (decoded), - &objf->objfile_obstack); - } -#endif - /* Sometimes, we can't find a corresponding objfile, in which - case, we put the result on the heap. Since we only decode - when needed, we hope this usually does not cause a - significant memory leak (FIXME). */ - if (*resultp == NULL) + if (obstack != NULL) + *resultp = obsavestring (decoded, strlen (decoded), obstack); + else { + /* Sometimes, we can't find a corresponding objfile, in + which case, we put the result on the heap. Since we only + decode when needed, we hope this usually does not cause a + significant memory leak (FIXME). */ + char **slot = (char **) htab_find_slot (decoded_names_store, decoded, INSERT); diff --git a/gdb/ada-lang.h b/gdb/ada-lang.h index ab6997d..d5293ba 100644 --- a/gdb/ada-lang.h +++ b/gdb/ada-lang.h @@ -220,7 +220,7 @@ extern struct value *ada_get_decoded_value (struct value *value); extern struct type *ada_get_decoded_type (struct type *type); -extern char *ada_decode_symbol (const struct general_symbol_info*); +extern const char *ada_decode_symbol (const struct general_symbol_info*); extern const char *ada_decode (const char*); diff --git a/gdb/coffread.c b/gdb/coffread.c index 419f0e7..f78b211 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -1539,7 +1539,8 @@ process_coff_symbol (struct coff_symbol *cs, name = cs->c_name; name = EXTERNAL_NAME (name, objfile->obfd); - SYMBOL_SET_LANGUAGE (sym, current_subfile->language); + SYMBOL_SET_LANGUAGE (sym, current_subfile->language, + &objfile->objfile_obstack); SYMBOL_SET_NAMES (sym, name, strlen (name), 1, objfile); /* default assumptions */ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 25d7ecd..7146a76 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -6755,7 +6755,7 @@ fixup_go_packaging (struct dwarf2_cu *cu) TYPE_TAG_NAME (type) = TYPE_NAME (type); sym = allocate_symbol (objfile); - SYMBOL_SET_LANGUAGE (sym, language_go); + SYMBOL_SET_LANGUAGE (sym, language_go, &objfile->objfile_obstack); SYMBOL_SET_NAMES (sym, package_name, strlen (package_name), 1, objfile); /* This is not VAR_DOMAIN because we want a way to ensure a lookup of, e.g., "main" finds the "main" module and not C's main(). */ @@ -15649,7 +15649,7 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu, OBJSTAT (objfile, n_syms++); /* Cache this symbol's name and the name's demangled form (if any). */ - SYMBOL_SET_LANGUAGE (sym, cu->language); + SYMBOL_SET_LANGUAGE (sym, cu->language, &objfile->objfile_obstack); linkagename = dwarf2_physname (name, die, cu); SYMBOL_SET_NAMES (sym, linkagename, strlen (linkagename), 0, objfile); diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c index e2941b1..4bef553 100644 --- a/gdb/jv-lang.c +++ b/gdb/jv-lang.c @@ -187,7 +187,7 @@ add_class_symbol (struct type *type, CORE_ADDR addr) struct objfile *objfile = get_dynamics_objfile (get_type_arch (type)); sym = allocate_symbol (objfile); - SYMBOL_SET_LANGUAGE (sym, language_java); + SYMBOL_SET_LANGUAGE (sym, language_java, &objfile->objfile_obstack); SYMBOL_SET_LINKAGE_NAME (sym, TYPE_TAG_NAME (type)); SYMBOL_CLASS (sym) = LOC_TYPEDEF; /* SYMBOL_VALUE (sym) = valu; */ diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index 54fcf93..6f3ba55 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -4861,7 +4861,8 @@ new_symbol (char *name) { struct symbol *s = allocate_symbol (mdebugread_objfile); - SYMBOL_SET_LANGUAGE (s, psymtab_language); + SYMBOL_SET_LANGUAGE (s, psymtab_language, + &mdebugread_objfile->objfile_obstack); SYMBOL_SET_NAMES (s, name, strlen (name), 1, mdebugread_objfile); return s; } diff --git a/gdb/minsyms.c b/gdb/minsyms.c index 9c44930..ac5ba42 100644 --- a/gdb/minsyms.c +++ b/gdb/minsyms.c @@ -938,7 +938,7 @@ prim_record_minimal_symbol_full (const char *name, int name_len, int copy_name, msym_bunch = new; } msymbol = &msym_bunch->contents[msym_bunch_index]; - SYMBOL_SET_LANGUAGE (msymbol, language_auto); + SYMBOL_SET_LANGUAGE (msymbol, language_auto, &objfile->objfile_obstack); SYMBOL_SET_NAMES (msymbol, name, name_len, copy_name, objfile); SYMBOL_VALUE_ADDRESS (msymbol) = address; @@ -1297,7 +1297,7 @@ terminate_minimal_symbol_table (struct objfile *objfile) memset (m, 0, sizeof (*m)); /* Don't rely on these enumeration values being 0's. */ MSYMBOL_TYPE (m) = mst_unknown; - SYMBOL_SET_LANGUAGE (m, language_unknown); + SYMBOL_SET_LANGUAGE (m, language_unknown, &objfile->objfile_obstack); } } diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 4e51f6a..384a895 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -1618,7 +1618,7 @@ add_psymbol_to_bcache (const char *name, int namelength, int copy_name, SYMBOL_VALUE_ADDRESS (&psymbol) = coreaddr; } SYMBOL_SECTION (&psymbol) = -1; - SYMBOL_SET_LANGUAGE (&psymbol, language); + SYMBOL_SET_LANGUAGE (&psymbol, language, &objfile->objfile_obstack); PSYMBOL_DOMAIN (&psymbol) = domain; PSYMBOL_CLASS (&psymbol) = class; diff --git a/gdb/stabsread.c b/gdb/stabsread.c index acc3316..844db85 100644 --- a/gdb/stabsread.c +++ b/gdb/stabsread.c @@ -704,7 +704,8 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type, else { normal: - SYMBOL_SET_LANGUAGE (sym, current_subfile->language); + SYMBOL_SET_LANGUAGE (sym, current_subfile->language, + &objfile->objfile_obstack); if (SYMBOL_LANGUAGE (sym) == language_cplus) { char *name = alloca (p - string + 1); @@ -3674,7 +3675,8 @@ read_enum_type (char **pp, struct type *type, sym = allocate_symbol (objfile); SYMBOL_SET_LINKAGE_NAME (sym, name); - SYMBOL_SET_LANGUAGE (sym, current_subfile->language); + SYMBOL_SET_LANGUAGE (sym, current_subfile->language, + &objfile->objfile_obstack); SYMBOL_CLASS (sym) = LOC_CONST; SYMBOL_DOMAIN (sym) = VAR_DOMAIN; SYMBOL_VALUE (sym) = n; diff --git a/gdb/symtab.c b/gdb/symtab.c index e5510b9..b7cbb9e 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -443,15 +443,15 @@ gdb_mangle_name (struct type *type, int method_id, int signature_id) static void symbol_init_cplus_specific (struct general_symbol_info *gsymbol, - struct objfile *objfile) + struct obstack *obstack) { /* A language_specific structure should not have been previously initialized. */ gdb_assert (gsymbol->language_specific.cplus_specific == NULL); - gdb_assert (objfile != NULL); + gdb_assert (obstack != NULL); gsymbol->language_specific.cplus_specific = - OBSTACK_ZALLOC (&objfile->objfile_obstack, struct cplus_specific); + OBSTACK_ZALLOC (obstack, struct cplus_specific); } /* Set the demangled name of GSYMBOL to NAME. NAME must be already @@ -461,13 +461,13 @@ symbol_init_cplus_specific (struct general_symbol_info *gsymbol, void symbol_set_demangled_name (struct general_symbol_info *gsymbol, - char *name, - struct objfile *objfile) + const char *name, + struct obstack *obstack) { if (gsymbol->language == language_cplus) { if (gsymbol->language_specific.cplus_specific == NULL) - symbol_init_cplus_specific (gsymbol, objfile); + symbol_init_cplus_specific (gsymbol, obstack); gsymbol->language_specific.cplus_specific->demangled_name = name; } @@ -497,7 +497,8 @@ symbol_get_demangled_name (const struct general_symbol_info *gsymbol) void symbol_set_language (struct general_symbol_info *gsymbol, - enum language language) + enum language language, + struct obstack *obstack) { gsymbol->language = language; if (gsymbol->language == language_d @@ -506,7 +507,12 @@ symbol_set_language (struct general_symbol_info *gsymbol, || gsymbol->language == language_objc || gsymbol->language == language_fortran) { - symbol_set_demangled_name (gsymbol, NULL, NULL); + symbol_set_demangled_name (gsymbol, NULL, obstack); + } + else if (gsymbol->language == language_ada) + { + gdb_assert (gsymbol->ada_mangled == 0); + gsymbol->language_specific.obstack = obstack; } else if (gsymbol->language == language_cplus) gsymbol->language_specific.cplus_specific = NULL; @@ -811,9 +817,10 @@ symbol_set_names (struct general_symbol_info *gsymbol, gsymbol->name = (*slot)->mangled + lookup_len - len; if ((*slot)->demangled[0] != '\0') - symbol_set_demangled_name (gsymbol, (*slot)->demangled, objfile); + symbol_set_demangled_name (gsymbol, (*slot)->demangled, + &objfile->objfile_obstack); else - symbol_set_demangled_name (gsymbol, NULL, objfile); + symbol_set_demangled_name (gsymbol, NULL, &objfile->objfile_obstack); } /* Return the source code name of a symbol. In languages where diff --git a/gdb/symtab.h b/gdb/symtab.h index 49fe642..9608a3d 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -136,6 +136,11 @@ struct general_symbol_info union { + /* A pointer to an obstack that can be used for storage associated + with this symbol. This is only used by Ada, and only when the + 'ada_mangled' field is zero. */ + struct obstack *obstack; + /* This is used by languages which wish to store a demangled name. currently used by Ada, Java, and Objective C. */ struct mangled_lang @@ -154,6 +159,11 @@ struct general_symbol_info ENUM_BITFIELD(language) language : 8; + /* This is only used by Ada. If set, then the 'mangled_lang' field + of language_specific is valid. Otherwise, the 'obstack' field is + valid. */ + unsigned int ada_mangled : 1; + /* Which section is this symbol in? This is an index into section_offsets for this objfile. Negative means that the symbol does not get relocated relative to a section. */ @@ -161,8 +171,9 @@ struct general_symbol_info short section; }; -extern void symbol_set_demangled_name (struct general_symbol_info *, char *, - struct objfile *); +extern void symbol_set_demangled_name (struct general_symbol_info *, + const char *, + struct obstack *); extern const char *symbol_get_demangled_name (const struct general_symbol_info *); @@ -192,10 +203,11 @@ extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, struct obj_section *); /* Initializes the language dependent portion of a symbol depending upon the language for the symbol. */ -#define SYMBOL_SET_LANGUAGE(symbol,language) \ - (symbol_set_language (&(symbol)->ginfo, (language))) +#define SYMBOL_SET_LANGUAGE(symbol,language,obstack) \ + (symbol_set_language (&(symbol)->ginfo, (language), (obstack))) extern void symbol_set_language (struct general_symbol_info *symbol, - enum language language); + enum language language, + struct obstack *obstack); /* Set just the linkage name of a symbol; do not try to demangle it. Used for constructs which do not have a mangled name, hooks/post-receive -- Repository for Project Archer.