From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19287 invoked by alias); 4 Apr 2011 14:29:05 -0000 Received: (qmail 19278 invoked by uid 22791); 4 Apr 2011 14:29:04 -0000 X-SWARE-Spam-Status: No, hits=-6.8 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,TW_BJ,TW_YM,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, 04 Apr 2011 14:28:59 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p34ESwxe011381 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 4 Apr 2011 10:28:58 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p34ESw95019803; Mon, 4 Apr 2011 10:28:58 -0400 Received: from opsy.redhat.com (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id p34ESvta020895; Mon, 4 Apr 2011 10:28:57 -0400 Received: by opsy.redhat.com (Postfix, from userid 500) id 332CB37848E; Mon, 4 Apr 2011 08:28:56 -0600 (MDT) From: Tom Tromey To: gdb-patches@sourceware.org Subject: FYI: clean up symtab producer and debugformat lifetimes Date: Mon, 04 Apr 2011 14:29:00 -0000 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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: 2011-04/txt/msg00052.txt.bz2 I'm checking this in on the trunk. Right now the symtab `producer' and `debugformat' fields are copied while building symtabs and then finally allocated on the objfile obstack. I think this is just a waste; in all existing cases, the values are constants. So, it is simpler to just require the caller to guarantee the lifetime of the strings. I think this clarifies the code, and this is shown by the fact that this caught a bug in free_symtab. Built and regtested on x86-64 (compile farm). Tom 2011-04-04 Tom Tromey * xcoffread.c (read_xcoff_symtab): Make `debugfmt' const. * symtab.h (struct symtab) : Now const. * symmisc.c (free_symtab): Don't free debugformat. * buildsym.h (struct subfile) : Now const. (record_debugformat, record_producer): Document. * buildsym.c (end_symtab): Don't save debugformat and producer names on obstack. (end_symtab): Don't free debugformat and producer fields. (record_debugformat): Don't call xstrdup. (record_producer): Likewise. Index: buildsym.c =================================================================== RCS file: /cvs/src/src/gdb/buildsym.c,v retrieving revision 1.85 diff -u -r1.85 buildsym.c --- buildsym.c 23 Mar 2011 18:23:54 -0000 1.85 +++ buildsym.c 4 Apr 2011 14:21:40 -0000 @@ -1111,20 +1111,6 @@ the symbols. */ symtab->language = subfile->language; - /* Save the debug format string (if any) in the symtab. */ - if (subfile->debugformat != NULL) - { - symtab->debugformat = obsavestring (subfile->debugformat, - strlen (subfile->debugformat), - &objfile->objfile_obstack); - } - - /* Similarly for the producer. */ - if (subfile->producer != NULL) - symtab->producer = obsavestring (subfile->producer, - strlen (subfile->producer), - &objfile->objfile_obstack); - /* All symtabs for the main file and the subfiles share a blockvector, so we need to clear primary for everything but the main file. */ @@ -1169,12 +1155,6 @@ { xfree ((void *) subfile->line_vector); } - if (subfile->debugformat != NULL) - { - xfree ((void *) subfile->debugformat); - } - if (subfile->producer != NULL) - xfree (subfile->producer); nextsub = subfile->next; xfree ((void *) subfile); @@ -1279,20 +1259,15 @@ void -record_debugformat (char *format) +record_debugformat (const char *format) { - current_subfile->debugformat = xstrdup (format); + current_subfile->debugformat = format; } void record_producer (const char *producer) { - /* The producer is not always provided in the debugging info. - Do nothing if PRODUCER is NULL. */ - if (producer == NULL) - return; - - current_subfile->producer = xstrdup (producer); + current_subfile->producer = producer; } /* Merge the first symbol list SRCLIST into the second symbol list Index: buildsym.h =================================================================== RCS file: /cvs/src/src/gdb/buildsym.h,v retrieving revision 1.27 diff -u -r1.27 buildsym.h --- buildsym.h 1 Jan 2011 15:32:58 -0000 1.27 +++ buildsym.h 4 Apr 2011 14:21:40 -0000 @@ -70,8 +70,8 @@ struct linetable *line_vector; int line_vector_length; enum language language; - char *producer; - char *debugformat; + const char *producer; + const char *debugformat; struct symtab *symtab; }; @@ -292,7 +292,15 @@ struct block *block, struct pending_block *opblock); -extern void record_debugformat (char *format); +/* Record the name of the debug format in the current pending symbol + table. FORMAT must be a string with a lifetime at least as long as + the symtab's objfile. */ + +extern void record_debugformat (const char *format); + +/* Record the name of the debuginfo producer (usually the compiler) in + the current pending symbol table. PRODUCER must be a string with a + lifetime at least as long as the symtab's objfile. */ extern void record_producer (const char *producer); Index: symmisc.c =================================================================== RCS file: /cvs/src/src/gdb/symmisc.c,v retrieving revision 1.77 diff -u -r1.77 symmisc.c --- symmisc.c 28 Mar 2011 20:21:04 -0000 1.77 +++ symmisc.c 4 Apr 2011 14:21:40 -0000 @@ -115,8 +115,6 @@ xfree (s->line_charpos); if (s->fullname != NULL) xfree (s->fullname); - if (s->debugformat != NULL) - xfree (s->debugformat); xfree (s); } Index: symtab.h =================================================================== RCS file: /cvs/src/src/gdb/symtab.h,v retrieving revision 1.174 diff -u -r1.174 symtab.h --- symtab.h 4 Apr 2011 14:10:12 -0000 1.174 +++ symtab.h 4 Apr 2011 14:21:41 -0000 @@ -817,11 +817,11 @@ for automated testing of gdb but may also be information that is useful to the user. */ - char *debugformat; + const char *debugformat; /* String of producer version information. May be zero. */ - char *producer; + const char *producer; /* Full name of file as found by searching the source path. NULL if not yet known. */ Index: xcoffread.c =================================================================== RCS file: /cvs/src/src/gdb/xcoffread.c,v retrieving revision 1.84 diff -u -r1.84 xcoffread.c --- xcoffread.c 7 Mar 2011 16:17:29 -0000 1.84 +++ xcoffread.c 4 Apr 2011 14:21:41 -0000 @@ -944,7 +944,7 @@ ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl; char *debugsec = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->debugsec; - char *debugfmt = bfd_xcoff_is_xcoff64 (abfd) ? "XCOFF64" : "XCOFF"; + const char *debugfmt = bfd_xcoff_is_xcoff64 (abfd) ? "XCOFF64" : "XCOFF"; struct internal_syment symbol[1]; union internal_auxent main_aux;