merge from gcc
authorDJ Delorie <dj@redhat.com>
Wed, 10 Dec 2008 23:28:19 +0000 (23:28 +0000)
committerDJ Delorie <dj@redhat.com>
Wed, 10 Dec 2008 23:28:19 +0000 (23:28 +0000)
include/ChangeLog
include/demangle.h
libiberty/ChangeLog
libiberty/cp-demangle.c

index 79bebbf748eb7ea19e70b24353d8b0b8b2513b6d..73892f542ab4f8f421b4572ce7bd97c923e807a8 100644 (file)
@@ -1,3 +1,8 @@
+2008-12-10  Jason Merrill  <jason@redhat.com>
+
+       * demangle.h (enum demangle_component_type): Add
+       DEMANGLE_COMPONENT_FIXED_TYPE.
+
 2008-12-01  Cary Coutant  <ccoutant@google.com>
 
        * plugin-api.h (ld_plugin_message): Change format parameter to const.
index 0ea639d62ba370f36e44b30835a0f2afb0ae41c7..28c69f5e78c4e291bf17a8bf2ed7b4d5984c987a 100644 (file)
@@ -319,6 +319,8 @@ enum demangle_component_type
      and the right subtree is the member type.  CV-qualifiers appear
      on the latter.  */
   DEMANGLE_COMPONENT_PTRMEM_TYPE,
+  /* A fixed-point type.  */
+  DEMANGLE_COMPONENT_FIXED_TYPE,
   /* An argument list.  The left subtree is the current argument, and
      the right subtree is either NULL or another ARGLIST node.  */
   DEMANGLE_COMPONENT_ARGLIST,
@@ -419,6 +421,17 @@ struct demangle_component
       struct demangle_component *name;
     } s_extended_operator;
 
+    /* For DEMANGLE_COMPONENT_FIXED_TYPE.  */
+    struct
+    {
+      /* The length, indicated by a C integer type name.  */
+      struct demangle_component *length;
+      /* _Accum or _Fract?  */
+      short accum;
+      /* Saturating or not?  */
+      short sat;
+    } s_fixed;
+
     /* For DEMANGLE_COMPONENT_CTOR.  */
     struct
     {
index fd9d30002176070fbb1d3fdb7c953ca78f1ece26..a6721bf906d81e91531520e93d25288e6ab28fe4 100644 (file)
@@ -1,3 +1,8 @@
+2008-12-10  Jason Merrill  <jason@redhat.com>
+
+       * cp-demangle.c (cplus_demangle_type): Support fixed-point types.
+       (d_print_comp, d_dump): Likewise.
+
 2008-10-22  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * Makefile.in (CPPFLAGS): Define.
index 3fa5f1f21d3b2e30e2a6df7e3f01df7e69451bd6..de0d9f7610eaea73ad937ca0e41e828348f25c46 100644 (file)
@@ -621,6 +621,9 @@ d_dump (struct demangle_component *dc, int indent)
     case DEMANGLE_COMPONENT_PTRMEM_TYPE:
       printf ("pointer to member type\n");
       break;
+    case DEMANGLE_COMPONENT_FIXED_TYPE:
+      printf ("fixed-point type\n");
+      break;
     case DEMANGLE_COMPONENT_ARGLIST:
       printf ("argument list\n");
       break;
@@ -2115,6 +2118,19 @@ cplus_demangle_type (struct d_info *di)
          ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
          di->expansion += ret->u.s_builtin.type->len;
          break;
+
+       case 'F':
+         /* Fixed point types. DF<int bits><length><fract bits><sat>  */
+         ret = d_make_empty (di);
+         ret->type = DEMANGLE_COMPONENT_FIXED_TYPE;
+         if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di))))
+           /* For demangling we don't care about the bits.  */
+           d_number (di);
+         ret->u.s_fixed.length = cplus_demangle_type (di);
+         d_number (di);
+         peek = d_next_char (di);
+         ret->u.s_fixed.sat = (peek == 's');
+         break;
        }
       break;
 
@@ -3725,6 +3741,22 @@ d_print_comp (struct d_print_info *dpi,
        return;
       }
 
+    case DEMANGLE_COMPONENT_FIXED_TYPE:
+      if (dc->u.s_fixed.sat)
+       d_append_string (dpi, "_Sat ");
+      /* Don't print "int _Accum".  */
+      if (dc->u.s_fixed.length->u.s_builtin.type
+         != &cplus_demangle_builtin_types['i'-'a'])
+       {
+         d_print_comp (dpi, dc->u.s_fixed.length);
+         d_append_char (dpi, ' ');
+       }
+      if (dc->u.s_fixed.accum)
+       d_append_string (dpi, "_Accum");
+      else
+       d_append_string (dpi, "_Fract");
+      return;
+
     case DEMANGLE_COMPONENT_ARGLIST:
     case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
       if (d_left (dc) != NULL)