summaryrefslogtreecommitdiff
path: root/gcc/dwarf2out.c
diff options
context:
space:
mode:
authorbrobecke <brobecke@138bc75d-0d04-0410-961f-82ee72b054a4>2004-03-22 20:57:00 +0000
committerbrobecke <brobecke@138bc75d-0d04-0410-961f-82ee72b054a4>2004-03-22 20:57:00 +0000
commit62351b00626f9b05c6b7b85dd0c186a611eb28dc (patch)
treeb6dbfe7753c9070f124746670e69a9e749c1d142 /gcc/dwarf2out.c
parentfd45b48cf0ae20ef509a1a3e819e9253e22083ee (diff)
downloadgcc-62351b00626f9b05c6b7b85dd0c186a611eb28dc.tar.gz
* dwarf2out.c (is_subrange_type): Do not emit a subrange_type DIE
for base types. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@79838 138bc75d-0d04-0410-961f-82ee72b054a4
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;
}