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