Skip to content

Commit 13f212d

Browse files
committed
CHB:ARM: convert to error-enabled operands in value transmission
1 parent 09a3758 commit 13f212d

File tree

12 files changed

+2620
-1777
lines changed

12 files changed

+2620
-1777
lines changed

CodeHawk/CHB/bchlib/bCHLibTypes.mli

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5596,6 +5596,14 @@ class type memory_recorder_int =
55965596
-> vtype:btype_t
55975597
-> unit
55985598

5599+
method record_load_r:
5600+
signed:bool
5601+
-> addr_r:xpr_t traceresult
5602+
-> var_r:variable_t traceresult
5603+
-> size:int
5604+
-> vtype:btype_t
5605+
-> unit
5606+
55995607
method record_store:
56005608
addr:xpr_t
56015609
-> var:variable_t
@@ -5604,6 +5612,14 @@ class type memory_recorder_int =
56045612
-> xpr:xpr_t
56055613
-> unit
56065614

5615+
method record_store_r:
5616+
addr_r:xpr_t traceresult
5617+
-> var_r:variable_t traceresult
5618+
-> size:int
5619+
-> vtype:btype_t
5620+
-> xpr_r:xpr_t traceresult
5621+
-> unit
5622+
56075623
end
56085624

56095625

CodeHawk/CHB/bchlib/bCHMemoryRecorder.ml

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
------------------------------------------------------------------------------
55
The MIT License (MIT)
66
7-
Copyright (c) 2023-2024 Aarno Labs LLC
7+
Copyright (c) 2023-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
@@ -31,6 +31,7 @@ open CHLanguage
3131

3232
(* chutil *)
3333
open CHLogger
34+
open CHTraceResult
3435

3536
(* xprlib *)
3637
open Xprt
@@ -45,8 +46,11 @@ open BCHGlobalState
4546
open BCHLibTypes
4647
open BCHLocation
4748

49+
module TR = CHTraceResult
50+
4851

4952
let x2p = xpr_formatter#pr_expr
53+
let p2s = CHPrettyUtil.pretty_to_string
5054

5155
let mmap = BCHGlobalMemoryMap.global_memory_map
5256

@@ -231,6 +235,42 @@ object (self)
231235
var#toPretty;
232236
STR ")"])
233237

238+
method record_load_r
239+
~(signed: bool)
240+
~(addr_r: xpr_t traceresult)
241+
~(var_r: variable_t traceresult)
242+
~(size: int)
243+
~(vtype: btype_t) =
244+
TR.tfold
245+
~ok:(fun var ->
246+
if self#env#is_stack_variable var then
247+
TR.tfold
248+
~ok:(fun offset ->
249+
match offset with
250+
| ConstantOffset (n, NoOffset) ->
251+
self#finfo#stackframe#add_load
252+
~offset:n#toInt ~size:(Some size) ~typ:(Some vtype) var iaddr
253+
| _ ->
254+
log_error_result __FILE__ __LINE__
255+
["memrecorder:stack"; p2s self#loc#toPretty])
256+
~error:(fun e -> log_error_result __FILE__ __LINE__ e)
257+
(self#env#get_memvar_offset var)
258+
else
259+
TR.tfold
260+
~ok:(fun addr ->
261+
match addr with
262+
| XConst (IntConst n)
263+
when mmap#is_global_data_address
264+
(numerical_mod_to_doubleword n) ->
265+
mmap#add_gload self#faddr iaddr addr size signed
266+
| _ ->
267+
log_error_result __FILE__ __LINE__
268+
["memrecorder:global"; p2s self#loc#toPretty])
269+
~error:(fun e -> log_error_result __FILE__ __LINE__ e)
270+
addr_r)
271+
~error:(fun e -> log_error_result __FILE__ __LINE__ e)
272+
var_r
273+
234274
method record_store
235275
~(addr: xpr_t)
236276
~(var: variable_t)
@@ -284,6 +324,56 @@ object (self)
284324
STR "): ";
285325
x2p xpr])
286326

327+
method record_store_r
328+
~(addr_r: xpr_t traceresult)
329+
~(var_r: variable_t traceresult)
330+
~(size: int)
331+
~(vtype: btype_t)
332+
~(xpr_r: xpr_t traceresult) =
333+
TR.tfold
334+
~ok:(fun var ->
335+
if self#env#is_stack_variable var then
336+
TR.tfold
337+
~ok:(fun offset ->
338+
match offset with
339+
| ConstantOffset (n, NoOffset) ->
340+
self#finfo#stackframe#add_store
341+
~offset:n#toInt
342+
~size:(Some size)
343+
~typ:(Some vtype)
344+
~xpr:(TR.tfold_default (fun x -> Some x) None xpr_r)
345+
var
346+
iaddr
347+
| _ ->
348+
log_error_result __FILE__ __LINE__
349+
["memrecorder:stack"; p2s self#loc#toPretty])
350+
~error:(fun e -> log_error_result __FILE__ __LINE__ e)
351+
(self#env#get_memvar_offset var)
352+
else
353+
TR.tfold
354+
~ok:(fun addr ->
355+
match addr with
356+
| XConst (IntConst n)
357+
when mmap#is_global_data_address
358+
(numerical_mod_to_doubleword n) ->
359+
let optvalue =
360+
TR.tfold_default
361+
(fun xpr ->
362+
match xpr with
363+
| XConst (IntConst n) -> Some n
364+
| _ -> None)
365+
None
366+
xpr_r in
367+
mmap#add_gstore self#faddr iaddr addr size optvalue
368+
| _ ->
369+
log_error_result __FILE__ __LINE__
370+
["memrecorder:global"; p2s self#loc#toPretty])
371+
~error:(fun e -> log_error_result __FILE__ __LINE__ e)
372+
addr_r)
373+
~error:(fun e -> log_error_result __FILE__ __LINE__ e)
374+
var_r
375+
376+
287377
end
288378

289379

CodeHawk/CHB/bchlibarm32/bCHARMMetrics.ml

Lines changed: 54 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
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
3838
module 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

99105
let 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

117123
let 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+
129136
let 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
}

CodeHawk/CHB/bchlibarm32/bCHARMMetrics.mli

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
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

0 commit comments

Comments
 (0)