summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-12-04 22:59:30 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-12-04 22:59:30 (GMT)
commit12154652c576144405011b5bd267c15c9667f223 (patch)
treebe552b2b7bc563a58892e8950afd920a45132a6e
parent6803c5d5b86416d1748d4d37a5cc5cb44fe007b1 (diff)
Provided a new way to build the full name of each instruction and cached it.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@435 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
-rw-r--r--ChangeLog25
-rw-r--r--src/arch/arm/instruction.c23
-rw-r--r--src/arch/arm/v7/opdefs/mov_A88102.d2
-rw-r--r--src/arch/artificial.c15
-rw-r--r--src/arch/dalvik/instruction.c15
-rw-r--r--src/arch/instruction-int.h9
-rw-r--r--src/arch/instruction.c25
-rw-r--r--src/arch/instruction.h3
-rw-r--r--src/arch/raw.c15
-rw-r--r--tools/d2c/d2c_gram.y9
-rw-r--r--tools/d2c/d2c_tok.l6
-rw-r--r--tools/d2c/spec.c5
-rw-r--r--tools/d2c/syntax.c108
-rw-r--r--tools/d2c/syntax.h14
14 files changed, 212 insertions, 62 deletions
diff --git a/ChangeLog b/ChangeLog
index 8e34542..ad98e00 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,30 @@
14-12-04 Cyrille Bagard <nocbos@gmail.com>
+ * src/arch/arm/instruction.c:
+ Rebuild a full name of each ARM instruction.
+
+ * src/arch/arm/v7/opdefs/mov_A88102.d:
+ Append a '.W' suffix to the instruction keyword for Thumb32.
+ Change it for ARM.
+
+ * src/arch/artificial.c:
+ * src/arch/dalvik/instruction.c:
+ * src/arch/instruction.c:
+ * src/arch/instruction.h:
+ * src/arch/instruction-int.h:
+ * src/arch/raw.c:
+ Provide a new way to build the full name of each instruction and cache it.
+
+ * tools/d2c/d2c_gram.y:
+ * tools/d2c/d2c_tok.l:
+ * tools/d2c/spec.c:
+ * tools/d2c/syntax.c:
+ * tools/d2c/syntax.h:
+ Allow the compiler to handle suffixes or other values for instruction names.
+
+
+14-12-04 Cyrille Bagard <nocbos@gmail.com>
+
* src/arch/arm/v7/processor.c:
Process ARM / Thumb16 / Thumb32 data int the proper way.
diff --git a/src/arch/arm/instruction.c b/src/arch/arm/instruction.c
index b46cab0..6ce115c 100644
--- a/src/arch/arm/instruction.c
+++ b/src/arch/arm/instruction.c
@@ -24,7 +24,11 @@
#include "instruction.h"
+#include <string.h>
+
+
#include "instruction-int.h"
+#include "../../common/extstr.h"
@@ -40,8 +44,8 @@ static void g_arm_instruction_dispose(GArmInstruction *);
/* Procède à la libération totale de la mémoire. */
static void g_arm_instruction_finalize(GArmInstruction *);
-/* Fournit le nom humain de l'instruction manipulée. */
-static const char *g_arm_instruction_get_keyword(const GArmInstruction *, AsmSyntax);
+/* Reconstruit le cache complet d'une désignation d'instruction. */
+static void g_arm_instruction_build_keyword(const GArmInstruction *, AsmSyntax);
@@ -72,7 +76,7 @@ static void g_arm_instruction_class_init(GArmInstructionClass *klass)
object_class->dispose = (GObjectFinalizeFunc/* ! */)g_arm_instruction_dispose;
object_class->finalize = (GObjectFinalizeFunc)g_arm_instruction_finalize;
- instr->get_key = (get_instruction_keyword_fc)g_arm_instruction_get_keyword;
+ instr->build_key = (build_instruction_keyword_fc)g_arm_instruction_build_keyword;
}
@@ -138,7 +142,7 @@ static void g_arm_instruction_finalize(GArmInstruction *instr)
* Paramètres : instr = instruction à traiter. *
* syntax = type de représentation demandée. *
* *
-* Description : Fournit le nom humain de l'instruction manipulée. *
+* Description : Reconstruit le cache complet d'une désignation d'instruction.*
* *
* Retour : Mot clef de bas niveau. *
* *
@@ -146,9 +150,16 @@ static void g_arm_instruction_finalize(GArmInstruction *instr)
* *
******************************************************************************/
-static const char *g_arm_instruction_get_keyword(const GArmInstruction *instr, AsmSyntax syntax)
+static void g_arm_instruction_build_keyword(const GArmInstruction *instr, AsmSyntax syntax)
{
- return instr->keyword;
+ GArchInstruction *base; /* Instruction, vue générique */
+
+ base = G_ARCH_INSTRUCTION(instr);
+
+ base->cached_keyword = strdup(instr->keyword);
+
+ if (base->suffix != NULL)
+ base->cached_keyword = stradd(base->cached_keyword, base->suffix);
}
diff --git a/src/arch/arm/v7/opdefs/mov_A88102.d b/src/arch/arm/v7/opdefs/mov_A88102.d
index dcafc73..a71969f 100644
--- a/src/arch/arm/v7/opdefs/mov_A88102.d
+++ b/src/arch/arm/v7/opdefs/mov_A88102.d
@@ -42,7 +42,7 @@
@word 1 1 1 1 0 i(1) 0 0 0 1 0 S(1) 1 1 1 1 0 imm3(3) Rd(4) imm8(8)
- @syntax {S} <Rd> <const>
+ @syntax {S} ".W" <Rd> <const>
@conv {
diff --git a/src/arch/artificial.c b/src/arch/artificial.c
index 4131e5f..9b84226 100644
--- a/src/arch/artificial.c
+++ b/src/arch/artificial.c
@@ -24,6 +24,9 @@
#include "artificial.h"
+#include <string.h>
+
+
#include "immediate.h"
#include "instruction-int.h"
@@ -63,8 +66,8 @@ static void g_db_instruction_dispose(GDbInstruction *);
/* Procède à la libération totale de la mémoire. */
static void g_db_instruction_finalize(GDbInstruction *);
-/* Fournit le nom humain de l'instruction manipulée. */
-static const char *g_db_instruction_get_keyword(const GDbInstruction *, AsmSyntax);
+/* Reconstruit le cache complet d'une désignation d'instruction. */
+static void g_db_instruction_build_keyword(const GDbInstruction *, AsmSyntax);
/* Informe sur une éventuelle référence à une autre instruction. */
static InstructionLinkType g_db_instruction_get_link(const GDbInstruction *, vmpa_t *);
@@ -107,7 +110,7 @@ static void g_db_instruction_class_init(GDbInstructionClass *klass)
instr = G_ARCH_INSTRUCTION_CLASS(klass);
- instr->get_key = (get_instruction_keyword_fc)g_db_instruction_get_keyword;
+ instr->build_key = (build_instruction_keyword_fc)g_db_instruction_build_keyword;
}
@@ -233,7 +236,7 @@ GArchInstruction *g_db_instruction_new_from_data(const bin_t *data, vmpa2t *addr
* format = format du binaire manipulé. *
* syntax = type de représentation demandée. *
* *
-* Description : Fournit le nom humain de l'instruction manipulée. *
+* Description : Reconstruit le cache complet d'une désignation d'instruction.*
* *
* Retour : Mot clef de bas niveau. *
* *
@@ -241,9 +244,9 @@ GArchInstruction *g_db_instruction_new_from_data(const bin_t *data, vmpa2t *addr
* *
******************************************************************************/
-static const char *g_db_instruction_get_keyword(const GDbInstruction *instr, AsmSyntax syntax)
+static void g_db_instruction_build_keyword(const GDbInstruction *instr, AsmSyntax syntax)
{
- return "db";
+ G_ARCH_INSTRUCTION(instr)->cached_keyword = strdup("db");
}
diff --git a/src/arch/dalvik/instruction.c b/src/arch/dalvik/instruction.c
index e02619c..98e29dd 100644
--- a/src/arch/dalvik/instruction.c
+++ b/src/arch/dalvik/instruction.c
@@ -24,6 +24,9 @@
#include "instruction.h"
+#include <string.h>
+
+
#include "instruction-int.h"
#include "decomp/translate.h"
#include "operands/register.h"
@@ -327,8 +330,8 @@ static dalvik_instruction _instructions[DOP_COUNT] = {
};
-/* Fournit le nom humain de l'instruction manipulée. */
-static const char *dalvik_get_instruction_keyword(const GDalvikInstruction *, AsmSyntax);
+/* Reconstruit le cache complet d'une désignation d'instruction. */
+static void dalvik_build_instruction_keyword(const GDalvikInstruction *, AsmSyntax);
/* Informe sur une éventuelle référence à une autre instruction. */
static InstructionLinkType dalvik_get_instruction_link(const GDalvikInstruction *, vmpa_t *);
@@ -370,7 +373,7 @@ static void g_dalvik_instruction_class_init(GDalvikInstructionClass *klass)
instr = G_ARCH_INSTRUCTION_CLASS(klass);
- instr->get_key = (get_instruction_keyword_fc)dalvik_get_instruction_keyword;
+ instr->build_key = (build_instruction_keyword_fc)dalvik_build_instruction_keyword;
}
@@ -573,7 +576,7 @@ DalvikOpcodes dalvik_guess_next_instruction(const bin_t *data, off_t pos, off_t
* Paramètres : instr = instruction à traiter. *
* syntax = type de représentation demandée. *
* *
-* Description : Fournit le nom humain de l'instruction manipulée. *
+* Description : Reconstruit le cache complet d'une désignation d'instruction.*
* *
* Retour : Mot clef de bas niveau. *
* *
@@ -581,9 +584,9 @@ DalvikOpcodes dalvik_guess_next_instruction(const bin_t *data, off_t pos, off_t
* *
******************************************************************************/
-static const char *dalvik_get_instruction_keyword(const GDalvikInstruction *instr, AsmSyntax syntax)
+static void dalvik_build_instruction_keyword(const GDalvikInstruction *instr, AsmSyntax syntax)
{
- return _instructions[instr->type].keyword;
+ G_ARCH_INSTRUCTION(instr)->cached_keyword = strdup(_instructions[instr->type].keyword);
}
diff --git a/src/arch/instruction-int.h b/src/arch/instruction-int.h
index 958a5bd..f96753a 100644
--- a/src/arch/instruction-int.h
+++ b/src/arch/instruction-int.h
@@ -38,8 +38,8 @@ typedef void (* get_instruction_rw_regs_fc) (const GArchInstruction *, GArchRegi
/* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */
typedef GBufferLine * (* print_instruction_fc) (const GArchInstruction *, GCodeBuffer *, MemoryDataSize, const bin_t *, AsmSyntax);
-/* Traduit une instruction en version humainement lisible. */
-typedef const char * (* get_instruction_keyword_fc) (const GArchInstruction *, AsmSyntax);
+/* Reconstruit le cache complet d'une désignation d'instruction. */
+typedef void (* build_instruction_keyword_fc) (const GArchInstruction *, AsmSyntax);
/* Informe sur une éventuelle référence à une autre instruction. */
typedef InstructionLinkType (* get_instruction_link_fc) (const GArchInstruction *, vmpa_t *);
@@ -55,6 +55,9 @@ struct _GArchInstruction
DL_LIST_ITEM(flow); /* Maillon de liste chaînée */
+ const char *suffix; /* Complément au nom affiché */
+ char *cached_keyword; /* Désignation complète */
+
mrange_t range; /* Emplacement en mémoire */
/* ------- %< ----------- */
@@ -95,7 +98,7 @@ struct _GArchInstructionClass
GObjectClass parent; /* A laisser en premier */
print_instruction_fc print; /* Imprime l'ensemble */
- get_instruction_keyword_fc get_key; /* Texte humain équivalent */
+ build_instruction_keyword_fc build_key; /* Texte humain équivalent */
};
diff --git a/src/arch/instruction.c b/src/arch/instruction.c
index d91e110..c8640b4 100644
--- a/src/arch/instruction.c
+++ b/src/arch/instruction.c
@@ -147,6 +147,26 @@ static void g_arch_instruction_finalize(GArchInstruction *instr)
/******************************************************************************
* *
+* Paramètres : instr = instruction quelconque à modifier. *
+* suffix = chaîne de caractères fournie en complément. *
+* *
+* Description : Etend la désignation d'un nom d'instruction. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_arch_instruction_append_suffix(GArchInstruction *instr, const char *suffix)
+{
+ instr->suffix = suffix;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : instr = instruction quelconque à modifier. *
* address = adresse virtuelle et/ou position physique. *
* length = taille de l'instruction. *
@@ -662,7 +682,10 @@ size_t g_arch_instruction_compute_group_index(GArchInstruction **iter, GArchInst
const char *g_arch_instruction_get_keyword(const GArchInstruction *instr, AsmSyntax syntax)
{
- return G_ARCH_INSTRUCTION_GET_CLASS(instr)->get_key(instr, syntax);
+ if (instr->cached_keyword == NULL)
+ G_ARCH_INSTRUCTION_GET_CLASS(instr)->build_key(instr, syntax);
+
+ return instr->cached_keyword;
}
diff --git a/src/arch/instruction.h b/src/arch/instruction.h
index eadac8b..287e34f 100644
--- a/src/arch/instruction.h
+++ b/src/arch/instruction.h
@@ -56,6 +56,9 @@ typedef struct _GArchInstructionClass GArchInstructionClass;
/* Indique le type défini pour une instruction d'architecture. */
GType g_arch_instruction_get_type(void);
+/* Etend la désignation d'un nom d'instruction. */
+void g_arch_instruction_append_suffix(GArchInstruction *, const char *);
+
/* Définit la localisation d'une instruction. */
void g_arch_instruction_set_range(GArchInstruction *, const mrange_t *);
diff --git a/src/arch/raw.c b/src/arch/raw.c
index 164086a..9b13dac 100644
--- a/src/arch/raw.c
+++ b/src/arch/raw.c
@@ -24,6 +24,9 @@
#include "raw.h"
+#include <string.h>
+
+
#include "immediate.h"
#include "instruction-int.h"
@@ -64,8 +67,8 @@ static void g_raw_instruction_finalize(GRawInstruction *);
/* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */
static GBufferLine *g_raw_instruction_print(const GRawInstruction *, GCodeBuffer *, MemoryDataSize, const bin_t *, AsmSyntax);
-/* Fournit le nom humain de l'instruction manipulée. */
-static const char *g_raw_instruction_get_keyword(const GRawInstruction *, AsmSyntax);
+/* Reconstruit le cache complet d'une désignation d'instruction. */
+static void g_raw_instruction_build_keyword(const GRawInstruction *, AsmSyntax);
@@ -103,7 +106,7 @@ static void g_raw_instruction_class_init(GRawInstructionClass *klass)
instr = G_ARCH_INSTRUCTION_CLASS(klass);
instr->print = (print_instruction_fc)g_raw_instruction_print;
- instr->get_key = (get_instruction_keyword_fc)g_raw_instruction_get_keyword;
+ instr->build_key = (build_instruction_keyword_fc)g_raw_instruction_build_keyword;
}
@@ -275,7 +278,7 @@ static GBufferLine *g_raw_instruction_print(const GRawInstruction *instr, GCodeB
* format = format du binaire manipulé. *
* syntax = type de représentation demandée. *
* *
-* Description : Fournit le nom humain de l'instruction manipulée. *
+* Description : Reconstruit le cache complet d'une désignation d'instruction.*
* *
* Retour : Mot clef de bas niveau. *
* *
@@ -283,7 +286,7 @@ static GBufferLine *g_raw_instruction_print(const GRawInstruction *instr, GCodeB
* *
******************************************************************************/
-static const char *g_raw_instruction_get_keyword(const GRawInstruction *instr, AsmSyntax syntax)
+static void g_raw_instruction_build_keyword(const GRawInstruction *instr, AsmSyntax syntax)
{
GArchOperand *operand; /* Octet décodé à afficher */
MemoryDataSize size; /* Taille de valeur associée */
@@ -293,7 +296,7 @@ static const char *g_raw_instruction_get_keyword(const GRawInstruction *instr, A
operand = g_arch_instruction_get_operand(G_ARCH_INSTRUCTION(instr), 0);
size = g_imm_operand_get_size(G_IMM_OPERAND(operand));
- return defines[MDS_RANGE(size)];
+ G_ARCH_INSTRUCTION(instr)->cached_keyword = strdup(defines[MDS_RANGE(size)]);
}
diff --git a/tools/d2c/d2c_gram.y b/tools/d2c/d2c_gram.y
index 1c25b17..5ae93c8 100644
--- a/tools/d2c/d2c_gram.y
+++ b/tools/d2c/d2c_gram.y
@@ -138,7 +138,7 @@ struct action_tmp
%token WORD HALF NAME SIZE BIT
-%token SYNTAX OPERAND_INTERNAL OPERAND_VISIBLE
+%token SYNTAX OPERAND_NAME OPERAND_INTERNAL OPERAND_VISIBLE
%token CONV EQ OP COMMA CP NOT EOR COLON
@@ -154,7 +154,7 @@ struct action_tmp
%type <string> NAME
%type <integer> SIZE BIT
-%type <string> OPERAND_INTERNAL OPERAND_VISIBLE
+%type <string> OPERAND_NAME OPERAND_INTERNAL OPERAND_VISIBLE
%type <subst> substitution
@@ -216,8 +216,9 @@ bits : /* empty */
syntax : SYNTAX operands
operands : /* empty */
- | operands OPERAND_INTERNAL { register_syntax_item_in_coder(coder, $2, true); }
- | operands OPERAND_VISIBLE { register_syntax_item_in_coder(coder, $2, false); }
+ | operands OPERAND_NAME { register_syntax_item_in_coder(coder, $2, SIT_KEYWORD); }
+ | operands OPERAND_INTERNAL { register_syntax_item_in_coder(coder, $2, SIT_INT_OPERAND); }
+ | operands OPERAND_VISIBLE { register_syntax_item_in_coder(coder, $2, SIT_EXT_OPERAND); }
conversions : CONV substitutions
diff --git a/tools/d2c/d2c_tok.l b/tools/d2c/d2c_tok.l
index e40f10d..78abfd3 100644
--- a/tools/d2c/d2c_tok.l
+++ b/tools/d2c/d2c_tok.l
@@ -29,7 +29,7 @@ void free_flex_memory(void) ;
%x encoding_bits encoding_bits_size
-%x syntax syntax_int syntax_ext
+%x syntax syntax_name syntax_int syntax_ext
%x conv_begin conv_content conv_arg conv_arg_binval
@@ -95,6 +95,10 @@ void free_flex_memory(void) ;
<syntax>[ ]+ { }
<syntax>"\n" { BEGIN(encoding_content); }
+<syntax>[\"] { BEGIN(syntax_name); }
+<syntax_name>[^ \n\"]+ { d2c_lval.string = strdup(yytext); return OPERAND_NAME; }
+<syntax_name>[\"] { BEGIN(syntax); }
+
<syntax>"{" { BEGIN(syntax_int); }
<syntax_int>[^ \n}]+ { d2c_lval.string = strdup(yytext); return OPERAND_INTERNAL; }
<syntax_int>"}" { BEGIN(syntax); }
diff --git a/tools/d2c/spec.c b/tools/d2c/spec.c
index 867df37..9990881 100644
--- a/tools/d2c/spec.c
+++ b/tools/d2c/spec.c
@@ -266,6 +266,7 @@ bool write_encoding_spec_disass(const encoding_spec *spec, int fd, const char *a
bool result; /* Bilan à retourner */
char *keyword; /* Mot clef appelable en code */
bool exit; /* Inclusion de sortie rapide ?*/
+ const char *new_ins; /* Nouvelle définition de nom */
result = true;
@@ -306,7 +307,9 @@ bool write_encoding_spec_disass(const encoding_spec *spec, int fd, const char *a
/* Création de l'instruction en elle-même */
- dprintf(fd, "\t\tinstr = g_%s_instruction_new(\"%s\");\n", arch, ins);
+ new_ins = get_new_keyword_from_syntax_items(spec->syntax);
+
+ dprintf(fd, "\t\tinstr = g_%s_instruction_new(\"%s\");\n", arch, new_ins != NULL ? new_ins : ins);
dprintf(fd, "\n");
diff --git a/tools/d2c/syntax.c b/tools/d2c/syntax.c
index 8947810..14d13d9 100644
--- a/tools/d2c/syntax.c
+++ b/tools/d2c/syntax.c
@@ -45,7 +45,7 @@ typedef enum _SyntaxItemFlags
typedef struct _syntax_item
{
char *name; /* Désignation humaine */
- bool internal; /* Enregistrement générique ? */
+ SyntaxItemType impact; /* Portée de l'élément */
SyntaxItemFlags flags; /* Propriétés supplémentaires */
} syntax_item;
@@ -112,9 +112,9 @@ void delete_asm_syntax(asm_syntax *syntax)
/******************************************************************************
* *
-* Paramètres : syntax = gestionnaire d'un ensemble d'éléments de syntaxe. *
-* name = désignation de l'opérande dans la spécification. *
-* internal = précise si l'opérand est non générique ou non. *
+* Paramètres : syntax = gestionnaire d'un ensemble d'éléments de syntaxe. *
+* name = désignation de l'opérande dans la spécification. *
+* impact = précise la portée effective de l'opérande *
* *
* Description : Enregistre la présence d'un nouvel opérande dans la syntaxe. *
* *
@@ -124,7 +124,7 @@ void delete_asm_syntax(asm_syntax *syntax)
* *
******************************************************************************/
-void register_syntax_item(asm_syntax *syntax, char *name, bool internal)
+void register_syntax_item(asm_syntax *syntax, char *name, SyntaxItemType impact)
{
syntax_item *item; /* Nouvelle prise en compte */
size_t len; /* Taille du nom fourni */
@@ -156,8 +156,12 @@ void register_syntax_item(asm_syntax *syntax, char *name, bool internal)
}
- item->name = make_string_lower(name);
- item->internal = internal;
+ if (impact == SIT_KEYWORD)
+ item->name = name;
+ else
+ item->name = make_string_lower(name);
+
+ item->impact = impact;
}
@@ -188,6 +192,7 @@ bool mark_syntax_items(const asm_syntax *syntax, const coding_bits *bits, const
for (i = 0; i < syntax->items_count && result; i++)
{
item = &syntax->items[i];
+ if (item->impact == SIT_KEYWORD) continue;
func = find_named_conv_in_list(list, item->name);
if (func == NULL)
@@ -236,8 +241,9 @@ bool declare_syntax_items(const asm_syntax *syntax, int fd, const coding_bits *b
for (i = 0; i < syntax->items_count && result; i++)
{
item = &syntax->items[i];
+ if (item->impact == SIT_KEYWORD) continue;
- has_operand |= !item->internal;
+ has_operand |= (item->impact == SIT_EXT_OPERAND);
func = find_named_conv_in_list(list, item->name);
if (func == NULL)
@@ -261,6 +267,35 @@ bool declare_syntax_items(const asm_syntax *syntax, int fd, const coding_bits *b
/******************************************************************************
* *
* Paramètres : syntax = gestionnaire d'un ensemble d'éléments de syntaxe. *
+* *
+* Description : Fournit si elle existe un nom nouveau pour une instruction. *
+* *
+* Retour : Eventuelle chaîne de caractères trouvée ou NULL. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+const char *get_new_keyword_from_syntax_items(const asm_syntax *syntax)
+{
+ const char *result; /* Nom éventuel à renvoyer */
+
+ result = NULL;
+
+ if (syntax->items_count > 0
+ && syntax->items[0].impact == SIT_KEYWORD)
+ {
+ result = syntax->items[0].name;
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : syntax = gestionnaire d'un ensemble d'éléments de syntaxe. *
* fd = descripteur d'un flux ouvert en écriture. *
* arch = architecture visée par l'opération globale. *
* bits = gestionnaire des bits d'encodage. *
@@ -281,6 +316,7 @@ bool define_syntax_items(const asm_syntax *syntax, int fd, const char *arch, con
size_t i; /* Boucle de parcours */
syntax_item *item; /* Lien vers un opérande */
conv_func *func; /* Fonction de conversion */
+ bool internal; /* Usage interne ou non ? */
result = true;
@@ -288,33 +324,53 @@ bool define_syntax_items(const asm_syntax *syntax, int fd, const char *arch, con
{
item = &syntax->items[i];
- func = find_named_conv_in_list(list, item->name);
- if (func == NULL)
+ switch (item->impact)
{
- fprintf(stderr, "Error: expected conversion for '%s'.\n", item->name);
- result = false;
- }
+ case SIT_KEYWORD:
- /* Appel proprement dit */
+ if (i > 0)
+ dprintf(fd, "\t\tg_arch_instruction_append_suffix(instr, \"%s\");\n", item->name);
+ else
+ continue;
- result &= define_conv_func(func, true, item->internal, fd, arch, bits, list, pp);
- if (!result) break;
+ break;
- /* Raccordement : propriété ou opérande ? */
+ case SIT_INT_OPERAND:
+ case SIT_EXT_OPERAND:
- if (item->internal)
- dprintf(fd, "\t\t\tgoto bad_exit;\n");
+ internal = (item->impact == SIT_INT_OPERAND);
- else
- {
- dprintf(fd, "\t\tif (op == NULL) goto bad_exit;\n");
+ func = find_named_conv_in_list(list, item->name);
+ if (func == NULL)
+ {
+ fprintf(stderr, "Error: expected conversion for '%s'.\n", item->name);
+ result = false;
+ }
+
+ /* Appel proprement dit */
+
+ result &= define_conv_func(func, true, internal, fd, arch, bits, list, pp);
+ if (!result) break;
+
+ /* Raccordement : propriété ou opérande ? */
+
+ if (internal)
+ dprintf(fd, "\t\t\tgoto bad_exit;\n");
- dprintf(fd, "\n");
+ else
+ {
+ dprintf(fd, "\t\tif (op == NULL) goto bad_exit;\n");
- if (item->flags & SIF_DECIMAL)
- dprintf(fd, "\t\tg_imm_operand_set_display(G_IMM_OPERAND(op), IOD_DEC);\n");
+ dprintf(fd, "\n");
- dprintf(fd, "\t\tg_arch_instruction_attach_extra_operand(instr, op);\n");
+ if (item->flags & SIF_DECIMAL)
+ dprintf(fd, "\t\tg_imm_operand_set_display(G_IMM_OPERAND(op), IOD_DEC);\n");
+
+ dprintf(fd, "\t\tg_arch_instruction_attach_extra_operand(instr, op);\n");
+
+ }
+
+ break;
}
diff --git a/tools/d2c/syntax.h b/tools/d2c/syntax.h
index 0cd9210..fc7cc6b 100644
--- a/tools/d2c/syntax.h
+++ b/tools/d2c/syntax.h
@@ -34,6 +34,15 @@
+/* Type d'éléments de syntaxe */
+typedef enum _SyntaxItemType
+{
+ SIT_KEYWORD, /* Elément de l'instruction */
+ SIT_INT_OPERAND, /* Propriété d'architecture */
+ SIT_EXT_OPERAND /* Opérande généraliste */
+
+} SyntaxItemType;
+
/* Syntaxe d'une ligne d'assembleur */
typedef struct _asm_syntax asm_syntax;
@@ -45,7 +54,7 @@ asm_syntax *create_asm_syntax(void);
void delete_asm_syntax(asm_syntax *);
/* Enregistre la présence d'un nouvel opérande dans la syntaxe. */
-void register_syntax_item(asm_syntax *, char *, bool);
+void register_syntax_item(asm_syntax *, char *, SyntaxItemType);
/* Marque les champs de bits effectivement utilisés. */
bool mark_syntax_items(const asm_syntax *, const coding_bits *, const conv_list *);
@@ -53,6 +62,9 @@ bool mark_syntax_items(const asm_syntax *, const coding_bits *, const conv_list
/* Déclare les variables C associées aux opérandes de syntaxe. */
bool declare_syntax_items(const asm_syntax *, int, const coding_bits *, const conv_list *, unsigned int);
+/* Fournit si elle existe un nom nouveau pour une instruction. */
+const char *get_new_keyword_from_syntax_items(const asm_syntax *);
+
/* Définit les variables C associées aux opérandes de syntaxe. */
bool define_syntax_items(const asm_syntax *, int, const char *, const coding_bits *, const conv_list *, const pre_processor *);