From patchwork Thu May 18 20:40:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bernd Edlinger X-Patchwork-Id: 764187 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 3wTNPH4gpwz9s1h for ; Fri, 19 May 2017 06:40:50 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="k5MZQAHZ"; dkim-atps=neutral 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:cc:subject:date:message-id:references:in-reply-to :content-type:mime-version; q=dns; s=default; b=MKQNUTnfHAoWiUIW grWdTd9NH2a954AoACixTNGQYHnK8Fty6F/QRCFIJq17SNmJ8s4ncuC8ZcNQqt0A LwiqcEhmfxrzd+7xKqU/CoA+1VFvRxV/k7yQ6FCTgEv953D2uJ9wzyV7hSroTJQG Hl2SzkVC9cIUGASUFdhqdtZdKVE= 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:cc:subject:date:message-id:references:in-reply-to :content-type:mime-version; s=default; bh=HF7Thjiy4uI4VddFRNvF1O G5WhA=; b=k5MZQAHZROBWAAT3CMMFnbVGHavBwjU/tqIAyBevjZDdVCMuD/4jDG Bf5bDbUHkNrBIaEAP40JavvA+5MHipQNOylMeXIS96Y4jtVFvIv4BKVIt0gjqSHT QK1xkpakGBjqQfC8IAW2EwE0TcH6c71UU7ymrVlKWSd2bwT1X1FRM= Received: (qmail 53113 invoked by alias); 18 May 2017 20:40:34 -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 50364 invoked by uid 89); 18 May 2017 20:40:32 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-15.4 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: EUR02-VE1-obe.outbound.protection.outlook.com Received: from mail-oln040092069062.outbound.protection.outlook.com (HELO EUR02-VE1-obe.outbound.protection.outlook.com) (40.92.69.62) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 18 May 2017 20:40:29 +0000 Received: from AM5EUR02FT008.eop-EUR02.prod.protection.outlook.com (10.152.8.57) by AM5EUR02HT098.eop-EUR02.prod.protection.outlook.com (10.152.9.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.1075.5; Thu, 18 May 2017 20:40:29 +0000 Received: from AM4PR0701MB2162.eurprd07.prod.outlook.com (10.152.8.57) by AM5EUR02FT008.mail.protection.outlook.com (10.152.8.69) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1075.5 via Frontend Transport; Thu, 18 May 2017 20:40:29 +0000 Received: from AM4PR0701MB2162.eurprd07.prod.outlook.com ([fe80::55fc:f172:98b5:d2bc]) by AM4PR0701MB2162.eurprd07.prod.outlook.com ([fe80::55fc:f172:98b5:d2bc%19]) with mapi id 15.01.1101.019; Thu, 18 May 2017 20:40:29 +0000 From: Bernd Edlinger To: Richard Biener , "gcc-patches@gcc.gnu.org" CC: Jakub Jelinek , Jeff Law , "Nathan Sidwell" , Jason Merrill Subject: [PATCH] Try harder to fix recently introduced crashes in ggc_collect Date: Thu, 18 May 2017 20:40:29 +0000 Message-ID: References: <381BC021-5087-40F5-B517-8EB0239900B2@suse.de> In-Reply-To: <381BC021-5087-40F5-B517-8EB0239900B2@suse.de> authentication-results: suse.de; dkim=none (message not signed) header.d=none; suse.de; dmarc=none action=none header.from=hotmail.de; x-incomingtopheadermarker: OriginalChecksum:055587822BC29A93486A88E540CC7532F576E62B48AB9F0C71E2D35BCCC863FB; UpperCasedChecksum:DD65E13F36C2BB6DA5A23A8C2533FAE5EC11EBA4620F4BC873E4FC5E3A00CCE8; SizeAsReceived:8397; Count:43 x-ms-exchange-messagesentrepresentingtype: 1 x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; AM5EUR02HT098; 5:mnXdpDMOdtrM6w/gGqJb4ZX0ANig9UZmVZ3K3VAqDQw0LZddX4lBJREjFOiy3S7s0FPlUBOZyKtTQ+9/HwHKwoq/WbL5zdoc/oZjQARiOjdtyudpQtygTXiSc8JKLEPkBx8ot/zFA3OtRKk18LkQDQ==; 24:+SAchAMB0PlCcgY2wdMIRX93fwB4rQTTt/5fWfDFHJsVnD9elmmZQ2d+UBrUT+mMto7EDIwnAg3p3VALky4Uk3mZ5W3eNNts0vHuvaEKZcA=; 7:R/B/Ymg+PlFeyHVlDjWlUvioxMsSLFIFtY+vNodS4tuHqp5gfsy1e1T0QCuwmMsQ6FYfgfhsUC6MmV484ysLMIh/V50ILJiN8y69FN57SIcwNYmDxAulkFYIHaZtw777PfIgOpbV0+TcHNDjVqMdecVxk8vCd3ffZNnx2D/TOu4ED8PkVLwriFsASmap82W2/mBqBbGaIrNiooMUH3xZVqO87dZau+S1CrpaGB2i/sze5QX3JlejNooD8EafqqvL3VVd7FEss+XhED51qwkahl7IrdfUJgWxWBGP0nc0yc/ps8lRnVLNmU+LpCwwTWuI x-incomingheadercount: 43 x-eopattributedmessage: 0 x-forefront-antispam-report: EFV:NLI; SFV:NSPM; SFS:(7070007)(98901004); DIR:OUT; SFP:1901; SCL:1; SRVR:AM5EUR02HT098; H:AM4PR0701MB2162.eurprd07.prod.outlook.com; FPR:; SPF:None; LANG:en; x-ms-office365-filtering-correlation-id: 977bfa00-4550-4225-2de7-08d49e2e1e00 x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(201702061074)(5061506573)(5061507331)(1603103135)(2017031320274)(2017031324274)(2017031323274)(2017031322274)(1601125374)(1603101448)(1701031045); SRVR:AM5EUR02HT098; x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(444000031); SRVR:AM5EUR02HT098; BCL:0; PCL:0; RULEID:; SRVR:AM5EUR02HT098; x-forefront-prvs: 0311124FA9 spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-originalarrivaltime: 18 May 2017 20:40:29.2179 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Internet X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5EUR02HT098 Hi, unfortunately the first patch was still insufficient. I identified many more relatively new places where static tree objects are invisible to GC. Nathan, whatever you are doing, please do it a bit more slowly, thanks. Bootstrap and reg-testing on x86_64-pc-linux-gnu in progress. Is it OK after successful reg-testing? Thanks Bernd. On 05/18/17 17:33, Richard Biener wrote: > On May 18, 2017 5:15:43 PM GMT+02:00, Bernd Edlinger wrote: >> Hi, >> >> >> this attempts to fix occasional segmentation faults that are present in >> the current snapshot, while previous snapshot was stable. >> >> I observed numerous crashes but all were non-reproducible, >> like the following example: >> >> In file included from >> /home/ed/gnu/gcc-build-1/x86_64-pc-linux-gnu/libstdc++-v3/include/string:52:0, >> from >> /home/ed/gnu/gcc-8-20170514-1/gcc/testsuite/g++.dg/asan/asan_test_config.h:19, >> from >> /home/ed/gnu/gcc-8-20170514-1/gcc/testsuite/g++.dg/asan/asan_test_utils.h:17, >> from >> /home/ed/gnu/gcc-8-20170514-1/gcc/testsuite/g++.dg/asan/asan_globals_test.cc:12, >> from >> /home/ed/gnu/gcc-8-20170514-1/gcc/testsuite/g++.dg/asan/asan_globals_test-wrapper.cc:2: >> /home/ed/gnu/gcc-build-1/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.h:6277:22: >> >> internal compiler error: Segmentation fault >> 0xd7e17f crash_signal >> ../../gcc-8-20170514-1/gcc/toplev.c:337 >> 0x8f23fe ggc_set_mark(void const*) >> ../../gcc-8-20170514-1/gcc/ggc-page.c:1546 >> 0x7e6a5f gt_ggc_mx_lang_tree_node(void*) >> ./gt-cp-tree.h:133 >> 0x7e8c7a gt_ggc_mx_lang_tree_node(void*) >> ./gt-cp-tree.h:235 >> 0x7e8882 gt_ggc_mx_lang_tree_node(void*) >> ./gt-cp-tree.h:365 >> 0x81b26d gt_ggc_mx_cp_binding_level(void*) >> ./gt-cp-name-lookup.h:72 >> 0x7e6d85 gt_ggc_mx_lang_tree_node(void*) >> ./gt-cp-tree.h:648 >> 0x7e8ad2 gt_ggc_mx_lang_tree_node(void*) >> ./gt-cp-tree.h:221 >> 0x7e8eeb gt_ggc_mx_lang_tree_node(void*) >> ./gt-cp-tree.h:337 >> 0x7e8a3c gt_ggc_mx_lang_tree_node(void*) >> ./gt-cp-tree.h:441 >> 0x7e7304 gt_ggc_mx_lang_tree_node(void*) >> ./gt-cp-tree.h:606 >> 0x81b352 gt_ggc_mx_cxx_binding(void*) >> ./gt-cp-name-lookup.h:60 >> 0x7e6d85 gt_ggc_mx_lang_tree_node(void*) >> ./gt-cp-tree.h:648 >> 0x7e8ef5 gt_ggc_mx_lang_tree_node(void*) >> ./gt-cp-tree.h:336 >> 0x7e8a3c gt_ggc_mx_lang_tree_node(void*) >> ./gt-cp-tree.h:441 >> 0xb2edbe void gt_ggc_mx(vec*) >> ../../gcc-8-20170514-1/gcc/vec.h:1110 >> 0xb2edbe gt_ggc_mx_vec_tree_va_gc_(void*) >> /home/ed/gnu/gcc-build-1/gcc/gtype-desc.c:1737 >> 0xac59f5 ggc_mark_root_tab >> ../../gcc-8-20170514-1/gcc/ggc-common.c:77 >> 0xac5c50 ggc_mark_roots() >> ../../gcc-8-20170514-1/gcc/ggc-common.c:94 >> 0x8f2de7 ggc_collect() >> ../../gcc-8-20170514-1/gcc/ggc-page.c:2206 >> Please submit a full bug report, >> with preprocessed source if appropriate. >> Please include the complete backtrace with any bug report. >> >> >> The following patch fixes one rather suspicious static tree >> object that did not have the GTY attribute, and was therefore >> apparently not in the GC root set. >> >> >> Bootstrapped and reg-tested on x86_64-pc-linux-gnu. >> Is it OK for trunk? > > OK. > > Richard. > >> >> Thanks >> Bernd. > gcc/c-family: 2017-05-18 Bernd Edlinger * c-format.c (hwi, locus): Move out of function scope, add GTY attribute. gcc/cp: 2017-05-18 Bernd Edlinger * config-lang.in (gtfiles): Add c-family/c-format.c, except.c, init.c, lambda.c and friend.c. * class.c (dvirt_fn): Move out of function scope, add GTY attribute. * except.c (fn1-5, throw_fn, rethrow_fn, spec): Likewise. * init.c (fn): Likewise. * lambda.c (ptr_id, max_id): Likewise. * friend.c (global_friend): Add GTY attribute. Index: gcc/c-family/c-format.c =================================================================== --- gcc/c-family/c-format.c (revision 248242) +++ gcc/c-family/c-format.c (working copy) @@ -55,6 +55,8 @@ struct function_format_info /* Initialized in init_dynamic_diag_info. */ static GTY(()) tree local_tree_type_node; +static GTY(()) tree hwi; +static GTY(()) tree locus; static bool decode_format_attr (tree, function_format_info *, int); static int decode_format_type (const char *); @@ -3675,8 +3677,6 @@ find_length_info_modifier_index (const format_leng static void init_dynamic_asm_fprintf_info (void) { - static tree hwi; - if (!hwi) { format_length_info *new_asm_fprintf_length_specs; @@ -3734,8 +3734,6 @@ init_dynamic_asm_fprintf_info (void) static void init_dynamic_gfc_info (void) { - static tree locus; - if (!locus) { static format_char_info *gfc_fci; @@ -3828,8 +3826,6 @@ init_dynamic_diag_info (void) local_tree_type_node = void_type_node; } - static tree hwi; - if (!hwi) { static format_length_info *diag_ls; Index: gcc/cp/class.c =================================================================== --- gcc/cp/class.c (revision 248242) +++ gcc/cp/class.c (working copy) @@ -9541,6 +9541,7 @@ dfs_accumulate_vtbl_inits (tree binfo, } static GTY(()) tree abort_fndecl_addr; +static GTY(()) tree dvirt_fn; /* Construct the initializer for BINFO's virtual function table. BINFO is part of the hierarchy dominated by T. If we're building a @@ -9714,8 +9715,6 @@ build_vtbl_initializer (tree binfo, /* Likewise for deleted virtuals. */ else if (DECL_DELETED_FN (fn_original)) { - static tree dvirt_fn; - if (!dvirt_fn) { tree name = get_identifier ("__cxa_deleted_virtual"); Index: gcc/cp/config-lang.in =================================================================== --- gcc/cp/config-lang.in (revision 248242) +++ gcc/cp/config-lang.in (working copy) @@ -29,4 +29,4 @@ compilers="cc1plus\$(exeext)" target_libs="target-libstdc++-v3" -gtfiles="\$(srcdir)/cp/rtti.c \$(srcdir)/cp/mangle.c \$(srcdir)/cp/name-lookup.h \$(srcdir)/cp/name-lookup.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.h \$(srcdir)/cp/call.c \$(srcdir)/cp/decl.c \$(srcdir)/cp/decl2.c \$(srcdir)/cp/pt.c \$(srcdir)/cp/repo.c \$(srcdir)/cp/semantics.c \$(srcdir)/cp/tree.c \$(srcdir)/cp/parser.h \$(srcdir)/cp/parser.c \$(srcdir)/cp/method.c \$(srcdir)/cp/typeck2.c \$(srcdir)/c-family/c-common.c \$(srcdir)/c-family/c-common.h \$(srcdir)/c-family/c-objc.h \$(srcdir)/c-family/c-lex.c \$(srcdir)/c-family/c-pragma.h \$(srcdir)/c-family/c-pragma.c \$(srcdir)/cp/class.c \$(srcdir)/cp/cp-objcp-common.c \$(srcdir)/cp/cp-lang.c \$(srcdir)/cp/except.c \$(srcdir)/cp/vtable-class-hierarchy.c \$(srcdir)/cp/constexpr.c \$(srcdir)/cp/cp-gimplify.c" +gtfiles="\$(srcdir)/cp/rtti.c \$(srcdir)/cp/mangle.c \$(srcdir)/cp/name-lookup.h \$(srcdir)/cp/name-lookup.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.h \$(srcdir)/cp/call.c \$(srcdir)/cp/decl.c \$(srcdir)/cp/decl2.c \$(srcdir)/cp/pt.c \$(srcdir)/cp/repo.c \$(srcdir)/cp/semantics.c \$(srcdir)/cp/tree.c \$(srcdir)/cp/parser.h \$(srcdir)/cp/parser.c \$(srcdir)/cp/method.c \$(srcdir)/cp/typeck2.c \$(srcdir)/c-family/c-common.c \$(srcdir)/c-family/c-common.h \$(srcdir)/c-family/c-objc.h \$(srcdir)/c-family/c-lex.c \$(srcdir)/c-family/c-pragma.h \$(srcdir)/c-family/c-pragma.c \$(srcdir)/c-family/c-format.c \$(srcdir)/cp/class.c \$(srcdir)/cp/cp-objcp-common.c \$(srcdir)/cp/cp-lang.c \$(srcdir)/cp/except.c \$(srcdir)/cp/vtable-class-hierarchy.c \$(srcdir)/cp/constexpr.c \$(srcdir)/cp/cp-gimplify.c \$(srcdir)/cp/init.c \$(srcdir)/cp/friend.c \$(srcdir)/cp/lambda.c" Index: gcc/cp/except.c =================================================================== --- gcc/cp/except.c (revision 248242) +++ gcc/cp/except.c (working copy) @@ -42,6 +42,15 @@ static int complete_ptr_ref_or_void_ptr_p (tree, t static bool is_admissible_throw_operand_or_catch_parameter (tree, bool); static int can_convert_eh (tree, tree); +static GTY(()) tree fn1; +static GTY(()) tree fn2; +static GTY(()) tree fn3; +static GTY(()) tree fn4; +static GTY(()) tree fn5; +static GTY(()) tree throw_fn; +static GTY(()) tree rethrow_fn; +static GTY(()) tree spec; + /* Sets up all the global eh stuff that needs to be initialized at the start of compilation. */ @@ -154,20 +163,18 @@ declare_library_fn (tree name, tree return_type, t static tree do_get_exception_ptr (void) { - static tree fn; - - if (!fn) + if (!fn1) { tree name = get_identifier ("__cxa_get_exception_ptr"); - fn = IDENTIFIER_GLOBAL_VALUE (name); - if (!fn) + fn1 = IDENTIFIER_GLOBAL_VALUE (name); + if (!fn1) /* Declare void* __cxa_get_exception_ptr (void *) throw(). */ - fn = declare_library_fn + fn1 = declare_library_fn (name, ptr_type_node, ptr_type_node, ECF_NOTHROW | ECF_PURE | ECF_LEAF | ECF_TM_PURE); } - return cp_build_function_call_nary (fn, tf_warning_or_error, + return cp_build_function_call_nary (fn1, tf_warning_or_error, build_exc_ptr (), NULL_TREE); } @@ -177,16 +184,14 @@ do_get_exception_ptr (void) static tree do_begin_catch (void) { - static tree fn; - - if (!fn) + if (!fn2) { - tree name = fn = get_identifier ("__cxa_begin_catch"); - fn = IDENTIFIER_GLOBAL_VALUE (name); - if (!fn) + tree name = get_identifier ("__cxa_begin_catch"); + fn2 = IDENTIFIER_GLOBAL_VALUE (name); + if (!fn2) { /* Declare void* __cxa_begin_catch (void *) throw(). */ - fn = declare_library_fn + fn2 = declare_library_fn (name, ptr_type_node, ptr_type_node, ECF_NOTHROW); /* Create its transactional-memory equivalent. */ @@ -198,12 +203,12 @@ do_begin_catch (void) itm_fn = declare_library_fn (itm_name, ptr_type_node, ptr_type_node, ECF_NOTHROW | ECF_TM_PURE); - record_tm_replacement (fn, itm_fn); + record_tm_replacement (fn2, itm_fn); } } } - return cp_build_function_call_nary (fn, tf_warning_or_error, + return cp_build_function_call_nary (fn2, tf_warning_or_error, build_exc_ptr (), NULL_TREE); } @@ -231,17 +236,15 @@ dtor_nothrow (tree type) static tree do_end_catch (tree type) { - static tree fn; - - if (!fn) + if (!fn3) { tree name = get_identifier ("__cxa_end_catch"); - fn = IDENTIFIER_GLOBAL_VALUE (name); - if (!fn) + fn3 = IDENTIFIER_GLOBAL_VALUE (name); + if (!fn3) { /* Declare void __cxa_end_catch (). This can throw if the destructor for the exception throws. */ - fn = push_void_library_fn (name, void_list_node, 0); + fn3 = push_void_library_fn (name, void_list_node, 0); /* Create its transactional-memory equivalent. */ if (flag_tm) @@ -251,12 +254,12 @@ do_end_catch (tree type) if (!itm_fn) itm_fn = push_void_library_fn (itm_name, void_list_node, ECF_TM_PURE); - record_tm_replacement (fn, itm_fn); + record_tm_replacement (fn3, itm_fn); } } } - tree cleanup = cp_build_function_call_vec (fn, NULL, tf_warning_or_error); + tree cleanup = cp_build_function_call_vec (fn3, NULL, tf_warning_or_error); TREE_NOTHROW (cleanup) = dtor_nothrow (type); return cleanup; @@ -516,17 +519,15 @@ finish_eh_spec_block (tree raw_raises, tree eh_spe static tree do_allocate_exception (tree type) { - static tree fn; - - if (!fn) + if (!fn4) { tree name = get_identifier ("__cxa_allocate_exception"); - fn = IDENTIFIER_GLOBAL_VALUE (name); - if (!fn) + fn4 = IDENTIFIER_GLOBAL_VALUE (name); + if (!fn4) { /* Declare void *__cxa_allocate_exception(size_t) throw(). */ - fn = declare_library_fn (name, ptr_type_node, size_type_node, - ECF_NOTHROW | ECF_MALLOC); + fn4 = declare_library_fn (name, ptr_type_node, size_type_node, + ECF_NOTHROW | ECF_MALLOC); if (flag_tm) { @@ -536,12 +537,12 @@ do_allocate_exception (tree type) itm_fn = declare_library_fn (itm_name, ptr_type_node, size_type_node, ECF_NOTHROW | ECF_MALLOC | ECF_TM_PURE); - record_tm_replacement (fn, itm_fn); + record_tm_replacement (fn4, itm_fn); } } } - return cp_build_function_call_nary (fn, tf_warning_or_error, + return cp_build_function_call_nary (fn4, tf_warning_or_error, size_in_bytes (type), NULL_TREE); } @@ -551,17 +552,15 @@ do_allocate_exception (tree type) static tree do_free_exception (tree ptr) { - static tree fn; - - if (!fn) + if (!fn5) { tree name = get_identifier ("__cxa_free_exception"); - fn = IDENTIFIER_GLOBAL_VALUE (name); - if (!fn) + fn5 = IDENTIFIER_GLOBAL_VALUE (name); + if (!fn5) { /* Declare void __cxa_free_exception (void *) throw(). */ - fn = declare_library_fn (name, void_type_node, ptr_type_node, - ECF_NOTHROW | ECF_LEAF); + fn5 = declare_library_fn (name, void_type_node, ptr_type_node, + ECF_NOTHROW | ECF_LEAF); if (flag_tm) { @@ -571,12 +570,12 @@ do_free_exception (tree ptr) itm_fn = declare_library_fn (itm_name, void_type_node, ptr_type_node, ECF_NOTHROW | ECF_LEAF | ECF_TM_PURE); - record_tm_replacement (fn, itm_fn); + record_tm_replacement (fn5, itm_fn); } } } - return cp_build_function_call_nary (fn, tf_warning_or_error, ptr, NULL_TREE); + return cp_build_function_call_nary (fn5, tf_warning_or_error, ptr, NULL_TREE); } /* Wrap all cleanups for TARGET_EXPRs in MUST_NOT_THROW_EXPR. @@ -640,7 +639,6 @@ build_throw (tree exp) if (exp) { - static tree throw_fn; tree throw_type; tree temp_type; tree cleanup; @@ -793,8 +791,6 @@ build_throw (tree exp) else { /* Rethrow current exception. */ - static tree rethrow_fn; - if (!rethrow_fn) { tree name = get_identifier ("__cxa_rethrow"); @@ -1261,7 +1257,6 @@ build_noexcept_spec (tree expr, int complain) tree unevaluated_noexcept_spec (void) { - static tree spec; if (spec == NULL_TREE) spec = build_noexcept_spec (make_node (DEFERRED_NOEXCEPT), tf_none); return spec; Index: gcc/cp/friend.c =================================================================== --- gcc/cp/friend.c (revision 248242) +++ gcc/cp/friend.c (working copy) @@ -32,7 +32,7 @@ along with GCC; see the file COPYING3. If not see template overload resolution results when accessibility matters (e.g. tests for an accessible member). */ -static tree global_friend; +static GTY(()) tree global_friend; /* Set the GLOBAL_FRIEND for this compilation session. It might be set multiple times, but always to the same scope. */ @@ -668,3 +668,5 @@ do_friend (tree ctype, tree declarator, tree decl, return decl; } + +#include "gt-cp-friend.h" Index: gcc/cp/init.c =================================================================== --- gcc/cp/init.c (revision 248242) +++ gcc/cp/init.c (working copy) @@ -46,6 +46,8 @@ static tree dfs_initialize_vtbl_ptrs (tree, void * static tree build_field_list (tree, tree, int *); static int diagnose_uninitialized_cst_or_ref_member_1 (tree, tree, bool, bool); +static GTY(()) tree fn; + /* We are about to generate some complex initialization code. Conceptually, it is all a single expression. However, we may want to include conditionals, loops, and other such statement-level @@ -2402,7 +2404,6 @@ diagnose_uninitialized_cst_or_ref_member (tree typ tree throw_bad_array_new_length (void) { - static tree fn; if (!fn) { tree name = get_identifier ("__cxa_throw_bad_array_new_length"); @@ -4911,3 +4912,5 @@ build_vec_delete (tree base, tree maxindex, return rval; } + +#include "gt-cp-init.h" Index: gcc/cp/lambda.c =================================================================== --- gcc/cp/lambda.c (revision 248242) +++ gcc/cp/lambda.c (working copy) @@ -427,6 +427,9 @@ build_capture_proxy (tree member) return var; } +static GTY(()) tree ptr_id; +static GTY(()) tree max_id; + /* Return a struct containing a pointer and a length for lambda capture of an array of runtime length. */ @@ -433,7 +436,6 @@ build_capture_proxy (tree member) static tree vla_capture_type (tree array_type) { - static tree ptr_id, max_id; tree type = xref_tag (record_type, make_anon_name (), ts_current, false); xref_basetypes (type, NULL_TREE); type = begin_class_definition (type); @@ -1248,3 +1250,5 @@ is_lambda_ignored_entity (tree val) return false; } + +#include "gt-cp-lambda.h" Index: gcc/cp/typeck.c =================================================================== --- gcc/cp/typeck.c (revision 248242) +++ gcc/cp/typeck.c (working copy) @@ -4366,6 +4366,29 @@ cp_build_binary_op (location_t location, case FLOOR_DIV_EXPR: case ROUND_DIV_EXPR: case EXACT_DIV_EXPR: + if (TREE_CODE (op0) == SIZEOF_EXPR && TREE_CODE (op1) == SIZEOF_EXPR) + { + tree type0 = TREE_OPERAND (op0, 0); + tree type1 = TREE_OPERAND (op1, 0); + tree first_arg = type0; + if (!TYPE_P (type0)) + type0 = TREE_TYPE (type0); + if (!TYPE_P (type1)) + type1 = TREE_TYPE (type1); + if (POINTER_TYPE_P (type0) && same_type_p (TREE_TYPE (type0), type1) + && !(TREE_CODE (first_arg) == PARM_DECL + && DECL_ARRAY_PARAMETER_P (first_arg) + && warn_sizeof_array_argument) + && (complain & tf_warning)) + if (warning_at (location, OPT_Wsizeof_pointer_div, + "division % does " + "not compute the number of array elements", + type0, type1)) + if (DECL_P (first_arg)) + inform (DECL_SOURCE_LOCATION (first_arg), + "first % operand was declared here"); + } + if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE || code0 == VECTOR_TYPE) && (code1 == INTEGER_TYPE || code1 == REAL_TYPE