@@ -67,10 +67,11 @@ open BCHDisassembleThumbInstruction
6767module H = Hashtbl
6868module TR = CHTraceResult
6969
70+ (*
7071let x2p = XprToPretty.xpr_formatter#pr_expr
7172let p2s = CHPrettyUtil.pretty_to_string
7273let x2s x = p2s (x2p x)
73-
74+ *)
7475let numArrays = 1000
7576let arrayLength = 100000
7677
@@ -594,7 +595,102 @@ object (self)
594595 let firstNew = ref true in
595596 let datareftable = H. create (List. length datarefs) in
596597 let _ = List. iter (fun (a , refs ) -> H. add datareftable a refs) datarefs in
598+ let datarefstr (a : doubleword_int ): string =
599+ if H. mem datareftable a#to_hex_string then
600+ let datarefs = H. find datareftable a#to_hex_string in
601+ " (refs: "
602+ ^ (String. concat
603+ " , " (List. map (fun instr -> instr#get_address#to_hex_string) datarefs))
604+ ^ " )"
605+ else
606+ " " in
597607 let memorymap = BCHGlobalMemoryMap. global_memory_map in
608+ let get_memory_offset (gloc : global_location_int ) (offset : xpr_t ) =
609+ TR. tfold
610+ ~ok: (fun memoffset ->
611+ " (" ^ (BCHMemoryReference. memory_offset_to_string memoffset) ^ " )"
612+ ^ " " )
613+ ~error: (fun e ->
614+ begin
615+ log_diagnostics_result __FILE__ __LINE__ e;
616+ " "
617+ end )
618+ (gloc#address_memory_offset ~tgtsize: (Some 4 ) offset) in
619+ let render_gloc (a : doubleword_int ) (v : doubleword_int ): string =
620+ let addrprefix = " " ^ (fixed_length_string a#to_hex_string 10 ) in
621+ let p_value =
622+ if v#equal wordzero then
623+ " <0x0>"
624+ else if v#equal wordmax then
625+ " <0xffffffff>"
626+ else if functions_data#is_function_entry_point v then
627+ let name =
628+ if functions_data#has_function_name v then
629+ let fndata = functions_data#get_function v in
630+ " :" ^ fndata#get_function_name
631+ else
632+ " " in
633+ " FAddr:<"
634+ ^ v#to_hex_string
635+ ^ name
636+ ^ " >"
637+ else if elf_header#is_code_address v then
638+ " Code:<"
639+ ^ v#to_hex_string
640+ ^ " >"
641+ else if elf_header#is_data_address v then
642+ let s =
643+ match elf_header#get_string_at_address v with
644+ | Some s ->
645+ let len = String. length s in
646+ if len < 50 then
647+ " :\" " ^ s ^ " \" "
648+ else
649+ " :\" " ^ (String. sub s 0 50 ) ^ " ...\" "
650+ | _ -> " " in
651+ " Data:<"
652+ ^ v#to_hex_string
653+ ^ s
654+ ^ " >"
655+ else
656+ v#to_hex_string in
657+ match memorymap#containing_location a with
658+ | None -> " " (* should not be reachable *)
659+ | Some gloc ->
660+ let xprv = num_constant_expr a#to_numerical in
661+ TR. tfold_default
662+ (fun offset ->
663+ let p_memoff = get_memory_offset gloc xprv in
664+ match offset with
665+ | XConst (IntConst n ) when n#equal numerical_zero ->
666+ addrprefix
667+ ^ " \n Global variable:<"
668+ ^ gloc#name
669+ ^ " : "
670+ ^ (btype_to_string gloc#btype)
671+ ^ " >\n "
672+ ^ addrprefix
673+ ^ " GV:<"
674+ ^ gloc#name
675+ ^ " :0 >: "
676+ ^ p_value
677+ ^ p_memoff
678+ ^ (datarefstr a)
679+ | XConst (IntConst n ) ->
680+ addrprefix
681+ ^ " GV:<"
682+ ^ gloc#name
683+ ^ " :"
684+ ^ (fixed_length_string n#toString 3 )
685+ ^ " >: "
686+ ^ p_value
687+ ^ p_memoff
688+ ^ (datarefstr a)
689+ | _ -> " " (* should not be reachable *)
690+ )
691+ (addrprefix ^ " GV:<" ^ gloc#name ^ " :?>:" ^ p_value)
692+ (gloc#address_offset xprv) in
693+
598694 let not_code_to_string nc =
599695 match nc with
600696 | JumpTable jt ->
@@ -665,20 +761,10 @@ object (self)
665761 " \n "
666762 (List. map
667763 (fun (a , v ) ->
764+ let addrprefix =
765+ " " ^ (fixed_length_string a#to_hex_string 10 ) in
668766 let addr = a#to_hex_string in
669- let datarefstr =
670- if H. mem datareftable addr then
671- let datarefs = H. find datareftable addr in
672- " "
673- ^ " (refs: "
674- ^ (String. concat
675- " , "
676- (List. map
677- (fun instr ->
678- instr#get_address#to_hex_string) datarefs))
679- ^ " )"
680- else
681- " " in
767+ let pdatarefstr = datarefstr a in
682768 if a#lt ! stringend then
683769 " "
684770 ^ (fixed_length_string addr 10 )
@@ -687,73 +773,22 @@ object (self)
687773 ^ " > ... (cont'd)"
688774
689775 else if Option. is_some (memorymap#containing_location a) then
690- match memorymap#containing_location a with
691- | None -> " "
692- | Some gloc ->
693- let xprv = num_constant_expr a#to_numerical in
694- let offset_r = gloc#address_offset xprv in
695- TR. tfold_default
696- (fun offset ->
697- match offset with
698- | XConst (IntConst n ) when n#equal numerical_zero ->
699- " "
700- ^ (fixed_length_string addr 10 )
701- ^ " Global variable:<"
702- ^ gloc#name
703- ^ " : "
704- ^ (btype_to_string gloc#btype)
705- ^ " >"
706- ^ " \n "
707- ^ (fixed_length_string addr 10 )
708- ^ " GV:<"
709- ^ gloc#name
710- ^ " :0 >: "
711- ^ v#to_hex_string
712- | XConst (IntConst n ) ->
713- " "
714- ^ (fixed_length_string addr 10 )
715- ^ " GV:<"
716- ^ gloc#name
717- ^ " :"
718- ^ (fixed_length_string n#toString 3 )
719- ^ " >: "
720- ^ v#to_hex_string
721- | _ ->
722- " "
723- ^ (fixed_length_string addr 10 )
724- ^ " GV:<"
725- ^ gloc#name
726- ^ " :"
727- ^ (x2s offset)
728- ^ " >: "
729- ^ v#to_hex_string)
730- (" "
731- ^ (fixed_length_string addr 10 )
732- ^ " GV:<"
733- ^ gloc#name
734- ^ " :?>: "
735- ^ v#to_hex_string)
736- offset_r
776+ render_gloc a v
737777
738778 else if memorymap#has_elf_symbol v then
739779 let name = memorymap#get_elf_symbol v in
740- " "
741- ^ (fixed_length_string addr 10 )
780+ addrprefix
742781 ^ " Sym:<"
743782 ^ v#to_hex_string
744783 ^ " :"
745784 ^ name
746785 ^ " >"
747- ^ datarefstr
786+ ^ pdatarefstr
748787
749788 else if v#equal wordzero then
750- " "
751- ^ (fixed_length_string addr 10 )
752- ^ " <0x0>"
789+ addrprefix ^ " <0x0>"
753790 else if v#equal wordmax then
754- " "
755- ^ (fixed_length_string addr 10 )
756- ^ " <0xffffffff>"
791+ addrprefix ^ " <0xffffffff>"
757792
758793 else if functions_data#is_function_entry_point v then
759794 let name =
@@ -762,21 +797,30 @@ object (self)
762797 " :" ^ fndata#get_function_name
763798 else
764799 " " in
765- " "
766- ^ (fixed_length_string addr 10 )
800+ addrprefix
767801 ^ " Faddr:<"
768802 ^ v#to_hex_string
769803 ^ name
770804 ^ " >"
771- ^ datarefstr
805+ ^ pdatarefstr
806+
807+ else if memorymap#has_location v then
808+ let gloc = memorymap#get_location v in
809+ addrprefix
810+ ^ " GVAddr:<"
811+ ^ v#to_hex_string
812+ ^ " :"
813+ ^ gloc#name
814+ ^ " >"
815+ ^ pdatarefstr
772816
773817 else if elf_header#is_code_address v then
774- " "
775- ^ (fixed_length_string addr 10 )
818+ addrprefix
776819 ^ " Code:<"
777820 ^ v#to_hex_string
778821 ^ " >"
779- ^ datarefstr
822+ ^ (datarefstr a)
823+
780824 else if elf_header#is_data_address v then
781825 let s =
782826 match elf_header#get_string_at_address v with
@@ -787,44 +831,40 @@ object (self)
787831 else
788832 " :\" " ^ (String. sub s 0 50 ) ^ " ...\" "
789833 | _ -> " " in
790- " "
791- ^ (fixed_length_string addr 10 )
834+ addrprefix
792835 ^ " Data:<"
793836 ^ v#to_hex_string
794837 ^ s
795838 ^ " >"
796- ^ datarefstr
839+ ^ pdatarefstr
840+
797841 else if elf_header#is_uninitialized_data_address v then
798- " "
799- ^ (fixed_length_string addr 10 )
842+ addrprefix
800843 ^ " Bss:<"
801844 ^ v#to_hex_string
802845 ^ " >"
803- ^ datarefstr
846+ ^ ( datarefstr a)
804847 else if Option. is_some
805848 (elf_header#get_string_at_address a) then
806849 let s =
807850 Option. get (elf_header#get_string_at_address a) in
808851 begin
809- (" "
810- ^ (fixed_length_string addr 10 )
852+ (addrprefix
811853 ^ " String:<"
812854 ^ (fixed_length_string v#to_hex_string 12 )
813855 ^ " >: \" "
814856 ^ s
815857 ^ " \" " )
816- ^ datarefstr
858+ ^ pdatarefstr
817859 end
818- else if (String. length datarefstr) > 0 then
819- " "
820- ^ (fixed_length_string addr 10 )
860+ else if (String. length (datarefstr a)) > 0 then
861+ addrprefix
821862 ^ " Value<"
822863 ^ v#to_hex_string
823864 ^ " >"
824- ^ datarefstr
865+ ^ pdatarefstr
825866 else
826- " "
827- ^ (fixed_length_string addr 10 )
867+ addrprefix
828868 ^ " "
829869 ^ (fixed_length_string v#to_hex_string 14 )
830870 ^ " "
0 commit comments