aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimplify.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2021-05-05 12:07:24 +0200
committerEric Botcazou <ebotcazou@adacore.com>2021-05-05 12:14:25 +0200
commit5747baa984d96241e4e2608da3c3e0160e32410b (patch)
tree6c718ca95d9270dbb3f6836ea3140de58533392f /gcc/gimplify.c
parentdee371fdd4ae25f837b9b2ded7789d07ed739c9e (diff)
downloadgcc-5747baa984d96241e4e2608da3c3e0160e32410b.zip
gcc-5747baa984d96241e4e2608da3c3e0160e32410b.tar.gz
gcc-5747baa984d96241e4e2608da3c3e0160e32410b.tar.bz2
Generate debug info for local dynamic record types
In Ada you can embed VLAs in local record types and thus end up with dynamic offsets in record types, which are not well described in DWARF because 1) the temporaries generated for them by the gimplifier are naturally marked DECL_IGNORED_P and 2) when the types are referenced in nested subprograms, the DWARF back-end does not correctly handle the rewritten references. gcc/ * dwarf2out.c (loc_list_from_tree_1) <DECL>: During early DWARF, do not expand the VALUE_EXPR of variables put in the non-local frame. * gimplify.c (gimplify_type_sizes) <RECORD_TYPE>: If the type is not to be ignored for debug info, ensure its variable offsets are not. gcc/testsuite/ * gnat.dg/debug8.adb: Minor tweak. * gnat.dg/debug11.adb: Likewise. * gnat.dg/debug16.adb: Likewise. * gnat.dg/debug17.adb: New test. * gnat.dg/specs/debug1.ads: Minor tweak.
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r--gcc/gimplify.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index b65106b..e790f08 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -15141,11 +15141,15 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
void
gimplify_type_sizes (tree type, gimple_seq *list_p)
{
- tree field, t;
-
if (type == NULL || type == error_mark_node)
return;
+ const bool ignored_p
+ = TYPE_NAME (type)
+ && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
+ && DECL_IGNORED_P (TYPE_NAME (type));
+ tree t;
+
/* We first do the main variant, then copy into any other variants. */
type = TYPE_MAIN_VARIANT (type);
@@ -15179,9 +15183,7 @@ gimplify_type_sizes (tree type, gimple_seq *list_p)
/* Ensure VLA bounds aren't removed, for -O0 they should be variables
with assigned stack slots, for -O1+ -g they should be tracked
by VTA. */
- if (!(TYPE_NAME (type)
- && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
- && DECL_IGNORED_P (TYPE_NAME (type)))
+ if (!ignored_p
&& TYPE_DOMAIN (type)
&& INTEGRAL_TYPE_P (TYPE_DOMAIN (type)))
{
@@ -15197,10 +15199,16 @@ gimplify_type_sizes (tree type, gimple_seq *list_p)
case RECORD_TYPE:
case UNION_TYPE:
case QUAL_UNION_TYPE:
- for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
+ for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
if (TREE_CODE (field) == FIELD_DECL)
{
gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
+ /* Likewise, ensure variable offsets aren't removed. */
+ if (!ignored_p
+ && (t = DECL_FIELD_OFFSET (field))
+ && VAR_P (t)
+ && DECL_ARTIFICIAL (t))
+ DECL_IGNORED_P (t) = 0;
gimplify_one_sizepos (&DECL_SIZE (field), list_p);
gimplify_one_sizepos (&DECL_SIZE_UNIT (field), list_p);
gimplify_type_sizes (TREE_TYPE (field), list_p);