On Wed, 20 Mar 2013, Richard Biener wrote: > On Wed, 20 Mar 2013, Jakub Jelinek wrote: > > > On Wed, Mar 20, 2013 at 01:57:40PM +0100, Richard Biener wrote: > > > As discussed previously on IRC this patch does the renaming from > > > the confusing DECL_DEBUG_EXPR_IS_FROM to DECL_HAS_DEBUG_EXPR_P > > > which matches DECL_HAS_VALUE_EXPR_P (and it's behavior). > > > > Not sure if we actually guarantee that if DECL_HAS_DEBUG_EXPR_P, then > > it has non-NULL DECL_DEBUG_EXPR. I'm worried about copy_node somewhere > > copying a decl together with DECL_HAS_DEBUG_EXPR_P bit, but not adding > > anything into the hash table, or about LTO. > > There are uses that do not guard against DECL_DEBUG_EXPR returning > NULL so I thought requiring that when DECL_HAS_DEBUG_EXPR_P is set is > good and consistent. > > > Otherwise it looks good. > > I'll take that as ok if it ends up working ;)
Ok, it didn't because of the copying bits. Changed as follows - do not copy the bit in copy_node and adjust the only copier (tree-inline) accordingly. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. Richard. 2013-03-21 Richard Biener <rguent...@suse.de> * tree.h (DECL_DEBUG_EXPR_IS_FROM): Rename to ... (DECL_HAS_DEBUG_EXPR_P): ... this. Guard properly. * tree.c (copy_node_stat): Do not copy DECL_HAS_DEBUG_EXPR_P. * dwarf2out.c (add_var_loc_to_decl): Use DECL_HAS_DEBUG_EXPR_P instead of DECL_DEBUG_EXPR_IS_FROM. * gimplify.c (gimplify_modify_expr): Likewise. * tree-cfg.c (verify_expr_location_1): Likewise. * tree-complex.c (create_one_component_var): Likewise. * tree-sra.c (create_access_replacement): Likewise. * tree-ssa-live.c (clear_unused_block_pointer_1): Likewise. (clear_unused_block_pointer): Likewise. * tree-streamer-in.c (unpack_ts_decl_common_value_fields): Likewise. * tree-streamer-out.c (pack_ts_decl_common_value_fields): Likewise. * var-tracking.c (var_debug_decl): Likewise. (track_expr_p): Likewise. * tree-inline.c (add_local_variables): Likewise. Set DECL_HAS_DEBUG_EXPR_P after copying it. * tree-diagnostic.c (default_tree_printer): Use DECL_HAS_DEBUG_EXPR_P instead of DECL_DEBUG_EXPR_IS_FROM. Guard properly. c/ * c-objc-common.c (c_tree_printer): Use DECL_HAS_DEBUG_EXPR_P instead of DECL_DEBUG_EXPR_IS_FROM. Guard properly. cp/ * error.c (cp_printer): Use DECL_HAS_DEBUG_EXPR_P instead of DECL_DEBUG_EXPR_IS_FROM. Guard properly. Index: trunk/gcc/c/c-objc-common.c =================================================================== *** trunk.orig/gcc/c/c-objc-common.c 2013-03-20 14:21:43.000000000 +0100 --- trunk/gcc/c/c-objc-common.c 2013-03-21 10:28:37.397763062 +0100 *************** c_tree_printer (pretty_printer *pp, text *** 112,118 **** switch (*spec) { case 'D': ! if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t)) { t = DECL_DEBUG_EXPR (t); if (!DECL_P (t)) --- 112,118 ---- switch (*spec) { case 'D': ! if (TREE_CODE (t) == VAR_DECL && DECL_HAS_DEBUG_EXPR_P (t)) { t = DECL_DEBUG_EXPR (t); if (!DECL_P (t)) Index: trunk/gcc/cp/error.c =================================================================== *** trunk.orig/gcc/cp/error.c 2013-03-20 14:21:43.000000000 +0100 --- trunk/gcc/cp/error.c 2013-03-21 10:28:37.407763171 +0100 *************** cp_printer (pretty_printer *pp, text_inf *** 3283,3290 **** case 'D': { tree temp = next_tree; ! if (DECL_P (temp) ! && DECL_DEBUG_EXPR_IS_FROM (temp) && DECL_DEBUG_EXPR (temp)) { temp = DECL_DEBUG_EXPR (temp); if (!DECL_P (temp)) --- 3283,3290 ---- case 'D': { tree temp = next_tree; ! if (TREE_CODE (temp) == VAR_DECL ! && DECL_HAS_DEBUG_EXPR_P (temp)) { temp = DECL_DEBUG_EXPR (temp); if (!DECL_P (temp)) Index: trunk/gcc/dwarf2out.c =================================================================== *** trunk.orig/gcc/dwarf2out.c 2013-03-20 14:21:43.000000000 +0100 --- trunk/gcc/dwarf2out.c 2013-03-21 10:28:37.420763310 +0100 *************** add_var_loc_to_decl (tree decl, rtx loc_ *** 5020,5032 **** struct var_loc_node *loc = NULL; HOST_WIDE_INT bitsize = -1, bitpos = -1; ! if (DECL_DEBUG_EXPR_IS_FROM (decl)) { tree realdecl = DECL_DEBUG_EXPR (decl); ! if (realdecl ! && (handled_component_p (realdecl) ! || (TREE_CODE (realdecl) == MEM_REF ! && TREE_CODE (TREE_OPERAND (realdecl, 0)) == ADDR_EXPR))) { HOST_WIDE_INT maxsize; tree innerdecl; --- 5020,5032 ---- struct var_loc_node *loc = NULL; HOST_WIDE_INT bitsize = -1, bitpos = -1; ! if (TREE_CODE (decl) == VAR_DECL ! && DECL_HAS_DEBUG_EXPR_P (decl)) { tree realdecl = DECL_DEBUG_EXPR (decl); ! if (handled_component_p (realdecl) ! || (TREE_CODE (realdecl) == MEM_REF ! && TREE_CODE (TREE_OPERAND (realdecl, 0)) == ADDR_EXPR)) { HOST_WIDE_INT maxsize; tree innerdecl; Index: trunk/gcc/gimplify.c =================================================================== *** trunk.orig/gcc/gimplify.c 2013-03-20 14:21:43.000000000 +0100 --- trunk/gcc/gimplify.c 2013-03-21 10:28:37.431763432 +0100 *************** gimplify_modify_expr (tree *expr_p, gimp *** 4947,4953 **** if (!DECL_NAME (*from_p) && DECL_NAME (*to_p)) DECL_NAME (*from_p) = create_tmp_var_name (IDENTIFIER_POINTER (DECL_NAME (*to_p))); ! DECL_DEBUG_EXPR_IS_FROM (*from_p) = 1; SET_DECL_DEBUG_EXPR (*from_p, *to_p); } --- 4947,4953 ---- if (!DECL_NAME (*from_p) && DECL_NAME (*to_p)) DECL_NAME (*from_p) = create_tmp_var_name (IDENTIFIER_POINTER (DECL_NAME (*to_p))); ! DECL_HAS_DEBUG_EXPR_P (*from_p) = 1; SET_DECL_DEBUG_EXPR (*from_p, *to_p); } Index: trunk/gcc/tree-cfg.c =================================================================== *** trunk.orig/gcc/tree-cfg.c 2013-03-20 14:21:43.000000000 +0100 --- trunk/gcc/tree-cfg.c 2013-03-21 10:28:37.432763443 +0100 *************** verify_expr_location_1 (tree *tp, int *w *** 4544,4550 **** struct pointer_set_t *blocks = (struct pointer_set_t *) data; if (TREE_CODE (*tp) == VAR_DECL ! && DECL_DEBUG_EXPR_IS_FROM (*tp)) { tree t = DECL_DEBUG_EXPR (*tp); tree addr = walk_tree (&t, verify_expr_location_1, blocks, NULL); --- 4544,4550 ---- struct pointer_set_t *blocks = (struct pointer_set_t *) data; if (TREE_CODE (*tp) == VAR_DECL ! && DECL_HAS_DEBUG_EXPR_P (*tp)) { tree t = DECL_DEBUG_EXPR (*tp); tree addr = walk_tree (&t, verify_expr_location_1, blocks, NULL); Index: trunk/gcc/tree-complex.c =================================================================== *** trunk.orig/gcc/tree-complex.c 2013-03-20 14:21:43.000000000 +0100 --- trunk/gcc/tree-complex.c 2013-03-21 10:28:37.433763453 +0100 *************** create_one_component_var (tree type, tre *** 428,434 **** DECL_NAME (r) = get_identifier (ACONCAT ((name, suffix, NULL))); SET_DECL_DEBUG_EXPR (r, build1 (code, type, orig)); ! DECL_DEBUG_EXPR_IS_FROM (r) = 1; DECL_IGNORED_P (r) = 0; TREE_NO_WARNING (r) = TREE_NO_WARNING (orig); } --- 428,434 ---- DECL_NAME (r) = get_identifier (ACONCAT ((name, suffix, NULL))); SET_DECL_DEBUG_EXPR (r, build1 (code, type, orig)); ! DECL_HAS_DEBUG_EXPR_P (r) = 1; DECL_IGNORED_P (r) = 0; TREE_NO_WARNING (r) = TREE_NO_WARNING (orig); } Index: trunk/gcc/tree-diagnostic.c =================================================================== *** trunk.orig/gcc/tree-diagnostic.c 2013-03-20 14:21:43.000000000 +0100 --- trunk/gcc/tree-diagnostic.c 2013-03-21 10:28:37.433763453 +0100 *************** default_tree_printer (pretty_printer *pp *** 268,274 **** case 'D': t = va_arg (*text->args_ptr, tree); ! if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t)) t = DECL_DEBUG_EXPR (t); break; --- 268,274 ---- case 'D': t = va_arg (*text->args_ptr, tree); ! if (TREE_CODE (t) == VAR_DECL && DECL_HAS_DEBUG_EXPR_P (t)) t = DECL_DEBUG_EXPR (t); break; Index: trunk/gcc/tree-inline.c =================================================================== *** trunk.orig/gcc/tree-inline.c 2013-03-20 14:55:50.000000000 +0100 --- trunk/gcc/tree-inline.c 2013-03-21 10:48:58.500096734 +0100 *************** add_local_variables (struct function *ca *** 3766,3772 **** /* Remap debug-expressions. */ if (TREE_CODE (new_var) == VAR_DECL ! && DECL_DEBUG_EXPR_IS_FROM (new_var) && new_var != var) { tree tem = DECL_DEBUG_EXPR (var); --- 3766,3772 ---- /* Remap debug-expressions. */ if (TREE_CODE (new_var) == VAR_DECL ! && DECL_HAS_DEBUG_EXPR_P (var) && new_var != var) { tree tem = DECL_DEBUG_EXPR (var); *************** add_local_variables (struct function *ca *** 3776,3781 **** --- 3776,3782 ---- id->remapping_type_depth--; id->regimplify = old_regimplify; SET_DECL_DEBUG_EXPR (new_var, tem); + DECL_HAS_DEBUG_EXPR_P (new_var) = 1; } add_local_decl (caller, new_var); } Index: trunk/gcc/tree-sra.c =================================================================== *** trunk.orig/gcc/tree-sra.c 2013-03-20 14:21:43.000000000 +0100 --- trunk/gcc/tree-sra.c 2013-03-21 10:28:37.469763767 +0100 *************** create_access_replacement (struct access *** 1961,1967 **** if (!fail) { SET_DECL_DEBUG_EXPR (repl, debug_expr); ! DECL_DEBUG_EXPR_IS_FROM (repl) = 1; } if (access->grp_no_warning) TREE_NO_WARNING (repl) = 1; --- 1961,1967 ---- if (!fail) { SET_DECL_DEBUG_EXPR (repl, debug_expr); ! DECL_HAS_DEBUG_EXPR_P (repl) = 1; } if (access->grp_no_warning) TREE_NO_WARNING (repl) = 1; Index: trunk/gcc/tree-ssa-live.c =================================================================== *** trunk.orig/gcc/tree-ssa-live.c 2013-03-20 14:21:43.000000000 +0100 --- trunk/gcc/tree-ssa-live.c 2013-03-21 10:28:37.473763846 +0100 *************** clear_unused_block_pointer_1 (tree *tp, *** 620,626 **** if (EXPR_P (*tp) && TREE_BLOCK (*tp) && !TREE_USED (TREE_BLOCK (*tp))) TREE_SET_BLOCK (*tp, NULL); ! if (TREE_CODE (*tp) == VAR_DECL && DECL_DEBUG_EXPR_IS_FROM (*tp)) { tree debug_expr = DECL_DEBUG_EXPR (*tp); walk_tree (&debug_expr, clear_unused_block_pointer_1, NULL, NULL); --- 620,626 ---- if (EXPR_P (*tp) && TREE_BLOCK (*tp) && !TREE_USED (TREE_BLOCK (*tp))) TREE_SET_BLOCK (*tp, NULL); ! if (TREE_CODE (*tp) == VAR_DECL && DECL_HAS_DEBUG_EXPR_P (*tp)) { tree debug_expr = DECL_DEBUG_EXPR (*tp); walk_tree (&debug_expr, clear_unused_block_pointer_1, NULL, NULL); *************** clear_unused_block_pointer (void) *** 640,646 **** unsigned i; FOR_EACH_LOCAL_DECL (cfun, i, t) ! if (TREE_CODE (t) == VAR_DECL && DECL_DEBUG_EXPR_IS_FROM (t)) { tree debug_expr = DECL_DEBUG_EXPR (t); walk_tree (&debug_expr, clear_unused_block_pointer_1, NULL, NULL); --- 640,646 ---- unsigned i; FOR_EACH_LOCAL_DECL (cfun, i, t) ! if (TREE_CODE (t) == VAR_DECL && DECL_HAS_DEBUG_EXPR_P (t)) { tree debug_expr = DECL_DEBUG_EXPR (t); walk_tree (&debug_expr, clear_unused_block_pointer_1, NULL, NULL); Index: trunk/gcc/tree-streamer-in.c =================================================================== *** trunk.orig/gcc/tree-streamer-in.c 2013-03-20 14:21:43.000000000 +0100 --- trunk/gcc/tree-streamer-in.c 2013-03-21 10:28:37.474763869 +0100 *************** unpack_ts_decl_common_value_fields (stru *** 203,209 **** DECL_ARTIFICIAL (expr) = (unsigned) bp_unpack_value (bp, 1); DECL_USER_ALIGN (expr) = (unsigned) bp_unpack_value (bp, 1); DECL_PRESERVE_P (expr) = (unsigned) bp_unpack_value (bp, 1); - DECL_DEBUG_EXPR_IS_FROM (expr) = (unsigned) bp_unpack_value (bp, 1); DECL_EXTERNAL (expr) = (unsigned) bp_unpack_value (bp, 1); DECL_GIMPLE_REG_P (expr) = (unsigned) bp_unpack_value (bp, 1); DECL_ALIGN (expr) = (unsigned) bp_unpack_var_len_unsigned (bp); --- 203,208 ---- *************** unpack_ts_decl_common_value_fields (stru *** 226,232 **** } if (TREE_CODE (expr) == VAR_DECL) ! DECL_NONLOCAL_FRAME (expr) = (unsigned) bp_unpack_value (bp, 1); if (TREE_CODE (expr) == RESULT_DECL || TREE_CODE (expr) == PARM_DECL --- 225,234 ---- } if (TREE_CODE (expr) == VAR_DECL) ! { ! DECL_HAS_DEBUG_EXPR_P (expr) = (unsigned) bp_unpack_value (bp, 1); ! DECL_NONLOCAL_FRAME (expr) = (unsigned) bp_unpack_value (bp, 1); ! } if (TREE_CODE (expr) == RESULT_DECL || TREE_CODE (expr) == PARM_DECL Index: trunk/gcc/tree-streamer-out.c =================================================================== *** trunk.orig/gcc/tree-streamer-out.c 2013-03-20 14:21:43.000000000 +0100 --- trunk/gcc/tree-streamer-out.c 2013-03-21 10:28:37.476763923 +0100 *************** pack_ts_decl_common_value_fields (struct *** 170,176 **** bp_pack_value (bp, DECL_ARTIFICIAL (expr), 1); bp_pack_value (bp, DECL_USER_ALIGN (expr), 1); bp_pack_value (bp, DECL_PRESERVE_P (expr), 1); - bp_pack_value (bp, DECL_DEBUG_EXPR_IS_FROM (expr), 1); bp_pack_value (bp, DECL_EXTERNAL (expr), 1); bp_pack_value (bp, DECL_GIMPLE_REG_P (expr), 1); bp_pack_var_len_unsigned (bp, DECL_ALIGN (expr)); --- 170,175 ---- *************** pack_ts_decl_common_value_fields (struct *** 192,198 **** } if (TREE_CODE (expr) == VAR_DECL) ! bp_pack_value (bp, DECL_NONLOCAL_FRAME (expr), 1); if (TREE_CODE (expr) == RESULT_DECL || TREE_CODE (expr) == PARM_DECL --- 191,200 ---- } if (TREE_CODE (expr) == VAR_DECL) ! { ! bp_pack_value (bp, DECL_HAS_DEBUG_EXPR_P (expr), 1); ! bp_pack_value (bp, DECL_NONLOCAL_FRAME (expr), 1); ! } if (TREE_CODE (expr) == RESULT_DECL || TREE_CODE (expr) == PARM_DECL Index: trunk/gcc/tree.h =================================================================== *** trunk.orig/gcc/tree.h 2013-03-20 14:21:43.000000000 +0100 --- trunk/gcc/tree.h 2013-03-21 10:28:37.478763947 +0100 *************** struct GTY(()) tree_decl_minimal { *** 2709,2716 **** checked before any access to the former. */ #define DECL_FUNCTION_CODE(NODE) \ (FUNCTION_DECL_CHECK (NODE)->function_decl.function_code) - #define DECL_DEBUG_EXPR_IS_FROM(NODE) \ - (DECL_COMMON_CHECK (NODE)->decl_common.debug_expr_is_from) #define DECL_FUNCTION_PERSONALITY(NODE) \ (FUNCTION_DECL_CHECK (NODE)->function_decl.personality) --- 2709,2714 ---- *************** struct GTY(()) tree_decl_with_vis { *** 3223,3231 **** extern tree decl_debug_expr_lookup (tree); extern void decl_debug_expr_insert (tree, tree); ! /* For VAR_DECL, this is set to either an expression that it was split ! from (if DECL_DEBUG_EXPR_IS_FROM is true), otherwise a tree_list of ! subexpressions that it was split into. */ #define DECL_DEBUG_EXPR(NODE) \ (decl_debug_expr_lookup (VAR_DECL_CHECK (NODE))) --- 3221,3229 ---- extern tree decl_debug_expr_lookup (tree); extern void decl_debug_expr_insert (tree, tree); ! /* For VAR_DECL, this is set to an expression that it was split from. */ ! #define DECL_HAS_DEBUG_EXPR_P(NODE) \ ! (VAR_DECL_CHECK (NODE)->decl_common.debug_expr_is_from) #define DECL_DEBUG_EXPR(NODE) \ (decl_debug_expr_lookup (VAR_DECL_CHECK (NODE))) Index: trunk/gcc/var-tracking.c =================================================================== *** trunk.orig/gcc/var-tracking.c 2013-03-20 14:21:43.000000000 +0100 --- trunk/gcc/var-tracking.c 2013-03-21 10:28:37.490764040 +0100 *************** vars_copy (htab_t dst, htab_t src) *** 1780,1790 **** static inline tree var_debug_decl (tree decl) { ! if (decl && DECL_P (decl) ! && DECL_DEBUG_EXPR_IS_FROM (decl)) { tree debugdecl = DECL_DEBUG_EXPR (decl); ! if (debugdecl && DECL_P (debugdecl)) decl = debugdecl; } --- 1780,1790 ---- static inline tree var_debug_decl (tree decl) { ! if (decl && TREE_CODE (decl) == VAR_DECL ! && DECL_HAS_DEBUG_EXPR_P (decl)) { tree debugdecl = DECL_DEBUG_EXPR (decl); ! if (DECL_P (debugdecl)) decl = debugdecl; } *************** track_expr_p (tree expr, bool need_rtl) *** 5041,5052 **** don't need to track this expression if the ultimate declaration is ignored. */ realdecl = expr; ! if (DECL_DEBUG_EXPR_IS_FROM (realdecl)) { realdecl = DECL_DEBUG_EXPR (realdecl); ! if (realdecl == NULL_TREE) ! realdecl = expr; ! else if (!DECL_P (realdecl)) { if (handled_component_p (realdecl) || (TREE_CODE (realdecl) == MEM_REF --- 5041,5050 ---- don't need to track this expression if the ultimate declaration is ignored. */ realdecl = expr; ! if (TREE_CODE (realdecl) == VAR_DECL && DECL_HAS_DEBUG_EXPR_P (realdecl)) { realdecl = DECL_DEBUG_EXPR (realdecl); ! if (!DECL_P (realdecl)) { if (handled_component_p (realdecl) || (TREE_CODE (realdecl) == MEM_REF Index: trunk/gcc/tree.c =================================================================== *** trunk.orig/gcc/tree.c 2013-03-20 09:59:51.000000000 +0100 --- trunk/gcc/tree.c 2013-03-21 10:47:52.865379670 +0100 *************** copy_node_stat (tree node MEM_STAT_DECL) *** 975,980 **** --- 975,983 ---- SET_DECL_VALUE_EXPR (t, DECL_VALUE_EXPR (node)); DECL_HAS_VALUE_EXPR_P (t) = 1; } + /* DECL_DEBUG_EXPR is copied explicitely by callers. */ + if (TREE_CODE (node) == VAR_DECL) + DECL_HAS_DEBUG_EXPR_P (t) = 0; if (TREE_CODE (node) == VAR_DECL && DECL_HAS_INIT_PRIORITY_P (node)) { SET_DECL_INIT_PRIORITY (t, DECL_INIT_PRIORITY (node));