From 848be0946c097a25e63acea3e16eee11fc41e6c9 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 24 Oct 2012 11:08:56 +0200 Subject: re PR debug/54828 (ICE in based_loc_descr at dwarf2out.c:10560 with -g -O0) PR debug/54828 * gimple.h (is_gimple_sizepos): New inline function. * gimplify.c (gimplify_one_sizepos): Use it. Remove useless final assignment to expr variable. * tree.c (RETURN_TRUE_IF_VAR): Return true also if !TYPE_SIZES_GIMPLIFIED (type) and _t is going to be gimplified into a local temporary. * g++.dg/debug/pr54828.C: New test. From-SVN: r192759 --- gcc/gimple.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'gcc/gimple.h') diff --git a/gcc/gimple.h b/gcc/gimple.h index bca1e14..b34016a 100644 --- a/gcc/gimple.h +++ b/gcc/gimple.h @@ -957,6 +957,24 @@ struct gimplify_ctx bool in_cleanup_point_expr; }; +/* Return true if gimplify_one_sizepos doesn't need to gimplify + expr (when in TYPE_SIZE{,_UNIT} and similar type/decl size/bitsize + fields). */ +static inline bool +is_gimple_sizepos (tree expr) +{ + /* gimplify_one_sizepos doesn't need to do anything if the value isn't there, + is constant, or contains A PLACEHOLDER_EXPR. We also don't want to do + anything if it's already a VAR_DECL. If it's a VAR_DECL from another + function, the gimplifier will want to replace it with a new variable, + but that will cause problems if this type is from outside the function. + It's OK to have that here. */ + return (expr == NULL_TREE + || TREE_CONSTANT (expr) + || TREE_CODE (expr) == VAR_DECL + || CONTAINS_PLACEHOLDER_P (expr)); +} + extern enum gimplify_status gimplify_expr (tree *, gimple_seq *, gimple_seq *, bool (*) (tree), fallback_t); extern void gimplify_type_sizes (tree, gimple_seq *); -- cgit v1.1