From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ed1-x52a.google.com (mail-ed1-x52a.google.com [IPv6:2a00:1450:4864:20::52a]) by sourceware.org (Postfix) with ESMTPS id E07E5385E44A for ; Wed, 14 Jul 2021 11:28:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E07E5385E44A Received: by mail-ed1-x52a.google.com with SMTP id t3so2609200edc.7 for ; Wed, 14 Jul 2021 04:28:06 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=Y07HblSXragyOXAVDcMBuF/i5lr61lcMHyTUzuNArbA=; b=DRINQoibm0QTQPd+awEVt9BsmUc7SNp1N2udkPA1vXbxWUEA0+lgEnMb/h/9DihC8i Tx02v+YwtHQ+6MN8jZOPgiKCMp+blXhzSil/cC03Zbm4Cn1UgAXkY5fjW5vE7Yw2Tzee PsQ03VZotNH8lFXgQFEp1zkjxHG577qDgBHPBWBikZE8HdHWBfH6M//P/uNqVN0DNwHe aeMvbZ1LCBYyJckUUeOGr0Xgztt+gVv2MNAVkD7YhIloB5Oh9c5nmSvffuIhWSC8zvoM uxIcnO+G4ygojvr7bo5Qs9NDTHAJkQINKnP/tikyFSTLmHg9Y6L3PbgH+JtqGi8+vX+U C1fg== X-Gm-Message-State: AOAM530tJiXjOm1AeSLIZY92Rbx2f01yCCHJk6Bys3J9zDyNvcKHkvyD 9SpqjcoHac7WLnD75q+r1RX6JeBVAgvbME9IErY= X-Google-Smtp-Source: ABdhPJyHV0r4/M7CFUfjxdPo7rWy9K39Quu2a7phmvIkNK7Gij7+suMDaHE4fZ/WLXpp0erjD2EDVqrPsHqhNfZ9eJk= X-Received: by 2002:a05:6402:3d4:: with SMTP id t20mr12968323edw.274.1626262085891; Wed, 14 Jul 2021 04:28:05 -0700 (PDT) MIME-Version: 1.0 References: <20210714081827.12185-1-tbsaunde@tbsaunde.org> In-Reply-To: <20210714081827.12185-1-tbsaunde@tbsaunde.org> From: Richard Biener Date: Wed, 14 Jul 2021 13:27:54 +0200 Message-ID: Subject: Re: [PATCH 1/4] force decls to be allocated through build_decl to initialize them To: Trevor Saunders Cc: GCC Patches Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-8.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, URIBL_SBL_A autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 14 Jul 2021 11:28:10 -0000 On Wed, Jul 14, 2021 at 10:20 AM Trevor Saunders wrote: > > prior to this commit all calls to build_decl used input_location, even if > temporarily until build_decl reset the location to something else that it was > told was the proper location. To avoid using the global we need the caller to > pass in the location it wants, however that's not possible with make_node since > it makes other types of nodes. So we force all callers who wish to make a decl > to go through build_decl which already takes a location argument. To avoid > changing behavior this just explicitly passes in input_location to build_decl > for callers of make_node that create a decl, however it would seem in many of > these cases that the location of the decl being coppied might be a better > location. > > bootstrapped and regtested on x86_64-linux-gnu, ok? I think all eventually DECL_ARTIFICIAL decls should better use UNKNOWN_LOCATION instead of input_location. I'm not sure if I like the (transitional) extra arg to make_node, I suppose we could hide make_node by declaring it in tree-raw.h or so or by guarding the decl with NEED_MAKE_NODE. There's nothing inherently wrong with calling make_node. So what I mean with transitional is that with this change we should simply set the location to UNKNOWN_LOCATION (aka zero, which it already is), not input_location, in make_node. Richard. > Trev > > gcc/ChangeLog: > > * cfgexpand.c (avoid_deep_ter_for_debug): Call build_decl not > make_node. > (expand_gimple_basic_block): Likewise. > * ipa-param-manipulation.c (ipa_param_adjustments::modify_call): > * Likewise. > (ipa_param_body_adjustments::reset_debug_stmts): Likewise. > * omp-simd-clone.c (ipa_simd_modify_stmt_ops): Likewise. > * stor-layout.c (start_bitfield_representative): Likewise. > * tree-inline.c (remap_ssa_name): Likewise. > (tree_function_versioning): Likewise. > * tree-into-ssa.c (rewrite_debug_stmt_uses): Likewise. > * tree-nested.c (lookup_field_for_decl): Likewise. > (get_chain_field): Likewise. > (create_field_for_decl): Likewise. > (get_nl_goto_field): Likewise. > (finalize_nesting_tree_1): Likewise. > * tree-ssa-ccp.c (optimize_atomic_bit_test_and): Likewise. > * tree-ssa-loop-ivopts.c (remove_unused_ivs): Likewise. > * tree-ssa-phiopt.c (spaceship_replacement): Likewise. > * tree-ssa-reassoc.c (make_new_ssa_for_def): Likewise. > * tree-ssa.c (insert_debug_temp_for_var_def): Likewise. > * tree-streamer-in.c (streamer_alloc_tree): Adjust. > * tree.c (make_node): Add argument to specify the caller. > (build_decl): Move initialization from make_node. > * tree.h (enum make_node_caller): new enum. > (make_node): Adjust prototype. > * varasm.c (make_debug_expr_from_rtl): call build_decl. > > gcc/cp/ChangeLog: > > * constraint.cc (build_type_constraint): Call build_decl not make_node. > * cp-gimplify.c (cp_genericize_r): Likewise. > * parser.c (cp_parser_introduction_list): Likewise. > * module.cc (trees_in::start): Adjust. > > gcc/fortran/ChangeLog: > > * trans-decl.c (generate_namelist_decl): Call build_decl not make_node. > * trans-types.c (gfc_get_array_descr_info): Likewise. > > gcc/objc/ChangeLog: > > * objc-act.c (objc_add_property_declaration): Call build_decl not > make_node. > (maybe_make_artificial_property_decl): Likewise. > (objc_build_keyword_decl): Likewise. > (build_method_decl): Likewise. > --- > gcc/cfgexpand.c | 8 ++++---- > gcc/cp/constraint.cc | 2 +- > gcc/cp/cp-gimplify.c | 5 +++-- > gcc/cp/module.cc | 2 +- > gcc/cp/parser.c | 6 ++---- > gcc/fortran/trans-decl.c | 5 ++--- > gcc/fortran/trans-types.c | 4 ++-- > gcc/ipa-param-manipulation.c | 8 ++++---- > gcc/objc/objc-act.c | 16 ++++++---------- > gcc/omp-simd-clone.c | 4 ++-- > gcc/stor-layout.c | 2 +- > gcc/tree-inline.c | 13 +++++++------ > gcc/tree-into-ssa.c | 4 ++-- > gcc/tree-nested.c | 24 ++++++++++-------------- > gcc/tree-ssa-ccp.c | 4 ++-- > gcc/tree-ssa-loop-ivopts.c | 4 ++-- > gcc/tree-ssa-phiopt.c | 8 ++++---- > gcc/tree-ssa-reassoc.c | 4 ++-- > gcc/tree-ssa.c | 4 ++-- > gcc/tree-streamer-in.c | 2 +- > gcc/tree.c | 35 ++++++++++++++++++----------------- > gcc/tree.h | 13 ++++++++++++- > gcc/varasm.c | 12 ++++++------ > 23 files changed, 96 insertions(+), 93 deletions(-) > > diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c > index 3edd53c37dc..fea8c837c80 100644 > --- a/gcc/cfgexpand.c > +++ b/gcc/cfgexpand.c > @@ -4342,10 +4342,10 @@ avoid_deep_ter_for_debug (gimple *stmt, int depth) > tree &vexpr = deep_ter_debug_map->get_or_insert (use); > if (vexpr != NULL) > continue; > - vexpr = make_node (DEBUG_EXPR_DECL); > + vexpr = build_decl (input_location, DEBUG_EXPR_DECL, nullptr, > + TREE_TYPE (use)); > gimple *def_temp = gimple_build_debug_bind (vexpr, use, g); > DECL_ARTIFICIAL (vexpr) = 1; > - TREE_TYPE (vexpr) = TREE_TYPE (use); > SET_DECL_MODE (vexpr, TYPE_MODE (TREE_TYPE (use))); > gimple_stmt_iterator gsi = gsi_for_stmt (g); > gsi_insert_after (&gsi, def_temp, GSI_NEW_STMT); > @@ -5899,14 +5899,14 @@ expand_gimple_basic_block (basic_block bb, bool disable_tail_calls) > temporary. */ > gimple *debugstmt; > tree value = gimple_assign_rhs_to_tree (def); > - tree vexpr = make_node (DEBUG_EXPR_DECL); > rtx val; > machine_mode mode; > > set_curr_insn_location (gimple_location (def)); > > + tree vexpr = build_decl (input_location, DEBUG_EXPR_DECL, > + nullptr, TREE_TYPE (value)); > DECL_ARTIFICIAL (vexpr) = 1; > - TREE_TYPE (vexpr) = TREE_TYPE (value); > if (DECL_P (value)) > mode = DECL_MODE (value); > else > diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc > index 4ee5215df50..ae75e5df32b 100644 > --- a/gcc/cp/constraint.cc > +++ b/gcc/cp/constraint.cc > @@ -1464,7 +1464,7 @@ build_concept_id (tree expr) > tree > build_type_constraint (tree decl, tree args, tsubst_flags_t complain) > { > - tree wildcard = build_nt (WILDCARD_DECL); > + tree wildcard = build_decl (input_location, WILDCARD_DECL, nullptr, nullptr); > ++processing_template_decl; > tree check = build_concept_check (decl, wildcard, args, complain); > --processing_template_decl; > diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c > index 00b7772fe0d..d537e547169 100644 > --- a/gcc/cp/cp-gimplify.c > +++ b/gcc/cp/cp-gimplify.c > @@ -1217,8 +1217,9 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data) > /* Omit from the GENERIC, the back-end can't handle it. */; > else > { > - tree using_directive = make_node (IMPORTED_DECL); > - TREE_TYPE (using_directive) = void_type_node; > + tree using_directive = build_decl (input_location, > + IMPORTED_DECL, nullptr, > + void_type_node); > DECL_CONTEXT (using_directive) = current_function_decl; > > IMPORTED_DECL_ASSOCIATED_DECL (using_directive) = decl; > diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc > index ccbde292c22..5c9461ff66b 100644 > --- a/gcc/cp/module.cc > +++ b/gcc/cp/module.cc > @@ -5103,7 +5103,7 @@ trees_in::start (unsigned code) > t = build_vl_exp (tree_code (code), ops); > } > else > - t = make_node (tree_code (code)); > + t = make_node (tree_code (code), MODULE_STREAMER_MKNODE_CALLER); > break; > > case INTEGER_CST: > diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c > index 93698aa14c9..ea7cdb06789 100644 > --- a/gcc/cp/parser.c > +++ b/gcc/cp/parser.c > @@ -17056,10 +17056,8 @@ cp_parser_introduction_list (cp_parser *parser) > break; > > /* Build placeholder. */ > - tree parm = build_nt (WILDCARD_DECL); > - DECL_SOURCE_LOCATION (parm) > - = cp_lexer_peek_token (parser->lexer)->location; > - DECL_NAME (parm) = identifier; > + tree parm = build_decl (cp_lexer_peek_token (parser->lexer)->location, > + WILDCARD_DECL, identifier, nullptr); > WILDCARD_PACK_P (parm) = is_pack; > vec_safe_push (introduction_vec, parm); > > diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c > index a73ce8a3f40..1ec8760037b 100644 > --- a/gcc/fortran/trans-decl.c > +++ b/gcc/fortran/trans-decl.c > @@ -5262,10 +5262,9 @@ generate_namelist_decl (gfc_symbol * sym) > CONSTRUCTOR_APPEND_ELT (nml_decls, NULL_TREE, nml->sym->backend_decl); > } > > - decl = make_node (NAMELIST_DECL); > - TREE_TYPE (decl) = void_type_node; > + decl = build_decl (input_location, NAMELIST_DECL, get_identifier (sym->name), > + void_type_node); > NAMELIST_DECL_ASSOCIATED_DECL (decl) = build_constructor (NULL_TREE, nml_decls); > - DECL_NAME (decl) = get_identifier (sym->name); > return decl; > } > > diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c > index d715838a046..9ca288df962 100644 > --- a/gcc/fortran/trans-types.c > +++ b/gcc/fortran/trans-types.c > @@ -3417,9 +3417,9 @@ gfc_get_array_descr_info (const_tree type, struct array_descr_info *info) > base_decl = GFC_TYPE_ARRAY_BASE_DECL (type, indirect); > if (!base_decl) > { > - base_decl = make_node (DEBUG_EXPR_DECL); > + base_decl = build_decl (input_location, DEBUG_EXPR_DECL, nullptr, > + indirect ? build_pointer_type (ptype) : ptype); > DECL_ARTIFICIAL (base_decl) = 1; > - TREE_TYPE (base_decl) = indirect ? build_pointer_type (ptype) : ptype; > SET_DECL_MODE (base_decl, TYPE_MODE (TREE_TYPE (base_decl))); > GFC_TYPE_ARRAY_BASE_DECL (type, indirect) = base_decl; > } > diff --git a/gcc/ipa-param-manipulation.c b/gcc/ipa-param-manipulation.c > index 26b02d7aa95..ac72b7e4de8 100644 > --- a/gcc/ipa-param-manipulation.c > +++ b/gcc/ipa-param-manipulation.c > @@ -829,9 +829,9 @@ ipa_param_adjustments::modify_call (cgraph_edge *cs, > } > if (ddecl == NULL) > { > - ddecl = make_node (DEBUG_EXPR_DECL); > + ddecl = build_decl (input_location, DEBUG_EXPR_DECL, nullptr, > + TREE_TYPE (origin)); > DECL_ARTIFICIAL (ddecl) = 1; > - TREE_TYPE (ddecl) = TREE_TYPE (origin); > SET_DECL_MODE (ddecl, DECL_MODE (origin)); > > vec_safe_push (*debug_args, origin); > @@ -2055,10 +2055,10 @@ ipa_param_body_adjustments::reset_debug_stmts () > gcc_assert (is_gimple_debug (stmt)); > if (vexpr == NULL && gsip != NULL) > { > - vexpr = make_node (DEBUG_EXPR_DECL); > + vexpr = build_decl (input_location, DEBUG_EXPR_DECL, nullptr, > + TREE_TYPE (name)); > def_temp = gimple_build_debug_source_bind (vexpr, decl, NULL); > DECL_ARTIFICIAL (vexpr) = 1; > - TREE_TYPE (vexpr) = TREE_TYPE (name); > SET_DECL_MODE (vexpr, DECL_MODE (decl)); > gsi_insert_before (gsip, def_temp, GSI_SAME_STMT); > } > diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c > index ec20891152b..9fdfe89ed4d 100644 > --- a/gcc/objc/objc-act.c > +++ b/gcc/objc/objc-act.c > @@ -1295,12 +1295,11 @@ objc_add_property_declaration (location_t location, tree decl, > } > > /* Create a PROPERTY_DECL node. */ > - tree property_decl = make_node (PROPERTY_DECL); > + tree property_decl = build_decl (DECL_SOURCE_LOCATION (decl), PROPERTY_DECL, > + nullptr, TREE_TYPE (decl)); > > /* Copy the basic information from the original decl. */ > tree p_type = TREE_TYPE (decl); > - TREE_TYPE (property_decl) = p_type; > - DECL_SOURCE_LOCATION (property_decl) = DECL_SOURCE_LOCATION (decl); > TREE_DEPRECATED (property_decl) = TREE_DEPRECATED (decl); > > /* Add property-specific information. */ > @@ -1434,10 +1433,9 @@ maybe_make_artificial_property_decl (tree interface, tree implementation, > /* Create an artificial property declaration with the > information we collected on the type and getter/setter > names. */ > - property_decl = make_node (PROPERTY_DECL); > + property_decl = build_decl (input_location, PROPERTY_DECL, nullptr, > + type); > > - TREE_TYPE (property_decl) = type; > - DECL_SOURCE_LOCATION (property_decl) = input_location; > TREE_DEPRECATED (property_decl) = 0; > DECL_ARTIFICIAL (property_decl) = 1; > > @@ -4890,9 +4888,8 @@ objc_build_keyword_decl (tree key_name, tree arg_type, > /* If no type is specified, default to "id". */ > arg_type = adjust_type_for_id_default (arg_type); > > - keyword_decl = make_node (KEYWORD_DECL); > + keyword_decl = build_decl (input_location, KEYWORD_DECL, nullptr, arg_type); > > - TREE_TYPE (keyword_decl) = arg_type; > KEYWORD_ARG_NAME (keyword_decl) = arg_name; > KEYWORD_KEY_NAME (keyword_decl) = key_name; > DECL_ATTRIBUTES (keyword_decl) = attributes; > @@ -4976,8 +4973,7 @@ build_method_decl (enum tree_code code, tree ret_type, tree selector, > type of the method. We may want to change this, and store the > entire function type in there (eg, it may be used to simplify > dealing with attributes below). */ > - method_decl = make_node (code); > - TREE_TYPE (method_decl) = ret_type; > + method_decl = build_decl (input_location, code, nullptr, ret_type); > > /* If we have a keyword selector, create an identifier_node that > represents the full selector name (`:' included)... */ > diff --git a/gcc/omp-simd-clone.c b/gcc/omp-simd-clone.c > index b772b7ff520..03189f4c50f 100644 > --- a/gcc/omp-simd-clone.c > +++ b/gcc/omp-simd-clone.c > @@ -910,10 +910,10 @@ ipa_simd_modify_stmt_ops (tree *tp, int *walk_subtrees, void *data) > gimple *stmt; > if (is_gimple_debug (info->stmt)) > { > - tree vexpr = make_node (DEBUG_EXPR_DECL); > + tree vexpr = build_decl (input_location, DEBUG_EXPR_DECL, nullptr, > + TREE_TYPE (repl)); > stmt = gimple_build_debug_source_bind (vexpr, repl, NULL); > DECL_ARTIFICIAL (vexpr) = 1; > - TREE_TYPE (vexpr) = TREE_TYPE (repl); > SET_DECL_MODE (vexpr, TYPE_MODE (TREE_TYPE (repl))); > repl = vexpr; > } > diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c > index 242452f2acf..7811fc6c302 100644 > --- a/gcc/stor-layout.c > +++ b/gcc/stor-layout.c > @@ -2024,7 +2024,7 @@ finalize_type_size (tree type) > static tree > start_bitfield_representative (tree field) > { > - tree repr = make_node (FIELD_DECL); > + tree repr = build_decl (input_location, FIELD_DECL, nullptr, nullptr); > DECL_FIELD_OFFSET (repr) = DECL_FIELD_OFFSET (field); > /* Force the representative to begin at a BITS_PER_UNIT aligned > boundary - C++ may use tail-padding of a base object to > diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c > index f605e763f4a..8d104408156 100644 > --- a/gcc/tree-inline.c > +++ b/gcc/tree-inline.c > @@ -193,7 +193,6 @@ remap_ssa_name (tree name, copy_body_data *id) > && id->entry_bb == NULL > && single_succ_p (ENTRY_BLOCK_PTR_FOR_FN (cfun))) > { > - tree vexpr = make_node (DEBUG_EXPR_DECL); > gimple *def_temp; > gimple_stmt_iterator gsi; > tree val = SSA_NAME_VAR (name); > @@ -210,9 +209,11 @@ remap_ssa_name (tree name, copy_body_data *id) > n = id->decl_map->get (val); > if (n && TREE_CODE (*n) == DEBUG_EXPR_DECL) > return *n; > + > + tree vexpr = build_decl (input_location, DEBUG_EXPR_DECL, nullptr, > + TREE_TYPE (name)); > def_temp = gimple_build_debug_source_bind (vexpr, val, NULL); > DECL_ARTIFICIAL (vexpr) = 1; > - TREE_TYPE (vexpr) = TREE_TYPE (name); > SET_DECL_MODE (vexpr, DECL_MODE (SSA_NAME_VAR (name))); > gsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun))); > gsi_insert_before (&gsi, def_temp, GSI_SAME_STMT); > @@ -6411,9 +6412,9 @@ tree_function_versioning (tree old_decl, tree new_decl, > debug_args = decl_debug_args_insert (new_decl); > len = vec_safe_length (*debug_args); > } > - ddecl = make_node (DEBUG_EXPR_DECL); > + ddecl = build_decl (input_location, DEBUG_EXPR_DECL, nullptr, > + TREE_TYPE (parm)); > DECL_ARTIFICIAL (ddecl) = 1; > - TREE_TYPE (ddecl) = TREE_TYPE (parm); > SET_DECL_MODE (ddecl, DECL_MODE (parm)); > vec_safe_push (*debug_args, DECL_ORIGIN (parm)); > vec_safe_push (*debug_args, ddecl); > @@ -6442,10 +6443,10 @@ tree_function_versioning (tree old_decl, tree new_decl, > var = TREE_CHAIN (var); > if (var == NULL_TREE) > break; > - vexpr = make_node (DEBUG_EXPR_DECL); > tree parm = (**debug_args)[i]; > + vexpr = build_decl (input_location, DEBUG_EXPR_DECL, nullptr, > + TREE_TYPE (parm)); > DECL_ARTIFICIAL (vexpr) = 1; > - TREE_TYPE (vexpr) = TREE_TYPE (parm); > SET_DECL_MODE (vexpr, DECL_MODE (parm)); > def_temp = gimple_build_debug_bind (var, vexpr, NULL); > gsi_insert_before (&cgsi, def_temp, GSI_NEW_STMT); > diff --git a/gcc/tree-into-ssa.c b/gcc/tree-into-ssa.c > index 8045e34df26..f9933305957 100644 > --- a/gcc/tree-into-ssa.c > +++ b/gcc/tree-into-ssa.c > @@ -1284,10 +1284,10 @@ rewrite_debug_stmt_uses (gimple *stmt) > if (def == NULL_TREE) > { > gimple *def_temp; > - def = make_node (DEBUG_EXPR_DECL); > + def = build_decl (input_location, DEBUG_EXPR_DECL, nullptr, > + TREE_TYPE (var)); > def_temp = gimple_build_debug_source_bind (def, var, NULL); > DECL_ARTIFICIAL (def) = 1; > - TREE_TYPE (def) = TREE_TYPE (var); > SET_DECL_MODE (def, DECL_MODE (var)); > gsi = > gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun))); > diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c > index 9edd922a303..37e229477ec 100644 > --- a/gcc/tree-nested.c > +++ b/gcc/tree-nested.c > @@ -394,8 +394,8 @@ lookup_field_for_decl (struct nesting_info *info, tree decl, > if (!*slot) > { > tree type = get_frame_type (info); > - tree field = make_node (FIELD_DECL); > - DECL_NAME (field) = DECL_NAME (decl); > + tree field = build_decl (input_location, FIELD_DECL, DECL_NAME (decl), > + nullptr); > > if (use_pointer_in_frame (decl)) > { > @@ -510,9 +510,8 @@ get_chain_field (struct nesting_info *info) > { > tree type = build_pointer_type (get_frame_type (info->outer)); > > - field = make_node (FIELD_DECL); > - DECL_NAME (field) = get_identifier ("__chain"); > - TREE_TYPE (field) = type; > + field = build_decl (input_location, FIELD_DECL, > + get_identifier ("__chain"), type); > SET_DECL_ALIGN (field, TYPE_ALIGN (type)); > DECL_NONADDRESSABLE_P (field) = 1; > > @@ -694,9 +693,7 @@ lookup_element_for_decl (struct nesting_info *info, tree decl, > static tree > create_field_for_decl (struct nesting_info *info, tree decl, tree type) > { > - tree field = make_node (FIELD_DECL); > - DECL_NAME (field) = DECL_NAME (decl); > - TREE_TYPE (field) = type; > + tree field = build_decl (input_location, FIELD_DECL, DECL_NAME (decl), type); > TREE_ADDRESSABLE (field) = 1; > insert_field_into_struct (get_frame_type (info), field); > return field; > @@ -783,9 +780,8 @@ get_nl_goto_field (struct nesting_info *info) > type = build_array_type > (type, build_index_type (size_int (size))); > > - field = make_node (FIELD_DECL); > - DECL_NAME (field) = get_identifier ("__nl_goto_buf"); > - TREE_TYPE (field) = type; > + field = build_decl (input_location, FIELD_DECL, > + get_identifier ("__nl_goto_buf"), type); > SET_DECL_ALIGN (field, TYPE_ALIGN (type)); > TREE_ADDRESSABLE (field) = 1; > > @@ -3378,10 +3374,10 @@ finalize_nesting_tree_1 (struct nesting_info *root) > /* Create a field in the FRAME record to hold the frame base address for > this stack frame. Since it will be used only by the debugger, put it > at the end of the record in order not to shift all other offsets. */ > - tree fb_decl = make_node (FIELD_DECL); > + tree fb_decl = build_decl (input_location, FIELD_DECL, > + get_identifier ("FRAME_BASE.PARENT"), > + ptr_type_node); > > - DECL_NAME (fb_decl) = get_identifier ("FRAME_BASE.PARENT"); > - TREE_TYPE (fb_decl) = ptr_type_node; > TREE_ADDRESSABLE (fb_decl) = 1; > DECL_CONTEXT (fb_decl) = root->frame_type; > TYPE_FIELDS (root->frame_type) = chainon (TYPE_FIELDS (root->frame_type), > diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c > index 9ce6214d7e2..533ed1cfd15 100644 > --- a/gcc/tree-ssa-ccp.c > +++ b/gcc/tree-ssa-ccp.c > @@ -3067,9 +3067,9 @@ optimize_atomic_bit_test_and (gimple_stmt_iterator *gsip, > tree temp = NULL_TREE; > if (!throws || after || single_pred_p (e->dest)) > { > - temp = make_node (DEBUG_EXPR_DECL); > + temp = build_decl (input_location, DEBUG_EXPR_DECL, nullptr, > + TREE_TYPE (lhs)); > DECL_ARTIFICIAL (temp) = 1; > - TREE_TYPE (temp) = TREE_TYPE (lhs); > SET_DECL_MODE (temp, TYPE_MODE (TREE_TYPE (lhs))); > tree t = build2 (LSHIFT_EXPR, TREE_TYPE (lhs), new_lhs, bit); > g = gimple_build_debug_bind (temp, t, g); > diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c > index 12a8a49a307..953b3d0b2f1 100644 > --- a/gcc/tree-ssa-loop-ivopts.c > +++ b/gcc/tree-ssa-loop-ivopts.c > @@ -7677,9 +7677,9 @@ remove_unused_ivs (struct ivopts_data *data, bitmap toremove) > comp = unshare_expr (comp); > if (count > 1) > { > - tree vexpr = make_node (DEBUG_EXPR_DECL); > + tree vexpr = build_decl (input_location, DEBUG_EXPR_DECL, > + nullptr, TREE_TYPE (comp)); > DECL_ARTIFICIAL (vexpr) = 1; > - TREE_TYPE (vexpr) = TREE_TYPE (comp); > if (SSA_NAME_VAR (def)) > SET_DECL_MODE (vexpr, DECL_MODE (SSA_NAME_VAR (def))); > else > diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c > index c6adbbd28a0..025977eeff8 100644 > --- a/gcc/tree-ssa-phiopt.c > +++ b/gcc/tree-ssa-phiopt.c > @@ -2430,18 +2430,18 @@ spaceship_replacement (basic_block cond_bb, basic_block middle_bb, > all floating point numbers should be comparable. */ > gimple_stmt_iterator gsi = gsi_after_labels (gimple_bb (phi)); > tree type = TREE_TYPE (phires); > - tree temp1 = make_node (DEBUG_EXPR_DECL); > + tree temp1 = build_decl (input_location, DEBUG_EXPR_DECL, nullptr, > + type); > DECL_ARTIFICIAL (temp1) = 1; > - TREE_TYPE (temp1) = type; > SET_DECL_MODE (temp1, TYPE_MODE (type)); > tree t = build2 (one_cmp, boolean_type_node, lhs1, rhs2); > t = build3 (COND_EXPR, type, t, build_one_cst (type), > build_int_cst (type, -1)); > gimple *g = gimple_build_debug_bind (temp1, t, phi); > gsi_insert_before (&gsi, g, GSI_SAME_STMT); > - tree temp2 = make_node (DEBUG_EXPR_DECL); > + tree temp2 = build_decl (input_location, DEBUG_EXPR_DECL, nullptr, > + type); > DECL_ARTIFICIAL (temp2) = 1; > - TREE_TYPE (temp2) = type; > SET_DECL_MODE (temp2, TYPE_MODE (type)); > t = build2 (EQ_EXPR, boolean_type_node, lhs1, rhs2); > t = build3 (COND_EXPR, type, t, build_zero_cst (type), temp1); > diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c > index 2dd4435b981..48f6117a731 100644 > --- a/gcc/tree-ssa-reassoc.c > +++ b/gcc/tree-ssa-reassoc.c > @@ -1214,14 +1214,14 @@ make_new_ssa_for_def (gimple *stmt, enum tree_code opcode, tree op) > { > if (new_debug_lhs == NULL_TREE) > { > - new_debug_lhs = make_node (DEBUG_EXPR_DECL); > + new_debug_lhs = build_decl (input_location, DEBUG_EXPR_DECL, > + nullptr, TREE_TYPE (lhs)); > gdebug *def_temp > = gimple_build_debug_bind (new_debug_lhs, > build2 (opcode, TREE_TYPE (lhs), > new_lhs, op), > stmt); > DECL_ARTIFICIAL (new_debug_lhs) = 1; > - TREE_TYPE (new_debug_lhs) = TREE_TYPE (lhs); > SET_DECL_MODE (new_debug_lhs, TYPE_MODE (TREE_TYPE (lhs))); > gimple_set_uid (def_temp, gimple_uid (stmt)); > gimple_stmt_iterator gsi = gsi_for_stmt (stmt); > diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c > index 4cc400d3c2e..83caadb37c8 100644 > --- a/gcc/tree-ssa.c > +++ b/gcc/tree-ssa.c > @@ -434,14 +434,14 @@ insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var) > else > { > gdebug *def_temp; > - tree vexpr = make_node (DEBUG_EXPR_DECL); > + tree vexpr = build_decl (input_location, DEBUG_EXPR_DECL, nullptr, > + TREE_TYPE (value)); > > def_temp = gimple_build_debug_bind (vexpr, > unshare_expr (value), > def_stmt); > > DECL_ARTIFICIAL (vexpr) = 1; > - TREE_TYPE (vexpr) = TREE_TYPE (value); > if (DECL_P (value)) > SET_DECL_MODE (vexpr, DECL_MODE (value)); > else > diff --git a/gcc/tree-streamer-in.c b/gcc/tree-streamer-in.c > index e0522bf2ac1..fe95692acc9 100644 > --- a/gcc/tree-streamer-in.c > +++ b/gcc/tree-streamer-in.c > @@ -634,7 +634,7 @@ streamer_alloc_tree (class lto_input_block *ib, class data_in *data_in, > { > /* For all other nodes, materialize the tree with a raw > make_node call. */ > - result = make_node (code); > + result = make_node (code, TREE_STREAMER_MKNODE_CALLER); > } > > return result; > diff --git a/gcc/tree.c b/gcc/tree.c > index 1aa6e557a04..9c5236a280d 100644 > --- a/gcc/tree.c > +++ b/gcc/tree.c > @@ -1175,7 +1175,7 @@ allocate_decl_uid (void) > Achoo! I got a code in the node. */ > > tree > -make_node (enum tree_code code MEM_STAT_DECL) > +make_node (enum tree_code code, make_node_caller caller MEM_STAT_DECL) > { > tree t; > enum tree_code_class type = TREE_CODE_CLASS (code); > @@ -1194,17 +1194,9 @@ make_node (enum tree_code code MEM_STAT_DECL) > break; > > case tcc_declaration: > - if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) > - { > - if (code == FUNCTION_DECL) > - { > - SET_DECL_ALIGN (t, FUNCTION_ALIGNMENT (FUNCTION_BOUNDARY)); > - SET_DECL_MODE (t, FUNCTION_MODE); > - } > - else > - SET_DECL_ALIGN (t, 1); > - } > - DECL_SOURCE_LOCATION (t) = input_location; > + gcc_checking_assert (caller == BUILD_DECL_MKNODE_CALLER > + || caller == TREE_STREAMER_MKNODE_CALLER > + || caller == MODULE_STREAMER_MKNODE_CALLER); > if (TREE_CODE (t) == DEBUG_EXPR_DECL) > DECL_UID (t) = --next_debug_decl_uid; > else > @@ -1212,9 +1204,6 @@ make_node (enum tree_code code MEM_STAT_DECL) > DECL_UID (t) = allocate_decl_uid (); > SET_DECL_PT_UID (t, -1); > } > - if (TREE_CODE (t) == LABEL_DECL) > - LABEL_DECL_UID (t) = -1; > - > break; > > case tcc_type: > @@ -5257,10 +5246,22 @@ tree > build_decl (location_t loc, enum tree_code code, tree name, > tree type MEM_STAT_DECL) > { > - tree t; > + gcc_checking_assert (TREE_CODE_CLASS (code) == tcc_declaration); > + tree t = make_node (code, BUILD_DECL_MKNODE_CALLER PASS_MEM_STAT); > + if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) > + { > + if (code == FUNCTION_DECL) > + { > + SET_DECL_ALIGN (t, FUNCTION_ALIGNMENT (FUNCTION_BOUNDARY)); > + SET_DECL_MODE (t, FUNCTION_MODE); > + } > + else > + SET_DECL_ALIGN (t, 1); > + } > > - t = make_node (code PASS_MEM_STAT); > DECL_SOURCE_LOCATION (t) = loc; > + if (TREE_CODE (t) == LABEL_DECL) > + LABEL_DECL_UID (t) = -1; > > /* if (type == error_mark_node) > type = integer_type_node; */ > diff --git a/gcc/tree.h b/gcc/tree.h > index 8bdf16d8b4a..c68997408e2 100644 > --- a/gcc/tree.h > +++ b/gcc/tree.h > @@ -4357,11 +4357,22 @@ extern size_t tree_code_size (enum tree_code); > /* Allocate and return a new UID from the DECL_UID namespace. */ > extern int allocate_decl_uid (void); > > +/* expected callers of make_node. */ > +enum make_node_caller > +{ > + UNKNOWN_MKNODE_CALLER, > + BUILD_DECL_MKNODE_CALLER, > + TREE_STREAMER_MKNODE_CALLER, > + MODULE_STREAMER_MKNODE_CALLER, > +}; > + > /* Lowest level primitive for allocating a node. > The TREE_CODE is the only argument. Contents are initialized > to zero except for a few of the common fields. */ > > -extern tree make_node (enum tree_code CXX_MEM_STAT_INFO); > +extern tree make_node (enum tree_code, > + enum make_node_caller caller = UNKNOWN_MKNODE_CALLER > + CXX_MEM_STAT_INFO); > > /* Free tree node. */ > > diff --git a/gcc/varasm.c b/gcc/varasm.c > index 53cf6dea3f3..fa6799e48fb 100644 > --- a/gcc/varasm.c > +++ b/gcc/varasm.c > @@ -8229,21 +8229,21 @@ output_file_directive (FILE *asm_file, const char *input_name) > rtx > make_debug_expr_from_rtl (const_rtx exp) > { > - tree ddecl = make_node (DEBUG_EXPR_DECL), type; > + tree type; > machine_mode mode = GET_MODE (exp); > rtx dval; > > - DECL_ARTIFICIAL (ddecl) = 1; > if (REG_P (exp) && REG_EXPR (exp)) > type = TREE_TYPE (REG_EXPR (exp)); > else if (MEM_P (exp) && MEM_EXPR (exp)) > type = TREE_TYPE (MEM_EXPR (exp)); > else > type = NULL_TREE; > - if (type && TYPE_MODE (type) == mode) > - TREE_TYPE (ddecl) = type; > - else > - TREE_TYPE (ddecl) = lang_hooks.types.type_for_mode (mode, 1); > + if (!type || TYPE_MODE (type) != mode) > + type = lang_hooks.types.type_for_mode (mode, 1); > + > + tree ddecl = build_decl (input_location, DEBUG_EXPR_DECL, nullptr, type); > + DECL_ARTIFICIAL (ddecl) = 1; > SET_DECL_MODE (ddecl, mode); > dval = gen_rtx_DEBUG_EXPR (mode); > DEBUG_EXPR_TREE_DECL (dval) = ddecl; > -- > 2.20.1 >