Skip to content

Commit 9b54f55

Browse files
committed
CHB:ARM: add global variable addresses to assembly listing
1 parent 8b90183 commit 9b54f55

File tree

2 files changed

+133
-93
lines changed

2 files changed

+133
-93
lines changed

CodeHawk/CHB/bchlib/bCHVersion.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ end
9595

9696

9797
let version = new version_info_t
98-
~version:"0.6.0_20250417"
99-
~date:"2025-04-17"
98+
~version:"0.6.0_20250420"
99+
~date:"2025-04-20"
100100
~licensee: None
101101
~maxfilesize: None
102102
()

CodeHawk/CHB/bchlibarm32/bCHARMAssemblyInstructions.ml

Lines changed: 131 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,11 @@ open BCHDisassembleThumbInstruction
6767
module H = Hashtbl
6868
module TR = CHTraceResult
6969

70+
(*
7071
let x2p = XprToPretty.xpr_formatter#pr_expr
7172
let p2s = CHPrettyUtil.pretty_to_string
7273
let x2s x = p2s (x2p x)
73-
74+
*)
7475
let numArrays = 1000
7576
let 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

Comments
 (0)