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