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.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/tools/d2c/spec.c b/tools/d2c/spec.c
index 7d65cab..cf1a066 100644
--- a/tools/d2c/spec.c
+++ b/tools/d2c/spec.c
@@ -266,7 +266,8 @@ 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 ?*/
+ 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;
@@ -304,13 +305,13 @@ bool write_encoding_spec_disass(const encoding_spec *spec, int fd, const char *a
/* Inclusion des éventuelles règles */
- exit = false;
+ quick_exit = false;
result &= write_decoding_rules(spec->rules, CAT_SEE,
- fd, arch, subarch, spec->bits, spec->conversions, pp, &exit);
+ fd, arch, subarch, spec->bits, spec->conversions, pp, &quick_exit);
result &= write_decoding_rules(spec->rules, CAT_UNPREDICTABLE,
- fd, arch, subarch, spec->bits, spec->conversions, pp, &exit);
+ fd, arch, subarch, spec->bits, spec->conversions, pp, &quick_exit);
/* Création de l'instruction en elle-même */
@@ -325,18 +326,20 @@ bool write_encoding_spec_disass(const encoding_spec *spec, int fd, const char *a
result &= write_hook_functions(spec->hooks, fd);
result &= write_decoding_rules(spec->rules, CAT_CHECKED_CALL,
- fd, arch, subarch, spec->bits, spec->conversions, pp, &exit);
+ 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, &exit);
+ fd, arch, subarch, spec->bits, spec->conversions, pp, &quick_exit);
/* Création des opérandes */
- result &= define_syntax_items(spec->syntax, fd, arch, spec->bits, spec->conversions, pp);
+ bad_exit = false;
+
+ result &= define_syntax_items(spec->syntax, fd, arch, spec->bits, spec->conversions, pp, &bad_exit);
/* Conclusion de la procédure */
- if (exit)
+ if (quick_exit)
{
dprintf(fd, "\t quick_exit:\n");
dprintf(fd, "\n");
@@ -346,14 +349,17 @@ bool write_encoding_spec_disass(const encoding_spec *spec, int fd, const char *a
dprintf(fd, "\n");
- dprintf(fd, "\t bad_exit:\n");
+ if (bad_exit)
+ {
+ dprintf(fd, "\t bad_exit:\n");
+ dprintf(fd, "\n");
- dprintf(fd, "\n");
+ dprintf(fd, "\t\tg_object_unref(G_OBJECT(instr));\n");
+ dprintf(fd, "\t\treturn NULL;\n");
- dprintf(fd, "\t\tg_object_unref(G_OBJECT(instr));\n");
- dprintf(fd, "\t\treturn NULL;\n");
+ dprintf(fd, "\n");
- dprintf(fd, "\n");
+ }
dprintf(fd, "\t}\n");