@@ -932,6 +932,49 @@ module BlockChunk =
932
932
| stmts , postins ->
933
933
doStmts stmts;
934
934
c
935
+
936
+ let eDoInstr: instr -> instr = function
937
+ | Set (l , e , loc , eloc ) -> Set (l, e, loc, doLoc eloc)
938
+ | VarDecl (v , loc ) -> VarDecl (v, loc)
939
+ | Call (l , f , a , loc , eloc ) -> Call (l, f, a, loc, doLoc eloc)
940
+ | Asm (a , b , c , d , e , loc ) -> Asm (a, b, c, d, e, loc)
941
+
942
+ (* * Change first stmt or instr eloc to synthetic. *)
943
+ let eDoChunkHead (c : chunk ): chunk =
944
+ (* ignore (Pretty.eprintf "synthesizeFirstLoc %a\n" d_chunk c); *)
945
+ let doInstrs = function
946
+ | [] -> []
947
+ | x :: xs -> eDoInstr x :: xs
948
+ in
949
+ (* must mutate stmts in order to not break refs (for gotos) *)
950
+ let rec doStmt s : unit =
951
+ s.skind < - match s.skind with
952
+ | Instr xs -> Instr (doInstrs xs)
953
+ | Return (e , loc , eloc ) -> Return (e, loc, doLoc eloc)
954
+ | Goto (s , loc ) -> Goto (s, doLoc loc)
955
+ | ComputedGoto (e , loc ) -> ComputedGoto (e, doLoc loc)
956
+ | Break loc -> Break (doLoc loc)
957
+ | Continue loc -> Continue (doLoc loc)
958
+ | If _
959
+ | Switch _
960
+ | Loop _ ->
961
+ s.skind
962
+ | Block b ->
963
+ doBlock b;
964
+ s.skind
965
+ and doBlock b =
966
+ doStmts b.bstmts
967
+ and doStmts = function
968
+ | [] -> ()
969
+ | x :: xs ->
970
+ doStmt x
971
+ in
972
+ match c.stmts, c.postins with
973
+ | [] , [] -> c
974
+ | [] , postins -> {c with postins = List. rev (doInstrs (List. rev postins))}
975
+ | stmts , postins ->
976
+ doStmts stmts;
977
+ c
935
978
end
936
979
937
980
let i2c (i : instr ) =
@@ -5983,7 +6026,7 @@ and doDecl (isglobal: bool) : A.definition -> chunk = function
5983
6026
ignore (E.log "after doDecl %a: res=%a\n"
5984
6027
d_loc !currentLoc d_chunk res);
5985
6028
*)
5986
- SynthetizeLoc. doChunkTail res
6029
+ SynthetizeLoc. eDoChunkHead ( SynthetizeLoc. doChunkTail res)
5987
6030
5988
6031
5989
6032
0 commit comments