[gcc(refs/users/aoliva/heads/testme)] Map unpacked type to packed deduped type for debug info
Alexandre Oliva
aoliva@gcc.gnu.org
Thu Jun 27 13:22:45 GMT 2024
https://gcc.gnu.org/g:92359793fc3d8c94a6704e518555807227b21bea
commit 92359793fc3d8c94a6704e518555807227b21bea
Author: Alexandre Oliva <oliva@adacore.com>
Date: Thu Jun 27 09:11:27 2024 -0300
Map unpacked type to packed deduped type for debug info
Avoid creating unnecessary copies of types in make_type_from_size.
Cache the packed version of a biased type in TYPE_DEBUG_TYPE, so as to
map the unpacked type to it.
for gcc/ada/ChangeLog
* gcc-interface/utils.cc (make_type_from_size): Cache packed
variant, and map unpacked type to it in debug info.
for gcc/testsuite/ChangeLog
* gnat.dg/bias1.adb: Count occurrences of -7.*DW_AT_GNU_bias.
Diff:
---
gcc/ada/gcc-interface/utils.cc | 19 +++++++++++++++++++
gcc/testsuite/gnat.dg/bias1.adb | 3 ++-
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/gcc/ada/gcc-interface/utils.cc b/gcc/ada/gcc-interface/utils.cc
index d8d42f57b89..daf8d7ccdc5 100644
--- a/gcc/ada/gcc-interface/utils.cc
+++ b/gcc/ada/gcc-interface/utils.cc
@@ -1399,6 +1399,15 @@ make_type_from_size (tree type, tree size_tree, bool for_biased)
|| size > (Enable_128bit_Types ? 128 : LONG_LONG_TYPE_SIZE))
break;
+ /* If we've already created this type, the base type is supposed
+ to map to it. Check that it is what we expect. */
+ if (TYPE_CAN_HAVE_DEBUG_TYPE_P (type)
+ && (new_type = TYPE_DEBUG_TYPE (type))
+ && TYPE_PRECISION (new_type) == size
+ && ((TREE_CODE (new_type) == INTEGER_TYPE
+ && TYPE_BIASED_REPRESENTATION_P (new_type)) == for_biased))
+ return new_type;
+
/* The type should be an unsigned type if the original type is unsigned
or if the lower bound is constant and non-negative or if the type is
biased, see E_Signed_Integer_Subtype case of gnat_to_gnu_entity. */
@@ -1414,6 +1423,16 @@ make_type_from_size (tree type, tree size_tree, bool for_biased)
TYPE_NAME (new_type) = TYPE_NAME (type);
TYPE_BIASED_REPRESENTATION_P (new_type) = for_biased;
SET_TYPE_RM_SIZE (new_type, bitsize_int (size));
+
+ /* Enable us to avoid creating the same narrower type multiple
+ times, and avoid duplication in debug information, by mapping
+ the wider type to the narrower version. If biasing is
+ different, we use the narrower type for debug information. */
+ if (TYPE_CAN_HAVE_DEBUG_TYPE_P (type)
+ && !TYPE_DEBUG_TYPE (type)
+ && biased_p == for_biased)
+ SET_TYPE_DEBUG_TYPE (type, new_type);
+
return new_type;
case RECORD_TYPE:
diff --git a/gcc/testsuite/gnat.dg/bias1.adb b/gcc/testsuite/gnat.dg/bias1.adb
index 016a159b692..d9a00a1aa45 100644
--- a/gcc/testsuite/gnat.dg/bias1.adb
+++ b/gcc/testsuite/gnat.dg/bias1.adb
@@ -1,6 +1,7 @@
-- { dg-do compile }
-- { dg-options "-cargs -g -dA -gnatws -fgnat-encodings=gdb -margs" }
-- { dg-final { scan-assembler "DW_AT_GNU_bias" } }
+-- { dg-final { scan-assembler-times "-7.*DW_AT_GNU_bias" 1 } }
procedure Bias1 is
type Small is range -7 .. -4;
@@ -31,4 +32,4 @@ procedure Bias1 is
begin
null;
-end Bias1;
\ No newline at end of file
+end Bias1;
More information about the Gcc-cvs
mailing list