@@ -59,6 +59,7 @@ open BCHMIPSDictionary
5959(* bchlibarm32 *)
6060open BCHARMAssemblyInstructions
6161open BCHARMDictionary
62+ open BCHARMLoopStructure
6263
6364(* bchlibpower32 *)
6465open BCHPowerAssemblyInstructions
@@ -92,6 +93,7 @@ let get_bch_root (info:string):xml_element_int =
9293 end
9394
9495
96+ (* applies to x86 only *)
9597let save_functions_list () =
9698 let filename = get_functions_filename () in
9799 let doc = xmlDocument () in
@@ -125,6 +127,67 @@ let save_functions_list () =
125127 end
126128
127129
130+ let save_arm_functions_list () =
131+ let filename = get_functions_filename () in
132+ let doc = xmlDocument () in
133+ let root = get_bch_root " functions" in
134+ let ffNode = xmlElement " functions" in
135+ let subnodes = ref [] in
136+ begin
137+ BCHARMAssemblyFunctions. arm_assembly_functions#itera (fun faddr f ->
138+ let fNode = xmlElement " fn" in
139+ let jtc = f#get_jumptable_count in
140+ let (translation, lc, ld, ujc) =
141+ try
142+ begin
143+ BCHTranslateARMToCHIF. translate_arm_assembly_function f;
144+ record_arm_loop_levels faddr;
145+ (" ok" ,
146+ get_arm_loop_count_from_table f,
147+ get_arm_loop_depth_from_table f,
148+ (- 1 ))
149+ end
150+ with
151+ | BCH_failure p ->
152+ let finfo = BCHFunctionInfo. get_function_info faddr in
153+ let ujc = finfo#get_unknown_jumps_count in
154+ (CHPrettyUtil. pretty_to_string p, (- 1 ), (- 1 ), ujc) in
155+ let set = fNode#setAttribute in
156+ let seti = fNode#setIntAttribute in
157+ let setx t x = set t x#to_hex_string in
158+ begin
159+ (if functions_data#has_function_name faddr then
160+ let name = (functions_data#get_function faddr)#get_function_name in
161+ let name =
162+ if has_control_characters name then
163+ " __xx__" ^ (hex_string name)
164+ else
165+ name in
166+ set " name" name);
167+ setx " va" faddr;
168+ seti " ic" f#get_instruction_count;
169+ seti " bc" f#get_block_count;
170+ (if jtc > 0 then seti " jtc" jtc);
171+ (if translation = " ok" then
172+ begin
173+ (if lc > 0 then seti " lc" lc);
174+ (if ld > 0 then seti " ld" ld);
175+ end
176+ else
177+ begin
178+ set " tr" " x" ;
179+ seti " ujc" ujc
180+ end );
181+ subnodes := fNode :: ! subnodes
182+ end );
183+ ffNode#appendChildren ! subnodes;
184+ doc#setNode root;
185+ root#appendChildren [ffNode];
186+ file_output#saveFile filename doc#toPretty
187+ end
188+
189+
190+
128191let save_global_state () =
129192 let filename = get_global_state_filename () in
130193 let doc = xmlDocument () in
0 commit comments