diff options
Diffstat (limited to 'src/arch')
| -rw-r--r-- | src/arch/instruction.c | 62 | ||||
| -rw-r--r-- | src/arch/instruction.h | 3 | 
2 files changed, 65 insertions, 0 deletions
diff --git a/src/arch/instruction.c b/src/arch/instruction.c index 08256d1..475c038 100644 --- a/src/arch/instruction.c +++ b/src/arch/instruction.c @@ -624,6 +624,68 @@ void g_arch_instruction_link_with(GArchInstruction *instr, GArchInstruction *des  /******************************************************************************  *                                                                             *  *  Paramètres  : instr = instruction dont les informations sont à consulter.  * +*                dest  = ligne visée par la liaison (côté destination).       * +*                old   = ancien type de lien construit.                       * +*                new   = nouveau type de lien à construire.                   * +*                                                                             * +*  Description : Change la nature d'un lien entre deux instructions.          * +*                                                                             * +*  Retour      : true pour une mise à jour réussie, false sinon.              * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +void g_arch_instruction_change_link(GArchInstruction *instr, GArchInstruction *dest, InstructionLinkType old, InstructionLinkType new) +{ +    size_t count;                           /* Raccourci pour la lecture   */ +    size_t i;                               /* Boucle de parcours          */ +    size_t from_idx;                        /* Indice côté destination     */ +    size_t to_idx;                          /* Indice côté source          */ + +    /* Côté destination */ + +    count = dest->from_count; + +    for (i = 0; i < count; i++) +        if (dest->from[i] == instr && dest->from_types[i] == old) +            break; + +    if (i == count) +        return false; +    else +        from_idx = i; + +    /* Côté point de départ */ + +    count = instr->to_count; + +    for (i = 0; i < count; i++) +        if (instr->to[i] == dest && instr->to_types[i] == old) +            break; + +    if (i == count) +        return false; +    else +        to_idx = i; + +    /* Si les deux extrémités sont raccord... */ + +    dest->from_types[from_idx] = new; + +    instr->to_types[to_idx] = new; + +    return true; + + +    /* TODO : si les informations complémentaires restent en place, compléter ! */ + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : instr = instruction dont les informations sont à consulter.  *  *                                                                             *  *  Description : Indique si l'instruction a une ou plusieurs origines.        *  *                                                                             * diff --git a/src/arch/instruction.h b/src/arch/instruction.h index 0198bb5..9123b6f 100644 --- a/src/arch/instruction.h +++ b/src/arch/instruction.h @@ -188,6 +188,9 @@ bool g_arch_instruction_is_return(const GArchInstruction *instr);  /* Etablit un lien entre deux instructions. */  void g_arch_instruction_link_with(GArchInstruction *, GArchInstruction *, InstructionLinkType, ...); +/* Change la nature d'un lien entre deux instructions. */ +void g_arch_instruction_change_link(GArchInstruction *, GArchInstruction *, InstructionLinkType, InstructionLinkType); +  /* Indique si l'instruction a une ou plusieurs origines. */  bool g_arch_instruction_has_sources(const GArchInstruction *);  | 
