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