let get_loop_stmt kf stmt =
let rec is_in_blk b = List.exists is_in_stmt b.bstmts
and is_in_stmt s = if s.sid = stmt.sid then true
else match s.skind with
| If (_, b1, b2,_) -> is_in_blk b1 || is_in_blk b2
| Switch (_, b, _, _) | Block b -> is_in_blk b
| UnspecifiedSequence seq ->
let b = Cil.block_from_unspecified_sequence seq in
is_in_blk b
| Loop (_, b, _, _, _) -> is_in_blk b
| _ -> false
and find_loop_in_blk blk = find_loop_in_stmts blk.bstmts
and find_loop_in_stmts l = match l with
| [] -> None
| s::tl ->
(match find_loop_in_stmt s with Some l -> Some l
| None -> find_loop_in_stmts tl)
and find_loop_in_stmt s = match s.skind with
| (Loop _) -> if is_in_stmt s then Some s else None
| If (_, b1, b2,_) ->
(match find_loop_in_blk b1 with Some l -> Some l
| None -> find_loop_in_blk b2)
| Switch (_, b, _, _) | Block b -> find_loop_in_blk b
| UnspecifiedSequence seq ->
let b = Cil.block_from_unspecified_sequence seq in
find_loop_in_blk b
| _ -> None
in let f = Kernel_function.get_definition kf in
find_loop_in_blk f.sbody