Home | History | Annotate | Line # | Download | only in llvm
      1 (*===-- llvm/llvm.ml - LLVM OCaml Interface -------------------------------===*
      2  *
      3  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4  * See https://llvm.org/LICENSE.txt for license information.
      5  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6  *
      7  *===----------------------------------------------------------------------===*)
      8 
      9 
     10 type llcontext
     11 type llmodule
     12 type llmetadata
     13 type lltype
     14 type llvalue
     15 type lluse
     16 type llbasicblock
     17 type llbuilder
     18 type llattrkind
     19 type llattribute
     20 type llmemorybuffer
     21 type llmdkind
     22 
     23 exception FeatureDisabled of string
     24 
     25 let () = Callback.register_exception "Llvm.FeatureDisabled" (FeatureDisabled "")
     26 
     27 module TypeKind = struct
     28   type t =
     29   | Void
     30   | Half
     31   | Float
     32   | Double
     33   | X86fp80
     34   | Fp128
     35   | Ppc_fp128
     36   | Label
     37   | Integer
     38   | Function
     39   | Struct
     40   | Array
     41   | Pointer
     42   | Vector
     43   | Metadata
     44   | X86_mmx
     45   | Token
     46   | ScalableVector
     47   | BFloat
     48   | X86_amx
     49 end
     50 
     51 module Linkage = struct
     52   type t =
     53   | External
     54   | Available_externally
     55   | Link_once
     56   | Link_once_odr
     57   | Link_once_odr_auto_hide
     58   | Weak
     59   | Weak_odr
     60   | Appending
     61   | Internal
     62   | Private
     63   | Dllimport
     64   | Dllexport
     65   | External_weak
     66   | Ghost
     67   | Common
     68   | Linker_private
     69   | Linker_private_weak
     70 end
     71 
     72 module Visibility = struct
     73   type t =
     74   | Default
     75   | Hidden
     76   | Protected
     77 end
     78 
     79 module DLLStorageClass = struct
     80   type t =
     81   | Default
     82   | DLLImport
     83   | DLLExport
     84 end
     85 
     86 module CallConv = struct
     87   let c = 0
     88   let fast = 8
     89   let cold = 9
     90   let x86_stdcall = 64
     91   let x86_fastcall = 65
     92 end
     93 
     94 module AttrRepr = struct
     95   type t =
     96   | Enum of llattrkind * int64
     97   | String of string * string
     98 end
     99 
    100 module AttrIndex = struct
    101   type t =
    102   | Function
    103   | Return
    104   | Param of int
    105 
    106   let to_int index =
    107     match index with
    108     | Function -> -1
    109     | Return -> 0
    110     | Param(n) -> 1 + n
    111 end
    112 
    113 module Attribute = struct
    114   type t =
    115   | Zext
    116   | Sext
    117   | Noreturn
    118   | Inreg
    119   | Structret
    120   | Nounwind
    121   | Noalias
    122   | Byval
    123   | Nest
    124   | Readnone
    125   | Readonly
    126   | Noinline
    127   | Alwaysinline
    128   | Optsize
    129   | Ssp
    130   | Sspreq
    131   | Alignment of int
    132   | Nocapture
    133   | Noredzone
    134   | Noimplicitfloat
    135   | Naked
    136   | Inlinehint
    137   | Stackalignment of int
    138   | ReturnsTwice
    139   | UWTable
    140   | NonLazyBind
    141 end
    142 
    143 module Icmp = struct
    144   type t =
    145   | Eq
    146   | Ne
    147   | Ugt
    148   | Uge
    149   | Ult
    150   | Ule
    151   | Sgt
    152   | Sge
    153   | Slt
    154   | Sle
    155 end
    156 
    157 module Fcmp = struct
    158   type t =
    159   | False
    160   | Oeq
    161   | Ogt
    162   | Oge
    163   | Olt
    164   | Ole
    165   | One
    166   | Ord
    167   | Uno
    168   | Ueq
    169   | Ugt
    170   | Uge
    171   | Ult
    172   | Ule
    173   | Une
    174   | True
    175 end
    176 
    177 module Opcode  = struct
    178   type t =
    179   | Invalid (* not an instruction *)
    180   (* Terminator Instructions *)
    181   | Ret
    182   | Br
    183   | Switch
    184   | IndirectBr
    185   | Invoke
    186   | Invalid2
    187   | Unreachable
    188   (* Standard Binary Operators *)
    189   | Add
    190   | FAdd
    191   | Sub
    192   | FSub
    193   | Mul
    194   | FMul
    195   | UDiv
    196   | SDiv
    197   | FDiv
    198   | URem
    199   | SRem
    200   | FRem
    201   (* Logical Operators *)
    202   | Shl
    203   | LShr
    204   | AShr
    205   | And
    206   | Or
    207   | Xor
    208   (* Memory Operators *)
    209   | Alloca
    210   | Load
    211   | Store
    212   | GetElementPtr
    213   (* Cast Operators *)
    214   | Trunc
    215   | ZExt
    216   | SExt
    217   | FPToUI
    218   | FPToSI
    219   | UIToFP
    220   | SIToFP
    221   | FPTrunc
    222   | FPExt
    223   | PtrToInt
    224   | IntToPtr
    225   | BitCast
    226   (* Other Operators *)
    227   | ICmp
    228   | FCmp
    229   | PHI
    230   | Call
    231   | Select
    232   | UserOp1
    233   | UserOp2
    234   | VAArg
    235   | ExtractElement
    236   | InsertElement
    237   | ShuffleVector
    238   | ExtractValue
    239   | InsertValue
    240   | Fence
    241   | AtomicCmpXchg
    242   | AtomicRMW
    243   | Resume
    244   | LandingPad
    245   | AddrSpaceCast
    246   | CleanupRet
    247   | CatchRet
    248   | CatchPad
    249   | CleanupPad
    250   | CatchSwitch
    251   | FNeg
    252   | CallBr
    253   | Freeze
    254 end
    255 
    256 module LandingPadClauseTy = struct
    257   type t =
    258   | Catch
    259   | Filter
    260 end
    261 
    262 module ThreadLocalMode = struct
    263   type t =
    264   | None
    265   | GeneralDynamic
    266   | LocalDynamic
    267   | InitialExec
    268   | LocalExec
    269 end
    270 
    271 module AtomicOrdering = struct
    272   type t =
    273   | NotAtomic
    274   | Unordered
    275   | Monotonic
    276   | Invalid
    277   | Acquire
    278   | Release
    279   | AcqiureRelease
    280   | SequentiallyConsistent
    281 end
    282 
    283 module AtomicRMWBinOp = struct
    284   type t =
    285   | Xchg
    286   | Add
    287   | Sub
    288   | And
    289   | Nand
    290   | Or
    291   | Xor
    292   | Max
    293   | Min
    294   | UMax
    295   | UMin
    296   | FAdd
    297   | FSub
    298 end
    299 
    300 module ValueKind = struct
    301   type t =
    302   | NullValue
    303   | Argument
    304   | BasicBlock
    305   | InlineAsm
    306   | MDNode
    307   | MDString
    308   | BlockAddress
    309   | ConstantAggregateZero
    310   | ConstantArray
    311   | ConstantDataArray
    312   | ConstantDataVector
    313   | ConstantExpr
    314   | ConstantFP
    315   | ConstantInt
    316   | ConstantPointerNull
    317   | ConstantStruct
    318   | ConstantVector
    319   | Function
    320   | GlobalAlias
    321   | GlobalIFunc
    322   | GlobalVariable
    323   | UndefValue
    324   | PoisonValue
    325   | Instruction of Opcode.t
    326 end
    327 
    328 module DiagnosticSeverity = struct
    329   type t =
    330   | Error
    331   | Warning
    332   | Remark
    333   | Note
    334 end
    335 
    336 module ModuleFlagBehavior = struct
    337   type t =
    338   | Error
    339   | Warning
    340   | Require
    341   | Override
    342   | Append
    343   | AppendUnique
    344 end
    345 
    346 exception IoError of string
    347 
    348 let () = Callback.register_exception "Llvm.IoError" (IoError "")
    349 
    350 external install_fatal_error_handler : (string -> unit) -> unit
    351                                      = "llvm_install_fatal_error_handler"
    352 external reset_fatal_error_handler : unit -> unit
    353                                    = "llvm_reset_fatal_error_handler"
    354 external enable_pretty_stacktrace : unit -> unit
    355                                   = "llvm_enable_pretty_stacktrace"
    356 external parse_command_line_options : ?overview:string -> string array -> unit
    357                                     = "llvm_parse_command_line_options"
    358 
    359 type ('a, 'b) llpos =
    360 | At_end of 'a
    361 | Before of 'b
    362 
    363 type ('a, 'b) llrev_pos =
    364 | At_start of 'a
    365 | After of 'b
    366 
    367 
    368 (*===-- Context error handling --------------------------------------------===*)
    369 module Diagnostic = struct
    370   type t
    371 
    372   external description : t -> string = "llvm_get_diagnostic_description"
    373   external severity : t -> DiagnosticSeverity.t
    374                     = "llvm_get_diagnostic_severity"
    375 end
    376 
    377 external set_diagnostic_handler
    378   : llcontext -> (Diagnostic.t -> unit) option -> unit
    379   = "llvm_set_diagnostic_handler"
    380 
    381 (*===-- Contexts ----------------------------------------------------------===*)
    382 external create_context : unit -> llcontext = "llvm_create_context"
    383 external dispose_context : llcontext -> unit = "llvm_dispose_context"
    384 external global_context : unit -> llcontext = "llvm_global_context"
    385 external mdkind_id : llcontext -> string -> llmdkind = "llvm_mdkind_id"
    386 
    387 (*===-- Attributes --------------------------------------------------------===*)
    388 exception UnknownAttribute of string
    389 
    390 let () = Callback.register_exception "Llvm.UnknownAttribute"
    391                                      (UnknownAttribute "")
    392 
    393 external enum_attr_kind : string -> llattrkind = "llvm_enum_attr_kind"
    394 external llvm_create_enum_attr : llcontext -> llattrkind -> int64 ->
    395                                  llattribute
    396                                = "llvm_create_enum_attr_by_kind"
    397 external is_enum_attr : llattribute -> bool = "llvm_is_enum_attr"
    398 external get_enum_attr_kind : llattribute -> llattrkind
    399                             = "llvm_get_enum_attr_kind"
    400 external get_enum_attr_value : llattribute -> int64
    401                              = "llvm_get_enum_attr_value"
    402 external llvm_create_string_attr : llcontext -> string -> string ->
    403                                    llattribute
    404                                  = "llvm_create_string_attr"
    405 external is_string_attr : llattribute -> bool = "llvm_is_string_attr"
    406 external get_string_attr_kind : llattribute -> string
    407                               = "llvm_get_string_attr_kind"
    408 external get_string_attr_value : llattribute -> string
    409                                = "llvm_get_string_attr_value"
    410 
    411 let create_enum_attr context name value =
    412   llvm_create_enum_attr context (enum_attr_kind name) value
    413 let create_string_attr context kind value =
    414   llvm_create_string_attr context kind value
    415 
    416 let attr_of_repr context repr =
    417   match repr with
    418   | AttrRepr.Enum(kind, value) -> llvm_create_enum_attr context kind value
    419   | AttrRepr.String(key, value) -> llvm_create_string_attr context key value
    420 
    421 let repr_of_attr attr =
    422   if is_enum_attr attr then
    423     AttrRepr.Enum(get_enum_attr_kind attr, get_enum_attr_value attr)
    424   else if is_string_attr attr then
    425     AttrRepr.String(get_string_attr_kind attr, get_string_attr_value attr)
    426   else assert false
    427 
    428 (*===-- Modules -----------------------------------------------------------===*)
    429 external create_module : llcontext -> string -> llmodule = "llvm_create_module"
    430 external dispose_module : llmodule -> unit = "llvm_dispose_module"
    431 external target_triple: llmodule -> string
    432                       = "llvm_target_triple"
    433 external set_target_triple: string -> llmodule -> unit
    434                           = "llvm_set_target_triple"
    435 external data_layout: llmodule -> string
    436                     = "llvm_data_layout"
    437 external set_data_layout: string -> llmodule -> unit
    438                         = "llvm_set_data_layout"
    439 external dump_module : llmodule -> unit = "llvm_dump_module"
    440 external print_module : string -> llmodule -> unit = "llvm_print_module"
    441 external string_of_llmodule : llmodule -> string = "llvm_string_of_llmodule"
    442 external set_module_inline_asm : llmodule -> string -> unit
    443                                = "llvm_set_module_inline_asm"
    444 external module_context : llmodule -> llcontext = "LLVMGetModuleContext"
    445 
    446 external get_module_identifier : llmodule -> string
    447                                = "llvm_get_module_identifier"
    448 
    449 external set_module_identifer : llmodule -> string -> unit
    450                               = "llvm_set_module_identifier"
    451 
    452 external get_module_flag : llmodule -> string -> llmetadata option
    453                          = "llvm_get_module_flag"
    454 external add_module_flag : llmodule -> ModuleFlagBehavior.t ->
    455             string -> llmetadata -> unit = "llvm_add_module_flag"
    456 
    457 (*===-- Types -------------------------------------------------------------===*)
    458 external classify_type : lltype -> TypeKind.t = "llvm_classify_type"
    459 external type_context : lltype -> llcontext = "llvm_type_context"
    460 external type_is_sized : lltype -> bool = "llvm_type_is_sized"
    461 external dump_type : lltype -> unit = "llvm_dump_type"
    462 external string_of_lltype : lltype -> string = "llvm_string_of_lltype"
    463 
    464 (*--... Operations on integer types ........................................--*)
    465 external i1_type : llcontext -> lltype = "llvm_i1_type"
    466 external i8_type : llcontext -> lltype = "llvm_i8_type"
    467 external i16_type : llcontext -> lltype = "llvm_i16_type"
    468 external i32_type : llcontext -> lltype = "llvm_i32_type"
    469 external i64_type : llcontext -> lltype = "llvm_i64_type"
    470 
    471 external integer_type : llcontext -> int -> lltype = "llvm_integer_type"
    472 external integer_bitwidth : lltype -> int = "llvm_integer_bitwidth"
    473 
    474 (*--... Operations on real types ...........................................--*)
    475 external float_type : llcontext -> lltype = "llvm_float_type"
    476 external double_type : llcontext -> lltype = "llvm_double_type"
    477 external x86fp80_type : llcontext -> lltype = "llvm_x86fp80_type"
    478 external fp128_type : llcontext -> lltype = "llvm_fp128_type"
    479 external ppc_fp128_type : llcontext -> lltype = "llvm_ppc_fp128_type"
    480 
    481 (*--... Operations on function types .......................................--*)
    482 external function_type : lltype -> lltype array -> lltype = "llvm_function_type"
    483 external var_arg_function_type : lltype -> lltype array -> lltype
    484                                = "llvm_var_arg_function_type"
    485 external is_var_arg : lltype -> bool = "llvm_is_var_arg"
    486 external return_type : lltype -> lltype = "LLVMGetReturnType"
    487 external param_types : lltype -> lltype array = "llvm_param_types"
    488 
    489 (*--... Operations on struct types .........................................--*)
    490 external struct_type : llcontext -> lltype array -> lltype = "llvm_struct_type"
    491 external packed_struct_type : llcontext -> lltype array -> lltype
    492                             = "llvm_packed_struct_type"
    493 external struct_name : lltype -> string option = "llvm_struct_name"
    494 external named_struct_type : llcontext -> string -> lltype =
    495     "llvm_named_struct_type"
    496 external struct_set_body : lltype -> lltype array -> bool -> unit =
    497     "llvm_struct_set_body"
    498 external struct_element_types : lltype -> lltype array
    499                               = "llvm_struct_element_types"
    500 external is_packed : lltype -> bool = "llvm_is_packed"
    501 external is_opaque : lltype -> bool = "llvm_is_opaque"
    502 external is_literal : lltype -> bool = "llvm_is_literal"
    503 
    504 (*--... Operations on pointer, vector, and array types .....................--*)
    505 
    506 external subtypes : lltype -> lltype array = "llvm_subtypes"
    507 external array_type : lltype -> int -> lltype = "llvm_array_type"
    508 external pointer_type : lltype -> lltype = "llvm_pointer_type"
    509 external qualified_pointer_type : lltype -> int -> lltype
    510                                 = "llvm_qualified_pointer_type"
    511 external vector_type : lltype -> int -> lltype = "llvm_vector_type"
    512 
    513 external element_type : lltype -> lltype = "LLVMGetElementType"
    514 external array_length : lltype -> int = "llvm_array_length"
    515 external address_space : lltype -> int = "llvm_address_space"
    516 external vector_size : lltype -> int = "llvm_vector_size"
    517 
    518 (*--... Operations on other types ..........................................--*)
    519 external void_type : llcontext -> lltype = "llvm_void_type"
    520 external label_type : llcontext -> lltype = "llvm_label_type"
    521 external x86_mmx_type : llcontext -> lltype = "llvm_x86_mmx_type"
    522 external type_by_name : llmodule -> string -> lltype option = "llvm_type_by_name"
    523 
    524 external classify_value : llvalue -> ValueKind.t = "llvm_classify_value"
    525 (*===-- Values ------------------------------------------------------------===*)
    526 external type_of : llvalue -> lltype = "llvm_type_of"
    527 external value_name : llvalue -> string = "llvm_value_name"
    528 external set_value_name : string -> llvalue -> unit = "llvm_set_value_name"
    529 external dump_value : llvalue -> unit = "llvm_dump_value"
    530 external string_of_llvalue : llvalue -> string = "llvm_string_of_llvalue"
    531 external replace_all_uses_with : llvalue -> llvalue -> unit
    532                                = "llvm_replace_all_uses_with"
    533 
    534 (*--... Operations on uses .................................................--*)
    535 external use_begin : llvalue -> lluse option = "llvm_use_begin"
    536 external use_succ : lluse -> lluse option = "llvm_use_succ"
    537 external user : lluse -> llvalue = "llvm_user"
    538 external used_value : lluse -> llvalue = "llvm_used_value"
    539 
    540 let iter_uses f v =
    541   let rec aux = function
    542     | None -> ()
    543     | Some u ->
    544         f u;
    545         aux (use_succ u)
    546   in
    547   aux (use_begin v)
    548 
    549 let fold_left_uses f init v =
    550   let rec aux init u =
    551     match u with
    552     | None -> init
    553     | Some u -> aux (f init u) (use_succ u)
    554   in
    555   aux init (use_begin v)
    556 
    557 let fold_right_uses f v init =
    558   let rec aux u init =
    559     match u with
    560     | None -> init
    561     | Some u -> f u (aux (use_succ u) init)
    562   in
    563   aux (use_begin v) init
    564 
    565 
    566 (*--... Operations on users ................................................--*)
    567 external operand : llvalue -> int -> llvalue = "llvm_operand"
    568 external operand_use : llvalue -> int -> lluse = "llvm_operand_use"
    569 external set_operand : llvalue -> int -> llvalue -> unit = "llvm_set_operand"
    570 external num_operands : llvalue -> int = "llvm_num_operands"
    571 external indices : llvalue -> int array = "llvm_indices"
    572 
    573 (*--... Operations on constants of (mostly) any type .......................--*)
    574 external is_constant : llvalue -> bool = "llvm_is_constant"
    575 external const_null : lltype -> llvalue = "LLVMConstNull"
    576 external const_all_ones : (*int|vec*)lltype -> llvalue = "LLVMConstAllOnes"
    577 external const_pointer_null : lltype -> llvalue = "LLVMConstPointerNull"
    578 external undef : lltype -> llvalue = "LLVMGetUndef"
    579 external poison : lltype -> llvalue = "LLVMGetPoison"
    580 external is_null : llvalue -> bool = "llvm_is_null"
    581 external is_undef : llvalue -> bool = "llvm_is_undef"
    582 external is_poison : llvalue -> bool = "llvm_is_poison"
    583 external constexpr_opcode : llvalue -> Opcode.t = "llvm_constexpr_get_opcode"
    584 
    585 (*--... Operations on instructions .........................................--*)
    586 external has_metadata : llvalue -> bool = "llvm_has_metadata"
    587 external metadata : llvalue -> llmdkind -> llvalue option = "llvm_metadata"
    588 external set_metadata : llvalue -> llmdkind -> llvalue -> unit = "llvm_set_metadata"
    589 external clear_metadata : llvalue -> llmdkind -> unit = "llvm_clear_metadata"
    590 
    591 (*--... Operations on metadata .......,.....................................--*)
    592 external mdstring : llcontext -> string -> llvalue = "llvm_mdstring"
    593 external mdnode : llcontext -> llvalue array -> llvalue = "llvm_mdnode"
    594 external mdnull : llcontext -> llvalue = "llvm_mdnull"
    595 external get_mdstring : llvalue -> string option = "llvm_get_mdstring"
    596 external get_mdnode_operands : llvalue -> llvalue array
    597                             = "llvm_get_mdnode_operands"
    598 external get_named_metadata : llmodule -> string -> llvalue array
    599                             = "llvm_get_namedmd"
    600 external add_named_metadata_operand : llmodule -> string -> llvalue -> unit
    601                                     = "llvm_append_namedmd"
    602 external value_as_metadata : llvalue -> llmetadata = "llvm_value_as_metadata"
    603 external metadata_as_value : llcontext -> llmetadata -> llvalue
    604                         = "llvm_metadata_as_value"
    605 
    606 (*--... Operations on scalar constants .....................................--*)
    607 external const_int : lltype -> int -> llvalue = "llvm_const_int"
    608 external const_of_int64 : lltype -> Int64.t -> bool -> llvalue
    609                         = "llvm_const_of_int64"
    610 external int64_of_const : llvalue -> Int64.t option
    611                         = "llvm_int64_of_const"
    612 external const_int_of_string : lltype -> string -> int -> llvalue
    613                              = "llvm_const_int_of_string"
    614 external const_float : lltype -> float -> llvalue = "llvm_const_float"
    615 external float_of_const : llvalue -> float option
    616                         = "llvm_float_of_const"
    617 external const_float_of_string : lltype -> string -> llvalue
    618                                = "llvm_const_float_of_string"
    619 
    620 (*--... Operations on composite constants ..................................--*)
    621 external const_string : llcontext -> string -> llvalue = "llvm_const_string"
    622 external const_stringz : llcontext -> string -> llvalue = "llvm_const_stringz"
    623 external const_array : lltype -> llvalue array -> llvalue = "llvm_const_array"
    624 external const_struct : llcontext -> llvalue array -> llvalue
    625                       = "llvm_const_struct"
    626 external const_named_struct : lltype -> llvalue array -> llvalue
    627                       = "llvm_const_named_struct"
    628 external const_packed_struct : llcontext -> llvalue array -> llvalue
    629                              = "llvm_const_packed_struct"
    630 external const_vector : llvalue array -> llvalue = "llvm_const_vector"
    631 external string_of_const : llvalue -> string option = "llvm_string_of_const"
    632 external const_element : llvalue -> int -> llvalue = "llvm_const_element"
    633 
    634 (*--... Constant expressions ...............................................--*)
    635 external align_of : lltype -> llvalue = "LLVMAlignOf"
    636 external size_of : lltype -> llvalue = "LLVMSizeOf"
    637 external const_neg : llvalue -> llvalue = "LLVMConstNeg"
    638 external const_nsw_neg : llvalue -> llvalue = "LLVMConstNSWNeg"
    639 external const_nuw_neg : llvalue -> llvalue = "LLVMConstNUWNeg"
    640 external const_fneg : llvalue -> llvalue = "LLVMConstFNeg"
    641 external const_not : llvalue -> llvalue = "LLVMConstNot"
    642 external const_add : llvalue -> llvalue -> llvalue = "LLVMConstAdd"
    643 external const_nsw_add : llvalue -> llvalue -> llvalue = "LLVMConstNSWAdd"
    644 external const_nuw_add : llvalue -> llvalue -> llvalue = "LLVMConstNUWAdd"
    645 external const_fadd : llvalue -> llvalue -> llvalue = "LLVMConstFAdd"
    646 external const_sub : llvalue -> llvalue -> llvalue = "LLVMConstSub"
    647 external const_nsw_sub : llvalue -> llvalue -> llvalue = "LLVMConstNSWSub"
    648 external const_nuw_sub : llvalue -> llvalue -> llvalue = "LLVMConstNUWSub"
    649 external const_fsub : llvalue -> llvalue -> llvalue = "LLVMConstFSub"
    650 external const_mul : llvalue -> llvalue -> llvalue = "LLVMConstMul"
    651 external const_nsw_mul : llvalue -> llvalue -> llvalue = "LLVMConstNSWMul"
    652 external const_nuw_mul : llvalue -> llvalue -> llvalue = "LLVMConstNUWMul"
    653 external const_fmul : llvalue -> llvalue -> llvalue = "LLVMConstFMul"
    654 external const_udiv : llvalue -> llvalue -> llvalue = "LLVMConstUDiv"
    655 external const_sdiv : llvalue -> llvalue -> llvalue = "LLVMConstSDiv"
    656 external const_exact_sdiv : llvalue -> llvalue -> llvalue = "LLVMConstExactSDiv"
    657 external const_fdiv : llvalue -> llvalue -> llvalue = "LLVMConstFDiv"
    658 external const_urem : llvalue -> llvalue -> llvalue = "LLVMConstURem"
    659 external const_srem : llvalue -> llvalue -> llvalue = "LLVMConstSRem"
    660 external const_frem : llvalue -> llvalue -> llvalue = "LLVMConstFRem"
    661 external const_and : llvalue -> llvalue -> llvalue = "LLVMConstAnd"
    662 external const_or : llvalue -> llvalue -> llvalue = "LLVMConstOr"
    663 external const_xor : llvalue -> llvalue -> llvalue = "LLVMConstXor"
    664 external const_icmp : Icmp.t -> llvalue -> llvalue -> llvalue
    665                     = "llvm_const_icmp"
    666 external const_fcmp : Fcmp.t -> llvalue -> llvalue -> llvalue
    667                     = "llvm_const_fcmp"
    668 external const_shl : llvalue -> llvalue -> llvalue = "LLVMConstShl"
    669 external const_lshr : llvalue -> llvalue -> llvalue = "LLVMConstLShr"
    670 external const_ashr : llvalue -> llvalue -> llvalue = "LLVMConstAShr"
    671 external const_gep : llvalue -> llvalue array -> llvalue = "llvm_const_gep"
    672 external const_in_bounds_gep : llvalue -> llvalue array -> llvalue
    673                             = "llvm_const_in_bounds_gep"
    674 external const_trunc : llvalue -> lltype -> llvalue = "LLVMConstTrunc"
    675 external const_sext : llvalue -> lltype -> llvalue = "LLVMConstSExt"
    676 external const_zext : llvalue -> lltype -> llvalue = "LLVMConstZExt"
    677 external const_fptrunc : llvalue -> lltype -> llvalue = "LLVMConstFPTrunc"
    678 external const_fpext : llvalue -> lltype -> llvalue = "LLVMConstFPExt"
    679 external const_uitofp : llvalue -> lltype -> llvalue = "LLVMConstUIToFP"
    680 external const_sitofp : llvalue -> lltype -> llvalue = "LLVMConstSIToFP"
    681 external const_fptoui : llvalue -> lltype -> llvalue = "LLVMConstFPToUI"
    682 external const_fptosi : llvalue -> lltype -> llvalue = "LLVMConstFPToSI"
    683 external const_ptrtoint : llvalue -> lltype -> llvalue = "LLVMConstPtrToInt"
    684 external const_inttoptr : llvalue -> lltype -> llvalue = "LLVMConstIntToPtr"
    685 external const_bitcast : llvalue -> lltype -> llvalue = "LLVMConstBitCast"
    686 external const_zext_or_bitcast : llvalue -> lltype -> llvalue
    687                              = "LLVMConstZExtOrBitCast"
    688 external const_sext_or_bitcast : llvalue -> lltype -> llvalue
    689                              = "LLVMConstSExtOrBitCast"
    690 external const_trunc_or_bitcast : llvalue -> lltype -> llvalue
    691                               = "LLVMConstTruncOrBitCast"
    692 external const_pointercast : llvalue -> lltype -> llvalue
    693                            = "LLVMConstPointerCast"
    694 external const_intcast : llvalue -> lltype -> is_signed:bool -> llvalue
    695                        = "llvm_const_intcast"
    696 external const_fpcast : llvalue -> lltype -> llvalue = "LLVMConstFPCast"
    697 external const_select : llvalue -> llvalue -> llvalue -> llvalue
    698                       = "LLVMConstSelect"
    699 external const_extractelement : llvalue -> llvalue -> llvalue
    700                               = "LLVMConstExtractElement"
    701 external const_insertelement : llvalue -> llvalue -> llvalue -> llvalue
    702                              = "LLVMConstInsertElement"
    703 external const_shufflevector : llvalue -> llvalue -> llvalue -> llvalue
    704                              = "LLVMConstShuffleVector"
    705 external const_extractvalue : llvalue -> int array -> llvalue
    706                             = "llvm_const_extractvalue"
    707 external const_insertvalue : llvalue -> llvalue -> int array -> llvalue
    708                            = "llvm_const_insertvalue"
    709 external const_inline_asm : lltype -> string -> string -> bool -> bool ->
    710                             llvalue
    711                           = "llvm_const_inline_asm"
    712 external block_address : llvalue -> llbasicblock -> llvalue = "LLVMBlockAddress"
    713 
    714 (*--... Operations on global variables, functions, and aliases (globals) ...--*)
    715 external global_parent : llvalue -> llmodule = "LLVMGetGlobalParent"
    716 external is_declaration : llvalue -> bool = "llvm_is_declaration"
    717 external linkage : llvalue -> Linkage.t = "llvm_linkage"
    718 external set_linkage : Linkage.t -> llvalue -> unit = "llvm_set_linkage"
    719 external unnamed_addr : llvalue -> bool = "llvm_unnamed_addr"
    720 external set_unnamed_addr : bool -> llvalue -> unit = "llvm_set_unnamed_addr"
    721 external section : llvalue -> string = "llvm_section"
    722 external set_section : string -> llvalue -> unit = "llvm_set_section"
    723 external visibility : llvalue -> Visibility.t = "llvm_visibility"
    724 external set_visibility : Visibility.t -> llvalue -> unit = "llvm_set_visibility"
    725 external dll_storage_class : llvalue -> DLLStorageClass.t = "llvm_dll_storage_class"
    726 external set_dll_storage_class : DLLStorageClass.t -> llvalue -> unit = "llvm_set_dll_storage_class"
    727 external alignment : llvalue -> int = "llvm_alignment"
    728 external set_alignment : int -> llvalue -> unit = "llvm_set_alignment"
    729 external global_copy_all_metadata : llvalue -> (llmdkind * llmetadata) array
    730                                   = "llvm_global_copy_all_metadata"
    731 external is_global_constant : llvalue -> bool = "llvm_is_global_constant"
    732 external set_global_constant : bool -> llvalue -> unit
    733                              = "llvm_set_global_constant"
    734 
    735 (*--... Operations on global variables .....................................--*)
    736 external declare_global : lltype -> string -> llmodule -> llvalue
    737                         = "llvm_declare_global"
    738 external declare_qualified_global : lltype -> string -> int -> llmodule ->
    739                                     llvalue
    740                                   = "llvm_declare_qualified_global"
    741 external define_global : string -> llvalue -> llmodule -> llvalue
    742                        = "llvm_define_global"
    743 external define_qualified_global : string -> llvalue -> int -> llmodule ->
    744                                    llvalue
    745                                  = "llvm_define_qualified_global"
    746 external lookup_global : string -> llmodule -> llvalue option
    747                        = "llvm_lookup_global"
    748 external delete_global : llvalue -> unit = "llvm_delete_global"
    749 external global_initializer : llvalue -> llvalue option = "llvm_global_initializer"
    750 external set_initializer : llvalue -> llvalue -> unit = "llvm_set_initializer"
    751 external remove_initializer : llvalue -> unit = "llvm_remove_initializer"
    752 external is_thread_local : llvalue -> bool = "llvm_is_thread_local"
    753 external set_thread_local : bool -> llvalue -> unit = "llvm_set_thread_local"
    754 external thread_local_mode : llvalue -> ThreadLocalMode.t
    755                            = "llvm_thread_local_mode"
    756 external set_thread_local_mode : ThreadLocalMode.t -> llvalue -> unit
    757                                = "llvm_set_thread_local_mode"
    758 external is_externally_initialized : llvalue -> bool
    759                                    = "llvm_is_externally_initialized"
    760 external set_externally_initialized : bool -> llvalue -> unit
    761                                     = "llvm_set_externally_initialized"
    762 external global_begin : llmodule -> (llmodule, llvalue) llpos
    763                       = "llvm_global_begin"
    764 external global_succ : llvalue -> (llmodule, llvalue) llpos
    765                      = "llvm_global_succ"
    766 external global_end : llmodule -> (llmodule, llvalue) llrev_pos
    767                     = "llvm_global_end"
    768 external global_pred : llvalue -> (llmodule, llvalue) llrev_pos
    769                      = "llvm_global_pred"
    770 
    771 let rec iter_global_range f i e =
    772   if i = e then () else
    773   match i with
    774   | At_end _ -> raise (Invalid_argument "Invalid global variable range.")
    775   | Before bb ->
    776       f bb;
    777       iter_global_range f (global_succ bb) e
    778 
    779 let iter_globals f m =
    780   iter_global_range f (global_begin m) (At_end m)
    781 
    782 let rec fold_left_global_range f init i e =
    783   if i = e then init else
    784   match i with
    785   | At_end _ -> raise (Invalid_argument "Invalid global variable range.")
    786   | Before bb -> fold_left_global_range f (f init bb) (global_succ bb) e
    787 
    788 let fold_left_globals f init m =
    789   fold_left_global_range f init (global_begin m) (At_end m)
    790 
    791 let rec rev_iter_global_range f i e =
    792   if i = e then () else
    793   match i with
    794   | At_start _ -> raise (Invalid_argument "Invalid global variable range.")
    795   | After bb ->
    796       f bb;
    797       rev_iter_global_range f (global_pred bb) e
    798 
    799 let rev_iter_globals f m =
    800   rev_iter_global_range f (global_end m) (At_start m)
    801 
    802 let rec fold_right_global_range f i e init =
    803   if i = e then init else
    804   match i with
    805   | At_start _ -> raise (Invalid_argument "Invalid global variable range.")
    806   | After bb -> fold_right_global_range f (global_pred bb) e (f bb init)
    807 
    808 let fold_right_globals f m init =
    809   fold_right_global_range f (global_end m) (At_start m) init
    810 
    811 (*--... Operations on aliases ..............................................--*)
    812 external add_alias : llmodule -> lltype -> llvalue -> string -> llvalue
    813                    = "llvm_add_alias"
    814 
    815 (*--... Operations on functions ............................................--*)
    816 external declare_function : string -> lltype -> llmodule -> llvalue
    817                           = "llvm_declare_function"
    818 external define_function : string -> lltype -> llmodule -> llvalue
    819                          = "llvm_define_function"
    820 external lookup_function : string -> llmodule -> llvalue option
    821                          = "llvm_lookup_function"
    822 external delete_function : llvalue -> unit = "llvm_delete_function"
    823 external is_intrinsic : llvalue -> bool = "llvm_is_intrinsic"
    824 external function_call_conv : llvalue -> int = "llvm_function_call_conv"
    825 external set_function_call_conv : int -> llvalue -> unit
    826                                 = "llvm_set_function_call_conv"
    827 external gc : llvalue -> string option = "llvm_gc"
    828 external set_gc : string option -> llvalue -> unit = "llvm_set_gc"
    829 external function_begin : llmodule -> (llmodule, llvalue) llpos
    830                         = "llvm_function_begin"
    831 external function_succ : llvalue -> (llmodule, llvalue) llpos
    832                        = "llvm_function_succ"
    833 external function_end : llmodule -> (llmodule, llvalue) llrev_pos
    834                       = "llvm_function_end"
    835 external function_pred : llvalue -> (llmodule, llvalue) llrev_pos
    836                        = "llvm_function_pred"
    837 
    838 let rec iter_function_range f i e =
    839   if i = e then () else
    840   match i with
    841   | At_end _ -> raise (Invalid_argument "Invalid function range.")
    842   | Before fn ->
    843       f fn;
    844       iter_function_range f (function_succ fn) e
    845 
    846 let iter_functions f m =
    847   iter_function_range f (function_begin m) (At_end m)
    848 
    849 let rec fold_left_function_range f init i e =
    850   if i = e then init else
    851   match i with
    852   | At_end _ -> raise (Invalid_argument "Invalid function range.")
    853   | Before fn -> fold_left_function_range f (f init fn) (function_succ fn) e
    854 
    855 let fold_left_functions f init m =
    856   fold_left_function_range f init (function_begin m) (At_end m)
    857 
    858 let rec rev_iter_function_range f i e =
    859   if i = e then () else
    860   match i with
    861   | At_start _ -> raise (Invalid_argument "Invalid function range.")
    862   | After fn ->
    863       f fn;
    864       rev_iter_function_range f (function_pred fn) e
    865 
    866 let rev_iter_functions f m =
    867   rev_iter_function_range f (function_end m) (At_start m)
    868 
    869 let rec fold_right_function_range f i e init =
    870   if i = e then init else
    871   match i with
    872   | At_start _ -> raise (Invalid_argument "Invalid function range.")
    873   | After fn -> fold_right_function_range f (function_pred fn) e (f fn init)
    874 
    875 let fold_right_functions f m init =
    876   fold_right_function_range f (function_end m) (At_start m) init
    877 
    878 external llvm_add_function_attr : llvalue -> llattribute -> int -> unit
    879                                 = "llvm_add_function_attr"
    880 external llvm_function_attrs : llvalue -> int -> llattribute array
    881                              = "llvm_function_attrs"
    882 external llvm_remove_enum_function_attr : llvalue -> llattrkind -> int -> unit
    883                                         = "llvm_remove_enum_function_attr"
    884 external llvm_remove_string_function_attr : llvalue -> string -> int -> unit
    885                                           = "llvm_remove_string_function_attr"
    886 
    887 let add_function_attr f a i =
    888   llvm_add_function_attr f a (AttrIndex.to_int i)
    889 let function_attrs f i =
    890   llvm_function_attrs f (AttrIndex.to_int i)
    891 let remove_enum_function_attr f k i =
    892   llvm_remove_enum_function_attr f k (AttrIndex.to_int i)
    893 let remove_string_function_attr f k i =
    894   llvm_remove_string_function_attr f k (AttrIndex.to_int i)
    895 
    896 (*--... Operations on params ...............................................--*)
    897 external params : llvalue -> llvalue array = "llvm_params"
    898 external param : llvalue -> int -> llvalue = "llvm_param"
    899 external param_parent : llvalue -> llvalue = "LLVMGetParamParent"
    900 external param_begin : llvalue -> (llvalue, llvalue) llpos = "llvm_param_begin"
    901 external param_succ : llvalue -> (llvalue, llvalue) llpos = "llvm_param_succ"
    902 external param_end : llvalue -> (llvalue, llvalue) llrev_pos = "llvm_param_end"
    903 external param_pred : llvalue -> (llvalue, llvalue) llrev_pos ="llvm_param_pred"
    904 
    905 let rec iter_param_range f i e =
    906   if i = e then () else
    907   match i with
    908   | At_end _ -> raise (Invalid_argument "Invalid parameter range.")
    909   | Before p ->
    910       f p;
    911       iter_param_range f (param_succ p) e
    912 
    913 let iter_params f fn =
    914   iter_param_range f (param_begin fn) (At_end fn)
    915 
    916 let rec fold_left_param_range f init i e =
    917   if i = e then init else
    918   match i with
    919   | At_end _ -> raise (Invalid_argument "Invalid parameter range.")
    920   | Before p -> fold_left_param_range f (f init p) (param_succ p) e
    921 
    922 let fold_left_params f init fn =
    923   fold_left_param_range f init (param_begin fn) (At_end fn)
    924 
    925 let rec rev_iter_param_range f i e =
    926   if i = e then () else
    927   match i with
    928   | At_start _ -> raise (Invalid_argument "Invalid parameter range.")
    929   | After p ->
    930       f p;
    931       rev_iter_param_range f (param_pred p) e
    932 
    933 let rev_iter_params f fn =
    934   rev_iter_param_range f (param_end fn) (At_start fn)
    935 
    936 let rec fold_right_param_range f init i e =
    937   if i = e then init else
    938   match i with
    939   | At_start _ -> raise (Invalid_argument "Invalid parameter range.")
    940   | After p -> fold_right_param_range f (f p init) (param_pred p) e
    941 
    942 let fold_right_params f fn init =
    943   fold_right_param_range f init (param_end fn) (At_start fn)
    944 
    945 (*--... Operations on basic blocks .........................................--*)
    946 external value_of_block : llbasicblock -> llvalue = "LLVMBasicBlockAsValue"
    947 external value_is_block : llvalue -> bool = "llvm_value_is_block"
    948 external block_of_value : llvalue -> llbasicblock = "LLVMValueAsBasicBlock"
    949 external block_parent : llbasicblock -> llvalue = "LLVMGetBasicBlockParent"
    950 external basic_blocks : llvalue -> llbasicblock array = "llvm_basic_blocks"
    951 external entry_block : llvalue -> llbasicblock = "LLVMGetEntryBasicBlock"
    952 external delete_block : llbasicblock -> unit = "llvm_delete_block"
    953 external remove_block : llbasicblock -> unit = "llvm_remove_block"
    954 external move_block_before : llbasicblock -> llbasicblock -> unit
    955                            = "llvm_move_block_before"
    956 external move_block_after : llbasicblock -> llbasicblock -> unit
    957                           = "llvm_move_block_after"
    958 external append_block : llcontext -> string -> llvalue -> llbasicblock
    959                       = "llvm_append_block"
    960 external insert_block : llcontext -> string -> llbasicblock -> llbasicblock
    961                       = "llvm_insert_block"
    962 external block_begin : llvalue -> (llvalue, llbasicblock) llpos
    963                      = "llvm_block_begin"
    964 external block_succ : llbasicblock -> (llvalue, llbasicblock) llpos
    965                     = "llvm_block_succ"
    966 external block_end : llvalue -> (llvalue, llbasicblock) llrev_pos
    967                    = "llvm_block_end"
    968 external block_pred : llbasicblock -> (llvalue, llbasicblock) llrev_pos
    969                     = "llvm_block_pred"
    970 external block_terminator : llbasicblock -> llvalue option =
    971     "llvm_block_terminator"
    972 
    973 let rec iter_block_range f i e =
    974   if i = e then () else
    975   match i with
    976   | At_end _ -> raise (Invalid_argument "Invalid block range.")
    977   | Before bb ->
    978       f bb;
    979       iter_block_range f (block_succ bb) e
    980 
    981 let iter_blocks f fn =
    982   iter_block_range f (block_begin fn) (At_end fn)
    983 
    984 let rec fold_left_block_range f init i e =
    985   if i = e then init else
    986   match i with
    987   | At_end _ -> raise (Invalid_argument "Invalid block range.")
    988   | Before bb -> fold_left_block_range f (f init bb) (block_succ bb) e
    989 
    990 let fold_left_blocks f init fn =
    991   fold_left_block_range f init (block_begin fn) (At_end fn)
    992 
    993 let rec rev_iter_block_range f i e =
    994   if i = e then () else
    995   match i with
    996   | At_start _ -> raise (Invalid_argument "Invalid block range.")
    997   | After bb ->
    998       f bb;
    999       rev_iter_block_range f (block_pred bb) e
   1000 
   1001 let rev_iter_blocks f fn =
   1002   rev_iter_block_range f (block_end fn) (At_start fn)
   1003 
   1004 let rec fold_right_block_range f init i e =
   1005   if i = e then init else
   1006   match i with
   1007   | At_start _ -> raise (Invalid_argument "Invalid block range.")
   1008   | After bb -> fold_right_block_range f (f bb init) (block_pred bb) e
   1009 
   1010 let fold_right_blocks f fn init =
   1011   fold_right_block_range f init (block_end fn) (At_start fn)
   1012 
   1013 (*--... Operations on instructions .........................................--*)
   1014 external instr_parent : llvalue -> llbasicblock = "LLVMGetInstructionParent"
   1015 external instr_begin : llbasicblock -> (llbasicblock, llvalue) llpos
   1016                      = "llvm_instr_begin"
   1017 external instr_succ : llvalue -> (llbasicblock, llvalue) llpos
   1018                      = "llvm_instr_succ"
   1019 external instr_end : llbasicblock -> (llbasicblock, llvalue) llrev_pos
   1020                      = "llvm_instr_end"
   1021 external instr_pred : llvalue -> (llbasicblock, llvalue) llrev_pos
   1022                      = "llvm_instr_pred"
   1023 
   1024 external instr_opcode : llvalue -> Opcode.t = "llvm_instr_get_opcode"
   1025 external icmp_predicate : llvalue -> Icmp.t option = "llvm_instr_icmp_predicate"
   1026 external fcmp_predicate : llvalue -> Fcmp.t option = "llvm_instr_fcmp_predicate"
   1027 external instr_clone : llvalue -> llvalue = "llvm_instr_clone"
   1028 
   1029 let rec iter_instrs_range f i e =
   1030   if i = e then () else
   1031   match i with
   1032   | At_end _ -> raise (Invalid_argument "Invalid instruction range.")
   1033   | Before i ->
   1034       f i;
   1035       iter_instrs_range f (instr_succ i) e
   1036 
   1037 let iter_instrs f bb =
   1038   iter_instrs_range f (instr_begin bb) (At_end bb)
   1039 
   1040 let rec fold_left_instrs_range f init i e =
   1041   if i = e then init else
   1042   match i with
   1043   | At_end _ -> raise (Invalid_argument "Invalid instruction range.")
   1044   | Before i -> fold_left_instrs_range f (f init i) (instr_succ i) e
   1045 
   1046 let fold_left_instrs f init bb =
   1047   fold_left_instrs_range f init (instr_begin bb) (At_end bb)
   1048 
   1049 let rec rev_iter_instrs_range f i e =
   1050   if i = e then () else
   1051   match i with
   1052   | At_start _ -> raise (Invalid_argument "Invalid instruction range.")
   1053   | After i ->
   1054       f i;
   1055       rev_iter_instrs_range f (instr_pred i) e
   1056 
   1057 let rev_iter_instrs f bb =
   1058   rev_iter_instrs_range f (instr_end bb) (At_start bb)
   1059 
   1060 let rec fold_right_instr_range f i e init =
   1061   if i = e then init else
   1062   match i with
   1063   | At_start _ -> raise (Invalid_argument "Invalid instruction range.")
   1064   | After i -> fold_right_instr_range f (instr_pred i) e (f i init)
   1065 
   1066 let fold_right_instrs f bb init =
   1067   fold_right_instr_range f (instr_end bb) (At_start bb) init
   1068 
   1069 
   1070 (*--... Operations on call sites ...........................................--*)
   1071 external instruction_call_conv: llvalue -> int
   1072                               = "llvm_instruction_call_conv"
   1073 external set_instruction_call_conv: int -> llvalue -> unit
   1074                                   = "llvm_set_instruction_call_conv"
   1075 
   1076 external llvm_add_call_site_attr : llvalue -> llattribute -> int -> unit
   1077                                 = "llvm_add_call_site_attr"
   1078 external llvm_call_site_attrs : llvalue -> int -> llattribute array
   1079                              = "llvm_call_site_attrs"
   1080 external llvm_remove_enum_call_site_attr : llvalue -> llattrkind -> int -> unit
   1081                                         = "llvm_remove_enum_call_site_attr"
   1082 external llvm_remove_string_call_site_attr : llvalue -> string -> int -> unit
   1083                                           = "llvm_remove_string_call_site_attr"
   1084 
   1085 let add_call_site_attr f a i =
   1086   llvm_add_call_site_attr f a (AttrIndex.to_int i)
   1087 let call_site_attrs f i =
   1088   llvm_call_site_attrs f (AttrIndex.to_int i)
   1089 let remove_enum_call_site_attr f k i =
   1090   llvm_remove_enum_call_site_attr f k (AttrIndex.to_int i)
   1091 let remove_string_call_site_attr f k i =
   1092   llvm_remove_string_call_site_attr f k (AttrIndex.to_int i)
   1093 
   1094 (*--... Operations on call and invoke instructions (only) ..................--*)
   1095 external num_arg_operands : llvalue -> int = "llvm_num_arg_operands"
   1096 external is_tail_call : llvalue -> bool = "llvm_is_tail_call"
   1097 external set_tail_call : bool -> llvalue -> unit = "llvm_set_tail_call"
   1098 external get_normal_dest : llvalue -> llbasicblock = "LLVMGetNormalDest"
   1099 external get_unwind_dest : llvalue -> llbasicblock = "LLVMGetUnwindDest"
   1100 
   1101 (*--... Operations on load/store instructions (only) .......................--*)
   1102 external is_volatile : llvalue -> bool = "llvm_is_volatile"
   1103 external set_volatile : bool -> llvalue -> unit = "llvm_set_volatile"
   1104 
   1105 (*--... Operations on terminators ..........................................--*)
   1106 
   1107 let is_terminator llv =
   1108   let open ValueKind in
   1109   let open Opcode in
   1110   match classify_value llv with
   1111     | Instruction (Br | IndirectBr | Invoke | Resume | Ret | Switch | Unreachable)
   1112       -> true
   1113     | _ -> false
   1114 
   1115 external successor : llvalue -> int -> llbasicblock = "llvm_successor"
   1116 external set_successor : llvalue -> int -> llbasicblock -> unit
   1117                        = "llvm_set_successor"
   1118 external num_successors : llvalue -> int = "llvm_num_successors"
   1119 
   1120 let successors llv =
   1121   if not (is_terminator llv) then
   1122     raise (Invalid_argument "Llvm.successors can only be used on terminators")
   1123   else
   1124     Array.init (num_successors llv) (successor llv)
   1125 
   1126 let iter_successors f llv =
   1127   if not (is_terminator llv) then
   1128     raise (Invalid_argument "Llvm.iter_successors can only be used on terminators")
   1129   else
   1130     for i = 0 to num_successors llv - 1 do
   1131       f (successor llv i)
   1132     done
   1133 
   1134 let fold_successors f llv z =
   1135   if not (is_terminator llv) then
   1136     raise (Invalid_argument "Llvm.fold_successors can only be used on terminators")
   1137   else
   1138     let n = num_successors llv in
   1139     let rec aux i acc =
   1140       if i >= n then acc
   1141       else begin
   1142         let llb = successor llv i in
   1143         aux (i+1) (f llb acc)
   1144       end
   1145     in aux 0 z
   1146 
   1147 
   1148 (*--... Operations on branches .............................................--*)
   1149 external condition : llvalue -> llvalue = "llvm_condition"
   1150 external set_condition : llvalue -> llvalue -> unit
   1151                        = "llvm_set_condition"
   1152 external is_conditional : llvalue -> bool = "llvm_is_conditional"
   1153 
   1154 let get_branch llv =
   1155   if classify_value llv <> ValueKind.Instruction Opcode.Br then
   1156     None
   1157   else if is_conditional llv then
   1158     Some (`Conditional (condition llv, successor llv 0, successor llv 1))
   1159   else
   1160     Some (`Unconditional (successor llv 0))
   1161 
   1162 (*--... Operations on phi nodes ............................................--*)
   1163 external add_incoming : (llvalue * llbasicblock) -> llvalue -> unit
   1164                       = "llvm_add_incoming"
   1165 external incoming : llvalue -> (llvalue * llbasicblock) list = "llvm_incoming"
   1166 
   1167 external delete_instruction : llvalue -> unit = "llvm_delete_instruction"
   1168 
   1169 (*===-- Instruction builders ----------------------------------------------===*)
   1170 external builder : llcontext -> llbuilder = "llvm_builder"
   1171 external position_builder : (llbasicblock, llvalue) llpos -> llbuilder -> unit
   1172                           = "llvm_position_builder"
   1173 external insertion_block : llbuilder -> llbasicblock = "llvm_insertion_block"
   1174 external insert_into_builder : llvalue -> string -> llbuilder -> unit
   1175                              = "llvm_insert_into_builder"
   1176 
   1177 let builder_at context ip =
   1178   let b = builder context in
   1179   position_builder ip b;
   1180   b
   1181 
   1182 let builder_before context i = builder_at context (Before i)
   1183 let builder_at_end context bb = builder_at context (At_end bb)
   1184 
   1185 let position_before i = position_builder (Before i)
   1186 let position_at_end bb = position_builder (At_end bb)
   1187 
   1188 
   1189 (*--... Metadata ...........................................................--*)
   1190 external set_current_debug_location : llbuilder -> llvalue -> unit
   1191                                     = "llvm_set_current_debug_location"
   1192 external clear_current_debug_location : llbuilder -> unit
   1193                                       = "llvm_clear_current_debug_location"
   1194 external current_debug_location : llbuilder -> llvalue option
   1195                                     = "llvm_current_debug_location"
   1196 external set_inst_debug_location : llbuilder -> llvalue -> unit
   1197                                  = "llvm_set_inst_debug_location"
   1198 
   1199 
   1200 (*--... Terminators ........................................................--*)
   1201 external build_ret_void : llbuilder -> llvalue = "llvm_build_ret_void"
   1202 external build_ret : llvalue -> llbuilder -> llvalue = "llvm_build_ret"
   1203 external build_aggregate_ret : llvalue array -> llbuilder -> llvalue
   1204                              = "llvm_build_aggregate_ret"
   1205 external build_br : llbasicblock -> llbuilder -> llvalue = "llvm_build_br"
   1206 external build_cond_br : llvalue -> llbasicblock -> llbasicblock -> llbuilder ->
   1207                          llvalue = "llvm_build_cond_br"
   1208 external build_switch : llvalue -> llbasicblock -> int -> llbuilder -> llvalue
   1209                       = "llvm_build_switch"
   1210 external build_malloc : lltype -> string -> llbuilder -> llvalue =
   1211     "llvm_build_malloc"
   1212 external build_array_malloc : lltype -> llvalue -> string -> llbuilder ->
   1213     llvalue = "llvm_build_array_malloc"
   1214 external build_free : llvalue -> llbuilder -> llvalue = "llvm_build_free"
   1215 external add_case : llvalue -> llvalue -> llbasicblock -> unit
   1216                   = "llvm_add_case"
   1217 external switch_default_dest : llvalue -> llbasicblock =
   1218     "LLVMGetSwitchDefaultDest"
   1219 external build_indirect_br : llvalue -> int -> llbuilder -> llvalue
   1220                            = "llvm_build_indirect_br"
   1221 external add_destination : llvalue -> llbasicblock -> unit
   1222                          = "llvm_add_destination"
   1223 external build_invoke : llvalue -> llvalue array -> llbasicblock ->
   1224                         llbasicblock -> string -> llbuilder -> llvalue
   1225                       = "llvm_build_invoke_bc" "llvm_build_invoke_nat"
   1226 external build_landingpad : lltype -> llvalue -> int -> string -> llbuilder ->
   1227                             llvalue = "llvm_build_landingpad"
   1228 external is_cleanup : llvalue -> bool = "llvm_is_cleanup"
   1229 external set_cleanup : llvalue -> bool -> unit = "llvm_set_cleanup"
   1230 external add_clause : llvalue -> llvalue -> unit = "llvm_add_clause"
   1231 external build_resume : llvalue -> llbuilder -> llvalue = "llvm_build_resume"
   1232 external build_unreachable : llbuilder -> llvalue = "llvm_build_unreachable"
   1233 
   1234 (*--... Arithmetic .........................................................--*)
   1235 external build_add : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1236                    = "llvm_build_add"
   1237 external build_nsw_add : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1238                        = "llvm_build_nsw_add"
   1239 external build_nuw_add : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1240                        = "llvm_build_nuw_add"
   1241 external build_fadd : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1242                     = "llvm_build_fadd"
   1243 external build_sub : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1244                    = "llvm_build_sub"
   1245 external build_nsw_sub : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1246                        = "llvm_build_nsw_sub"
   1247 external build_nuw_sub : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1248                        = "llvm_build_nuw_sub"
   1249 external build_fsub : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1250                     = "llvm_build_fsub"
   1251 external build_mul : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1252                    = "llvm_build_mul"
   1253 external build_nsw_mul : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1254                        = "llvm_build_nsw_mul"
   1255 external build_nuw_mul : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1256                        = "llvm_build_nuw_mul"
   1257 external build_fmul : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1258                     = "llvm_build_fmul"
   1259 external build_udiv : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1260                     = "llvm_build_udiv"
   1261 external build_sdiv : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1262                     = "llvm_build_sdiv"
   1263 external build_exact_sdiv : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1264                           = "llvm_build_exact_sdiv"
   1265 external build_fdiv : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1266                     = "llvm_build_fdiv"
   1267 external build_urem : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1268                     = "llvm_build_urem"
   1269 external build_srem : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1270                     = "llvm_build_srem"
   1271 external build_frem : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1272                     = "llvm_build_frem"
   1273 external build_shl : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1274                    = "llvm_build_shl"
   1275 external build_lshr : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1276                     = "llvm_build_lshr"
   1277 external build_ashr : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1278                     = "llvm_build_ashr"
   1279 external build_and : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1280                    = "llvm_build_and"
   1281 external build_or : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1282                   = "llvm_build_or"
   1283 external build_xor : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1284                    = "llvm_build_xor"
   1285 external build_neg : llvalue -> string -> llbuilder -> llvalue
   1286                    = "llvm_build_neg"
   1287 external build_nsw_neg : llvalue -> string -> llbuilder -> llvalue
   1288                        = "llvm_build_nsw_neg"
   1289 external build_nuw_neg : llvalue -> string -> llbuilder -> llvalue
   1290                        = "llvm_build_nuw_neg"
   1291 external build_fneg : llvalue -> string -> llbuilder -> llvalue
   1292                     = "llvm_build_fneg"
   1293 external build_not : llvalue -> string -> llbuilder -> llvalue
   1294                    = "llvm_build_not"
   1295 
   1296 (*--... Memory .............................................................--*)
   1297 external build_alloca : lltype -> string -> llbuilder -> llvalue
   1298                       = "llvm_build_alloca"
   1299 external build_array_alloca : lltype -> llvalue -> string -> llbuilder ->
   1300                               llvalue = "llvm_build_array_alloca"
   1301 external build_load : llvalue -> string -> llbuilder -> llvalue
   1302                     = "llvm_build_load"
   1303 external build_store : llvalue -> llvalue -> llbuilder -> llvalue
   1304                      = "llvm_build_store"
   1305 external build_atomicrmw : AtomicRMWBinOp.t -> llvalue -> llvalue ->
   1306                            AtomicOrdering.t -> bool -> string -> llbuilder ->
   1307                            llvalue
   1308                          = "llvm_build_atomicrmw_bytecode"
   1309                            "llvm_build_atomicrmw_native"
   1310 external build_gep : llvalue -> llvalue array -> string -> llbuilder -> llvalue
   1311                    = "llvm_build_gep"
   1312 external build_in_bounds_gep : llvalue -> llvalue array -> string ->
   1313                              llbuilder -> llvalue = "llvm_build_in_bounds_gep"
   1314 external build_struct_gep : llvalue -> int -> string -> llbuilder -> llvalue
   1315                          = "llvm_build_struct_gep"
   1316 
   1317 external build_global_string : string -> string -> llbuilder -> llvalue
   1318                              = "llvm_build_global_string"
   1319 external build_global_stringptr  : string -> string -> llbuilder -> llvalue
   1320                                  = "llvm_build_global_stringptr"
   1321 
   1322 (*--... Casts ..............................................................--*)
   1323 external build_trunc : llvalue -> lltype -> string -> llbuilder -> llvalue
   1324                      = "llvm_build_trunc"
   1325 external build_zext : llvalue -> lltype -> string -> llbuilder -> llvalue
   1326                     = "llvm_build_zext"
   1327 external build_sext : llvalue -> lltype -> string -> llbuilder -> llvalue
   1328                     = "llvm_build_sext"
   1329 external build_fptoui : llvalue -> lltype -> string -> llbuilder -> llvalue
   1330                       = "llvm_build_fptoui"
   1331 external build_fptosi : llvalue -> lltype -> string -> llbuilder -> llvalue
   1332                       = "llvm_build_fptosi"
   1333 external build_uitofp : llvalue -> lltype -> string -> llbuilder -> llvalue
   1334                       = "llvm_build_uitofp"
   1335 external build_sitofp : llvalue -> lltype -> string -> llbuilder -> llvalue
   1336                       = "llvm_build_sitofp"
   1337 external build_fptrunc : llvalue -> lltype -> string -> llbuilder -> llvalue
   1338                        = "llvm_build_fptrunc"
   1339 external build_fpext : llvalue -> lltype -> string -> llbuilder -> llvalue
   1340                      = "llvm_build_fpext"
   1341 external build_ptrtoint : llvalue -> lltype -> string -> llbuilder -> llvalue
   1342                         = "llvm_build_prttoint"
   1343 external build_inttoptr : llvalue -> lltype -> string -> llbuilder -> llvalue
   1344                         = "llvm_build_inttoptr"
   1345 external build_bitcast : llvalue -> lltype -> string -> llbuilder -> llvalue
   1346                        = "llvm_build_bitcast"
   1347 external build_zext_or_bitcast : llvalue -> lltype -> string -> llbuilder ->
   1348                                  llvalue = "llvm_build_zext_or_bitcast"
   1349 external build_sext_or_bitcast : llvalue -> lltype -> string -> llbuilder ->
   1350                                  llvalue = "llvm_build_sext_or_bitcast"
   1351 external build_trunc_or_bitcast : llvalue -> lltype -> string -> llbuilder ->
   1352                                   llvalue = "llvm_build_trunc_or_bitcast"
   1353 external build_pointercast : llvalue -> lltype -> string -> llbuilder -> llvalue
   1354                            = "llvm_build_pointercast"
   1355 external build_intcast : llvalue -> lltype -> string -> llbuilder -> llvalue
   1356                        = "llvm_build_intcast"
   1357 external build_fpcast : llvalue -> lltype -> string -> llbuilder -> llvalue
   1358                       = "llvm_build_fpcast"
   1359 
   1360 (*--... Comparisons ........................................................--*)
   1361 external build_icmp : Icmp.t -> llvalue -> llvalue -> string ->
   1362                       llbuilder -> llvalue = "llvm_build_icmp"
   1363 external build_fcmp : Fcmp.t -> llvalue -> llvalue -> string ->
   1364                       llbuilder -> llvalue = "llvm_build_fcmp"
   1365 
   1366 (*--... Miscellaneous instructions .........................................--*)
   1367 external build_phi : (llvalue * llbasicblock) list -> string -> llbuilder ->
   1368                      llvalue = "llvm_build_phi"
   1369 external build_empty_phi : lltype -> string -> llbuilder -> llvalue
   1370                          = "llvm_build_empty_phi"
   1371 external build_call : llvalue -> llvalue array -> string -> llbuilder -> llvalue
   1372                     = "llvm_build_call"
   1373 external build_select : llvalue -> llvalue -> llvalue -> string -> llbuilder ->
   1374                         llvalue = "llvm_build_select"
   1375 external build_va_arg : llvalue -> lltype -> string -> llbuilder -> llvalue
   1376                       = "llvm_build_va_arg"
   1377 external build_extractelement : llvalue -> llvalue -> string -> llbuilder ->
   1378                                 llvalue = "llvm_build_extractelement"
   1379 external build_insertelement : llvalue -> llvalue -> llvalue -> string ->
   1380                                llbuilder -> llvalue = "llvm_build_insertelement"
   1381 external build_shufflevector : llvalue -> llvalue -> llvalue -> string ->
   1382                                llbuilder -> llvalue = "llvm_build_shufflevector"
   1383 external build_extractvalue : llvalue -> int -> string -> llbuilder -> llvalue
   1384                             = "llvm_build_extractvalue"
   1385 external build_insertvalue : llvalue -> llvalue -> int -> string -> llbuilder ->
   1386                              llvalue = "llvm_build_insertvalue"
   1387 
   1388 external build_is_null : llvalue -> string -> llbuilder -> llvalue
   1389                        = "llvm_build_is_null"
   1390 external build_is_not_null : llvalue -> string -> llbuilder -> llvalue
   1391                            = "llvm_build_is_not_null"
   1392 external build_ptrdiff : llvalue -> llvalue -> string -> llbuilder -> llvalue
   1393                        = "llvm_build_ptrdiff"
   1394 external build_freeze : llvalue -> string -> llbuilder -> llvalue
   1395                       = "llvm_build_freeze"
   1396 
   1397 
   1398 (*===-- Memory buffers ----------------------------------------------------===*)
   1399 
   1400 module MemoryBuffer = struct
   1401   external of_file : string -> llmemorybuffer = "llvm_memorybuffer_of_file"
   1402   external of_stdin : unit -> llmemorybuffer = "llvm_memorybuffer_of_stdin"
   1403   external of_string : ?name:string -> string -> llmemorybuffer
   1404                      = "llvm_memorybuffer_of_string"
   1405   external as_string : llmemorybuffer -> string = "llvm_memorybuffer_as_string"
   1406   external dispose : llmemorybuffer -> unit = "llvm_memorybuffer_dispose"
   1407 end
   1408 
   1409 
   1410 (*===-- Pass Manager ------------------------------------------------------===*)
   1411 
   1412 module PassManager = struct
   1413   type 'a t
   1414   type any = [ `Module | `Function ]
   1415   external create : unit -> [ `Module ] t = "llvm_passmanager_create"
   1416   external create_function : llmodule -> [ `Function ] t
   1417                            = "LLVMCreateFunctionPassManager"
   1418   external run_module : llmodule -> [ `Module ] t -> bool
   1419                       = "llvm_passmanager_run_module"
   1420   external initialize : [ `Function ] t -> bool = "llvm_passmanager_initialize"
   1421   external run_function : llvalue -> [ `Function ] t -> bool
   1422                         = "llvm_passmanager_run_function"
   1423   external finalize : [ `Function ] t -> bool = "llvm_passmanager_finalize"
   1424   external dispose : [< any ] t -> unit = "llvm_passmanager_dispose"
   1425 end
   1426