From patchwork Fri Sep 21 21:07:44 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dehao Chen X-Patchwork-Id: 185932 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 33F8B2C0086 for ; Sat, 22 Sep 2012 07:08:10 +1000 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1348866491; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: MIME-Version:Received:Received:Date:Message-ID:Subject:From:To: Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:Sender:Delivered-To; bh=qsnRNHC cbkJNqODpF/3nyhlMco0=; b=yn3EpezAod00bRIs05Qo+B+cTt3Q766X/LrmFQs oP33Lq+7nO+sEUxQ/zfgtfc7hRLlhiXGqfqyQ7Hs/bhR22qpMiEHKF+sV0nBtvnE I7D3W9yHRPSg89JALyGTlTfOAlbRScjcF3DO4JJbDzfnl28b0lMf5t8/4v7NOrbZ 9owY= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:X-Google-DKIM-Signature:Received:MIME-Version:Received:Received:Date:Message-ID:Subject:From:To:Content-Type:X-System-Of-Record:X-Gm-Message-State:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=DXoQdKMQvvUxrd/a44d3CWnH06TEyuYyjcsDWw3u88cnZWM5lH5XyFk6ibI5If BtW8Msl1O+oKWZ7IG/+eXyavB9xpjRltvty053j7W7lgHVE+UNd5DUUWsw7YqKf7 OK/OaguvzYsZ57quXq3xkhe5J/377EzQjAo3/3ARoGOsU=; Received: (qmail 4396 invoked by alias); 21 Sep 2012 21:08:03 -0000 Received: (qmail 4365 invoked by uid 22791); 21 Sep 2012 21:08:00 -0000 X-SWARE-Spam-Status: No, hits=-5.2 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, KHOP_RCVD_TRUST, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_YE, RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail-pb0-f47.google.com (HELO mail-pb0-f47.google.com) (209.85.160.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 21 Sep 2012 21:07:44 +0000 Received: by pbcwy7 with SMTP id wy7so8965842pbc.20 for ; Fri, 21 Sep 2012 14:07:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type :x-system-of-record:x-gm-message-state; bh=wnHwCxz7hj1uPEU1oKaMdcB1AYuX1j1497hyxnd2Ewo=; b=QtM+PUs6VMHMEtN2IS7nmKhHVfwrIOwxtbeHzGxZoLNBa6Z0HoeIFg2m81gtItLwRM LrEDujZk4VNOVV0IaadjGQWZjwKtBne8nieeqBxabBbt3SVlQArFNi6Cbw8DNUYYZKDR iADUbJHdjTRJdUF7tA/wuGpZw7dVoYYcNeKb+2QE1bIOU3ua4ye9ZvRy0v1Fqf0k0tlT 5VELYtTLXWMJ1PeuwJSMyGH3gzkkmlTOR46Vr5xgOpi8ly6AsqywBtZIQl9o2Qgupiwd Ml2Q1jdV3mK33nmLtR4giKbQaxS6jGNISgrjdfTet7zHjgvXkyXdn3S3ZCr1KXE6kKSF SJMg== Received: by 10.68.134.97 with SMTP id pj1mr18556074pbb.55.1348261664240; Fri, 21 Sep 2012 14:07:44 -0700 (PDT) MIME-Version: 1.0 Received: by 10.68.134.97 with SMTP id pj1mr18556057pbb.55.1348261664018; Fri, 21 Sep 2012 14:07:44 -0700 (PDT) Received: by 10.68.200.41 with HTTP; Fri, 21 Sep 2012 14:07:44 -0700 (PDT) Date: Fri, 21 Sep 2012 14:07:44 -0700 Message-ID: Subject: [patch] PR54645 move location_adhoc_data map into GC From: Dehao Chen To: GCC Patches X-System-Of-Record: true X-Gm-Message-State: ALoCoQmfCfC5L2xFHCyAEBQBVRXEIAbPHNymlv6MEeJxdSRq2Yj9ZwIzKFyD3tktzYcSN3PX+/hYoTXIpWIC37ToTZcnVb/yPSrx/zFVzPgXbHshJIcpbopkVzKMEobmbcWfWzHRj/XagoLNEhnGtmbkpGzKQaoLJHcO9ifpVwrvs7CNOrKUDTkOSIRL0zRdJL8HVz7qzGke X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Hi, This patch moves location_adhoc_data into GC, and also rebuild the hash table when reading in the PCH. After the patch, PCH can work as expected. Bootstrapped and passed gcc regression tests on x8664_linux. OK for trunk? Thanks, Dehao libcpp/ChangeLog: 2012-09-21 Dehao Chen PR middle-end/54645 * include/line-map.h (location_adhoc_data): Move location_adhoc_data into GC. (location_adhoc_data_map): Likewise. (line_maps): Likewise. (rebuild_location_adhoc_htab): New Function. * line-map.c (+rebuild_location_adhoc_htab): new Funcion. (get_combined_adhoc_loc): Move location_adhoc_data into GC. (location_adhoc_data_fini): Likewise. (linemap_init): Likewise. (location_adhoc_data_init): Remove Function. gcc/ChangeLog: 2012-09-21 Dehao Chen PR middle-end/54645 * c-family/c-pch.c (c_common_read_pch): Rebuild the location_adhoc_data map when read in the pch. Index: gcc/c-family/c-pch.c =================================================================== --- gcc/c-family/c-pch.c (revision 191618) +++ gcc/c-family/c-pch.c (working copy) @@ -340,6 +340,7 @@ c_common_read_pch (cpp_reader *pfile, const char * gt_pch_restore (f); cpp_set_line_map (pfile, line_table); + rebuild_location_adhoc_htab (line_table); timevar_push (TV_PCH_CPP_RESTORE); if (cpp_read_state (pfile, name, f, smd) != 0) Index: libcpp/include/line-map.h =================================================================== --- libcpp/include/line-map.h (revision 191618) +++ libcpp/include/line-map.h (working copy) @@ -260,9 +260,9 @@ struct GTY(()) maps_info { }; /* Data structure to associate an arbitrary data to a source location. */ -struct location_adhoc_data { +struct GTY(()) location_adhoc_data { source_location locus; - void *data; + void * GTY((skip)) data; }; struct htab; @@ -277,11 +277,11 @@ struct htab; bits of the integer is used to index the location_adhoc_data array, in which the locus and associated data is stored. */ -struct location_adhoc_data_map { - struct htab *htab; +struct GTY(()) location_adhoc_data_map { + struct htab * GTY((skip)) htab; source_location curr_loc; - struct location_adhoc_data *data; unsigned int allocated; + struct location_adhoc_data GTY((length ("%h.allocated"))) *data; }; /* A set of chronological line_map structures. */ @@ -315,7 +315,7 @@ struct GTY(()) line_maps { allocated, for a certain allocation size requested. */ line_map_round_alloc_size_func round_alloc_size; - struct location_adhoc_data_map GTY((skip)) location_adhoc_data_map; + struct location_adhoc_data_map location_adhoc_data_map; }; /* Returns the pointer to the memory region where information about @@ -446,6 +446,8 @@ extern source_location get_location_from_adhoc_loc #define COMBINE_LOCATION_DATA(SET, LOC, BLOCK) \ get_combined_adhoc_loc ((SET), (LOC), (BLOCK)) +extern void rebuild_location_adhoc_htab (struct line_maps *); + /* Initialize a line map set. */ extern void linemap_init (struct line_maps *); Index: libcpp/line-map.c =================================================================== --- libcpp/line-map.c (revision 191618) +++ libcpp/line-map.c (working copy) @@ -82,6 +82,19 @@ location_adhoc_data_update (void **slot, void *dat return 1; } +/* Rebuild the hash table from the location adhoc data. */ + +void +rebuild_location_adhoc_htab (struct line_maps *set) +{ + unsigned i; + set->location_adhoc_data_map.htab = + htab_create (100, location_adhoc_data_hash, location_adhoc_data_eq, NULL); + for (i = 0; i < set->location_adhoc_data_map.curr_loc; i++) + htab_find_slot (set->location_adhoc_data_map.htab, + set->location_adhoc_data_map.data + i, INSERT); +} + /* Combine LOCUS and DATA to a combined adhoc loc. */ source_location @@ -109,14 +122,21 @@ get_combined_adhoc_loc (struct line_maps *set, { char *orig_data = (char *) set->location_adhoc_data_map.data; long long offset; - set->location_adhoc_data_map.allocated *= 2; - set->location_adhoc_data_map.data = - XRESIZEVEC (struct location_adhoc_data, - set->location_adhoc_data_map.data, - set->location_adhoc_data_map.allocated); + line_map_realloc reallocator + = set->reallocator ? set->reallocator : xrealloc; + + if (set->location_adhoc_data_map.allocated == 0) + set->location_adhoc_data_map.allocated = 128; + else + set->location_adhoc_data_map.allocated *= 2; + set->location_adhoc_data_map.data = (struct location_adhoc_data *) + reallocator (set->location_adhoc_data_map.data, + set->location_adhoc_data_map.allocated + * sizeof (struct location_adhoc_data)); offset = (char *) (set->location_adhoc_data_map.data) - orig_data; - htab_traverse (set->location_adhoc_data_map.htab, - location_adhoc_data_update, &offset); + if (set->location_adhoc_data_map.allocated > 128) + htab_traverse (set->location_adhoc_data_map.htab, + location_adhoc_data_update, &offset); } *slot = set->location_adhoc_data_map.data + set->location_adhoc_data_map.curr_loc; @@ -144,24 +164,10 @@ get_location_from_adhoc_loc (struct line_maps *set return set->location_adhoc_data_map.data[loc & MAX_SOURCE_LOCATION].locus; } -/* Initialize the location_adhoc_data structure. */ - -static void -location_adhoc_data_init (struct line_maps *set) -{ - set->location_adhoc_data_map.htab = - htab_create (100, location_adhoc_data_hash, location_adhoc_data_eq, NULL); - set->location_adhoc_data_map.curr_loc = 0; - set->location_adhoc_data_map.allocated = 100; - set->location_adhoc_data_map.data = XNEWVEC (struct location_adhoc_data, 100); -} - /* Finalize the location_adhoc_data structure. */ void location_adhoc_data_fini (struct line_maps *set) { - set->location_adhoc_data_map.allocated = 0; - XDELETEVEC (set->location_adhoc_data_map.data); htab_delete (set->location_adhoc_data_map.htab); } @@ -173,7 +179,8 @@ linemap_init (struct line_maps *set) memset (set, 0, sizeof (struct line_maps)); set->highest_location = RESERVED_LOCATION_COUNT - 1; set->highest_line = RESERVED_LOCATION_COUNT - 1; - location_adhoc_data_init (set); + set->location_adhoc_data_map.htab = + htab_create (100, location_adhoc_data_hash, location_adhoc_data_eq, NULL); } /* Check for and warn about line_maps entered but not exited. */