diff options
author | brobecke <brobecke@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-03-22 20:57:00 +0000 |
---|---|---|
committer | brobecke <brobecke@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-03-22 20:57:00 +0000 |
commit | 62351b00626f9b05c6b7b85dd0c186a611eb28dc (patch) | |
tree | b6dbfe7753c9070f124746670e69a9e749c1d142 /gcc/dwarf2out.c | |
parent | fd45b48cf0ae20ef509a1a3e819e9253e22083ee (diff) | |
download | gcc-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.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; } |