let record_usage env loc op =
let uid = match loc with
| GlobalVar(uid, _) -> uid
| LocalVar(uid, _, _) -> uid
in let props =
try Hashtbl.find env.varprops uid
with Not_found ->
{ written_after_declared = false;
read_after_declared = false;
declaration_loc = ("", 0);
}
in let new_props =
match op with
| ReadOp ->
{ written_after_declared = props.written_after_declared;
read_after_declared = true;
declaration_loc = props.declaration_loc;
}
| WriteOp ->
{ written_after_declared = true;
read_after_declared = props.read_after_declared;
declaration_loc = props.declaration_loc;
}
| DeclareOp(loc) ->
(match props.declaration_loc with
| ("", 0) ->
{ written_after_declared = false;
read_after_declared = props.read_after_declared;
declaration_loc = loc
}
| _ ->
{ written_after_declared = true;
read_after_declared = props.read_after_declared;
declaration_loc = props.declaration_loc
})
| DeclareWriteOp(loc) ->
match props.declaration_loc with
| ("", 0) ->
{ written_after_declared = true;
read_after_declared = true;
declaration_loc = loc
}
| _ ->
{ written_after_declared = true;
read_after_declared = true;
declaration_loc = props.declaration_loc
}
in Hashtbl.replace env.varprops uid new_props