let mk_mu m lval =
    let rec mk_mu_rec lval = match lval with
      | L0addr v -> get_var ~create:true m v ,
                    (fun obj -> obj), (fun _obj mu -> mu)
      | L0depl (lv, d2) ->
          let v, f_obj_1, f_mu_of_mu_2 = mk_mu_rec lv in
          let f_obj_2 = fun obj_0 -> match d2 with
            | Pfield f -> field_access (f_obj_1 obj_0) f
            | Pidx i -> D.acc_index (F.unwrap (f_obj_1 obj_0)) i
          in
          let f_mu_2 = fun obj_0 mu_3 -> match d2 with
            | Pfield f ->
                F.wrap (D.upd_field  (F.unwrap (f_obj_1 obj_0)) f mu_3)
            | Pidx i ->
                F.wrap (D.upd_index (F.unwrap (f_obj_1 obj_0)) i mu_3)
          in
          let f_mu_of_mu_3 = fun o mu3 -> f_mu_of_mu_2 o (f_mu_2 o mu3) in
            v, f_obj_2, f_mu_of_mu_3
      | lval -> unsupported "indirect assignment to %a" pp_loc lval
    in mk_mu_rec lval