From patchwork Thu Dec 5 12:50:04 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Li=C5=A1ka?= X-Patchwork-Id: 1204596 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-515225-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="jmuS/NtD"; dkim-atps=neutral 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 47TFtd0k81z9s4Y for ; Thu, 5 Dec 2019 23:50:16 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :subject:to:cc:message-id:date:mime-version:content-type; q=dns; s=default; b=eT80wJUF9CggSL5qRb8Qhx5YJ/wXcIaHRkMyvWQxV4gOF0Yh0g AaZZnUpZYHHG9Pu3wdLXm/voKrIUPyI5H74yKwOnq8fi8y/H6csQjtYUICQ0xjve dCq3xChd266ClnhcjU/1ZDu4xfjHaIooGMpr1CILJ3A1dIbicxbFh9tU0= 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 :subject:to:cc:message-id:date:mime-version:content-type; s= default; bh=l4veUlDPnfY8Rm9Y+2MzbdBjMps=; b=jmuS/NtDlzN8Ju+W/GNb mKGM+Ic6+QXFnxORklP4mXhtA/R7IISPmTGjUMopqSYK40beGAEcORO8Q95IImDO +xQXNiXBUFCXEhA03vwdBRWtD7H35cDcmkNGbnnD1uJMkPmTmYsoObm4goP7j7is aQ51GyMawLmlTDgHDBBXLYg= Received: (qmail 19066 invoked by alias); 5 Dec 2019 12:50:09 -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 19054 invoked by uid 89); 5 Dec 2019 12:50:08 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-18.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_PASS autolearn=ham version=3.3.1 spammy=analyzed, m_uid, 12437, m_summary_id X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 05 Dec 2019 12:50:06 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 51DE5B191; Thu, 5 Dec 2019 12:50:04 +0000 (UTC) From: =?utf-8?q?Martin_Li=C5=A1ka?= Subject: [PATCH] Come up with constructors of symtab_node, cgraph_node and varpool_node. To: gcc-patches@gcc.gnu.org Cc: Jan Hubicka Message-ID: <0383ee3e-ce9e-5268-db13-bc2deae23f83@suse.cz> Date: Thu, 5 Dec 2019 13:50:04 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.2.2 MIME-Version: 1.0 X-IsSubscribed: yes Hi. As mentioned in the PR, there are classes in cgraph.h that are not PODs and are initialized with ggc_alloc_cleared. So that I'm suggesting to use proper constructors. I added ggc_new function that can be used at different locations as well. I'm attaching optimized dump file with how ctor expansion looks like. Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed? Thanks, Martin gcc/ChangeLog: 2019-12-05 Martin Liska PR ipa/92737 * cgraph.c (symbol_table_test::symbol_table_test): Use new ggc_new. * cgraph.h (symtab_node::symtab_node): New constructor. (cgraph_node::cgraph_node): Likewise. (varpool_node::varpool_node): Likewise. (symbol_table::allocate_cgraph_symbol): Use newly created constructor. * cgraphunit.c (symtab_terminator): Likewise. * ggc.h (ggc_new): New. * toplev.c (general_init): Use new ggc_new. * varpool.c (varpool_node::create_empty): Use newly created constructor. gcc/c-family/ChangeLog: 2019-12-05 Martin Liska PR ipa/92737 * c-opts.c (c_common_init_options): Use new ggc_new. --- gcc/c-family/c-opts.c | 4 +--- gcc/cgraph.c | 2 +- gcc/cgraph.h | 50 ++++++++++++++++++++++++++++++++++++------- gcc/cgraphunit.c | 2 +- gcc/ggc.h | 9 ++++++++ gcc/toplev.c | 2 +- gcc/varpool.c | 5 ++--- 7 files changed, 57 insertions(+), 17 deletions(-) varpool_node::create_empty () { struct varpool_node * _4; unsigned long _5; unsigned long _8; unsigned long _9; unsigned char _64; unsigned char _65; unsigned char _66; [local count: 1073741824]: _4 = ggc_internal_alloc (128, 0B, 0, 1); _9 = MEM[(struct symtab_node *)_4]; _8 = _9 & 18446743523953737728; _5 = _8 | 2; MEM[(struct symtab_node *)_4] = _5; MEM[(struct symtab_node *)_4].order = 0; MEM[(struct symtab_node *)_4].decl = 0B; MEM[(struct symtab_node *)_4].next = 0B; MEM[(struct symtab_node *)_4].previous = 0B; MEM[(struct symtab_node *)_4].next_sharing_asm_name = 0B; MEM[(struct symtab_node *)_4].previous_sharing_asm_name = 0B; MEM[(struct symtab_node *)_4].same_comdat_group = 0B; MEM[(struct symtab_node *)_4].ref_list.references = 0B; MEM[(struct symtab_node *)_4].ref_list.referring.m_vec = 0B; MEM[(struct symtab_node *)_4].alias_target = 0B; MEM[(struct symtab_node *)_4].lto_file_data = 0B; MEM[(struct symtab_node *)_4].aux = 0B; MEM[(struct symtab_node *)_4].x_comdat_group = 0B; MEM[(struct symtab_node *)_4].x_section = 0B; _64 = MEM[(struct varpool_node *)_4 + 120B]; _65 = _64 & 192; _66 = _65 | 0; MEM[(struct varpool_node *)_4 + 120B] = _66; return _4; } cgraph_node::create (union tree_node * decl) { ... _55 = ggc_internal_alloc (360, 0B, 0, 1); _56 = &_55->D.104276; _71 = MEM[(struct symtab_node *)_55]; _70 = _71 & 18446743523953737728; _168 = _70 | 1; MEM[(struct symtab_node *)_55] = _168; MEM[(struct symtab_node *)_55].order = 0; MEM[(struct symtab_node *)_55].decl = 0B; MEM[(struct symtab_node *)_55].next = 0B; MEM[(struct symtab_node *)_55].previous = 0B; MEM[(struct symtab_node *)_55].next_sharing_asm_name = 0B; MEM[(struct symtab_node *)_55].previous_sharing_asm_name = 0B; MEM[(struct symtab_node *)_55].same_comdat_group = 0B; MEM[(struct symtab_node *)_55].ref_list.references = 0B; MEM[(struct symtab_node *)_55].ref_list.referring.m_vec = 0B; MEM[(struct symtab_node *)_55].alias_target = 0B; MEM[(struct symtab_node *)_55].lto_file_data = 0B; MEM[(struct symtab_node *)_55].aux = 0B; MEM[(struct symtab_node *)_55].x_comdat_group = 0B; MEM[(struct symtab_node *)_55].x_section = 0B; *_55.callees = 0B; *_55.callers = 0B; *_55.indirect_calls = 0B; *_55.origin = 0B; *_55.nested = 0B; *_55.next_nested = 0B; *_55.next_sibling_clone = 0B; *_55.prev_sibling_clone = 0B; *_55.clones = 0B; *_55.clone_of = 0B; *_55.call_site_hash = 0B; *_55.former_clone_of = 0B; *_55.simdclone = 0B; *_55.simd_clones = 0B; *_55.ipa_transforms_to_apply.m_vec = 0B; *_55.inlined_to = 0B; *_55.rtl = 0B; *_55.clone.tree_map = 0B; *_55.clone.param_adjustments = 0B; *_55.clone.performed_splits = 0B; *_55.thunk = {}; MEM[(struct profile_count *)_55 + 320B] = 0; *_55.m_uid = _53; *_55.m_summary_id = -1; MEM[(void *)_55 + 328B] = 10000; MEM[(int *)_55 + 336B] = 0; _162 = MEM[(struct cgraph_node *)_55 + 344B]; _37 = _162 & 4286578688; _65 = _37 | 16; MEM[(struct cgraph_node *)_55 + 344B] = _65; _29 = symtab.55_1->cgraph_count; _25 = _29 + 1; symtab.55_1->cgraph_count = _25; ... diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c index c913291c07c..a8d9ddd17dc 100644 --- a/gcc/c-family/c-opts.c +++ b/gcc/c-family/c-opts.c @@ -222,9 +222,7 @@ c_common_init_options (unsigned int decoded_options_count, unsigned int i; struct cpp_callbacks *cb; - g_string_concat_db - = new (ggc_alloc ()) string_concat_db (); - + g_string_concat_db = ggc_new (); parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89, ident_hash, line_table); cb = cpp_get_callbacks (parse_in); diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 7288440708e..0c83215c596 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -3750,7 +3750,7 @@ symbol_table_test::symbol_table_test () { gcc_assert (saved_symtab == NULL); saved_symtab = symtab; - symtab = new (ggc_alloc ()) symbol_table (); + symtab = ggc_new (); } /* Destructor. Restore the old value of symtab. */ diff --git a/gcc/cgraph.h b/gcc/cgraph.h index 9c086fedaef..700c333128c 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -109,6 +109,22 @@ struct GTY((desc ("%h.type"), tag ("SYMTAB_SYMBOL"), public: friend class symbol_table; + /* Default constructor. */ + symtab_node (symtab_type t) + : type (t), resolution (LDPR_UNKNOWN), definition (0), alias (0), + transparent_alias (0), weakref (0), cpp_implicit_alias (0), symver (0), + analyzed (0), writeonly (0), refuse_visibility_changes (0), + externally_visible (0), no_reorder (0), force_output (0), + forced_by_abi (0), unique_name (0), implicit_section (0), + body_removed (0), used_from_other_partition (0), in_other_partition (0), + address_taken (0), in_init_priority_hash (0), need_lto_streaming (0), + offloadable (0), ifunc_resolver (0), order (0), decl (NULL_TREE), + next (NULL), previous (NULL), next_sharing_asm_name (NULL), + previous_sharing_asm_name (NULL), same_comdat_group (NULL), ref_list (), + alias_target (NULL), lto_file_data (NULL), aux (NULL), + x_comdat_group (NULL_TREE), x_section (NULL) + {} + /* Return name. */ const char *name () const; @@ -901,6 +917,25 @@ struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public symtab_node { friend class symbol_table; + /* Default constructor. */ + cgraph_node (int uid) + : symtab_node (SYMTAB_FUNCTION), callees (NULL), callers (NULL), + indirect_calls (NULL), origin (NULL), nested (NULL), next_nested (NULL), + next_sibling_clone (NULL), prev_sibling_clone (NULL), clones (NULL), + clone_of (NULL), call_site_hash (NULL), former_clone_of (NULL), + simdclone (NULL), simd_clones (NULL), ipa_transforms_to_apply (), + inlined_to (NULL), rtl (NULL), clone (), thunk (), count (), + count_materialization_scale (0), profile_id (0), unit_id (0), + tp_first_run (0), used_as_abstract_origin (0), lowered (0), process (0), + frequency (), only_called_at_startup (0), only_called_at_exit (0), + tm_clone (0), dispatcher_function (0), calls_comdat_local (0), + icf_merged (0), nonfreeing_fn (0), merged_comdat (0), + merged_extern_inline (0), parallelized_function (0), split_part (0), + indirect_call_target (0), local (0), versionable (0), + can_change_signature (0), redefined_extern_inline (0), + tm_may_enter_irr (0), ipcp_clone (0), m_uid (uid), m_summary_id (-1) + {} + /* Remove the node from cgraph and all inline clones inlined into it. Skip however removal of FORBIDDEN_NODE and return true if it needs to be removed. This allows to call the function from outer loop walking clone @@ -1877,6 +1912,12 @@ private: struct GTY((tag ("SYMTAB_VARIABLE"))) varpool_node : public symtab_node { + /* Default constructor. */ + varpool_node () + : symtab_node (SYMTAB_VARIABLE), output (0), dynamically_initialized (0), + tls_model (TLS_MODEL_NONE), used_by_single_function (0) + {} + /* Dump given varpool node to F. */ void dump (FILE *f); @@ -2721,16 +2762,9 @@ symbol_table::release_symbol (cgraph_node *node) inline cgraph_node * symbol_table::allocate_cgraph_symbol (void) { - cgraph_node *node; - - node = ggc_cleared_alloc (); - node->type = SYMTAB_FUNCTION; - node->m_summary_id = -1; - node->m_uid = cgraph_max_uid++; - return node; + return new (ggc_alloc ()) cgraph_node (cgraph_max_uid++); } - /* Return first static symbol with definition. */ inline symtab_node * symbol_table::first_symbol (void) diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 1b3d2812152..b80071cad99 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -274,7 +274,7 @@ symtab_node::needed_p (void) /* Head and terminator of the queue of nodes to be processed while building callgraph. */ -static symtab_node symtab_terminator; +static symtab_node symtab_terminator (SYMTAB_SYMBOL); static symtab_node *queued_nodes = &symtab_terminator; /* Add NODE to queue starting at QUEUED_NODES. diff --git a/gcc/ggc.h b/gcc/ggc.h index 6c64caaafb2..11022a36324 100644 --- a/gcc/ggc.h +++ b/gcc/ggc.h @@ -185,6 +185,15 @@ ggc_alloc (ALONE_CXX_MEM_STAT_INFO) PASS_MEM_STAT)); } +/* Allocate GGC memory of type T and call default constructor. */ + +template +inline T * +ggc_new (ALONE_CXX_MEM_STAT_INFO) +{ + return new (ggc_alloc ()) T (); +} + /* GGC allocation function that does not call finalizer for type that have need_finalization_p equal to true. User is responsible for calling of the destructor. */ diff --git a/gcc/toplev.c b/gcc/toplev.c index 059046f40f3..26af9b81fb8 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1243,7 +1243,7 @@ general_init (const char *argv0, bool init_signals) /* Create the passes. */ g->set_passes (new gcc::pass_manager (g)); - symtab = new (ggc_alloc ()) symbol_table (); + symtab = ggc_new (); statistics_early_init (); debuginfo_early_init (); diff --git a/gcc/varpool.c b/gcc/varpool.c index 1a30ae49d54..f313acc51f2 100644 --- a/gcc/varpool.c +++ b/gcc/varpool.c @@ -133,9 +133,8 @@ symbol_table::call_varpool_insertion_hooks (varpool_node *node) varpool_node * varpool_node::create_empty (void) -{ - varpool_node *node = ggc_cleared_alloc (); - node->type = SYMTAB_VARIABLE; +{ + varpool_node *node = ggc_new (); return node; }