From 95b7c2e0c5439e4e9904c5bc4d78e553a4e802c7 Mon Sep 17 00:00:00 2001 From: Pierre-Marie de Rodat Date: Sat, 9 Sep 2017 13:05:40 +0000 Subject: [PATCH] decl.c (gnat_to_gnu_entity): Don't generate debug info for inner record types if -fgnat-encodings=minimal. * gcc-interface/decl.c (gnat_to_gnu_entity) : Don't generate debug info for inner record types if -fgnat-encodings=minimal. (gnat_to_gnu_entity) : Use the ultimate base record type as the debug type. From-SVN: r251937 --- gcc/ada/ChangeLog | 7 +++++++ gcc/ada/gcc-interface/decl.c | 24 +++++++++++++++++++----- gcc/ada/gcc-interface/utils2.c | 2 +- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gnat.dg/debug11.adb | 1 + gcc/testsuite/gnat.dg/debug12.adb | 1 + gcc/testsuite/gnat.dg/debug13.adb | 3 ++- gcc/testsuite/gnat.dg/debug14.adb | 38 ++++++++++++++++++++++++++++++++++++++ 8 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/debug14.adb diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index e929eff..dee1897e 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2017-09-09 Pierre-Marie de Rodat + + * gcc-interface/decl.c (gnat_to_gnu_entity) : Don't + generate debug info for inner record types if -fgnat-encodings=minimal. + (gnat_to_gnu_entity) : Use the ultimate base record + type as the debug type. + 2017-09-09 Eric Botcazou * gcc-interface/decl.c (components_to_record): Do not reorder in non- diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 569e64d..7b30497 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -3308,10 +3308,14 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) = build_subst_list (gnat_entity, gnat_parent_type, definition); /* Set the layout of the type to match that of the parent type, - doing required substitutions. */ - copy_and_substitute_in_layout (gnat_entity, gnat_parent_type, - gnu_type, gnu_parent_type, - gnu_subst_list, debug_info_p); + doing required substitutions. If we are in minimal GNAT + encodings mode, we don't need debug info for the inner record + types, as they will be part of the embedding variant record's + debug info. */ + copy_and_substitute_in_layout + (gnat_entity, gnat_parent_type, gnu_type, gnu_parent_type, + gnu_subst_list, + debug_info_p && gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL); } else { @@ -3439,7 +3443,17 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) gnu_type = make_node (RECORD_TYPE); TYPE_NAME (gnu_type) = gnu_entity_name; if (gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL) - SET_TYPE_DEBUG_TYPE (gnu_type, gnu_base_type); + { + /* Use the ultimate base record type as the debug type. + Subtypes and derived types bring no useful + information. */ + Entity_Id gnat_debug_type = gnat_entity; + while (Etype (gnat_debug_type) != gnat_debug_type) + gnat_debug_type = Etype (gnat_debug_type); + tree gnu_debug_type + = TYPE_MAIN_VARIANT (gnat_to_gnu_type (gnat_debug_type)); + SET_TYPE_DEBUG_TYPE (gnu_type, gnu_debug_type); + } TYPE_PACKED (gnu_type) = TYPE_PACKED (gnu_base_type); TYPE_REVERSE_STORAGE_ORDER (gnu_type) = Reverse_Storage_Order (gnat_entity); diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c index 072e105..6f109c7 100644 --- a/gcc/ada/gcc-interface/utils2.c +++ b/gcc/ada/gcc-interface/utils2.c @@ -6,7 +6,7 @@ * * * C Implementation File * * * - * Copyright (C) 1992-2016, Free Software Foundation, Inc. * + * Copyright (C) 1992-2017, Free Software Foundation, Inc. * * * * GNAT is free software; you can redistribute it and/or modify it under * * terms of the GNU General Public License as published by the Free Soft- * diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0f58fb7..35aadc7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-09-09 Pierre-Marie de Rodat + + * gnat.dg/debug14.adb: New test. + 2017-09-09 Eric Botcazou * gnat.dg/specs/atomic3.ads: New test. diff --git a/gcc/testsuite/gnat.dg/debug11.adb b/gcc/testsuite/gnat.dg/debug11.adb index 5f60697..19c1c43 100644 --- a/gcc/testsuite/gnat.dg/debug11.adb +++ b/gcc/testsuite/gnat.dg/debug11.adb @@ -1,3 +1,4 @@ +-- { dg-do compile } -- { dg-options "-cargs -O0 -g -dA -fgnat-encodings=minimal -margs" } -- -- This testcase checks that in the DWARF description of the variant type diff --git a/gcc/testsuite/gnat.dg/debug12.adb b/gcc/testsuite/gnat.dg/debug12.adb index 0717596..c236dc4 100644 --- a/gcc/testsuite/gnat.dg/debug12.adb +++ b/gcc/testsuite/gnat.dg/debug12.adb @@ -1,3 +1,4 @@ +-- { dg-do compile } -- { dg-options "-cargs -gdwarf-4 -fdebug-types-section -dA -margs" } -- { dg-final { scan-assembler-times "DW_AT_location" 4 } } diff --git a/gcc/testsuite/gnat.dg/debug13.adb b/gcc/testsuite/gnat.dg/debug13.adb index 4b94b3e..f54a4e0 100644 --- a/gcc/testsuite/gnat.dg/debug13.adb +++ b/gcc/testsuite/gnat.dg/debug13.adb @@ -1,4 +1,5 @@ --- { dg-options "-cargs -O2 -g -margs" } +-- { dg-do compile } +-- { dg-options "-O2 -g" } package body Debug13 is diff --git a/gcc/testsuite/gnat.dg/debug14.adb b/gcc/testsuite/gnat.dg/debug14.adb new file mode 100644 index 0000000..2cb9107 --- /dev/null +++ b/gcc/testsuite/gnat.dg/debug14.adb @@ -0,0 +1,38 @@ +-- { dg-do compile } +-- { dg-options "-g -fgnat-encodings=minimal" } + +procedure Debug14 is + + type Db_Kind_T is (Raw, Relational, Object); + + type Db_Model_T (Kind : Db_Kind_T) is + record + + case Kind is + + when Raw => + Fs_Type : Integer; + + when Relational | Object => + Vendor_Id : Integer; + + case Kind is + when Relational => + N_Tables : Integer; + + when others => + null; + end case; + + end case; + + end record; + + type Raw_Db_T is new Db_Model_T (Kind => Raw); + type Raw_Db_P is access Raw_Db_T; + + Db : Raw_Db_P := new Raw_Db_T; + +begin + null; +end; -- 2.7.4