let lval_addr lv =
  let rec add_offset p t_pointed off = match off with
    | NoOffset -> p
    | Field (f, next) ->
        let p = M.mk_field_shift p f in add_offset p (Ctype f.ftype) next
    | Index (i,next) ->
        let t_elem = Types.ltype_array_elem t_pointed in
        let p = M.mk_index_shift p t_elem (texpr i) in add_offset p t_elem next
  in
  match lv with
    | (Var vi, off) -> add_offset (M.mk_cvar_addr vi) (Ctype vi.vtype) off
    | (Mem p, off) ->
        let typ = Cil.typeOf p in
        let t_pointed =  Types.ltype_ptr_subtype (Ctype typ) in
          add_offset (texpr p) t_pointed off