method vfunc f =
curFundec := f;
let var v =
if isStructOrUnionType v.vtype then
let newv = copyVarinfo v (unique_name ("v_" ^ v.vname)) in
newv.vtype <- mkTRef newv.vtype;
v.vformal <- false;
let rhs =
new_exp(Lval
(mkMem (new_exp(Lval(Var newv,NoOffset))) NoOffset))
in
let copy = mkassign_statement (Var v,NoOffset) rhs v.vdecl in
add_pending_statement ~beginning:true copy;
pairs := (v,newv) :: !pairs;
[v], newv
else
[], v
in
let locvl,formvl = List.split (List.map var f.sformals) in
let locvl = List.flatten locvl in
f.slocals <- locvl @ f.slocals;
setFormals f formvl;
let rt = getReturnType f.svar.vtype in
if isStructOrUnionType rt then
let rv = makeTempVar !curFundec rt in
return_var := Some rv;
VarinfoHashtbl.add return_vars rv ()
else
return_var := None;
new_return_type :=
if isStructOrUnionType rt then Some(mkTRef rt) else None;
let rt = if isStructOrUnionType rt then mkTRef rt else rt in
setReturnType f rt;
DoChildren