summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/arm/v7/post.c8
-rw-r--r--src/arch/raw.c132
-rw-r--r--src/arch/raw.h6
3 files changed, 140 insertions, 6 deletions
diff --git a/src/arch/arm/v7/post.c b/src/arch/arm/v7/post.c
index 084fc84..c7b0f64 100644
--- a/src/arch/arm/v7/post.c
+++ b/src/arch/arm/v7/post.c
@@ -51,7 +51,7 @@ void post_process_branch_instructions(GArchInstruction *instr, GProcContext *con
uint32_t addr; /* Adresse visée par le saut */
GArchOperand *new; /* Instruction de ciblage */
vmpa2t target;
- mrange_t trange;
+ mrange_t trange; /* Etendue du symbole à créer */
VMPA_BUFFER(loc);
char name[5 + VMPA_MAX_LEN];
GBinRoutine *routine; /* Nouvelle routine trouvée */
@@ -114,7 +114,7 @@ void post_process_branch_and_link_instructions(GArchInstruction *instr, GProcCon
uint32_t addr; /* Adresse visée par le saut */
GArchOperand *new; /* Instruction de ciblage */
vmpa2t target;
- mrange_t trange;
+ mrange_t trange; /* Etendue du symbole à créer */
VMPA_BUFFER(loc);
char name[5 + VMPA_MAX_LEN];
GBinRoutine *routine; /* Nouvelle routine trouvée */
@@ -177,7 +177,7 @@ void post_process_comp_and_branch_instructions(GArchInstruction *instr, GProcCon
uint32_t addr; /* Adresse visée par le saut */
GArchOperand *new; /* Instruction de ciblage */
vmpa2t target;
- mrange_t trange;
+ mrange_t trange; /* Etendue du symbole à créer */
VMPA_BUFFER(loc);
char name[5 + VMPA_MAX_LEN];
GBinRoutine *routine; /* Nouvelle routine trouvée */
@@ -240,7 +240,7 @@ void post_process_ldr_instructions(GArchInstruction *instr, GProcContext *contex
uint32_t addr; /* Adresse visée par le saut */
GArchOperand *new; /* Instruction de ciblage */
vmpa2t target;
- mrange_t trange;
+ mrange_t trange; /* Etendue du symbole à créer */
VMPA_BUFFER(loc);
char name[5 + VMPA_MAX_LEN];
GBinRoutine *routine; /* Nouvelle routine trouvée */
diff --git a/src/arch/raw.c b/src/arch/raw.c
index 808d973..3338613 100644
--- a/src/arch/raw.c
+++ b/src/arch/raw.c
@@ -24,6 +24,8 @@
#include "raw.h"
+#include <assert.h>
+#include <ctype.h>
#include <string.h>
@@ -41,6 +43,7 @@ struct _GRawInstruction
GArchInstruction parent; /* A laisser en premier */
bool is_padding; /* Bourrage à représenter ? */
+ bool is_string; /* Chaîne de caractères ? */
};
@@ -370,16 +373,24 @@ static GBufferLine *g_raw_instruction_print(const GRawInstruction *instr, GCodeB
GArchInstruction *base; /* Autre version de l'instance */
const char *key; /* Mot clef principal */
size_t klen; /* Taille de ce mot clef */
+ char *string; /* Chaîne reconstituée */
+ size_t iter; /* Tête d'écriture */
+ bool first; /* Mémorise une énumération */
+ size_t i; /* Boucle de parcours */
+ char byte; /* Octet à afficher (ou pas) */
+ bool status; /* Bilan d'une récupération */
base = G_ARCH_INSTRUCTION(instr);
- if (!instr->is_padding)
+ if (!instr->is_padding && !instr->is_string)
result = G_ARCH_INSTRUCTION_CLASS(g_raw_instruction_parent_class)->print(base, buffer, msize, content, syntax);
else
{
result = g_code_buffer_append_new_line(buffer, &base->range);
+ g_buffer_line_add_flag(result, BLF_HAS_CODE);
+
g_buffer_line_fill_for_instr(result, msize/* TODO ! */, msize, content, base->length, true);
/* Instruction proprement dite */
@@ -389,7 +400,84 @@ static GBufferLine *g_raw_instruction_print(const GRawInstruction *instr, GCodeB
g_buffer_line_insert_text(result, BLC_ASSEMBLY_HEAD, key, klen, RTT_INSTRUCTION);
- g_buffer_line_insert_text(result, BLC_ASSEMBLY, "...", 3, RTT_RAW);
+ if (instr->is_padding)
+ g_buffer_line_insert_text(result, BLC_ASSEMBLY, "...", 3, RTT_RAW);
+
+ else /*if (instr->is_string)*/
+ {
+ string = (char *)calloc(base->operands_count + 3, sizeof(char));
+
+ strcpy(string, "\"");
+ iter = 1;
+
+ first = true;
+
+ for (i = 0; i < base->operands_count; i++)
+ {
+ status = g_imm_operand_get_value(G_IMM_OPERAND(base->operands[i]), MDS_8_BITS, &byte);
+ assert(status);
+
+ /* Si le caractère doit apparaître en hexadécimal... */
+ if (!isprint(byte))
+ {
+ /* Si une chaîne précède */
+ if (iter > 1)
+ {
+ if (!first)
+ {
+ g_buffer_line_insert_text(result, BLC_ASSEMBLY, ",", 1, RTT_PUNCT);
+ g_buffer_line_insert_text(result, BLC_ASSEMBLY, " ", 1, RTT_RAW);
+ }
+ else
+ first = false;
+
+ string[iter++] = '"';
+
+ g_buffer_line_insert_text(result, BLC_ASSEMBLY, string, iter, RTT_STRING);
+
+ iter = 1;
+
+ }
+
+ /* Impression de l'octet */
+
+ if (!first)
+ {
+ g_buffer_line_insert_text(result, BLC_ASSEMBLY, ",", 1, RTT_PUNCT);
+ g_buffer_line_insert_text(result, BLC_ASSEMBLY, " ", 1, RTT_RAW);
+ }
+ else
+ first = false;
+
+ g_arch_operand_print(base->operands[i], result, syntax);
+
+ }
+
+ else
+ string[iter++] = byte;
+
+ }
+
+ /* Si une chaîne reste encore */
+ if (iter > 1)
+ {
+ if (!first)
+ {
+ g_buffer_line_insert_text(result, BLC_ASSEMBLY, ",", 1, RTT_PUNCT);
+ g_buffer_line_insert_text(result, BLC_ASSEMBLY, " ", 1, RTT_RAW);
+ }
+ else
+ first = false;
+
+ string[iter++] = '"';
+
+ g_buffer_line_insert_text(result, BLC_ASSEMBLY, string, iter, RTT_STRING);
+
+ }
+
+ free(string);
+
+ }
}
@@ -465,3 +553,43 @@ bool g_raw_instruction_is_padding(const GRawInstruction *instr)
return instr->is_padding;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : instr = instruction à traiter. *
+* is_string = nouveau statut à associer au contenu. *
+* *
+* Description : Marque l'instruction comme contenant une chaîne de texte. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_raw_instruction_mark_as_string(GRawInstruction *instr, bool is_string)
+{
+ instr->is_string = is_string;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : instr = instruction à traiter. *
+* is_string = nouveau statut à associer au contenu. *
+* *
+* Description : Indique si le contenu de l'instruction est un texte. *
+* *
+* Retour : Statut du contenu de l'instruction. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_raw_instruction_is_string(const GRawInstruction *instr)
+{
+ return instr->is_string;
+
+}
diff --git a/src/arch/raw.h b/src/arch/raw.h
index f7e1715..6712b81 100644
--- a/src/arch/raw.h
+++ b/src/arch/raw.h
@@ -67,6 +67,12 @@ void g_raw_instruction_mark_as_padding(GRawInstruction *, bool);
/* Indique si le contenu de l'instruction est du bourrage. */
bool g_raw_instruction_is_padding(const GRawInstruction *);
+/* Marque l'instruction comme contenant une chaîne de texte. */
+void g_raw_instruction_mark_as_string(GRawInstruction *, bool);
+
+/* Indique si le contenu de l'instruction est un texte. */
+bool g_raw_instruction_is_string(const GRawInstruction *);
+
#endif /* _ARCH_RAW_H */