summaryrefslogtreecommitdiff
path: root/src/format/mangling
diff options
context:
space:
mode:
Diffstat (limited to 'src/format/mangling')
-rw-r--r--src/format/mangling/Makefile.am43
-rw-r--r--src/format/mangling/context-int.h62
-rw-r--r--src/format/mangling/context.c192
-rw-r--r--src/format/mangling/context.h61
-rw-r--r--src/format/mangling/demangler.c336
-rw-r--r--src/format/mangling/demangler.h50
-rw-r--r--src/format/mangling/dex/Makefile.am46
-rw-r--r--src/format/mangling/dex/context.c154
-rw-r--r--src/format/mangling/dex/context.h52
-rw-r--r--src/format/mangling/dex/shorty_gram.y138
-rw-r--r--src/format/mangling/dex/shorty_tok.l28
-rw-r--r--src/format/mangling/dex/type_gram.y159
-rw-r--r--src/format/mangling/dex/type_tok.l150
-rwxr-xr-xsrc/format/mangling/itanium/Makefile.am19
-rw-r--r--src/format/mangling/itanium/abi.c2444
-rw-r--r--src/format/mangling/itanium/abi.h38
-rw-r--r--src/format/mangling/itanium/component-int.h79
-rw-r--r--src/format/mangling/itanium/component.c717
-rw-r--r--src/format/mangling/itanium/component.h213
-rw-r--r--src/format/mangling/itanium/context.c571
-rw-r--r--src/format/mangling/itanium/context.h117
-rw-r--r--src/format/mangling/java.h59
-rw-r--r--src/format/mangling/java_gram.y281
-rw-r--r--src/format/mangling/java_tok.l37
24 files changed, 0 insertions, 6046 deletions
diff --git a/src/format/mangling/Makefile.am b/src/format/mangling/Makefile.am
deleted file mode 100644
index e92deb2..0000000
--- a/src/format/mangling/Makefile.am
+++ /dev/null
@@ -1,43 +0,0 @@
-
-BUILT_SOURCES = libjavamangling_la-java_gram.h
-
-AM_YFLAGS = -d
-
-noinst_LTLIBRARIES = libjavamangling.la libformatmangling.la
-
-libformatmangling_la_SOURCES = \
- context-int.h \
- context.h context.c \
- demangler.h demangler.c
-
-libformatmangling_la_LDFLAGS =
-
-libformatmangling_la_LIBADD = \
- libjavamangling.la \
- dex/libformatmanglingdex.la \
- itanium/libformatmanglingitanium.la
-
-
-# Partie Java
-
-libjavamangling_la_SOURCES = \
- java.h \
- java_gram.y \
- java_tok.l
-
-libjavamangling_la_YFLAGS = -d -p java_ -o y.tab.c
-
-libjavamangling_la_LFLAGS = -P java_ -o lex.yy.c
-
-
-
-
-AM_CPPFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS)
-
-AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS)
-
-
-# Automake fait les choses à moitié
-CLEANFILES = java_gram.h java_gram.c libjavamangling_la-java_tok.c
-
-SUBDIRS = dex itanium
diff --git a/src/format/mangling/context-int.h b/src/format/mangling/context-int.h
deleted file mode 100644
index d361ff7..0000000
--- a/src/format/mangling/context-int.h
+++ /dev/null
@@ -1,62 +0,0 @@
-
-/* Chrysalide - Outil d'analyse de fichiers binaires
- * context.h - prototypes internes liés aux contextes de décodage
- *
- * Copyright (C) 2010-2017 Cyrille Bagard
- *
- * This file is part of Chrysalide.
- *
- * Chrysalide is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * Chrysalide is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef _FORMAT_MANGLING_CONTEXT_INT_H
-#define _FORMAT_MANGLING_CONTEXT_INT_H
-
-
-#include "context.h"
-
-
-
-/* Procède au décodage d'une chaîne de caractères. */
-typedef bool (* demangle_fc) (GDemanglingContext *, const char *);
-
-
-/* Contexte de décodage (instance) */
-struct _GDemanglingContext
-{
- GObject parent; /* A laisser en premier */
-
- union
- {
- GObject *gobj; /* Utile pour le nettoyage ! */
- GBinRoutine *routine; /* Routine décodée */
- GDataType *type; /* Type décodé */
- };
-
-};
-
-/* Contexte de décodage (classe) */
-struct _GDemanglingContextClass
-{
- GObjectClass parent; /* A laisser en premier */
-
- demangle_fc demangle_type; /* Décodage de type */
- demangle_fc demangle_routine; /* Décodage de routine */
-
-};
-
-
-
-#endif /* _FORMAT_MANGLING_CONTEXT_INT_H */
diff --git a/src/format/mangling/context.c b/src/format/mangling/context.c
deleted file mode 100644
index 7a798ac..0000000
--- a/src/format/mangling/context.c
+++ /dev/null
@@ -1,192 +0,0 @@
-
-/* Chrysalide - Outil d'analyse de fichiers binaires
- * context.c - fourniture de contexte aux phases de décodage
- *
- * Copyright (C) 2010-2017 Cyrille Bagard
- *
- * This file is part of Chrysalide.
- *
- * Chrysalide is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * Chrysalide is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include "context.h"
-
-
-#include "context-int.h"
-
-
-
-/* Initialise la classe des contextes de décodage. */
-static void g_demangling_context_class_init(GDemanglingContextClass *);
-
-/* Initialise une instance de contexte pour décodage. */
-static void g_demangling_context_init(GDemanglingContext *);
-
-/* Supprime toutes les références externes. */
-static void g_demangling_context_dispose(GDemanglingContext *);
-
-/* Procède à la libération totale de la mémoire. */
-static void g_demangling_context_finalize(GDemanglingContext *);
-
-
-
-/* Indique le type défini pour un contexte de décodage. */
-G_DEFINE_TYPE(GDemanglingContext, g_demangling_context, G_TYPE_OBJECT);
-
-
-/******************************************************************************
-* *
-* Paramètres : klass = classe à initialiser. *
-* *
-* Description : Initialise la classe des contextes de décodage. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_demangling_context_class_init(GDemanglingContextClass *klass)
-{
- GObjectClass *object; /* Autre version de la classe */
-
- object = G_OBJECT_CLASS(klass);
-
- object->dispose = (GObjectFinalizeFunc/* ! */)g_demangling_context_dispose;
- object->finalize = (GObjectFinalizeFunc)g_demangling_context_finalize;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = instance à initialiser. *
-* *
-* Description : Initialise une instance de contexte pour décodage. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_demangling_context_init(GDemanglingContext *context)
-{
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : demangler = instance d'objet GLib à traiter. *
-* *
-* Description : Supprime toutes les références externes. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_demangling_context_dispose(GDemanglingContext *context)
-{
- if (context->gobj != NULL)
- g_object_unref(context->gobj);
-
- G_OBJECT_CLASS(g_demangling_context_parent_class)->dispose(G_OBJECT(context));
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : demangler = instance d'objet GLib à traiter. *
-* *
-* Description : Procède à la libération totale de la mémoire. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_demangling_context_finalize(GDemanglingContext *context)
-{
- G_OBJECT_CLASS(g_demangling_context_parent_class)->finalize(G_OBJECT(context));
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = instance à consulter. *
-* desc = chaîne de caractères à décoder. *
-* *
-* Description : Fournit la routine créée à l'issue du codage. *
-* *
-* Retour : Bilan de l'opération. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-GBinRoutine *g_demangling_context_get_decoded_routine(GDemanglingContext *context, const char *desc)
-{
- GBinRoutine *result; /* Construction à remonter */
-
- context->routine = g_binary_routine_new();
-
- if (G_DEMANGLING_CONTEXT_GET_CLASS(context)->demangle_routine(context, desc))
- {
- g_object_ref(context->routine);
- result = context->routine;
- }
-
- else
- result = NULL;
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = instance à consulter. *
-* *
-* Description : Fournit le type créé à l'issue du codage. *
-* *
-* Retour : Instance en place ou NULL en cas d'erreur fatale. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-GDataType *g_demangling_context_get_decoded_type(GDemanglingContext *context, const char *desc)
-{
- GBinRoutine *result; /* Construction à remonter */
-
- if (G_DEMANGLING_CONTEXT_GET_CLASS(context)->demangle_type(context, desc))
- {
- g_object_ref(context->type);
- result = context->type;
- }
-
- else
- result = NULL;
-
- return result;
-
-}
diff --git a/src/format/mangling/context.h b/src/format/mangling/context.h
deleted file mode 100644
index a9528e8..0000000
--- a/src/format/mangling/context.h
+++ /dev/null
@@ -1,61 +0,0 @@
-
-/* Chrysalide - Outil d'analyse de fichiers binaires
- * context.h - prototypes pour la fourniture de contexte aux phases de décodage
- *
- * Copyright (C) 2010-2017 Cyrille Bagard
- *
- * This file is part of Chrysalide.
- *
- * Chrysalide is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * Chrysalide is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef _FORMAT_MANGLING_CONTEXT_H
-#define _FORMAT_MANGLING_CONTEXT_H
-
-
-#include <glib-object.h>
-
-
-#include "../../analysis/routine.h"
-
-
-
-#define G_TYPE_DEMANGLING_CONTEXT g_demangling_context_get_type()
-#define G_DEMANGLING_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_demangling_context_get_type(), GDemanglingContext))
-#define G_IS_DEMANGLING_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_demangling_context_get_type()))
-#define G_DEMANGLING_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_DEMANGLING_CONTEXT, GDemanglingContextClass))
-#define G_IS_DEMANGLING_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_DEMANGLING_CONTEXT))
-#define G_DEMANGLING_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_DEMANGLING_CONTEXT, GDemanglingContextClass))
-
-
-/* Contexte de décodage (instance) */
-typedef struct _GDemanglingContext GDemanglingContext;
-
-/* Contexte de décodage (classe) */
-typedef struct _GDemanglingContextClass GDemanglingContextClass;
-
-
-/* Indique le type défini pour un contexte de décodage. */
-GType g_demangling_context_get_type(void);
-
-/* Fournit la routine créée à l'issue du codage. */
-GBinRoutine *g_demangling_context_get_decoded_routine(GDemanglingContext *, const char *);
-
-/* Fournit le type créé à l'issue du codage. */
-GDataType *g_demangling_context_get_decoded_type(GDemanglingContext *, const char *);
-
-
-
-#endif /* _FORMAT_MANGLING_CONTEXT_H */
diff --git a/src/format/mangling/demangler.c b/src/format/mangling/demangler.c
deleted file mode 100644
index f673a01..0000000
--- a/src/format/mangling/demangler.c
+++ /dev/null
@@ -1,336 +0,0 @@
-
-/* Chrysalide - Outil d'analyse de fichiers binaires
- * demangler.c - décodage des noms d'éléments
- *
- * Copyright (C) 2009-2017 Cyrille Bagard
- *
- * This file is part of Chrysalide.
- *
- * Chrysalide is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * Chrysalide is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include "demangler.h"
-
-
-#include <malloc.h>
-#include <string.h>
-
-
-//#include "itanium.h"
-#include "java.h"
-
-
-
-/* Indique si une chaîne peut être traitée par le décodeur. */
-typedef bool (* can_be_demangled_fc) (const char *);
-
-/* Prépare de quoi effectuer un décodage. */
-typedef GDemanglingContext * (* create_context_fc) (void);
-
-/* Procède au décodage d'une chaîne de caractères. */
-typedef bool (* demangle_fc) (GDemanglingContext *, const char *);
-
-
-
-/* Appels liés à un décodeur */
-typedef struct _demangling_properties
-{
- can_be_demangled_fc can_demangle; /* Possibilité de traitement */
-
- create_context_fc create_context; /* Création de contextes */
-
- demangle_fc demangle_routine; /* Décodage d'une routine */
- demangle_fc demangle_type; /* Décodage d'un type */
-
-} demangling_properties;
-
-
-/* Liste des décodeurs */
-static demangling_properties demanglers[/*DGT_COUNT*/] = {
-
- /*
- [DGT_ITANIUM] = {
- .can_demangle = (can_be_demangled_fc)can_be_itanium_demangled,
- .create_context = (create_context_fc)g_itanium_dcontext_new,
- .demangle_routine = (demangle_fc)demangle_itanium_routine,
- .demangle_type = (demangle_fc)NULL
- },
- */
- /*
- [DGT_JAVA] = {
- .can_demangle = (can_be_demangled_fc)NULL,
- .create_context = (create_context_fc)g_java_dcontext_new,
- .demangle_routine = (demangle_fc)NULL,
- .demangle_type = (demangle_fc)demangle_java_type
- }
- */
-};
-
-
-
-/******************************************************************************
-* *
-* Paramètres : desc = chaîne de caractères à décoder. *
-* *
-* Description : Tente de décoder une chaîne de caractères donnée. *
-* *
-* Retour : Bilan de l'opération. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-GBinRoutine *try_to_demangle_routine(const char *desc)
-{
- GBinRoutine *result; /* Construction à remonter */
-
- result = g_binary_routine_new();
- g_binary_routine_set_name(result, strdup(desc));
-
- return result;
-
-
-#if 0
- GBinRoutine *result; /* Construction à remonter */
- DemanglerType i; /* Boucle de parcours */
-
- static int counter = 0;
-
- result = NULL;
-
- if (strcmp(desc, "_ZN21IUDFSettingsValidator15IdNotIllegalStdEN13UDFParameters12UDF_STANDARDES1_") == 0
- || strcmp(desc, "_ZSt12partial_sortIN9__gnu_cxx17__normal_iteratorIP28CPR_MAI_ADPTY_SectorSequenceSt6vectorIS2_SaIS2_EEEEEvT_S8_S8_") == 0
- || strcmp(desc, "_ZSt22__merge_without_bufferIN9__gnu_cxx17__normal_iteratorIP15CProfStringListSt6vectorIS2_SaIS2_EEEEiEvT_S8_S8_T0_S9_") == 0
- || strcmp(desc, "_ZSt11__push_heapIN9__gnu_cxx17__normal_iteratorIP8DRIVE_IDSt6vectorIS2_SaIS2_EEEEiS2_EvT_T0_S9_T1_") == 0 // Intéressant
- //|| strcmp(desc, "") == 0
- )
- goto exit;
-
- for (i = 0; i < DGT_COUNT; i++)
- {
- if (demanglers[i].can_demangle == NULL)
- continue;
-
- if (!demanglers[i].can_demangle(desc))
- continue;
-
- printf("++ [%d] routine :: %s\n", ++counter, desc);
- fflush(NULL);
-
- result = demangle_routine(i, desc);
-
- /* FIXME : à supprimer quand mature */
- if (result == NULL)
- {
- printf("++failed :: %s\n", desc);
-
- if (strcmp(desc, "_ZN21IUDFSettingsValidator15IdNotIllegalStdEN13UDFParameters12UDF_STANDARDES1_") != 0
- && strcmp(desc, "_ZSt12partial_sortIN9__gnu_cxx17__normal_iteratorIP28CPR_MAI_ADPTY_SectorSequenceSt6vectorIS2_SaIS2_EEEEEvT_S8_S8_") != 0
- )
- exit(-1);
-
- }
- else printf(" -->> '%s'\n\n", g_binary_routine_get_name(result));
-
- if (result != NULL) break;
-
- }
-
- exit:
-
- if (result == NULL)
- {
- result = g_binary_routine_new();
- g_binary_routine_set_name(result, strdup(desc));
- }
-
- return result;
-#endif
-
- return NULL;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : type = type de décodeur à utiliser. *
-* desc = chaîne de caractères à décoder. *
-* *
-* Description : Tente de décoder une chaîne de caractères donnée. *
-* *
-* Retour : Bilan de l'opération. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-GBinRoutine *demangle_routine(GType type, const char *desc)
-{
- GBinRoutine *result; /* Construction à remonter */
- GDemanglingContext *context; /* Contexte pour le décodage */
-
- context = g_object_new(type, NULL);
-
- result = g_demangling_context_get_decoded_routine(context, desc);
-
- g_object_unref(context);
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : type = type de décodeur à utiliser. *
-* desc = chaîne de caractères à décoder. *
-* *
-* Description : Tente de décoder une chaîne de caractères donnée. *
-* *
-* Retour : Bilan de l'opération. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-GDataType *demangle_type(GType type, const char *desc)
-{
- GBinRoutine *result; /* Construction à remonter */
- GDemanglingContext *context; /* Contexte pour le décodage */
-
- context = g_object_new(type, NULL);
-
- result = g_demangling_context_get_decoded_type(context, desc);
-
- g_object_unref(context);
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : - *
-* *
-* Description : Procède au test de décodages de chaînes de caractères. *
-* *
-* Retour : Bilan de l'opération. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-#if 0
-void test_itanium_demangling(void)
-{
- GBinRoutine *routine;
- char *human;
- char stop;
-
-#define TEST_ITANIUM_MANGLING(name, ref) \
- do \
- { \
- printf(" >> %s\n", name); \
- routine = demangle_routine(DGT_ITANIUM, name); \
- if (routine == NULL) \
- { \
- printf("Error with %s\n", name); \
- stop = true; \
- } \
- else \
- { \
- human = g_binary_routine_to_string(routine); \
- printf(" >> %s\n", human); \
- stop = (strcmp(ref, human) != 0); \
- printf(" >> ok ? %s\n", (!stop ? "oui" : "non")); \
- if (stop) printf(" >> expected '%s'\n", ref); \
- free(human); \
- } \
- if (stop) goto end_of_test; \
- else printf("\n"); \
- } \
- while (0)
-
- //goto last;
-
- /**
- * Tests de :
- * http://www.codesourcery.com/public/cxx-abi/abi-examples.html#mangling
- */
-
- TEST_ITANIUM_MANGLING("_Z1fv", "??? f(void)");
-
- TEST_ITANIUM_MANGLING("_Z1fi", "??? f(int)");
-
- TEST_ITANIUM_MANGLING("_Z3foo3bar", "??? foo(bar)");
-
- TEST_ITANIUM_MANGLING("_Zrm1XS_", "??? %(X, X)");
-
- TEST_ITANIUM_MANGLING("_ZplR1XS0_", "??? +(X &, X &)");
-
- TEST_ITANIUM_MANGLING("_ZlsRK1XS1_", "??? <<(const X &, const X &)");
-
- TEST_ITANIUM_MANGLING("_Z1fIiEvi", "void f<int>(int)");
-
- TEST_ITANIUM_MANGLING("_Z5firstI3DuoEvS0_", "void first<Duo>(Duo)");
-
- TEST_ITANIUM_MANGLING("_Z5firstI3DuoEvT_", "void first<Duo>(Duo)");
-
- TEST_ITANIUM_MANGLING("_Z3fooIiPFidEiEvv", "void foo<int, int (*)(double), int>(void)");
-
- TEST_ITANIUM_MANGLING("_ZN6System5Sound4beepEv", "??? System::Sound::beep(void)");
-
- TEST_ITANIUM_MANGLING("_Z1fI1XE vPV N1AIT_E1TE", "void f<X>(volatile A<X>::T *)");
-
- //// TODO :: TEST_ITANIUM_MANGLING("_ZngILi42EE v N1A I XplT_Li2EE E 1TE", "");
-
- TEST_ITANIUM_MANGLING("_Z4makeI7FactoryiE T_IT0_E v", "Factory<int> make<Factory, int>(void)");
-
- TEST_ITANIUM_MANGLING("_ZlsRSoRKSs", "??? <<(std::ostream &, const std::string &)");
-
- //TEST_ITANIUM_MANGLING("", "");
-
- /**
- * Tests de :
- * http://www.codesourcery.com/public/cxx-abi/abi.html#mangling
- */
-
- TEST_ITANIUM_MANGLING("_ZN1N1TIiiE2mfES0_IddE", "??? N::T<int, int>::mf(N::T<double, double>)");
-
- /**
- * Tests de :
- * (nero.so).
- */
-
- TEST_ITANIUM_MANGLING("_ZNSt6vectorItSaItEE6insertEN9__gnu_cxx17__normal_iteratorIPtS1_EERKt", "??? std::vector<unsigned short, std::allocator<unsigned short>>::insert(__gnu_cxx::__normal_iterator<unsigned short *, std::vector<unsigned short, std::allocator<unsigned short>>>, const unsigned short &)");
-
- TEST_ITANIUM_MANGLING("_ZSt26__uninitialized_fill_n_auxIP15CProfStringListiS0_ET_S2_T0_RKT1_12__false_type", "CProfStringList *std::__uninitialized_fill_n_aux<CProfStringList *, int, CProfStringList>(CProfStringList *, int, const CProfStringList &, __false_type)");
-
- // TODO TEST_ITANIUM_MANGLING("_ZN21IUDFSettingsValidator15IdNotIllegalStdEN13UDFParameters12UDF_STANDARDES1_", "");
-
- TEST_ITANIUM_MANGLING("_ZNSbI26NeroMediumFeatureSpecifierSt11char_traitsIS_ESaIS_EE4_Rep10_M_destroyERKS2_", "??? std::basic_string<NeroMediumFeatureSpecifier, std::char_traits<NeroMediumFeatureSpecifier>, std::allocator<NeroMediumFeatureSpecifier>>::_Rep::_M_destroy(const std::allocator<NeroMediumFeatureSpecifier> &)");
-
- last:
-
- /* 80 */
- TEST_ITANIUM_MANGLING("_ZNSt6vectorIlSaIlEE6insertEN9__gnu_cxx17__normal_iteratorIPlS1_EERKl", "??? std::vector<long, std::allocator<long>>::insert(__gnu_cxx::__normal_iterator<long *, std::vector<long, std::allocator<long>>>, const long &)");
-
- end_of_test:
-
- ;
-
-}
-#endif
diff --git a/src/format/mangling/demangler.h b/src/format/mangling/demangler.h
deleted file mode 100644
index 3215095..0000000
--- a/src/format/mangling/demangler.h
+++ /dev/null
@@ -1,50 +0,0 @@
-
-/* Chrysalide - Outil d'analyse de fichiers binaires
- * demangler.h - prototypes pour le décodage des noms d'éléments
- *
- * Copyright (C) 2009-2017 Cyrille Bagard
- *
- * This file is part of Chrysalide.
- *
- * Chrysalide is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * Chrysalide is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef _FORMAT_MANGLING_DEMANGLER_H
-#define _FORMAT_MANGLING_DEMANGLER_H
-
-
-#include "../../analysis/routine.h"
-
-
-
-/* Tente de décoder une chaîne de caractères donnée. */
-GBinRoutine *try_to_demangle_routine(const char *);
-
-/* Tente de décoder une chaîne de caractères donnée. */
-GBinRoutine *demangle_routine(GType, const char *);
-
-/* Tente de décoder une chaîne de caractères donnée. */
-GDataType *demangle_type(GType, const char *);
-
-
-
-/* Procède au test de décodages de chaînes de caractères. */
-#ifdef DEBUG
-void test_itanium_demangling(void);
-#endif
-
-
-
-#endif /* _FORMAT_MANGLING_DEMANGLER_H */
diff --git a/src/format/mangling/dex/Makefile.am b/src/format/mangling/dex/Makefile.am
deleted file mode 100644
index bdcbf8c..0000000
--- a/src/format/mangling/dex/Makefile.am
+++ /dev/null
@@ -1,46 +0,0 @@
-
-BUILT_SOURCES = libformatmanglingdexshorty_la-shorty_gram.h libformatmanglingdextype_la-type_gram.h
-
-AM_YFLAGS = -d
-
-noinst_LTLIBRARIES = libformatmanglingdex.la libformatmanglingdexshorty.la libformatmanglingdextype.la
-
-libformatmanglingdex_la_SOURCES = \
- context.h context.c
-
-libformatmanglingdex_la_LDFLAGS =
-
-libformatmanglingdex_la_LIBADD = \
- libformatmanglingdexshorty.la \
- libformatmanglingdextype.la
-
-
-libformatmanglingdexshorty_la_SOURCES = \
- shorty_gram.y \
- shorty_tok.l
-
-libformatmanglingdexshorty_la_YFLAGS = -d -p shorty_ -o y.tab.c
-
-libformatmanglingdexshorty_la_LFLAGS = -P shorty_ -o lex.yy.c
-
-
-libformatmanglingdextype_la_SOURCES = \
- type_gram.y \
- type_tok.l
-
-libformatmanglingdextype_la_YFLAGS = -d -p type_ -o y.tab.c
-
-libformatmanglingdextype_la_LFLAGS = -P type_ -o lex.yy.c
-
-
-AM_CPPFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS)
-
-AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS)
-
-
-# Automake fait les choses à moitié
-CLEANFILES = \
- libformatmanglingdexshorty_la-shorty_gram.h libformatmanglingdexshorty_la-shorty_gram.c \
- libformatmanglingdexshorty_la-shorty_tok.c \
- libformatmanglingdextype_la-type_gram.h libformatmanglingdextype_la-type_gram.c \
- libformatmanglingdextype_la-type_tok.c
diff --git a/src/format/mangling/dex/context.c b/src/format/mangling/dex/context.c
deleted file mode 100644
index 9dd9b9c..0000000
--- a/src/format/mangling/dex/context.c
+++ /dev/null
@@ -1,154 +0,0 @@
-
-/* Chrysalide - Outil d'analyse de fichiers binaires
- * context.c - contextes de décodage DEX
- *
- * Copyright (C) 2015-2017 Cyrille Bagard
- *
- * This file is part of Chrysalide.
- *
- * Chrysalide is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * Chrysalide is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include "context.h"
-
-
-#include "../context-int.h"
-
-
-
-/* Contexte de décodage DEX (instance) */
-struct _GDexDemangler
-{
- GDemanglingContext parent; /* A laisser en premier */
-
-};
-
-/* Contexte de décodage DEX (classe) */
-struct _GDexDemanglerClass
-{
- GDemanglingContextClass parent; /* A laisser en premier */
-
-};
-
-
-/* Initialise la classe des contextes de décodage DEX. */
-static void g_dex_demangler_class_init(GDexDemanglerClass *);
-
-/* Initialise une instance de contexte pour décodage DEX. */
-static void g_dex_demangler_init(GDexDemangler *);
-
-/* Supprime toutes les références externes. */
-static void g_dex_demangler_dispose(GDexDemangler *);
-
-/* Procède à la libération totale de la mémoire. */
-static void g_dex_demangler_finalize(GDexDemangler *);
-
-
-/* Procède au décodage d'une chaîne de caractères. */
-extern bool demangle_dex_routine(GDexDemangler *, const char *);
-
-/* Procède au décodage d'une chaîne de caractères. */
-extern bool demangle_dex_type(GDexDemangler *, const char *);
-
-
-
-/* Indique le type défini pour un contexte de décodage DEX. */
-G_DEFINE_TYPE(GDexDemangler, g_dex_demangler, G_TYPE_DEMANGLING_CONTEXT);
-
-
-/******************************************************************************
-* *
-* Paramètres : klass = classe à initialiser. *
-* *
-* Description : Initialise la classe des contextes de décodage DEX. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dex_demangler_class_init(GDexDemanglerClass *klass)
-{
- GObjectClass *object; /* Autre version de la classe */
- GDemanglingContextClass *context; /* Version parente */
-
- object = G_OBJECT_CLASS(klass);
-
- object->dispose = (GObjectFinalizeFunc/* ! */)g_dex_demangler_dispose;
- object->finalize = (GObjectFinalizeFunc)g_dex_demangler_finalize;
-
- context = G_DEMANGLING_CONTEXT_CLASS(klass);
-
- context->demangle_type = (demangle_fc)demangle_dex_type;
- context->demangle_routine = (demangle_fc)demangle_dex_routine;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : demangler = instance à initialiser. *
-* *
-* Description : Initialise une instance de contexte pour décodage DEX. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dex_demangler_init(GDexDemangler *demangler)
-{
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : demangler = instance d'objet GLib à traiter. *
-* *
-* Description : Supprime toutes les références externes. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dex_demangler_dispose(GDexDemangler *demangler)
-{
- G_OBJECT_CLASS(g_dex_demangler_parent_class)->dispose(G_OBJECT(demangler));
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : demangler = instance d'objet GLib à traiter. *
-* *
-* Description : Procède à la libération totale de la mémoire. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_dex_demangler_finalize(GDexDemangler *demangler)
-{
- G_OBJECT_CLASS(g_dex_demangler_parent_class)->finalize(G_OBJECT(demangler));
-
-}
diff --git a/src/format/mangling/dex/context.h b/src/format/mangling/dex/context.h
deleted file mode 100644
index 1af7a9d..0000000
--- a/src/format/mangling/dex/context.h
+++ /dev/null
@@ -1,52 +0,0 @@
-
-/* Chrysalide - Outil d'analyse de fichiers binaires
- * context.h - prototypes internes liés aux contextes de décodage DEX
- *
- * Copyright (C) 2015-2017 Cyrille Bagard
- *
- * This file is part of Chrysalide.
- *
- * Chrysalide is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * Chrysalide is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef _FORMAT_MANGLING_DEX_CONTEXT_H
-#define _FORMAT_MANGLING_DEX_CONTEXT_H
-
-
-#include <glib-object.h>
-
-
-
-#define G_TYPE_DEX_DEMANGLER g_dex_demangler_get_type()
-#define G_DEX_DEMANGLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_dex_demangler_get_type(), GDexDemangler))
-#define G_IS_DEX_DEMANGLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_dex_demangler_get_type()))
-#define G_DEX_DEMANGLER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_DEX_DEMANGLER, GDexDemanglerClass))
-#define G_IS_DEX_DEMANGLER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_DEX_DEMANGLER))
-#define G_DEX_DEMANGLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_DEX_DEMANGLER, GDexDemanglerClass))
-
-
-/* Contexte de décodage DEX (instance) */
-typedef struct _GDexDemangler GDexDemangler;
-
-/* Contexte de décodage DEX (classe) */
-typedef struct _GDexDemanglerClass GDexDemanglerClass;
-
-
-/* Indique le type défini pour un contexte de décodage DEX. */
-GType g_dex_demangler_get_type(void);
-
-
-
-#endif /* _FORMAT_MANGLING_DEX_CONTEXT_H */
diff --git a/src/format/mangling/dex/shorty_gram.y b/src/format/mangling/dex/shorty_gram.y
deleted file mode 100644
index 55d849d..0000000
--- a/src/format/mangling/dex/shorty_gram.y
+++ /dev/null
@@ -1,138 +0,0 @@
-
-%{
-
-#include <stdbool.h>
-
-
-#include "context.h"
-#include "../context-int.h"
-
-
-
-/* Affiche un message d'erreur concernant l'analyse. */
-static int shorty_error(GDexDemangler *, char *);
-
-/* Procède au décodage d'une chaîne de caractères. */
-bool demangle_dex_routine(GDexDemangler *, const char *);
-
-
-%}
-
-
-%code requires {
-
-#include "../../../analysis/types/basic.h"
-#include "../../../analysis/types/cse.h"
-
-}
-
-%union {
-
- GDataType *type; /* Type reconstruit */
-
-}
-
-
-%parse-param { GDexDemangler *demangler }
-
-%token V Z B S C I J F D L
-
-%type <type> shorty_return_type shorty_field_type
-
-
-%{
-
-/* Déclarations issues de l'analyseur syntaxique... */
-
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-
-extern YY_BUFFER_STATE shorty__scan_string(const char *);
-extern void shorty__delete_buffer(YY_BUFFER_STATE);
-extern int shorty_lex(void);
-
-%}
-
-
-%%
-
-
-shorty_descriptor:
- shorty_return_type shorty_field_type_list {
- GBinRoutine *routine;
- routine = G_DEMANGLING_CONTEXT(demangler)->routine;
- g_binary_routine_set_return_type(routine, $1);
- }
-
-shorty_field_type_list:
- /* empty */
- | shorty_field_type shorty_field_type_list {
- GBinRoutine *routine;
- GBinVariable *var;
- routine = G_DEMANGLING_CONTEXT(demangler)->routine;
- var = g_binary_variable_new($1);
- g_binary_routine_add_arg(routine, var);
- }
-
-shorty_return_type:
- V { $$ = g_basic_type_new(BTP_VOID); }
- | shorty_field_type { $$ = $1; }
-
-shorty_field_type:
- Z { $$ = g_basic_type_new(BTP_BOOL); }
- | B { $$ = g_basic_type_new(BTP_UCHAR); }
- | S { $$ = g_basic_type_new(BTP_SHORT); }
- | C { $$ = g_basic_type_new(BTP_CHAR); }
- | I { $$ = g_basic_type_new(BTP_INT); }
- | J { $$ = g_basic_type_new(BTP_LONG); }
- | F { $$ = g_basic_type_new(BTP_FLOAT); }
- | D { $$ = g_basic_type_new(BTP_DOUBLE); }
- | L { $$ = g_class_enum_type_new(CET_CLASS, ""); }
-
-
-%%
-
-
-/******************************************************************************
-* *
-* Paramètres : demangler = contexte associé à la procédure de décodage. *
-* msg = indications humaines sur l'événement. *
-* *
-* Description : Affiche un message d'erreur concernant l'analyse. *
-* *
-* Retour : Valeur historique, ignorée. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-static int shorty_error(GDexDemangler *demangler, char *msg)
-{
- return -1;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : demangler = contexte de décodage à utiliser. *
-* desc = chaîne de caractères à décoder. *
-* *
-* Description : Procède au décodage d'une chaîne de caractères. *
-* *
-* Retour : Bilan de l'opération. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-bool demangle_dex_routine(GDexDemangler *demangler, const char *desc)
-{
- YY_BUFFER_STATE buffer; /* Tampon pour bison */
- int ret; /* Bilan de l'appel */
-
- buffer = shorty__scan_string(desc);
- ret = yyparse(demangler);
- shorty__delete_buffer(buffer);
-
- return (ret == 0);
-
-}
diff --git a/src/format/mangling/dex/shorty_tok.l b/src/format/mangling/dex/shorty_tok.l
deleted file mode 100644
index 92c264a..0000000
--- a/src/format/mangling/dex/shorty_tok.l
+++ /dev/null
@@ -1,28 +0,0 @@
-
-%{
-
-#include "context.h"
-#include "libformatmanglingdexshorty_la-shorty_gram.h"
-
-%}
-
-
-%option noyywrap
-%option yylineno
-%option nounput
-%option noinput
-
-%%
-
-"V" { return V; }
-"Z" { return Z; }
-"B" { return B; }
-"S" { return S; }
-"C" { return C; }
-"I" { return I; }
-"J" { return J; }
-"F" { return F; }
-"D" { return D; }
-"L" { return L; }
-
-%%
diff --git a/src/format/mangling/dex/type_gram.y b/src/format/mangling/dex/type_gram.y
deleted file mode 100644
index 506eb9b..0000000
--- a/src/format/mangling/dex/type_gram.y
+++ /dev/null
@@ -1,159 +0,0 @@
-
-%{
-
-#include <stdbool.h>
-
-
-#include "context.h"
-#include "../context-int.h"
-
-typedef void *yyscan_t;
-
-/* Affiche un message d'erreur concernant l'analyse. */
-static int type_error(GDexDemangler *, yyscan_t, char *);
-
-/* Procède au décodage d'une chaîne de caractères. */
-bool demangle_dex_type(GDexDemangler *, const char *);
-
-
-%}
-
-
-%code requires {
-
-#include "../../../analysis/types/basic.h"
-#include "../../../analysis/types/cse.h"
-#include "../../../common/extstr.h"
-
-}
-
-%union {
-
- GDataType *type; /* Type reconstruit */
- size_t adeep; /* Dimension d'un tableau */
- char *text; /* Chaîne de caractères */
-
-}
-
-
-
-%define api.pure full
-%parse-param { GDexDemangler *demangler } { yyscan_t scanner }
-%lex-param { yyscan_t scanner }
-
-
-%token V Z B S C I J F D
-%token ARRAY
-%token L SEMICOLON
-%token SLASH DOLLAR
-%token TEXT
-
-%type <type> type_descriptor field_type_descriptor non_array_field_type_descriptor full_class_name
-
-%type <text> TEXT simple_name
-
-
-%{
-
-/* Déclarations issues de l'analyseur syntaxique... */
-
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-
-extern int type_lex_init(yyscan_t *scanner);
-extern YY_BUFFER_STATE type__scan_string(const char *, yyscan_t);
-extern void type__delete_buffer(YY_BUFFER_STATE, yyscan_t);
-extern int type_lex(YYSTYPE *, yyscan_t);
-extern int type_lex_destroy(yyscan_t);
-
-%}
-
-
-%%
-
-
-input:
- type_descriptor { G_DEMANGLING_CONTEXT(demangler)->type = $1; }
-
-type_descriptor:
- V { $$ = g_basic_type_new(BTP_VOID); }
- | field_type_descriptor { $$ = $1; }
-
-field_type_descriptor:
- non_array_field_type_descriptor { $$ = $1; }
- | ARRAY non_array_field_type_descriptor { $$ = $2; }
-
-non_array_field_type_descriptor:
- Z { $$ = g_basic_type_new(BTP_BOOL); }
- | B { $$ = g_basic_type_new(BTP_UCHAR); }
- | S { $$ = g_basic_type_new(BTP_SHORT); }
- | C { $$ = g_basic_type_new(BTP_CHAR); }
- | I { $$ = g_basic_type_new(BTP_INT); }
- | J { $$ = g_basic_type_new(BTP_LONG); }
- | F { $$ = g_basic_type_new(BTP_FLOAT); }
- | D { $$ = g_basic_type_new(BTP_DOUBLE); }
- | L full_class_name SEMICOLON { $$ = $2; }
-
-full_class_name:
- simple_name { $$ = g_class_enum_type_new(CET_CLASS, $1); }
- | full_class_name SLASH simple_name {
- $$ = g_class_enum_type_new(CET_CLASS, $3);
- g_data_type_set_namespace($$, $1);
- g_object_unref($1);
- }
-simple_name:
- TEXT { $$ = strdup($1); }
- | simple_name TEXT { $$ = stradd($1, $2); }
-
-%%
-
-
-/******************************************************************************
-* *
-* Paramètres : demangler = contexte associé à la procédure de décodage. *
-* scanner = données internes aux analyseurs. *
-* msg = indications humaines sur l'événement. *
-* *
-* Description : Affiche un message d'erreur concernant l'analyse. *
-* *
-* Retour : Valeur historique, ignorée. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-static int type_error(GDexDemangler *demangler, yyscan_t scanner, char *msg)
-{
- return -1;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : demangler = contexte de décodage à utiliser. *
-* desc = chaîne de caractères à décoder. *
-* *
-* Description : Procède au décodage d'une chaîne de caractères. *
-* *
-* Retour : Bilan de l'opération. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-bool demangle_dex_type(GDexDemangler *demangler, const char *desc)
-{
- yyscan_t scanner; /* Données internes */
- YY_BUFFER_STATE buffer; /* Tampon pour bison */
- int ret; /* Bilan de l'appel */
-
- type_lex_init(&scanner);
-
- buffer = type__scan_string(desc, scanner);
- ret = yyparse(demangler, scanner);
- type__delete_buffer(buffer, scanner);
-
- type_lex_destroy(scanner);
-
- return (ret == 0);
-
-}
diff --git a/src/format/mangling/dex/type_tok.l b/src/format/mangling/dex/type_tok.l
deleted file mode 100644
index 918846a..0000000
--- a/src/format/mangling/dex/type_tok.l
+++ /dev/null
@@ -1,150 +0,0 @@
-
-%{
-
-#include "context.h"
-#include "libformatmanglingdextype_la-type_gram.h"
-
-/* See lemoda.net/c/reentrant-parser */
-
-%}
-
-
-%option noyywrap
-%option yylineno
-%option nounput
-/*%option noinput*/
-%option reentrant
-%option bison-bridge
-
-%x string
-
-ASCII [A-Za-z0-9]
-SIMPLE {ASCII}|"$"|"-"|"_"
-
-%%
-
-"V" { return V; }
-"Z" { return Z; }
-"B" { return B; }
-"S" { return S; }
-"C" { return C; }
-"I" { return I; }
-"J" { return J; }
-"F" { return F; }
-"D" { return D; }
-"L" { BEGIN(string); return L; }
-"["* { yylval->adeep = strlen(yytext); return ARRAY; }
-<string>"/" { return SLASH; }
-<string>";" { BEGIN(INITIAL); return SEMICOLON; }
-
-<string>{SIMPLE}* { yylval->text = yytext; return TEXT; }
-
-<string>. {
- unsigned char next;
- char mutf8[4];
-
- switch ((unsigned char)yytext[0])
- {
- /* U+00a1 ... U+1fff */
- case 0x00 ... 0x1f:
-
- next = input(yyscanner);
-
- if (yytext[0] == 0x00 && next < 0xa1)
- {
- REJECT;
- }
-
- else
- {
- mutf8[0] = yytext[0];
- mutf8[1] = next;
- mutf8[2] = '\0';
-
- strcpy(yylval->text, mutf8); return TEXT;
-
- }
-
- break;
-
- /* U+2010 ... U+2027 / U+2030 ... U+d7ff */
- case 0x20:
-
- next = input(yyscanner);
-
- switch (next)
- {
- case 0x10 ... 0x27:
- case 0x30 ... 0xff:
-
- mutf8[0] = yytext[0];
- mutf8[1] = next;
- mutf8[2] = '\0';
-
- strcpy(yylval->text, mutf8); return TEXT;
- break;
-
- default:
- REJECT;
- break;
-
- }
-
- break;
-
- /* ~ U+2030 ... U+d7ff */
- case 0x21 ... 0xd7:
-
- next = input(yyscanner);
-
- mutf8[0] = yytext[0];
- mutf8[1] = next;
- mutf8[2] = '\0';
-
- strcpy(yylval->text, mutf8); return TEXT;
- break;
-
- /* U+e000 ... U+ffef */
- case 0xe0 ... 0xff:
-
- next = input(yyscanner);
-
- if (yytext[0] == 0xff && next > 0xef)
- {
- REJECT;
- }
-
- else
- {
- mutf8[0] = yytext[0];
- mutf8[1] = next;
- mutf8[2] = '\0';
-
- strcpy(yylval->text, mutf8); return TEXT;
-
- }
-
- break;
-
- /* U+10000 ... U+10ffff */
- /*
- case 0x10:
-
- mutf8[0] = yytext[0];
- mutf8[1] = input(yyscanner);
- mutf8[2] = input(yyscanner);
- mutf8[3] = '\0';
-
- strcpy(yylval->text, mutf8); return TEXT;
- break;
- */
-
- default:
- REJECT;
- break;
-
- }
-
- }
-
-%%
diff --git a/src/format/mangling/itanium/Makefile.am b/src/format/mangling/itanium/Makefile.am
deleted file mode 100755
index 21a62c0..0000000
--- a/src/format/mangling/itanium/Makefile.am
+++ /dev/null
@@ -1,19 +0,0 @@
-
-noinst_LTLIBRARIES = libformatmanglingitanium.la
-
-libformatmanglingitanium_la_SOURCES = \
- abi.h abi.c \
- component-int.h \
- component.h component.c \
- context.h context.c
-
-libformatmanglingitanium_la_LIBADD =
-
-libformatmanglingitanium_la_LDFLAGS =
-
-
-AM_CPPFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS)
-
-AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS)
-
-SUBDIRS =
diff --git a/src/format/mangling/itanium/abi.c b/src/format/mangling/itanium/abi.c
deleted file mode 100644
index 5645a05..0000000
--- a/src/format/mangling/itanium/abi.c
+++ /dev/null
@@ -1,2444 +0,0 @@
-
-/* Chrysalide - Outil d'analyse de fichiers binaires
- * abi.c - décodage des noms d'éléments selon l'ABI C++ Itanium
- *
- * Copyright (C) 2013-2017 Cyrille Bagard
- *
- * This file is part of Chrysalide.
- *
- * Chrysalide is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * Chrysalide is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include "abi.h"
-
-
-#include <ctype.h>
-#include <stdlib.h>
-
-
-
-#include "../../../analysis/types/basic.h"
-#include "../../../common/cpp.h"
-
-
-
-/* Liste des opérateurs reconnus */
-
-#define IDT_NL(s) s, sizeof(s) - 1
-
-const itanium_operator_info itanium_demangle_operators[] = {
-
- { "aN", IDT_NL("&="), 2 },
- { "aS", IDT_NL("="), 2 },
- { "aa", IDT_NL("&&"), 2 },
- { "ad", IDT_NL("&"), 1 },
- { "an", IDT_NL("&"), 2 },
- { "at", IDT_NL("alignof "), 1 },
- { "az", IDT_NL("alignof "), 1 },
- { "cc", IDT_NL("const_cast"), 2 },
- { "cl", IDT_NL("()"), 2 },
- { "cm", IDT_NL(","), 2 },
- { "co", IDT_NL("~"), 1 },
- { "dV", IDT_NL("/="), 2 },
- { "da", IDT_NL("delete[] "), 1 },
- { "dc", IDT_NL("dynamic_cast"), 2 },
- { "de", IDT_NL("*"), 1 },
- { "dl", IDT_NL("delete "), 1 },
- { "ds", IDT_NL(".*"), 2 },
- { "dt", IDT_NL("."), 2 },
- { "dv", IDT_NL("/"), 2 },
- { "eO", IDT_NL("^="), 2 },
- { "eo", IDT_NL("^"), 2 },
- { "eq", IDT_NL("=="), 2 },
- { "ge", IDT_NL(">="), 2 },
- { "gs", IDT_NL("::"), 1 },
- { "gt", IDT_NL(">"), 2 },
- { "ix", IDT_NL("[]"), 2 },
- { "lS", IDT_NL("<<="), 2 },
- { "le", IDT_NL("<="), 2 },
- { "li", IDT_NL("operator\"\" "), 1 },
- { "ls", IDT_NL("<<"), 2 },
- { "lt", IDT_NL("<"), 2 },
- { "mI", IDT_NL("-="), 2 },
- { "mL", IDT_NL("*="), 2 },
- { "mi", IDT_NL("-"), 2 },
- { "ml", IDT_NL("*"), 2 },
- { "mm", IDT_NL("--"), 1 },
- { "na", IDT_NL("new[]"), 3 },
- { "ne", IDT_NL("!="), 2 },
- { "ng", IDT_NL("-"), 1 },
- { "nt", IDT_NL("!"), 1 },
- { "nw", IDT_NL("new"), 3 },
- { "oR", IDT_NL("|="), 2 },
- { "oo", IDT_NL("||"), 2 },
- { "or", IDT_NL("|"), 2 },
- { "pL", IDT_NL("+="), 2 },
- { "pl", IDT_NL("+"), 2 },
- { "pm", IDT_NL("->*"), 2 },
- { "pp", IDT_NL("++"), 1 },
- { "ps", IDT_NL("+"), 1 },
- { "pt", IDT_NL("->"), 2 },
- { "qu", IDT_NL("?"), 3 },
- { "rM", IDT_NL("%="), 2 },
- { "rS", IDT_NL(">>="), 2 },
- { "rc", IDT_NL("reinterpret_cast"), 2 },
- { "rm", IDT_NL("%"), 2 },
- { "rs", IDT_NL(">>"), 2 },
- { "sc", IDT_NL("static_cast"), 2 },
- { "st", IDT_NL("sizeof "), 1 },
- { "sz", IDT_NL("sizeof "), 1 },
- { "tr", IDT_NL("throw"), 0 },
- { "tw", IDT_NL("throw "), 1 }
-};
-
-/* Substitutions standards */
-
-typedef struct _itanium_std_subst_info
-{
- char code; /* Identifiant associé */
-
- const char *simple; /* Représentation simple */
- size_t simple_len; /* Taille de cette représentat°*/
-
- const char *full; /* Représentation complète */
- size_t full_len; /* Taille de cette représentat°*/
-
- const char *last_name; /* Pour les (con|de)structeurs */
- size_t last_name_len; /* Taille de cette indication */
-
-} itanium_std_subst_info;
-
-const itanium_std_subst_info itanium_standard_substitutions[] = {
-
- {
- 't',
- IDT_NL("std"),
- IDT_NL("std"),
- NULL,
- 0
- },
- {
- 'a',
- IDT_NL("std::allocator"),
- IDT_NL("std::allocator"),
- IDT_NL("allocator")
- },
- {
- 'b',
- IDT_NL("std::basic_string"),
- IDT_NL("std::basic_string"),
- IDT_NL("basic_string")
- },
- {
- 's',
- IDT_NL("std::string"),
- IDT_NL("std::basic_string<char, std::char_traits<char>, std::allocator<char>>"),
- IDT_NL("basic_string")
- },
- {
- 'i',
- IDT_NL("std::istream"),
- IDT_NL("std::basic_istream<char, std::char_traits<char>>"),
- IDT_NL("basic_istream")
- },
- {
- 'o',
- IDT_NL("std::ostream"),
- IDT_NL("std::basic_ostream<char, std::char_traits<char>>"),
- IDT_NL("basic_ostream")
- },
- {
- 'd',
- IDT_NL("std::iostream"),
- IDT_NL("std::basic_iostream<char, std::char_traits<char>>"),
- IDT_NL("basic_iostream")
- }
-
-};
-
-
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_encoding(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_name(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_unscoped_name(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_unscoped_template_name(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_nested_name(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_prefix(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_template_prefix(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_unqualified_name(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_source_name(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static bool itd_number(GItaniumDContext *, ssize_t *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_identifier(GItaniumDContext *, size_t);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_operator_name(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_special_name(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_call_offset(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_nv_offset(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_v_offset(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_ctor_dtor_name(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_type(GItaniumDContext *);
-
-/* Extrait une propriété de composant pour un contexte Itanium. */
-static TypeQualifier itd_cv_qualifiers(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_builtin_type(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_bare_function_type(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_class_enum_type(GItaniumDContext *);
-
-
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_template_args(GItaniumDContext *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_template_arg(GItaniumDContext *);
-
-
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_value_to_string(GItaniumDContext *, bool);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_expr_primary(GItaniumDContext *);
-
-
-
-
-/* Extrait un composant dans un contexte Itanium. */
-static bool itd_seq_id(GItaniumDContext *, char, size_t *);
-
-/* Extrait un composant dans un contexte Itanium. */
-static itanium_component *itd_substitution(GItaniumDContext *);
-
-
-
-
-
-
-#define itd_template_param(ctx) NULL
-
-
-#define itd_local_name(ctx) NULL
-
-
-
-
-#define itd_expression(ctx) NULL
-
-
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-itanium_component *itd_mangled_name(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <mangled-name> ::= _Z <encoding>
- *
- */
-
- if (!g_itanium_dcontext_check_char(context, '_'))
- return NULL;
-
- if (!g_itanium_dcontext_check_char(context, 'Z'))
- return NULL;
-
- result = itd_encoding(context);
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_encoding(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- itd_state saved; /* Position d'analyse courante */
- itanium_component *func; /* Composant 'function name' */
- itanium_component *types; /* Composant 'bare-function...'*/
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <encoding> ::= <function name> <bare-function-type>
- * ::= <data name>
- * ::= <special-name>
- *
- */
-
- result = NULL;
- g_itanium_dcontext_push_state(context, &saved);
-
- func = itd_name(context);
-
- if (func != NULL)
- {
- types = itd_bare_function_type(context);
-
- if (types != NULL)
- result = itd_make_binary(context, ICT_FUNCTION_ENCODING, func, types);
- else
- itd_unref_comp(func);
-
- }
- /*
- if (result == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
- result = itd_name(context);
- }
- */
- if (result == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
- result = itd_special_name(context);
- }
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_name(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- itd_state saved; /* Position d'analyse courante */
- itanium_component *tname; /* Composant '...template-name'*/
- itanium_component *targs; /* Composant 'template-args' */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <name> ::= <nested-name>
- * ::= <unscoped-name>
- * ::= <unscoped-template-name> <template-args>
- * ::= <local-name>
- *
- */
-
- g_itanium_dcontext_push_state(context, &saved);
-
- result = itd_nested_name(context);
-
- if (result == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
-
- tname = itd_unscoped_template_name(context);
-
- if (tname != NULL)
- {
- targs = itd_template_args(context);
-
- if (targs != NULL)
- {
- g_itanium_dcontext_add_substitution(context, tname);
- result = itd_make_binary(context, ICT_TEMPLATE_NAME_ARGS, tname, targs);
- }
-
- else
- itd_unref_comp(tname);
-
- }
-
- }
-
- /**
- * La règle <unscoped-name> doit être traitée après <unscoped-template-name>,
- * car ces deux dernières ont une base commune et la seconde peut avoir besoin
- * d'aller plus loin avec la règle <template-args>.
- *
- * On termine donc par moins gourmand si la règle la plus complexe n'a pas abouti.
- */
-
- if (result == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
- result = itd_unscoped_name(context);
- }
-
- if (result == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
- result = itd_local_name(context);
- }
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_unscoped_name(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <unscoped-name> ::= <unqualified-name>
- * ::= St <unqualified-name> # ::std::
- *
- */
-
-
- /* TODO : 'St' */
-
-
- result = itd_unqualified_name(context);
-
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_unscoped_template_name(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- itd_state saved; /* Position d'analyse courante */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <unscoped-template-name> ::= <unscoped-name>
- * ::= <substitution>
- *
- */
-
- g_itanium_dcontext_push_state(context, &saved);
-
- result = itd_unscoped_name(context);
-
- if (result == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
- result = itd_substitution(context);
- }
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_nested_name(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- TypeQualifier qualifier; /* Propriétés supplémentaires */
- itd_state saved; /* Position d'analyse courante */
- itanium_component *left; /* Première partie */
- itanium_component *right; /* Seconde partie */
-
- static int inner = 0;
-
- int val = inner++;
-
- printf("\n ### (%d) NESTED>> '%s'\n", val,
- g_itanium_dcontext_get_string(context, (size_t []){ 0 }));
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
- * ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
- *
- */
-
- if (!g_itanium_dcontext_check_char(context, 'N'))
- return NULL;
-
- qualifier = itd_cv_qualifiers(context);
-
- result = NULL;
-
- g_itanium_dcontext_push_state(context, &saved);
-
-
- printf("\n ----- (%d) nested prefix '%s'\n", val, g_itanium_dcontext_get_string(context, (size_t []){ 0 }));
-
-
-
- left = itd_prefix(context);
-
- if (left != NULL)
- {
- if (itd_get_component_type(left) != ICT_EMPTY)
- g_itanium_dcontext_add_substitution(context, left);
-
- right = itd_unqualified_name(context);
-
- if (right != NULL)
- {
- if (g_itanium_dcontext_check_char(context, 'E'))
- result = itd_make_binary(context, ICT_NESTED_NAME, left, right);
- else
- printf("=== (%d) nested/prefix : BAD E\n\n", val);
-
- //result = itd_make_binary(context, ICT_NESTED_NAME, left, right);
-
- }
- else
- itd_unref_comp(left);
-
- printf(" ---- (%d) nested prefix --> %p\n\n", val, result);
-
- }
-
-
- if (result == NULL)
- {
- printf("\n ----- (%d) nested template_arg '%s'\n", val, g_itanium_dcontext_get_string(context, (size_t []){ 0 }));
-
- g_itanium_dcontext_pop_state(context, &saved);
-
- left = itd_template_prefix(context);
-
- if (left != NULL)
- {
- g_itanium_dcontext_add_substitution(context, left);
-
- right = itd_template_args(context);
-
- if (right != NULL)
- {
- if (g_itanium_dcontext_check_char(context, 'E'))
- result = itd_make_binary(context, ICT_NESTED_NAME, left, right);
- else
- printf("=== (%d) nested/prefix : BAD E\n\n", val);
- }
- else
- itd_unref_comp(left);
-
- }
-
- printf(" ---- (%d) nested template_arg --> %p\n\n", val, result);
-
- }
-
-
-
- printf("(%d) nested/E >> '%s'\n", val, g_itanium_dcontext_get_string(context, (size_t []){ 0 }));
-
- /*
- if (!g_itanium_dcontext_check_char(context, 'E'))
- {
- printf("=== (%d) NESTED : BAD E\n\n", val);
-
- if (result != NULL)
- itd_unref_comp(result);
- return NULL;
- }
- */
-
- if (result != NULL)
- printf("=== (%d) NESTED OK (%p)\n\n", val, result);
-
- inner--;
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_prefix(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- itanium_component *looping_rule; /* Extraction d'une boucle */
- itd_state saved; /* Position d'analyse courante */
- itanium_component *left; /* Première partie */
- itanium_component *right; /* Seconde partie */
-
- itd_state next_name_saved; /* Position d'analyse courante */
- itanium_component *next_name; /* Eventuel complément #1 */
- itd_state next_targs_saved; /* Position d'analyse courante */
- itanium_component *next_targs; /* Eventuel complément #2 */
-
-
-
- itd_state expected_saved; /* Position d'analyse suivante */
- itanium_component *expected; /* Nom non-qualifié en réserve */
-
-
-
- /**
- * Les deux règles traitées ici sont les suivantes :
- *
- * <prefix> ::= <prefix> <unqualified-name>
- * ::= <template-prefix> <template-args>
- * ::= <template-param>
- * ::= # empty
- * ::= <substitution>
- *
- * <template-prefix> ::= <prefix> <template unqualified-name>
- * ::= <template-param>
- * ::= <substitution>
- *
- * Pour éviter une récursivité qui ferait exploser la pile, on les fusionne
- * en une nouvelle règle <prefix> étendue :
- *
- * <prefix> ::= <prefix> <unqualified-name>
- * ::= <prefix> <unqualified-name> <template-args>
- * ::= <template-param> <template-args>
- * ::= <substitution> <template-args>
- * ::= <template-param>
- * ::= # empty
- * ::= <substitution>
- *
- * On découpe ainsi les traitements en deux parties :
- * - extraction du socle non récursif.
- * - extraction éventuelle d'un complément <unqualified-name> [<template-args>]
- */
-
- result = NULL;
-
- while (1)
- {
- printf("loop....\n");
-
- looping_rule = NULL;
-
- /**
- * Première partie.
- */
-
- g_itanium_dcontext_push_state(context, &saved);
-
- /* <template-param> <template-args> */
-
- left = itd_template_param(context);
-
- if (left != NULL)
- {
- g_itanium_dcontext_add_substitution(context, left);
-
- right = itd_template_args(context);
-
- if (right != NULL)
- looping_rule = itd_make_binary(context, ICT_PREFIX_BINARY, left, right);
- else
- itd_unref_comp(left);
-
- }
-
- /* <substitution> <template-args> */
-
- if (looping_rule != NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
-
- left = itd_substitution(context);
-
- if (left != NULL)
- {
- right = itd_template_args(context);
-
- if (right != NULL)
- looping_rule = itd_make_binary(context, ICT_PREFIX_BINARY, left, right);
- else
- itd_unref_comp(left);
-
- }
-
- }
-
- /* <template-param> */
-
- if (looping_rule == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
- looping_rule = itd_template_param(context);
- }
-
- /* <substitution> */
-
- if (looping_rule == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
- looping_rule = itd_substitution(context);
- }
-
- printf("looping_rule = %p\n", looping_rule);
-
- if (looping_rule != NULL)
- {
- if (result == NULL)
- result = looping_rule;
- else
- result = itd_make_binary(context, ICT_PREFIX_BINARY, result, looping_rule);
- }
-
- /**
- * Seconde partie (1/3) : recherche d'un éventuel complément.
- */
-
- if (looping_rule == NULL)
- g_itanium_dcontext_pop_state(context, &saved);
-
- /* <unqualified-name> */
-
- g_itanium_dcontext_push_state(context, &next_name_saved);
-
- next_name = itd_unqualified_name(context);
-
- if (next_name == NULL)
- {
- /**
- * Si on n'obtient pas de <unqualified-name> ici, rien ne sert de
- * continuer. On se dirige donc vers la sortie avec ce que l'on a.
- */
-
- return NULL;
-
- break;
-
- }
-
- /* <template-args> */
-
- g_itanium_dcontext_push_state(context, &next_targs_saved);
-
- next_targs = itd_template_args(context);
-
- g_itanium_dcontext_pop_state(context, &next_targs_saved);
-
- /**
- * Seconde partie (2/3) : validation de la présence d'un jeton
- * <unqualified-name> en réserve pour la règle <nested-name> parente.
- */
-
- g_itanium_dcontext_push_state(context, &expected_saved);
-
- expected = itd_unqualified_name(context);
-
- if (expected == NULL)
- {
- /**
- * La lecture a été trop loin ici.
- *
- * Le dernier <unqualified-name> valide pour la règle parente est
- * donc celui lu à une fin de recherche de complément.
- *
- * On revient donc à ce stade avant de se diriger vers la sortie.
- */
-
- itd_unref_comp(next_name);
-
- if (next_targs != NULL)
- itd_unref_comp(next_targs);
-
- g_itanium_dcontext_pop_state(context, &next_name_saved);
-
- break;
-
- }
-
- g_itanium_dcontext_pop_state(context, &expected_saved);
-
- /**
- * Seconde partie (3/3) : pleine inscription des composants extraits.
- *
- * On s'est manifestement retrouvé dans un des deux cas suivants :
- * - <prefix> ::= <prefix> <unqualified-name>
- * - <prefix> ::= <prefix> <template unqualified-name> <template-args>
- *
- * Or <prefix> est un candidat pour des substitutions futures, donc on
- * procède à son enregistrement, s'il n'est pas nul.
- */
-
- if (result != NULL)
- g_itanium_dcontext_add_substitution(context, result);
-
- printf("result = %p - next_name = %p\n", result, next_name);
-
-
- if (result == NULL)
- result = next_name;
- else
- result = itd_make_binary(context, ICT_PREFIX_BINARY, result, next_name);
-
- if (next_targs != NULL)
- result = itd_make_binary(context, ICT_PREFIX_BINARY, result, next_targs);
-
-
- printf(" > result = %p\n", result);
-
- }
-
- if (result == NULL)
- result = itd_make_empty(context);
- /*
- if (itd_get_component_type(result) != ICT_PREFIX_BINARY)
- result = itd_make_unary(context, ICT_PREFIX_UNARY, result);
- */
- //printf("<prefix> : %p\n", result);
-
- printf("### FIN DE PREFIX ### '%s'\n",
- g_itanium_dcontext_get_string(context, (size_t []){ 0 }));
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_template_prefix(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- itd_state saved; /* Position d'analyse courante */
- itanium_component *prefix; /* Premier d'un couple de comp.*/
- itanium_component *name; /* Second d'un couple de comp. */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <template-prefix> ::= <prefix> <template unqualified-name>
- * ::= <template-param>
- * ::= <substitution>
- *
- */
-
- result = NULL;
- g_itanium_dcontext_push_state(context, &saved);
-
- prefix = itd_prefix(context);
-
- if (prefix != NULL)
- {
- name = itd_unqualified_name(context);
-
- if (name != NULL)
- result = itd_make_binary(context, ICT_TPREFIX_BINARY, prefix, name);
- else
- itd_unref_comp(prefix);
-
- }
-
- if (result == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
- result = itd_template_param(context);
- }
-
- if (result == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
- result = itd_substitution(context);
- }
-
- if (result != NULL && itd_get_component_type(result) != ICT_TPREFIX_BINARY)
- result = itd_make_unary(context, ICT_TPREFIX_UNARY, result);
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_unqualified_name(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- itd_state saved; /* Position d'analyse courante */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <unqualified-name> ::= <operator-name>
- * ::= <ctor-dtor-name>
- * ::= <source-name>
- *
- */
-
- g_itanium_dcontext_push_state(context, &saved);
-
- result = itd_operator_name(context);
-
- if (result == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
- result = itd_ctor_dtor_name(context);
- }
-
- if (result == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
- result = itd_source_name(context);
- }
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_source_name(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- ssize_t number; /* Taille positive */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <source-name> ::= <positive length number> <identifier>
- *
- */
-
- if (!itd_number(context, &number))
- return NULL;
-
- if (number <= 0)
- return NULL;
-
- result = itd_identifier(context, number);
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* size = taille positive ou non lue. [OUT] *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Bilan de l'opération (un chifre lu au moins). *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static bool itd_number(GItaniumDContext *context, ssize_t *size)
-{
- bool result; /* Validité à renvoyer */
- bool negative; /* Taille négative ? */
- char peek; /* Prochain caractère lu */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <number> ::= [n] <non-negative decimal integer>
- *
- */
-
- result = false;
-
- negative = false;
-
- peek = g_itanium_dcontext_peek_char(context);
-
- if (peek == 'n')
- {
- negative = true;
- g_itanium_dcontext_advance(context, 1);
- peek = g_itanium_dcontext_peek_char(context);
- }
-
- *size = 0;
-
- while (isdigit(peek))
- {
- result = true;
- *size = *size * 10 + peek - '0';
- g_itanium_dcontext_advance(context, 1);
- peek = g_itanium_dcontext_peek_char(context);
- }
-
- if (negative)
- *size *= -1;
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* length = taille de l'identifiant à retrouver. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_identifier(GItaniumDContext *context, size_t length)
-{
- itanium_component *result; /* Construction à retourner */
- const char *data; /* Données restantes */
- size_t remaining; /* Quantité d'octets */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <identifier> ::= <unqualified source code identifier>
- *
- */
-
- data = g_itanium_dcontext_get_string(context, &remaining);
-
- if (length > remaining)
- return NULL;
-
- result = itd_make_name(context, data, length);
-
- if (result != NULL)
- g_itanium_dcontext_advance(context, length);
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_operator_name(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- char code[2]; /* Code à venir lire */
- itanium_operator_info info; /* Clef des informations */
- itanium_operator_info *found; /* Informations complètes */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <operator-name> ::= nw # new
- * ::= na # new[]
- * ::= dl # delete
- * ::= da # delete[]
- * ::= ps # + (unary)
- * ::= ng # - (unary)
- * ::= ad # & (unary)
- * ::= de # * (unary)
- * ::= co # ~
- * ::= pl # +
- * ::= mi # -
- * ::= ml # *
- * ::= dv # /
- * ::= rm # %
- * ::= an # &
- * ::= or # |
- * ::= eo # ^
- * ::= aS # =
- * ::= pL # +=
- * ::= mI # -=
- * ::= mL # *=
- * ::= dV # /=
- * ::= rM # %=
- * ::= aN # &=
- * ::= oR # |=
- * ::= eO # ^=
- * ::= ls # <<
- * ::= rs # >>
- * ::= lS # <<=
- * ::= rS # >>=
- * ::= eq # ==
- * ::= ne # !=
- * ::= lt # <
- * ::= gt # >
- * ::= le # <=
- * ::= ge # >=
- * ::= nt # !
- * ::= aa # &&
- * ::= oo # ||
- * ::= pp # ++
- * ::= mm # --
- * ::= cm # ,
- * ::= pm # ->*
- * ::= pt # ->
- * ::= cl # ()
- * ::= ix # []
- * ::= qu # ?
- * ::= st # sizeof (a type)
- * ::= sz # sizeof (an expression)
- * ::= cv <type> # (cast)
- * ::= v <digit> <source-name> # vendor extended operator
- *
- */
-
- result = NULL;
-
- code[0] = g_itanium_dcontext_next_char(context);
-
- if (code[0] == 'v')
- {
-
- result = NULL; /* TODO */
-
- goto itd_operator_name_exit;
-
-
- }
-
- code[1] = g_itanium_dcontext_next_char(context);
-
- if (code[0] == 'c' && code[1] == 'v')
- {
-
- result = NULL; /* TODO */
-
- goto itd_operator_name_exit;
-
-
- }
-
- /* Recherche dans la liste des opérateurs reconnus */
-
- info.code = code;
-
- int comp_itanium_operators(const itanium_operator_info *a, const itanium_operator_info *b)
- {
- int result; /* Bilan à renvoyer */
-
- if (a->code[0] < b->code[0])
- result = -1;
- else if (a->code[0] > b->code[0])
- result = 1;
- else
- {
- if (a->code[1] < b->code[1])
- result = -1;
- else if (a->code[1] > b->code[1])
- result = 1;
- else
- result = 0;
- }
-
- return result;
-
- }
-
- found = bsearch(&info, itanium_demangle_operators,
- ARRAY_SIZE(itanium_demangle_operators),
- sizeof(itanium_operator_info), (__compar_fn_t)comp_itanium_operators);
-
- if (found != NULL)
- result = itd_make_operator(context, found);
-
- itd_operator_name_exit:
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_special_name(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- char next; /* Caractère suivant */
- char peek; /* Prochain caractère lu */
- itanium_component *offset1; /* Décalage extrait #1 */
- itanium_component *encoding; /* Encodage suivant */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <special-name> ::= T <call-offset> <base encoding>
- * # base is the nominal target function of thunk
- */
-
- result = NULL;
-
- next = g_itanium_dcontext_next_char(context);
-
- if (next == 'T')
- {
- peek = g_itanium_dcontext_peek_char(context);
-
- switch (peek)
- {
- case 'V':
- result = NULL; /* TODO */
- break;
-
- case 'T':
- result = NULL; /* TODO */
- break;
-
- case 'I':
- result = NULL; /* TODO */
- break;
-
- case 'S':
- result = NULL; /* TODO */
- break;
-
- case 'c':
- result = NULL; /* TODO */
- break;
-
-
- default:
-
- offset1 = itd_call_offset(context);
- if (offset1 == NULL) break;
-
- encoding = itd_encoding(context);
-
- if (encoding == NULL)
- itd_unref_comp(offset1);
- else
- result = itd_make_binary(context, ICT_FUNCTION_THUNK, offset1, encoding);
-
- break;
-
- }
-
- }
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_call_offset(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- char next; /* Caractère suivant */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <call-offset> ::= h <nv-offset> _
- * ::= v <v-offset> _
- */
-
- next = g_itanium_dcontext_next_char(context);
-
- switch (next)
- {
- case 'h':
- result = itd_nv_offset(context);
- break;
-
- case 'v':
- result = itd_v_offset(context);
- break;
-
- default:
- result = NULL;
- break;
-
- }
-
- if (result != NULL && !g_itanium_dcontext_check_char(context, '_'))
- {
- itd_unref_comp(result);
- result = NULL;
- }
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_nv_offset(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- ssize_t offset; /* Décalage obtenu */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <nv-offset> ::= <offset number>
- * # non-virtual base override
- */
-
- if (!itd_number(context, &offset))
- return NULL;
-
- result = itd_make_offset(context, ICT_NON_VIRTUAL_OFFSET, offset);
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_v_offset(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- ssize_t offset; /* Décalage obtenu #1 */
- ssize_t voffset; /* Décalage obtenu #2 */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <v-offset> ::= <offset number> _ <virtual offset number>
- * # virtual base override, with vcall offset
- */
-
- if (!itd_number(context, &offset))
- return NULL;
-
- if (!g_itanium_dcontext_check_char(context, '_'))
- return NULL;
-
- if (!itd_number(context, &voffset))
- return NULL;
-
- result = itd_make_binary(context, ICT_VIRTUAL_OFFSET,
- itd_make_offset(context, ICT_NON_VIRTUAL_OFFSET, offset),
- itd_make_offset(context, ICT_VIRTUAL_OFFSET, voffset));
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_ctor_dtor_name(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- char next; /* Caractère suivant */
- ItaniumComponentType type; /* Type de composant */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <ctor-dtor-name> ::= C1 # complete object constructor
- * ::= C2 # base object constructor
- * ::= C3 # complete object allocating constructor
- * ::= D0 # deleting destructor
- * ::= D1 # complete object destructor
- * ::= D2 # base object destructor
- */
-
- next = g_itanium_dcontext_peek_char(context);
-
- if (next == 'C')
- type = ICT_CONSTRUCTOR;
- else if (next == 'D')
- type = ICT_DESSTRUCTOR;
- else
- return NULL;
-
- g_itanium_dcontext_advance(context, 1);
-
- next = g_itanium_dcontext_peek_char(context);
-
- if (next != '0' && next != '1' && next != '2')
- return NULL;
-
- g_itanium_dcontext_advance(context, 1);
-
- result = itd_make_empty(context);
- itd_set_type(result, type);
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_type(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- TypeQualifier qualifier; /* Propriétés supplémentaires */
- itanium_component *sub; /* Sous-type lié à associer */
- itd_state saved; /* Position d'analyse courante */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <type> ::= <builtin-type>
- * ::= <function-type>
- * ::= <class-enum-type>
- * ::= <array-type>
- * ::= <pointer-to-member-type>
- * ::= <template-param>
- * ::= <template-template-param> <template-args>
- * ::= <substitution> # See Compression below
- * ::= <CV-qualifiers> <type>
- * ::= P <type> # pointer-to
- * ::= R <type> # reference-to
- * ::= O <type> # rvalue reference-to (C++0x)
- * ::= C <type> # complex pair (C 2000)
- * ::= G <type> # imaginary (C 2000)
- * ::= U <source-name> <type> # vendor extended type qualifier
- *
- */
-
- result = NULL;
-
- qualifier = itd_cv_qualifiers(context);
-
- switch (g_itanium_dcontext_peek_char(context))
- {
- case 'P':
-
- g_itanium_dcontext_advance(context, 1);
-
- sub = itd_type(context);
- if (sub == NULL) return NULL;
-
- result = itd_make_unary(context, ICT_POINTER_TO, sub);
- break;
-
- case 'R':
-
- g_itanium_dcontext_advance(context, 1);
-
- sub = itd_type(context);
- if (sub == NULL) return NULL;
-
- result = itd_make_unary(context, ICT_REFERENCE_TO, sub);
- break;
-
- case 'O':
-
- g_itanium_dcontext_advance(context, 1);
-
- sub = itd_type(context);
- if (sub == NULL) return NULL;
-
- result = itd_make_unary(context, ICT_RVALUE_REFERENCE_TO, sub);
- break;
-
- case 'C':
-
- g_itanium_dcontext_advance(context, 1);
-
- sub = itd_type(context);
- if (sub == NULL) return NULL;
-
- result = itd_make_unary(context, ICT_COMPLEX_PAIR, sub);
- break;
-
- case 'G':
-
- g_itanium_dcontext_advance(context, 1);
-
- sub = itd_type(context);
- if (sub == NULL) return NULL;
-
- result = itd_make_unary(context, ICT_IMAGINARY, sub);
- break;
-
- case 'U':
-
- g_itanium_dcontext_advance(context, 1);
- /* TODO */
- return NULL;
- break;
-
- }
-
- if (result != NULL) goto itd_type_end;
-
- g_itanium_dcontext_push_state(context, &saved);
-
- result = itd_builtin_type(context);
- if (result != NULL) goto itd_type_end;
-
- g_itanium_dcontext_pop_state(context, &saved);
-
- result = itd_class_enum_type(context);
- if (result != NULL) goto itd_type_end;
-
-
- g_itanium_dcontext_pop_state(context, &saved);
-
- result = itd_substitution(context);
- if (result != NULL) goto itd_type_end;
-
-
-
-
- itd_type_end:
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait une propriété de composant pour un contexte Itanium. *
-* *
-* Retour : Indication extraite. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static TypeQualifier itd_cv_qualifiers(GItaniumDContext *context)
-{
- TypeQualifier result; /* Valeur à remonter */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <CV-qualifiers> ::= [r] [V] [K] # restrict (C99), volatile, const
- *
- */
-
- result = TQF_NONE;
-
- while (1)
- switch (g_itanium_dcontext_peek_char(context))
- {
- case 'r':
- result = TQF_RESTRICT;
- g_itanium_dcontext_advance(context, 1);
- break;
-
- case 'V':
- result = TQF_VOLATILE;
- g_itanium_dcontext_advance(context, 1);
- break;
-
- case 'K':
- result = TQF_CONST;
- g_itanium_dcontext_advance(context, 1);
- break;
-
- default:
- goto itd_cv_qualifiers_exit;
- break;
-
- }
-
- itd_cv_qualifiers_exit:
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_builtin_type(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- BaseType type; /* Type reconnu ou BTP_INVALID */
- GDataType *builtin; /* Type construit */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <builtin-type> ::= v # void
- * ::= w # wchar_t
- * ::= b # bool
- * ::= c # char
- * ::= a # signed char
- * ::= h # unsigned char
- * ::= s # short
- * ::= t # unsigned short
- * ::= i # int
- * ::= j # unsigned int
- * ::= l # long
- * ::= m # unsigned long
- * ::= x # long long, __int64
- * ::= y # unsigned long long, __int64
- * ::= n # __int128
- * ::= o # unsigned __int128
- * ::= f # float
- * ::= d # double
- * ::= e # long double, __float80
- * ::= g # __float128
- * ::= z # ellipsis
- * ::= u <source-name> # vendor extended type
- *
- */
-
- switch (g_itanium_dcontext_peek_char(context))
- {
- case 'v':
- type = BTP_VOID;
- break;
- case 'w':
- type = BTP_WCHAR_T;
- break;
- case 'b':
- type = BTP_BOOL;
- break;
- case 'c':
- type = BTP_CHAR;
- break;
- case 'a':
- type = BTP_SCHAR;
- break;
- case 'h':
- type = BTP_UCHAR;
- break;
- case 's':
- type = BTP_SHORT;
- break;
- case 't':
- type = BTP_USHORT;
- break;
- case 'i':
- type = BTP_INT;
- break;
- case 'j':
- type = BTP_UINT;
- break;
- case 'l':
- type = BTP_LONG;
- break;
- case 'm':
- type = BTP_ULONG;
- break;
- case 'x':
- type = BTP_LONG_LONG;
- break;
- case 'y':
- type = BTP_ULONG_LONG;
- break;
- case 'n':
- type = BTP_INT128;
- break;
- case 'o':
- type = BTP_UINT128;
- break;
- case 'f':
- type = BTP_FLOAT;
- break;
- case 'd':
- type = BTP_DOUBLE;
- break;
- case 'e':
- type = BTP_LONG_DOUBLE;
- break;
- case 'g':
- type = BTP_FLOAT128;
- break;
- case 'z':
- type = BTP_ELLIPSIS;
- break;
- case 'u':
- type = BTP_OTHER;
- /* FIXME */
- /* <source-name> # vendor extended type */
- break;
- default:
- type = BTP_INVALID;
- break;
- }
-
- if (type != BTP_INVALID)
- {
- builtin = g_basic_type_new(type);
- result = itd_make_type(context, builtin);
- g_itanium_dcontext_advance(context, 1);
- }
- else
- result = NULL;
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_bare_function_type(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- itanium_component *type; /* Nouvel élément à intégrer */
- itd_state saved; /* Position d'analyse courante */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <bare-function-type> ::= <signature type>+
- * # types are possible return type, then parameter types
- *
- */
-
- type = itd_type(context);
- if (type == NULL) return NULL;
-
- result = itd_append_right_to_binary(context, ICT_TYPES_LIST, NULL, type);
-
- while (1)
- {
- g_itanium_dcontext_push_state(context, &saved);
-
- type = itd_type(context);
- if (type == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
- break;
- }
-
- result = itd_append_right_to_binary(context, ICT_TYPES_LIST, result, type);
-
- }
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_class_enum_type(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <class-enum-type> ::= <name>
- *
- */
-
- result = itd_name(context);
-
- return result;
-
-}
-
-
-
-
-
-
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_template_args(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- itanium_component *arg; /* Nouvel argument extrait */
- itd_state saved; /* Position d'analyse courante */
-
- printf(">>> TA>> '%s'\n", g_itanium_dcontext_get_string(context, (size_t []){ 0 }));
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <template-args> ::= I <template-arg>+ E
- *
- */
-
- if (!g_itanium_dcontext_check_char(context, 'I'))
- return NULL;
-
- arg = itd_template_arg(context);
- if (arg == NULL) return NULL;
-
- result = itd_append_right_to_binary(context, ICT_TYPES_LIST, NULL, arg);
-
- while (1)
- {
- g_itanium_dcontext_push_state(context, &saved);
-
- arg = itd_template_arg(context);
- if (arg == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
- break;
- }
-
- result = itd_append_right_to_binary(context, ICT_TYPES_LIST, result, arg);
-
- }
-
- //printf(" ta/E >> '%s'\n", g_itanium_dcontext_get_string(context, (size_t []){ 0 }));
-
- if (!g_itanium_dcontext_check_char(context, 'E'))
- {
- //printf("=== TA : BAD E\n\n");
-
- if (result != NULL)
- itd_unref_comp(result);
- return NULL;
- }
-
- //printf("=== TA >> %p\n\n", result);
-
- result = itd_make_unary(context, ICT_TEMPLATE_ARGS, result);
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_template_arg(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- itd_state saved; /* Position d'analyse courante */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <template-arg> ::= <type> # type or template
- * ::= X <expression> E # expression
- * ::= <expr-primary> # simple expressions
- *
- */
-
- g_itanium_dcontext_push_state(context, &saved);
-
- result = itd_type(context);
-
- if (result == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
-
- if (g_itanium_dcontext_check_char(context, 'X'))
- {
- result = itd_expression(context);
-
- if (result != NULL && !g_itanium_dcontext_check_char(context, 'E'))
- {
- itd_unref_comp(result);
- result = NULL;
- }
-
- }
-
- }
-
- if (result == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
- result = itd_expr_primary(context);
- }
-
- return result;
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* hex = prise en compte des caractères hexadécimaux ? *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_value_to_string(GItaniumDContext *context, bool hex)
-{
- itanium_component *result; /* Construction à retourner */
- const char *data; /* Données restantes */
- itd_state saved; /* Position d'analyse initiale */
- itd_state cur; /* Position d'analyse courante */
- char peek; /* Prochain caractère lu */
-
- /**
- * Les règles traitées ici sont les suivantes :
- *
- * <value number> # integer literal
- * <value float> # floating literal
- *
- */
-
- result = NULL;
-
- data = g_itanium_dcontext_get_string(context, (size_t []) { 0 });
-
- g_itanium_dcontext_push_state(context, &saved);
-
- while (1)
- {
- peek = g_itanium_dcontext_peek_char(context);
-
- switch (peek)
- {
- case '0' ... '9':
- g_itanium_dcontext_advance(context, 1);
- break;
-
- case 'a' ... 'f':
- if (hex)
- g_itanium_dcontext_advance(context, 1);
- else
- goto exit_iits;
- break;
-
- case 'E':
- goto exit_loop;
- break;
-
- default:
- goto exit_iits;
-
- }
-
- }
-
- exit_loop:
-
- g_itanium_dcontext_push_state(context, &cur);
-
- if ((cur.pos - saved.pos) > 0)
- result = itd_make_name(context, data, cur.pos - saved.pos);
-
- exit_iits:
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_expr_primary(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- itd_state saved; /* Position d'analyse courante */
- itanium_component *type; /* Type de valeur extrait */
- itd_state saved_value; /* Position d'analyse courante */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <expr-primary> ::= L <type> <value number> E # integer literal
- * ::= L <type> <value float> E # floating literal
- * ::= L <mangled-name> E # external name
- *
- */
-
- printf("PRIMARY :: no L\n");
-
- if (!g_itanium_dcontext_check_char(context, 'L'))
- return NULL;
-
- g_itanium_dcontext_push_state(context, &saved);
-
- type = itd_type(context);
-
- if (type != NULL)
- {
- g_itanium_dcontext_push_state(context, &saved_value);
-
- /* Règle <type> <value number> */
-
- result = itd_value_to_string(context, false);
-
- if (result != NULL && !g_itanium_dcontext_check_char(context, 'E'))
- {
- itd_unref_comp(result);
- result = NULL;
- }
-
- /* Règle <type> <value float> */
-
- if (result == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved_value);
-
- result = itd_value_to_string(context, true);
-
- if (result != NULL && !g_itanium_dcontext_check_char(context, 'E'))
- {
- itd_unref_comp(result);
- result = NULL;
- }
-
- }
-
- itd_unref_comp(type);
-
- }
- else
- result = NULL;
-
- /* Règle <mangled-name> */
-
- if (result == NULL)
- {
- g_itanium_dcontext_pop_state(context, &saved);
- result = itd_mangled_name(context);
-
- if (result != NULL && !g_itanium_dcontext_check_char(context, 'E'))
- {
- itd_unref_comp(result);
- result = NULL;
- }
-
- }
-
- printf("PRIMARY :: %p\n", result);
-
- return result;
-
-}
-
-
-
-
-
-
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* cur = caractère courant. *
-* id = identifiant lu en cas de succès. [OUT] *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Bilan de l'opération. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static bool itd_seq_id(GItaniumDContext *context, char cur, size_t *id)
-{
- /**
- * La règle traitée ici est la suivante :
- *
- * <seq-id>
- *
- */
-
- *id = 0;
-
- /**
- * La fonction n'est appelée que si un début de séquence est détecté.
- * (ie, cur == '_' || isdigit(cur) || isupper(cur)).
- */
-
- if (cur != '_')
- {
- do
- {
- if (isdigit(cur))
- *id = *id * 36 + cur - '0';
- else if (isupper(cur))
- *id = *id * 36 + cur - 'A' + 10;
- else
- return false;
-
- cur = g_itanium_dcontext_next_char(context);
-
- }
- while (cur != '_');
-
- (*id)++;
-
- }
-
- return true;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Extrait un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static itanium_component *itd_substitution(GItaniumDContext *context)
-{
- itanium_component *result; /* Construction à retourner */
- char cur; /* Caractère analysé */
- size_t id; /* Identifiant de substitution */
- char peek; /* Prochain caractère lu */
- bool verbose; /* Sélection du rendu idéal */
- size_t i; /* Boucle de parcours */
-
- /**
- * La règle traitée ici est la suivante :
- *
- * <substitution> ::= S <seq-id> _
- * ::= S_
- * ::= St # ::std::
- * ::= Sa # ::std::allocator
- * ::= Sb # ::std::basic_string
- * ::= Ss # ::std::basic_string<char, ::std::char_traits<char>, ::std::allocator<char>>
- * ::= Si # ::std::basic_istream<char, std::char_traits<char>>
- * ::= So # ::std::basic_ostream<char, std::char_traits<char>>
- * ::= Sd # ::std::basic_iostream<char, std::char_traits<char>>
- *
- */
-
- peek = g_itanium_dcontext_peek_char(context);
-
- if (!g_itanium_dcontext_check_char(context, 'S'))
- return NULL;
-
- cur = g_itanium_dcontext_next_char(context);
-
- if (cur == '_' || isdigit(cur) || isupper(cur))
- {
- if (!itd_seq_id(context, cur, &id))
- return NULL;
-
- printf("requesting... %zu\n", id);
-
- result = g_itanium_dcontext_get_substitution(context, id);
-
- }
- else
- {
- result = NULL;
-
- peek = g_itanium_dcontext_peek_char(context);
- verbose = (peek == 'C' || peek == 'D'); /* TODO : prefixe ? */
-
- for (i = 0; i < ARRAY_SIZE(itanium_standard_substitutions); i++)
- if (itanium_standard_substitutions[i].code == cur)
- {
- /* TODO : constructeur... */
-
- if (verbose)
- result = itd_make_name(context,
- itanium_standard_substitutions[i].full,
- itanium_standard_substitutions[i].full_len);
- else
- result = itd_make_name(context,
- itanium_standard_substitutions[i].simple,
- itanium_standard_substitutions[i].simple_len);
-
- itd_set_type(result, ICT_STD_SUBST);
-
- break;
-
- }
-
- }
-
- return result;
-
-}
diff --git a/src/format/mangling/itanium/abi.h b/src/format/mangling/itanium/abi.h
deleted file mode 100644
index 1ed21f3..0000000
--- a/src/format/mangling/itanium/abi.h
+++ /dev/null
@@ -1,38 +0,0 @@
-
-/* Chrysalide - Outil d'analyse de fichiers binaires
- * abi.h - prototypes pour le décodage des noms d'éléments selon l'ABI C++ Itanium
- *
- * Copyright (C) 2013-2017 Cyrille Bagard
- *
- * This file is part of Chrysalide.
- *
- * Chrysalide is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * Chrysalide is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef _FORMAT_MANGLING_ITANIUM_ABI_H
-#define _FORMAT_MANGLING_ITANIUM_ABI_H
-
-
-#include "component.h"
-#include "context.h"
-
-
-
-/* Extrait un composant dans un contexte Itanium. */
-itanium_component *itd_mangled_name(GItaniumDContext *);
-
-
-
-#endif /* _FORMAT_MANGLING_ITANIUM_ABI_H */
diff --git a/src/format/mangling/itanium/component-int.h b/src/format/mangling/itanium/component-int.h
deleted file mode 100644
index 3d4c1d0..0000000
--- a/src/format/mangling/itanium/component-int.h
+++ /dev/null
@@ -1,79 +0,0 @@
-
-
-#ifndef _FORMAT_MANGLING_ITANIUM_ABI2_H
-#define _FORMAT_MANGLING_ITANIUM_ABI2_H
-
-
-#include "component.h"
-
-
-
-/* Composant extrait de l'encodage */
-struct _itanium_component
-{
- ItaniumComponentType type; /* Type de composant */
-
- GItaniumDContext *context; /* Regroupement de composants */
- unsigned int refcount; /* Compteur de références */
-
- fnv64_t hash; /* Empreinte en cache */
-
- union
- {
- /* ICT_NAME */
- struct
- {
- const char *str;
- size_t len;
-
- } s_name;
-
- /* ICT_OPERATOR_NAME */
- struct
- {
- ItaniumOperatorType otype; /* Sélection dans l'union */
-
- union
- {
- itanium_operator_info info; /* Opérateur simple */
-
-
- };
-
- } operator;
-
- /* ICT_NON_VIRTUAL_OFFSET */
- /* ICT_VIRTUAL_OFFSET */
- ssize_t offset; /* Décalage de fonction */
-
- /* ICT_TYPE */
- GDataType *dtype; /* Type instancié */
-
-
- /* ICT_* */
- struct
- {
- itanium_component *left; /* Elément premier */
- itanium_component *right; /* Elément second */
-
- } binary;
-
- /* ICT_* */
- struct
- {
- itanium_component *first; /* Elément premier */
- itanium_component *second; /* Elément second */
- itanium_component *third; /* Elément troisième */
-
- } ternary;
-
- /* ICT_* */
- itanium_component *unary; /* Sous-élément */
-
- };
-
-};
-
-
-
-#endif /* _FORMAT_MANGLING_ITANIUM_ABI2_H */
diff --git a/src/format/mangling/itanium/component.c b/src/format/mangling/itanium/component.c
deleted file mode 100644
index c2edc17..0000000
--- a/src/format/mangling/itanium/component.c
+++ /dev/null
@@ -1,717 +0,0 @@
-
-/* Chrysalide - Outil d'analyse de fichiers binaires
- * component.c - représentation des composants extraits de l'ABI C++ Itanium
- *
- * Copyright (C) 2013-2017 Cyrille Bagard
- *
- * This file is part of Chrysalide.
- *
- * Chrysalide is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * Chrysalide is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include "component.h"
-
-
-#include <malloc.h>
-#include <string.h>
-
-
-#include "component-int.h"
-#include "../../../common/extstr.h"
-#include "../../../common/fnv1a.h"
-
-
-
-
-/* Procédure à appliquer sur un composant visité */
-typedef void (* visit_comp_fc) (itanium_component *);
-
-
-
-#define reset_comp_hash(c) c->hash = 0
-
-/* Visite les composants en présence. */
-static void visit_comp(itanium_component *, visit_comp_fc);
-
-
-
-/******************************************************************************
-* *
-* Paramètres : comp = composant à traiter. *
-* visitor = fonction à appliquer sur les composants présents. *
-* *
-* Description : Visite les composants en présence. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void visit_comp(itanium_component *comp, visit_comp_fc visitor)
-{
- itanium_component *sub; /* Sous-partie de composant */
-
- switch (comp->type)
- {
- case ICT_NESTED_NAME:
- case ICT_TEMPLATE_NAME_ARGS:
- visit_comp(comp->binary.left, visitor);
- visit_comp(comp->binary.right, visitor);
- break;
-
- case ICT_PREFIX_UNARY:
- case ICT_TPREFIX_UNARY:
- visit_comp(comp->unary, visitor);
- break;
-
- case ICT_PREFIX_BINARY:
- case ICT_TPREFIX_BINARY:
- visit_comp(comp->binary.left, visitor);
- visit_comp(comp->binary.right, visitor);
- break;
-
- case ICT_FUNCTION_THUNK:
- visit_comp(comp->binary.left, visitor);
- visit_comp(comp->binary.right, visitor);
- break;
-
- case ICT_FUNCTION_COVARIANT_THUNK:
- visit_comp(comp->ternary.first, visitor);
- visit_comp(comp->ternary.second, visitor);
- visit_comp(comp->ternary.third, visitor);
- break;
-
- case ICT_POINTER_TO:
- visit_comp(comp->unary, visitor);
- break;
-
- case ICT_REFERENCE_TO:
- visit_comp(comp->unary, visitor);
- break;
-
- case ICT_RVALUE_REFERENCE_TO:
- visit_comp(comp->unary, visitor);
- break;
-
- case ICT_COMPLEX_PAIR:
- visit_comp(comp->unary, visitor);
- break;
-
- case ICT_IMAGINARY:
- visit_comp(comp->unary, visitor);
- break;
-
- case ICT_FUNCTION_ENCODING:
-
- /* Retour ? */
-
- sub = NULL;//IT_BINARY_COMP(IT_BINARY_COMP(comp).right).left;
-
- if (sub != NULL)
- visit_comp(sub, visitor);
-
- /* Nom de la fonction */
- visit_comp(comp->binary.left, visitor);
-
- visit_comp(comp->binary.right, visitor);
-
- break;
-
- case ICT_TEMPLATE_ARGS:
- visit_comp(comp->unary, visitor);
- break;
-
- case ICT_TYPES_LIST:
-
- visit_comp(comp->binary.left, visitor);
-
- if (comp->binary.right != NULL)
- visit_comp(comp->binary.right, visitor);
-
- break;
-
- default:
- break;
-
- }
-
- visitor(comp);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : comp = composant à mettre à jour. *
-* *
-* Description : Incrémente le nombre d'utilisation du composant. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void itd_ref_comp(itanium_component *comp)
-{
- void visit_for_ref(itanium_component *comp)
- {
- comp->refcount++;
-
- }
-
- visit_comp(comp, visit_for_ref);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : comp = composant à mettre à jour. *
-* *
-* Description : Décrémente le nombre d'utilisation du composant. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void itd_unref_comp(itanium_component *comp)
-{
- return;
-
- void visit_for_unref(itanium_component *comp)
- {
- if (--comp->refcount == 0)
- {
- if (comp->type == ICT_TYPE)
- g_object_unref(G_OBJECT(comp->dtype));
-
- g_itanium_dcontext_mark_component_as_free(comp->context, comp);
-
- }
-
- }
-
- visit_comp(comp, visit_for_unref);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : comp = composant à manipuler. *
-* *
-* Description : Détermine ou fournit l'empreinte d'un composant. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-fnv64_t itd_hash_comp(itanium_component *comp)
-{
- char *desc; /* Description du composant */
-
- if (comp->hash == 0)
- {
- desc = itd_translate_component(comp->context, comp, NULL);
- comp->hash = fnv_64a_hash(desc);
- free(desc);
- }
-
- return comp->hash;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Construit un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-itanium_component *itd_make_empty(GItaniumDContext *context)
-{
- itanium_component *result; /* Composant à renvoyer */
-
- result = g_itanium_dcontext_get_empty_component(context);
-
- result->type = ICT_EMPTY;
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* str = chaîne de caractères à conserver. *
-* len = taille de l'identifiant à retrouver. *
-* *
-* Description : Construit un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-itanium_component *itd_make_name(GItaniumDContext *context, const char *str, size_t len)
-{
- itanium_component *result; /* Composant à renvoyer */
-
- result = g_itanium_dcontext_get_empty_component(context);
-
- result->type = ICT_NAME;
- result->s_name.str = str;
- result->s_name.len = len;
-
- return result;
-
-}
-
-
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* info = information de base sur l'opérateur manipulé. *
-* *
-* Description : Construit un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-itanium_component *itd_make_operator(GItaniumDContext *context, const itanium_operator_info *info)
-{
- itanium_component *result; /* Composant à renvoyer */
-
- result = g_itanium_dcontext_get_empty_component(context);
-
- result->type = ICT_OPERATOR_NAME;
- result->operator.otype = IOT_SIMPLE;
- result->operator.info = *info;
-
- return result;
-
-}
-
-
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* type = type exacte de décalage. *
-* offset = décalage extrait de l'encodage. *
-* *
-* Description : Construit un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-itanium_component *itd_make_offset(GItaniumDContext *context, ItaniumComponentType type, ssize_t offset)
-{
- itanium_component *result; /* Composant à renvoyer */
-
- result = g_itanium_dcontext_get_empty_component(context);
-
- result->type = type;
- result->offset = offset;
-
- return result;
-
-}
-
-
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* dtype = instance de type en place à conserver. *
-* *
-* Description : Construit un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-itanium_component *itd_make_type(GItaniumDContext *context, GDataType *dtype)
-{
- itanium_component *result; /* Composant à renvoyer */
-
- result = g_itanium_dcontext_get_empty_component(context);
-
- result->type = ICT_TYPE;
- result->dtype = dtype;
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* type = type du composant à mettre en place. *
-* left = premier composant à associer. *
-* right = second composant à associer. *
-* *
-* Description : Construit un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-itanium_component *itd_make_binary(GItaniumDContext *context, ItaniumComponentType type, itanium_component *left, itanium_component *right)
-{
- itanium_component *result; /* Composant à renvoyer */
-
- result = g_itanium_dcontext_get_empty_component(context);
-
- result->type = type;
- result->binary.left = left;
- result->binary.right = right;
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* type = type du composant à mettre en place. *
-* left = second composant à associer. *
-* *
-* Description : Construit un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-itanium_component *itd_append_right_to_binary(GItaniumDContext *context, ItaniumComponentType type, itanium_component *parent, itanium_component *left)
-{
- itanium_component *result; /* Composant à renvoyer */
- itanium_component *iter; /* Boucle de parcours */
-
- result = g_itanium_dcontext_get_empty_component(context);
-
- result->type = type;
- result->binary.left = left;
-
- if (parent != NULL)
- {
- for (iter = parent; iter->binary.right != NULL; iter = iter->binary.right)
- reset_comp_hash(iter);
- iter->binary.right = result;
- }
-
- return (parent != NULL ? parent : result);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* type = type du composant à mettre en place. *
-* unary = sous-composant à associer. *
-* *
-* Description : Construit un composant dans un contexte Itanium. *
-* *
-* Retour : Composant extrait ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-itanium_component *itd_make_unary(GItaniumDContext *context, ItaniumComponentType type, itanium_component *unary)
-{
- itanium_component *result; /* Composant à renvoyer */
-
- result = g_itanium_dcontext_get_empty_component(context);
-
- result->type = type;
- result->unary = unary;
-
- return result;
-
-}
-
-
-
-
-
-/******************************************************************************
-* *
-* Paramètres : comp = composant à mettre à jour. *
-* type = type à redéfinir pour le composant. *
-* *
-* Description : Modifie légèrement le type d'un composant donné. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void itd_set_type(itanium_component *comp, ItaniumComponentType type)
-{
- comp->type = type;
-
- reset_comp_hash(comp);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : comp = composant à consulter. *
-* *
-* Description : Fournit le type d'un composant issu d'un contexte Itanium. *
-* *
-* Retour : Type enregistré. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-ItaniumComponentType itd_get_component_type(const itanium_component *comp)
-{
- return comp->type;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* comp = second composant à associer. *
-* base = éventuelle base à compléter ou NULL si aucune. *
-* *
-* Description : Traduit les composants de contexte Itanium. *
-* *
-* Retour : Traduction en format humainement lisible effectuée. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-char *itd_translate_component(GItaniumDContext *context, const itanium_component *comp, char *base)
-{
- char *result; /* Chaîne à retourner */
- char *name; /* Désignation à copier */
- const itanium_component *sub; /* Sous-partie de composant */
-
- //if (base != NULL)
- //printf(".... %s\n", base);
-
- switch (comp->type)
- {
- case ICT_EMPTY:
- result = base;
- break;
-
- case ICT_NAME:
- case ICT_STD_SUBST:
- result = strnadd(base, comp->s_name.str, comp->s_name.len);
- break;
-
- case ICT_NESTED_NAME:
- result = itd_translate_component(context, comp->binary.left, base);
- if (comp->binary.right->type != ICT_TEMPLATE_ARGS)
- result = stradd(result, "::");
- result = itd_translate_component(context, comp->binary.right, result);
- break;
-
- case ICT_TEMPLATE_NAME_ARGS:
- result = itd_translate_component(context, comp->binary.left, base);
- result = itd_translate_component(context, comp->binary.right, result);
- break;
-
- case ICT_PREFIX_UNARY:
- case ICT_TPREFIX_UNARY:
- result = stradd(base, "::");
- result = itd_translate_component(context, comp->unary, result);
- break;
-
- case ICT_PREFIX_BINARY:
- case ICT_TPREFIX_BINARY:
- result = itd_translate_component(context, comp->binary.left, base);
- result = stradd(result, "::");
- result = itd_translate_component(context, comp->binary.right, result);
- break;
-
-
- case ICT_OPERATOR_NAME:
- switch (comp->operator.otype)
- {
- case IOT_SIMPLE:
- result = stradd(base, comp->operator.info.name);
- break;
- case IOT_CAST:
- result = stradd(base, "TODO_CAST");
- break;
- case IOT_VENDOR:
- result = stradd(base, "TODO_VENDOR");
- break;
- default:
- result = NULL;
- break;
- }
- break;
-
-
- case ICT_FUNCTION_THUNK:
- result = itd_translate_component(context, comp->binary.right, base);
- break;
-
- case ICT_FUNCTION_COVARIANT_THUNK:
- result = itd_translate_component(context, comp->ternary.third, base);
- break;
-
-
- case ICT_CONSTRUCTOR:
- result = stradd(base, "<ctor>");
- break;
-
- case ICT_DESSTRUCTOR:
- result = stradd(base, "<dtor>");
- break;
-
- case ICT_TYPE:
-
- name = g_data_type_to_string(comp->dtype);
-
- result = stradd(base, name);
-
- free(name);
-
- break;
-
- case ICT_POINTER_TO:
- result = itd_translate_component(context, comp->unary, base);
- result = stradd(result, " *");
- break;
-
- case ICT_REFERENCE_TO:
- result = itd_translate_component(context, comp->unary, base);
- result = stradd(result, " &");
- break;
-
- case ICT_RVALUE_REFERENCE_TO:
- result = itd_translate_component(context, comp->unary, base);
- result = stradd(result, " &");
- break;
-
- case ICT_COMPLEX_PAIR:
- result = stradd(base, "<?>");
- result = itd_translate_component(context, comp->unary, result);
- break;
-
- case ICT_IMAGINARY:
- result = stradd(base, "<?>");
- result = itd_translate_component(context, comp->unary, result);
- break;
-
-
- case ICT_FUNCTION_ENCODING:
-
- result = base;
-
- /* Retour ? */
-
- sub = NULL;//IT_BINARY_COMP(IT_BINARY_COMP(comp).right).left;
-
- if (sub != NULL)
- result = itd_translate_component(context, sub, result);
- else
- result = stradd(result, "???");
-
- result = stradd(result, " ");
-
- /* Nom de la fonction */
- result = itd_translate_component(context, comp->binary.left, result);
-
- result = stradd(result, "(");
-
- result = itd_translate_component(context, comp->binary.right, result);
-
- result = stradd(result, ")");
-
-
- break;
-
- case ICT_TEMPLATE_ARGS:
- result = stradd(base, "<");
- result = itd_translate_component(context, comp->unary, result);
- result = stradd(result, ">");
- break;
-
- case ICT_TYPES_LIST:
-
- result = itd_translate_component(context, comp->binary.left, base);
-
- if (comp->binary.right != NULL)
- {
- result = stradd(result, ", ");
- result = itd_translate_component(context, comp->binary.right, result);
- }
-
-
- //sub = IT_BINARY_COMP(IT_BINARY_COMP(comp).right).right;
-
-
- break;
-
-
- default: /* ICT_* */
- result = base;
- break;
-
- }
-
-
-
- return result;
-
-
-}
diff --git a/src/format/mangling/itanium/component.h b/src/format/mangling/itanium/component.h
deleted file mode 100644
index 6aa4e57..0000000
--- a/src/format/mangling/itanium/component.h
+++ /dev/null
@@ -1,213 +0,0 @@
-
-/* Chrysalide - Outil d'analyse de fichiers binaires
- * component.h - prototypes pour la représentation des composants extraits de l'ABI C++ Itanium
- *
- * Copyright (C) 2013-2017 Cyrille Bagard
- *
- * This file is part of Chrysalide.
- *
- * Chrysalide is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * Chrysalide is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef _FORMAT_MANGLING_ITANIUM_COMPONENT_H
-#define _FORMAT_MANGLING_ITANIUM_COMPONENT_H
-
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <malloc.h>
-#include <sys/types.h>
-
-
-#include "context.h"
-#include "../../../analysis/type.h"
-#include "../../../common/fnv1a.h"
-
-
-
-/* Type de composants */
-typedef enum _ItaniumComponentType
-{
- /**
- * Représentation d'une règle vide.
- */
- ICT_EMPTY,
-
- /**
- * Chaîne de caractère, terminée par un octet nul.
- */
- ICT_NAME,
- ICT_STD_SUBST,
-
- /**
- * Noms imbriqués, en deux parties : 'binary'.
- */
- ICT_NESTED_NAME,
- ICT_TEMPLATE_NAME_ARGS,
-
- /**
- * Deux types de préfixes : un ou deux éléments.
- * -> 'unary' ou 'binary'
- */
- ICT_PREFIX_UNARY,
- ICT_PREFIX_BINARY,
- ICT_TPREFIX_UNARY,
- ICT_TPREFIX_BINARY,
-
- /**
- * Encodage d'un nom d'opérateur, consigné dans 'operator'.
- */
- ICT_OPERATOR_NAME,
-
-
- /**
- * Fonctions virtuelles.
- * -> décalage : 'offset'.
- * -> fonctions simples : 'binary'.
- * -> fonctions complexes : 'ternary'.
- */
- ICT_NON_VIRTUAL_OFFSET,
- ICT_VIRTUAL_OFFSET,
- ICT_FUNCTION_THUNK,
- ICT_FUNCTION_COVARIANT_THUNK,
-
- /**
- * Constructeur ou destructeur, sans plus de détail.
- */
- ICT_CONSTRUCTOR,
- ICT_DESSTRUCTOR,
-
- /**
- * Type instanciable dans le programme.
- */
- ICT_TYPE,
-
- /**
- * Différentes références vers un sous-type.
- * Le champ impacté est 'unary'.
- */
- ICT_POINTER_TO,
- ICT_REFERENCE_TO,
- ICT_RVALUE_REFERENCE_TO,
- ICT_COMPLEX_PAIR,
- ICT_IMAGINARY,
-
- /**
- * Fonction (nom + retour/paramètres), sous forme binaire :
- * -> left = function name
- * -> right = bare-function-type
- */
- ICT_FUNCTION_ENCODING,
-
- /**
- * Liste d'arguments pour templates, à encadrer par des chevrons.
- * 'unary' pointe vers la liste des éléments.
- */
- ICT_TEMPLATE_ARGS,
-
- /**
- * Liste de types, sous forme binaire :
- * -> left = élément de la liste de types.
- * -> right = reste de la liste de types.
- */
- ICT_TYPES_LIST,
-
- ICT_COUNT
-
-} ItaniumComponentType;
-
-
-/* Catégories d'opérateurs */
-typedef enum _ItaniumOperatorType
-{
- IOT_SIMPLE, /* Présent dans la liste */
- IOT_CAST, /* Conversion forcée */
- IOT_VENDOR /* Défini par un vendeur */
-
-} ItaniumOperatorType;
-
-
-/* Enregistrement des opérateurs */
-typedef struct _itanium_operator_info
-{
- const char *code; /* Nom encodé */
- const char *name; /* Désignation humaine */
- size_t name_len; /* Taille du nom humain */
- int args; /* Nombre d'arguments */
-
-} itanium_operator_info;
-
-
-/* Composant extrait de l'encodage */
-typedef struct _itanium_component itanium_component;
-
-
-
-/* Incrémente le nombre d'utilisation du composant. */
-void itd_ref_comp(itanium_component *);
-
-/* Décrémente le nombre d'utilisation du composant. */
-void itd_unref_comp(itanium_component *);
-
-/* Détermine ou fournit l'empreinte d'un composant. */
-fnv64_t itd_hash_comp(itanium_component *);
-
-
-
-/* Marque un composant comme étant disponible pour un usage. */
-void itd_free_comp(GItaniumDContext *, itanium_component *);
-
-/* Construit un composant dans un contexte Itanium. */
-itanium_component *itd_make_empty(GItaniumDContext *);
-
-/* Construit un composant dans un contexte Itanium. */
-itanium_component *itd_make_name(GItaniumDContext *, const char *, size_t);
-
-
-/* Construit un composant dans un contexte Itanium. */
-itanium_component *itd_make_operator(GItaniumDContext *, const itanium_operator_info *);
-
-
-/* Construit un composant dans un contexte Itanium. */
-itanium_component *itd_make_offset(GItaniumDContext *, ItaniumComponentType, ssize_t);
-
-
-/* Construit un composant dans un contexte Itanium. */
-itanium_component *itd_make_type(GItaniumDContext *, GDataType *);
-
-/* Construit un composant dans un contexte Itanium. */
-itanium_component *itd_make_binary(GItaniumDContext *, ItaniumComponentType, itanium_component *, itanium_component *);
-
-/* Construit un composant dans un contexte Itanium. */
-itanium_component *itd_append_right_to_binary(GItaniumDContext *, ItaniumComponentType, itanium_component *, itanium_component *);
-
-/* Construit un composant dans un contexte Itanium. */
-itanium_component *itd_make_unary(GItaniumDContext *, ItaniumComponentType, itanium_component *);
-
-
-
-/* Modifie légèrement le type d'un composant donné. */
-void itd_set_type(itanium_component *, ItaniumComponentType);
-
-/* Fournit le type d'un composant issu d'un contexte Itanium. */
-ItaniumComponentType itd_get_component_type(const itanium_component *);
-
-/* Traduit les composants de contexte Itanium. */
-char *itd_translate_component(GItaniumDContext *, const itanium_component *, char *);
-
-
-
-#endif /* _FORMAT_MANGLING_ITANIUM_COMPONENT_H */
diff --git a/src/format/mangling/itanium/context.c b/src/format/mangling/itanium/context.c
deleted file mode 100644
index d0a0664..0000000
--- a/src/format/mangling/itanium/context.c
+++ /dev/null
@@ -1,571 +0,0 @@
-
-/* Chrysalide - Outil d'analyse de fichiers binaires
- * context.c - contexte de décodage à la sauce ABI C++ Itanium
- *
- * Copyright (C) 2013-2017 Cyrille Bagard
- *
- * This file is part of Chrysalide.
- *
- * Chrysalide is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * Chrysalide is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include "context.h"
-
-
-#include <malloc.h>
-#include <string.h>
-
-
-#include "abi.h"
-#include "component-int.h"
-#include "../context-int.h"
-
-
-
-/* Taille des extensions d'allocation */
-#define ITCOMP_ALLOC_BULK 200
-
-/* Marqueur de fin pour les disponibilités */
-#define ITCOMP_INVALID ((size_t)-1)
-
-
-/* Contexte de décodage Itanium (instance) */
-struct _GItaniumDContext
-{
- GDemanglingContext parent; /* A laisser en premier */
-
- char *mangled; /* Caractères à traiter */
- size_t len; /* Quantité de caractères */
- size_t pos; /* Position d'analyse */
-
- itanium_component *components; /* Tableaux des composants */
- size_t *next_links; /* Chemins d'allocation */
- size_t length; /* Taille allouée */
- size_t last_used; /* Lien vers la disponibilité */
-
- itanium_component **substitutions; /* Table de substitutions */
- size_t subst_count; /* Quantité utilisée */
-
-};
-
-/* Contexte de décodage Itanium (classe) */
-struct _GItaniumDContextClass
-{
- GDemanglingContextClass parent; /* A laisser en premier */
-
-};
-
-
-
-/* Indique le type défini pour un contexte de décodage. */
-G_DEFINE_TYPE(GItaniumDContext, g_itanium_dcontext, G_TYPE_DEMANGLING_CONTEXT);
-
-
-/******************************************************************************
-* *
-* Paramètres : klass = classe à initialiser. *
-* *
-* Description : Initialise la classe des contextes de décodage. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_itanium_dcontext_class_init(GItaniumDContextClass *klass)
-{
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = instance à initialiser. *
-* *
-* Description : Initialise une instance de contexte pour décodage. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_itanium_dcontext_init(GItaniumDContext *context)
-{
- context->last_used = ITCOMP_INVALID;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : - *
-* *
-* Description : Prépare de quoi effectuer un décodage Itanium. *
-* *
-* Retour : Instance du contexte mis en place. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-GDemanglingContext *g_itanium_dcontext_new(void)
-{
- GDemanglingContext *result; /* Structure à retourner */
-
- result = g_object_new(G_TYPE_ITANIUM_DCONTEXT, NULL);
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage sur lequel s'appuyer. *
-* desc = chaîne de caractères à décoder. *
-* *
-* Description : Tente de décoder une chaîne de caractères donnée. *
-* *
-* Retour : Bilan de l'opération. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void /*GBinRoutine **/g_itanium_dcontext_demangle_routine(GItaniumDContext *context, const char *desc)
-{
- itanium_component *comp;
-
- char *str;
-
- printf("<<== %s\n", desc);
-
- context->mangled = strdup(desc);
- context->len = strlen(desc);
- context->pos = 0;
-
-
- /**
- * On part du principe qu'il n'y aura jamais plus de substitutions
- * à enregistrer que de caractères dans la chaîne à traiter.
- * Du coup, on peut tout allouer d'un coup !
- */
- context->substitutions = (itanium_component **)calloc(context->len, sizeof(itanium_component *));
-
-
- comp = itd_mangled_name(context);
-
-
- printf("Got :: %p\n", comp);
-
- str = itd_translate_component(context, comp, NULL);
-
- printf("==>> %s\n", str);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à manipuler. *
-* state = état courant à sauvegarder. [OUT] *
-* *
-* Description : Fournit l'état courant à une fin de retour en arrière. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void g_itanium_dcontext_push_state(const GItaniumDContext *context, itd_state *state)
-{
- state->pos = context->pos;
- state->subst_count = context->subst_count;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à manipuler. *
-* state = état courant à restaurer. *
-* *
-* Description : Définit l'état courant suite à un retour en arrière. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void g_itanium_dcontext_pop_state(GItaniumDContext *context, const itd_state *state)
-{
- size_t i; /* Boucle de parcours */
-
- /*
- printf("--deleting subst-- from %zu to %zu\n",
- state->subst_count, context->subst_count);
- */
-
- for (i = state->subst_count; i < context->subst_count; i++)
- itd_unref_comp(context->substitutions[i]);
-
- context->pos = state->pos;
- context->subst_count = state->subst_count;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Fournit la valeur du caractère courant. *
-* *
-* Retour : Caractère courant. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-char g_itanium_dcontext_peek_char(const GItaniumDContext *context)
-{
- return *(context->mangled + context->pos);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* quantity = quantié de caractères à marquer comme traités. *
-* *
-* Description : Avance la tête de lecture courante. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void g_itanium_dcontext_advance(GItaniumDContext *context, size_t quantity)
-{
- context->pos += quantity;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* *
-* Description : Fournit et avance la tête de lecture courante. *
-* *
-* Retour : Caractère courant. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-char g_itanium_dcontext_next_char(GItaniumDContext *context)
-{
- return *(context->mangled + context->pos++);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* c = caractère à retrouver. *
-* *
-* Description : Vérifie la nature du caractère courant. *
-* *
-* Retour : Bilan de l'opération. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-bool g_itanium_dcontext_check_char(GItaniumDContext *context, char c)
-{
- bool result; /* Validation à retourner */
-
- if (g_itanium_dcontext_peek_char(context) == c)
- {
- result = true;
- g_itanium_dcontext_advance(context, 1);
- }
- else
- result = false;
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* remaining = taille de la chaîne retournée. [OUT] *
-* *
-* Description : Fournit la chaîne de caractère restant à traiter. *
-* *
-* Retour : Pointeur vers les données courantes. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-const char *g_itanium_dcontext_get_string(const GItaniumDContext *context, size_t *remaining)
-{
- const char *result; /* Données à renvoyer */
-
- *remaining = context->len - context->pos;
-
- result = &context->mangled[context->pos];
-
- return result;
-
-}
-
-
-
-
-
-/*
-
-################define d_peek_char(di) (*((di)->n))
-#define d_peek_next_char(di) ((di)->n[1])
-################define d_advance(di, i) ((di)->n += (i))
-################define d_check_char(di, c) (d_peek_char(di) == c ? ((di)->n++, 1) : 0)
-#define d_next_char(di) (d_peek_char(di) == '\0' ? '\0' : *((di)->n++))
-################define d_str(di) ((di)->n)
-
-
-*/
-
-
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à manipuler. *
-* *
-* Description : Fournit un nouveau composant vierge. *
-* *
-* Retour : Composant prêt à être défini. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-itanium_component *g_itanium_dcontext_get_empty_component(GItaniumDContext *context)
-{
- itanium_component *result; /* Disponibilité à retourner */
- size_t i; /* Boucle de parcours */
- size_t next; /* Indice de disponibilité */
-
- if (context->last_used == ITCOMP_INVALID
- || context->next_links[context->last_used] == ITCOMP_INVALID)
- {
- /* Création d'extensions */
-
- context->components = (itanium_component *)
- realloc(context->components,
- (context->length + ITCOMP_ALLOC_BULK) * sizeof(itanium_component));
-
- context->next_links = (size_t *)
- realloc(context->next_links, (context->length + ITCOMP_ALLOC_BULK) * sizeof(size_t));
-
- /* Inscription des liens d'allocation */
-
- for (i = context->length; i < (context->length + ITCOMP_ALLOC_BULK - 1); i++)
- context->next_links[i] = i + 1;
-
- context->next_links[context->length + ITCOMP_ALLOC_BULK - 1] = ITCOMP_INVALID;
-
- if (context->last_used != ITCOMP_INVALID)
- context->next_links[context->last_used] = context->length;
-
- /* Mise à jour globale */
-
- context->length += ITCOMP_ALLOC_BULK;
-
- }
-
- /* Extraction d'un composant disponible */
-
- if (context->last_used == ITCOMP_INVALID)
- next = 0;
- else
- next = context->next_links[context->last_used];
-
- result = &context->components[next];
- context->last_used = next;
-
- memset(result, 0, sizeof(itanium_component));
-
- result->context = context;
- g_object_ref(G_OBJECT(result->context));
- result->refcount = 1;
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à manipuler. *
-* comp = composant à libérer. *
-* *
-* Description : Marque un composant comme étant disponible pour un usage. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void g_itanium_dcontext_mark_component_as_free(GItaniumDContext *context, itanium_component *comp)
-{
- size_t index; /* Indice du composant concerné*/
-
- /*BUG_ON(comp->refcount != 0);*/
-
- g_object_unref(G_OBJECT(comp->context));
-
- index = comp - context->components;
-
- context->next_links[index] = context->next_links[context->last_used];
- context->next_links[context->last_used] = index;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à manipuler. *
-* comp = composant à conserver en mémoire. *
-* *
-* Description : Indexe un composant comme future substitution potentielle. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void g_itanium_dcontext_add_substitution(GItaniumDContext *context, itanium_component *comp)
-{
- fnv64_t hash; /* Empreinte du candidat */
- size_t i; /* Boucle de parcours */
-
- hash = itd_hash_comp(comp);
-
- for (i = 0; i < context->subst_count; i++)
- if (cmp_fnv_64a(itd_hash_comp(context->substitutions[i]), hash) == 0)
- break;
-
- if (i == context->subst_count)
- {
-
- printf("[ADDING SUBST] [%zu] '%s'\n",
- context->subst_count,
- itd_translate_component(context, comp, NULL));
-
-
- context->substitutions[context->subst_count++] = comp;
- itd_ref_comp(comp);
-
- }
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à manipuler. *
-* index = indice de la substitution visée. *
-* *
-* Description : Fournit un composant en place pour une substitution. *
-* *
-* Retour : Composant déjà extrait et conservé. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-itanium_component *g_itanium_dcontext_get_substitution(GItaniumDContext *context, size_t index)
-{
- itanium_component *result; /* Composant à retourner */
-
- if (index < context->subst_count)
- {
- result = context->substitutions[index];
- itd_ref_comp(result);
- }
- else
- result = NULL;
-
- return result;
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void test_itanium(void)
-{
-
-
-
-
-#define TEST_DEMANG(v) \
- do \
- { \
- GDemanglingContext *ctx; \
- /*char *str;*/ \
- ctx = g_itanium_dcontext_new(); \
- /*str = */g_itanium_dcontext_demangle_routine(G_ITANIUM_DCONTEXT(ctx), v); \
- /*printf("==> %s\n", str);*/ \
- } \
- while (0)
-
-
- TEST_DEMANG("_Z3fooILi2EEvRAplT_Li1E_i");
-
- exit(0);
-
- TEST_DEMANG("_Z1fv");
- TEST_DEMANG("_Z3foo3bar");
-
-
-}
diff --git a/src/format/mangling/itanium/context.h b/src/format/mangling/itanium/context.h
deleted file mode 100644
index 13ec1f4..0000000
--- a/src/format/mangling/itanium/context.h
+++ /dev/null
@@ -1,117 +0,0 @@
-
-/* Chrysalide - Outil d'analyse de fichiers binaires
- * context.h - prototypes pour le contexte de décodage à la sauce ABI C++ Itanium
- *
- * Copyright (C) 2013-2017 Cyrille Bagard
- *
- * This file is part of Chrysalide.
- *
- * Chrysalide is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * Chrysalide is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef _FORMAT_MANGLING_ITANIUM_CONTEXT_H
-#define _FORMAT_MANGLING_ITANIUM_CONTEXT_H
-
-
-#include <glib-object.h>
-#include <stdbool.h>
-
-#include "../context.h"
-
-
-
-#define G_TYPE_ITANIUM_DCONTEXT g_itanium_dcontext_get_type()
-#define G_ITANIUM_DCONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_itanium_dcontext_get_type(), GItaniumDContext))
-#define G_IS_ITANIUM_DCONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_itanium_dcontext_get_type()))
-#define G_ITANIUM_DCONTEXT_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE((inst), g_itanium_dcontext_get_type(), GItaniumDContextIface))
-#define G_ITANIUM_DCONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_ITANIUM_DCONTEXT, GItaniumDContextClass))
-
-
-/* Contexte de décodage Itanium (instance) */
-typedef struct _GItaniumDContext GItaniumDContext;
-
-/* Contexte de décodage Itanium (classe) */
-typedef struct _GItaniumDContextClass GItaniumDContextClass;
-
-
-/* Indique le type défini pour un contexte de décodage. */
-GType g_itanium_dcontext_get_type(void);
-
-/* Prépare de quoi effectuer un décodage Itanium. */
-GDemanglingContext *g_itanium_dcontext_new(void);
-
-/* Tente de décoder une chaîne de caractères donnée. */
-void /*GBinRoutine **/g_itanium_dcontext_demangle_routine(GItaniumDContext *, const char *);
-
-/* Sauvegarde d'un état courant */
-typedef struct _itd_state
-{
- size_t pos; /* Position courante */
- size_t subst_count; /* Nombre de substitutions */
-
-} itd_state;
-
-/* Fournit l'état courant à une fin de retour en arrière. */
-void g_itanium_dcontext_push_state(const GItaniumDContext *, itd_state *);
-
-/* Définit l'état courant suite à un retour en arrière. */
-void g_itanium_dcontext_pop_state(GItaniumDContext *, const itd_state *);
-
-/* Fournit la valeur du caractère courant. */
-char g_itanium_dcontext_peek_char(const GItaniumDContext *);
-
-/* Avance la tête de lecture courante. */
-void g_itanium_dcontext_advance(GItaniumDContext *, size_t);
-
-/* Fournit et avance la tête de lecture courante. */
-char g_itanium_dcontext_next_char(GItaniumDContext *);
-
-/* Vérifie la nature du caractère courant. */
-bool g_itanium_dcontext_check_char(GItaniumDContext *, char);
-
-/* Fournit la chaîne de caractère restant à traiter. */
-const char *g_itanium_dcontext_get_string(const GItaniumDContext *, size_t *);
-
-
-
-
-/* Composant extrait de l'encodage */
-typedef struct _itanium_component itanium_component;
-
-
-/* Fournit un nouveau composant vierge. */
-itanium_component *g_itanium_dcontext_get_empty_component(GItaniumDContext *);
-
-/* Marque un composant comme étant disponible pour un usage. */
-void g_itanium_dcontext_mark_component_as_free(GItaniumDContext *, itanium_component *);
-
-/* Indexe un composant comme future substitution potentielle. */
-void g_itanium_dcontext_add_substitution(GItaniumDContext *, itanium_component *);
-
-/* Fournit un composant en place pour une substitution. */
-itanium_component *g_itanium_dcontext_get_substitution(GItaniumDContext *, size_t);
-
-
-
-
-
-
-void test_itanium(void);
-
-
-
-
-
-#endif /* _FORMAT_MANGLING_ITANIUM_CONTEXT_H */
diff --git a/src/format/mangling/java.h b/src/format/mangling/java.h
deleted file mode 100644
index ee7f21d..0000000
--- a/src/format/mangling/java.h
+++ /dev/null
@@ -1,59 +0,0 @@
-
-/* Chrysalide - Outil d'analyse de fichiers binaires
- * java.h - prototypes pour le décodage des noms d'éléments selon Java
- *
- * Copyright (C) 2010-2017 Cyrille Bagard
- *
- * This file is part of Chrysalide.
- *
- * Chrysalide is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * Chrysalide is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef _FORMAT_MANGLING_JAVA_H
-#define _FORMAT_MANGLING_JAVA_H
-
-
-#include <stdbool.h>
-
-
-#include "context.h"
-#include "demangler.h"
-
-
-
-/* ------------------------- CONTEXTE POUR LE DECODAGE JAVA ------------------------- */
-
-
-/* Contexte de décodage Java (instance) */
-typedef struct _GJavaDContext GJavaDContext;
-
-/* Contexte de décodage Java (classe) */
-typedef struct _GJavaDContextClass GJavaDContextClass;
-
-
-/* Prépare de quoi effectuer un décodage Java. */
-GDemanglingContext *g_java_dcontext_new(void);
-
-
-
-/* ----------------------- TRAITEMENT DE L'ENCODAGE TYPE JAVA ----------------------- */
-
-
-/* Procède au décodage d'une chaîne de caractères. */
-bool demangle_java_type(GJavaDContext *, const char *);
-
-
-
-#endif /* _FORMAT_MANGLING_JAVA_H */
diff --git a/src/format/mangling/java_gram.y b/src/format/mangling/java_gram.y
deleted file mode 100644
index fa6895c..0000000
--- a/src/format/mangling/java_gram.y
+++ /dev/null
@@ -1,281 +0,0 @@
-
-%{
-
-
-
-#include "context-int.h"
-#include "java.h"
-#include "../../analysis/types/cse.h"
-
-
-
-/* ------------------------- CONTEXTE POUR LE DECODAGE JAVA ------------------------- */
-
-
-#define G_TYPE_JAVA_DCONTEXT g_java_dcontext_get_type()
-#define G_JAVA_DCONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_java_dcontext_get_type(), GJavaDContext))
-#define G_IS_JAVA_DCONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_java_dcontext_get_type()))
-#define G_JAVA_DCONTEXT_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE((inst), g_java_dcontext_get_type(), GJavaDContextIface))
-#define G_JAVA_DCONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_JAVA_DCONTEXT, GJavaDContextClass))
-
-
-/* Contexte de décodage Java (instance) */
-struct _GJavaDContext
-{
- GDemanglingContext parent; /* A laisser en premier */
-
-};
-
-/* Contexte de décodage Java (classe) */
-struct _GJavaDContextClass
-{
- GDemanglingContextClass parent; /* A laisser en premier */
-
-};
-
-
-/* Indique le type défini pour un contexte de décodage. */
-static GType g_java_dcontext_get_type(void);
-
-/* Initialise la classe des contextes de décodage. */
-static void g_java_dcontext_class_init(GJavaDContextClass *);
-
-/* Initialise une instance de contexte pour décodage. */
-static void g_java_dcontext_init(GJavaDContext *);
-
-/* Affiche un message d'erreur concernant l'analyse. */
-static int java_error(/*const YYLTYPE *yyloc, bool hunt, char **ucode, unsigned char *index, */GJavaDContext *, char *);
-
-
-
-
-
-
-%}
-
-
-%union {
-
- void /*GDataType*/ *type;
-
- size_t adeep; /* Dimension d'un tableau */
-
- char *text; /* Chaîne de caractères */
-
-}
-
-%parse-param { GJavaDContext *context }
-
-%token V Z B S C I J F D
-%token ARRAY
-%token L SEMICOLON
-%token SLASH DOLLAR
-%token TEXT
-
-%type <type> type_descriptor field_type_descriptor non_array_field_type_descriptor full_class_name
-
-%type <text> TEXT
-
-
-%{
-
-/* De lexi.c... */
-/*int yylex(YYSTYPE *, YYLTYPE *);*/
-void java_restart(FILE *);
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-extern YY_BUFFER_STATE java__scan_string(const char *);
-extern void java__delete_buffer(YY_BUFFER_STATE);
-
- extern int java_lex (void);
-
-
-/* Affiche un message d'erreur concernant l'analyse. */
-/*int yyerror(const YYLTYPE *, bool, char **, unsigned char *, char *);*/
-
-%}
-
-
-%%
-
-
-input:
- type_descriptor { G_DEMANGLING_CONTEXT(context)->type = $1; }
- ;
-
-type_descriptor:
- V { $$ = g_basic_type_new(BTP_VOID); }
- | field_type_descriptor { $$ = $1; }
- ;
-
-field_type_descriptor:
- non_array_field_type_descriptor { $$ = $1; }
- | ARRAY non_array_field_type_descriptor { $$ = $2; }
- ;
-
-non_array_field_type_descriptor:
- Z { $$ = g_basic_type_new(BTP_BOOL); }
- | B { $$ = g_basic_type_new(BTP_UCHAR); }
- | S { $$ = g_basic_type_new(BTP_SHORT); }
- | C { $$ = g_basic_type_new(BTP_CHAR); }
- | I { $$ = g_basic_type_new(BTP_INT); }
- | J { $$ = g_basic_type_new(BTP_LONG); }
- | F { $$ = g_basic_type_new(BTP_FLOAT); }
- | D { $$ = g_basic_type_new(BTP_DOUBLE); }
- | L full_class_name SEMICOLON { $$ = $2; }
- ;
-
-full_class_name:
- TEXT { $$ = g_class_enum_type_new(CET_CLASS, $1); }
- | full_class_name SLASH TEXT {
- $$ = g_class_enum_type_new(CET_CLASS, $3);
- g_data_type_set_namespace($$, $1);
- g_object_unref($1);
- }
- | full_class_name DOLLAR TEXT {
- $$ = g_class_enum_type_new(CET_CLASS, $3);
- g_data_type_set_namespace($$, $1);
- g_object_unref($1);
- }
- ;
-
-
-%%
-
-
-
-/* ---------------------------------------------------------------------------------- */
-/* CONTEXTE POUR LE DECODAGE JAVA */
-/* ---------------------------------------------------------------------------------- */
-
-
-/* Indique le type défini pour un contexte de décodage. */
-G_DEFINE_TYPE(GJavaDContext, g_java_dcontext, G_TYPE_DEMANGLING_CONTEXT);
-
-
-/******************************************************************************
-* *
-* Paramètres : klass = classe à initialiser. *
-* *
-* Description : Initialise la classe des contextes de décodage. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_java_dcontext_class_init(GJavaDContextClass *klass)
-{
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : context = instance à initialiser. *
-* *
-* Description : Initialise une instance de contexte pour décodage. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void g_java_dcontext_init(GJavaDContext *context)
-{
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : - *
-* *
-* Description : Prépare de quoi effectuer un décodage Java. *
-* *
-* Retour : Instance du contexte mis en place. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-GDemanglingContext *g_java_dcontext_new(void)
-{
- GDemanglingContext *result; /* Structure à retourner */
-
- result = g_object_new(G_TYPE_JAVA_DCONTEXT, NULL);
-
- return result;
-
-}
-
-
-
-/* ---------------------------------------------------------------------------------- */
-/* TRAITEMENT DE L'ENCODAGE TYPE JAVA */
-/* ---------------------------------------------------------------------------------- */
-
-
-
-
-
-
-
-
-
-
-
-
-
-/**
- * Affiche un message d'erreur concernant l'analyse.
- * @param yyloc informations concernant les coordonnées du soucis.
- * @param hunt indique le type de passe réalisée.
- * @param ucode code résultant compilé.
- * @param index indice de commande à mettre à jour.
- * @param msg indications humaines sur l'événement.
- * @return 0.
- */
-static int java_error(/*const YYLTYPE *yyloc, bool hunt, char **ucode, unsigned char *index, */GJavaDContext *context, char *msg)
-{
-
-
-
- fprintf(stderr, "ERREUR !\n");
- fprintf(stderr, "%s\n", msg);
-
- return -1;
-
-}
-
-
-
-
-
-
-/******************************************************************************
-* *
-* Paramètres : context = contexte de décodage à utiliser. *
-* desc = chaîne de caractères à décoder. *
-* *
-* Description : Procède au décodage d'une chaîne de caractères. *
-* *
-* Retour : Bilan de l'opération. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-bool demangle_java_type(GJavaDContext *context, const char *desc)
-{
- YY_BUFFER_STATE buffer; /* Tampon pour bison */
- int ret; /* Bilan de l'appel */
-
- buffer = java__scan_string(desc);
- ret = yyparse(context);
- java__delete_buffer(buffer);
-
- return (ret == 0);
-
-}
diff --git a/src/format/mangling/java_tok.l b/src/format/mangling/java_tok.l
deleted file mode 100644
index 4adf623..0000000
--- a/src/format/mangling/java_tok.l
+++ /dev/null
@@ -1,37 +0,0 @@
-
-%{
-
-#include "java.h"
-#include "libjavamangling_la-java_gram.h"
-
-%}
-
-
-%option noyywrap
-%option yylineno
-%option nounput
-%option noinput
-
-%x string
-
-
-%%
-
-V { return V; }
-Z { return Z; }
-B { return B; }
-S { return S; }
-C { return C; }
-I { return I; }
-J { return J; }
-F { return F; }
-D { return D; }
-L { BEGIN(string); return L; }
-[[]* { java_lval.adeep = strlen(yytext); return ARRAY; }
-<string>[/] { return SLASH; }
-<string>[$] { return DOLLAR; }
-<string>[;] { BEGIN(INITIAL); return SEMICOLON; }
-
-<string>[A-Za-z0-9]* { java_lval.text = yytext; return TEXT; }
-
-%%