From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15883 invoked by alias); 12 Jul 2010 18:08:41 -0000 Received: (qmail 15868 invoked by uid 22791); 12 Jul 2010 18:08:39 -0000 X-SWARE-Spam-Status: No, hits=-5.9 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,TW_BJ,TW_CP,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 12 Jul 2010 18:08:32 +0000 Received: from int-mx04.intmail.prod.int.phx2.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.17]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o6CI8VJj018345 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 12 Jul 2010 14:08:31 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx04.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o6CI8UvN023411 for ; Mon, 12 Jul 2010 14:08:31 -0400 Received: from [10.15.16.129] (dhcp-10-15-16-129.yyz.redhat.com [10.15.16.129]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id o6CI8URi011298 for ; Mon, 12 Jul 2010 14:08:30 -0400 Message-ID: <4C3B5A1E.10602@redhat.com> Date: Mon, 12 Jul 2010 18:08:00 -0000 From: sami wagiaalla User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.10) Gecko/20100621 Fedora/3.0.5-1.fc13 Thunderbird/3.0.5 MIME-Version: 1.0 To: gdb-patches@sourceware.org Subject: Re: [patch 3/3] Change cplus_specific to an alocated struct References: <4BFD4230.3030600@redhat.com> <4C167FCA.7030300@redhat.com> In-Reply-To: Content-Type: multipart/mixed; boundary="------------050106050005030700000205" X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-07/txt/msg00212.txt.bz2 This is a multi-part message in MIME format. --------------050106050005030700000205 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 134 This patch moves the demangled name for cplus symbols to be stored and retrieved from a dynamically allocated cplus_specific struct --------------050106050005030700000205 Content-Type: text/plain; name="dynamic-cplus_specific_3.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="dynamic-cplus_specific_3.patch" Content-length: 6167 Use allocated cplus_specific for cplus symbols. 2010-07-12 Sami Wagiaalla * symtab.h (symbol_set_demangled_name): Now takes an optional objfile* argument. (cplus_specific): New struct. * symtab.c (symbol_set_demangled_name): Updated. Use cplus_specific for cplus symbols. (symbol_get_demangled_name): Retrive the name from the cplus_specific struct for cplus symbols. (symbol_init_language_specific): Set cplus_specific for cplus symbols. (symbol_set_names): Pass objfile to symbol_set_demangled_name. * symtab.c (symbol_init_cplus_specific): New function. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 4510ccd..622331e 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -8674,7 +8674,9 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) between gfortran, iFort etc. */ if (cu->language == language_fortran && symbol_get_demangled_name (&(sym->ginfo)) == NULL) - symbol_set_demangled_name (&(sym->ginfo), (char *) dwarf2_full_name (name, die, cu)); + symbol_set_demangled_name (&(sym->ginfo), + (char *) dwarf2_full_name (name, die, cu), + NULL); /* Default assumptions. Use the passed type or decode it from the die. */ diff --git a/gdb/symtab.c b/gdb/symtab.c index 34492f1..ec0e809 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -340,20 +340,53 @@ gdb_mangle_name (struct type *type, int method_id, int signature_id) return (mangled_name); } +/* Initialize the cplus_specific structure. 'cplus_specific' should + only be allocated for use with cplus symbols. */ + +static void +symbol_init_cplus_specific (struct general_symbol_info *gsymbol, + struct objfile *objfile) +{ + /* A language_specific structure should not have been previously + initialized. */ + gdb_assert (gsymbol->language_specific.cplus_specific == NULL); + gdb_assert (objfile != NULL); + + gsymbol->language_specific.cplus_specific = + OBSTACK_ZALLOC (&objfile->objfile_obstack, struct cplus_specific); +} + /* Set the demangled name of GSYMBOL to NAME. NAME must be already - correctly allocated. */ + correctly allocated. For C++ symbols a cplus_specific struct is + allocated so OBJFILE must not be NULL. If this is a non C++ symbol + OBJFILE can be NULL. */ void symbol_set_demangled_name (struct general_symbol_info *gsymbol, - char *name) + char *name, + struct objfile *objfile) { - gsymbol->language_specific.mangled_lang.demangled_name = name; + if (gsymbol->language == language_cplus) + { + if (gsymbol->language_specific.cplus_specific == NULL) + symbol_init_cplus_specific (gsymbol, objfile); + + gsymbol->language_specific.cplus_specific->demangled_name = name; + } + else + gsymbol->language_specific.mangled_lang.demangled_name = name; } /* Return the demangled name of GSYMBOL. */ char * symbol_get_demangled_name (const struct general_symbol_info *gsymbol) { - return gsymbol->language_specific.mangled_lang.demangled_name; + if (gsymbol->language == language_cplus) + { + gdb_assert (gsymbol->language_specific.cplus_specific != NULL); + return gsymbol->language_specific.cplus_specific->demangled_name; + } + else + return gsymbol->language_specific.mangled_lang.demangled_name; } @@ -363,6 +396,7 @@ void symbol_init_language_specific (struct general_symbol_info *gsymbol, enum language language) { + gsymbol->language = language; if (gsymbol->language == language_cplus || gsymbol->language == language_d @@ -370,8 +404,10 @@ symbol_init_language_specific (struct general_symbol_info *gsymbol, || gsymbol->language == language_objc || gsymbol->language == language_fortran) { - symbol_set_demangled_name (gsymbol, NULL); + symbol_set_demangled_name (gsymbol, NULL, NULL); } + else if (gsymbol->language == language_cplus) + gsymbol->language_specific.cplus_specific = NULL; else { memset (&gsymbol->language_specific, 0, @@ -553,7 +589,7 @@ symbol_set_names (struct general_symbol_info *gsymbol, memcpy (gsymbol->name, linkage_name, len); gsymbol->name[len] = '\0'; } - symbol_set_demangled_name (gsymbol, NULL); + symbol_set_demangled_name (gsymbol, NULL, NULL); return; } @@ -649,9 +685,9 @@ 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); + symbol_set_demangled_name (gsymbol, (*slot)->demangled, objfile); else - symbol_set_demangled_name (gsymbol, NULL); + symbol_set_demangled_name (gsymbol, NULL, objfile); } /* Return the source code name of a symbol. In languages where diff --git a/gdb/symtab.h b/gdb/symtab.h index 9864302..2cad280 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -75,7 +75,12 @@ struct program_space; --chastain 2003-08-21 */ +/* Struct for storing C++ specific information. Allocated when needed. */ +struct cplus_specific +{ + char *demangled_name; +}; /* Define a structure for the information that is common to all symbol types, including minimal symbols, partial symbols, and full symbols. In a @@ -120,7 +125,7 @@ struct general_symbol_info value; /* Since one and only one language can apply, wrap the language specific - information inside a union. */ + information inside a union. */ union { @@ -130,6 +135,8 @@ struct general_symbol_info char *demangled_name; } mangled_lang; + + struct cplus_specific *cplus_specific; } language_specific; @@ -154,7 +161,8 @@ struct general_symbol_info }; extern void -symbol_set_demangled_name (struct general_symbol_info *gsymbol, char *name); +symbol_set_demangled_name (struct general_symbol_info *gsymbol, char *name, + struct objfile *objfile); extern char* symbol_get_demangled_name (const struct general_symbol_info *symbol); --------------050106050005030700000205--