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
10type llcontext
11type llmodule
12type llmetadata
13type lltype
14type llvalue
15type lluse
16type llbasicblock
17type llbuilder
18type llattrkind
19type llattribute
20type llmemorybuffer
21type llmdkind
22
23exception FeatureDisabled of string
24
25let () = Callback.register_exception "Llvm.FeatureDisabled" (FeatureDisabled "")
26
27module 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
49end
50
51module 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
70end
71
72module Visibility = struct
73  type t =
74  | Default
75  | Hidden
76  | Protected
77end
78
79module DLLStorageClass = struct
80  type t =
81  | Default
82  | DLLImport
83  | DLLExport
84end
85
86module CallConv = struct
87  let c = 0
88  let fast = 8
89  let cold = 9
90  let x86_stdcall = 64
91  let x86_fastcall = 65
92end
93
94module AttrRepr = struct
95  type t =
96  | Enum of llattrkind * int64
97  | String of string * string
98end
99
100module 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
111end
112
113module 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
141end
142
143module 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
155end
156
157module 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
175end
176
177module 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
254end
255
256module LandingPadClauseTy = struct
257  type t =
258  | Catch
259  | Filter
260end
261
262module ThreadLocalMode = struct
263  type t =
264  | None
265  | GeneralDynamic
266  | LocalDynamic
267  | InitialExec
268  | LocalExec
269end
270
271module AtomicOrdering = struct
272  type t =
273  | NotAtomic
274  | Unordered
275  | Monotonic
276  | Invalid
277  | Acquire
278  | Release
279  | AcqiureRelease
280  | SequentiallyConsistent
281end
282
283module 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
298end
299
300module 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
326end
327
328module DiagnosticSeverity = struct
329  type t =
330  | Error
331  | Warning
332  | Remark
333  | Note
334end
335
336module ModuleFlagBehavior = struct
337  type t =
338  | Error
339  | Warning
340  | Require
341  | Override
342  | Append
343  | AppendUnique
344end
345
346exception IoError of string
347
348let () = Callback.register_exception "Llvm.IoError" (IoError "")
349
350external install_fatal_error_handler : (string -> unit) -> unit
351                                     = "llvm_install_fatal_error_handler"
352external reset_fatal_error_handler : unit -> unit
353                                   = "llvm_reset_fatal_error_handler"
354external enable_pretty_stacktrace : unit -> unit
355                                  = "llvm_enable_pretty_stacktrace"
356external parse_command_line_options : ?overview:string -> string array -> unit
357                                    = "llvm_parse_command_line_options"
358
359type ('a, 'b) llpos =
360| At_end of 'a
361| Before of 'b
362
363type ('a, 'b) llrev_pos =
364| At_start of 'a
365| After of 'b
366
367
368(*===-- Context error handling --------------------------------------------===*)
369module 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"
375end
376
377external set_diagnostic_handler
378  : llcontext -> (Diagnostic.t -> unit) option -> unit
379  = "llvm_set_diagnostic_handler"
380
381(*===-- Contexts ----------------------------------------------------------===*)
382external create_context : unit -> llcontext = "llvm_create_context"
383external dispose_context : llcontext -> unit = "llvm_dispose_context"
384external global_context : unit -> llcontext = "llvm_global_context"
385external mdkind_id : llcontext -> string -> llmdkind = "llvm_mdkind_id"
386
387(*===-- Attributes --------------------------------------------------------===*)
388exception UnknownAttribute of string
389
390let () = Callback.register_exception "Llvm.UnknownAttribute"
391                                     (UnknownAttribute "")
392
393external enum_attr_kind : string -> llattrkind = "llvm_enum_attr_kind"
394external llvm_create_enum_attr : llcontext -> llattrkind -> int64 ->
395                                 llattribute
396                               = "llvm_create_enum_attr_by_kind"
397external is_enum_attr : llattribute -> bool = "llvm_is_enum_attr"
398external get_enum_attr_kind : llattribute -> llattrkind
399                            = "llvm_get_enum_attr_kind"
400external get_enum_attr_value : llattribute -> int64
401                             = "llvm_get_enum_attr_value"
402external llvm_create_string_attr : llcontext -> string -> string ->
403                                   llattribute
404                                 = "llvm_create_string_attr"
405external is_string_attr : llattribute -> bool = "llvm_is_string_attr"
406external get_string_attr_kind : llattribute -> string
407                              = "llvm_get_string_attr_kind"
408external get_string_attr_value : llattribute -> string
409                               = "llvm_get_string_attr_value"
410
411let create_enum_attr context name value =
412  llvm_create_enum_attr context (enum_attr_kind name) value
413let create_string_attr context kind value =
414  llvm_create_string_attr context kind value
415
416let 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
421let 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 -----------------------------------------------------------===*)
429external create_module : llcontext -> string -> llmodule = "llvm_create_module"
430external dispose_module : llmodule -> unit = "llvm_dispose_module"
431external target_triple: llmodule -> string
432                      = "llvm_target_triple"
433external set_target_triple: string -> llmodule -> unit
434                          = "llvm_set_target_triple"
435external data_layout: llmodule -> string
436                    = "llvm_data_layout"
437external set_data_layout: string -> llmodule -> unit
438                        = "llvm_set_data_layout"
439external dump_module : llmodule -> unit = "llvm_dump_module"
440external print_module : string -> llmodule -> unit = "llvm_print_module"
441external string_of_llmodule : llmodule -> string = "llvm_string_of_llmodule"
442external set_module_inline_asm : llmodule -> string -> unit
443                               = "llvm_set_module_inline_asm"
444external module_context : llmodule -> llcontext = "LLVMGetModuleContext"
445
446external get_module_identifier : llmodule -> string
447                               = "llvm_get_module_identifier"
448
449external set_module_identifer : llmodule -> string -> unit
450                              = "llvm_set_module_identifier"
451
452external get_module_flag : llmodule -> string -> llmetadata option
453                         = "llvm_get_module_flag"
454external add_module_flag : llmodule -> ModuleFlagBehavior.t ->
455            string -> llmetadata -> unit = "llvm_add_module_flag"
456
457(*===-- Types -------------------------------------------------------------===*)
458external classify_type : lltype -> TypeKind.t = "llvm_classify_type"
459external type_context : lltype -> llcontext = "llvm_type_context"
460external type_is_sized : lltype -> bool = "llvm_type_is_sized"
461external dump_type : lltype -> unit = "llvm_dump_type"
462external string_of_lltype : lltype -> string = "llvm_string_of_lltype"
463
464(*--... Operations on integer types ........................................--*)
465external i1_type : llcontext -> lltype = "llvm_i1_type"
466external i8_type : llcontext -> lltype = "llvm_i8_type"
467external i16_type : llcontext -> lltype = "llvm_i16_type"
468external i32_type : llcontext -> lltype = "llvm_i32_type"
469external i64_type : llcontext -> lltype = "llvm_i64_type"
470
471external integer_type : llcontext -> int -> lltype = "llvm_integer_type"
472external integer_bitwidth : lltype -> int = "llvm_integer_bitwidth"
473
474(*--... Operations on real types ...........................................--*)
475external float_type : llcontext -> lltype = "llvm_float_type"
476external double_type : llcontext -> lltype = "llvm_double_type"
477external x86fp80_type : llcontext -> lltype = "llvm_x86fp80_type"
478external fp128_type : llcontext -> lltype = "llvm_fp128_type"
479external ppc_fp128_type : llcontext -> lltype = "llvm_ppc_fp128_type"
480
481(*--... Operations on function types .......................................--*)
482external function_type : lltype -> lltype array -> lltype = "llvm_function_type"
483external var_arg_function_type : lltype -> lltype array -> lltype
484                               = "llvm_var_arg_function_type"
485external is_var_arg : lltype -> bool = "llvm_is_var_arg"
486external return_type : lltype -> lltype = "LLVMGetReturnType"
487external param_types : lltype -> lltype array = "llvm_param_types"
488
489(*--... Operations on struct types .........................................--*)
490external struct_type : llcontext -> lltype array -> lltype = "llvm_struct_type"
491external packed_struct_type : llcontext -> lltype array -> lltype
492                            = "llvm_packed_struct_type"
493external struct_name : lltype -> string option = "llvm_struct_name"
494external named_struct_type : llcontext -> string -> lltype =
495    "llvm_named_struct_type"
496external struct_set_body : lltype -> lltype array -> bool -> unit =
497    "llvm_struct_set_body"
498external struct_element_types : lltype -> lltype array
499                              = "llvm_struct_element_types"
500external is_packed : lltype -> bool = "llvm_is_packed"
501external is_opaque : lltype -> bool = "llvm_is_opaque"
502external is_literal : lltype -> bool = "llvm_is_literal"
503
504(*--... Operations on pointer, vector, and array types .....................--*)
505
506external subtypes : lltype -> lltype array = "llvm_subtypes"
507external array_type : lltype -> int -> lltype = "llvm_array_type"
508external pointer_type : lltype -> lltype = "llvm_pointer_type"
509external qualified_pointer_type : lltype -> int -> lltype
510                                = "llvm_qualified_pointer_type"
511external vector_type : lltype -> int -> lltype = "llvm_vector_type"
512
513external element_type : lltype -> lltype = "LLVMGetElementType"
514external array_length : lltype -> int = "llvm_array_length"
515external address_space : lltype -> int = "llvm_address_space"
516external vector_size : lltype -> int = "llvm_vector_size"
517
518(*--... Operations on other types ..........................................--*)
519external void_type : llcontext -> lltype = "llvm_void_type"
520external label_type : llcontext -> lltype = "llvm_label_type"
521external x86_mmx_type : llcontext -> lltype = "llvm_x86_mmx_type"
522external type_by_name : llmodule -> string -> lltype option = "llvm_type_by_name"
523
524external classify_value : llvalue -> ValueKind.t = "llvm_classify_value"
525(*===-- Values ------------------------------------------------------------===*)
526external type_of : llvalue -> lltype = "llvm_type_of"
527external value_name : llvalue -> string = "llvm_value_name"
528external set_value_name : string -> llvalue -> unit = "llvm_set_value_name"
529external dump_value : llvalue -> unit = "llvm_dump_value"
530external string_of_llvalue : llvalue -> string = "llvm_string_of_llvalue"
531external replace_all_uses_with : llvalue -> llvalue -> unit
532                               = "llvm_replace_all_uses_with"
533
534(*--... Operations on uses .................................................--*)
535external use_begin : llvalue -> lluse option = "llvm_use_begin"
536external use_succ : lluse -> lluse option = "llvm_use_succ"
537external user : lluse -> llvalue = "llvm_user"
538external used_value : lluse -> llvalue = "llvm_used_value"
539
540let 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
549let 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
557let 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 ................................................--*)
567external operand : llvalue -> int -> llvalue = "llvm_operand"
568external operand_use : llvalue -> int -> lluse = "llvm_operand_use"
569external set_operand : llvalue -> int -> llvalue -> unit = "llvm_set_operand"
570external num_operands : llvalue -> int = "llvm_num_operands"
571external indices : llvalue -> int array = "llvm_indices"
572
573(*--... Operations on constants of (mostly) any type .......................--*)
574external is_constant : llvalue -> bool = "llvm_is_constant"
575external const_null : lltype -> llvalue = "LLVMConstNull"
576external const_all_ones : (*int|vec*)lltype -> llvalue = "LLVMConstAllOnes"
577external const_pointer_null : lltype -> llvalue = "LLVMConstPointerNull"
578external undef : lltype -> llvalue = "LLVMGetUndef"
579external poison : lltype -> llvalue = "LLVMGetPoison"
580external is_null : llvalue -> bool = "llvm_is_null"
581external is_undef : llvalue -> bool = "llvm_is_undef"
582external is_poison : llvalue -> bool = "llvm_is_poison"
583external constexpr_opcode : llvalue -> Opcode.t = "llvm_constexpr_get_opcode"
584
585(*--... Operations on instructions .........................................--*)
586external has_metadata : llvalue -> bool = "llvm_has_metadata"
587external metadata : llvalue -> llmdkind -> llvalue option = "llvm_metadata"
588external set_metadata : llvalue -> llmdkind -> llvalue -> unit = "llvm_set_metadata"
589external clear_metadata : llvalue -> llmdkind -> unit = "llvm_clear_metadata"
590
591(*--... Operations on metadata .......,.....................................--*)
592external mdstring : llcontext -> string -> llvalue = "llvm_mdstring"
593external mdnode : llcontext -> llvalue array -> llvalue = "llvm_mdnode"
594external mdnull : llcontext -> llvalue = "llvm_mdnull"
595external get_mdstring : llvalue -> string option = "llvm_get_mdstring"
596external get_mdnode_operands : llvalue -> llvalue array
597                            = "llvm_get_mdnode_operands"
598external get_named_metadata : llmodule -> string -> llvalue array
599                            = "llvm_get_namedmd"
600external add_named_metadata_operand : llmodule -> string -> llvalue -> unit
601                                    = "llvm_append_namedmd"
602external value_as_metadata : llvalue -> llmetadata = "llvm_value_as_metadata"
603external metadata_as_value : llcontext -> llmetadata -> llvalue
604                        = "llvm_metadata_as_value"
605
606(*--... Operations on scalar constants .....................................--*)
607external const_int : lltype -> int -> llvalue = "llvm_const_int"
608external const_of_int64 : lltype -> Int64.t -> bool -> llvalue
609                        = "llvm_const_of_int64"
610external int64_of_const : llvalue -> Int64.t option
611                        = "llvm_int64_of_const"
612external const_int_of_string : lltype -> string -> int -> llvalue
613                             = "llvm_const_int_of_string"
614external const_float : lltype -> float -> llvalue = "llvm_const_float"
615external float_of_const : llvalue -> float option
616                        = "llvm_float_of_const"
617external const_float_of_string : lltype -> string -> llvalue
618                               = "llvm_const_float_of_string"
619
620(*--... Operations on composite constants ..................................--*)
621external const_string : llcontext -> string -> llvalue = "llvm_const_string"
622external const_stringz : llcontext -> string -> llvalue = "llvm_const_stringz"
623external const_array : lltype -> llvalue array -> llvalue = "llvm_const_array"
624external const_struct : llcontext -> llvalue array -> llvalue
625                      = "llvm_const_struct"
626external const_named_struct : lltype -> llvalue array -> llvalue
627                      = "llvm_const_named_struct"
628external const_packed_struct : llcontext -> llvalue array -> llvalue
629                             = "llvm_const_packed_struct"
630external const_vector : llvalue array -> llvalue = "llvm_const_vector"
631external string_of_const : llvalue -> string option = "llvm_string_of_const"
632external const_element : llvalue -> int -> llvalue = "llvm_const_element"
633
634(*--... Constant expressions ...............................................--*)
635external align_of : lltype -> llvalue = "LLVMAlignOf"
636external size_of : lltype -> llvalue = "LLVMSizeOf"
637external const_neg : llvalue -> llvalue = "LLVMConstNeg"
638external const_nsw_neg : llvalue -> llvalue = "LLVMConstNSWNeg"
639external const_nuw_neg : llvalue -> llvalue = "LLVMConstNUWNeg"
640external const_fneg : llvalue -> llvalue = "LLVMConstFNeg"
641external const_not : llvalue -> llvalue = "LLVMConstNot"
642external const_add : llvalue -> llvalue -> llvalue = "LLVMConstAdd"
643external const_nsw_add : llvalue -> llvalue -> llvalue = "LLVMConstNSWAdd"
644external const_nuw_add : llvalue -> llvalue -> llvalue = "LLVMConstNUWAdd"
645external const_fadd : llvalue -> llvalue -> llvalue = "LLVMConstFAdd"
646external const_sub : llvalue -> llvalue -> llvalue = "LLVMConstSub"
647external const_nsw_sub : llvalue -> llvalue -> llvalue = "LLVMConstNSWSub"
648external const_nuw_sub : llvalue -> llvalue -> llvalue = "LLVMConstNUWSub"
649external const_fsub : llvalue -> llvalue -> llvalue = "LLVMConstFSub"
650external const_mul : llvalue -> llvalue -> llvalue = "LLVMConstMul"
651external const_nsw_mul : llvalue -> llvalue -> llvalue = "LLVMConstNSWMul"
652external const_nuw_mul : llvalue -> llvalue -> llvalue = "LLVMConstNUWMul"
653external const_fmul : llvalue -> llvalue -> llvalue = "LLVMConstFMul"
654external const_udiv : llvalue -> llvalue -> llvalue = "LLVMConstUDiv"
655external const_sdiv : llvalue -> llvalue -> llvalue = "LLVMConstSDiv"
656external const_exact_sdiv : llvalue -> llvalue -> llvalue = "LLVMConstExactSDiv"
657external const_fdiv : llvalue -> llvalue -> llvalue = "LLVMConstFDiv"
658external const_urem : llvalue -> llvalue -> llvalue = "LLVMConstURem"
659external const_srem : llvalue -> llvalue -> llvalue = "LLVMConstSRem"
660external const_frem : llvalue -> llvalue -> llvalue = "LLVMConstFRem"
661external const_and : llvalue -> llvalue -> llvalue = "LLVMConstAnd"
662external const_or : llvalue -> llvalue -> llvalue = "LLVMConstOr"
663external const_xor : llvalue -> llvalue -> llvalue = "LLVMConstXor"
664external const_icmp : Icmp.t -> llvalue -> llvalue -> llvalue
665                    = "llvm_const_icmp"
666external const_fcmp : Fcmp.t -> llvalue -> llvalue -> llvalue
667                    = "llvm_const_fcmp"
668external const_shl : llvalue -> llvalue -> llvalue = "LLVMConstShl"
669external const_lshr : llvalue -> llvalue -> llvalue = "LLVMConstLShr"
670external const_ashr : llvalue -> llvalue -> llvalue = "LLVMConstAShr"
671external const_gep : llvalue -> llvalue array -> llvalue = "llvm_const_gep"
672external const_in_bounds_gep : llvalue -> llvalue array -> llvalue
673                            = "llvm_const_in_bounds_gep"
674external const_trunc : llvalue -> lltype -> llvalue = "LLVMConstTrunc"
675external const_sext : llvalue -> lltype -> llvalue = "LLVMConstSExt"
676external const_zext : llvalue -> lltype -> llvalue = "LLVMConstZExt"
677external const_fptrunc : llvalue -> lltype -> llvalue = "LLVMConstFPTrunc"
678external const_fpext : llvalue -> lltype -> llvalue = "LLVMConstFPExt"
679external const_uitofp : llvalue -> lltype -> llvalue = "LLVMConstUIToFP"
680external const_sitofp : llvalue -> lltype -> llvalue = "LLVMConstSIToFP"
681external const_fptoui : llvalue -> lltype -> llvalue = "LLVMConstFPToUI"
682external const_fptosi : llvalue -> lltype -> llvalue = "LLVMConstFPToSI"
683external const_ptrtoint : llvalue -> lltype -> llvalue = "LLVMConstPtrToInt"
684external const_inttoptr : llvalue -> lltype -> llvalue = "LLVMConstIntToPtr"
685external const_bitcast : llvalue -> lltype -> llvalue = "LLVMConstBitCast"
686external const_zext_or_bitcast : llvalue -> lltype -> llvalue
687                             = "LLVMConstZExtOrBitCast"
688external const_sext_or_bitcast : llvalue -> lltype -> llvalue
689                             = "LLVMConstSExtOrBitCast"
690external const_trunc_or_bitcast : llvalue -> lltype -> llvalue
691                              = "LLVMConstTruncOrBitCast"
692external const_pointercast : llvalue -> lltype -> llvalue
693                           = "LLVMConstPointerCast"
694external const_intcast : llvalue -> lltype -> is_signed:bool -> llvalue
695                       = "llvm_const_intcast"
696external const_fpcast : llvalue -> lltype -> llvalue = "LLVMConstFPCast"
697external const_select : llvalue -> llvalue -> llvalue -> llvalue
698                      = "LLVMConstSelect"
699external const_extractelement : llvalue -> llvalue -> llvalue
700                              = "LLVMConstExtractElement"
701external const_insertelement : llvalue -> llvalue -> llvalue -> llvalue
702                             = "LLVMConstInsertElement"
703external const_shufflevector : llvalue -> llvalue -> llvalue -> llvalue
704                             = "LLVMConstShuffleVector"
705external const_extractvalue : llvalue -> int array -> llvalue
706                            = "llvm_const_extractvalue"
707external const_insertvalue : llvalue -> llvalue -> int array -> llvalue
708                           = "llvm_const_insertvalue"
709external const_inline_asm : lltype -> string -> string -> bool -> bool ->
710                            llvalue
711                          = "llvm_const_inline_asm"
712external block_address : llvalue -> llbasicblock -> llvalue = "LLVMBlockAddress"
713
714(*--... Operations on global variables, functions, and aliases (globals) ...--*)
715external global_parent : llvalue -> llmodule = "LLVMGetGlobalParent"
716external is_declaration : llvalue -> bool = "llvm_is_declaration"
717external linkage : llvalue -> Linkage.t = "llvm_linkage"
718external set_linkage : Linkage.t -> llvalue -> unit = "llvm_set_linkage"
719external unnamed_addr : llvalue -> bool = "llvm_unnamed_addr"
720external set_unnamed_addr : bool -> llvalue -> unit = "llvm_set_unnamed_addr"
721external section : llvalue -> string = "llvm_section"
722external set_section : string -> llvalue -> unit = "llvm_set_section"
723external visibility : llvalue -> Visibility.t = "llvm_visibility"
724external set_visibility : Visibility.t -> llvalue -> unit = "llvm_set_visibility"
725external dll_storage_class : llvalue -> DLLStorageClass.t = "llvm_dll_storage_class"
726external set_dll_storage_class : DLLStorageClass.t -> llvalue -> unit = "llvm_set_dll_storage_class"
727external alignment : llvalue -> int = "llvm_alignment"
728external set_alignment : int -> llvalue -> unit = "llvm_set_alignment"
729external global_copy_all_metadata : llvalue -> (llmdkind * llmetadata) array
730                                  = "llvm_global_copy_all_metadata"
731external is_global_constant : llvalue -> bool = "llvm_is_global_constant"
732external set_global_constant : bool -> llvalue -> unit
733                             = "llvm_set_global_constant"
734
735(*--... Operations on global variables .....................................--*)
736external declare_global : lltype -> string -> llmodule -> llvalue
737                        = "llvm_declare_global"
738external declare_qualified_global : lltype -> string -> int -> llmodule ->
739                                    llvalue
740                                  = "llvm_declare_qualified_global"
741external define_global : string -> llvalue -> llmodule -> llvalue
742                       = "llvm_define_global"
743external define_qualified_global : string -> llvalue -> int -> llmodule ->
744                                   llvalue
745                                 = "llvm_define_qualified_global"
746external lookup_global : string -> llmodule -> llvalue option
747                       = "llvm_lookup_global"
748external delete_global : llvalue -> unit = "llvm_delete_global"
749external global_initializer : llvalue -> llvalue option = "llvm_global_initializer"
750external set_initializer : llvalue -> llvalue -> unit = "llvm_set_initializer"
751external remove_initializer : llvalue -> unit = "llvm_remove_initializer"
752external is_thread_local : llvalue -> bool = "llvm_is_thread_local"
753external set_thread_local : bool -> llvalue -> unit = "llvm_set_thread_local"
754external thread_local_mode : llvalue -> ThreadLocalMode.t
755                           = "llvm_thread_local_mode"
756external set_thread_local_mode : ThreadLocalMode.t -> llvalue -> unit
757                               = "llvm_set_thread_local_mode"
758external is_externally_initialized : llvalue -> bool
759                                   = "llvm_is_externally_initialized"
760external set_externally_initialized : bool -> llvalue -> unit
761                                    = "llvm_set_externally_initialized"
762external global_begin : llmodule -> (llmodule, llvalue) llpos
763                      = "llvm_global_begin"
764external global_succ : llvalue -> (llmodule, llvalue) llpos
765                     = "llvm_global_succ"
766external global_end : llmodule -> (llmodule, llvalue) llrev_pos
767                    = "llvm_global_end"
768external global_pred : llvalue -> (llmodule, llvalue) llrev_pos
769                     = "llvm_global_pred"
770
771let 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
779let iter_globals f m =
780  iter_global_range f (global_begin m) (At_end m)
781
782let 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
788let fold_left_globals f init m =
789  fold_left_global_range f init (global_begin m) (At_end m)
790
791let 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
799let rev_iter_globals f m =
800  rev_iter_global_range f (global_end m) (At_start m)
801
802let 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
808let fold_right_globals f m init =
809  fold_right_global_range f (global_end m) (At_start m) init
810
811(*--... Operations on aliases ..............................................--*)
812external add_alias : llmodule -> lltype -> llvalue -> string -> llvalue
813                   = "llvm_add_alias"
814
815(*--... Operations on functions ............................................--*)
816external declare_function : string -> lltype -> llmodule -> llvalue
817                          = "llvm_declare_function"
818external define_function : string -> lltype -> llmodule -> llvalue
819                         = "llvm_define_function"
820external lookup_function : string -> llmodule -> llvalue option
821                         = "llvm_lookup_function"
822external delete_function : llvalue -> unit = "llvm_delete_function"
823external is_intrinsic : llvalue -> bool = "llvm_is_intrinsic"
824external function_call_conv : llvalue -> int = "llvm_function_call_conv"
825external set_function_call_conv : int -> llvalue -> unit
826                                = "llvm_set_function_call_conv"
827external gc : llvalue -> string option = "llvm_gc"
828external set_gc : string option -> llvalue -> unit = "llvm_set_gc"
829external function_begin : llmodule -> (llmodule, llvalue) llpos
830                        = "llvm_function_begin"
831external function_succ : llvalue -> (llmodule, llvalue) llpos
832                       = "llvm_function_succ"
833external function_end : llmodule -> (llmodule, llvalue) llrev_pos
834                      = "llvm_function_end"
835external function_pred : llvalue -> (llmodule, llvalue) llrev_pos
836                       = "llvm_function_pred"
837
838let 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
846let iter_functions f m =
847  iter_function_range f (function_begin m) (At_end m)
848
849let 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
855let fold_left_functions f init m =
856  fold_left_function_range f init (function_begin m) (At_end m)
857
858let 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
866let rev_iter_functions f m =
867  rev_iter_function_range f (function_end m) (At_start m)
868
869let 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
875let fold_right_functions f m init =
876  fold_right_function_range f (function_end m) (At_start m) init
877
878external llvm_add_function_attr : llvalue -> llattribute -> int -> unit
879                                = "llvm_add_function_attr"
880external llvm_function_attrs : llvalue -> int -> llattribute array
881                             = "llvm_function_attrs"
882external llvm_remove_enum_function_attr : llvalue -> llattrkind -> int -> unit
883                                        = "llvm_remove_enum_function_attr"
884external llvm_remove_string_function_attr : llvalue -> string -> int -> unit
885                                          = "llvm_remove_string_function_attr"
886
887let add_function_attr f a i =
888  llvm_add_function_attr f a (AttrIndex.to_int i)
889let function_attrs f i =
890  llvm_function_attrs f (AttrIndex.to_int i)
891let remove_enum_function_attr f k i =
892  llvm_remove_enum_function_attr f k (AttrIndex.to_int i)
893let remove_string_function_attr f k i =
894  llvm_remove_string_function_attr f k (AttrIndex.to_int i)
895
896(*--... Operations on params ...............................................--*)
897external params : llvalue -> llvalue array = "llvm_params"
898external param : llvalue -> int -> llvalue = "llvm_param"
899external param_parent : llvalue -> llvalue = "LLVMGetParamParent"
900external param_begin : llvalue -> (llvalue, llvalue) llpos = "llvm_param_begin"
901external param_succ : llvalue -> (llvalue, llvalue) llpos = "llvm_param_succ"
902external param_end : llvalue -> (llvalue, llvalue) llrev_pos = "llvm_param_end"
903external param_pred : llvalue -> (llvalue, llvalue) llrev_pos ="llvm_param_pred"
904
905let 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
913let iter_params f fn =
914  iter_param_range f (param_begin fn) (At_end fn)
915
916let 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
922let fold_left_params f init fn =
923  fold_left_param_range f init (param_begin fn) (At_end fn)
924
925let 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
933let rev_iter_params f fn =
934  rev_iter_param_range f (param_end fn) (At_start fn)
935
936let 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
942let 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 .........................................--*)
946external value_of_block : llbasicblock -> llvalue = "LLVMBasicBlockAsValue"
947external value_is_block : llvalue -> bool = "llvm_value_is_block"
948external block_of_value : llvalue -> llbasicblock = "LLVMValueAsBasicBlock"
949external block_parent : llbasicblock -> llvalue = "LLVMGetBasicBlockParent"
950external basic_blocks : llvalue -> llbasicblock array = "llvm_basic_blocks"
951external entry_block : llvalue -> llbasicblock = "LLVMGetEntryBasicBlock"
952external delete_block : llbasicblock -> unit = "llvm_delete_block"
953external remove_block : llbasicblock -> unit = "llvm_remove_block"
954external move_block_before : llbasicblock -> llbasicblock -> unit
955                           = "llvm_move_block_before"
956external move_block_after : llbasicblock -> llbasicblock -> unit
957                          = "llvm_move_block_after"
958external append_block : llcontext -> string -> llvalue -> llbasicblock
959                      = "llvm_append_block"
960external insert_block : llcontext -> string -> llbasicblock -> llbasicblock
961                      = "llvm_insert_block"
962external block_begin : llvalue -> (llvalue, llbasicblock) llpos
963                     = "llvm_block_begin"
964external block_succ : llbasicblock -> (llvalue, llbasicblock) llpos
965                    = "llvm_block_succ"
966external block_end : llvalue -> (llvalue, llbasicblock) llrev_pos
967                   = "llvm_block_end"
968external block_pred : llbasicblock -> (llvalue, llbasicblock) llrev_pos
969                    = "llvm_block_pred"
970external block_terminator : llbasicblock -> llvalue option =
971    "llvm_block_terminator"
972
973let 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
981let iter_blocks f fn =
982  iter_block_range f (block_begin fn) (At_end fn)
983
984let 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
990let fold_left_blocks f init fn =
991  fold_left_block_range f init (block_begin fn) (At_end fn)
992
993let 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
1001let rev_iter_blocks f fn =
1002  rev_iter_block_range f (block_end fn) (At_start fn)
1003
1004let 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
1010let fold_right_blocks f fn init =
1011  fold_right_block_range f init (block_end fn) (At_start fn)
1012
1013(*--... Operations on instructions .........................................--*)
1014external instr_parent : llvalue -> llbasicblock = "LLVMGetInstructionParent"
1015external instr_begin : llbasicblock -> (llbasicblock, llvalue) llpos
1016                     = "llvm_instr_begin"
1017external instr_succ : llvalue -> (llbasicblock, llvalue) llpos
1018                     = "llvm_instr_succ"
1019external instr_end : llbasicblock -> (llbasicblock, llvalue) llrev_pos
1020                     = "llvm_instr_end"
1021external instr_pred : llvalue -> (llbasicblock, llvalue) llrev_pos
1022                     = "llvm_instr_pred"
1023
1024external instr_opcode : llvalue -> Opcode.t = "llvm_instr_get_opcode"
1025external icmp_predicate : llvalue -> Icmp.t option = "llvm_instr_icmp_predicate"
1026external fcmp_predicate : llvalue -> Fcmp.t option = "llvm_instr_fcmp_predicate"
1027external instr_clone : llvalue -> llvalue = "llvm_instr_clone"
1028
1029let 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
1037let iter_instrs f bb =
1038  iter_instrs_range f (instr_begin bb) (At_end bb)
1039
1040let 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
1046let fold_left_instrs f init bb =
1047  fold_left_instrs_range f init (instr_begin bb) (At_end bb)
1048
1049let 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
1057let rev_iter_instrs f bb =
1058  rev_iter_instrs_range f (instr_end bb) (At_start bb)
1059
1060let 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
1066let 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 ...........................................--*)
1071external instruction_call_conv: llvalue -> int
1072                              = "llvm_instruction_call_conv"
1073external set_instruction_call_conv: int -> llvalue -> unit
1074                                  = "llvm_set_instruction_call_conv"
1075
1076external llvm_add_call_site_attr : llvalue -> llattribute -> int -> unit
1077                                = "llvm_add_call_site_attr"
1078external llvm_call_site_attrs : llvalue -> int -> llattribute array
1079                             = "llvm_call_site_attrs"
1080external llvm_remove_enum_call_site_attr : llvalue -> llattrkind -> int -> unit
1081                                        = "llvm_remove_enum_call_site_attr"
1082external llvm_remove_string_call_site_attr : llvalue -> string -> int -> unit
1083                                          = "llvm_remove_string_call_site_attr"
1084
1085let add_call_site_attr f a i =
1086  llvm_add_call_site_attr f a (AttrIndex.to_int i)
1087let call_site_attrs f i =
1088  llvm_call_site_attrs f (AttrIndex.to_int i)
1089let remove_enum_call_site_attr f k i =
1090  llvm_remove_enum_call_site_attr f k (AttrIndex.to_int i)
1091let 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) ..................--*)
1095external num_arg_operands : llvalue -> int = "llvm_num_arg_operands"
1096external is_tail_call : llvalue -> bool = "llvm_is_tail_call"
1097external set_tail_call : bool -> llvalue -> unit = "llvm_set_tail_call"
1098external get_normal_dest : llvalue -> llbasicblock = "LLVMGetNormalDest"
1099external get_unwind_dest : llvalue -> llbasicblock = "LLVMGetUnwindDest"
1100
1101(*--... Operations on load/store instructions (only) .......................--*)
1102external is_volatile : llvalue -> bool = "llvm_is_volatile"
1103external set_volatile : bool -> llvalue -> unit = "llvm_set_volatile"
1104
1105(*--... Operations on terminators ..........................................--*)
1106
1107let 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
1115external successor : llvalue -> int -> llbasicblock = "llvm_successor"
1116external set_successor : llvalue -> int -> llbasicblock -> unit
1117                       = "llvm_set_successor"
1118external num_successors : llvalue -> int = "llvm_num_successors"
1119
1120let 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
1126let 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
1134let 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 .............................................--*)
1149external condition : llvalue -> llvalue = "llvm_condition"
1150external set_condition : llvalue -> llvalue -> unit
1151                       = "llvm_set_condition"
1152external is_conditional : llvalue -> bool = "llvm_is_conditional"
1153
1154let 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 ............................................--*)
1163external add_incoming : (llvalue * llbasicblock) -> llvalue -> unit
1164                      = "llvm_add_incoming"
1165external incoming : llvalue -> (llvalue * llbasicblock) list = "llvm_incoming"
1166
1167external delete_instruction : llvalue -> unit = "llvm_delete_instruction"
1168
1169(*===-- Instruction builders ----------------------------------------------===*)
1170external builder : llcontext -> llbuilder = "llvm_builder"
1171external position_builder : (llbasicblock, llvalue) llpos -> llbuilder -> unit
1172                          = "llvm_position_builder"
1173external insertion_block : llbuilder -> llbasicblock = "llvm_insertion_block"
1174external insert_into_builder : llvalue -> string -> llbuilder -> unit
1175                             = "llvm_insert_into_builder"
1176
1177let builder_at context ip =
1178  let b = builder context in
1179  position_builder ip b;
1180  b
1181
1182let builder_before context i = builder_at context (Before i)
1183let builder_at_end context bb = builder_at context (At_end bb)
1184
1185let position_before i = position_builder (Before i)
1186let position_at_end bb = position_builder (At_end bb)
1187
1188
1189(*--... Metadata ...........................................................--*)
1190external set_current_debug_location : llbuilder -> llvalue -> unit
1191                                    = "llvm_set_current_debug_location"
1192external clear_current_debug_location : llbuilder -> unit
1193                                      = "llvm_clear_current_debug_location"
1194external current_debug_location : llbuilder -> llvalue option
1195                                    = "llvm_current_debug_location"
1196external set_inst_debug_location : llbuilder -> llvalue -> unit
1197                                 = "llvm_set_inst_debug_location"
1198
1199
1200(*--... Terminators ........................................................--*)
1201external build_ret_void : llbuilder -> llvalue = "llvm_build_ret_void"
1202external build_ret : llvalue -> llbuilder -> llvalue = "llvm_build_ret"
1203external build_aggregate_ret : llvalue array -> llbuilder -> llvalue
1204                             = "llvm_build_aggregate_ret"
1205external build_br : llbasicblock -> llbuilder -> llvalue = "llvm_build_br"
1206external build_cond_br : llvalue -> llbasicblock -> llbasicblock -> llbuilder ->
1207                         llvalue = "llvm_build_cond_br"
1208external build_switch : llvalue -> llbasicblock -> int -> llbuilder -> llvalue
1209                      = "llvm_build_switch"
1210external build_malloc : lltype -> string -> llbuilder -> llvalue =
1211    "llvm_build_malloc"
1212external build_array_malloc : lltype -> llvalue -> string -> llbuilder ->
1213    llvalue = "llvm_build_array_malloc"
1214external build_free : llvalue -> llbuilder -> llvalue = "llvm_build_free"
1215external add_case : llvalue -> llvalue -> llbasicblock -> unit
1216                  = "llvm_add_case"
1217external switch_default_dest : llvalue -> llbasicblock =
1218    "LLVMGetSwitchDefaultDest"
1219external build_indirect_br : llvalue -> int -> llbuilder -> llvalue
1220                           = "llvm_build_indirect_br"
1221external add_destination : llvalue -> llbasicblock -> unit
1222                         = "llvm_add_destination"
1223external build_invoke : llvalue -> llvalue array -> llbasicblock ->
1224                        llbasicblock -> string -> llbuilder -> llvalue
1225                      = "llvm_build_invoke_bc" "llvm_build_invoke_nat"
1226external build_landingpad : lltype -> llvalue -> int -> string -> llbuilder ->
1227                            llvalue = "llvm_build_landingpad"
1228external is_cleanup : llvalue -> bool = "llvm_is_cleanup"
1229external set_cleanup : llvalue -> bool -> unit = "llvm_set_cleanup"
1230external add_clause : llvalue -> llvalue -> unit = "llvm_add_clause"
1231external build_resume : llvalue -> llbuilder -> llvalue = "llvm_build_resume"
1232external build_unreachable : llbuilder -> llvalue = "llvm_build_unreachable"
1233
1234(*--... Arithmetic .........................................................--*)
1235external build_add : llvalue -> llvalue -> string -> llbuilder -> llvalue
1236                   = "llvm_build_add"
1237external build_nsw_add : llvalue -> llvalue -> string -> llbuilder -> llvalue
1238                       = "llvm_build_nsw_add"
1239external build_nuw_add : llvalue -> llvalue -> string -> llbuilder -> llvalue
1240                       = "llvm_build_nuw_add"
1241external build_fadd : llvalue -> llvalue -> string -> llbuilder -> llvalue
1242                    = "llvm_build_fadd"
1243external build_sub : llvalue -> llvalue -> string -> llbuilder -> llvalue
1244                   = "llvm_build_sub"
1245external build_nsw_sub : llvalue -> llvalue -> string -> llbuilder -> llvalue
1246                       = "llvm_build_nsw_sub"
1247external build_nuw_sub : llvalue -> llvalue -> string -> llbuilder -> llvalue
1248                       = "llvm_build_nuw_sub"
1249external build_fsub : llvalue -> llvalue -> string -> llbuilder -> llvalue
1250                    = "llvm_build_fsub"
1251external build_mul : llvalue -> llvalue -> string -> llbuilder -> llvalue
1252                   = "llvm_build_mul"
1253external build_nsw_mul : llvalue -> llvalue -> string -> llbuilder -> llvalue
1254                       = "llvm_build_nsw_mul"
1255external build_nuw_mul : llvalue -> llvalue -> string -> llbuilder -> llvalue
1256                       = "llvm_build_nuw_mul"
1257external build_fmul : llvalue -> llvalue -> string -> llbuilder -> llvalue
1258                    = "llvm_build_fmul"
1259external build_udiv : llvalue -> llvalue -> string -> llbuilder -> llvalue
1260                    = "llvm_build_udiv"
1261external build_sdiv : llvalue -> llvalue -> string -> llbuilder -> llvalue
1262                    = "llvm_build_sdiv"
1263external build_exact_sdiv : llvalue -> llvalue -> string -> llbuilder -> llvalue
1264                          = "llvm_build_exact_sdiv"
1265external build_fdiv : llvalue -> llvalue -> string -> llbuilder -> llvalue
1266                    = "llvm_build_fdiv"
1267external build_urem : llvalue -> llvalue -> string -> llbuilder -> llvalue
1268                    = "llvm_build_urem"
1269external build_srem : llvalue -> llvalue -> string -> llbuilder -> llvalue
1270                    = "llvm_build_srem"
1271external build_frem : llvalue -> llvalue -> string -> llbuilder -> llvalue
1272                    = "llvm_build_frem"
1273external build_shl : llvalue -> llvalue -> string -> llbuilder -> llvalue
1274                   = "llvm_build_shl"
1275external build_lshr : llvalue -> llvalue -> string -> llbuilder -> llvalue
1276                    = "llvm_build_lshr"
1277external build_ashr : llvalue -> llvalue -> string -> llbuilder -> llvalue
1278                    = "llvm_build_ashr"
1279external build_and : llvalue -> llvalue -> string -> llbuilder -> llvalue
1280                   = "llvm_build_and"
1281external build_or : llvalue -> llvalue -> string -> llbuilder -> llvalue
1282                  = "llvm_build_or"
1283external build_xor : llvalue -> llvalue -> string -> llbuilder -> llvalue
1284                   = "llvm_build_xor"
1285external build_neg : llvalue -> string -> llbuilder -> llvalue
1286                   = "llvm_build_neg"
1287external build_nsw_neg : llvalue -> string -> llbuilder -> llvalue
1288                       = "llvm_build_nsw_neg"
1289external build_nuw_neg : llvalue -> string -> llbuilder -> llvalue
1290                       = "llvm_build_nuw_neg"
1291external build_fneg : llvalue -> string -> llbuilder -> llvalue
1292                    = "llvm_build_fneg"
1293external build_not : llvalue -> string -> llbuilder -> llvalue
1294                   = "llvm_build_not"
1295
1296(*--... Memory .............................................................--*)
1297external build_alloca : lltype -> string -> llbuilder -> llvalue
1298                      = "llvm_build_alloca"
1299external build_array_alloca : lltype -> llvalue -> string -> llbuilder ->
1300                              llvalue = "llvm_build_array_alloca"
1301external build_load : llvalue -> string -> llbuilder -> llvalue
1302                    = "llvm_build_load"
1303external build_store : llvalue -> llvalue -> llbuilder -> llvalue
1304                     = "llvm_build_store"
1305external build_atomicrmw : AtomicRMWBinOp.t -> llvalue -> llvalue ->
1306                           AtomicOrdering.t -> bool -> string -> llbuilder ->
1307                           llvalue
1308                         = "llvm_build_atomicrmw_bytecode"
1309                           "llvm_build_atomicrmw_native"
1310external build_gep : llvalue -> llvalue array -> string -> llbuilder -> llvalue
1311                   = "llvm_build_gep"
1312external build_in_bounds_gep : llvalue -> llvalue array -> string ->
1313                             llbuilder -> llvalue = "llvm_build_in_bounds_gep"
1314external build_struct_gep : llvalue -> int -> string -> llbuilder -> llvalue
1315                         = "llvm_build_struct_gep"
1316
1317external build_global_string : string -> string -> llbuilder -> llvalue
1318                             = "llvm_build_global_string"
1319external build_global_stringptr  : string -> string -> llbuilder -> llvalue
1320                                 = "llvm_build_global_stringptr"
1321
1322(*--... Casts ..............................................................--*)
1323external build_trunc : llvalue -> lltype -> string -> llbuilder -> llvalue
1324                     = "llvm_build_trunc"
1325external build_zext : llvalue -> lltype -> string -> llbuilder -> llvalue
1326                    = "llvm_build_zext"
1327external build_sext : llvalue -> lltype -> string -> llbuilder -> llvalue
1328                    = "llvm_build_sext"
1329external build_fptoui : llvalue -> lltype -> string -> llbuilder -> llvalue
1330                      = "llvm_build_fptoui"
1331external build_fptosi : llvalue -> lltype -> string -> llbuilder -> llvalue
1332                      = "llvm_build_fptosi"
1333external build_uitofp : llvalue -> lltype -> string -> llbuilder -> llvalue
1334                      = "llvm_build_uitofp"
1335external build_sitofp : llvalue -> lltype -> string -> llbuilder -> llvalue
1336                      = "llvm_build_sitofp"
1337external build_fptrunc : llvalue -> lltype -> string -> llbuilder -> llvalue
1338                       = "llvm_build_fptrunc"
1339external build_fpext : llvalue -> lltype -> string -> llbuilder -> llvalue
1340                     = "llvm_build_fpext"
1341external build_ptrtoint : llvalue -> lltype -> string -> llbuilder -> llvalue
1342                        = "llvm_build_prttoint"
1343external build_inttoptr : llvalue -> lltype -> string -> llbuilder -> llvalue
1344                        = "llvm_build_inttoptr"
1345external build_bitcast : llvalue -> lltype -> string -> llbuilder -> llvalue
1346                       = "llvm_build_bitcast"
1347external build_zext_or_bitcast : llvalue -> lltype -> string -> llbuilder ->
1348                                 llvalue = "llvm_build_zext_or_bitcast"
1349external build_sext_or_bitcast : llvalue -> lltype -> string -> llbuilder ->
1350                                 llvalue = "llvm_build_sext_or_bitcast"
1351external build_trunc_or_bitcast : llvalue -> lltype -> string -> llbuilder ->
1352                                  llvalue = "llvm_build_trunc_or_bitcast"
1353external build_pointercast : llvalue -> lltype -> string -> llbuilder -> llvalue
1354                           = "llvm_build_pointercast"
1355external build_intcast : llvalue -> lltype -> string -> llbuilder -> llvalue
1356                       = "llvm_build_intcast"
1357external build_fpcast : llvalue -> lltype -> string -> llbuilder -> llvalue
1358                      = "llvm_build_fpcast"
1359
1360(*--... Comparisons ........................................................--*)
1361external build_icmp : Icmp.t -> llvalue -> llvalue -> string ->
1362                      llbuilder -> llvalue = "llvm_build_icmp"
1363external build_fcmp : Fcmp.t -> llvalue -> llvalue -> string ->
1364                      llbuilder -> llvalue = "llvm_build_fcmp"
1365
1366(*--... Miscellaneous instructions .........................................--*)
1367external build_phi : (llvalue * llbasicblock) list -> string -> llbuilder ->
1368                     llvalue = "llvm_build_phi"
1369external build_empty_phi : lltype -> string -> llbuilder -> llvalue
1370                         = "llvm_build_empty_phi"
1371external build_call : llvalue -> llvalue array -> string -> llbuilder -> llvalue
1372                    = "llvm_build_call"
1373external build_select : llvalue -> llvalue -> llvalue -> string -> llbuilder ->
1374                        llvalue = "llvm_build_select"
1375external build_va_arg : llvalue -> lltype -> string -> llbuilder -> llvalue
1376                      = "llvm_build_va_arg"
1377external build_extractelement : llvalue -> llvalue -> string -> llbuilder ->
1378                                llvalue = "llvm_build_extractelement"
1379external build_insertelement : llvalue -> llvalue -> llvalue -> string ->
1380                               llbuilder -> llvalue = "llvm_build_insertelement"
1381external build_shufflevector : llvalue -> llvalue -> llvalue -> string ->
1382                               llbuilder -> llvalue = "llvm_build_shufflevector"
1383external build_extractvalue : llvalue -> int -> string -> llbuilder -> llvalue
1384                            = "llvm_build_extractvalue"
1385external build_insertvalue : llvalue -> llvalue -> int -> string -> llbuilder ->
1386                             llvalue = "llvm_build_insertvalue"
1387
1388external build_is_null : llvalue -> string -> llbuilder -> llvalue
1389                       = "llvm_build_is_null"
1390external build_is_not_null : llvalue -> string -> llbuilder -> llvalue
1391                           = "llvm_build_is_not_null"
1392external build_ptrdiff : llvalue -> llvalue -> string -> llbuilder -> llvalue
1393                       = "llvm_build_ptrdiff"
1394external build_freeze : llvalue -> string -> llbuilder -> llvalue
1395                      = "llvm_build_freeze"
1396
1397
1398(*===-- Memory buffers ----------------------------------------------------===*)
1399
1400module 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"
1407end
1408
1409
1410(*===-- Pass Manager ------------------------------------------------------===*)
1411
1412module 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"
1425end
1426