summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/instruction.c77
-rw-r--r--src/arch/instruction.h9
2 files changed, 80 insertions, 6 deletions
diff --git a/src/arch/instruction.c b/src/arch/instruction.c
index 8e9d3d3..5880c34 100644
--- a/src/arch/instruction.c
+++ b/src/arch/instruction.c
@@ -288,20 +288,21 @@ bool g_arch_instruction_set_flag(GArchInstruction *instr, ArchInstrFlag flag)
/******************************************************************************
* *
* Paramètres : instr = instruction quelconque à consulter. *
+* flag = drapeau d'information à rechercher. *
* *
-* Description : Fournit l'identifiant unique pour un ensemble d'instructions.*
+* Description : Détermine si une instruction possède un fanion particulier. *
* *
-* Retour : Identifiant unique par type d'instruction et architecture. *
+* Retour : Bilan de la détection. *
* *
* Remarques : - *
* *
******************************************************************************/
-itid_t g_arch_instruction_get_unique_id(const GArchInstruction *instr)
+bool g_arch_instruction_has_flag(const GArchInstruction *instr, ArchInstrFlag flag)
{
- itid_t result; /* Numéro à retourner */
+ bool result; /* Bilan à retourner */
- result = instr->uid;
+ result = (instr->flags & flag);
return result;
@@ -329,6 +330,29 @@ ArchInstrFlag g_arch_instruction_get_flags(const GArchInstruction *instr)
/******************************************************************************
* *
+* Paramètres : instr = instruction quelconque à consulter. *
+* *
+* Description : Fournit l'identifiant unique pour un ensemble d'instructions.*
+* *
+* Retour : Identifiant unique par type d'instruction et architecture. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+itid_t g_arch_instruction_get_unique_id(const GArchInstruction *instr)
+{
+ itid_t result; /* Numéro à retourner */
+
+ result = instr->uid;
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : instr = instruction quelconque à traiter. *
* type = type de procédure à utiliser. *
* proc = représentation de l'architecture utilisée. *
@@ -714,6 +738,49 @@ void g_arch_instruction_lock_unlock_links(GArchInstruction *instr, bool src, boo
/******************************************************************************
* *
* Paramètres : instr = instruction dont les informations sont à consulter. *
+* type = type de lien à détecter. *
+* *
+* Description : Détermine si un type de lien existe dans une instruction. *
+* *
+* Retour : Bilan du statut courant de l'instruction. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_arch_instruction_has_link(GArchInstruction *instr, InstructionLinkType type)
+{
+ bool result; /* Bilan à retourner */
+ size_t count; /* Nombre de liens à parcourir */
+ size_t i; /* Boucle de parcours */
+ const instr_link_t *dlink; /* Définition de destination */
+
+ result = false;
+
+ g_arch_instruction_lock_dest(instr);
+
+ count = g_arch_instruction_count_destinations(instr);
+
+ for (i = 0; i < count && !result; i++)
+ {
+ dlink = g_arch_instruction_get_destination(instr, i);
+
+ result = (dlink->type == type);
+
+ unref_instr_link(dlink);
+
+ }
+
+ g_arch_instruction_unlock_dest(instr);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : instr = instruction dont les informations sont à consulter. *
* dest = ligne visée par la liaison (côté destination). *
* *
* Description : Détermine si un lien est déjà établi entre deux instructions.*
diff --git a/src/arch/instruction.h b/src/arch/instruction.h
index cf9189b..d1bfbe2 100644
--- a/src/arch/instruction.h
+++ b/src/arch/instruction.h
@@ -58,7 +58,8 @@ typedef enum _ArchInstrFlag
{
AIF_NONE = (0 << 0), /* Aucune information */
AIF_ROUTINE_START = (1 << 0), /* Début de routine */
- AIF_RETURN_POINT = (1 << 1) /* Retour de fonction appelée */
+ AIF_RETURN_POINT = (1 << 1), /* Retour de fonction appelée */
+ AIF_CALL = (1 << 2) /* Instruction d'appel */
} ArchInstrFlag;
@@ -86,6 +87,9 @@ const char *g_arch_instruction_get_encoding(const GArchInstruction *);
/* Ajoute une information complémentaire à une instruction. */
bool g_arch_instruction_set_flag(GArchInstruction *, ArchInstrFlag);
+/* Détermine si une instruction possède un fanion particulier. */
+bool g_arch_instruction_has_flag(const GArchInstruction *, ArchInstrFlag);
+
/* Fournit les informations complémentaires d'une instruction. */
ArchInstrFlag g_arch_instruction_get_flags(const GArchInstruction *);
@@ -228,6 +232,9 @@ typedef struct _instr_link_t
/* Met à disposition un encadrement des accès aux liens. */
void g_arch_instruction_lock_unlock_links(GArchInstruction *, bool, bool);
+/* Détermine si un type de lien existe dans une instruction. */
+bool g_arch_instruction_has_link(GArchInstruction *, InstructionLinkType);
+
/* Détermine si un lien est déjà établi entre deux instructions. */
bool g_arch_instruction_has_link_to(GArchInstruction *, const GArchInstruction *);