summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-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
5 files changed, 109 insertions, 33 deletions
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 *);