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