OSDN Git Service

Changes to distinguish typedef from original type in debug output.
[pf3gnuchains/gcc-fork.git] / gcc / dbxout.c
index 4dea256..cb06b16 100644 (file)
@@ -920,17 +920,18 @@ dbxout_type_methods (type)
 
          if (flag_minimal_debug)
            {
+             char marker;
+
              /* We can't optimize a method which uses an anonymous
                  class, because the debugger will not be able to
                  associate the arbitrary class name with the actual
                  class.  */
-             if (strchr (debug_name,
 #ifndef NO_DOLLAR_IN_LABEL
-                         '$'
+             marker = '$';
 #else
-                         '.'
+             marker = '.';
 #endif
-                         ) != NULL)
+             if (strchr (debug_name, marker))
                show_arg_types = 1;
              /* Detect ordinary methods because their mangled names
                 start with the operation name.  */
@@ -1010,9 +1011,12 @@ dbxout_range_type (type)
     dbxout_type (type, 0, 0); /* E.g. Pascal's ARRAY [BOOLEAN] of INTEGER */
   else
     {
-      /* This used to say `r1' and we used to take care
-        to make sure that `int' was type number 1.  */
-      dbxout_type_index (integer_type_node);
+      /* Traditionally, we made sure 'int' was type 1, and builtin types
+        were defined to be sub-ranges of int.  Unfortunately, this
+        does not allow us to distinguish true sub-ranges from integer
+        types.  So, instead we define integer (non-sub-range) types as
+        sub-ranges of themselves. */
+      dbxout_type_index (type);
     }
   if (TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST)
     fprintf (asmfile, ";%d", 
@@ -1053,7 +1057,8 @@ dbxout_type (type, full, show_arg_types)
      by assuming `int'.  */
   if (type == error_mark_node)
     type = integer_type_node;
-  else
+  else if (!(TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
+            && DECL_ORIGINAL_TYPE (TYPE_NAME (type))))
     {
       type = TYPE_MAIN_VARIANT (type);
       if (TYPE_NAME (type)
@@ -1151,6 +1156,13 @@ dbxout_type (type, full, show_arg_types)
 
   typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
 
+  if (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
+      && DECL_ORIGINAL_TYPE (TYPE_NAME (type)))
+    { 
+      dbxout_type (DECL_ORIGINAL_TYPE (TYPE_NAME (type)), 0, 0);
+      return;
+    }
+
   switch (TREE_CODE (type))
     {
     case VOID_TYPE: