@@ -243,6 +243,14 @@ let disassemble_mips_sections () =
243243 STR " disassemble section:" ; NL ; h#toPretty; NL ; NL ] in
244244 let displacement =
245245 TR. tget_ok (h#get_addr#subtract_to_int startOfCode) in
246+ let _ =
247+ chlog#add
248+ " disassembly"
249+ (LBLOCK [
250+ STR " disassemble section: " ;
251+ h#toPretty;
252+ STR " with displacement: " ;
253+ INT displacement]) in
246254 let _ =
247255 pverbose [
248256 STR " disassemble section at displacement: " ;
@@ -582,23 +590,32 @@ let get_successors (faddr:doubleword_int) (iaddr:doubleword_int) =
582590 (get_mips_assembly_instruction iaddr)
583591
584592
585- let trace_block (faddr :doubleword_int ) (baddr :doubleword_int ) =
593+ let trace_block
594+ (faddr :doubleword_int )
595+ (baddr :doubleword_int ):
596+ (mips_assembly_block_int list * mips_assembly_block_int ) TR. traceresult =
586597
587598 let set_block_entry (va : doubleword_int ) =
588599 TR. titer
589600 ~ok: (fun instr -> instr#set_block_entry)
590601 ~error: (fun e -> log_error_result __FILE__ __LINE__ e)
591602 (get_mips_assembly_instruction va) in
592603
593- let get_instr iaddr = get_mips_assembly_instruction iaddr in
604+ let get_instr (iaddr : doubleword_int ): mips_assembly_instruction_result =
605+ get_mips_assembly_instruction iaddr in
594606
595607 let get_next_instr_addr a = a#add_int 4 in
596608
597609 let mk_ci_succ l =
598610 List. map
599611 (fun va -> (make_location {loc_faddr = faddr ; loc_iaddr = va})#ci) l in
600612
601- let rec find_last_instr (va : doubleword_int ) (prev : doubleword_int ) =
613+ let rec find_last_instr
614+ (va : doubleword_int )
615+ (prev : doubleword_int ):
616+ (ctxt_iaddress_t list option
617+ * doubleword_int
618+ * mips_assembly_block_int list ) TR. traceresult =
602619 let instr =
603620 fail_tvalue
604621 (trerror_record
@@ -610,24 +627,24 @@ let trace_block (faddr:doubleword_int) (baddr:doubleword_int) =
610627
611628 if va#equal wordzero
612629 || not (! mips_assembly_instructions#is_code_address va) then
613- (Some [] ,prev,[] )
630+ Ok (Some [] , prev, [] )
614631 else if is_return_instruction instr#get_opcode then
615- (Some [] ,va#add_int 4 ,[] )
632+ Ok (Some [] , va#add_int 4 , [] )
616633 else if instr#is_block_entry then
617- (None ,prev,[] )
634+ Ok (None , prev, [] )
618635 else if is_nr_call_instruction instr then
619- (Some [] ,va#add_int 4 ,[] )
636+ Ok (Some [] , va#add_int 4 , [] )
620637 else if is_conditional_jump_instruction instr#get_opcode
621638 || is_fp_conditional_jump_instruction instr#get_opcode then
622639 let nextblock = va#add_int 8 in
623640 let tgtblock = get_direct_jump_target_address instr#get_opcode in
624- (Some (mk_ci_succ [ nextblock ; tgtblock ]),va#add_int 4 ,[] )
641+ Ok (Some (mk_ci_succ [nextblock; tgtblock]), va#add_int 4 , [] )
625642 else if is_direct_jump_instruction instr#get_opcode then
626643 let tgtblock = get_direct_jump_target_address instr#get_opcode in
627644 if functions_data#is_function_entry_point tgtblock then
628- (Some [] , va#add_int 4 , [] ) (* function chaining *)
645+ Ok (Some [] , va#add_int 4 , [] ) (* function chaining *)
629646 else
630- (Some (mk_ci_succ [tgtblock]), va#add_int 4 , [] )
647+ Ok (Some (mk_ci_succ [tgtblock]), va#add_int 4 , [] )
631648 else if is_indirect_jump_instruction instr#get_opcode then
632649 if system_info#has_jump_table_target faddr va then
633650 let loc = make_location { loc_faddr = faddr ; loc_iaddr = va } in
@@ -638,16 +655,16 @@ let trace_block (faddr:doubleword_int) (baddr:doubleword_int) =
638655 let reg =
639656 MIPSRegister (get_indirect_jump_instruction_register instr#get_opcode) in
640657 let _ = finfo#set_jumptable_target ctxtiaddr jt#get_start_address jt reg in
641- (Some (mk_ci_succ targets), va#add_int 4 , [] )
658+ Ok (Some (mk_ci_succ targets), va#add_int 4 , [] )
642659 else if system_info#has_indirect_jump_targets faddr va then
643660 let targets = system_info#get_indirect_jump_targets faddr va in
644- (Some (mk_ci_succ targets), va#add_int 4 , [] )
661+ Ok (Some (mk_ci_succ targets), va#add_int 4 , [] )
645662 else
646- (Some [] , va#add_int 4 , [] )
663+ Ok (Some [] , va#add_int 4 , [] )
647664 else if instr#is_delay_slot then
648- (None , va, [] )
665+ Ok (None , va, [] )
649666 else if is_halt_instruction instr#get_opcode then
650- (Some [] , va, [] )
667+ Ok (Some [] , va, [] )
651668 else if instr#is_inlined_call then
652669 let a = match instr#get_opcode with
653670 | BranchLTZeroLink (_,tgt)
@@ -677,44 +694,53 @@ let trace_block (faddr:doubleword_int) (baddr:doubleword_int) =
677694 [(make_location {loc_faddr = faddr; loc_iaddr = returnsite})#ci]
678695 | l -> List. map (fun s -> add_ctxt_to_ctxt_string faddr s ctxt) l in
679696 make_ctxt_mips_assembly_block ctxt b succ) fn#get_blocks in
680- (Some [ callsucc ], va,inlinedblocks)
697+ Ok (Some [callsucc], va, inlinedblocks)
681698 else
682699 find_last_instr (nextva () ) va in
683700
684- let (succ, lastaddr, inlinedblocks) =
701+ let result_r:
702+ (ctxt_iaddress_t list option
703+ * doubleword_int
704+ * mips_assembly_block_int list ) TR. traceresult =
705+ (* let (succ, lastaddr, inlinedblocks) = *)
685706 let instr =
686707 fail_tvalue
687708 (trerror_record
688709 (LBLOCK [STR " find_last_instr: " ; baddr#toPretty]))
689710 (get_instr baddr) in
690711 let opcode = instr#get_opcode in
691712 if is_return_instruction opcode then
692- (Some [] ,baddr#add_int 4 ,[] )
713+ Ok (Some [] , baddr#add_int 4 , [] )
693714 else if system_info#is_nonreturning_call faddr baddr then
694- (Some [] , baddr#add_int 4 , [] )
715+ Ok (Some [] , baddr#add_int 4 , [] )
695716 else if is_indirect_jump_instruction opcode then
696717 if system_info#has_jump_table_target faddr baddr then
697718 let (jt,_,lb,ub) = system_info#get_jump_table_target faddr baddr in
698719 let targets = jt#get_targets jt#get_start_address lb ub in
699- (Some (mk_ci_succ targets), baddr#add_int 4 , [] )
720+ Ok (Some (mk_ci_succ targets), baddr#add_int 4 , [] )
700721 else
701- (Some [] , baddr#add_int 4 , [] )
722+ Ok (Some [] , baddr#add_int 4 , [] )
702723 else if is_conditional_jump_instruction opcode then
703724 let nextblock = baddr#add_int 8 in
704725 let tgtblock = get_direct_jump_target_address opcode in
705- (Some (mk_ci_succ [ nextblock ; tgtblock ]),baddr#add_int 4 ,[] )
726+ Ok (Some (mk_ci_succ [nextblock; tgtblock]), baddr#add_int 4 , [] )
706727 else if is_direct_jump_instruction opcode then
707728 let tgtblock = get_direct_jump_target_address opcode in
708- (Some (mk_ci_succ [ tgtblock ]),baddr#add_int 4 ,[] )
729+ Ok (Some (mk_ci_succ [tgtblock ]), baddr#add_int 4 , [] )
709730 else
710731 find_last_instr (get_next_instr_addr baddr) baddr in
711732
712- let successors =
713- match succ with Some s -> s | _ -> get_successors faddr lastaddr in
714- (inlinedblocks, make_mips_assembly_block faddr baddr lastaddr successors)
733+ TR. tmap
734+ (fun (succ , lastaddr , inlinedblocks ) ->
735+ let successors =
736+ match succ with
737+ | Some s -> s
738+ | _ -> get_successors faddr lastaddr in
739+ (inlinedblocks, make_mips_assembly_block faddr baddr lastaddr successors))
740+ result_r
715741
716742
717- let trace_function (faddr :doubleword_int ) =
743+ let trace_function (faddr :doubleword_int ): mips_assembly_function_int =
718744 let workSet = new DoublewordCollections. set_t in
719745 let doneSet = new DoublewordCollections. set_t in
720746 let set_block_entry (baddr : doubleword_int ) =
@@ -726,17 +752,26 @@ let trace_function (faddr:doubleword_int) =
726752 let add_to_workset l =
727753 List. iter (fun a -> if doneSet#has a then () else workSet#add a) l in
728754 let blocks = ref [] in
729- let rec add_block (entry :doubleword_int ) =
730- let (inlinedblocks,block) = trace_block faddr entry in
731- let blocksuccessors = block#get_successors in
732- begin
733- set_block_entry entry ;
734- workSet#remove entry ;
735- doneSet#add entry ;
736- blocks := (block :: inlinedblocks) @ ! blocks ;
737- add_to_workset (List. map get_iaddr blocksuccessors) ;
738- match workSet#choose with Some a -> add_block a | _ -> ()
739- end in
755+ let rec add_block (entry : doubleword_int ) =
756+ let result_r: (mips_assembly_block_int list
757+ * mips_assembly_block_int) TR. traceresult =
758+ trace_block faddr entry in
759+ TR. titer
760+ ~ok: (fun (inlinedblocks , block ) ->
761+ let blocksuccessors = block#get_successors in
762+ begin
763+ set_block_entry entry;
764+ workSet#remove entry;
765+ doneSet#add entry;
766+ blocks := (block :: inlinedblocks) @ ! blocks;
767+ add_to_workset (List. map get_iaddr blocksuccessors);
768+ match workSet#choose with Some a -> add_block a | _ -> ()
769+ end )
770+ ~error: (fun e ->
771+ log_error_result
772+ ~tag: " trace_function:add block" __FILE__ __LINE__
773+ ((" faddr: " ^ faddr#to_hex_string) :: e))
774+ result_r in
740775 let _ = add_block faddr in
741776 let blocklist =
742777 List. sort (fun b1 b2 ->
@@ -750,9 +785,7 @@ let trace_function (faddr:doubleword_int) =
750785
751786let construct_mips_assembly_function (_count : int ) (faddr : doubleword_int ) =
752787 try
753- let _ = pverbose [STR " trace function " ; faddr#toPretty; NL ] in
754788 let fn = trace_function faddr in
755- let _ = pverbose [STR " add function " ; faddr#toPretty; NL ] in
756789 mips_assembly_functions#add_function fn
757790 with
758791 | BCH_failure p ->
@@ -875,7 +908,6 @@ let record_call_targets () =
875908 (LBLOCK [STR " function " ; faddr#toPretty; STR " : " ; p]))
876909
877910
878-
879911let decorate_functions () =
880912 begin
881913 record_call_targets ()
0 commit comments