sig
  type llcontext
  type llmodule
  type lltype
  type llvalue
  type lluse
  type llbasicblock
  type llbuilder
  type llmemorybuffer
  type llmdkind
  module TypeKind :
    sig
      type t =
          Void
        | Half
        | Float
        | Double
        | X86fp80
        | Fp128
        | Ppc_fp128
        | Label
        | Integer
        | Function
        | Struct
        | Array
        | Pointer
        | Vector
        | Metadata
        | X86_mmx
    end
  module Linkage :
    sig
      type t =
          External
        | Available_externally
        | Link_once
        | Link_once_odr
        | Link_once_odr_auto_hide
        | Weak
        | Weak_odr
        | Appending
        | Internal
        | Private
        | Dllimport
        | Dllexport
        | External_weak
        | Ghost
        | Common
        | Linker_private
        | Linker_private_weak
    end
  module Visibility : sig type t = Default | Hidden | Protected end
  module DLLStorageClass : sig type t = Default | DLLImport | DLLExport end
  module CallConv :
    sig
      val c : int
      val fast : int
      val cold : int
      val x86_stdcall : int
      val x86_fastcall : int
    end
  module Attribute :
    sig
      type t =
          Zext
        | Sext
        | Noreturn
        | Inreg
        | Structret
        | Nounwind
        | Noalias
        | Byval
        | Nest
        | Readnone
        | Readonly
        | Noinline
        | Alwaysinline
        | Optsize
        | Ssp
        | Sspreq
        | Alignment of int
        | Nocapture
        | Noredzone
        | Noimplicitfloat
        | Naked
        | Inlinehint
        | Stackalignment of int
        | ReturnsTwice
        | UWTable
        | NonLazyBind
    end
  module Icmp :
    sig type t = Eq | Ne | Ugt | Uge | Ult | Ule | Sgt | Sge | Slt | Sle end
  module Fcmp :
    sig
      type t =
          False
        | Oeq
        | Ogt
        | Oge
        | Olt
        | Ole
        | One
        | Ord
        | Uno
        | Ueq
        | Ugt
        | Uge
        | Ult
        | Ule
        | Une
        | True
    end
  module Opcode :
    sig
      type t =
          Invalid
        | Ret
        | Br
        | Switch
        | IndirectBr
        | Invoke
        | Invalid2
        | Unreachable
        | Add
        | FAdd
        | Sub
        | FSub
        | Mul
        | FMul
        | UDiv
        | SDiv
        | FDiv
        | URem
        | SRem
        | FRem
        | Shl
        | LShr
        | AShr
        | And
        | Or
        | Xor
        | Alloca
        | Load
        | Store
        | GetElementPtr
        | Trunc
        | ZExt
        | SExt
        | FPToUI
        | FPToSI
        | UIToFP
        | SIToFP
        | FPTrunc
        | FPExt
        | PtrToInt
        | IntToPtr
        | BitCast
        | ICmp
        | FCmp
        | PHI
        | Call
        | Select
        | UserOp1
        | UserOp2
        | VAArg
        | ExtractElement
        | InsertElement
        | ShuffleVector
        | ExtractValue
        | InsertValue
        | Fence
        | AtomicCmpXchg
        | AtomicRMW
        | Resume
        | LandingPad
    end
  module LandingPadClauseTy : sig type t = Catch | Filter end
  module ThreadLocalMode :
    sig
      type t = None | GeneralDynamic | LocalDynamic | InitialExec | LocalExec
    end
  module AtomicOrdering :
    sig
      type t =
          NotAtomic
        | Unordered
        | Monotonic
        | Invalid
        | Acquire
        | Release
        | AcqiureRelease
        | SequentiallyConsistent
    end
  module AtomicRMWBinOp :
    sig
      type t =
          Xchg
        | Add
        | Sub
        | And
        | Nand
        | Or
        | Xor
        | Max
        | Min
        | UMax
        | UMin
    end
  module ValueKind :
    sig
      type t =
          NullValue
        | Argument
        | BasicBlock
        | InlineAsm
        | MDNode
        | MDString
        | BlockAddress
        | ConstantAggregateZero
        | ConstantArray
        | ConstantDataArray
        | ConstantDataVector
        | ConstantExpr
        | ConstantFP
        | ConstantInt
        | ConstantPointerNull
        | ConstantStruct
        | ConstantVector
        | Function
        | GlobalAlias
        | GlobalVariable
        | UndefValue
        | Instruction of Llvm.Opcode.t
    end
  type ('a, 'b) llpos = At_end of '| Before of 'b
  type ('a, 'b) llrev_pos = At_start of '| After of 'b
  exception IoError of string
  val enable_pretty_stacktrace : unit -> unit
  val install_fatal_error_handler : (string -> unit) -> unit
  val reset_fatal_error_handler : unit -> unit
  val parse_command_line_options : ?overview:string -> string array -> unit
  val create_context : unit -> Llvm.llcontext
  val dispose_context : Llvm.llcontext -> unit
  val global_context : unit -> Llvm.llcontext
  val mdkind_id : Llvm.llcontext -> string -> Llvm.llmdkind
  val create_module : Llvm.llcontext -> string -> Llvm.llmodule
  val dispose_module : Llvm.llmodule -> unit
  val target_triple : Llvm.llmodule -> string
  val set_target_triple : string -> Llvm.llmodule -> unit
  val data_layout : Llvm.llmodule -> string
  val set_data_layout : string -> Llvm.llmodule -> unit
  val dump_module : Llvm.llmodule -> unit
  val print_module : string -> Llvm.llmodule -> unit
  val string_of_llmodule : Llvm.llmodule -> string
  val set_module_inline_asm : Llvm.llmodule -> string -> unit
  val module_context : Llvm.llmodule -> Llvm.llcontext
  val classify_type : Llvm.lltype -> Llvm.TypeKind.t
  val type_is_sized : Llvm.lltype -> bool
  val type_context : Llvm.lltype -> Llvm.llcontext
  val dump_type : Llvm.lltype -> unit
  val string_of_lltype : Llvm.lltype -> string
  val i1_type : Llvm.llcontext -> Llvm.lltype
  val i8_type : Llvm.llcontext -> Llvm.lltype
  val i16_type : Llvm.llcontext -> Llvm.lltype
  val i32_type : Llvm.llcontext -> Llvm.lltype
  val i64_type : Llvm.llcontext -> Llvm.lltype
  val integer_type : Llvm.llcontext -> int -> Llvm.lltype
  val integer_bitwidth : Llvm.lltype -> int
  val float_type : Llvm.llcontext -> Llvm.lltype
  val double_type : Llvm.llcontext -> Llvm.lltype
  val x86fp80_type : Llvm.llcontext -> Llvm.lltype
  val fp128_type : Llvm.llcontext -> Llvm.lltype
  val ppc_fp128_type : Llvm.llcontext -> Llvm.lltype
  val function_type : Llvm.lltype -> Llvm.lltype array -> Llvm.lltype
  val var_arg_function_type : Llvm.lltype -> Llvm.lltype array -> Llvm.lltype
  val is_var_arg : Llvm.lltype -> bool
  val return_type : Llvm.lltype -> Llvm.lltype
  val param_types : Llvm.lltype -> Llvm.lltype array
  val struct_type : Llvm.llcontext -> Llvm.lltype array -> Llvm.lltype
  val packed_struct_type : Llvm.llcontext -> Llvm.lltype array -> Llvm.lltype
  val struct_name : Llvm.lltype -> string option
  val named_struct_type : Llvm.llcontext -> string -> Llvm.lltype
  val struct_set_body : Llvm.lltype -> Llvm.lltype array -> bool -> unit
  val struct_element_types : Llvm.lltype -> Llvm.lltype array
  val is_packed : Llvm.lltype -> bool
  val is_opaque : Llvm.lltype -> bool
  val array_type : Llvm.lltype -> int -> Llvm.lltype
  val pointer_type : Llvm.lltype -> Llvm.lltype
  val qualified_pointer_type : Llvm.lltype -> int -> Llvm.lltype
  val vector_type : Llvm.lltype -> int -> Llvm.lltype
  val element_type : Llvm.lltype -> Llvm.lltype
  val array_length : Llvm.lltype -> int
  val address_space : Llvm.lltype -> int
  val vector_size : Llvm.lltype -> int
  val void_type : Llvm.llcontext -> Llvm.lltype
  val label_type : Llvm.llcontext -> Llvm.lltype
  val x86_mmx_type : Llvm.llcontext -> Llvm.lltype
  val type_by_name : Llvm.llmodule -> string -> Llvm.lltype option
  val type_of : Llvm.llvalue -> Llvm.lltype
  val classify_value : Llvm.llvalue -> Llvm.ValueKind.t
  val value_name : Llvm.llvalue -> string
  val set_value_name : string -> Llvm.llvalue -> unit
  val dump_value : Llvm.llvalue -> unit
  val string_of_llvalue : Llvm.llvalue -> string
  val replace_all_uses_with : Llvm.llvalue -> Llvm.llvalue -> unit
  val use_begin : Llvm.llvalue -> Llvm.lluse option
  val use_succ : Llvm.lluse -> Llvm.lluse option
  val user : Llvm.lluse -> Llvm.llvalue
  val used_value : Llvm.lluse -> Llvm.llvalue
  val iter_uses : (Llvm.lluse -> unit) -> Llvm.llvalue -> unit
  val fold_left_uses : ('-> Llvm.lluse -> 'a) -> '-> Llvm.llvalue -> 'a
  val fold_right_uses : (Llvm.lluse -> '-> 'a) -> Llvm.llvalue -> '-> 'a
  val operand : Llvm.llvalue -> int -> Llvm.llvalue
  val operand_use : Llvm.llvalue -> int -> Llvm.lluse
  val set_operand : Llvm.llvalue -> int -> Llvm.llvalue -> unit
  val num_operands : Llvm.llvalue -> int
  val is_constant : Llvm.llvalue -> bool
  val const_null : Llvm.lltype -> Llvm.llvalue
  val const_all_ones : Llvm.lltype -> Llvm.llvalue
  val const_pointer_null : Llvm.lltype -> Llvm.llvalue
  val undef : Llvm.lltype -> Llvm.llvalue
  val is_null : Llvm.llvalue -> bool
  val is_undef : Llvm.llvalue -> bool
  val constexpr_opcode : Llvm.llvalue -> Llvm.Opcode.t
  val has_metadata : Llvm.llvalue -> bool
  val metadata : Llvm.llvalue -> Llvm.llmdkind -> Llvm.llvalue option
  val set_metadata : Llvm.llvalue -> Llvm.llmdkind -> Llvm.llvalue -> unit
  val clear_metadata : Llvm.llvalue -> Llvm.llmdkind -> unit
  val mdstring : Llvm.llcontext -> string -> Llvm.llvalue
  val mdnode : Llvm.llcontext -> Llvm.llvalue array -> Llvm.llvalue
  val mdnull : Llvm.llcontext -> Llvm.llvalue
  val get_mdstring : Llvm.llvalue -> string option
  val get_named_metadata : Llvm.llmodule -> string -> Llvm.llvalue array
  val add_named_metadata_operand :
    Llvm.llmodule -> string -> Llvm.llvalue -> unit
  val const_int : Llvm.lltype -> int -> Llvm.llvalue
  val const_of_int64 : Llvm.lltype -> Int64.t -> bool -> Llvm.llvalue
  val int64_of_const : Llvm.llvalue -> Int64.t option
  val const_int_of_string : Llvm.lltype -> string -> int -> Llvm.llvalue
  val const_float : Llvm.lltype -> float -> Llvm.llvalue
  val float_of_const : Llvm.llvalue -> float option
  val const_float_of_string : Llvm.lltype -> string -> Llvm.llvalue
  val const_string : Llvm.llcontext -> string -> Llvm.llvalue
  val const_stringz : Llvm.llcontext -> string -> Llvm.llvalue
  val const_array : Llvm.lltype -> Llvm.llvalue array -> Llvm.llvalue
  val const_struct : Llvm.llcontext -> Llvm.llvalue array -> Llvm.llvalue
  val const_named_struct : Llvm.lltype -> Llvm.llvalue array -> Llvm.llvalue
  val const_packed_struct :
    Llvm.llcontext -> Llvm.llvalue array -> Llvm.llvalue
  val const_vector : Llvm.llvalue array -> Llvm.llvalue
  val string_of_const : Llvm.llvalue -> string option
  val const_element : Llvm.llvalue -> int -> Llvm.llvalue
  val align_of : Llvm.lltype -> Llvm.llvalue
  val size_of : Llvm.lltype -> Llvm.llvalue
  val const_neg : Llvm.llvalue -> Llvm.llvalue
  val const_nsw_neg : Llvm.llvalue -> Llvm.llvalue
  val const_nuw_neg : Llvm.llvalue -> Llvm.llvalue
  val const_fneg : Llvm.llvalue -> Llvm.llvalue
  val const_not : Llvm.llvalue -> Llvm.llvalue
  val const_add : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_nsw_add : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_nuw_add : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_fadd : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_sub : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_nsw_sub : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_nuw_sub : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_fsub : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_mul : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_nsw_mul : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_nuw_mul : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_fmul : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_udiv : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_sdiv : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_exact_sdiv : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_fdiv : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_urem : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_srem : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_frem : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_and : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_or : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_xor : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_icmp :
    Llvm.Icmp.t -> Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_fcmp :
    Llvm.Fcmp.t -> Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_shl : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_lshr : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_ashr : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_gep : Llvm.llvalue -> Llvm.llvalue array -> Llvm.llvalue
  val const_in_bounds_gep :
    Llvm.llvalue -> Llvm.llvalue array -> Llvm.llvalue
  val const_trunc : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_sext : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_zext : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_fptrunc : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_fpext : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_uitofp : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_sitofp : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_fptoui : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_fptosi : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_ptrtoint : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_inttoptr : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_bitcast : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_zext_or_bitcast : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_sext_or_bitcast : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_trunc_or_bitcast : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_pointercast : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_intcast :
    Llvm.llvalue -> Llvm.lltype -> is_signed:bool -> Llvm.llvalue
  val const_fpcast : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
  val const_select :
    Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_extractelement : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_insertelement :
    Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_shufflevector :
    Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
  val const_extractvalue : Llvm.llvalue -> int array -> Llvm.llvalue
  val const_insertvalue :
    Llvm.llvalue -> Llvm.llvalue -> int array -> Llvm.llvalue
  val const_inline_asm :
    Llvm.lltype -> string -> string -> bool -> bool -> Llvm.llvalue
  val block_address : Llvm.llvalue -> Llvm.llbasicblock -> Llvm.llvalue
  val global_parent : Llvm.llvalue -> Llvm.llmodule
  val is_declaration : Llvm.llvalue -> bool
  val linkage : Llvm.llvalue -> Llvm.Linkage.t
  val set_linkage : Llvm.Linkage.t -> Llvm.llvalue -> unit
  val section : Llvm.llvalue -> string
  val set_section : string -> Llvm.llvalue -> unit
  val visibility : Llvm.llvalue -> Llvm.Visibility.t
  val set_visibility : Llvm.Visibility.t -> Llvm.llvalue -> unit
  val dll_storage_class : Llvm.llvalue -> Llvm.DLLStorageClass.t
  val set_dll_storage_class : Llvm.DLLStorageClass.t -> Llvm.llvalue -> unit
  val alignment : Llvm.llvalue -> int
  val set_alignment : int -> Llvm.llvalue -> unit
  val declare_global : Llvm.lltype -> string -> Llvm.llmodule -> Llvm.llvalue
  val declare_qualified_global :
    Llvm.lltype -> string -> int -> Llvm.llmodule -> Llvm.llvalue
  val define_global : string -> Llvm.llvalue -> Llvm.llmodule -> Llvm.llvalue
  val define_qualified_global :
    string -> Llvm.llvalue -> int -> Llvm.llmodule -> Llvm.llvalue
  val lookup_global : string -> Llvm.llmodule -> Llvm.llvalue option
  val delete_global : Llvm.llvalue -> unit
  val global_begin :
    Llvm.llmodule -> (Llvm.llmodule, Llvm.llvalue) Llvm.llpos
  val global_succ : Llvm.llvalue -> (Llvm.llmodule, Llvm.llvalue) Llvm.llpos
  val iter_globals : (Llvm.llvalue -> unit) -> Llvm.llmodule -> unit
  val fold_left_globals :
    ('-> Llvm.llvalue -> 'a) -> '-> Llvm.llmodule -> 'a
  val global_end :
    Llvm.llmodule -> (Llvm.llmodule, Llvm.llvalue) Llvm.llrev_pos
  val global_pred :
    Llvm.llvalue -> (Llvm.llmodule, Llvm.llvalue) Llvm.llrev_pos
  val rev_iter_globals : (Llvm.llvalue -> unit) -> Llvm.llmodule -> unit
  val fold_right_globals :
    (Llvm.llvalue -> '-> 'a) -> Llvm.llmodule -> '-> 'a
  val is_global_constant : Llvm.llvalue -> bool
  val set_global_constant : bool -> Llvm.llvalue -> unit
  val global_initializer : Llvm.llvalue -> Llvm.llvalue
  val set_initializer : Llvm.llvalue -> Llvm.llvalue -> unit
  val remove_initializer : Llvm.llvalue -> unit
  val is_thread_local : Llvm.llvalue -> bool
  val set_thread_local : bool -> Llvm.llvalue -> unit
  val thread_local_mode : Llvm.llvalue -> Llvm.ThreadLocalMode.t
  val set_thread_local_mode : Llvm.ThreadLocalMode.t -> Llvm.llvalue -> unit
  val is_externally_initialized : Llvm.llvalue -> bool
  val set_externally_initialized : bool -> Llvm.llvalue -> unit
  val add_alias :
    Llvm.llmodule -> Llvm.lltype -> Llvm.llvalue -> string -> Llvm.llvalue
  val declare_function :
    string -> Llvm.lltype -> Llvm.llmodule -> Llvm.llvalue
  val define_function :
    string -> Llvm.lltype -> Llvm.llmodule -> Llvm.llvalue
  val lookup_function : string -> Llvm.llmodule -> Llvm.llvalue option
  val delete_function : Llvm.llvalue -> unit
  val function_begin :
    Llvm.llmodule -> (Llvm.llmodule, Llvm.llvalue) Llvm.llpos
  val function_succ :
    Llvm.llvalue -> (Llvm.llmodule, Llvm.llvalue) Llvm.llpos
  val iter_functions : (Llvm.llvalue -> unit) -> Llvm.llmodule -> unit
  val fold_left_functions :
    ('-> Llvm.llvalue -> 'a) -> '-> Llvm.llmodule -> 'a
  val function_end :
    Llvm.llmodule -> (Llvm.llmodule, Llvm.llvalue) Llvm.llrev_pos
  val function_pred :
    Llvm.llvalue -> (Llvm.llmodule, Llvm.llvalue) Llvm.llrev_pos
  val rev_iter_functions : (Llvm.llvalue -> unit) -> Llvm.llmodule -> unit
  val fold_right_functions :
    (Llvm.llvalue -> '-> 'a) -> Llvm.llmodule -> '-> 'a
  val is_intrinsic : Llvm.llvalue -> bool
  val function_call_conv : Llvm.llvalue -> int
  val set_function_call_conv : int -> Llvm.llvalue -> unit
  val gc : Llvm.llvalue -> string option
  val set_gc : string option -> Llvm.llvalue -> unit
  val add_function_attr : Llvm.llvalue -> Llvm.Attribute.t -> unit
  val add_target_dependent_function_attr :
    Llvm.llvalue -> string -> string -> unit
  val function_attr : Llvm.llvalue -> Llvm.Attribute.t list
  val remove_function_attr : Llvm.llvalue -> Llvm.Attribute.t -> unit
  val params : Llvm.llvalue -> Llvm.llvalue array
  val param : Llvm.llvalue -> int -> Llvm.llvalue
  val param_attr : Llvm.llvalue -> Llvm.Attribute.t list
  val param_parent : Llvm.llvalue -> Llvm.llvalue
  val param_begin : Llvm.llvalue -> (Llvm.llvalue, Llvm.llvalue) Llvm.llpos
  val param_succ : Llvm.llvalue -> (Llvm.llvalue, Llvm.llvalue) Llvm.llpos
  val iter_params : (Llvm.llvalue -> unit) -> Llvm.llvalue -> unit
  val fold_left_params :
    ('-> Llvm.llvalue -> 'a) -> '-> Llvm.llvalue -> 'a
  val param_end : Llvm.llvalue -> (Llvm.llvalue, Llvm.llvalue) Llvm.llrev_pos
  val param_pred :
    Llvm.llvalue -> (Llvm.llvalue, Llvm.llvalue) Llvm.llrev_pos
  val rev_iter_params : (Llvm.llvalue -> unit) -> Llvm.llvalue -> unit
  val fold_right_params :
    (Llvm.llvalue -> '-> 'a) -> Llvm.llvalue -> '-> 'a
  val add_param_attr : Llvm.llvalue -> Llvm.Attribute.t -> unit
  val remove_param_attr : Llvm.llvalue -> Llvm.Attribute.t -> unit
  val set_param_alignment : Llvm.llvalue -> int -> unit
  val basic_blocks : Llvm.llvalue -> Llvm.llbasicblock array
  val entry_block : Llvm.llvalue -> Llvm.llbasicblock
  val delete_block : Llvm.llbasicblock -> unit
  val remove_block : Llvm.llbasicblock -> unit
  val move_block_before : Llvm.llbasicblock -> Llvm.llbasicblock -> unit
  val move_block_after : Llvm.llbasicblock -> Llvm.llbasicblock -> unit
  val append_block :
    Llvm.llcontext -> string -> Llvm.llvalue -> Llvm.llbasicblock
  val insert_block :
    Llvm.llcontext -> string -> Llvm.llbasicblock -> Llvm.llbasicblock
  val block_parent : Llvm.llbasicblock -> Llvm.llvalue
  val block_begin :
    Llvm.llvalue -> (Llvm.llvalue, Llvm.llbasicblock) Llvm.llpos
  val block_succ :
    Llvm.llbasicblock -> (Llvm.llvalue, Llvm.llbasicblock) Llvm.llpos
  val iter_blocks : (Llvm.llbasicblock -> unit) -> Llvm.llvalue -> unit
  val fold_left_blocks :
    ('-> Llvm.llbasicblock -> 'a) -> '-> Llvm.llvalue -> 'a
  val block_end :
    Llvm.llvalue -> (Llvm.llvalue, Llvm.llbasicblock) Llvm.llrev_pos
  val block_pred :
    Llvm.llbasicblock -> (Llvm.llvalue, Llvm.llbasicblock) Llvm.llrev_pos
  val block_terminator : Llvm.llbasicblock -> Llvm.llvalue option
  val rev_iter_blocks : (Llvm.llbasicblock -> unit) -> Llvm.llvalue -> unit
  val fold_right_blocks :
    (Llvm.llbasicblock -> '-> 'a) -> Llvm.llvalue -> '-> 'a
  val value_of_block : Llvm.llbasicblock -> Llvm.llvalue
  val value_is_block : Llvm.llvalue -> bool
  val block_of_value : Llvm.llvalue -> Llvm.llbasicblock
  val instr_parent : Llvm.llvalue -> Llvm.llbasicblock
  val delete_instruction : Llvm.llvalue -> unit
  val instr_begin :
    Llvm.llbasicblock -> (Llvm.llbasicblock, Llvm.llvalue) Llvm.llpos
  val instr_succ :
    Llvm.llvalue -> (Llvm.llbasicblock, Llvm.llvalue) Llvm.llpos
  val iter_instrs : (Llvm.llvalue -> unit) -> Llvm.llbasicblock -> unit
  val fold_left_instrs :
    ('-> Llvm.llvalue -> 'a) -> '-> Llvm.llbasicblock -> 'a
  val instr_end :
    Llvm.llbasicblock -> (Llvm.llbasicblock, Llvm.llvalue) Llvm.llrev_pos
  val instr_pred :
    Llvm.llvalue -> (Llvm.llbasicblock, Llvm.llvalue) Llvm.llrev_pos
  val fold_right_instrs :
    (Llvm.llvalue -> '-> 'a) -> Llvm.llbasicblock -> '-> 'a
  val instr_opcode : Llvm.llvalue -> Llvm.Opcode.t
  val icmp_predicate : Llvm.llvalue -> Llvm.Icmp.t option
  val fcmp_predicate : Llvm.llvalue -> Llvm.Fcmp.t option
  val instr_clone : Llvm.llvalue -> Llvm.llvalue
  val instruction_call_conv : Llvm.llvalue -> int
  val set_instruction_call_conv : int -> Llvm.llvalue -> unit
  val add_instruction_param_attr :
    Llvm.llvalue -> int -> Llvm.Attribute.t -> unit
  val remove_instruction_param_attr :
    Llvm.llvalue -> int -> Llvm.Attribute.t -> unit
  val is_tail_call : Llvm.llvalue -> bool
  val set_tail_call : bool -> Llvm.llvalue -> unit
  val is_volatile : Llvm.llvalue -> bool
  val set_volatile : bool -> Llvm.llvalue -> unit
  val is_terminator : Llvm.llvalue -> bool
  val successor : Llvm.llvalue -> int -> Llvm.llbasicblock
  val set_successor : Llvm.llvalue -> int -> Llvm.llbasicblock -> unit
  val num_successors : Llvm.llvalue -> int
  val successors : Llvm.llvalue -> Llvm.llbasicblock array
  val iter_successors : (Llvm.llbasicblock -> unit) -> Llvm.llvalue -> unit
  val fold_successors :
    (Llvm.llbasicblock -> '-> 'a) -> Llvm.llvalue -> '-> 'a
  val is_conditional : Llvm.llvalue -> bool
  val condition : Llvm.llvalue -> Llvm.llvalue
  val set_condition : Llvm.llvalue -> Llvm.llvalue -> unit
  val get_branch :
    Llvm.llvalue ->
    [ `Conditional of Llvm.llvalue * Llvm.llbasicblock * Llvm.llbasicblock
    | `Unconditional of Llvm.llbasicblock ] option
  val add_incoming : Llvm.llvalue * Llvm.llbasicblock -> Llvm.llvalue -> unit
  val incoming : Llvm.llvalue -> (Llvm.llvalue * Llvm.llbasicblock) list
  val builder : Llvm.llcontext -> Llvm.llbuilder
  val builder_at :
    Llvm.llcontext ->
    (Llvm.llbasicblock, Llvm.llvalue) Llvm.llpos -> Llvm.llbuilder
  val builder_before : Llvm.llcontext -> Llvm.llvalue -> Llvm.llbuilder
  val builder_at_end : Llvm.llcontext -> Llvm.llbasicblock -> Llvm.llbuilder
  val position_builder :
    (Llvm.llbasicblock, Llvm.llvalue) Llvm.llpos -> Llvm.llbuilder -> unit
  val position_before : Llvm.llvalue -> Llvm.llbuilder -> unit
  val position_at_end : Llvm.llbasicblock -> Llvm.llbuilder -> unit
  val insertion_block : Llvm.llbuilder -> Llvm.llbasicblock
  val insert_into_builder : Llvm.llvalue -> string -> Llvm.llbuilder -> unit
  val set_current_debug_location : Llvm.llbuilder -> Llvm.llvalue -> unit
  val clear_current_debug_location : Llvm.llbuilder -> unit
  val current_debug_location : Llvm.llbuilder -> Llvm.llvalue option
  val set_inst_debug_location : Llvm.llbuilder -> Llvm.llvalue -> unit
  val build_ret_void : Llvm.llbuilder -> Llvm.llvalue
  val build_ret : Llvm.llvalue -> Llvm.llbuilder -> Llvm.llvalue
  val build_aggregate_ret :
    Llvm.llvalue array -> Llvm.llbuilder -> Llvm.llvalue
  val build_br : Llvm.llbasicblock -> Llvm.llbuilder -> Llvm.llvalue
  val build_cond_br :
    Llvm.llvalue ->
    Llvm.llbasicblock -> Llvm.llbasicblock -> Llvm.llbuilder -> Llvm.llvalue
  val build_switch :
    Llvm.llvalue ->
    Llvm.llbasicblock -> int -> Llvm.llbuilder -> Llvm.llvalue
  val build_malloc : Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_array_malloc :
    Llvm.lltype -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_free : Llvm.llvalue -> Llvm.llbuilder -> Llvm.llvalue
  val add_case : Llvm.llvalue -> Llvm.llvalue -> Llvm.llbasicblock -> unit
  val switch_default_dest : Llvm.llvalue -> Llvm.llbasicblock
  val build_indirect_br :
    Llvm.llvalue -> int -> Llvm.llbuilder -> Llvm.llvalue
  val add_destination : Llvm.llvalue -> Llvm.llbasicblock -> unit
  val build_invoke :
    Llvm.llvalue ->
    Llvm.llvalue array ->
    Llvm.llbasicblock ->
    Llvm.llbasicblock -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_landingpad :
    Llvm.lltype ->
    Llvm.llvalue -> int -> string -> Llvm.llbuilder -> Llvm.llvalue
  val set_cleanup : Llvm.llvalue -> bool -> unit
  val add_clause : Llvm.llvalue -> Llvm.llvalue -> unit
  val build_resume : Llvm.llvalue -> Llvm.llbuilder -> Llvm.llvalue
  val build_unreachable : Llvm.llbuilder -> Llvm.llvalue
  val build_add :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_nsw_add :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_nuw_add :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_fadd :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_sub :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_nsw_sub :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_nuw_sub :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_fsub :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_mul :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_nsw_mul :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_nuw_mul :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_fmul :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_udiv :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_sdiv :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_exact_sdiv :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_fdiv :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_urem :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_srem :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_frem :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_shl :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_lshr :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_ashr :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_and :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_or :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_xor :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_neg : Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_nsw_neg :
    Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_nuw_neg :
    Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_fneg : Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_not : Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_alloca : Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_array_alloca :
    Llvm.lltype -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_load : Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_store :
    Llvm.llvalue -> Llvm.llvalue -> Llvm.llbuilder -> Llvm.llvalue
  val build_atomicrmw :
    Llvm.AtomicRMWBinOp.t ->
    Llvm.llvalue ->
    Llvm.llvalue ->
    Llvm.AtomicOrdering.t -> bool -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_gep :
    Llvm.llvalue ->
    Llvm.llvalue array -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_in_bounds_gep :
    Llvm.llvalue ->
    Llvm.llvalue array -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_struct_gep :
    Llvm.llvalue -> int -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_global_string :
    string -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_global_stringptr :
    string -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_trunc :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_zext :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_sext :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_fptoui :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_fptosi :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_uitofp :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_sitofp :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_fptrunc :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_fpext :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_ptrtoint :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_inttoptr :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_bitcast :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_zext_or_bitcast :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_sext_or_bitcast :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_trunc_or_bitcast :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_pointercast :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_intcast :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_fpcast :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_icmp :
    Llvm.Icmp.t ->
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_fcmp :
    Llvm.Fcmp.t ->
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_phi :
    (Llvm.llvalue * Llvm.llbasicblock) list ->
    string -> Llvm.llbuilder -> Llvm.llvalue
  val build_empty_phi :
    Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_call :
    Llvm.llvalue ->
    Llvm.llvalue array -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_select :
    Llvm.llvalue ->
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_va_arg :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_extractelement :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_insertelement :
    Llvm.llvalue ->
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_shufflevector :
    Llvm.llvalue ->
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_extractvalue :
    Llvm.llvalue -> int -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_insertvalue :
    Llvm.llvalue ->
    Llvm.llvalue -> int -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_is_null :
    Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_is_not_null :
    Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  val build_ptrdiff :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
  module MemoryBuffer :
    sig
      val of_file : string -> Llvm.llmemorybuffer
      val of_stdin : unit -> Llvm.llmemorybuffer
      val of_string : ?name:string -> string -> Llvm.llmemorybuffer
      val as_string : Llvm.llmemorybuffer -> string
      val dispose : Llvm.llmemorybuffer -> unit
    end
  module PassManager :
    sig
      type 'a t
      type any = [ `Function | `Module ]
      val create : unit -> [ `Module ] Llvm.PassManager.t
      val create_function : Llvm.llmodule -> [ `Function ] Llvm.PassManager.t
      val run_module :
        Llvm.llmodule -> [ `Module ] Llvm.PassManager.t -> bool
      val initialize : [ `Function ] Llvm.PassManager.t -> bool
      val run_function :
        Llvm.llvalue -> [ `Function ] Llvm.PassManager.t -> bool
      val finalize : [ `Function ] Llvm.PassManager.t -> bool
      val dispose : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
    end
end