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