summaryrefslogtreecommitdiff
path: root/tools/d2c/spec.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/d2c/spec.c')
-rw-r--r--tools/d2c/spec.c134
1 files changed, 132 insertions, 2 deletions
diff --git a/tools/d2c/spec.c b/tools/d2c/spec.c
index 30a412a..1692fd8 100644
--- a/tools/d2c/spec.c
+++ b/tools/d2c/spec.c
@@ -40,6 +40,8 @@ struct _encoding_spec
char *lprefix; /* Distinction en minuscules */
unsigned int index; /* Distinction secondaire */
+ operands_format *format; /* Définition des opérandes */
+
coding_bits *bits; /* Encodage des bits associés */
asm_syntax *syntax; /* Calligraphe d'assemblage */
conv_list *conversions; /* Conversions des données */
@@ -68,6 +70,8 @@ encoding_spec *create_encoding_spec(void)
result = (encoding_spec *)calloc(1, sizeof(encoding_spec));
+ result->format = create_operands_format();
+
result->bits = create_coding_bits();
result->syntax = create_asm_syntax();
result->conversions = create_conv_list();
@@ -93,6 +97,8 @@ encoding_spec *create_encoding_spec(void)
void delete_encoding_spec(encoding_spec *spec)
{
+ delete_operands_format(spec->format);
+
delete_coding_bits(spec->bits);
delete_asm_syntax(spec->syntax);
delete_conv_list(spec->conversions);
@@ -142,7 +148,37 @@ void define_encoding_spec_code_name(encoding_spec *spec, char *prefix, unsigned
bool has_encoding_spec_prefix(const encoding_spec *spec, const char *prefix)
{
- return (strcmp(spec->prefix, prefix) == 0);
+ bool result; /* Bilan à renvoyer */
+
+ if (spec->prefix == NULL && prefix == NULL)
+ result = true;
+
+ else if (spec->prefix != NULL && prefix != NULL)
+ result = strcmp(spec->prefix, prefix) == 0;
+
+ else
+ result = false;
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : spec = spécification d'encodage à consulter. *
+* *
+* Description : Fournit le gestionnaire des définitions d'opérandes. *
+* *
+* Retour : Structure assurant la définition des opérandes *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+operands_format *get_format_in_encoding_spec(const encoding_spec *spec)
+{
+ return spec->format;
}
@@ -250,7 +286,6 @@ decoding_rules *get_rules_in_encoding_spec(const encoding_spec *spec)
* subarch = sous-catégorie de cette même architecture. *
* ins = désignation première de l'instruction manipulée. *
* details = particularités de l'instruction. *
-* keyword = nom clef de l'instruction utilisable dans du code. *
* wide = taille des mots manipulés (en bits). *
* pp = pré-processeur pour les échanges de chaînes. *
* *
@@ -380,3 +415,98 @@ bool write_encoding_spec_disass(const encoding_spec *spec, int fd, const char *a
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : spec = spécification servant de base à l'opération. *
+* fd = descripteur d'un flux ouvert en écriture. *
+* arch = architecture visée par l'opération. *
+* subarch = sous-catégorie de cette même architecture. *
+* ins = désignation première de l'instruction manipulée. *
+* sep = caractère de séparation avant les détails. *
+* details = particularités de l'instruction. *
+* pp = pré-processeur pour les échanges de chaînes. *
+* prefix = préfixe pour le type de définitions d'opérandes. *
+* *
+* Description : Traduit en code une sous-fonction de désassemblage. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool write_encoding_spec_format_disass(const encoding_spec *spec, int fd, const char *arch, const char *subarch, const char *ins, char sep, const char *details, const pre_processor *pp, const char *prefix)
+{
+ bool result; /* Bilan à retourner */
+ bool quick_exit; /* Inclusion de sortie rapide ?*/
+ bool bad_exit; /* Ajout d'une sortie d'échec ?*/
+ const char *new_ins; /* Nouvelle définition de nom */
+
+ result = true;
+
+ /* Déclarations préalables */
+
+ dprintf(fd, "\tGArchInstruction *result; /* Instruction créée à renvoyer*/\n");
+ dprintf(fd, "\tSourceEndian endian; /* Boutisme lié au binaire */\n");
+
+ dprintf(fd, "\n");
+
+ /* Création de l'instruction en elle-même */
+
+ new_ins = get_new_keyword_from_syntax_items(spec->syntax);
+
+ if (new_ins != NULL)
+ dprintf(fd, "\tresult = g_%s_instruction_new(\"%s\");\n", arch, new_ins);
+ else
+ {
+ if (sep == '\0')
+ dprintf(fd, "\tresult = g_%s_instruction_new(\"%s\");\n", arch, ins);
+ else
+ dprintf(fd, "\tresult = g_%s_instruction_new(\"%s%c%s\");\n", arch, ins, sep, details);
+ }
+
+ dprintf(fd, "\n");
+
+ /* Inscriptions des éventuelles fonctions ou propriété à lier */
+
+ result &= write_hook_functions(spec->hooks, fd);
+
+ result &= write_decoding_rules(spec->rules, CAT_CHECKED_CALL,
+ fd, arch, subarch, spec->bits, spec->conversions, pp, &quick_exit);
+
+ result &= write_decoding_rules(spec->rules, CAT_CALL,
+ fd, arch, subarch, spec->bits, spec->conversions, pp, &quick_exit);
+
+ /* Création des opérandes */
+
+ dprintf(fd, "\tendian = g_arch_processor_get_endianness(G_ARCH_PROCESSOR(proc));\n");
+
+ dprintf(fd, "\n");
+
+ bad_exit = false;
+
+ result &= define_operands_loading(spec->format, fd, arch, prefix, &bad_exit);
+
+ /* Conclusion de la procédure */
+
+ dprintf(fd, "\treturn result;\n");
+
+ dprintf(fd, "\n");
+
+ if (bad_exit)
+ {
+ dprintf(fd, " bad_exit:\n");
+ dprintf(fd, "\n");
+
+ dprintf(fd, "\tg_object_unref(G_OBJECT(result));\n");
+ dprintf(fd, "\treturn NULL;\n");
+
+ dprintf(fd, "\n");
+
+ }
+
+ return result;
+
+}