diff options
28 files changed, 95 insertions, 105 deletions
@@ -1,3 +1,38 @@ +15-07-12 Cyrille Bagard <nocbos@gmail.com> + + * plugins/androhelpers/switch.c: + * plugins/libcsem/exit.c: + * plugins/ropgadgets/finder.c: + * src/analysis/disass/area.c: + * src/analysis/disass/links.c: + * src/analysis/disass/loop.c: + * src/analysis/disass/macro.c: + * src/arch/arm/v7/opdefs/b_A8818.d: + * src/arch/arm/v7/opdefs/bl_A8825.d: + * src/arch/arm/v7/opdefs/blx_A8826.d: + * src/arch/arm/v7/opdefs/bx_A8827.d: + * src/arch/arm/v7/opdefs/ldr_A8862.d: + * src/arch/arm/v7/opdefs/ldr_A8863.d: + * src/arch/arm/v7/opdefs/ldr_A8864.d: + * src/arch/arm/v7/opdefs/ldr_A8865.d: + * src/arch/arm/v7/opdefs/ldrb_A8867.d: + * src/arch/arm/v7/opdefs/ldrb_A8868.d: + * src/arch/arm/v7/opdefs/ldrb_A8870.d: + * src/arch/arm/v7/opdefs/Makefile.am: + * src/arch/arm/v7/opdefs/pop_A88131.d: + * src/arch/arm/v7/opdefs/pop_A88132.d: + * src/arch/arm/v7/opdefs/str_A88204.d: + * src/arch/arm/v7/opdefs/strb_A88207.d: + * src/arch/arm/v7/opdefs/strb_A88208.d: + Update code. + + * src/arch/instruction.c: + * src/arch/instruction.h: + Define AIF_RETURN_POINT to replace the previous 'return' accessors. + + * src/gtkext/gtkgraphview.c: + Update code. + 15-07-10 Cyrille Bagard <nocbos@gmail.com> * pixmaps/chrysalide.xcf: diff --git a/plugins/androhelpers/switch.c b/plugins/androhelpers/switch.c index 14a4562..f93c9e9 100644 --- a/plugins/androhelpers/switch.c +++ b/plugins/androhelpers/switch.c @@ -219,7 +219,7 @@ static void ensure_each_case_has_its_block(GArchInstruction *instr, GArchInstruc if (prev != NULL && !g_arch_instruction_has_destinations(prev) - && !g_arch_instruction_is_return(prev)) + && !(g_arch_instruction_get_flags(prev) & AIF_RETURN_POINT)) { g_arch_instruction_link_with(prev, instr, ILT_EXEC_FLOW, NULL); } diff --git a/plugins/libcsem/exit.c b/plugins/libcsem/exit.c index fbe0923..1bb4edd 100644 --- a/plugins/libcsem/exit.c +++ b/plugins/libcsem/exit.c @@ -74,7 +74,7 @@ static void mark_one_kind_of_exit_as_return(const GLoadedBinary *binary, const c { if (types[i] != ILT_CALL) continue; - g_arch_instruction_define_as_return(sources[i], true); + g_arch_instruction_set_flag(sources[i], AIF_RETURN_POINT); } diff --git a/plugins/ropgadgets/finder.c b/plugins/ropgadgets/finder.c index ff0c6ad..a71dfb3 100644 --- a/plugins/ropgadgets/finder.c +++ b/plugins/ropgadgets/finder.c @@ -166,7 +166,7 @@ static GArchInstruction *look_backward_for_gadgets(const search_domain *domain, /* S'il s'agit d'un point de retour, on laisse la main à une autre liste */ - if (g_arch_instruction_is_return(instr)) + if (g_arch_instruction_get_flags(instr) & AIF_RETURN_POINT) { g_object_unref(G_OBJECT(instr)); instr = NULL; @@ -258,7 +258,7 @@ static GArchInstruction **list_all_gadgets_in_domain(const search_domain *domain /* A-t-on bien affaire à une instruction de retour ? */ - if (!g_arch_instruction_is_return(gadget)) + if (!(g_arch_instruction_get_flags(gadget) & AIF_RETURN_POINT)) { g_object_unref(G_OBJECT(gadget)); continue; diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c index a0ad90e..94d659b 100644 --- a/src/analysis/disass/area.c +++ b/src/analysis/disass/area.c @@ -617,13 +617,13 @@ bool load_code_from_mem_area(mem_area **list, size_t *count, size_t *index, cons assert(!is_range_blank_in_mem_areas(*list, *count, &range)); - if (g_arch_instruction_is_return(instr)) + if (g_arch_instruction_get_flags(instr) & AIF_RETURN_POINT) printf("BREAK @ 0x%08x\n", (unsigned int)get_virt_addr(&prev)); //continue; /* Rupture du flot d'exécution ? */ - if (g_arch_instruction_is_return(instr)) + if (g_arch_instruction_get_flags(instr) & AIF_RETURN_POINT) break; } diff --git a/src/analysis/disass/links.c b/src/analysis/disass/links.c index 545afb1..43b7e6f 100644 --- a/src/analysis/disass/links.c +++ b/src/analysis/disass/links.c @@ -156,7 +156,7 @@ static void establish_natural_link(GArchInstruction *instr, GArchInstruction *pr * avec le voisin. */ - if (g_arch_instruction_is_return(prev)) + if (g_arch_instruction_get_flags(prev) & AIF_RETURN_POINT) return; if (g_arch_instruction_get_flags(instr) & AIF_ROUTINE_START) diff --git a/src/analysis/disass/loop.c b/src/analysis/disass/loop.c index 9a99bc4..88b997f 100644 --- a/src/analysis/disass/loop.c +++ b/src/analysis/disass/loop.c @@ -224,7 +224,7 @@ static void track_loops_in_code(const GArchProcessor *proc, const mrange_t *rang /* Fin de parcours ? */ - if (g_arch_instruction_is_return(iter)) + if (g_arch_instruction_get_flags(iter) & AIF_RETURN_POINT) break; /** diff --git a/src/analysis/disass/macro.c b/src/analysis/disass/macro.c index 4e77881..a9ae261 100644 --- a/src/analysis/disass/macro.c +++ b/src/analysis/disass/macro.c @@ -638,10 +638,10 @@ static void find_next_hops(GArchProcessor *proc, const vmpa2t *start, const code - if (g_arch_instruction_is_return(iter)) + if (g_arch_instruction_get_flags(iter) & AIF_RETURN_POINT) printf(" ++ return 0x%08x\n", (unsigned int)range->addr.virtual); - if (g_arch_instruction_is_return(iter)) + if (g_arch_instruction_get_flags(iter) & AIF_RETURN_POINT) { iter = NULL; break; @@ -1231,7 +1231,7 @@ static GInstrBlock *build_instruction_blocks(GArchProcessor *proc, code_coverage * L'expérience montre qu'il peut y avoir plusieurs fins dans une routine, * et donc des fins en milieu de couverture de cette même routine. */ - if (g_arch_instruction_is_return(iter)) break; + if (g_arch_instruction_get_flags(iter) & AIF_RETURN_POINT) break; /* On n'approfondit que les chemins qui se séparent */ if (!g_arch_instruction_has_destinations(iter)) diff --git a/src/arch/arm/v7/opdefs/Makefile.am b/src/arch/arm/v7/opdefs/Makefile.am index 6207906..5483f92 100644 --- a/src/arch/arm/v7/opdefs/Makefile.am +++ b/src/arch/arm/v7/opdefs/Makefile.am @@ -16,7 +16,6 @@ D2C_ENCODINGS = \ -e T=thumb_32_ D2C_MACROS = \ - -M DefineAsReturn=g_arch_instruction_define_as_return \ -M SetFlags=g_armv7_instruction_define_setflags \ -M Condition=g_arm_instruction_set_cond \ -M Register=translate_armv7_register \ diff --git a/src/arch/arm/v7/opdefs/b_A8818.d b/src/arch/arm/v7/opdefs/b_A8818.d index ab5971f..55b123e 100644 --- a/src/arch/arm/v7/opdefs/b_A8818.d +++ b/src/arch/arm/v7/opdefs/b_A8818.d @@ -48,7 +48,7 @@ //if cond == '1110' then UNDEFINED; //if cond == '1111' then SEE SVC; - //chk_call DefineAsReturn(1) + //chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -77,7 +77,7 @@ @rules { //if InITBlock() && !LastInITBlock() then UNPREDICTABLE; - //chk_call DefineAsReturn(1) + //chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -108,7 +108,7 @@ //if cond<3:1> == '111' then SEE "Related encodings"; //if InITBlock() then UNPREDICTABLE; - //chk_call DefineAsReturn(1) + //chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -139,7 +139,7 @@ @rules { //if InITBlock() && !LastInITBlock() then UNPREDICTABLE; - //chk_call DefineAsReturn(1) + //chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -168,7 +168,7 @@ @rules { - //chk_call DefineAsReturn(1) + //chk_call SetInsFlag(AIF_RETURN_POINT) } diff --git a/src/arch/arm/v7/opdefs/bl_A8825.d b/src/arch/arm/v7/opdefs/bl_A8825.d index 183ba36..a9b395a 100644 --- a/src/arch/arm/v7/opdefs/bl_A8825.d +++ b/src/arch/arm/v7/opdefs/bl_A8825.d @@ -47,7 +47,7 @@ @rules { - //chk_call DefineAsReturn(1) + //chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -77,7 +77,7 @@ @rules { - //chk_call DefineAsReturn(1) + //chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -105,7 +105,7 @@ @rules { - //chk_call DefineAsReturn(1) + //chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -133,7 +133,7 @@ @rules { - //chk_call DefineAsReturn(1) + //chk_call SetInsFlag(AIF_RETURN_POINT) } diff --git a/src/arch/arm/v7/opdefs/blx_A8826.d b/src/arch/arm/v7/opdefs/blx_A8826.d index c972af2..bc26867 100644 --- a/src/arch/arm/v7/opdefs/blx_A8826.d +++ b/src/arch/arm/v7/opdefs/blx_A8826.d @@ -39,7 +39,7 @@ //if m == 15 then UNPREDICTABLE; //if InITBlock() && !LastInITBlock() then UNPREDICTABLE; - //chk_call DefineAsReturn(1) + //chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -61,7 +61,7 @@ @rules { //if m == 15 then UNPREDICTABLE; - //chk_call DefineAsReturn(1) + //chk_call SetInsFlag(AIF_RETURN_POINT) } diff --git a/src/arch/arm/v7/opdefs/bx_A8827.d b/src/arch/arm/v7/opdefs/bx_A8827.d index f8027a4..75921ac 100644 --- a/src/arch/arm/v7/opdefs/bx_A8827.d +++ b/src/arch/arm/v7/opdefs/bx_A8827.d @@ -44,7 +44,7 @@ @rules { - chk_call DefineAsReturn(1) + chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -71,7 +71,7 @@ @rules { - chk_call DefineAsReturn(1) + chk_call SetInsFlag(AIF_RETURN_POINT) } diff --git a/src/arch/arm/v7/opdefs/ldr_A8862.d b/src/arch/arm/v7/opdefs/ldr_A8862.d index 49d5c3a..e2f9e3f 100644 --- a/src/arch/arm/v7/opdefs/ldr_A8862.d +++ b/src/arch/arm/v7/opdefs/ldr_A8862.d @@ -76,7 +76,7 @@ //if Rn == '1111' then SEE LDR (literal); //if t == 15 && InITBlock() && !LastInITBlock() then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -104,7 +104,7 @@ //if Rn == '1101' && P == '0' && U == '1' && W == '1' && imm8 == '00000100' then SEE POP; //if P == '0' && W == '0' then UNDEFINED; //if (wback && n == t) || (t == 15 && InITBlock() && !LastInITBlock()) then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -133,7 +133,7 @@ //if Rn == '1101' && P == '0' && U == '1' && W == '1' && imm8 == '00000100' then SEE POP; //if P == '0' && W == '0' then UNDEFINED; //if (wback && n == t) || (t == 15 && InITBlock() && !LastInITBlock()) then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } diff --git a/src/arch/arm/v7/opdefs/ldr_A8863.d b/src/arch/arm/v7/opdefs/ldr_A8863.d index 2360e3a..b2f7f84 100644 --- a/src/arch/arm/v7/opdefs/ldr_A8863.d +++ b/src/arch/arm/v7/opdefs/ldr_A8863.d @@ -46,7 +46,7 @@ //t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); //index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); //if wback && n == t then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -76,7 +76,7 @@ //t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); //index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); //if wback && n == t then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } diff --git a/src/arch/arm/v7/opdefs/ldr_A8864.d b/src/arch/arm/v7/opdefs/ldr_A8864.d index 4cf0048..bd7ed50 100644 --- a/src/arch/arm/v7/opdefs/ldr_A8864.d +++ b/src/arch/arm/v7/opdefs/ldr_A8864.d @@ -70,7 +70,7 @@ @rules { //if t == 15 && InITBlock() && !LastInITBlock() then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -101,7 +101,7 @@ @rules { //if t == 15 && InITBlock() && !LastInITBlock() then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } diff --git a/src/arch/arm/v7/opdefs/ldr_A8865.d b/src/arch/arm/v7/opdefs/ldr_A8865.d index e8d255b..b6a0126 100644 --- a/src/arch/arm/v7/opdefs/ldr_A8865.d +++ b/src/arch/arm/v7/opdefs/ldr_A8865.d @@ -67,7 +67,7 @@ //if Rn == '1111' then SEE LDR (literal); //if m IN {13,15} then UNPREDICTABLE; //if t == 15 && InITBlock() && !LastInITBlock() then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } diff --git a/src/arch/arm/v7/opdefs/ldrb_A8867.d b/src/arch/arm/v7/opdefs/ldrb_A8867.d index 2114330..c772b08 100644 --- a/src/arch/arm/v7/opdefs/ldrb_A8867.d +++ b/src/arch/arm/v7/opdefs/ldrb_A8867.d @@ -60,7 +60,7 @@ //if Rt == '1111' then SEE PLD; //if Rn == '1111' then SEE LDRB (literal); //if t == 13 then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -88,7 +88,7 @@ //if P == '1' && U == '1' && W == '0' then SEE LDRBT; //if P == '0' && W == '0' then UNDEFINED; //if t == 13 || (t == 15 && W == '1') || (wback && n == t) then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -117,7 +117,7 @@ //if P == '1' && U == '1' && W == '0' then SEE LDRBT; //if P == '0' && W == '0' then UNDEFINED; //if t == 13 || (t == 15 && W == '1') || (wback && n == t) then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } diff --git a/src/arch/arm/v7/opdefs/ldrb_A8868.d b/src/arch/arm/v7/opdefs/ldrb_A8868.d index fdf3049..579db06 100644 --- a/src/arch/arm/v7/opdefs/ldrb_A8868.d +++ b/src/arch/arm/v7/opdefs/ldrb_A8868.d @@ -45,7 +45,7 @@ //if P == '1' && U == '1' && W == '0' then SEE LDRBT; //if P == '0' && W == '0' then UNDEFINED; //if t == 13 || (t == 15 && W == '1') || (wback && n == t) then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -74,7 +74,7 @@ //if P == '1' && U == '1' && W == '0' then SEE LDRBT; //if P == '0' && W == '0' then UNDEFINED; //if t == 13 || (t == 15 && W == '1') || (wback && n == t) then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } diff --git a/src/arch/arm/v7/opdefs/ldrb_A8870.d b/src/arch/arm/v7/opdefs/ldrb_A8870.d index 868b1c9..2b6f2e9 100644 --- a/src/arch/arm/v7/opdefs/ldrb_A8870.d +++ b/src/arch/arm/v7/opdefs/ldrb_A8870.d @@ -65,7 +65,7 @@ //if Rn == '1111' then UNDEFINED; //if t IN {13,15} || m IN {13,15} then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -93,7 +93,7 @@ //if t == 15 || m == 15 then UNPREDICTABLE; //if wback && (n == 15 || n == t) then UNPREDICTABLE; //if ArchVersion() < 6 && wback && m == n then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -122,7 +122,7 @@ //if t == 15 || m == 15 then UNPREDICTABLE; //if wback && (n == 15 || n == t) then UNPREDICTABLE; //if ArchVersion() < 6 && wback && m == n then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } diff --git a/src/arch/arm/v7/opdefs/pop_A88131.d b/src/arch/arm/v7/opdefs/pop_A88131.d index a5e878f..47b9c2d 100644 --- a/src/arch/arm/v7/opdefs/pop_A88131.d +++ b/src/arch/arm/v7/opdefs/pop_A88131.d @@ -39,7 +39,7 @@ //if BitCount(registers) < 1 then UNPREDICTABLE; //if registers<15> == '1' && InITBlock() && !LastInITBlock() then UNPREDICTABLE; - if (P == '1') ; chk_call DefineAsReturn(1) + if (P == '1') ; chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -61,7 +61,7 @@ //if BitCount(registers) < 2 || (P == '1' && M == '1') then UNPREDICTABLE; //if registers<15> == '1' && InITBlock() && !LastInITBlock() then UNPREDICTABLE; - if (P == '1') ; chk_call DefineAsReturn(1) + if (P == '1') ; chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -83,7 +83,7 @@ @rules { //if t == 13 || (t == 15 && InITBlock() && !LastInITBlock()) then UNPREDICTABLE; - if (Rt == '1111') ; chk_call DefineAsReturn(1) + if (Rt == '1111') ; chk_call SetInsFlag(AIF_RETURN_POINT) } diff --git a/src/arch/arm/v7/opdefs/pop_A88132.d b/src/arch/arm/v7/opdefs/pop_A88132.d index 1762b45..10e18a4 100644 --- a/src/arch/arm/v7/opdefs/pop_A88132.d +++ b/src/arch/arm/v7/opdefs/pop_A88132.d @@ -40,7 +40,7 @@ //if BitCount(register_list) < 2 then SEE LDM / LDMIA / LDMFD; //if registers<13> == '1' && ArchVersion() >= 7 then UNPREDICTABLE; - if (register_list & 0x8000) ; chk_call DefineAsReturn(1) + if (register_list & 0x8000) ; chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -63,7 +63,7 @@ @rules { //if t == 13 then UNPREDICTABLE; - if (Rt == '1111') ; chk_call DefineAsReturn(1) + if (Rt == '1111') ; chk_call SetInsFlag(AIF_RETURN_POINT) } diff --git a/src/arch/arm/v7/opdefs/str_A88204.d b/src/arch/arm/v7/opdefs/str_A88204.d index 2712e1b..fb5879a 100644 --- a/src/arch/arm/v7/opdefs/str_A88204.d +++ b/src/arch/arm/v7/opdefs/str_A88204.d @@ -43,7 +43,7 @@ //if P == '0' && W == '1' then SEE STRT; //if Rn == '1101' && P == '1' && U == '0' && W == '1' && imm12 == '000000000100' then SEE PUSH; //if wback && (n == 15 || n == t) then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -70,7 +70,7 @@ //if P == '0' && W == '1' then SEE STRT; //if Rn == '1101' && P == '1' && U == '0' && W == '1' && imm12 == '000000000100' then SEE PUSH; //if wback && (n == 15 || n == t) then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } diff --git a/src/arch/arm/v7/opdefs/strb_A88207.d b/src/arch/arm/v7/opdefs/strb_A88207.d index b57dbf7..2af8fb7 100644 --- a/src/arch/arm/v7/opdefs/strb_A88207.d +++ b/src/arch/arm/v7/opdefs/strb_A88207.d @@ -45,7 +45,7 @@ //if P == '1' && U == '1' && W == '0' then SEE LDRBT; //if P == '0' && W == '0' then UNDEFINED; //if t == 13 || (t == 15 && W == '1') || (wback && n == t) then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -74,7 +74,7 @@ //if P == '1' && U == '1' && W == '0' then SEE LDRBT; //if P == '0' && W == '0' then UNDEFINED; //if t == 13 || (t == 15 && W == '1') || (wback && n == t) then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } diff --git a/src/arch/arm/v7/opdefs/strb_A88208.d b/src/arch/arm/v7/opdefs/strb_A88208.d index ab6c198..c94fe4d 100644 --- a/src/arch/arm/v7/opdefs/strb_A88208.d +++ b/src/arch/arm/v7/opdefs/strb_A88208.d @@ -65,7 +65,7 @@ //if Rn == '1111' then UNDEFINED; //if t IN {13,15} || m IN {13,15} then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -92,7 +92,7 @@ //if P == '0' && W == '1' then SEE STRT; //if Rn == '1101' && P == '1' && U == '0' && W == '1' && imm12 == '000000000100' then SEE PUSH; //if wback && (n == 15 || n == t) then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } @@ -120,7 +120,7 @@ //if P == '0' && W == '1' then SEE STRT; //if Rn == '1101' && P == '1' && U == '0' && W == '1' && imm12 == '000000000100' then SEE PUSH; //if wback && (n == 15 || n == t) then UNPREDICTABLE; - if (Rt == '1111'); chk_call DefineAsReturn(1) + if (Rt == '1111'); chk_call SetInsFlag(AIF_RETURN_POINT) } diff --git a/src/arch/instruction.c b/src/arch/instruction.c index 7391af1..b895af0 100644 --- a/src/arch/instruction.c +++ b/src/arch/instruction.c @@ -175,16 +175,18 @@ void g_arch_instruction_append_suffix(GArchInstruction *instr, const char *suffi * * * Description : Ajoute une information complémentaire à une instruction. * * * -* Retour : - * +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -void g_arch_instruction_set_flag(GArchInstruction *instr, ArchInstrFlag flag) +bool g_arch_instruction_set_flag(GArchInstruction *instr, ArchInstrFlag flag) { instr->flags |= flag; + return true; + } @@ -520,47 +522,6 @@ InstructionLinkType g_arch_instruction_get_link(const GArchInstruction *instr, v /****************************************************************************** * * -* Paramètres : instr = instruction à consulter. * -* status = statut de l'instruction vis à vis du flot. * -* * -* Description : Précise si l'instruction correspond à un retour de fonction. * -* * -* Retour : true (pour respecter le prototypage depuis les fichiers D). * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool g_arch_instruction_define_as_return(GArchInstruction *instr, bool status) -{ - instr->is_return = status; - - return true; - -} - - -/****************************************************************************** -* * -* Paramètres : instr = instruction à consulter. * -* * -* Description : Indique si l'instruction correspond à un retour de fonction. * -* * -* Retour : true si l'instruction est un 'return' quelconque ou false. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool g_arch_instruction_is_return(const GArchInstruction *instr) -{ - return instr->is_return; - -} - - -/****************************************************************************** -* * * Paramètres : instr = instruction dont les informations sont à consulter. * * dest = ligne visée par la liaison (côté destination). * * type = type de lien à construire. * diff --git a/src/arch/instruction.h b/src/arch/instruction.h index b570d92..a4ea1b5 100644 --- a/src/arch/instruction.h +++ b/src/arch/instruction.h @@ -66,12 +66,13 @@ void g_arch_instruction_append_suffix(GArchInstruction *, const char *); typedef enum _ArchInstrFlag { AIF_NONE = (0 << 0), /* Aucune information */ - AIF_ROUTINE_START = (1 << 0) /* Début de routine */ + AIF_ROUTINE_START = (1 << 0), /* Début de routine */ + AIF_RETURN_POINT = (1 << 1) /* Retour de fonction appelée */ } ArchInstrFlag; /* Ajoute une information complémentaire à une instruction. */ -void g_arch_instruction_set_flag(GArchInstruction *, ArchInstrFlag); +bool g_arch_instruction_set_flag(GArchInstruction *, ArchInstrFlag); /* Fournit les informations complémentaires d'une instruction. */ ArchInstrFlag g_arch_instruction_get_flags(const GArchInstruction *); @@ -179,12 +180,6 @@ typedef union _link_extra_info /* Informe sur une éventuelle référence à une autre instruction. */ InstructionLinkType g_arch_instruction_get_link(const GArchInstruction *, vmpa_t *); -/* Précise si l'instruction correspond à un retour de fonction. */ -bool g_arch_instruction_define_as_return(GArchInstruction *, bool); - -/* Indique si l'instruction correspond à un retour de fonction. */ -bool g_arch_instruction_is_return(const GArchInstruction *instr); - /* Etablit un lien entre deux instructions. */ void g_arch_instruction_link_with(GArchInstruction *, GArchInstruction *, InstructionLinkType, ...); diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c index ac78981..c10d9c1 100644 --- a/src/gtkext/gtkgraphview.c +++ b/src/gtkext/gtkgraphview.c @@ -762,7 +762,7 @@ static void gtk_graph_view_reach_caret_limit(GtkBufferView *node, GdkScrollDirec #ifndef NDEBUG if (ref != NULL) - is_return = g_arch_instruction_is_return(ref); + is_return = (g_arch_instruction_get_flags(ref) & AIF_RETURN_POINT); #endif if (ref != NULL) |