summaryrefslogtreecommitdiff
path: root/src/arch/immediate.h
blob: 9becf911ccb4d5d0f083676dd4c63cf45564a688 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177

/* Chrysalide - Outil d'analyse de fichiers binaires
 * immediate.h - prototypes pour les opérandes représentant des valeurs numériques
 *
 * 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 _ARCH_IMMEDIATE_H
#define _ARCH_IMMEDIATE_H


#include <glib-object.h>
#include <stdbool.h>
#include <stdint.h>


#include "archbase.h"
#include "operand.h"
#include "sharing/container.h"
#include "../analysis/content.h"



/* ------------------ MANIPULATION D'OPERANDES DE VALEUR IMMEDIATE ------------------ */


/* Grande ligne d'un format d'affichage */
typedef enum _ImmOperandDisplay
{
    IOD_BIN,                                /* Impression en binaire       */
    IOD_OCT,                                /* Impression en octal         */
    IOD_DEC,                                /* Impression en décimal       */
    IOD_HEX,                                /* Impression en hexadécimal   */
    IOD_CHAR,                               /* Impression en base 26       */

    IOD_COUNT

} ImmOperandDisplay;


#define IOD_LAST_VALID IOD_CHAR


#define G_TYPE_IMM_OPERAND               g_imm_operand_get_type()
#define G_IMM_OPERAND(obj)               (G_TYPE_CHECK_INSTANCE_CAST((obj), g_imm_operand_get_type(), GImmOperand))
#define G_IS_IMM_OPERAND(obj)            (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_imm_operand_get_type()))
#define G_IMM_OPERAND_CLASS(klass)       (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_IMM_OPERAND, GImmOperandClass))
#define G_IS_IMM_OPERAND_CLASS(klass)    (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_IMM_OPERAND))
#define G_IMM_OPERAND_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_IMM_OPERAND, GImmOperandClass))


/* Définition d'un opérande de valeur numérique (instance) */
typedef struct _GImmOperand GImmOperand;

/* Définition d'un opérande de valeur numérique (classe) */
typedef struct _GImmOperandClass GImmOperandClass;


/* Indique le type défini pour un opérande d'architecture. */
GType g_imm_operand_get_type(void);

/* Crée un opérande réprésentant une valeur numérique. */
GArchOperand *_g_imm_operand_new_from_data(MemoryDataSize, const GBinContent *, vmpa2t *, bool *, SourceEndian);

#define g_imm_operand_new_from_data(size, content, addr, endian) \
    _g_imm_operand_new_from_data(size, content, addr, NULL, endian)

/* Crée un opérande réprésentant une valeur numérique. */
GArchOperand *g_imm_operand_new_from_value(MemoryDataSize, uint64_t);

/* Renseigne la taille de la valeur indiquée à la construction. */
MemoryDataSize g_imm_operand_get_size(const GImmOperand *);

/* Fournit la valeur portée par une opérande numérique. */
bool g_imm_operand_get_value(const GImmOperand *, MemoryDataSize, ...);

/* Fournit la valeur brute représentée par l'opérande. */
uint64_t g_imm_operand_get_raw_value(const GImmOperand *);

/* Définit la nouvelle valeur de l'opérande à une valeur. */
void g_imm_operand_set_value(GImmOperand **, MemoryDataSize, uint64_t, GShareContainer *);

/* Précise si des zéro doivent compléter l'affichage ou non. */
void g_imm_operand_pad_by_default(GImmOperand **, bool, GShareContainer *);

/* Indique si une valeur est complétée par des zéros par défaut. */
bool g_imm_operand_does_padding_by_default(const GImmOperand *);

/* Précise si des zéro doivent compléter l'affichage ou non. */
void g_imm_operand_pad(GImmOperand **, bool, GShareContainer *);

/* Indique si une valeur est complétée par des zéros. */
bool g_imm_operand_does_padding(const GImmOperand *);

/* Définit le format textuel par défaut de la valeur. */
void g_imm_operand_set_default_display(GImmOperand **, ImmOperandDisplay, GShareContainer *);

/* Indique le format textuel par défaut de la valeur. */
ImmOperandDisplay g_imm_operand_get_default_display(const GImmOperand *);

/* Définit la grande ligne du format textuel de la valeur. */
void g_imm_operand_set_display(GImmOperand **, ImmOperandDisplay, GShareContainer *);

/* Indique la grande ligne du format textuel de la valeur. */
ImmOperandDisplay g_imm_operand_get_display(const GImmOperand *);

/* Indique le signe d'une valeur immédiate. */
bool g_imm_operand_is_negative(const GImmOperand *);

/* Indique si une valeur immédiate est nulle ou non. */
bool g_imm_operand_is_null(const GImmOperand *);

/**
 * La taille d'impression d'un opérande n'est pas VMPA_MAX_SIZE,
 * mais 1 + 64 caractères + octet nul final en cas d'impression en binaire.
 */
#define IMM_MAX_SIZE 66

/* Construit la chaîne de caractères correspondant à l'opérande. */
size_t g_imm_operand_to_string(const GImmOperand *, AsmSyntax, char [IMM_MAX_SIZE]);

/* Convertit une valeur immédiate en position de type phys_t. */
bool g_imm_operand_to_phys_t(const GImmOperand *, phys_t *);

/* Convertit une valeur immédiate en adresse de type virt_t. */
bool g_imm_operand_to_virt_t(const GImmOperand *, virt_t *);

/* Convertit une valeur immédiate en valeur de type leb128_t. */
void g_imm_operand_as_leb128(const GImmOperand *, leb128_t *);

/* Convertit une valeur immédiate en valeur de type uleb128_t. */
void g_imm_operand_as_uleb128(const GImmOperand *, uleb128_t *);

/* Convertit une valeur immédiate en adresse de type vmpa_t. */
bool g_imm_operand_to_vmpa_t(const GImmOperand *, vmpa_t *) __attribute__ ((deprecated));

/* Convertit une valeur immédiate en valeur de type size_t. */
bool g_imm_operand_to_size_t(const GImmOperand *, size_t *, bool *) __attribute__ ((deprecated));

/* Convertit une valeur immédiate en valeur de type off_t. */
bool g_imm_operand_to_off_t(const GImmOperand *, off_t *, bool *) __attribute__ ((deprecated));



/* -------------------------- PARTAGES DE CONTENUS UNIQUES -------------------------- */


/* Initialise les mécanismes de partage des opérandes immédiates. */
bool init_imm_operand_sharing(void);

/* Imprime des statistiques quant aux partages dans l'archi. */
#ifdef DEBUG_DUMP_STATS
void dump_imm_operand_share_stats(void);
#endif

/* Supprime les mécanismes de partage des opérandes immédiates. */
void exit_imm_operand_sharing(void);



#endif  /* _ARCH_IMMEDIATE_H */