From 4484e9b6a8f4845884ceb40453280596b9ad6bf5 Mon Sep 17 00:00:00 2001 From: "Markus F.X.J. Oberhumer" Date: Sun, 24 Apr 2005 17:35:34 +0000 Subject: [PATCH] mangle.c (write_builtin_type): Handle integer types which are not one of the shared integer type nodes and... * 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 | 6 ++++++ gcc/cp/mangle.c | 30 +++++++++++++++++++++++++----- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0838f932667..a0ebc891a55 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2005-04-12 Markus F.X.J. Oberhumer + + * 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 * cp-tree.def (USING_STMT): Change class to tcc_statement. 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); } } } -- 2.30.2