mangle.c (write_builtin_type): Handle integer types which are not one of the shared...
authorMarkus F.X.J. Oberhumer <markus@oberhumer.com>
Sun, 24 Apr 2005 17:35:34 +0000 (17:35 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Sun, 24 Apr 2005 17:35:34 +0000 (17:35 +0000)
* mangle.c (write_builtin_type): Handle integer types which are
not one of the shared integer type nodes and emit a "vendor
extended builtin type" with an encoding in the form of "u5int96".

From-SVN: r98665

gcc/cp/ChangeLog
gcc/cp/mangle.c

index 0838f93..a0ebc89 100644 (file)
@@ -1,3 +1,9 @@
+2005-04-12  Markus F.X.J. Oberhumer  <markus@oberhumer.com>
+
+       * mangle.c (write_builtin_type): Handle integer types which are
+       not one of the shared integer type nodes and emit a "vendor
+       extended builtin type" with an encoding in the form of "u5int96".
+
 2005-04-24  Ian Lance Taylor  <ian@airs.com>
 
        * cp-tree.def (USING_STMT): Change class to tcc_statement.
index fc6c424..20be571 100644 (file)
@@ -1757,15 +1757,35 @@ write_builtin_type (tree type)
            {
              tree t = c_common_type_for_mode (TYPE_MODE (type),
                                               TYPE_UNSIGNED (type));
-             if (type == t)
+             if (type != t)
                {
-                 gcc_assert (TYPE_PRECISION (type) == 128);
-                 write_char (TYPE_UNSIGNED (type) ? 'o' : 'n');
+                 type = t;
+                 goto iagain;
                }
+
+             if (TYPE_PRECISION (type) == 128)
+               write_char (TYPE_UNSIGNED (type) ? 'o' : 'n');
              else
                {
-                 type = t;
-                 goto iagain;
+                 /* Allow for cases where TYPE is not one of the shared
+                    integer type nodes and write a "vendor extended builtin
+                    type" with a name the form intN or uintN, respectively.
+                    Situations like this can happen if you have an
+                    __attribute__((__mode__(__SI__))) type and use exotic
+                    switches like '-mint64' on MIPS or '-mint8' on AVR.
+                    Of course, this is undefined by the C++ ABI (and
+                    '-mint8' is not even Standard C conforming), but when
+                    using such special options you're pretty much in nowhere
+                    land anyway.  */
+                 const char *prefix;
+                 char prec[11];        /* up to ten digits for an unsigned */
+
+                 prefix = TYPE_UNSIGNED (type) ? "uint" : "int";
+                 sprintf (prec, "%u", (unsigned) TYPE_PRECISION (type));
+                 write_char ('u');     /* "vendor extended builtin type" */
+                 write_unsigned_number (strlen (prefix) + strlen (prec));
+                 write_string (prefix);
+                 write_string (prec);
                }
            }
        }