From e1bda768f573b84e340bfcdc59fe353eb665f8e6 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sun, 8 Mar 2020 23:12:42 +0100 Subject: Fixed some mistakes in the Itanium prefixes demangling. --- plugins/itanium/abi.c | 447 ++++++++++++++++++++++++++-------------------- tests/mangling/itanium.py | 21 +++ 2 files changed, 273 insertions(+), 195 deletions(-) diff --git a/plugins/itanium/abi.c b/plugins/itanium/abi.c index 7094aa4..0e7ce27 100644 --- a/plugins/itanium/abi.c +++ b/plugins/itanium/abi.c @@ -147,9 +147,6 @@ static itanium_component *itd_nested_name(GItaniumDemangling *); static itanium_component *itd_prefix(GItaniumDemangling *); /* Extrait un composant dans un contexte Itanium. */ -static itanium_component *itd_prefix_rec(GItaniumDemangling *, itanium_component *); - -/* Extrait un composant dans un contexte Itanium. */ static itanium_component *itd_template_prefix(GItaniumDemangling *); /* Détermine si le composant suivant correspond à un type donné. */ @@ -215,6 +212,9 @@ static itanium_component *itd_template_param(GItaniumDemangling *); /* Extrait un composant dans un contexte Itanium. */ static itanium_component *itd_template_template_param(GItaniumDemangling *); +/* Détermine si le composant suivant correspond à un type donné. */ +static bool is_itd_template_args(GItaniumDemangling *); + /* Extrait un composant dans un contexte Itanium. */ static itanium_component *itd_template_args(GItaniumDemangling *); @@ -231,6 +231,9 @@ static itanium_component *itd_value_to_string(GItaniumDemangling *, bool); static itanium_component *itd_expr_primary(GItaniumDemangling *); /* Extrait un composant dans un contexte Itanium. */ +static itanium_component *itd_data_member_prefix(GItaniumDemangling *); + +/* Extrait un composant dans un contexte Itanium. */ static bool itd_seq_id(GItaniumDemangling *, char, size_t *); /* Extrait un composant dans un contexte Itanium. */ @@ -643,6 +646,13 @@ static itanium_component *itd_nested_name(GItaniumDemangling *context) if (left != NULL) { + /** + * Quand son traitement est un succès, doit toujours + * se terminer par . + */ + + assert(is_itd_template_args(context)); + right = itd_template_args(context); if (right != NULL) @@ -728,86 +738,98 @@ static itanium_component *itd_prefix(GItaniumDemangling *context) input_buffer *ibuf; /* Tampon de texte manipulé */ char peek; /* Prochain caractère lu */ itanium_component *targs; /* Composant 'template-args' */ + bool backup; /* Solution de repli existante */ + bool merge_targs; /* Fusion nécessaire ? */ itd_state saved; /* Position d'analyse courante */ itanium_component *further; /* Tentative de progression */ /** * La règle traitée ici est la suivante : * - * ::= + * ::= + * ::= * ::= * ::= - * ::= # empty + * ::= + * ::= * ::= * - * On note déjà la jolie petite boucle interne. + * Réorganisée, cette règle a pour définition : + * + * ::= + * ::= + * ::= + * ::= + * ::= * - * Or on a également la règle voisine suivante : + * ::= + * ::= + * + * Il existe cependant une boucle infinie avec une règle de : * * ::=