summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-12-04 22:59:30 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-12-04 22:59:30 (GMT)
commit12154652c576144405011b5bd267c15c9667f223 (patch)
treebe552b2b7bc563a58892e8950afd920a45132a6e /src
parent6803c5d5b86416d1748d4d37a5cc5cb44fe007b1 (diff)
Provided a new way to build the full name of each instruction and cached it.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@435 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src')
-rw-r--r--src/arch/arm/instruction.c23
-rw-r--r--src/arch/arm/v7/opdefs/mov_A88102.d2
-rw-r--r--src/arch/artificial.c15
-rw-r--r--src/arch/dalvik/instruction.c15
-rw-r--r--src/arch/instruction-int.h9
-rw-r--r--src/arch/instruction.c25
-rw-r--r--src/arch/instruction.h3
-rw-r--r--src/arch/raw.c15
8 files changed, 78 insertions, 29 deletions
diff --git a/src/arch/arm/instruction.c b/src/arch/arm/instruction.c
index b46cab0..6ce115c 100644
--- a/src/arch/arm/instruction.c
+++ b/src/arch/arm/instruction.c
@@ -24,7 +24,11 @@
#include "instruction.h"
+#include <string.h>
+
+
#include "instruction-int.h"
+#include "../../common/extstr.h"
@@ -40,8 +44,8 @@ static void g_arm_instruction_dispose(GArmInstruction *);
/* Procède à la libération totale de la mémoire. */
static void g_arm_instruction_finalize(GArmInstruction *);
-/* Fournit le nom humain de l'instruction manipulée. */
-static const char *g_arm_instruction_get_keyword(const GArmInstruction *, AsmSyntax);
+/* Reconstruit le cache complet d'une désignation d'instruction. */
+static void g_arm_instruction_build_keyword(const GArmInstruction *, AsmSyntax);
@@ -72,7 +76,7 @@ static void g_arm_instruction_class_init(GArmInstructionClass *klass)
object_class->dispose = (GObjectFinalizeFunc/* ! */)g_arm_instruction_dispose;
object_class->finalize = (GObjectFinalizeFunc)g_arm_instruction_finalize;
- instr->get_key = (get_instruction_keyword_fc)g_arm_instruction_get_keyword;
+ instr->build_key = (build_instruction_keyword_fc)g_arm_instruction_build_keyword;
}
@@ -138,7 +142,7 @@ static void g_arm_instruction_finalize(GArmInstruction *instr)
* Paramètres : instr = instruction à traiter. *
* syntax = type de représentation demandée. *
* *
-* Description : Fournit le nom humain de l'instruction manipulée. *
+* Description : Reconstruit le cache complet d'une désignation d'instruction.*
* *
* Retour : Mot clef de bas niveau. *
* *
@@ -146,9 +150,16 @@ static void g_arm_instruction_finalize(GArmInstruction *instr)
* *
******************************************************************************/
-static const char *g_arm_instruction_get_keyword(const GArmInstruction *instr, AsmSyntax syntax)
+static void g_arm_instruction_build_keyword(const GArmInstruction *instr, AsmSyntax syntax)
{
- return instr->keyword;
+ GArchInstruction *base; /* Instruction, vue générique */
+
+ base = G_ARCH_INSTRUCTION(instr);
+
+ base->cached_keyword = strdup(instr->keyword);
+
+ if (base->suffix != NULL)
+ base->cached_keyword = stradd(base->cached_keyword, base->suffix);
}
diff --git a/src/arch/arm/v7/opdefs/mov_A88102.d b/src/arch/arm/v7/opdefs/mov_A88102.d
index dcafc73..a71969f 100644
--- a/src/arch/arm/v7/opdefs/mov_A88102.d
+++ b/src/arch/arm/v7/opdefs/mov_A88102.d
@@ -42,7 +42,7 @@
@word 1 1 1 1 0 i(1) 0 0 0 1 0 S(1) 1 1 1 1 0 imm3(3) Rd(4) imm8(8)
- @syntax {S} <Rd> <const>
+ @syntax {S} ".W" <Rd> <const>
@conv {
diff --git a/src/arch/artificial.c b/src/arch/artificial.c
index 4131e5f..9b84226 100644
--- a/src/arch/artificial.c
+++ b/src/arch/artificial.c
@@ -24,6 +24,9 @@
#include "artificial.h"
+#include <string.h>
+
+
#include "immediate.h"
#include "instruction-int.h"
@@ -63,8 +66,8 @@ static void g_db_instruction_dispose(GDbInstruction *);
/* Procède à la libération totale de la mémoire. */
static void g_db_instruction_finalize(GDbInstruction *);
-/* Fournit le nom humain de l'instruction manipulée. */
-static const char *g_db_instruction_get_keyword(const GDbInstruction *, AsmSyntax);
+/* Reconstruit le cache complet d'une désignation d'instruction. */
+static void g_db_instruction_build_keyword(const GDbInstruction *, AsmSyntax);
/* Informe sur une éventuelle référence à une autre instruction. */
static InstructionLinkType g_db_instruction_get_link(const GDbInstruction *, vmpa_t *);
@@ -107,7 +110,7 @@ static void g_db_instruction_class_init(GDbInstructionClass *klass)
instr = G_ARCH_INSTRUCTION_CLASS(klass);
- instr->get_key = (get_instruction_keyword_fc)g_db_instruction_get_keyword;
+ instr->build_key = (build_instruction_keyword_fc)g_db_instruction_build_keyword;
}
@@ -233,7 +236,7 @@ GArchInstruction *g_db_instruction_new_from_data(const bin_t *data, vmpa2t *addr
* format = format du binaire manipulé. *
* syntax = type de représentation demandée. *
* *
-* Description : Fournit le nom humain de l'instruction manipulée. *
+* Description : Reconstruit le cache complet d'une désignation d'instruction.*
* *
* Retour : Mot clef de bas niveau. *
* *
@@ -241,9 +244,9 @@ GArchInstruction *g_db_instruction_new_from_data(const bin_t *data, vmpa2t *addr
* *
******************************************************************************/
-static const char *g_db_instruction_get_keyword(const GDbInstruction *instr, AsmSyntax syntax)
+static void g_db_instruction_build_keyword(const GDbInstruction *instr, AsmSyntax syntax)
{
- return "db";
+ G_ARCH_INSTRUCTION(instr)->cached_keyword = strdup("db");
}
diff --git a/src/arch/dalvik/instruction.c b/src/arch/dalvik/instruction.c
index e02619c..98e29dd 100644
--- a/src/arch/dalvik/instruction.c
+++ b/src/arch/dalvik/instruction.c
@@ -24,6 +24,9 @@
#include "instruction.h"
+#include <string.h>
+
+
#include "instruction-int.h"
#include "decomp/translate.h"
#include "operands/register.h"
@@ -327,8 +330,8 @@ static dalvik_instruction _instructions[DOP_COUNT] = {
};
-/* Fournit le nom humain de l'instruction manipulée. */
-static const char *dalvik_get_instruction_keyword(const GDalvikInstruction *, AsmSyntax);
+/* Reconstruit le cache complet d'une désignation d'instruction. */
+static void dalvik_build_instruction_keyword(const GDalvikInstruction *, AsmSyntax);
/* Informe sur une éventuelle référence à une autre instruction. */
static InstructionLinkType dalvik_get_instruction_link(const GDalvikInstruction *, vmpa_t *);
@@ -370,7 +373,7 @@ static void g_dalvik_instruction_class_init(GDalvikInstructionClass *klass)
instr = G_ARCH_INSTRUCTION_CLASS(klass);
- instr->get_key = (get_instruction_keyword_fc)dalvik_get_instruction_keyword;
+ instr->build_key = (build_instruction_keyword_fc)dalvik_build_instruction_keyword;
}
@@ -573,7 +576,7 @@ DalvikOpcodes dalvik_guess_next_instruction(const bin_t *data, off_t pos, off_t
* Paramètres : instr = instruction à traiter. *
* syntax = type de représentation demandée. *
* *
-* Description : Fournit le nom humain de l'instruction manipulée. *
+* Description : Reconstruit le cache complet d'une désignation d'instruction.*
* *
* Retour : Mot clef de bas niveau. *
* *
@@ -581,9 +584,9 @@ DalvikOpcodes dalvik_guess_next_instruction(const bin_t *data, off_t pos, off_t
* *
******************************************************************************/
-static const char *dalvik_get_instruction_keyword(const GDalvikInstruction *instr, AsmSyntax syntax)
+static void dalvik_build_instruction_keyword(const GDalvikInstruction *instr, AsmSyntax syntax)
{
- return _instructions[instr->type].keyword;
+ G_ARCH_INSTRUCTION(instr)->cached_keyword = strdup(_instructions[instr->type].keyword);
}
diff --git a/src/arch/instruction-int.h b/src/arch/instruction-int.h
index 958a5bd..f96753a 100644
--- a/src/arch/instruction-int.h
+++ b/src/arch/instruction-int.h
@@ -38,8 +38,8 @@ typedef void (* get_instruction_rw_regs_fc) (const GArchInstruction *, GArchRegi
/* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */
typedef GBufferLine * (* print_instruction_fc) (const GArchInstruction *, GCodeBuffer *, MemoryDataSize, const bin_t *, AsmSyntax);
-/* Traduit une instruction en version humainement lisible. */
-typedef const char * (* get_instruction_keyword_fc) (const GArchInstruction *, AsmSyntax);
+/* Reconstruit le cache complet d'une désignation d'instruction. */
+typedef void (* build_instruction_keyword_fc) (const GArchInstruction *, AsmSyntax);
/* Informe sur une éventuelle référence à une autre instruction. */
typedef InstructionLinkType (* get_instruction_link_fc) (const GArchInstruction *, vmpa_t *);
@@ -55,6 +55,9 @@ struct _GArchInstruction
DL_LIST_ITEM(flow); /* Maillon de liste chaînée */
+ const char *suffix; /* Complément au nom affiché */
+ char *cached_keyword; /* Désignation complète */
+
mrange_t range; /* Emplacement en mémoire */
/* ------- %< ----------- */
@@ -95,7 +98,7 @@ struct _GArchInstructionClass
GObjectClass parent; /* A laisser en premier */
print_instruction_fc print; /* Imprime l'ensemble */
- get_instruction_keyword_fc get_key; /* Texte humain équivalent */
+ build_instruction_keyword_fc build_key; /* Texte humain équivalent */
};
diff --git a/src/arch/instruction.c b/src/arch/instruction.c
index d91e110..c8640b4 100644
--- a/src/arch/instruction.c
+++ b/src/arch/instruction.c
@@ -147,6 +147,26 @@ static void g_arch_instruction_finalize(GArchInstruction *instr)
/******************************************************************************
* *
+* Paramètres : instr = instruction quelconque à modifier. *
+* suffix = chaîne de caractères fournie en complément. *
+* *
+* Description : Etend la désignation d'un nom d'instruction. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_arch_instruction_append_suffix(GArchInstruction *instr, const char *suffix)
+{
+ instr->suffix = suffix;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : instr = instruction quelconque à modifier. *
* address = adresse virtuelle et/ou position physique. *
* length = taille de l'instruction. *
@@ -662,7 +682,10 @@ size_t g_arch_instruction_compute_group_index(GArchInstruction **iter, GArchInst
const char *g_arch_instruction_get_keyword(const GArchInstruction *instr, AsmSyntax syntax)
{
- return G_ARCH_INSTRUCTION_GET_CLASS(instr)->get_key(instr, syntax);
+ if (instr->cached_keyword == NULL)
+ G_ARCH_INSTRUCTION_GET_CLASS(instr)->build_key(instr, syntax);
+
+ return instr->cached_keyword;
}
diff --git a/src/arch/instruction.h b/src/arch/instruction.h
index eadac8b..287e34f 100644
--- a/src/arch/instruction.h
+++ b/src/arch/instruction.h
@@ -56,6 +56,9 @@ typedef struct _GArchInstructionClass GArchInstructionClass;
/* Indique le type défini pour une instruction d'architecture. */
GType g_arch_instruction_get_type(void);
+/* Etend la désignation d'un nom d'instruction. */
+void g_arch_instruction_append_suffix(GArchInstruction *, const char *);
+
/* Définit la localisation d'une instruction. */
void g_arch_instruction_set_range(GArchInstruction *, const mrange_t *);
diff --git a/src/arch/raw.c b/src/arch/raw.c
index 164086a..9b13dac 100644
--- a/src/arch/raw.c
+++ b/src/arch/raw.c
@@ -24,6 +24,9 @@
#include "raw.h"
+#include <string.h>
+
+
#include "immediate.h"
#include "instruction-int.h"
@@ -64,8 +67,8 @@ static void g_raw_instruction_finalize(GRawInstruction *);
/* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */
static GBufferLine *g_raw_instruction_print(const GRawInstruction *, GCodeBuffer *, MemoryDataSize, const bin_t *, AsmSyntax);
-/* Fournit le nom humain de l'instruction manipulée. */
-static const char *g_raw_instruction_get_keyword(const GRawInstruction *, AsmSyntax);
+/* Reconstruit le cache complet d'une désignation d'instruction. */
+static void g_raw_instruction_build_keyword(const GRawInstruction *, AsmSyntax);
@@ -103,7 +106,7 @@ static void g_raw_instruction_class_init(GRawInstructionClass *klass)
instr = G_ARCH_INSTRUCTION_CLASS(klass);
instr->print = (print_instruction_fc)g_raw_instruction_print;
- instr->get_key = (get_instruction_keyword_fc)g_raw_instruction_get_keyword;
+ instr->build_key = (build_instruction_keyword_fc)g_raw_instruction_build_keyword;
}
@@ -275,7 +278,7 @@ static GBufferLine *g_raw_instruction_print(const GRawInstruction *instr, GCodeB
* format = format du binaire manipulé. *
* syntax = type de représentation demandée. *
* *
-* Description : Fournit le nom humain de l'instruction manipulée. *
+* Description : Reconstruit le cache complet d'une désignation d'instruction.*
* *
* Retour : Mot clef de bas niveau. *
* *
@@ -283,7 +286,7 @@ static GBufferLine *g_raw_instruction_print(const GRawInstruction *instr, GCodeB
* *
******************************************************************************/
-static const char *g_raw_instruction_get_keyword(const GRawInstruction *instr, AsmSyntax syntax)
+static void g_raw_instruction_build_keyword(const GRawInstruction *instr, AsmSyntax syntax)
{
GArchOperand *operand; /* Octet décodé à afficher */
MemoryDataSize size; /* Taille de valeur associée */
@@ -293,7 +296,7 @@ static const char *g_raw_instruction_get_keyword(const GRawInstruction *instr, A
operand = g_arch_instruction_get_operand(G_ARCH_INSTRUCTION(instr), 0);
size = g_imm_operand_get_size(G_IMM_OPERAND(operand));
- return defines[MDS_RANGE(size)];
+ G_ARCH_INSTRUCTION(instr)->cached_keyword = strdup(defines[MDS_RANGE(size)]);
}