summaryrefslogtreecommitdiff
path: root/gcc/cp/mangle.c
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2005-04-24 17:35:34 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2005-04-24 17:35:34 +0000
commit42a8ab5793913fe7c212bc54f19add7c0a487eb6 (patch)
treebb1fb372faf60da153d48910bcde48e7db0a990a /gcc/cp/mangle.c
parenta640bb21a9199b6a4cd6d209461ad9186e6e14a8 (diff)
downloadgcc-42a8ab5793913fe7c212bc54f19add7c0a487eb6.tar.gz
* 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". git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@98665 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/mangle.c')
-rw-r--r--gcc/cp/mangle.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c
index fc6c4243a82..20be571408b 100644
--- a/gcc/cp/mangle.c
+++ b/gcc/cp/mangle.c
@@ -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);
}
}
}