OSDN Git Service

* dwarf2out.c (is_subrange_type): Do not emit a subrange_type DIE
authorbrobecke <brobecke@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 22 Mar 2004 20:57:00 +0000 (20:57 +0000)
committerbrobecke <brobecke@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 22 Mar 2004 20:57:00 +0000 (20:57 +0000)
        for base types.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@79838 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/dwarf2out.c

index 4237524..daebc14 100644 (file)
@@ -1,5 +1,10 @@
 2004-03-22  Joel Brobecker  <brobecker@gnat.com>
 
+       * dwarf2out.c (is_subrange_type): Do not emit a subrange_type DIE
+       for base types.
+
+2004-03-22  Joel Brobecker  <brobecker@gnat.com>
+
        * dwarf2out.c (is_subrange_type): Minor code rework. No behavior
        change.
 
index ad2bf63..4a17453 100644 (file)
@@ -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;
 }