diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/itanium/abi.c | 84 |
1 files changed, 82 insertions, 2 deletions
diff --git a/plugins/itanium/abi.c b/plugins/itanium/abi.c index 0e7ce27..2a9561f 100644 --- a/plugins/itanium/abi.c +++ b/plugins/itanium/abi.c @@ -2200,7 +2200,9 @@ static itanium_component *itd_builtin_type(GItaniumDemangling *context) { itanium_component *result; /* Construction à retourner */ input_buffer *ibuf; /* Tampon de texte manipulé */ + size_t consumed; /* Nombre de consommations */ BaseType type; /* Type reconnu ou BTP_INVALID */ + GDataType *std; /* Espace de noms */ itanium_component *vendor; /* Extension propriétaire */ GDataType *builtin; /* Type construit */ @@ -2228,12 +2230,24 @@ static itanium_component *itd_builtin_type(GItaniumDemangling *context) * ::= e # long double, __float80 * ::= g # __float128 * ::= z # ellipsis - * ::= u <source-name> # vendor extended type + * ::= Dd # IEEE 754r decimal floating point (64 bits) + * ::= De # IEEE 754r decimal floating point (128 bits) + * ::= Df # IEEE 754r decimal floating point (32 bits) + * ::= Dh # IEEE 754r half-precision floating point (16 bits) + * ::= DF <number> _ # ISO/IEC TS 18661 binary floating point type _FloatN (N bits) + * ::= Di # char32_t + * ::= Ds # char16_t + * ::= Da # auto + * ::= Dc # decltype(auto) + * ::= Dn # std::nullptr_t (i.e., decltype(nullptr)) + * ::= u <source-name> # vendor extended type * */ ibuf = &G_DEMANGLING_CONTEXT(context)->buffer; + consumed = 1; + switch (peek_input_buffer_char(ibuf)) { case 'v': @@ -2299,6 +2313,71 @@ static itanium_component *itd_builtin_type(GItaniumDemangling *context) case 'z': type = BTP_ELLIPSIS; break; + + case 'D': + + consumed = 2; + + switch (peek_input_buffer_next_char(ibuf)) + { + case 'd': + type = BTP_754R_64; + break; + case 'e': + type = BTP_754R_128; + break; + case 'f': + type = BTP_754R_32; + break; + case 'h': + type = BTP_754R_16; + break; + + case 'F': + advance_input_buffer(ibuf, 2); + + if (itd_number(context, (ssize_t []) { 0 }) && check_input_buffer_char(ibuf, '_')) + type = BTP_754R_N; + else + type = BTP_INVALID; + + consumed = 0; + break; + + case 'i': + type = BTP_CHAR32_T; + break; + case 's': + type = BTP_CHAR16_T; + break; + case 'a': + type = BTP_AUTO; + break; + case 'c': + type = BTP_DECL_AUTO; + break; + + case 'n': + + std = g_class_enum_type_new(CET_NAMESPACE, strdup("std")); + + builtin = g_class_enum_type_new(CET_CLASS, strdup("nullptr_t")); + g_data_type_set_namespace(builtin, std, strdup("::")); + + result = itd_make_type(builtin); + itd_set_type(result, ICT_STD_SUBST); + + goto done; + break; + + default: + type = BTP_INVALID; + break; + + } + + break; + case 'u': advance_input_buffer(ibuf, 1); @@ -2320,13 +2399,14 @@ static itanium_component *itd_builtin_type(GItaniumDemangling *context) default: type = BTP_INVALID; break; + } if (type != BTP_INVALID) { builtin = g_basic_type_new(type); result = itd_make_type(builtin); - advance_input_buffer(ibuf, 1); + advance_input_buffer(ibuf, consumed); } else result = NULL; |