Skip to content

Commit 73264be

Browse files
committed
CHB:ARM:show global variable references in data blocks
1 parent b7151cf commit 73264be

File tree

1 file changed

+83
-3
lines changed

1 file changed

+83
-3
lines changed

CodeHawk/CHB/bchlibarm32/bCHARMAssemblyInstructions.ml

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,7 @@ object (self)
616616
""
617617
end)
618618
(gloc#address_memory_offset ~tgtsize:(Some 4) offset) in
619+
let vm1 (v: doubleword_int) = TR.to_option (v#subtract_int 1) in
619620
let render_gloc (a: doubleword_int) (v: doubleword_int): string =
620621
let addrprefix = " " ^ (fixed_length_string a#to_hex_string 10) in
621622
let p_value =
@@ -634,9 +635,40 @@ object (self)
634635
^ v#to_hex_string
635636
^ name
636637
^ ">"
638+
else if (Option.is_some (vm1 v))
639+
&& functions_data#is_function_entry_point (Option.get (vm1 v)) then
640+
let fentry = Option.get (vm1 v) in
641+
let name =
642+
if functions_data#has_function_name fentry then
643+
let fndata = functions_data#get_function fentry in
644+
":" ^ fndata#get_function_name
645+
else
646+
"" in
647+
"Faddr:<"
648+
^ v#to_hex_string
649+
^ name
650+
^ "(T)>"
651+
else if memorymap#has_location v then
652+
let gloc = memorymap#get_location v in
653+
"GVAddr:<"
654+
^ v#to_hex_string
655+
^ ":"
656+
^ gloc#name
657+
^ ">"
658+
637659
else if elf_header#is_code_address v then
660+
let s =
661+
match elf_header#get_string_at_address v with
662+
| Some s ->
663+
let len = String.length s in
664+
if len < 50 then
665+
":\"" ^ s ^ "\""
666+
else
667+
":\"" ^ (String.sub s 0 50) ^ "...\""
668+
| _ -> "" in
638669
"Code:<"
639670
^ v#to_hex_string
671+
^ s
640672
^ ">"
641673
else if elf_header#is_data_address v then
642674
let s =
@@ -648,7 +680,7 @@ object (self)
648680
else
649681
":\"" ^ (String.sub s 0 50) ^ "...\""
650682
| _ -> "" in
651-
" Data:<"
683+
"Data:<"
652684
^ v#to_hex_string
653685
^ s
654686
^ ">"
@@ -664,7 +696,9 @@ object (self)
664696
match offset with
665697
| XConst (IntConst n) when n#equal numerical_zero ->
666698
addrprefix
667-
^ "\n Global variable:<"
699+
^ "\n"
700+
^ addrprefix
701+
^ " Global variable:<"
668702
^ gloc#name
669703
^ ": "
670704
^ (btype_to_string gloc#btype)
@@ -743,6 +777,13 @@ object (self)
743777
" " ^ (fixed_length_string !addr#to_hex_string 10) ^ " align\n"
744778
else
745779
"" in
780+
let render_string (s: string): string =
781+
let len = String.length s in
782+
if len <= 40 then
783+
s
784+
else
785+
(String.sub s 0 40) ^ "... (length: " ^ (string_of_int len) ^ ")" in
786+
746787
let _ =
747788
if prefix > 0 && (String.length s) >= prefix then
748789
ch#skip_bytes prefix in
@@ -754,6 +795,7 @@ object (self)
754795
addr := !addr#add_int 4
755796
end
756797
done;
798+
let addrstr_end = ref wordzero in
757799
("\n" ^ (string_repeat "~" 80) ^ "\nData block (size: "
758800
^ (string_of_int len) ^ " bytes)\n\n"
759801
^ pprefix
@@ -772,6 +814,12 @@ object (self)
772814
^ (fixed_length_string v#to_hex_string 12)
773815
^ "> ... (cont'd)"
774816

817+
else if a#lt !addrstr_end then
818+
addrprefix
819+
^ " <String:<"
820+
^ (fixed_length_string v#to_hex_string 12)
821+
^ "> ... (cont'd)"
822+
775823
else if Option.is_some (memorymap#containing_location a) then
776824
render_gloc a v
777825

@@ -802,6 +850,24 @@ object (self)
802850
^ v#to_hex_string
803851
^ name
804852
^ ">"
853+
^ pdatarefstr
854+
855+
(* handle thumb function addresses (+1) *)
856+
else if (Option.is_some (vm1 v))
857+
&& functions_data#is_function_entry_point
858+
(Option.get (vm1 v)) then
859+
let fentry = Option.get (vm1 v) in
860+
let name =
861+
if functions_data#has_function_name fentry then
862+
let fndata = functions_data#get_function fentry in
863+
":" ^ fndata#get_function_name
864+
else
865+
"" in
866+
addrprefix
867+
^ " Faddr:<"
868+
^ v#to_hex_string
869+
^ name
870+
^ "(T)>"
805871
^ pdatarefstr
806872

807873
else if memorymap#has_location v then
@@ -815,9 +881,20 @@ object (self)
815881
^ pdatarefstr
816882

817883
else if elf_header#is_code_address v then
884+
let s =
885+
match elf_header#get_string_at_address v with
886+
| Some s ->
887+
let len = String.length s in
888+
if len < 50 then
889+
":\"" ^ s ^ "\""
890+
else
891+
":\"" ^ (String.sub s 0 50) ^ "...\""
892+
| _ -> "" in
893+
818894
addrprefix
819895
^ " Code:<"
820896
^ v#to_hex_string
897+
^ s
821898
^ ">"
822899
^ (datarefstr a)
823900

@@ -848,12 +925,15 @@ object (self)
848925
(elf_header#get_string_at_address a) then
849926
let s =
850927
Option.get (elf_header#get_string_at_address a) in
928+
let slen = String.length s in
929+
let slen = if slen > 40 then 40 else slen in
930+
let _ = addrstr_end := a#add_int slen in
851931
begin
852932
(addrprefix
853933
^ " String:<"
854934
^ (fixed_length_string v#to_hex_string 12)
855935
^ ">: \""
856-
^ s
936+
^ (render_string s)
857937
^ "\"")
858938
^ pdatarefstr
859939
end

0 commit comments

Comments
 (0)