@@ -61,7 +61,7 @@ open BCHARMInstructionAggregate
6161
6262
6363let testname = " bCHARMJumptableTest"
64- let lastupdated = " 2024-01-02 "
64+ let lastupdated = " 2024-10-24 "
6565
6666
6767let make_dw (s : string ) = TR. tget_ok (string_to_doubleword s)
@@ -136,6 +136,7 @@ let jt_setup_arm hexbase bytes: arm_jumptable_int TR.traceresult =
136136 let instrlen = currentpos - prevpos in
137137 let instrbytes = String. sub bytestring prevpos instrlen in
138138 let instr = add_instruction prevpos iaddr opcode instrbytes in
139+ (* let _ = CHPretty.pr_debug [instr#toPretty; NL; NL] in *)
139140 let optagg = identify_arm_aggregate ch instr in
140141 match optagg with
141142 | Some agg -> aggregate := Some agg
@@ -144,7 +145,9 @@ let jt_setup_arm hexbase bytes: arm_jumptable_int TR.traceresult =
144145 match ! aggregate with
145146 | Some agg ->
146147 (match agg#kind with
147- | ARMJumptable jt -> Ok jt
148+ | ARMJumptable jt ->
149+ (* let _ = CHPretty.pr_debug [jt#toPretty; NL; NL] in *)
150+ Ok jt
148151 | _ -> Error [" other aggregate found" ])
149152 | _ ->
150153 Error [" no aggregate found:" ^ (string_of_int ch#pos)]
@@ -292,6 +295,60 @@ let ldrls_jumptable () =
292295 end
293296
294297
298+ (*
299+ 0xa0132664 05 00 55 e3 CMP R5, #5
300+ 0xa0132668 05 f1 8f 90 ADDLS PC, PC, R5,LSL#2
301+ 0xa013266c 20 00 00 ea B 0xa01326f4
302+ B 0xa0132670 04 00 00 ea B 0xa0132688
303+ B 0xa0132674 09 00 00 ea B 0xa01326a0
304+ B 0xa0132678 0e 00 00 ea B 0xa01326b8
305+ B 0xa013267c 13 00 00 ea B 0xa01326d0
306+ B 0xa0132680 18 00 00 ea B 0xa01326e8
307+ B 0xa0132684 19 00 00 ea B 0xa01326f0
308+ *)
309+ let addls_pc_jumptable () =
310+ let tests = [
311+ (" addls" , " 0xa0132664" , " 0xa013266c" ,
312+ " 050055e305f18f90200000ea040000ea090000ea0e0000ea130000ea180000ea190000ea" ,
313+ [(" 0xa0132670" , [0 ]);
314+ (" 0xa0132674" , [1 ]);
315+ (" 0xa0132678" , [2 ]);
316+ (" 0xa013267c" , [3 ]);
317+ (" 0xa0132680" , [4 ]);
318+ (" 0xa0132684" , [5 ])])
319+ ] in
320+ begin
321+ TS. new_testsuite (testname ^ " _ldrls_jumptable" ) lastupdated;
322+
323+ system_info#set_elf_is_code_address wordzero codemax;
324+ ARMU. arm_instructions_setup (make_dw " 0xa0132000" ) 0x10000 ;
325+ List. iter (fun (title , hexbase , expecteddefault , bytes , expectedtargets ) ->
326+ let jtresult = jt_setup_arm hexbase bytes in
327+
328+ TS. add_simple_test
329+ ~title: (title ^ " -targets" )
330+ (fun () ->
331+ match jtresult with
332+ | Ok jt ->
333+ ARMA. equal_jumptable_targets
334+ ~msg: " " ~expected: expectedtargets ~received: jt ()
335+ | Error e ->
336+ A. fail_msg (String. concat " ; " e));
337+
338+ TS. add_simple_test
339+ ~title: (title ^ " -default" )
340+ (fun () ->
341+ match jtresult with
342+ | Ok jt ->
343+ A. equal_string expecteddefault jt#default_target#to_hex_string
344+ | Error e ->
345+ A. fail_msg (String. concat " ; " e))
346+ ) tests;
347+
348+ TS. launch_tests ()
349+ end
350+
351+
295352let bx_table_branch () =
296353 let tests = [
297354 (" bx-w" , " 0x6c0d0" , " 0x6c080" ,
@@ -350,6 +407,7 @@ let () =
350407 tb_table_branch () ;
351408 ldr_table_branch () ;
352409 ldrls_jumptable () ;
410+ addls_pc_jumptable () ;
353411 bx_table_branch () ;
354412 TS. exit_file ()
355413 end
0 commit comments