diff options
author | Joel Brobecker <brobecker@gnat.com> | 2004-03-22 20:57:00 +0000 |
---|---|---|
committer | Joel Brobecker <brobecke@gcc.gnu.org> | 2004-03-22 20:57:00 +0000 |
commit | d6672e91f14a7a570de58160bf251ac82e4557a3 (patch) | |
tree | b6dbfe7753c9070f124746670e69a9e749c1d142 /gcc/dwarf2out.c | |
parent | 886de2d4dcf3ade25fb76c32522fd4aa2f9510b8 (diff) | |
download | gcc-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.c | 32 |
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; } |