diff options
Diffstat (limited to 'plugins/itanium/component.h')
-rw-r--r-- | plugins/itanium/component.h | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/plugins/itanium/component.h b/plugins/itanium/component.h new file mode 100644 index 0000000..f921ff9 --- /dev/null +++ b/plugins/itanium/component.h @@ -0,0 +1,294 @@ + +/* 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 Chrysalide. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _PLUGINS_ITANIUM_COMPONENT_H +#define _PLUGINS_ITANIUM_COMPONENT_H + + +#include <ctype.h> +#include <stdlib.h> +#include <string.h> +#include <malloc.h> +#include <sys/types.h> + + +#include <analysis/routine.h> +#include <analysis/type.h> +#include <common/fnv1a.h> + + + +/* Type de composants */ +typedef enum _ItaniumComponentType +{ + /** + * Chaîne de caractère, terminée par un octet nul. + */ + ICT_NAME, + + /** + * Nom avec préfixe standard. + * Le nom en question est placé dans le champ unary. + */ + ICT_STD_UNSCOPED_NAME, + + /** + * Noms imbriqués, en deux parties : 'binary'. + * En cas de préfixe nul, le composant gauche peut être nul. + */ + ICT_NESTED_NAME, + + /** + * Noms imbriqués, en deux parties : 'binary'. + * C'est normalement le seul réceptacle pour les composants issus + * de itd_template_args (sur la branche droite). + */ + ICT_TEMPLATE_NAME_ARGS, + + /** + * Type avec préfixes : deux éléments, dans 'binary' + */ + ICT_PREFIX_BINARY, + + /** + * Préfixes à deux éléments. + * En cas de préfixe nul, le composant gauche peut être nul. + */ + ICT_TPREFIX_BINARY, + + /** + * Encodage d'un nom d'opérateur, consigné dans 'operator'. + */ + ICT_OPERATOR_NAME, + + /** + * Particularité des notions d'objets. Les informations utiles + * sont rassemblées dans le champ unary. + */ + ICT_SPECIAL_NAME_VTABLE, + ICT_SPECIAL_NAME_VSTRUCT, + + /** + * Fonctions virtuelles. + * -> décalage : 'offset'. + * -> double décalage : 'binary'. + * -> fonctions simples : 'binary'. + * -> fonctions complexes : 'ternary'. + */ + ICT_NON_VIRTUAL_OFFSET, + ICT_VIRTUAL_OFFSET, + ICT_DOUBLE_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, + + /** + * Type qualifié ; les infos utilies sont explicitement + * conservées dans le champ qualified. + */ + ICT_QUALIFIED_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, + + /** + * Prototype de fonction. + * Le champ impacté est 'function'. + */ + ICT_FUNCTION_TYPE, + + /** + * Fonction (nom + retour/paramètres), sous forme binaire : + * -> left = function name + * -> right = bare-function-type + */ + ICT_FUNCTION_ENCODING, + + /** + * Définition d'un tableau. Les indications de dimensions peuvent + * prendre plusieurs formes, et sont rassemblées dans le champ array. + */ + ICT_ARRAY, + + /** + * Pointeur vers un membre. Comme l'espace de noms associé est encodé + * de façon spéciale, un champ est dédié à ce composant : pmember. + */ + ICT_POINTER_TO_MEMBER, + + /** + * 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, + + /** + * Liste d'expressions, sous forme binaire comme pour ICT_TYPES_LIST : + * -> left = élément de la liste de types. + * -> right = reste de la liste de types. + */ + ICT_EXPR_LIST, + + /** + * Liste de types, sous forme binaire : + * -> left = composant d'opérateur. + * -> right = liste d'expressions. + */ + ICT_OPERATED_EXPRESSION, + + /** + * Substitution avec préfixe standard. Le résultat est prêt dans le champ + * dtype. + */ + ICT_STD_SUBST, + + 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 *); + +/* Construit un composant dans un contexte Itanium. */ +itanium_component *itd_make_with_type(ItaniumComponentType); + +/* Construit un composant dans un contexte Itanium. */ +itanium_component *itd_make_name(const char *, size_t); + +/* Construit un composant dans un contexte Itanium. */ +itanium_component *itd_make_operator(const itanium_operator_info *); + +/* Construit un composant dans un contexte Itanium. */ +itanium_component *itd_make_cast_operator(itanium_component *); + +/* Donne des indications quant à un opérateur Itanium. */ +const void *itd_get_operator_info(const itanium_component *, ItaniumOperatorType *); + +/* Construit un composant dans un contexte Itanium. */ +itanium_component *itd_make_offset(ItaniumComponentType, ssize_t); + +/* Construit un composant dans un contexte Itanium. */ +itanium_component *itd_make_type(GDataType *); + +/* Construit un composant dans un contexte Itanium. */ +itanium_component *itd_make_qualified_type(itanium_component *, TypeQualifier); + +/* Construit un composant dans un contexte Itanium. */ +itanium_component *itd_make_function_type(bool, itanium_component *); + +/* Construit un composant dans un contexte Itanium. */ +itanium_component *itd_make_array_with_dim_number(ssize_t, itanium_component *); + +/* Construit un composant dans un contexte Itanium. */ +itanium_component *itd_make_array_with_dim_expr(itanium_component *, itanium_component *); + +/* Construit un composant dans un contexte Itanium. */ +itanium_component *itd_make_pointer_to_memeber_type(itanium_component *, itanium_component *); + +/* Construit un composant dans un contexte Itanium. */ +itanium_component *itd_make_unary(ItaniumComponentType, itanium_component *); + +/* Construit un composant dans un contexte Itanium. */ +itanium_component *itd_make_binary(ItaniumComponentType, itanium_component *, itanium_component *); + +/* Construit un composant dans un contexte Itanium. */ +itanium_component *itd_append_right_to_binary(ItaniumComponentType, itanium_component *, itanium_component *); + +/* Construit un composant dans un contexte Itanium. */ +itanium_component *itd_make_ternary(ItaniumComponentType, itanium_component *, itanium_component *, 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(const itanium_component *, char *); + +/* Traduit les composants de contexte Itanium en type. */ +GDataType *itd_translate_component_to_type(const itanium_component *); + +/* Traduit les composants de contexte Itanium en routine. */ +GBinRoutine *itd_translate_component_to_routine(const itanium_component *); + + + +#endif /* _PLUGINS_ITANIUM_COMPONENT_H */ |