diff options
Diffstat (limited to 'tools/d2c/spec.c')
-rw-r--r-- | tools/d2c/spec.c | 134 |
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; + +} |