- tuple_generate_extract follower_tuple follower_name
- <:patt< f >> <:expr< followers >>
- <:expr<
- let map =
- f load followers map shape.$lid:sf_name^"_"^name$ in $body$
- >>
+
+ match typ with
+ | PP.FListHeadPointer _ ->
+ tuple_generate_extract follower_tuple follower_name
+ <:patt< f >> <:expr< followers >>
+ <:expr<
+ (* For list head pointers, add the address of the base
+ * of this virtual structure to the map, then adjust
+ * the pointer.
+ *)
+ let offset = shape.$lid:sf_name^"_"^name^"_offset"$
+ and adj = shape.$lid:sf_name^"_"^name^"_adjustment"$ in
+ let offset = Int64.of_int offset
+ and adj = Int64.of_int adj in
+ (* 'addr' is base of the virtual struct *)
+ let addr = Int64.sub (Int64.add addr offset) adj in
+ let map = AddrMap.add addr ($str:follower_name$, 0) map in
+ let out_addr =
+ Int64.sub shape.$lid:sf_name^"_"^name$ adj in
+ let map =
+ f load followers map out_addr in
+ $body$
+ >>
+
+ | PP.FStructPointer _ ->
+ tuple_generate_extract follower_tuple follower_name
+ <:patt< f >> <:expr< followers >>
+ <:expr<
+ let map =
+ f load followers map shape.$lid:sf_name^"_"^name$ in
+ $body$
+ >>
+
+ | _ -> assert false