summaryrefslogtreecommitdiff
path: root/tools/d2c/syntax.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/d2c/syntax.c')
-rw-r--r--tools/d2c/syntax.c108
1 files changed, 82 insertions, 26 deletions
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;
}