From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10756 invoked by alias); 10 May 2012 19:59:03 -0000 Received: (qmail 10743 invoked by uid 22791); 10 May 2012 19:59:02 -0000 X-SWARE-Spam-Status: No, hits=-6.4 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,TW_BJ,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; Thu, 10 May 2012 19:58:41 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q4AJweMl020167 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 May 2012 15:58:40 -0400 Received: from barimba (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q4AJwcQI002560 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 10 May 2012 15:58:39 -0400 From: Tom Tromey To: gdb-patches@sourceware.org Subject: Re: [4/10] add back-pointer from global block to symtab References: <87d36vbrbt.fsf@fleche.redhat.com> Date: Thu, 10 May 2012 19:59:00 -0000 In-Reply-To: <87d36vbrbt.fsf@fleche.redhat.com> (Tom Tromey's message of "Wed, 25 Apr 2012 12:26:46 -0600") Message-ID: <871umrbyfl.fsf@fleche.redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.95 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain 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: 2012-05/txt/msg00382.txt.bz2 >>>>> "Tom" == Tom Tromey writes: Tom> In order to keep memory down I did this by introducing a "global_block" Tom> structure which is a subclass of "block". I spoke too soon. I did need a little change in this patch. Tom> (get_block_symtab): New functions. This function is static but not used until a later patch. So, I moved it out of this patch. I'm appending what I am checking in. Tom 2012-05-10 Tom Tromey * jv-lang.c (get_java_class_symtab): Use allocate_global_block, set_block_symtab. * jit.c (finalize_symtab): Use allocate_global_block, set_block_symtab. * buildsym.c (finish_block_internal): New function, from old finish_block. (finish_block): Rewrite. (end_symtab): Use finish_block_internal, set_block_symtab. * block.h (struct global_block): New. (allocate_global_block, set_block_symtab): Declare. * block.c (allocate_global_block, set_block_symtab): New functions. Index: block.c =================================================================== RCS file: /cvs/src/src/gdb/block.c,v retrieving revision 1.28 diff -u -r1.28 block.c --- block.c 10 May 2012 19:50:07 -0000 1.28 +++ block.c 10 May 2012 19:58:25 -0000 @@ -370,6 +370,29 @@ return bl; } +/* Allocate a global block. */ + +struct block * +allocate_global_block (struct obstack *obstack) +{ + struct global_block *bl = OBSTACK_ZALLOC (obstack, struct global_block); + + return &bl->block; +} + +/* Set the symtab of the global block. */ + +void +set_block_symtab (struct block *block, struct symtab *symtab) +{ + struct global_block *gb; + + gdb_assert (BLOCK_SUPERBLOCK (block) == NULL); + gb = (struct global_block *) block; + gdb_assert (gb->symtab == NULL); + gb->symtab = symtab; +} + /* See block.h. */ Index: block.h =================================================================== RCS file: /cvs/src/src/gdb/block.h,v retrieving revision 1.27 diff -u -r1.27 block.h --- block.h 10 May 2012 19:50:07 -0000 1.27 +++ block.h 10 May 2012 19:58:25 -0000 @@ -99,6 +99,21 @@ language_specific; }; +/* The global block is singled out so that we can provide a back-link + to the primary symtab. */ + +struct global_block +{ + /* The block. */ + + struct block block; + + /* This holds a pointer to the primary symtab holding this + block. */ + + struct symtab *symtab; +}; + #define BLOCK_START(bl) (bl)->startaddr #define BLOCK_END(bl) (bl)->endaddr #define BLOCK_FUNCTION(bl) (bl)->function @@ -161,6 +176,9 @@ extern struct block *allocate_block (struct obstack *obstack); +extern struct block *allocate_global_block (struct obstack *obstack); + +extern void set_block_symtab (struct block *, struct symtab *); /* A block iterator. This structure should be treated as though it were opaque; it is only defined here because we want to support Index: buildsym.c =================================================================== RCS file: /cvs/src/src/gdb/buildsym.c,v retrieving revision 1.94 diff -u -r1.94 buildsym.c --- buildsym.c 10 May 2012 19:50:07 -0000 1.94 +++ buildsym.c 10 May 2012 19:58:25 -0000 @@ -214,11 +214,12 @@ the order the symbols have in the list (reversed from the input file). Put the block on the list of pending blocks. */ -struct block * -finish_block (struct symbol *symbol, struct pending **listhead, - struct pending_block *old_blocks, - CORE_ADDR start, CORE_ADDR end, - struct objfile *objfile) +static struct block * +finish_block_internal (struct symbol *symbol, struct pending **listhead, + struct pending_block *old_blocks, + CORE_ADDR start, CORE_ADDR end, + struct objfile *objfile, + int is_global) { struct gdbarch *gdbarch = get_objfile_arch (objfile); struct pending *next, *next1; @@ -226,7 +227,9 @@ struct pending_block *pblock; struct pending_block *opblock; - block = allocate_block (&objfile->objfile_obstack); + block = (is_global + ? allocate_global_block (&objfile->objfile_obstack) + : allocate_block (&objfile->objfile_obstack)); if (symbol) { @@ -241,9 +244,6 @@ BLOCK_START (block) = start; BLOCK_END (block) = end; - /* Superblock filled in when containing block is made. */ - BLOCK_SUPERBLOCK (block) = NULL; - BLOCK_NAMESPACE (block) = NULL; /* Put the block in as the value of the symbol that names it. */ @@ -387,6 +387,15 @@ return block; } +struct block * +finish_block (struct symbol *symbol, struct pending **listhead, + struct pending_block *old_blocks, + CORE_ADDR start, CORE_ADDR end, + struct objfile *objfile) +{ + return finish_block_internal (symbol, listhead, old_blocks, + start, end, objfile, 0); +} /* Record BLOCK on the list of all blocks in the file. Put it after OPBLOCK, or at the beginning if opblock is NULL. This puts the @@ -1017,8 +1026,8 @@ blockvector. */ finish_block (0, &file_symbols, 0, last_source_start_addr, end_addr, objfile); - finish_block (0, &global_symbols, 0, last_source_start_addr, - end_addr, objfile); + finish_block_internal (0, &global_symbols, 0, last_source_start_addr, + end_addr, objfile, 1); blockvector = make_blockvector (objfile); } @@ -1158,6 +1167,14 @@ if (symtab) { symtab->primary = 1; + + if (symtab->blockvector) + { + struct block *b = BLOCKVECTOR_BLOCK (symtab->blockvector, + GLOBAL_BLOCK); + + set_block_symtab (b, symtab); + } } /* Default any symbols without a specified symtab to the primary Index: jit.c =================================================================== RCS file: /cvs/src/src/gdb/jit.c,v retrieving revision 1.28 diff -u -r1.28 jit.c --- jit.c 22 Mar 2012 20:33:42 -0000 1.28 +++ jit.c 10 May 2012 19:58:25 -0000 @@ -695,7 +695,11 @@ block_iter = NULL; for (i = 0; i < FIRST_LOCAL_BLOCK; i++) { - struct block *new_block = allocate_block (&objfile->objfile_obstack); + struct block *new_block; + + new_block = (i == GLOBAL_BLOCK + ? allocate_global_block (&objfile->objfile_obstack) + : allocate_block (&objfile->objfile_obstack)); BLOCK_DICT (new_block) = dict_create_linear (&objfile->objfile_obstack, NULL); BLOCK_SUPERBLOCK (new_block) = block_iter; @@ -705,6 +709,9 @@ BLOCK_END (new_block) = (CORE_ADDR) end; BLOCKVECTOR_BLOCK (symtab->blockvector, i) = new_block; + + if (i == GLOBAL_BLOCK) + set_block_symtab (new_block, symtab); } /* Fill up the superblock fields for the real blocks, using the Index: jv-lang.c =================================================================== RCS file: /cvs/src/src/gdb/jv-lang.c,v retrieving revision 1.102 diff -u -r1.102 jv-lang.c --- jv-lang.c 17 Apr 2012 12:43:20 -0000 1.102 +++ jv-lang.c 10 May 2012 19:58:26 -0000 @@ -158,8 +158,9 @@ BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK) = bl; /* Allocate GLOBAL_BLOCK. */ - bl = allocate_block (&objfile->objfile_obstack); + bl = allocate_global_block (&objfile->objfile_obstack); BLOCK_DICT (bl) = dict_create_hashed_expandable (); + set_block_symtab (bl, class_symtab); BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK) = bl; /* Arrange to free the dict. */