sig
  type 'a t
  type any = [ `Function | `Module ]
  external create : unit -> [ `Module ] Llvm.PassManager.t
    = "llvm_passmanager_create"
  external create_function :
    Llvm.llmodule -> [ `Function ] Llvm.PassManager.t
    = "LLVMCreateFunctionPassManager"
  external run_module :
    Llvm.llmodule -> [ `Module ] Llvm.PassManager.t -> bool
    = "llvm_passmanager_run_module"
  external initialize : [ `Function ] Llvm.PassManager.t -> bool
    = "llvm_passmanager_initialize"
  external run_function :
    Llvm.llvalue -> [ `Function ] Llvm.PassManager.t -> bool
    = "llvm_passmanager_run_function"
  external finalize : [ `Function ] Llvm.PassManager.t -> bool
    = "llvm_passmanager_finalize"
  external dispose : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
    = "llvm_passmanager_dispose"
end