From 84cb73abe0f777521ee67cec2405c9593420d3da Mon Sep 17 00:00:00 2001 From: xleroy Date: Wed, 17 Aug 2011 13:34:12 +0000 Subject: Factor out bind_lvalue git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@1715 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e --- cparser/Transform.ml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'cparser/Transform.ml') diff --git a/cparser/Transform.ml b/cparser/Transform.ml index 4fd83aea..1cafaba4 100644 --- a/cparser/Transform.ml +++ b/cparser/Transform.ml @@ -40,6 +40,24 @@ let get_temps () = temporaries := []; List.rev temps +(* Bind a l-value to a temporary variable if it is not invariant. *) + +let rec invariant_lvalue env e = + match e.edesc with + | EVar _ -> true + | EUnop(Odot _, e1) -> invariant_lvalue env e1 + | _ -> false + +let bind_lvalue env e fn = + if invariant_lvalue env e then + fn e + else begin + let tmp = new_temp (TPtr(e.etyp, [])) in + ecomma (eassign tmp (addrof e)) + (fn {edesc = EUnop(Oderef, tmp); etyp = e.etyp}) + end + + (* Generic transformation *) let program -- cgit