|
|
|
@ -758,20 +758,28 @@ let xlate_jump :
|
|
|
|
|
| _ -> reg_exps )
|
|
|
|
|
| At_end blk -> fail "xlate_jump: %a" pp_llblock blk ()
|
|
|
|
|
in
|
|
|
|
|
let jmp = Llair.Jump.mk (label_of_block dst) in
|
|
|
|
|
let dst_lbl = label_of_block dst in
|
|
|
|
|
let jmp = Llair.Jump.mk dst_lbl in
|
|
|
|
|
match xlate_jump_ reg_exps (Llvm.instr_begin dst) with
|
|
|
|
|
| [] -> (jmp, blocks)
|
|
|
|
|
| reg_exps ->
|
|
|
|
|
let mov =
|
|
|
|
|
Llair.Inst.move ~reg_exps:(Vector.of_list_rev reg_exps) ~loc
|
|
|
|
|
in
|
|
|
|
|
let lbl = find_name instr ^ ".jmp" in
|
|
|
|
|
let lbl = find_name instr ^ ".jmp." ^ dst_lbl in
|
|
|
|
|
let blk =
|
|
|
|
|
Llair.Block.mk ~lbl
|
|
|
|
|
~cmnd:(Vector.of_array [|mov|])
|
|
|
|
|
~term:(Llair.Term.goto ~dst:jmp ~loc)
|
|
|
|
|
in
|
|
|
|
|
(Llair.Jump.mk lbl, blk :: blocks)
|
|
|
|
|
let blocks =
|
|
|
|
|
match List.find blocks ~f:(fun b -> String.equal lbl b.lbl) with
|
|
|
|
|
| None -> blk :: blocks
|
|
|
|
|
| Some blk0 ->
|
|
|
|
|
assert (Llair.Block.equal blk0 blk) ;
|
|
|
|
|
blocks
|
|
|
|
|
in
|
|
|
|
|
(Llair.Jump.mk lbl, blocks)
|
|
|
|
|
|
|
|
|
|
(** An LLVM instruction is translated to a sequence of LLAIR instructions
|
|
|
|
|
and a terminator, plus some additional blocks to which it may refer
|
|
|
|
|