/* 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 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 .
*/
#ifndef _FORMAT_MANGLING_ITANIUM_COMPONENT_H
#define _FORMAT_MANGLING_ITANIUM_COMPONENT_H
#include
#include
#include
#include
#include
#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écallage : '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 */