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