summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-12-03 22:41:29 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-12-03 22:41:29 (GMT)
commit172fce9bab61de1ffa89f731b5d10f96e209afc1 (patch)
tree31aee5a141979fa99bbf88cbf2b7990de0ec3832 /tools
parentf7ef27195f8c9dc35e5e210a333b74fcfae5ad71 (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')
-rw-r--r--tools/d2c/coder.c20
-rw-r--r--tools/d2c/conv.c25
-rw-r--r--tools/d2c/rules.c14
-rw-r--r--tools/d2c/rules.h2
-rw-r--r--tools/d2c/spec.c5
-rw-r--r--tools/d2c/spec.h2
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 *);