From patchwork Mon Sep 8 15:26:45 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 386971 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 733631400A3 for ; Tue, 9 Sep 2014 01:26:57 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:date:message-id:mime-version:content-type :content-transfer-encoding; q=dns; s=default; b=Qs860KE/20wCf/Eb Yt+/9yrwWKTAhTgpjYkYAZjysU8dO8wgHkHMN4Eh2aBSjw5NlnsVAU8Qny6+yEGX KXYxlgGMfNnUoiYotW3QqAEHGTWQDcJBYHjPERxBej9L0xYVjLFBsLd5ehUeQOW4 IyiPkhqGD8jfUBhGpTw1Uj3nzZE= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:date:message-id:mime-version:content-type :content-transfer-encoding; s=default; bh=uQMwwIq/TtqzTFbDlUtfHQ 416pI=; b=YzBiK3Nrz+zV7OamS+B8XY6ajpi+xJOyqiMqof93EykDfhAcF8RW/2 BY8ui+q9DqgwDV52xp6mPQkzMTErIZuYB6TEP3gMjalycJM7ja0eHGiVz7ZmQXsn yOBrDORZKxCqSKX+JDC4PPLG8OtUqBVdwOmrdz64EY8r4ZUGZ2LJc= Received: (qmail 20598 invoked by alias); 8 Sep 2014 15:26:50 -0000 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 Received: (qmail 20588 invoked by uid 89); 8 Sep 2014 15:26:50 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL, BAYES_00, SPF_PASS autolearn=ham version=3.3.2 X-HELO: service87.mimecast.com Received: from service87.mimecast.com (HELO service87.mimecast.com) (91.220.42.44) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 08 Sep 2014 15:26:48 +0000 Received: from cam-owa1.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Mon, 08 Sep 2014 16:26:45 +0100 Received: from localhost ([10.1.255.212]) by cam-owa1.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 8 Sep 2014 16:26:45 +0100 From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@arm.com Subject: RFA: Add a destructor to target_ira_int Date: Mon, 08 Sep 2014 16:26:45 +0100 Message-ID: <87tx4iyvyi.fsf@e105548-lin.cambridge.arm.com> User-Agent: Gnus/5.130012 (Ma Gnus v0.12) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 X-MC-Unique: 114090816264512301 This patch adds a destructor to target_ira_int, so that the data structures it points to are freed when the parent target_globals is freed. It fixes a memory leak with non-default subtargets. Tested on x86_64-linux-gnu. OK to install? Thanks, Richard gcc/ * ira.h (ira_finish_once): Delete. * ira-int.h (target_ira_int::~target_ira_int): Declare. (target_ira_int::free_ira_costs): Likewise. (target_ira_int::free_register_move_costs): Likewise. (ira_finish_costs_once): Delete. * ira.c (free_register_move_costs): Replace with... (target_ira_int::free_register_move_costs): ...this new function. (target_ira_int::~target_ira_int): Define. (ira_init): Call free_register_move_costs as a member function rather than a global function. (ira_finish_once): Delete. * ira-costs.c (free_ira_costs): Replace with... (target_ira_int::free_ira_costs): ...this new function. (ira_init_costs): Call free_ira_costs as a member function rather than a global function. (ira_finish_costs_once): Delete. * target-globals.c (target_globals::~target_globals): Call the target_ira_int destructor. * toplev.c: Include lra.h. (finalize): Call lra_finish_once rather than ira_finish_once. Index: gcc/ira-costs.c =================================================================== --- gcc/ira-costs.c 2014-08-26 12:09:31.486621719 +0100 +++ gcc/ira-costs.c 2014-09-08 16:21:58.546319449 +0100 @@ -2047,21 +2047,21 @@ ira_init_costs_once (void) } /* Free allocated temporary cost vectors. */ -static void -free_ira_costs (void) +void +target_ira_int::free_ira_costs () { int i; - free (init_cost); - init_cost = NULL; + free (x_init_cost); + x_init_cost = NULL; for (i = 0; i < MAX_RECOG_OPERANDS; i++) { - free (op_costs[i]); - free (this_op_costs[i]); - op_costs[i] = this_op_costs[i] = NULL; + free (x_op_costs[i]); + free (x_this_op_costs[i]); + x_op_costs[i] = x_this_op_costs[i] = NULL; } - free (temp_costs); - temp_costs = NULL; + free (x_temp_costs); + x_temp_costs = NULL; } /* This is called each time register related information is @@ -2071,7 +2071,7 @@ ira_init_costs (void) { int i; - free_ira_costs (); + this_target_ira_int->free_ira_costs (); max_struct_costs_size = sizeof (struct costs) + sizeof (int) * (ira_important_classes_num - 1); /* Don't use ira_allocate because vectors live through several IRA @@ -2088,13 +2088,6 @@ ira_init_costs (void) temp_costs = (struct costs *) xmalloc (max_struct_costs_size); } -/* Function called once at the end of compiler work. */ -void -ira_finish_costs_once (void) -{ - free_ira_costs (); -} - /* Common initialization function for ira_costs and Index: gcc/ira-int.h =================================================================== --- gcc/ira-int.h 2014-08-26 12:09:21.218740214 +0100 +++ gcc/ira-int.h 2014-09-08 16:21:58.546319449 +0100 @@ -770,6 +770,11 @@ #define FOR_EACH_BIT_IN_MINMAX_SET(VEC, minmax_set_iter_next (&(ITER))) struct target_ira_int { + ~target_ira_int (); + + void free_ira_costs (); + void free_register_move_costs (); + /* Initialized once. It is a maximal possible size of the allocated struct costs. */ int x_max_struct_costs_size; @@ -1025,7 +1030,6 @@ extern void ira_destroy (void); /* ira-costs.c */ extern void ira_init_costs_once (void); extern void ira_init_costs (void); -extern void ira_finish_costs_once (void); extern void ira_costs (void); extern void ira_tune_allocno_costs (void); Index: gcc/ira.c =================================================================== --- gcc/ira.c 2014-08-29 10:05:41.590585897 +0100 +++ gcc/ira.c 2014-09-08 16:21:58.546319449 +0100 @@ -1673,40 +1673,46 @@ ira_init_once (void) /* Free ira_max_register_move_cost, ira_may_move_in_cost and ira_may_move_out_cost for each mode. */ -static void -free_register_move_costs (void) +void +target_ira_int::free_register_move_costs (void) { int mode, i; /* Reset move_cost and friends, making sure we only free shared table entries once. */ for (mode = 0; mode < MAX_MACHINE_MODE; mode++) - if (ira_register_move_cost[mode]) + if (x_ira_register_move_cost[mode]) { for (i = 0; - i < mode && (ira_register_move_cost[i] - != ira_register_move_cost[mode]); + i < mode && (x_ira_register_move_cost[i] + != x_ira_register_move_cost[mode]); i++) ; if (i == mode) { - free (ira_register_move_cost[mode]); - free (ira_may_move_in_cost[mode]); - free (ira_may_move_out_cost[mode]); + free (x_ira_register_move_cost[mode]); + free (x_ira_may_move_in_cost[mode]); + free (x_ira_may_move_out_cost[mode]); } } - memset (ira_register_move_cost, 0, sizeof ira_register_move_cost); - memset (ira_may_move_in_cost, 0, sizeof ira_may_move_in_cost); - memset (ira_may_move_out_cost, 0, sizeof ira_may_move_out_cost); + memset (x_ira_register_move_cost, 0, sizeof x_ira_register_move_cost); + memset (x_ira_may_move_in_cost, 0, sizeof x_ira_may_move_in_cost); + memset (x_ira_may_move_out_cost, 0, sizeof x_ira_may_move_out_cost); last_mode_for_init_move_cost = -1; } +target_ira_int::~target_ira_int () +{ + free_ira_costs (); + free_register_move_costs (); +} + /* This is called every time when register related information is changed. */ void ira_init (void) { - free_register_move_costs (); + this_target_ira_int->free_register_move_costs (); setup_reg_mode_hard_regset (); setup_alloc_regs (flag_omit_frame_pointer != 0); setup_class_subset_and_memory_move_costs (); @@ -1718,15 +1724,6 @@ ira_init (void) ira_init_costs (); } -/* Function called once at the end of compiler work. */ -void -ira_finish_once (void) -{ - ira_finish_costs_once (); - free_register_move_costs (); - lra_finish_once (); -} - #define ira_prohibited_mode_move_regs_initialized_p \ (this_target_ira_int->x_ira_prohibited_mode_move_regs_initialized_p) Index: gcc/ira.h =================================================================== --- gcc/ira.h 2014-08-29 10:05:41.590585897 +0100 +++ gcc/ira.h 2014-09-08 16:21:58.546319449 +0100 @@ -177,7 +177,6 @@ struct ira_reg_equiv_s extern void ira_init_once (void); extern void ira_init (void); -extern void ira_finish_once (void); extern void ira_setup_eliminable_regset (void); extern rtx ira_eliminate_regs (rtx, enum machine_mode); extern void ira_set_pseudo_classes (bool, FILE *); Index: gcc/target-globals.c =================================================================== --- gcc/target-globals.c 2014-09-05 16:15:31.769306144 +0100 +++ gcc/target-globals.c 2014-09-08 16:21:58.546319449 +0100 @@ -121,6 +121,7 @@ save_target_globals_default_opts () target_globals::~target_globals () { + ira_int->~target_ira_int (); /* default_target_globals points to static data so shouldn't be freed. */ if (this != &default_target_globals) { Index: gcc/toplev.c =================================================================== --- gcc/toplev.c 2014-09-05 15:06:42.917035061 +0100 +++ gcc/toplev.c 2014-09-08 16:21:58.546319449 +0100 @@ -55,6 +55,7 @@ Software Foundation; either version 3, o #include "params.h" #include "reload.h" #include "ira.h" +#include "lra.h" #include "dwarf2asm.h" #include "debug.h" #include "target.h" @@ -1887,7 +1888,7 @@ finalize (bool no_backend) g->get_passes ()->finish_optimization_passes (); - ira_finish_once (); + lra_finish_once (); } if (mem_report)