44 ------------------------------------------------------------------------------
55 The MIT License (MIT)
66
7- Copyright (c) 2021-2024 Aarno Labs LLC
7+ Copyright (c) 2021-2025 Aarno Labs LLC
88
99 Permission is hereby granted, free of charge, to any person obtaining a copy
1010 of this software and associated documentation files (the "Software"), to deal
@@ -38,45 +38,50 @@ open BCHARMTypes
3838module TR = CHTraceResult
3939
4040
41- let get_arm_op_metrics (f :arm_assembly_function_int ) (finfo :function_info_int ) =
41+ let get_arm_op_metrics (f :arm_assembly_function_int ) (_finfo :function_info_int ) =
4242 let faddr = f#get_address in
4343 let reads = ref 0 in
4444 let qreads = ref 0 in
4545 let writes = ref 0 in
4646 let qwrites = ref 0 in
47- let is_memory_op op =
47+ let count_memory_ops ( op : arm_operand_int ): int =
4848 match op#get_kind with
49- | ARMMemMultiple _
50- | ARMOffsetAddress _ -> true
51- | _ -> false in
52- let is_loc_unknown floc (op : arm_operand_int ) =
49+ | ARMMemMultiple (_ , _ , n , _ ) -> n
50+ | ARMOffsetAddress _ -> 1
51+ | _ -> 0 in
52+
53+ let count_unknown_reads floc (op : arm_operand_int ): int =
54+ match op#get_kind with
55+ | ARMMemMultiple _ ->
56+ let (lhs_rl, _) = op#to_multiple_lhs floc in
57+ List. fold_left (fun acc lhs_r ->
58+ if Result. is_error lhs_r then acc + 1 else acc) 0 lhs_rl
59+ | ARMOffsetAddress _ ->
60+ if Result. is_error (op#to_lhs floc) then 1 else 0
61+ | _ -> 0 in
62+
63+ let count_unknown_writes floc (op : arm_operand_int ): int =
5364 match op#get_kind with
5465 | ARMMemMultiple _ ->
55- TR. tfold_default
56- (fun (vlist , _ ) ->
57- match vlist with
58- | v ::_ -> v#isTmp || (finfo#env#is_unknown_memory_variable v)
59- | _ -> true )
60- true
61- (op#to_multiple_lhs floc)
66+ let rhs_rl = op#to_multiple_expr floc in
67+ List. fold_left (fun acc rhs_r ->
68+ if Result. is_error rhs_r then acc + 1 else acc) 0 rhs_rl
6269 | ARMOffsetAddress _ ->
63- TR. tfold_default
64- (fun (v , _ ) -> v#isTmp || (finfo#env#is_unknown_memory_variable v))
65- true
66- (op#to_lhs floc)
67- | _ -> false in
68- let add_read floc (op : arm_operand_int ) =
69- if is_memory_op op then
70- begin
71- reads := ! reads + 1 ;
72- if is_loc_unknown floc op then qreads := ! qreads + 1
73- end in
74- let add_write floc (op : arm_operand_int ) =
75- if is_memory_op op then
76- begin
77- writes := ! writes + 1 ;
78- if is_loc_unknown floc op then qwrites := ! qwrites + 1
79- end in
70+ if Result. is_error (op#to_expr floc) then 1 else 0
71+ | _ -> 0 in
72+
73+ let add_reads floc (op : arm_operand_int ) =
74+ begin
75+ reads := ! reads + (count_memory_ops op);
76+ qreads := ! qreads + (count_unknown_reads floc op)
77+ end in
78+
79+ let add_writes floc (op : arm_operand_int ) =
80+ begin
81+ writes := ! writes + (count_memory_ops op);
82+ qwrites := ! qwrites + (count_unknown_writes floc op)
83+ end in
84+
8085 let _ =
8186 f#iteri (fun _ ctxtiaddr instr ->
8287 let ops = get_arm_operands instr#get_opcode in
@@ -87,14 +92,15 @@ let get_arm_op_metrics (f:arm_assembly_function_int) (finfo:function_info_int) =
8792 let floc = get_floc loc in
8893 List. iter (fun (op : arm_operand_int ) ->
8994 match op#get_mode with
90- | RD -> add_read floc op
91- | WR -> add_write floc op
95+ | RD -> add_reads floc op
96+ | WR -> add_writes floc op
9297 | RW ->
9398 begin
94- add_read floc op;
95- add_write floc op
99+ add_reads floc op;
100+ add_writes floc op
96101 end ) ops) in
97- (! reads,! qreads,! writes,! qwrites)
102+ (! reads, ! qreads, ! writes, ! qwrites)
103+
98104
99105let get_arm_stackpointer_metrics
100106 (f : arm_assembly_function_int ) (_finfo : function_info_int ) =
@@ -111,28 +117,29 @@ let get_arm_stackpointer_metrics
111117 esptop := ! esptop + 1
112118 else match range#singleton with
113119 Some _ -> () | _ -> esprange := ! esprange + 1 ) in
114- (! esptop,! esprange)
120+ (! esptop, ! esprange)
115121
116122
117123let get_arm_memory_access_metrics
118124 (f : arm_assembly_function_int ) (finfo : function_info_int ) =
119125 let (reads,qreads,writes,qwrites) = get_arm_op_metrics f finfo in
120126 let (esptop,esprange) = get_arm_stackpointer_metrics f finfo in
121- { mmem_reads = reads ;
122- mmem_qreads = qreads ;
123- mmem_writes = writes ;
124- mmem_qwrites = qwrites ;
125- mmem_esptop = esptop ;
127+ { mmem_reads = reads;
128+ mmem_qreads = qreads;
129+ mmem_writes = writes;
130+ mmem_qwrites = qwrites;
131+ mmem_esptop = esptop;
126132 mmem_esprange = esprange
127133 }
128134
135+
129136let get_arm_cfg_metrics
130137 (f : arm_assembly_function_int ) (_env : function_environment_int ) =
131138 let _ = record_arm_loop_levels f#get_address in
132- { mcfg_instrs = f#get_instruction_count ;
133- mcfg_bblocks = f#get_block_count ;
134- mcfg_loops = get_arm_loop_count_from_table f ;
135- mcfg_loopdepth = get_arm_loop_depth_from_table f ;
136- mcfg_complexity = 0 ;
139+ { mcfg_instrs = f#get_instruction_count;
140+ mcfg_bblocks = f#get_block_count;
141+ mcfg_loops = get_arm_loop_count_from_table f;
142+ mcfg_loopdepth = get_arm_loop_depth_from_table f;
143+ mcfg_complexity = 0 ;
137144 mcfg_vc_complexity = 0.0
138145 }
0 commit comments