Simplest: correctly add beg-of-block values

This commit is contained in:
Théophile Bastian 2018-11-19 16:09:56 +01:00
parent ee6ac40294
commit b395c98b78

View file

@ -24,8 +24,8 @@ module TIdMap = Map.Make(BStd.Tid)
exception InvalidSub exception InvalidSub
let pp_cfa_pos ppx = function let pp_cfa_pos ppx = function
| RspOffset off -> Format.fprintf ppx "RSP + (%s)@." (Int64.to_string off) | RspOffset off -> Format.fprintf ppx "RSP + (%s)" (Int64.to_string off)
| RbpOffset off -> Format.fprintf ppx "RBP + (%s)@." (Int64.to_string off) | RbpOffset off -> Format.fprintf ppx "RBP + (%s)" (Int64.to_string off)
| CfaLostTrack -> Format.fprintf ppx "??@." | CfaLostTrack -> Format.fprintf ppx "??@."
let pp_int64_hex ppx number = let pp_int64_hex ppx number =
@ -39,7 +39,8 @@ let pp_int64_hex ppx number =
let pp_cfa_change ppx = function CfaChange(addr, cfa_pos) -> let pp_cfa_change ppx = function CfaChange(addr, cfa_pos) ->
Format.fprintf ppx "%a: %a" pp_int64_hex addr pp_cfa_pos cfa_pos Format.fprintf ppx "%a: %a" pp_int64_hex addr pp_cfa_pos cfa_pos
let pp_cfa_changes_fde ppx = List.iter (pp_cfa_change ppx) let pp_cfa_changes_fde ppx = List.iter
(Format.fprintf ppx "%a@." pp_cfa_change)
let pp_cfa_changes ppx = let pp_cfa_changes ppx =
StrMap.iter (fun fde_name entry -> StrMap.iter (fun fde_name entry ->
@ -265,10 +266,10 @@ let process_blk
| None -> assert false | None -> assert false
| Some x -> to_int64_addr x) in | Some x -> to_int64_addr x) in
(AddrSet.fold (fun n_addr cur_accu -> (AddrSet.fold (fun n_addr cur_accu ->
let change = CfaChange(n_addr, pos) in let change = CfaChange(n_addr, pos) in
(change :: cur_accu)) (change :: cur_accu))
(AddrMap.find cur_addr next_instr_graph) (AddrMap.find cur_addr next_instr_graph)
accu), accu),
pos pos
in in
@ -282,9 +283,16 @@ let process_blk
| _ -> (accu, cur_cfa) | _ -> (accu, cur_cfa)
in in
let init_changes = (match opt_addr_of blk with
| None -> []
| Some x ->
let blk_address = to_int64_addr x in
[CfaChange (blk_address, block_init)]
) in
let elts_seq = BStd.Blk.elts blk in let elts_seq = BStd.Blk.elts blk in
let out, end_cfa = BStd.Seq.fold elts_seq let out, end_cfa = BStd.Seq.fold elts_seq
~init:([], block_init) ~init:(init_changes, block_init)
~f:fold_elt in ~f:fold_elt in
out, end_cfa out, end_cfa
@ -346,7 +354,7 @@ let process_sub sub : cfa_changes_fde =
let merged_changes = TIdMap.fold let merged_changes = TIdMap.fold
(fun _ (cfa_changes, _) accu -> cfa_changes @ accu) (fun _ (cfa_changes, _) accu -> cfa_changes @ accu)
changes_map changes_map
[CfaChange(int64_addr_of sub, initial_offset)] in [] in
let sorted_changes = List.sort let sorted_changes = List.sort
(fun (CfaChange (addr1, _)) (CfaChange (addr2, _)) -> (fun (CfaChange (addr1, _)) (CfaChange (addr2, _)) ->