|
@@ -47,6 +47,7 @@ type block = {
|
|
|
mutable bneed : ISet.t;
|
|
mutable bneed : ISet.t;
|
|
|
mutable bneed_all : ISet.t option;
|
|
mutable bneed_all : ISet.t option;
|
|
|
mutable bwrite : (int, int) PMap.t;
|
|
mutable bwrite : (int, int) PMap.t;
|
|
|
|
|
+ mutable btrap : int list;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
type control =
|
|
type control =
|
|
@@ -54,6 +55,7 @@ type control =
|
|
|
| CJCond of int
|
|
| CJCond of int
|
|
|
| CJAlways of int
|
|
| CJAlways of int
|
|
|
| CTry of int
|
|
| CTry of int
|
|
|
|
|
+ | CCatch
|
|
|
| CSwitch of int array
|
|
| CSwitch of int array
|
|
|
| CRet
|
|
| CRet
|
|
|
| CThrow
|
|
| CThrow
|
|
@@ -75,6 +77,8 @@ let control = function
|
|
|
CSwitch cases
|
|
CSwitch cases
|
|
|
| OTrap (_,d) ->
|
|
| OTrap (_,d) ->
|
|
|
CTry d
|
|
CTry d
|
|
|
|
|
+ | OEndTrap _ ->
|
|
|
|
|
+ CCatch
|
|
|
| _ ->
|
|
| _ ->
|
|
|
CNo
|
|
CNo
|
|
|
|
|
|
|
@@ -460,7 +464,7 @@ let code_graph (f:fundecl) =
|
|
|
| CJAlways d | CJCond d -> Hashtbl.replace all_blocks (i + 1 + d) true
|
|
| CJAlways d | CJCond d -> Hashtbl.replace all_blocks (i + 1 + d) true
|
|
|
| _ -> ()
|
|
| _ -> ()
|
|
|
done;
|
|
done;
|
|
|
- let rec make_block pos =
|
|
|
|
|
|
|
+ let rec make_block trapl pos =
|
|
|
try
|
|
try
|
|
|
Hashtbl.find blocks_pos pos
|
|
Hashtbl.find blocks_pos pos
|
|
|
with Not_found ->
|
|
with Not_found ->
|
|
@@ -474,11 +478,12 @@ let code_graph (f:fundecl) =
|
|
|
bneed = ISet.empty;
|
|
bneed = ISet.empty;
|
|
|
bwrite = PMap.empty;
|
|
bwrite = PMap.empty;
|
|
|
bneed_all = None;
|
|
bneed_all = None;
|
|
|
|
|
+ btrap = trapl;
|
|
|
} in
|
|
} in
|
|
|
Hashtbl.add blocks_pos pos b;
|
|
Hashtbl.add blocks_pos pos b;
|
|
|
let rec loop i =
|
|
let rec loop i =
|
|
|
- let goto d =
|
|
|
|
|
- let b2 = make_block (i + 1 + d) in
|
|
|
|
|
|
|
+ let goto ?(tl=b.btrap) d =
|
|
|
|
|
+ let b2 = make_block tl (i + 1 + d) in
|
|
|
b2.bprev <- b :: b2.bprev;
|
|
b2.bprev <- b :: b2.bprev;
|
|
|
b2
|
|
b2
|
|
|
in
|
|
in
|
|
@@ -488,7 +493,8 @@ let code_graph (f:fundecl) =
|
|
|
end else match control (op i) with
|
|
end else match control (op i) with
|
|
|
| CNo ->
|
|
| CNo ->
|
|
|
loop (i + 1)
|
|
loop (i + 1)
|
|
|
- | CRet | CThrow ->
|
|
|
|
|
|
|
+ | CRet ->
|
|
|
|
|
+ assert(b.btrap = []);
|
|
|
b.bend <- i
|
|
b.bend <- i
|
|
|
| CJAlways d ->
|
|
| CJAlways d ->
|
|
|
b.bend <- i;
|
|
b.bend <- i;
|
|
@@ -496,9 +502,27 @@ let code_graph (f:fundecl) =
|
|
|
| CSwitch pl ->
|
|
| CSwitch pl ->
|
|
|
b.bend <- i;
|
|
b.bend <- i;
|
|
|
b.bnext <- goto 0 :: Array.to_list (Array.map goto pl)
|
|
b.bnext <- goto 0 :: Array.to_list (Array.map goto pl)
|
|
|
- | CJCond d | CTry d ->
|
|
|
|
|
|
|
+ | CJCond d ->
|
|
|
b.bend <- i;
|
|
b.bend <- i;
|
|
|
b.bnext <- [goto 0; goto d];
|
|
b.bnext <- [goto 0; goto d];
|
|
|
|
|
+ | CTry d ->
|
|
|
|
|
+ b.bend <- i;
|
|
|
|
|
+ b.bnext <- [goto ~tl:((i+1+d)::b.btrap) 0; goto d];
|
|
|
|
|
+ | CThrow ->
|
|
|
|
|
+ b.bend <- i;
|
|
|
|
|
+ match b.btrap with
|
|
|
|
|
+ | [] -> ()
|
|
|
|
|
+ | [p] -> b.bnext <- [goto ~tl:[] (p-1-i)];
|
|
|
|
|
+ | p :: pl -> b.bnext <- [goto ~tl:pl (p-1-i)];
|
|
|
|
|
+ ;
|
|
|
|
|
+ | CCatch ->
|
|
|
|
|
+ let p, pl = match b.btrap with
|
|
|
|
|
+ | [] -> assert false;
|
|
|
|
|
+ | [p] -> p, []
|
|
|
|
|
+ | p :: pl -> p, pl
|
|
|
|
|
+ in
|
|
|
|
|
+ b.bend <- i;
|
|
|
|
|
+ b.bnext <- [goto ~tl:pl 0; goto ~tl:pl (p-1-i)];
|
|
|
| CLabel ->
|
|
| CLabel ->
|
|
|
b.bloop <- true;
|
|
b.bloop <- true;
|
|
|
loop (i + 1)
|
|
loop (i + 1)
|
|
@@ -506,7 +530,7 @@ let code_graph (f:fundecl) =
|
|
|
loop pos;
|
|
loop pos;
|
|
|
b
|
|
b
|
|
|
in
|
|
in
|
|
|
- blocks_pos, make_block 0
|
|
|
|
|
|
|
+ blocks_pos, make_block [] 0
|
|
|
|
|
|
|
|
type rctx = {
|
|
type rctx = {
|
|
|
r_root : block;
|
|
r_root : block;
|