sig
  type llcontext
  type llmodule
  type lltype
  type lltypehandle
  type llvalue
  type lluse
  type llbasicblock
  type llbuilder
  type llmemorybuffer
  module TypeKind :
    sig
      type t =
          Void
        | Float
        | Double
        | X86fp80
        | Fp128
        | Ppc_fp128
        | Label
        | Integer
        | Function
        | Struct
        | Array
        | Pointer
        | Opaque
        | Vector
        | Metadata
    end
  module Linkage :
    sig
      type t =
          External
        | Available_externally
        | Link_once
        | Link_once_odr
        | Weak
        | Weak_odr
        | Appending
        | Internal
        | Private
        | Dllimport
        | Dllexport
        | External_weak
        | Ghost
        | Common
        | Linker_private
    end
  module Visibility : sig type t = Default | Hidden | Protected 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
    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
  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
  external create_context : unit -> Llvm.llcontext = "llvm_create_context"
  external dispose_context : Llvm.llcontext -> unit = "llvm_dispose_context"
  external global_context : unit -> Llvm.llcontext = "llvm_global_context"
  external mdkind_id : Llvm.llcontext -> string -> int = "llvm_mdkind_id"
  external create_module : Llvm.llcontext -> string -> Llvm.llmodule
    = "llvm_create_module"
  external dispose_module : Llvm.llmodule -> unit = "llvm_dispose_module"
  external target_triple : Llvm.llmodule -> string = "llvm_target_triple"
  external set_target_triple : string -> Llvm.llmodule -> unit
    = "llvm_set_target_triple"
  external data_layout : Llvm.llmodule -> string = "llvm_data_layout"
  external set_data_layout : string -> Llvm.llmodule -> unit
    = "llvm_set_data_layout"
  external define_type_name : string -> Llvm.lltype -> Llvm.llmodule -> bool
    = "llvm_add_type_name"
  external delete_type_name : string -> Llvm.llmodule -> unit
    = "llvm_delete_type_name"
  external type_by_name : Llvm.llmodule -> string -> Llvm.lltype option
    = "llvm_type_by_name"
  external dump_module : Llvm.llmodule -> unit = "llvm_dump_module"
  external set_module_inline_asm : Llvm.llmodule -> string -> unit
    = "llvm_set_module_inline_asm"
  external classify_type : Llvm.lltype -> Llvm.TypeKind.t
    = "llvm_classify_type"
  external type_context : Llvm.lltype -> Llvm.llcontext = "llvm_type_context"
  val string_of_lltype : Llvm.lltype -> string
  external i1_type : Llvm.llcontext -> Llvm.lltype = "llvm_i1_type"
  external i8_type : Llvm.llcontext -> Llvm.lltype = "llvm_i8_type"
  external i16_type : Llvm.llcontext -> Llvm.lltype = "llvm_i16_type"
  external i32_type : Llvm.llcontext -> Llvm.lltype = "llvm_i32_type"
  external i64_type : Llvm.llcontext -> Llvm.lltype = "llvm_i64_type"
  external integer_type : Llvm.llcontext -> int -> Llvm.lltype
    = "llvm_integer_type"
  external integer_bitwidth : Llvm.lltype -> int = "llvm_integer_bitwidth"
  external float_type : Llvm.llcontext -> Llvm.lltype = "llvm_float_type"
  external double_type : Llvm.llcontext -> Llvm.lltype = "llvm_double_type"
  external x86fp80_type : Llvm.llcontext -> Llvm.lltype = "llvm_x86fp80_type"
  external fp128_type : Llvm.llcontext -> Llvm.lltype = "llvm_fp128_type"
  external ppc_fp128_type : Llvm.llcontext -> Llvm.lltype
    = "llvm_ppc_fp128_type"
  external function_type : Llvm.lltype -> Llvm.lltype array -> Llvm.lltype
    = "llvm_function_type"
  external var_arg_function_type :
    Llvm.lltype -> Llvm.lltype array -> Llvm.lltype
    = "llvm_var_arg_function_type"
  external is_var_arg : Llvm.lltype -> bool = "llvm_is_var_arg"
  external return_type : Llvm.lltype -> Llvm.lltype = "LLVMGetReturnType"
  external param_types : Llvm.lltype -> Llvm.lltype array
    = "llvm_param_types"
  external struct_type : Llvm.llcontext -> Llvm.lltype array -> Llvm.lltype
    = "llvm_struct_type"
  external packed_struct_type :
    Llvm.llcontext -> Llvm.lltype array -> Llvm.lltype
    = "llvm_packed_struct_type"
  external struct_element_types : Llvm.lltype -> Llvm.lltype array
    = "llvm_struct_element_types"
  external is_packed : Llvm.lltype -> bool = "llvm_is_packed"
  external array_type : Llvm.lltype -> int -> Llvm.lltype = "llvm_array_type"
  external pointer_type : Llvm.lltype -> Llvm.lltype = "llvm_pointer_type"
  external qualified_pointer_type : Llvm.lltype -> int -> Llvm.lltype
    = "llvm_qualified_pointer_type"
  external vector_type : Llvm.lltype -> int -> Llvm.lltype
    = "llvm_vector_type"
  external element_type : Llvm.lltype -> Llvm.lltype = "LLVMGetElementType"
  external array_length : Llvm.lltype -> int = "llvm_array_length"
  external address_space : Llvm.lltype -> int = "llvm_address_space"
  external vector_size : Llvm.lltype -> int = "llvm_vector_size"
  external opaque_type : Llvm.llcontext -> Llvm.lltype = "llvm_opaque_type"
  external void_type : Llvm.llcontext -> Llvm.lltype = "llvm_void_type"
  external label_type : Llvm.llcontext -> Llvm.lltype = "llvm_label_type"
  external handle_to_type : Llvm.lltype -> Llvm.lltypehandle
    = "llvm_handle_to_type"
  external type_of_handle : Llvm.lltypehandle -> Llvm.lltype
    = "llvm_type_of_handle"
  external refine_type : Llvm.lltype -> Llvm.lltype -> unit
    = "llvm_refine_type"
  external type_of : Llvm.llvalue -> Llvm.lltype = "llvm_type_of"
  external value_name : Llvm.llvalue -> string = "llvm_value_name"
  external set_value_name : string -> Llvm.llvalue -> unit
    = "llvm_set_value_name"
  external dump_value : Llvm.llvalue -> unit = "llvm_dump_value"
  external replace_all_uses_with : Llvm.llvalue -> Llvm.llvalue -> unit
    = "LLVMReplaceAllUsesWith"
  external use_begin : Llvm.llvalue -> Llvm.lluse option = "llvm_use_begin"
  external use_succ : Llvm.lluse -> Llvm.lluse option = "llvm_use_succ"
  external user : Llvm.lluse -> Llvm.llvalue = "llvm_user"
  external used_value : Llvm.lluse -> Llvm.llvalue = "llvm_used_value"
  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
  external operand : Llvm.llvalue -> int -> Llvm.llvalue = "llvm_operand"
  external set_operand : Llvm.llvalue -> int -> Llvm.llvalue -> unit
    = "llvm_set_operand"
  external num_operands : Llvm.llvalue -> int = "llvm_num_operands"
  external is_constant : Llvm.llvalue -> bool = "llvm_is_constant"
  external const_null : Llvm.lltype -> Llvm.llvalue = "LLVMConstNull"
  external const_all_ones : Llvm.lltype -> Llvm.llvalue = "LLVMConstAllOnes"
  external const_pointer_null : Llvm.lltype -> Llvm.llvalue
    = "LLVMConstPointerNull"
  external undef : Llvm.lltype -> Llvm.llvalue = "LLVMGetUndef"
  external is_null : Llvm.llvalue -> bool = "llvm_is_null"
  external is_undef : Llvm.llvalue -> bool = "llvm_is_undef"
  external has_metadata : Llvm.llvalue -> bool = "llvm_has_metadata"
  external metadata : Llvm.llvalue -> int -> Llvm.llvalue option
    = "llvm_metadata"
  external set_metadata : Llvm.llvalue -> int -> Llvm.llvalue -> unit
    = "llvm_set_metadata"
  external clear_metadata : Llvm.llvalue -> int -> unit
    = "llvm_clear_metadata"
  external mdstring : Llvm.llcontext -> string -> Llvm.llvalue
    = "llvm_mdstring"
  external mdnode : Llvm.llcontext -> Llvm.llvalue array -> Llvm.llvalue
    = "llvm_mdnode"
  external const_int : Llvm.lltype -> int -> Llvm.llvalue = "llvm_const_int"
  external const_of_int64 : Llvm.lltype -> Int64.t -> bool -> Llvm.llvalue
    = "llvm_const_of_int64"
  external const_int_of_string : Llvm.lltype -> string -> int -> Llvm.llvalue
    = "llvm_const_int_of_string"
  external const_float : Llvm.lltype -> float -> Llvm.llvalue
    = "llvm_const_float"
  external const_float_of_string : Llvm.lltype -> string -> Llvm.llvalue
    = "llvm_const_float_of_string"
  external const_string : Llvm.llcontext -> string -> Llvm.llvalue
    = "llvm_const_string"
  external const_stringz : Llvm.llcontext -> string -> Llvm.llvalue
    = "llvm_const_stringz"
  external const_array : Llvm.lltype -> Llvm.llvalue array -> Llvm.llvalue
    = "llvm_const_array"
  external const_struct :
    Llvm.llcontext -> Llvm.llvalue array -> Llvm.llvalue
    = "llvm_const_struct"
  external const_packed_struct :
    Llvm.llcontext -> Llvm.llvalue array -> Llvm.llvalue
    = "llvm_const_packed_struct"
  external const_vector : Llvm.llvalue array -> Llvm.llvalue
    = "llvm_const_vector"
  external align_of : Llvm.lltype -> Llvm.llvalue = "LLVMAlignOf"
  external size_of : Llvm.lltype -> Llvm.llvalue = "LLVMSizeOf"
  external const_neg : Llvm.llvalue -> Llvm.llvalue = "LLVMConstNeg"
  external const_nsw_neg : Llvm.llvalue -> Llvm.llvalue = "LLVMConstNSWNeg"
  external const_nuw_neg : Llvm.llvalue -> Llvm.llvalue = "LLVMConstNUWNeg"
  external const_fneg : Llvm.llvalue -> Llvm.llvalue = "LLVMConstFNeg"
  external const_not : Llvm.llvalue -> Llvm.llvalue = "LLVMConstNot"
  external const_add : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstAdd"
  external const_nsw_add : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstNSWAdd"
  external const_nuw_add : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstNUWAdd"
  external const_fadd : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstFAdd"
  external const_sub : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstSub"
  external const_nsw_sub : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstNSWSub"
  external const_nuw_sub : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstNUWSub"
  external const_fsub : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstFSub"
  external const_mul : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstMul"
  external const_nsw_mul : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstNSWMul"
  external const_nuw_mul : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstNUWMul"
  external const_fmul : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstFMul"
  external const_udiv : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstUDiv"
  external const_sdiv : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstSDiv"
  external const_exact_sdiv : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstExactSDiv"
  external const_fdiv : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstFDiv"
  external const_urem : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstURem"
  external const_srem : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstSRem"
  external const_frem : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstFRem"
  external const_and : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstAnd"
  external const_or : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstOr"
  external const_xor : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstXor"
  external const_icmp :
    Llvm.Icmp.t -> Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "llvm_const_icmp"
  external const_fcmp :
    Llvm.Fcmp.t -> Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "llvm_const_fcmp"
  external const_shl : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstShl"
  external const_lshr : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstLShr"
  external const_ashr : Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstAShr"
  external const_gep : Llvm.llvalue -> Llvm.llvalue array -> Llvm.llvalue
    = "llvm_const_gep"
  external const_in_bounds_gep :
    Llvm.llvalue -> Llvm.llvalue array -> Llvm.llvalue
    = "llvm_const_in_bounds_gep"
  external const_trunc : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
    = "LLVMConstTrunc"
  external const_sext : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
    = "LLVMConstSExt"
  external const_zext : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
    = "LLVMConstZExt"
  external const_fptrunc : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
    = "LLVMConstFPTrunc"
  external const_fpext : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
    = "LLVMConstFPExt"
  external const_uitofp : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
    = "LLVMConstUIToFP"
  external const_sitofp : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
    = "LLVMConstSIToFP"
  external const_fptoui : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
    = "LLVMConstFPToUI"
  external const_fptosi : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
    = "LLVMConstFPToSI"
  external const_ptrtoint : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
    = "LLVMConstPtrToInt"
  external const_inttoptr : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
    = "LLVMConstIntToPtr"
  external const_bitcast : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
    = "LLVMConstBitCast"
  external const_zext_or_bitcast :
    Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue = "LLVMConstZExtOrBitCast"
  external const_sext_or_bitcast :
    Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue = "LLVMConstSExtOrBitCast"
  external const_trunc_or_bitcast :
    Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue = "LLVMConstTruncOrBitCast"
  external const_pointercast : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
    = "LLVMConstPointerCast"
  external const_intcast : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
    = "LLVMConstIntCast"
  external const_fpcast : Llvm.llvalue -> Llvm.lltype -> Llvm.llvalue
    = "LLVMConstFPCast"
  external const_select :
    Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstSelect"
  external const_extractelement :
    Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue = "LLVMConstExtractElement"
  external const_insertelement :
    Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstInsertElement"
  external const_shufflevector :
    Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue -> Llvm.llvalue
    = "LLVMConstShuffleVector"
  external const_extractvalue : Llvm.llvalue -> int array -> Llvm.llvalue
    = "llvm_const_extractvalue"
  external const_insertvalue :
    Llvm.llvalue -> Llvm.llvalue -> int array -> Llvm.llvalue
    = "llvm_const_insertvalue"
  external const_inline_asm :
    Llvm.lltype -> string -> string -> bool -> bool -> Llvm.llvalue
    = "llvm_const_inline_asm"
  external block_address : Llvm.llvalue -> Llvm.llbasicblock -> Llvm.llvalue
    = "LLVMBlockAddress"
  external global_parent : Llvm.llvalue -> Llvm.llmodule
    = "LLVMGetGlobalParent"
  external is_declaration : Llvm.llvalue -> bool = "llvm_is_declaration"
  external linkage : Llvm.llvalue -> Llvm.Linkage.t = "llvm_linkage"
  external set_linkage : Llvm.Linkage.t -> Llvm.llvalue -> unit
    = "llvm_set_linkage"
  external section : Llvm.llvalue -> string = "llvm_section"
  external set_section : string -> Llvm.llvalue -> unit = "llvm_set_section"
  external visibility : Llvm.llvalue -> Llvm.Visibility.t = "llvm_visibility"
  external set_visibility : Llvm.Visibility.t -> Llvm.llvalue -> unit
    = "llvm_set_visibility"
  external alignment : Llvm.llvalue -> int = "llvm_alignment"
  external set_alignment : int -> Llvm.llvalue -> unit = "llvm_set_alignment"
  external declare_global :
    Llvm.lltype -> string -> Llvm.llmodule -> Llvm.llvalue
    = "llvm_declare_global"
  external declare_qualified_global :
    Llvm.lltype -> string -> int -> Llvm.llmodule -> Llvm.llvalue
    = "llvm_declare_qualified_global"
  external define_global :
    string -> Llvm.llvalue -> Llvm.llmodule -> Llvm.llvalue
    = "llvm_define_global"
  external define_qualified_global :
    string -> Llvm.llvalue -> int -> Llvm.llmodule -> Llvm.llvalue
    = "llvm_define_qualified_global"
  external lookup_global : string -> Llvm.llmodule -> Llvm.llvalue option
    = "llvm_lookup_global"
  external delete_global : Llvm.llvalue -> unit = "llvm_delete_global"
  external global_begin :
    Llvm.llmodule -> (Llvm.llmodule, Llvm.llvalue) Llvm.llpos
    = "llvm_global_begin"
  external global_succ :
    Llvm.llvalue -> (Llvm.llmodule, Llvm.llvalue) Llvm.llpos
    = "llvm_global_succ"
  val iter_globals : (Llvm.llvalue -> unit) -> Llvm.llmodule -> unit
  val fold_left_globals :
    ('-> Llvm.llvalue -> 'a) -> '-> Llvm.llmodule -> 'a
  external global_end :
    Llvm.llmodule -> (Llvm.llmodule, Llvm.llvalue) Llvm.llrev_pos
    = "llvm_global_end"
  external global_pred :
    Llvm.llvalue -> (Llvm.llmodule, Llvm.llvalue) Llvm.llrev_pos
    = "llvm_global_pred"
  val rev_iter_globals : (Llvm.llvalue -> unit) -> Llvm.llmodule -> unit
  val fold_right_globals :
    (Llvm.llvalue -> '-> 'a) -> Llvm.llmodule -> '-> 'a
  external is_global_constant : Llvm.llvalue -> bool
    = "llvm_is_global_constant"
  external set_global_constant : bool -> Llvm.llvalue -> unit
    = "llvm_set_global_constant"
  external global_initializer : Llvm.llvalue -> Llvm.llvalue
    = "LLVMGetInitializer"
  external set_initializer : Llvm.llvalue -> Llvm.llvalue -> unit
    = "llvm_set_initializer"
  external remove_initializer : Llvm.llvalue -> unit
    = "llvm_remove_initializer"
  external is_thread_local : Llvm.llvalue -> bool = "llvm_is_thread_local"
  external set_thread_local : bool -> Llvm.llvalue -> unit
    = "llvm_set_thread_local"
  external add_alias :
    Llvm.llmodule -> Llvm.lltype -> Llvm.llvalue -> string -> Llvm.llvalue
    = "llvm_add_alias"
  external declare_function :
    string -> Llvm.lltype -> Llvm.llmodule -> Llvm.llvalue
    = "llvm_declare_function"
  external define_function :
    string -> Llvm.lltype -> Llvm.llmodule -> Llvm.llvalue
    = "llvm_define_function"
  external lookup_function : string -> Llvm.llmodule -> Llvm.llvalue option
    = "llvm_lookup_function"
  external delete_function : Llvm.llvalue -> unit = "llvm_delete_function"
  external function_begin :
    Llvm.llmodule -> (Llvm.llmodule, Llvm.llvalue) Llvm.llpos
    = "llvm_function_begin"
  external function_succ :
    Llvm.llvalue -> (Llvm.llmodule, Llvm.llvalue) Llvm.llpos
    = "llvm_function_succ"
  val iter_functions : (Llvm.llvalue -> unit) -> Llvm.llmodule -> unit
  val fold_left_functions :
    ('-> Llvm.llvalue -> 'a) -> '-> Llvm.llmodule -> 'a
  external function_end :
    Llvm.llmodule -> (Llvm.llmodule, Llvm.llvalue) Llvm.llrev_pos
    = "llvm_function_end"
  external function_pred :
    Llvm.llvalue -> (Llvm.llmodule, Llvm.llvalue) Llvm.llrev_pos
    = "llvm_function_pred"
  val rev_iter_functions : (Llvm.llvalue -> unit) -> Llvm.llmodule -> unit
  val fold_right_functions :
    (Llvm.llvalue -> '-> 'a) -> Llvm.llmodule -> '-> 'a
  external is_intrinsic : Llvm.llvalue -> bool = "llvm_is_intrinsic"
  external function_call_conv : Llvm.llvalue -> int
    = "llvm_function_call_conv"
  external set_function_call_conv : int -> Llvm.llvalue -> unit
    = "llvm_set_function_call_conv"
  external gc : Llvm.llvalue -> string option = "llvm_gc"
  external set_gc : string option -> Llvm.llvalue -> unit = "llvm_set_gc"
  val add_function_attr : Llvm.llvalue -> Llvm.Attribute.t -> unit
  val remove_function_attr : Llvm.llvalue -> Llvm.Attribute.t -> unit
  external params : Llvm.llvalue -> Llvm.llvalue array = "llvm_params"
  external param : Llvm.llvalue -> int -> Llvm.llvalue = "llvm_param"
  external param_parent : Llvm.llvalue -> Llvm.llvalue = "LLVMGetParamParent"
  external param_begin :
    Llvm.llvalue -> (Llvm.llvalue, Llvm.llvalue) Llvm.llpos
    = "llvm_param_begin"
  external param_succ :
    Llvm.llvalue -> (Llvm.llvalue, Llvm.llvalue) Llvm.llpos
    = "llvm_param_succ"
  val iter_params : (Llvm.llvalue -> unit) -> Llvm.llvalue -> unit
  val fold_left_params :
    ('-> Llvm.llvalue -> 'a) -> '-> Llvm.llvalue -> 'a
  external param_end :
    Llvm.llvalue -> (Llvm.llvalue, Llvm.llvalue) Llvm.llrev_pos
    = "llvm_param_end"
  external param_pred :
    Llvm.llvalue -> (Llvm.llvalue, Llvm.llvalue) Llvm.llrev_pos
    = "llvm_param_pred"
  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
  external set_param_alignment : Llvm.llvalue -> int -> unit
    = "llvm_set_param_alignment"
  external basic_blocks : Llvm.llvalue -> Llvm.llbasicblock array
    = "llvm_basic_blocks"
  external entry_block : Llvm.llvalue -> Llvm.llbasicblock
    = "LLVMGetEntryBasicBlock"
  external delete_block : Llvm.llbasicblock -> unit = "llvm_delete_block"
  external append_block :
    Llvm.llcontext -> string -> Llvm.llvalue -> Llvm.llbasicblock
    = "llvm_append_block"
  external insert_block :
    Llvm.llcontext -> string -> Llvm.llbasicblock -> Llvm.llbasicblock
    = "llvm_insert_block"
  external block_parent : Llvm.llbasicblock -> Llvm.llvalue
    = "LLVMGetBasicBlockParent"
  external block_begin :
    Llvm.llvalue -> (Llvm.llvalue, Llvm.llbasicblock) Llvm.llpos
    = "llvm_block_begin"
  external block_succ :
    Llvm.llbasicblock -> (Llvm.llvalue, Llvm.llbasicblock) Llvm.llpos
    = "llvm_block_succ"
  val iter_blocks : (Llvm.llbasicblock -> unit) -> Llvm.llvalue -> unit
  val fold_left_blocks :
    ('-> Llvm.llbasicblock -> 'a) -> '-> Llvm.llvalue -> 'a
  external block_end :
    Llvm.llvalue -> (Llvm.llvalue, Llvm.llbasicblock) Llvm.llrev_pos
    = "llvm_block_end"
  external block_pred :
    Llvm.llbasicblock -> (Llvm.llvalue, Llvm.llbasicblock) Llvm.llrev_pos
    = "llvm_block_pred"
  val rev_iter_blocks : (Llvm.llbasicblock -> unit) -> Llvm.llvalue -> unit
  val fold_right_blocks :
    (Llvm.llbasicblock -> '-> 'a) -> Llvm.llvalue -> '-> 'a
  external value_of_block : Llvm.llbasicblock -> Llvm.llvalue
    = "LLVMBasicBlockAsValue"
  external value_is_block : Llvm.llvalue -> bool = "llvm_value_is_block"
  external block_of_value : Llvm.llvalue -> Llvm.llbasicblock
    = "LLVMValueAsBasicBlock"
  external instr_parent : Llvm.llvalue -> Llvm.llbasicblock
    = "LLVMGetInstructionParent"
  external instr_begin :
    Llvm.llbasicblock -> (Llvm.llbasicblock, Llvm.llvalue) Llvm.llpos
    = "llvm_instr_begin"
  external instr_succ :
    Llvm.llvalue -> (Llvm.llbasicblock, Llvm.llvalue) Llvm.llpos
    = "llvm_instr_succ"
  val iter_instrs : (Llvm.llvalue -> unit) -> Llvm.llbasicblock -> unit
  val fold_left_instrs :
    ('-> Llvm.llvalue -> 'a) -> '-> Llvm.llbasicblock -> 'a
  external instr_end :
    Llvm.llbasicblock -> (Llvm.llbasicblock, Llvm.llvalue) Llvm.llrev_pos
    = "llvm_instr_end"
  external instr_pred :
    Llvm.llvalue -> (Llvm.llbasicblock, Llvm.llvalue) Llvm.llrev_pos
    = "llvm_instr_pred"
  val fold_right_instrs :
    (Llvm.llvalue -> '-> 'a) -> Llvm.llbasicblock -> '-> 'a
  external instruction_call_conv : Llvm.llvalue -> int
    = "llvm_instruction_call_conv"
  external set_instruction_call_conv : int -> Llvm.llvalue -> unit
    = "llvm_set_instruction_call_conv"
  val add_instruction_param_attr :
    Llvm.llvalue -> int -> Llvm.Attribute.t -> unit
  val remove_instruction_param_attr :
    Llvm.llvalue -> int -> Llvm.Attribute.t -> unit
  external is_tail_call : Llvm.llvalue -> bool = "llvm_is_tail_call"
  external set_tail_call : bool -> Llvm.llvalue -> unit
    = "llvm_set_tail_call"
  external add_incoming :
    Llvm.llvalue * Llvm.llbasicblock -> Llvm.llvalue -> unit
    = "llvm_add_incoming"
  external incoming : Llvm.llvalue -> (Llvm.llvalue * Llvm.llbasicblock) list
    = "llvm_incoming"
  external builder : Llvm.llcontext -> Llvm.llbuilder = "llvm_builder"
  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
  external position_builder :
    (Llvm.llbasicblock, Llvm.llvalue) Llvm.llpos -> Llvm.llbuilder -> unit
    = "llvm_position_builder"
  val position_before : Llvm.llvalue -> Llvm.llbuilder -> unit
  val position_at_end : Llvm.llbasicblock -> Llvm.llbuilder -> unit
  external insertion_block : Llvm.llbuilder -> Llvm.llbasicblock
    = "llvm_insertion_block"
  external insert_into_builder :
    Llvm.llvalue -> string -> Llvm.llbuilder -> unit
    = "llvm_insert_into_builder"
  external set_current_debug_location :
    Llvm.llbuilder -> Llvm.llvalue -> unit
    = "llvm_set_current_debug_location"
  external clear_current_debug_location : Llvm.llbuilder -> unit
    = "llvm_clear_current_debug_location"
  external current_debug_location : Llvm.llbuilder -> Llvm.llvalue option
    = "llvm_current_debug_location"
  external set_inst_debug_location : Llvm.llbuilder -> Llvm.llvalue -> unit
    = "llvm_set_inst_debug_location"
  external build_ret_void : Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_ret_void"
  external build_ret : Llvm.llvalue -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_ret"
  external build_aggregate_ret :
    Llvm.llvalue array -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_aggregate_ret"
  external build_br : Llvm.llbasicblock -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_br"
  external build_cond_br :
    Llvm.llvalue ->
    Llvm.llbasicblock -> Llvm.llbasicblock -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_cond_br"
  external build_switch :
    Llvm.llvalue ->
    Llvm.llbasicblock -> int -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_switch"
  external add_case :
    Llvm.llvalue -> Llvm.llvalue -> Llvm.llbasicblock -> unit
    = "llvm_add_case"
  external build_indirect_br :
    Llvm.llvalue -> int -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_indirect_br"
  external add_destination : Llvm.llvalue -> Llvm.llbasicblock -> unit
    = "llvm_add_destination"
  external build_invoke :
    Llvm.llvalue ->
    Llvm.llvalue array ->
    Llvm.llbasicblock ->
    Llvm.llbasicblock -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_invoke_bc" "llvm_build_invoke_nat"
  external build_unwind : Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_unwind"
  external build_unreachable : Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_unreachable"
  external build_add :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_add"
  external build_nsw_add :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_nsw_add"
  external build_nuw_add :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_nuw_add"
  external build_fadd :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_fadd"
  external build_sub :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_sub"
  external build_nsw_sub :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_nsw_sub"
  external build_nuw_sub :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_nuw_sub"
  external build_fsub :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_fsub"
  external build_mul :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_mul"
  external build_nsw_mul :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_nsw_mul"
  external build_nuw_mul :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_nuw_mul"
  external build_fmul :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_fmul"
  external build_udiv :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_udiv"
  external build_sdiv :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_sdiv"
  external build_exact_sdiv :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_exact_sdiv"
  external build_fdiv :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_fdiv"
  external build_urem :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_urem"
  external build_srem :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_srem"
  external build_frem :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_frem"
  external build_shl :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_shl"
  external build_lshr :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_lshr"
  external build_ashr :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_ashr"
  external build_and :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_and"
  external build_or :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_or"
  external build_xor :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_xor"
  external build_neg :
    Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_neg"
  external build_nsw_neg :
    Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_nsw_neg"
  external build_nuw_neg :
    Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_nuw_neg"
  external build_fneg :
    Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_fneg"
  external build_not :
    Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_not"
  external build_alloca :
    Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_alloca"
  external build_array_alloca :
    Llvm.lltype -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_array_alloca"
  external build_load :
    Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_load"
  external build_store :
    Llvm.llvalue -> Llvm.llvalue -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_store"
  external build_gep :
    Llvm.llvalue ->
    Llvm.llvalue array -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_gep"
  external build_in_bounds_gep :
    Llvm.llvalue ->
    Llvm.llvalue array -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_in_bounds_gep"
  external build_struct_gep :
    Llvm.llvalue -> int -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_struct_gep"
  external build_global_string :
    string -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_global_string"
  external build_global_stringptr :
    string -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_global_stringptr"
  external build_trunc :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_trunc"
  external build_zext :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_zext"
  external build_sext :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_sext"
  external build_fptoui :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_fptoui"
  external build_fptosi :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_fptosi"
  external build_uitofp :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_uitofp"
  external build_sitofp :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_sitofp"
  external build_fptrunc :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_fptrunc"
  external build_fpext :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_fpext"
  external build_ptrtoint :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_prttoint"
  external build_inttoptr :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_inttoptr"
  external build_bitcast :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_bitcast"
  external build_zext_or_bitcast :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_zext_or_bitcast"
  external build_sext_or_bitcast :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_sext_or_bitcast"
  external build_trunc_or_bitcast :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_trunc_or_bitcast"
  external build_pointercast :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_pointercast"
  external build_intcast :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_intcast"
  external build_fpcast :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_fpcast"
  external build_icmp :
    Llvm.Icmp.t ->
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_icmp"
  external build_fcmp :
    Llvm.Fcmp.t ->
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_fcmp"
  external build_phi :
    (Llvm.llvalue * Llvm.llbasicblock) list ->
    string -> Llvm.llbuilder -> Llvm.llvalue = "llvm_build_phi"
  external build_call :
    Llvm.llvalue ->
    Llvm.llvalue array -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_call"
  external build_select :
    Llvm.llvalue ->
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_select"
  external build_va_arg :
    Llvm.llvalue -> Llvm.lltype -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_va_arg"
  external build_extractelement :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_extractelement"
  external build_insertelement :
    Llvm.llvalue ->
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_insertelement"
  external build_shufflevector :
    Llvm.llvalue ->
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_shufflevector"
  external build_extractvalue :
    Llvm.llvalue -> int -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_extractvalue"
  external build_insertvalue :
    Llvm.llvalue ->
    Llvm.llvalue -> int -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_insertvalue"
  external build_is_null :
    Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_is_null"
  external build_is_not_null :
    Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_is_not_null"
  external build_ptrdiff :
    Llvm.llvalue -> Llvm.llvalue -> string -> Llvm.llbuilder -> Llvm.llvalue
    = "llvm_build_ptrdiff"
  module MemoryBuffer :
    sig
      external of_file : string -> Llvm.llmemorybuffer
        = "llvm_memorybuffer_of_file"
      external of_stdin : unit -> Llvm.llmemorybuffer
        = "llvm_memorybuffer_of_stdin"
      external dispose : Llvm.llmemorybuffer -> unit
        = "llvm_memorybuffer_dispose"
    end
  module PassManager :
    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
end