summaryrefslogtreecommitdiff
path: root/src/analysis/routine.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2010-04-18 00:31:49 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2010-04-18 00:31:49 (GMT)
commitef29fbc801e23f547b9ee7666b713bcf32d7e787 (patch)
treefb7466a56e2246c53a51d0475c1b5fc70ef3b8f9 /src/analysis/routine.c
parent49468379e912806400c5874f8e359cb934516228 (diff)
Improved the Itanium demangler.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@152 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis/routine.c')
-rw-r--r--src/analysis/routine.c96
1 files changed, 73 insertions, 23 deletions
diff --git a/src/analysis/routine.c b/src/analysis/routine.c
index 4bbd712..cfa7cd5 100644
--- a/src/analysis/routine.c
+++ b/src/analysis/routine.c
@@ -43,17 +43,15 @@ struct _GBinRoutine
RoutineType type; /* Type de routine */
- variable *ret_type; /* Type retourné */
+ GOpenidaType *ret_type; /* Type retourné */
char *name; /* Désignation humaine */
+ GOpenidaType *full_name; /* Désignation très complète */
- variable **args_types; /* Types d'arguments */
- size_t old_args_count; /* Nombre d'arguments */
-
- GUnknownVariable **args; /* Arguments de la routines */
+ GBinVariable **args; /* Arguments de la routines */
size_t args_count; /* Nombre d'arguments */
- GUnknownVariable **locals; /* Variables locales du code */
+ GBinVariable **locals; /* Variables locales du code */
size_t locals_count; /* Nombre de variables locales */
};
@@ -356,6 +354,9 @@ void g_binary_routine_set_name(GBinRoutine *routine, char *name)
const char *g_binary_routine_get_name(const GBinRoutine *routine)
{
+ if (routine->name == NULL && routine->full_name != NULL)
+ g_binary_routine_set_name(routine, g_openida_type_to_string(routine->full_name));
+
return routine->name;
}
@@ -364,7 +365,49 @@ const char *g_binary_routine_get_name(const GBinRoutine *routine)
/******************************************************************************
* *
* Paramètres : routine = routine à mettre à jour. *
-* var = variable représentant un type de retour. *
+* type = désignation complète du nom de la routine. *
+* *
+* Description : Définit de façon indirecte le nom humain d'une routine. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_binary_routine_set_name_from_type(GBinRoutine *routine, GOpenidaType *type)
+{
+ if (routine->full_name != NULL)
+ g_object_unref(G_OBJECT(routine->full_name));
+
+ routine->full_name = type;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : routine = routine à consulter. *
+* *
+* Description : Fournit le type construisant le nom humain d'une routine. *
+* *
+* Retour : Eventuel type à l'origine du nom ou NULL. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+const GOpenidaType *g_binary_routine_get_type_from_name(const GBinRoutine *routine)
+{
+ return routine->full_name;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : routine = routine à mettre à jour. *
+* type = indication sur le type de retour. *
* *
* Description : Définit le type de retour d'une routine. *
* *
@@ -374,12 +417,13 @@ const char *g_binary_routine_get_name(const GBinRoutine *routine)
* *
******************************************************************************/
-void g_binary_routine_set_return_type(GBinRoutine *routine, variable *var)
+void g_binary_routine_set_return_type(GBinRoutine *routine, GOpenidaType *type)
{
if (routine->ret_type != NULL)
- delete_var(routine->ret_type);
+ g_object_unref(G_OBJECT(routine->ret_type));
- routine->ret_type = var;
+ routine->ret_type = type;
+ g_object_ref(G_OBJECT(type));
}
@@ -397,14 +441,14 @@ void g_binary_routine_set_return_type(GBinRoutine *routine, variable *var)
* *
******************************************************************************/
-void g_binary_routine_add_arg(GBinRoutine *routine, variable *var)
+void g_binary_routine_add_arg(GBinRoutine *routine, GBinVariable *var)
{
- routine->old_args_count++;
+ routine->args_count++;
- routine->args_types = (variable **)realloc(routine->args_types,
- routine->old_args_count * sizeof(variable *));
+ routine->args = (GBinVariable **)realloc(routine->args,
+ routine->args_count * sizeof(GBinVariable *));
- routine->args_types[routine->old_args_count - 1] = var;
+ routine->args[routine->args_count - 1] = var;
}
@@ -425,6 +469,7 @@ void g_binary_routine_add_arg(GBinRoutine *routine, variable *var)
void g_binary_routine_register_if_needed(GBinRoutine *routine, size_t offset, bool local)
{
+#if 0 /* FIXME */
GUnknownVariable ***list; /* Liste à manipuler */
size_t *count; /* Taille de la liste */
bool found; /* Indication de présence */
@@ -464,7 +509,7 @@ void g_binary_routine_register_if_needed(GBinRoutine *routine, size_t offset, bo
}
-
+#endif
}
@@ -484,6 +529,7 @@ void g_binary_routine_register_if_needed(GBinRoutine *routine, size_t offset, bo
size_t g_binary_routine_get_var_index_from_offset(const GBinRoutine *routine, size_t offset, bool local)
{
+#if 0 /* FIXME */
size_t result; /* Indice à renvoyer */
GUnknownVariable ***list; /* Liste à manipuler */
size_t *count; /* Taille de la liste */
@@ -507,6 +553,9 @@ size_t g_binary_routine_get_var_index_from_offset(const GBinRoutine *routine, si
result = i;
return result;
+#endif
+
+ return SIZE_MAX;
}
@@ -534,12 +583,12 @@ char *g_binary_routine_to_string(const GBinRoutine *routine)
switch (routine->type)
{
case RTT_CONSTRUCTOR:
- result = strdup(routine->name);
+ result = strdup(g_binary_routine_get_name(routine));
result = stradd(result, "::");
break;
case RTT_DESTRUCTOR:
- result = strdup(routine->name);
+ result = strdup(g_binary_routine_get_name(routine));
result = stradd(result, "::~");
break;
@@ -548,8 +597,9 @@ char *g_binary_routine_to_string(const GBinRoutine *routine)
if (routine->ret_type == NULL) result = strdup("??? ");
else
{
- result = var_to_string(routine->ret_type);
- result = stradd(result, " ");
+ result = g_openida_type_to_string(routine->ret_type);
+ if (!g_openida_type_is_pointer(routine->ret_type, true))
+ result = stradd(result, " ");
}
break;
@@ -557,17 +607,17 @@ char *g_binary_routine_to_string(const GBinRoutine *routine)
/* Nom de la routine */
- result = stradd(result, routine->name);
+ result = stradd(result, g_binary_routine_get_name(routine));
/* Liste des arguments */
result = stradd(result, "(");
- for (i = 0; i < routine->old_args_count; i++)
+ for (i = 0; i < routine->args_count; i++)
{
if (i > 0) result = stradd(result, ", ");
- typestr = var_to_string(routine->args_types[i]);
+ typestr = g_binary_variable_to_string(routine->args[i]);
result = stradd(result, typestr);
free(typestr);