functor (M : sig type t val default : unit -> Value_perf.t end->
  sig
    module Hashtbl :
      sig
        type key = Call_site.t
        type 'a t = 'Hashtbl.Make(Call_site).t
        val create : int -> 'a t
        val clear : 'a t -> unit
        val reset : 'a t -> unit
        val copy : 'a t -> 'a t
        val add : 'a t -> key -> '-> unit
        val remove : 'a t -> key -> unit
        val find : 'a t -> key -> 'a
        val find_all : 'a t -> key -> 'a list
        val replace : 'a t -> key -> '-> unit
        val mem : 'a t -> key -> bool
        val iter : (key -> '-> unit) -> 'a t -> unit
        val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
        val length : 'a t -> int
        val stats : 'a t -> Hashtbl.statistics
      end
    type elt = {
      mutable self : M.t;
      subtree : Value_perf.Imperative_callstack_trie.t;
    }
    and t =
        Value_perf.Imperative_callstack_trie.elt
        Value_perf.Imperative_callstack_trie.Hashtbl.t
    val empty : unit -> 'Value_perf.Imperative_callstack_trie.Hashtbl.t
    val reset : 'Value_perf.Imperative_callstack_trie.Hashtbl.t -> unit
    val create_node : M.t -> Value_perf.Imperative_callstack_trie.elt
    val find_subtree :
      Value_perf.Imperative_callstack_trie.elt
      Value_perf.Imperative_callstack_trie.Hashtbl.t ->
      Value_perf.Imperative_callstack_trie.Hashtbl.key list ->
      Value_perf.Imperative_callstack_trie.elt
    val find :
      Value_perf.Imperative_callstack_trie.elt
      Value_perf.Imperative_callstack_trie.Hashtbl.t ->
      Value_perf.Imperative_callstack_trie.Hashtbl.key list -> M.t
    val _add :
      Value_perf.Imperative_callstack_trie.elt
      Value_perf.Imperative_callstack_trie.Hashtbl.t ->
      Value_perf.Imperative_callstack_trie.Hashtbl.key list -> M.t -> unit
    val _update :
      Value_perf.Imperative_callstack_trie.elt
      Value_perf.Imperative_callstack_trie.Hashtbl.t ->
      Value_perf.Imperative_callstack_trie.Hashtbl.key list ->
      (M.t -> M.t) -> unit
  end