diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2014-12-03 22:41:29 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2014-12-03 22:41:29 (GMT) |
commit | 172fce9bab61de1ffa89f731b5d10f96e209afc1 (patch) | |
tree | 31aee5a141979fa99bbf88cbf2b7990de0ec3832 /tools/d2c | |
parent | f7ef27195f8c9dc35e5e210a333b74fcfae5ad71 (diff) |
Begun to support more than the only 'ARMv7' architecture for ARM (ARM / Thumb16 / Thumb32).
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@433 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'tools/d2c')
-rw-r--r-- | tools/d2c/coder.c | 20 | ||||
-rw-r--r-- | tools/d2c/conv.c | 25 | ||||
-rw-r--r-- | tools/d2c/rules.c | 14 | ||||
-rw-r--r-- | tools/d2c/rules.h | 2 | ||||
-rw-r--r-- | tools/d2c/spec.c | 5 | ||||
-rw-r--r-- | tools/d2c/spec.h | 2 |
6 files changed, 47 insertions, 21 deletions
diff --git a/tools/d2c/coder.c b/tools/d2c/coder.c index 5856d80..b4bf21f 100644 --- a/tools/d2c/coder.c +++ b/tools/d2c/coder.c @@ -455,6 +455,7 @@ bool dump_all_routines_using_coder(const rented_coder *coder) const string_exch *encoding; /* Type d'encodage visé */ bool exist; /* Présence du fichier visé ? */ int header_fd; /* Fichier de déclarations */ + char *uname; /* Nom en majuscule */ char *dash; /* Présence d'un tiret ? */ char *filename; /* Nom de fichier commun */ int code_fd; /* Fichier de définitions */ @@ -472,8 +473,12 @@ bool dump_all_routines_using_coder(const rented_coder *coder) if (!exist) { - dprintf(header_fd, "#ifndef %s_OPCODES_OPCODES_H\n", coder->header); - dprintf(header_fd, "#define %s_OPCODES_OPCODES_H\n", coder->header); + uname = make_string_upper(strdup(encoding->dest)); + + dprintf(header_fd, "#ifndef %s_%sOPCODES_OPCODES_H\n", coder->header, uname); + dprintf(header_fd, "#define %s_%sOPCODES_OPCODES_H\n", coder->header, uname); + + free(uname); dprintf(header_fd, "\n"); dprintf(header_fd, "\n"); @@ -506,7 +511,7 @@ bool dump_all_routines_using_coder(const rented_coder *coder) if (!exist) { - dprintf(code_fd, "#include \"opcodes.h\"\n"); + dprintf(code_fd, "#include \"%sopcodes.h\"\n", encoding->dest); dprintf(code_fd, "\n"); dprintf(code_fd, "##INCLUDES##\n"); @@ -584,7 +589,8 @@ static bool dump_all_matching_specs_in_coder(const rented_coder *coder, const st /* Désassemblage : déclaration */ dprintf(hfd, "/* Décode une instruction de type '%s'. */\n", coder->ins); - dprintf(hfd, "GArchInstruction *%s_read_instr_%s%s(uint%u_t);\n", coder->arch, keyword, coder->details, wide); + dprintf(hfd, "GArchInstruction *%s_read_%sinstr_%s%s(uint%u_t);\n", + coder->arch, encoding->dest, keyword, coder->details, wide); dprintf(hfd, "\n"); /* Désassemblage : définitions */ @@ -613,7 +619,8 @@ static bool dump_all_matching_specs_in_coder(const rented_coder *coder, const st dprintf(cfd, "\n"); - dprintf(cfd, "GArchInstruction *%s_read_instr_%s%s(uint%u_t raw)", coder->arch, keyword, coder->details, wide); + dprintf(cfd, "GArchInstruction *%s_read_%sinstr_%s%s(uint%u_t raw)", + coder->arch, encoding->dest, keyword, coder->details, wide); dprintf(cfd, "\n"); dprintf(cfd, "{"); dprintf(cfd, "\n"); @@ -631,7 +638,8 @@ static bool dump_all_matching_specs_in_coder(const rented_coder *coder, const st if (!has_encoding_spec_prefix(spec, encoding->src)) continue; - result = write_encoding_spec_disass(spec, cfd, coder->arch, coder->ins, coder->details, wide, coder->pp); + result = write_encoding_spec_disass(spec, cfd, coder->arch, encoding->dest, + coder->ins, coder->details, wide, coder->pp); } diff --git a/tools/d2c/conv.c b/tools/d2c/conv.c index 323f63d..6676edc 100644 --- a/tools/d2c/conv.c +++ b/tools/d2c/conv.c @@ -428,7 +428,7 @@ static bool compute_conv_expr_size(const conv_expr_t *expr, const coding_bits *b break; - case CET_COMPOSED: + case CET_COMPOSED: result = true; *size = 0; @@ -599,11 +599,22 @@ static bool ensure_conv_expr_content_fully_marked(conv_expr_t *expr, const codin { bool found; /* Bilan d'opération à renvoyer*/ raw_bitfield *field; /* Eventuel champ brut associé */ + conv_func *func; /* Eventuelle fonction liée */ + + found = find_var_by_name(bts, lst, name, &field, &func); - found = find_var_by_name(bts, lst, name, &field, NULL); + if (found) + { + if (field != NULL) + mark_raw_bitfield_as_used(field); + else /*if (func != NULL) */ + mark_conv_func(func, bts, lst); - if (found && field != NULL) - mark_raw_bitfield_as_used(field); + printf(" VAR '%s' found (bf=%d fc=%d)\n", name, !!field, !!func); + + + } + else printf(" VAR '%s' not found...\n", name); return found; @@ -663,6 +674,7 @@ static bool ensure_conv_expr_content_fully_declared(conv_expr_t *expr, int fd, c size_t i; /* Boucle de parcours */ /* Si l'expression a déjà été définie lors d'un précédent besoin... */ + printf(" sub declared ? %d -- type = %d\n", sub->declared, sub->type); if (sub->declared) return true; bool declare_by_name(int _f, const coding_bits *_bts, const conv_list *_lst, unsigned int _wide, const char *name) @@ -675,7 +687,9 @@ static bool ensure_conv_expr_content_fully_declared(conv_expr_t *expr, int fd, c if (found && func != NULL) { dprintf(_f, "\t\tuint%u_t val_%s;\n", _wide, name); + printf("========= DECLARE for '%s'\n", name); found = declare_conv_func(func, _f, _bts, _lst, _wide); + printf("========= END DECLARE for '%s'\n", name); } return found; @@ -848,7 +862,7 @@ static bool define_conv_expr(conv_expr_t *expr, int fd, const coding_bits *bits, dprintf(fd, "%lu", expr->number); break; - case CET_COMPOSED: + case CET_COMPOSED: result = compute_conv_expr_size(expr, bits, list, &max_size); @@ -1360,6 +1374,7 @@ bool declare_conv_func(conv_func *func, int fd, const coding_bits *bits, const c bool result; /* Bilan à remonter */ /* Si la fonction a déjà été définie lors d'un précédent besoin... */ + printf(" func declared ? %d\n", func->declared); if (func->declared) return true; if (func->is_expr) diff --git a/tools/d2c/rules.c b/tools/d2c/rules.c index a868864..73ec965 100644 --- a/tools/d2c/rules.c +++ b/tools/d2c/rules.c @@ -368,10 +368,12 @@ void register_conditional_rule(decoding_rules *rules, cond_expr *expr, CondActio /****************************************************************************** * * -* Paramètres : rules = ensemble de règles à consulter. * -* fd = descripteur d'un flux ouvert en écriture. * -* bits = gestionnaire des bits d'encodage. * -* exit = exprime le besoin d'une voie de sortie. [OUT] * +* Paramètres : rules = ensemble de règles à consulter. * +* 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. * +* bits = gestionnaire des bits d'encodage. * +* exit = exprime le besoin d'une voie de sortie. [OUT] * * * * Description : Traduit en code les éventuelles règles présentes. * * * @@ -381,7 +383,7 @@ void register_conditional_rule(decoding_rules *rules, cond_expr *expr, CondActio * * ******************************************************************************/ -bool write_decoding_rules(decoding_rules *rules, int fd, const coding_bits *bits, bool *exit) +bool write_decoding_rules(decoding_rules *rules, int fd, const char *arch, const char *subarch, const coding_bits *bits, bool *exit) { bool result; /* Bilan à remonter */ const extra_rule *rule; /* Règle en cours d'écriture */ @@ -414,7 +416,7 @@ bool write_decoding_rules(decoding_rules *rules, int fd, const coding_bits *bits goto wcsr_exit; } - dprintf(fd, "\t\t\tinstr = armv7_read_instr_%s", rule->details); + dprintf(fd, "\t\t\tinstr = %s_read_%sinstr_%s", arch, subarch, rule->details); /* TODO : adapter les paramètres d'appel selon le 'coder' */ dprintf(fd, "(_raw);\n"); diff --git a/tools/d2c/rules.h b/tools/d2c/rules.h index 8530d76..af2cac5 100644 --- a/tools/d2c/rules.h +++ b/tools/d2c/rules.h @@ -85,7 +85,7 @@ void delete_decoding_rules(decoding_rules *); void register_conditional_rule(decoding_rules *, cond_expr *, CondActionType, const char *); /* Traduit en code les éventuelles règles présentes. */ -bool write_decoding_rules(decoding_rules *, int, const coding_bits *, bool *); +bool write_decoding_rules(decoding_rules *, int, const char *, const char *, const coding_bits *, bool *); diff --git a/tools/d2c/spec.c b/tools/d2c/spec.c index 675fd05..867df37 100644 --- a/tools/d2c/spec.c +++ b/tools/d2c/spec.c @@ -246,6 +246,7 @@ decoding_rules *get_rules_in_encoding_spec(const encoding_spec *spec) * 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. * * details = particularités de l'instruction. * * keyword = nom clef de l'instruction utilisable dans du code. * @@ -260,7 +261,7 @@ decoding_rules *get_rules_in_encoding_spec(const encoding_spec *spec) * * ******************************************************************************/ -bool write_encoding_spec_disass(const encoding_spec *spec, int fd, const char *arch, const char *ins, const char *details, unsigned int wide, const pre_processor *pp) +bool write_encoding_spec_disass(const encoding_spec *spec, int fd, const char *arch, const char *subarch, const char *ins, const char *details, unsigned int wide, const pre_processor *pp) { bool result; /* Bilan à retourner */ char *keyword; /* Mot clef appelable en code */ @@ -301,7 +302,7 @@ bool write_encoding_spec_disass(const encoding_spec *spec, int fd, const char *a /* Inclusion des éventuelles règles */ - result &= write_decoding_rules(spec->rules, fd, spec->bits, &exit); + result &= write_decoding_rules(spec->rules, fd, arch, subarch, spec->bits, &exit); /* Création de l'instruction en elle-même */ diff --git a/tools/d2c/spec.h b/tools/d2c/spec.h index 46d922b..561fc32 100644 --- a/tools/d2c/spec.h +++ b/tools/d2c/spec.h @@ -65,7 +65,7 @@ conv_list *get_conversions_in_encoding_spec(const encoding_spec *); decoding_rules *get_rules_in_encoding_spec(const encoding_spec *); /* Traduit en code une sous-fonction de désassemblage. */ -bool write_encoding_spec_disass(const encoding_spec *, int, const char *, const char *, const char *, unsigned int, const pre_processor *); +bool write_encoding_spec_disass(const encoding_spec *, int, const char *, const char *, const char *, const char *, unsigned int, const pre_processor *); |