summaryrefslogtreecommitdiff
path: root/gcc/dwarf2out.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2004-03-22 20:57:00 +0000
committerJoel Brobecker <brobecke@gcc.gnu.org>2004-03-22 20:57:00 +0000
commitd6672e91f14a7a570de58160bf251ac82e4557a3 (patch)
treeb6dbfe7753c9070f124746670e69a9e749c1d142 /gcc/dwarf2out.c
parent886de2d4dcf3ade25fb76c32522fd4aa2f9510b8 (diff)
downloadgcc-d6672e91f14a7a570de58160bf251ac82e4557a3.tar.gz
dwarf2out.c (is_subrange_type): Do not emit a subrange_type DIE for base types.
* dwarf2out.c (is_subrange_type): Do not emit a subrange_type DIE for base types. From-SVN: r79838
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r--gcc/dwarf2out.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index ad2bf63aaec..4a1745353c4 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -8012,6 +8012,38 @@ is_subrange_type (tree type)
&& TREE_CODE (subtype) != ENUMERAL_TYPE)
return false;
+ if (TREE_CODE (type) == TREE_CODE (subtype)
+ && int_size_in_bytes (type) == int_size_in_bytes (subtype)
+ && TYPE_MIN_VALUE (type) != NULL
+ && TYPE_MIN_VALUE (subtype) != NULL
+ && tree_int_cst_equal (TYPE_MIN_VALUE (type), TYPE_MIN_VALUE (subtype))
+ && TYPE_MAX_VALUE (type) != NULL
+ && TYPE_MAX_VALUE (subtype) != NULL
+ && tree_int_cst_equal (TYPE_MAX_VALUE (type), TYPE_MAX_VALUE (subtype)))
+ {
+ /* The type and its subtype have the same representation. If in
+ addition the two types also have the same name, then the given
+ type is not a subrange type, but rather a plain base type. */
+ /* FIXME: brobecker/2004-03-22:
+ Sizetype INTEGER_CSTs nodes are canonicalized. It should
+ therefore be sufficient to check the TYPE_SIZE node pointers
+ rather than checking the actual size. Unfortunately, we have
+ found some cases, such as in the Ada "integer" type, where
+ this is not the case. Until this problem is solved, we need to
+ keep checking the actual size. */
+ tree type_name = TYPE_NAME (type);
+ tree subtype_name = TYPE_NAME (subtype);
+
+ if (type_name != NULL && TREE_CODE (type_name) == TYPE_DECL)
+ type_name = DECL_NAME (type_name);
+
+ if (subtype_name != NULL && TREE_CODE (subtype_name) == TYPE_DECL)
+ subtype_name = DECL_NAME (subtype_name);
+
+ if (type_name == subtype_name)
+ return false;
+ }
+
return true;
}