functor (D : Mdata.S->
  sig
    module Hlib :
      sig
        val addr : D.name -> D.pointer
        val shift_pointer :
          D.pointer -> Formula.integer D.F.term -> D.pointer
        val shift_field : D.pointer -> D.name -> D.pointer
        val shift_ufield : D.pointer -> D.name -> D.pointer
        val shift_index : D.pointer -> Formula.integer D.F.term -> D.pointer
        val havoc_index : D.array -> Formula.integer D.F.term -> D.array
        val havoc_field : D.record -> D.name -> D.record
        val havoc_ufield : D.urecord -> D.name -> D.urecord
        val base : D.pointer -> D.pointer
        val block_length : D.pointer -> Formula.integer D.F.term
        val valid_pointer : D.pointer -> D.F.pred
        val valid_range : D.pointer -> D.set -> D.F.pred
        val separated : D.pointer -> D.pointer -> D.F.pred
        val array_length : D.pointer -> Formula.integer D.F.term
      end
    val get_array_length : Cil_types.typ -> Formula.integer D.F.term option
    val mk_v_array_length : D.pointer -> Formula.integer D.F.term -> D.F.pred
    module Globals :
      sig
        type t = Cil_types.varinfo
        val define : t -> unit
        val get_definition : t -> D.F.pred Formula.declaration
        val on_definition :
          (t -> D.F.pred Formula.declaration -> unit) -> unit
      end
  end