aboutsummaryrefslogtreecommitdiffstats
path: root/cparser/Transform.ml
diff options
context:
space:
mode:
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 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