summaryrefslogtreecommitdiff
path: root/cparser/Transform.ml
diff options
context:
space:
mode:
authorGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2011-08-17 13:34:12 +0000
committerGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2011-08-17 13:34:12 +0000
commit84cb73abe0f777521ee67cec2405c9593420d3da (patch)
tree132aaf0717d782d9d4e0bdb87eff14e55bd29b6d /cparser/Transform.ml
parent8c2d07d888779c2dbe610da15cac5bae39e17fd0 (diff)
Factor out bind_lvalue
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@1715 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'cparser/Transform.ml')
-rw-r--r--cparser/Transform.ml18
1 files changed, 18 insertions, 0 deletions
diff --git a/cparser/Transform.ml b/cparser/Transform.ml
index 4fd83ae..1cafaba 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