1(*===-- llvm/llvm.ml - LLVM OCaml Interface -------------------------------===* 2 * 3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 * See https://llvm.org/LICENSE.txt for license information. 5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 * 7 *===----------------------------------------------------------------------===*) 8 9 10type llcontext 11type llmodule 12type llmetadata 13type lltype 14type llvalue 15type lluse 16type llbasicblock 17type llbuilder 18type llattrkind 19type llattribute 20type llmemorybuffer 21type llmdkind 22 23exception FeatureDisabled of string 24 25let () = Callback.register_exception "Llvm.FeatureDisabled" (FeatureDisabled "") 26 27module TypeKind = struct 28 type t = 29 | Void 30 | Half 31 | Float 32 | Double 33 | X86fp80 34 | Fp128 35 | Ppc_fp128 36 | Label 37 | Integer 38 | Function 39 | Struct 40 | Array 41 | Pointer 42 | Vector 43 | Metadata 44 | X86_mmx 45 | Token 46 | ScalableVector 47 | BFloat 48 | X86_amx 49end 50 51module 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 70end 71 72module Visibility = struct 73 type t = 74 | Default 75 | Hidden 76 | Protected 77end 78 79module DLLStorageClass = struct 80 type t = 81 | Default 82 | DLLImport 83 | DLLExport 84end 85 86module CallConv = struct 87 let c = 0 88 let fast = 8 89 let cold = 9 90 let x86_stdcall = 64 91 let x86_fastcall = 65 92end 93 94module AttrRepr = struct 95 type t = 96 | Enum of llattrkind * int64 97 | String of string * string 98end 99 100module 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 111end 112 113module 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 141end 142 143module 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 155end 156 157module 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 175end 176 177module 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 254end 255 256module LandingPadClauseTy = struct 257 type t = 258 | Catch 259 | Filter 260end 261 262module ThreadLocalMode = struct 263 type t = 264 | None 265 | GeneralDynamic 266 | LocalDynamic 267 | InitialExec 268 | LocalExec 269end 270 271module AtomicOrdering = struct 272 type t = 273 | NotAtomic 274 | Unordered 275 | Monotonic 276 | Invalid 277 | Acquire 278 | Release 279 | AcqiureRelease 280 | SequentiallyConsistent 281end 282 283module 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 298end 299 300module 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 326end 327 328module DiagnosticSeverity = struct 329 type t = 330 | Error 331 | Warning 332 | Remark 333 | Note 334end 335 336module ModuleFlagBehavior = struct 337 type t = 338 | Error 339 | Warning 340 | Require 341 | Override 342 | Append 343 | AppendUnique 344end 345 346exception IoError of string 347 348let () = Callback.register_exception "Llvm.IoError" (IoError "") 349 350external install_fatal_error_handler : (string -> unit) -> unit 351 = "llvm_install_fatal_error_handler" 352external reset_fatal_error_handler : unit -> unit 353 = "llvm_reset_fatal_error_handler" 354external enable_pretty_stacktrace : unit -> unit 355 = "llvm_enable_pretty_stacktrace" 356external parse_command_line_options : ?overview:string -> string array -> unit 357 = "llvm_parse_command_line_options" 358 359type ('a, 'b) llpos = 360| At_end of 'a 361| Before of 'b 362 363type ('a, 'b) llrev_pos = 364| At_start of 'a 365| After of 'b 366 367 368(*===-- Context error handling --------------------------------------------===*) 369module 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" 375end 376 377external set_diagnostic_handler 378 : llcontext -> (Diagnostic.t -> unit) option -> unit 379 = "llvm_set_diagnostic_handler" 380 381(*===-- Contexts ----------------------------------------------------------===*) 382external create_context : unit -> llcontext = "llvm_create_context" 383external dispose_context : llcontext -> unit = "llvm_dispose_context" 384external global_context : unit -> llcontext = "llvm_global_context" 385external mdkind_id : llcontext -> string -> llmdkind = "llvm_mdkind_id" 386 387(*===-- Attributes --------------------------------------------------------===*) 388exception UnknownAttribute of string 389 390let () = Callback.register_exception "Llvm.UnknownAttribute" 391 (UnknownAttribute "") 392 393external enum_attr_kind : string -> llattrkind = "llvm_enum_attr_kind" 394external llvm_create_enum_attr : llcontext -> llattrkind -> int64 -> 395 llattribute 396 = "llvm_create_enum_attr_by_kind" 397external is_enum_attr : llattribute -> bool = "llvm_is_enum_attr" 398external get_enum_attr_kind : llattribute -> llattrkind 399 = "llvm_get_enum_attr_kind" 400external get_enum_attr_value : llattribute -> int64 401 = "llvm_get_enum_attr_value" 402external llvm_create_string_attr : llcontext -> string -> string -> 403 llattribute 404 = "llvm_create_string_attr" 405external is_string_attr : llattribute -> bool = "llvm_is_string_attr" 406external get_string_attr_kind : llattribute -> string 407 = "llvm_get_string_attr_kind" 408external get_string_attr_value : llattribute -> string 409 = "llvm_get_string_attr_value" 410 411let create_enum_attr context name value = 412 llvm_create_enum_attr context (enum_attr_kind name) value 413let create_string_attr context kind value = 414 llvm_create_string_attr context kind value 415 416let 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 421let 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 -----------------------------------------------------------===*) 429external create_module : llcontext -> string -> llmodule = "llvm_create_module" 430external dispose_module : llmodule -> unit = "llvm_dispose_module" 431external target_triple: llmodule -> string 432 = "llvm_target_triple" 433external set_target_triple: string -> llmodule -> unit 434 = "llvm_set_target_triple" 435external data_layout: llmodule -> string 436 = "llvm_data_layout" 437external set_data_layout: string -> llmodule -> unit 438 = "llvm_set_data_layout" 439external dump_module : llmodule -> unit = "llvm_dump_module" 440external print_module : string -> llmodule -> unit = "llvm_print_module" 441external string_of_llmodule : llmodule -> string = "llvm_string_of_llmodule" 442external set_module_inline_asm : llmodule -> string -> unit 443 = "llvm_set_module_inline_asm" 444external module_context : llmodule -> llcontext = "LLVMGetModuleContext" 445 446external get_module_identifier : llmodule -> string 447 = "llvm_get_module_identifier" 448 449external set_module_identifer : llmodule -> string -> unit 450 = "llvm_set_module_identifier" 451 452external get_module_flag : llmodule -> string -> llmetadata option 453 = "llvm_get_module_flag" 454external add_module_flag : llmodule -> ModuleFlagBehavior.t -> 455 string -> llmetadata -> unit = "llvm_add_module_flag" 456 457(*===-- Types -------------------------------------------------------------===*) 458external classify_type : lltype -> TypeKind.t = "llvm_classify_type" 459external type_context : lltype -> llcontext = "llvm_type_context" 460external type_is_sized : lltype -> bool = "llvm_type_is_sized" 461external dump_type : lltype -> unit = "llvm_dump_type" 462external string_of_lltype : lltype -> string = "llvm_string_of_lltype" 463 464(*--... Operations on integer types ........................................--*) 465external i1_type : llcontext -> lltype = "llvm_i1_type" 466external i8_type : llcontext -> lltype = "llvm_i8_type" 467external i16_type : llcontext -> lltype = "llvm_i16_type" 468external i32_type : llcontext -> lltype = "llvm_i32_type" 469external i64_type : llcontext -> lltype = "llvm_i64_type" 470 471external integer_type : llcontext -> int -> lltype = "llvm_integer_type" 472external integer_bitwidth : lltype -> int = "llvm_integer_bitwidth" 473 474(*--... Operations on real types ...........................................--*) 475external float_type : llcontext -> lltype = "llvm_float_type" 476external double_type : llcontext -> lltype = "llvm_double_type" 477external x86fp80_type : llcontext -> lltype = "llvm_x86fp80_type" 478external fp128_type : llcontext -> lltype = "llvm_fp128_type" 479external ppc_fp128_type : llcontext -> lltype = "llvm_ppc_fp128_type" 480 481(*--... Operations on function types .......................................--*) 482external function_type : lltype -> lltype array -> lltype = "llvm_function_type" 483external var_arg_function_type : lltype -> lltype array -> lltype 484 = "llvm_var_arg_function_type" 485external is_var_arg : lltype -> bool = "llvm_is_var_arg" 486external return_type : lltype -> lltype = "LLVMGetReturnType" 487external param_types : lltype -> lltype array = "llvm_param_types" 488 489(*--... Operations on struct types .........................................--*) 490external struct_type : llcontext -> lltype array -> lltype = "llvm_struct_type" 491external packed_struct_type : llcontext -> lltype array -> lltype 492 = "llvm_packed_struct_type" 493external struct_name : lltype -> string option = "llvm_struct_name" 494external named_struct_type : llcontext -> string -> lltype = 495 "llvm_named_struct_type" 496external struct_set_body : lltype -> lltype array -> bool -> unit = 497 "llvm_struct_set_body" 498external struct_element_types : lltype -> lltype array 499 = "llvm_struct_element_types" 500external is_packed : lltype -> bool = "llvm_is_packed" 501external is_opaque : lltype -> bool = "llvm_is_opaque" 502external is_literal : lltype -> bool = "llvm_is_literal" 503 504(*--... Operations on pointer, vector, and array types .....................--*) 505 506external subtypes : lltype -> lltype array = "llvm_subtypes" 507external array_type : lltype -> int -> lltype = "llvm_array_type" 508external pointer_type : lltype -> lltype = "llvm_pointer_type" 509external qualified_pointer_type : lltype -> int -> lltype 510 = "llvm_qualified_pointer_type" 511external vector_type : lltype -> int -> lltype = "llvm_vector_type" 512 513external element_type : lltype -> lltype = "LLVMGetElementType" 514external array_length : lltype -> int = "llvm_array_length" 515external address_space : lltype -> int = "llvm_address_space" 516external vector_size : lltype -> int = "llvm_vector_size" 517 518(*--... Operations on other types ..........................................--*) 519external void_type : llcontext -> lltype = "llvm_void_type" 520external label_type : llcontext -> lltype = "llvm_label_type" 521external x86_mmx_type : llcontext -> lltype = "llvm_x86_mmx_type" 522external type_by_name : llmodule -> string -> lltype option = "llvm_type_by_name" 523 524external classify_value : llvalue -> ValueKind.t = "llvm_classify_value" 525(*===-- Values ------------------------------------------------------------===*) 526external type_of : llvalue -> lltype = "llvm_type_of" 527external value_name : llvalue -> string = "llvm_value_name" 528external set_value_name : string -> llvalue -> unit = "llvm_set_value_name" 529external dump_value : llvalue -> unit = "llvm_dump_value" 530external string_of_llvalue : llvalue -> string = "llvm_string_of_llvalue" 531external replace_all_uses_with : llvalue -> llvalue -> unit 532 = "llvm_replace_all_uses_with" 533 534(*--... Operations on uses .................................................--*) 535external use_begin : llvalue -> lluse option = "llvm_use_begin" 536external use_succ : lluse -> lluse option = "llvm_use_succ" 537external user : lluse -> llvalue = "llvm_user" 538external used_value : lluse -> llvalue = "llvm_used_value" 539 540let 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 549let 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 557let 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 ................................................--*) 567external operand : llvalue -> int -> llvalue = "llvm_operand" 568external operand_use : llvalue -> int -> lluse = "llvm_operand_use" 569external set_operand : llvalue -> int -> llvalue -> unit = "llvm_set_operand" 570external num_operands : llvalue -> int = "llvm_num_operands" 571external indices : llvalue -> int array = "llvm_indices" 572 573(*--... Operations on constants of (mostly) any type .......................--*) 574external is_constant : llvalue -> bool = "llvm_is_constant" 575external const_null : lltype -> llvalue = "LLVMConstNull" 576external const_all_ones : (*int|vec*)lltype -> llvalue = "LLVMConstAllOnes" 577external const_pointer_null : lltype -> llvalue = "LLVMConstPointerNull" 578external undef : lltype -> llvalue = "LLVMGetUndef" 579external poison : lltype -> llvalue = "LLVMGetPoison" 580external is_null : llvalue -> bool = "llvm_is_null" 581external is_undef : llvalue -> bool = "llvm_is_undef" 582external is_poison : llvalue -> bool = "llvm_is_poison" 583external constexpr_opcode : llvalue -> Opcode.t = "llvm_constexpr_get_opcode" 584 585(*--... Operations on instructions .........................................--*) 586external has_metadata : llvalue -> bool = "llvm_has_metadata" 587external metadata : llvalue -> llmdkind -> llvalue option = "llvm_metadata" 588external set_metadata : llvalue -> llmdkind -> llvalue -> unit = "llvm_set_metadata" 589external clear_metadata : llvalue -> llmdkind -> unit = "llvm_clear_metadata" 590 591(*--... Operations on metadata .......,.....................................--*) 592external mdstring : llcontext -> string -> llvalue = "llvm_mdstring" 593external mdnode : llcontext -> llvalue array -> llvalue = "llvm_mdnode" 594external mdnull : llcontext -> llvalue = "llvm_mdnull" 595external get_mdstring : llvalue -> string option = "llvm_get_mdstring" 596external get_mdnode_operands : llvalue -> llvalue array 597 = "llvm_get_mdnode_operands" 598external get_named_metadata : llmodule -> string -> llvalue array 599 = "llvm_get_namedmd" 600external add_named_metadata_operand : llmodule -> string -> llvalue -> unit 601 = "llvm_append_namedmd" 602external value_as_metadata : llvalue -> llmetadata = "llvm_value_as_metadata" 603external metadata_as_value : llcontext -> llmetadata -> llvalue 604 = "llvm_metadata_as_value" 605 606(*--... Operations on scalar constants .....................................--*) 607external const_int : lltype -> int -> llvalue = "llvm_const_int" 608external const_of_int64 : lltype -> Int64.t -> bool -> llvalue 609 = "llvm_const_of_int64" 610external int64_of_const : llvalue -> Int64.t option 611 = "llvm_int64_of_const" 612external const_int_of_string : lltype -> string -> int -> llvalue 613 = "llvm_const_int_of_string" 614external const_float : lltype -> float -> llvalue = "llvm_const_float" 615external float_of_const : llvalue -> float option 616 = "llvm_float_of_const" 617external const_float_of_string : lltype -> string -> llvalue 618 = "llvm_const_float_of_string" 619 620(*--... Operations on composite constants ..................................--*) 621external const_string : llcontext -> string -> llvalue = "llvm_const_string" 622external const_stringz : llcontext -> string -> llvalue = "llvm_const_stringz" 623external const_array : lltype -> llvalue array -> llvalue = "llvm_const_array" 624external const_struct : llcontext -> llvalue array -> llvalue 625 = "llvm_const_struct" 626external const_named_struct : lltype -> llvalue array -> llvalue 627 = "llvm_const_named_struct" 628external const_packed_struct : llcontext -> llvalue array -> llvalue 629 = "llvm_const_packed_struct" 630external const_vector : llvalue array -> llvalue = "llvm_const_vector" 631external string_of_const : llvalue -> string option = "llvm_string_of_const" 632external const_element : llvalue -> int -> llvalue = "llvm_const_element" 633 634(*--... Constant expressions ...............................................--*) 635external align_of : lltype -> llvalue = "LLVMAlignOf" 636external size_of : lltype -> llvalue = "LLVMSizeOf" 637external const_neg : llvalue -> llvalue = "LLVMConstNeg" 638external const_nsw_neg : llvalue -> llvalue = "LLVMConstNSWNeg" 639external const_nuw_neg : llvalue -> llvalue = "LLVMConstNUWNeg" 640external const_fneg : llvalue -> llvalue = "LLVMConstFNeg" 641external const_not : llvalue -> llvalue = "LLVMConstNot" 642external const_add : llvalue -> llvalue -> llvalue = "LLVMConstAdd" 643external const_nsw_add : llvalue -> llvalue -> llvalue = "LLVMConstNSWAdd" 644external const_nuw_add : llvalue -> llvalue -> llvalue = "LLVMConstNUWAdd" 645external const_fadd : llvalue -> llvalue -> llvalue = "LLVMConstFAdd" 646external const_sub : llvalue -> llvalue -> llvalue = "LLVMConstSub" 647external const_nsw_sub : llvalue -> llvalue -> llvalue = "LLVMConstNSWSub" 648external const_nuw_sub : llvalue -> llvalue -> llvalue = "LLVMConstNUWSub" 649external const_fsub : llvalue -> llvalue -> llvalue = "LLVMConstFSub" 650external const_mul : llvalue -> llvalue -> llvalue = "LLVMConstMul" 651external const_nsw_mul : llvalue -> llvalue -> llvalue = "LLVMConstNSWMul" 652external const_nuw_mul : llvalue -> llvalue -> llvalue = "LLVMConstNUWMul" 653external const_fmul : llvalue -> llvalue -> llvalue = "LLVMConstFMul" 654external const_udiv : llvalue -> llvalue -> llvalue = "LLVMConstUDiv" 655external const_sdiv : llvalue -> llvalue -> llvalue = "LLVMConstSDiv" 656external const_exact_sdiv : llvalue -> llvalue -> llvalue = "LLVMConstExactSDiv" 657external const_fdiv : llvalue -> llvalue -> llvalue = "LLVMConstFDiv" 658external const_urem : llvalue -> llvalue -> llvalue = "LLVMConstURem" 659external const_srem : llvalue -> llvalue -> llvalue = "LLVMConstSRem" 660external const_frem : llvalue -> llvalue -> llvalue = "LLVMConstFRem" 661external const_and : llvalue -> llvalue -> llvalue = "LLVMConstAnd" 662external const_or : llvalue -> llvalue -> llvalue = "LLVMConstOr" 663external const_xor : llvalue -> llvalue -> llvalue = "LLVMConstXor" 664external const_icmp : Icmp.t -> llvalue -> llvalue -> llvalue 665 = "llvm_const_icmp" 666external const_fcmp : Fcmp.t -> llvalue -> llvalue -> llvalue 667 = "llvm_const_fcmp" 668external const_shl : llvalue -> llvalue -> llvalue = "LLVMConstShl" 669external const_lshr : llvalue -> llvalue -> llvalue = "LLVMConstLShr" 670external const_ashr : llvalue -> llvalue -> llvalue = "LLVMConstAShr" 671external const_gep : llvalue -> llvalue array -> llvalue = "llvm_const_gep" 672external const_in_bounds_gep : llvalue -> llvalue array -> llvalue 673 = "llvm_const_in_bounds_gep" 674external const_trunc : llvalue -> lltype -> llvalue = "LLVMConstTrunc" 675external const_sext : llvalue -> lltype -> llvalue = "LLVMConstSExt" 676external const_zext : llvalue -> lltype -> llvalue = "LLVMConstZExt" 677external const_fptrunc : llvalue -> lltype -> llvalue = "LLVMConstFPTrunc" 678external const_fpext : llvalue -> lltype -> llvalue = "LLVMConstFPExt" 679external const_uitofp : llvalue -> lltype -> llvalue = "LLVMConstUIToFP" 680external const_sitofp : llvalue -> lltype -> llvalue = "LLVMConstSIToFP" 681external const_fptoui : llvalue -> lltype -> llvalue = "LLVMConstFPToUI" 682external const_fptosi : llvalue -> lltype -> llvalue = "LLVMConstFPToSI" 683external const_ptrtoint : llvalue -> lltype -> llvalue = "LLVMConstPtrToInt" 684external const_inttoptr : llvalue -> lltype -> llvalue = "LLVMConstIntToPtr" 685external const_bitcast : llvalue -> lltype -> llvalue = "LLVMConstBitCast" 686external const_zext_or_bitcast : llvalue -> lltype -> llvalue 687 = "LLVMConstZExtOrBitCast" 688external const_sext_or_bitcast : llvalue -> lltype -> llvalue 689 = "LLVMConstSExtOrBitCast" 690external const_trunc_or_bitcast : llvalue -> lltype -> llvalue 691 = "LLVMConstTruncOrBitCast" 692external const_pointercast : llvalue -> lltype -> llvalue 693 = "LLVMConstPointerCast" 694external const_intcast : llvalue -> lltype -> is_signed:bool -> llvalue 695 = "llvm_const_intcast" 696external const_fpcast : llvalue -> lltype -> llvalue = "LLVMConstFPCast" 697external const_select : llvalue -> llvalue -> llvalue -> llvalue 698 = "LLVMConstSelect" 699external const_extractelement : llvalue -> llvalue -> llvalue 700 = "LLVMConstExtractElement" 701external const_insertelement : llvalue -> llvalue -> llvalue -> llvalue 702 = "LLVMConstInsertElement" 703external const_shufflevector : llvalue -> llvalue -> llvalue -> llvalue 704 = "LLVMConstShuffleVector" 705external const_extractvalue : llvalue -> int array -> llvalue 706 = "llvm_const_extractvalue" 707external const_insertvalue : llvalue -> llvalue -> int array -> llvalue 708 = "llvm_const_insertvalue" 709external const_inline_asm : lltype -> string -> string -> bool -> bool -> 710 llvalue 711 = "llvm_const_inline_asm" 712external block_address : llvalue -> llbasicblock -> llvalue = "LLVMBlockAddress" 713 714(*--... Operations on global variables, functions, and aliases (globals) ...--*) 715external global_parent : llvalue -> llmodule = "LLVMGetGlobalParent" 716external is_declaration : llvalue -> bool = "llvm_is_declaration" 717external linkage : llvalue -> Linkage.t = "llvm_linkage" 718external set_linkage : Linkage.t -> llvalue -> unit = "llvm_set_linkage" 719external unnamed_addr : llvalue -> bool = "llvm_unnamed_addr" 720external set_unnamed_addr : bool -> llvalue -> unit = "llvm_set_unnamed_addr" 721external section : llvalue -> string = "llvm_section" 722external set_section : string -> llvalue -> unit = "llvm_set_section" 723external visibility : llvalue -> Visibility.t = "llvm_visibility" 724external set_visibility : Visibility.t -> llvalue -> unit = "llvm_set_visibility" 725external dll_storage_class : llvalue -> DLLStorageClass.t = "llvm_dll_storage_class" 726external set_dll_storage_class : DLLStorageClass.t -> llvalue -> unit = "llvm_set_dll_storage_class" 727external alignment : llvalue -> int = "llvm_alignment" 728external set_alignment : int -> llvalue -> unit = "llvm_set_alignment" 729external global_copy_all_metadata : llvalue -> (llmdkind * llmetadata) array 730 = "llvm_global_copy_all_metadata" 731external is_global_constant : llvalue -> bool = "llvm_is_global_constant" 732external set_global_constant : bool -> llvalue -> unit 733 = "llvm_set_global_constant" 734 735(*--... Operations on global variables .....................................--*) 736external declare_global : lltype -> string -> llmodule -> llvalue 737 = "llvm_declare_global" 738external declare_qualified_global : lltype -> string -> int -> llmodule -> 739 llvalue 740 = "llvm_declare_qualified_global" 741external define_global : string -> llvalue -> llmodule -> llvalue 742 = "llvm_define_global" 743external define_qualified_global : string -> llvalue -> int -> llmodule -> 744 llvalue 745 = "llvm_define_qualified_global" 746external lookup_global : string -> llmodule -> llvalue option 747 = "llvm_lookup_global" 748external delete_global : llvalue -> unit = "llvm_delete_global" 749external global_initializer : llvalue -> llvalue option = "llvm_global_initializer" 750external set_initializer : llvalue -> llvalue -> unit = "llvm_set_initializer" 751external remove_initializer : llvalue -> unit = "llvm_remove_initializer" 752external is_thread_local : llvalue -> bool = "llvm_is_thread_local" 753external set_thread_local : bool -> llvalue -> unit = "llvm_set_thread_local" 754external thread_local_mode : llvalue -> ThreadLocalMode.t 755 = "llvm_thread_local_mode" 756external set_thread_local_mode : ThreadLocalMode.t -> llvalue -> unit 757 = "llvm_set_thread_local_mode" 758external is_externally_initialized : llvalue -> bool 759 = "llvm_is_externally_initialized" 760external set_externally_initialized : bool -> llvalue -> unit 761 = "llvm_set_externally_initialized" 762external global_begin : llmodule -> (llmodule, llvalue) llpos 763 = "llvm_global_begin" 764external global_succ : llvalue -> (llmodule, llvalue) llpos 765 = "llvm_global_succ" 766external global_end : llmodule -> (llmodule, llvalue) llrev_pos 767 = "llvm_global_end" 768external global_pred : llvalue -> (llmodule, llvalue) llrev_pos 769 = "llvm_global_pred" 770 771let 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 779let iter_globals f m = 780 iter_global_range f (global_begin m) (At_end m) 781 782let 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 788let fold_left_globals f init m = 789 fold_left_global_range f init (global_begin m) (At_end m) 790 791let 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 799let rev_iter_globals f m = 800 rev_iter_global_range f (global_end m) (At_start m) 801 802let 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 808let fold_right_globals f m init = 809 fold_right_global_range f (global_end m) (At_start m) init 810 811(*--... Operations on aliases ..............................................--*) 812external add_alias : llmodule -> lltype -> llvalue -> string -> llvalue 813 = "llvm_add_alias" 814 815(*--... Operations on functions ............................................--*) 816external declare_function : string -> lltype -> llmodule -> llvalue 817 = "llvm_declare_function" 818external define_function : string -> lltype -> llmodule -> llvalue 819 = "llvm_define_function" 820external lookup_function : string -> llmodule -> llvalue option 821 = "llvm_lookup_function" 822external delete_function : llvalue -> unit = "llvm_delete_function" 823external is_intrinsic : llvalue -> bool = "llvm_is_intrinsic" 824external function_call_conv : llvalue -> int = "llvm_function_call_conv" 825external set_function_call_conv : int -> llvalue -> unit 826 = "llvm_set_function_call_conv" 827external gc : llvalue -> string option = "llvm_gc" 828external set_gc : string option -> llvalue -> unit = "llvm_set_gc" 829external function_begin : llmodule -> (llmodule, llvalue) llpos 830 = "llvm_function_begin" 831external function_succ : llvalue -> (llmodule, llvalue) llpos 832 = "llvm_function_succ" 833external function_end : llmodule -> (llmodule, llvalue) llrev_pos 834 = "llvm_function_end" 835external function_pred : llvalue -> (llmodule, llvalue) llrev_pos 836 = "llvm_function_pred" 837 838let 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 846let iter_functions f m = 847 iter_function_range f (function_begin m) (At_end m) 848 849let 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 855let fold_left_functions f init m = 856 fold_left_function_range f init (function_begin m) (At_end m) 857 858let 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 866let rev_iter_functions f m = 867 rev_iter_function_range f (function_end m) (At_start m) 868 869let 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 875let fold_right_functions f m init = 876 fold_right_function_range f (function_end m) (At_start m) init 877 878external llvm_add_function_attr : llvalue -> llattribute -> int -> unit 879 = "llvm_add_function_attr" 880external llvm_function_attrs : llvalue -> int -> llattribute array 881 = "llvm_function_attrs" 882external llvm_remove_enum_function_attr : llvalue -> llattrkind -> int -> unit 883 = "llvm_remove_enum_function_attr" 884external llvm_remove_string_function_attr : llvalue -> string -> int -> unit 885 = "llvm_remove_string_function_attr" 886 887let add_function_attr f a i = 888 llvm_add_function_attr f a (AttrIndex.to_int i) 889let function_attrs f i = 890 llvm_function_attrs f (AttrIndex.to_int i) 891let remove_enum_function_attr f k i = 892 llvm_remove_enum_function_attr f k (AttrIndex.to_int i) 893let remove_string_function_attr f k i = 894 llvm_remove_string_function_attr f k (AttrIndex.to_int i) 895 896(*--... Operations on params ...............................................--*) 897external params : llvalue -> llvalue array = "llvm_params" 898external param : llvalue -> int -> llvalue = "llvm_param" 899external param_parent : llvalue -> llvalue = "LLVMGetParamParent" 900external param_begin : llvalue -> (llvalue, llvalue) llpos = "llvm_param_begin" 901external param_succ : llvalue -> (llvalue, llvalue) llpos = "llvm_param_succ" 902external param_end : llvalue -> (llvalue, llvalue) llrev_pos = "llvm_param_end" 903external param_pred : llvalue -> (llvalue, llvalue) llrev_pos ="llvm_param_pred" 904 905let 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 913let iter_params f fn = 914 iter_param_range f (param_begin fn) (At_end fn) 915 916let 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 922let fold_left_params f init fn = 923 fold_left_param_range f init (param_begin fn) (At_end fn) 924 925let 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 933let rev_iter_params f fn = 934 rev_iter_param_range f (param_end fn) (At_start fn) 935 936let 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 942let 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 .........................................--*) 946external value_of_block : llbasicblock -> llvalue = "LLVMBasicBlockAsValue" 947external value_is_block : llvalue -> bool = "llvm_value_is_block" 948external block_of_value : llvalue -> llbasicblock = "LLVMValueAsBasicBlock" 949external block_parent : llbasicblock -> llvalue = "LLVMGetBasicBlockParent" 950external basic_blocks : llvalue -> llbasicblock array = "llvm_basic_blocks" 951external entry_block : llvalue -> llbasicblock = "LLVMGetEntryBasicBlock" 952external delete_block : llbasicblock -> unit = "llvm_delete_block" 953external remove_block : llbasicblock -> unit = "llvm_remove_block" 954external move_block_before : llbasicblock -> llbasicblock -> unit 955 = "llvm_move_block_before" 956external move_block_after : llbasicblock -> llbasicblock -> unit 957 = "llvm_move_block_after" 958external append_block : llcontext -> string -> llvalue -> llbasicblock 959 = "llvm_append_block" 960external insert_block : llcontext -> string -> llbasicblock -> llbasicblock 961 = "llvm_insert_block" 962external block_begin : llvalue -> (llvalue, llbasicblock) llpos 963 = "llvm_block_begin" 964external block_succ : llbasicblock -> (llvalue, llbasicblock) llpos 965 = "llvm_block_succ" 966external block_end : llvalue -> (llvalue, llbasicblock) llrev_pos 967 = "llvm_block_end" 968external block_pred : llbasicblock -> (llvalue, llbasicblock) llrev_pos 969 = "llvm_block_pred" 970external block_terminator : llbasicblock -> llvalue option = 971 "llvm_block_terminator" 972 973let 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 981let iter_blocks f fn = 982 iter_block_range f (block_begin fn) (At_end fn) 983 984let 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 990let fold_left_blocks f init fn = 991 fold_left_block_range f init (block_begin fn) (At_end fn) 992 993let 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 1001let rev_iter_blocks f fn = 1002 rev_iter_block_range f (block_end fn) (At_start fn) 1003 1004let 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 1010let fold_right_blocks f fn init = 1011 fold_right_block_range f init (block_end fn) (At_start fn) 1012 1013(*--... Operations on instructions .........................................--*) 1014external instr_parent : llvalue -> llbasicblock = "LLVMGetInstructionParent" 1015external instr_begin : llbasicblock -> (llbasicblock, llvalue) llpos 1016 = "llvm_instr_begin" 1017external instr_succ : llvalue -> (llbasicblock, llvalue) llpos 1018 = "llvm_instr_succ" 1019external instr_end : llbasicblock -> (llbasicblock, llvalue) llrev_pos 1020 = "llvm_instr_end" 1021external instr_pred : llvalue -> (llbasicblock, llvalue) llrev_pos 1022 = "llvm_instr_pred" 1023 1024external instr_opcode : llvalue -> Opcode.t = "llvm_instr_get_opcode" 1025external icmp_predicate : llvalue -> Icmp.t option = "llvm_instr_icmp_predicate" 1026external fcmp_predicate : llvalue -> Fcmp.t option = "llvm_instr_fcmp_predicate" 1027external instr_clone : llvalue -> llvalue = "llvm_instr_clone" 1028 1029let 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 1037let iter_instrs f bb = 1038 iter_instrs_range f (instr_begin bb) (At_end bb) 1039 1040let 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 1046let fold_left_instrs f init bb = 1047 fold_left_instrs_range f init (instr_begin bb) (At_end bb) 1048 1049let 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 1057let rev_iter_instrs f bb = 1058 rev_iter_instrs_range f (instr_end bb) (At_start bb) 1059 1060let 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 1066let 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 ...........................................--*) 1071external instruction_call_conv: llvalue -> int 1072 = "llvm_instruction_call_conv" 1073external set_instruction_call_conv: int -> llvalue -> unit 1074 = "llvm_set_instruction_call_conv" 1075 1076external llvm_add_call_site_attr : llvalue -> llattribute -> int -> unit 1077 = "llvm_add_call_site_attr" 1078external llvm_call_site_attrs : llvalue -> int -> llattribute array 1079 = "llvm_call_site_attrs" 1080external llvm_remove_enum_call_site_attr : llvalue -> llattrkind -> int -> unit 1081 = "llvm_remove_enum_call_site_attr" 1082external llvm_remove_string_call_site_attr : llvalue -> string -> int -> unit 1083 = "llvm_remove_string_call_site_attr" 1084 1085let add_call_site_attr f a i = 1086 llvm_add_call_site_attr f a (AttrIndex.to_int i) 1087let call_site_attrs f i = 1088 llvm_call_site_attrs f (AttrIndex.to_int i) 1089let remove_enum_call_site_attr f k i = 1090 llvm_remove_enum_call_site_attr f k (AttrIndex.to_int i) 1091let 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) ..................--*) 1095external num_arg_operands : llvalue -> int = "llvm_num_arg_operands" 1096external is_tail_call : llvalue -> bool = "llvm_is_tail_call" 1097external set_tail_call : bool -> llvalue -> unit = "llvm_set_tail_call" 1098external get_normal_dest : llvalue -> llbasicblock = "LLVMGetNormalDest" 1099external get_unwind_dest : llvalue -> llbasicblock = "LLVMGetUnwindDest" 1100 1101(*--... Operations on load/store instructions (only) .......................--*) 1102external is_volatile : llvalue -> bool = "llvm_is_volatile" 1103external set_volatile : bool -> llvalue -> unit = "llvm_set_volatile" 1104 1105(*--... Operations on terminators ..........................................--*) 1106 1107let 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 1115external successor : llvalue -> int -> llbasicblock = "llvm_successor" 1116external set_successor : llvalue -> int -> llbasicblock -> unit 1117 = "llvm_set_successor" 1118external num_successors : llvalue -> int = "llvm_num_successors" 1119 1120let 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 1126let 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 1134let 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 .............................................--*) 1149external condition : llvalue -> llvalue = "llvm_condition" 1150external set_condition : llvalue -> llvalue -> unit 1151 = "llvm_set_condition" 1152external is_conditional : llvalue -> bool = "llvm_is_conditional" 1153 1154let 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 ............................................--*) 1163external add_incoming : (llvalue * llbasicblock) -> llvalue -> unit 1164 = "llvm_add_incoming" 1165external incoming : llvalue -> (llvalue * llbasicblock) list = "llvm_incoming" 1166 1167external delete_instruction : llvalue -> unit = "llvm_delete_instruction" 1168 1169(*===-- Instruction builders ----------------------------------------------===*) 1170external builder : llcontext -> llbuilder = "llvm_builder" 1171external position_builder : (llbasicblock, llvalue) llpos -> llbuilder -> unit 1172 = "llvm_position_builder" 1173external insertion_block : llbuilder -> llbasicblock = "llvm_insertion_block" 1174external insert_into_builder : llvalue -> string -> llbuilder -> unit 1175 = "llvm_insert_into_builder" 1176 1177let builder_at context ip = 1178 let b = builder context in 1179 position_builder ip b; 1180 b 1181 1182let builder_before context i = builder_at context (Before i) 1183let builder_at_end context bb = builder_at context (At_end bb) 1184 1185let position_before i = position_builder (Before i) 1186let position_at_end bb = position_builder (At_end bb) 1187 1188 1189(*--... Metadata ...........................................................--*) 1190external set_current_debug_location : llbuilder -> llvalue -> unit 1191 = "llvm_set_current_debug_location" 1192external clear_current_debug_location : llbuilder -> unit 1193 = "llvm_clear_current_debug_location" 1194external current_debug_location : llbuilder -> llvalue option 1195 = "llvm_current_debug_location" 1196external set_inst_debug_location : llbuilder -> llvalue -> unit 1197 = "llvm_set_inst_debug_location" 1198 1199 1200(*--... Terminators ........................................................--*) 1201external build_ret_void : llbuilder -> llvalue = "llvm_build_ret_void" 1202external build_ret : llvalue -> llbuilder -> llvalue = "llvm_build_ret" 1203external build_aggregate_ret : llvalue array -> llbuilder -> llvalue 1204 = "llvm_build_aggregate_ret" 1205external build_br : llbasicblock -> llbuilder -> llvalue = "llvm_build_br" 1206external build_cond_br : llvalue -> llbasicblock -> llbasicblock -> llbuilder -> 1207 llvalue = "llvm_build_cond_br" 1208external build_switch : llvalue -> llbasicblock -> int -> llbuilder -> llvalue 1209 = "llvm_build_switch" 1210external build_malloc : lltype -> string -> llbuilder -> llvalue = 1211 "llvm_build_malloc" 1212external build_array_malloc : lltype -> llvalue -> string -> llbuilder -> 1213 llvalue = "llvm_build_array_malloc" 1214external build_free : llvalue -> llbuilder -> llvalue = "llvm_build_free" 1215external add_case : llvalue -> llvalue -> llbasicblock -> unit 1216 = "llvm_add_case" 1217external switch_default_dest : llvalue -> llbasicblock = 1218 "LLVMGetSwitchDefaultDest" 1219external build_indirect_br : llvalue -> int -> llbuilder -> llvalue 1220 = "llvm_build_indirect_br" 1221external add_destination : llvalue -> llbasicblock -> unit 1222 = "llvm_add_destination" 1223external build_invoke : llvalue -> llvalue array -> llbasicblock -> 1224 llbasicblock -> string -> llbuilder -> llvalue 1225 = "llvm_build_invoke_bc" "llvm_build_invoke_nat" 1226external build_landingpad : lltype -> llvalue -> int -> string -> llbuilder -> 1227 llvalue = "llvm_build_landingpad" 1228external is_cleanup : llvalue -> bool = "llvm_is_cleanup" 1229external set_cleanup : llvalue -> bool -> unit = "llvm_set_cleanup" 1230external add_clause : llvalue -> llvalue -> unit = "llvm_add_clause" 1231external build_resume : llvalue -> llbuilder -> llvalue = "llvm_build_resume" 1232external build_unreachable : llbuilder -> llvalue = "llvm_build_unreachable" 1233 1234(*--... Arithmetic .........................................................--*) 1235external build_add : llvalue -> llvalue -> string -> llbuilder -> llvalue 1236 = "llvm_build_add" 1237external build_nsw_add : llvalue -> llvalue -> string -> llbuilder -> llvalue 1238 = "llvm_build_nsw_add" 1239external build_nuw_add : llvalue -> llvalue -> string -> llbuilder -> llvalue 1240 = "llvm_build_nuw_add" 1241external build_fadd : llvalue -> llvalue -> string -> llbuilder -> llvalue 1242 = "llvm_build_fadd" 1243external build_sub : llvalue -> llvalue -> string -> llbuilder -> llvalue 1244 = "llvm_build_sub" 1245external build_nsw_sub : llvalue -> llvalue -> string -> llbuilder -> llvalue 1246 = "llvm_build_nsw_sub" 1247external build_nuw_sub : llvalue -> llvalue -> string -> llbuilder -> llvalue 1248 = "llvm_build_nuw_sub" 1249external build_fsub : llvalue -> llvalue -> string -> llbuilder -> llvalue 1250 = "llvm_build_fsub" 1251external build_mul : llvalue -> llvalue -> string -> llbuilder -> llvalue 1252 = "llvm_build_mul" 1253external build_nsw_mul : llvalue -> llvalue -> string -> llbuilder -> llvalue 1254 = "llvm_build_nsw_mul" 1255external build_nuw_mul : llvalue -> llvalue -> string -> llbuilder -> llvalue 1256 = "llvm_build_nuw_mul" 1257external build_fmul : llvalue -> llvalue -> string -> llbuilder -> llvalue 1258 = "llvm_build_fmul" 1259external build_udiv : llvalue -> llvalue -> string -> llbuilder -> llvalue 1260 = "llvm_build_udiv" 1261external build_sdiv : llvalue -> llvalue -> string -> llbuilder -> llvalue 1262 = "llvm_build_sdiv" 1263external build_exact_sdiv : llvalue -> llvalue -> string -> llbuilder -> llvalue 1264 = "llvm_build_exact_sdiv" 1265external build_fdiv : llvalue -> llvalue -> string -> llbuilder -> llvalue 1266 = "llvm_build_fdiv" 1267external build_urem : llvalue -> llvalue -> string -> llbuilder -> llvalue 1268 = "llvm_build_urem" 1269external build_srem : llvalue -> llvalue -> string -> llbuilder -> llvalue 1270 = "llvm_build_srem" 1271external build_frem : llvalue -> llvalue -> string -> llbuilder -> llvalue 1272 = "llvm_build_frem" 1273external build_shl : llvalue -> llvalue -> string -> llbuilder -> llvalue 1274 = "llvm_build_shl" 1275external build_lshr : llvalue -> llvalue -> string -> llbuilder -> llvalue 1276 = "llvm_build_lshr" 1277external build_ashr : llvalue -> llvalue -> string -> llbuilder -> llvalue 1278 = "llvm_build_ashr" 1279external build_and : llvalue -> llvalue -> string -> llbuilder -> llvalue 1280 = "llvm_build_and" 1281external build_or : llvalue -> llvalue -> string -> llbuilder -> llvalue 1282 = "llvm_build_or" 1283external build_xor : llvalue -> llvalue -> string -> llbuilder -> llvalue 1284 = "llvm_build_xor" 1285external build_neg : llvalue -> string -> llbuilder -> llvalue 1286 = "llvm_build_neg" 1287external build_nsw_neg : llvalue -> string -> llbuilder -> llvalue 1288 = "llvm_build_nsw_neg" 1289external build_nuw_neg : llvalue -> string -> llbuilder -> llvalue 1290 = "llvm_build_nuw_neg" 1291external build_fneg : llvalue -> string -> llbuilder -> llvalue 1292 = "llvm_build_fneg" 1293external build_not : llvalue -> string -> llbuilder -> llvalue 1294 = "llvm_build_not" 1295 1296(*--... Memory .............................................................--*) 1297external build_alloca : lltype -> string -> llbuilder -> llvalue 1298 = "llvm_build_alloca" 1299external build_array_alloca : lltype -> llvalue -> string -> llbuilder -> 1300 llvalue = "llvm_build_array_alloca" 1301external build_load : llvalue -> string -> llbuilder -> llvalue 1302 = "llvm_build_load" 1303external build_store : llvalue -> llvalue -> llbuilder -> llvalue 1304 = "llvm_build_store" 1305external build_atomicrmw : AtomicRMWBinOp.t -> llvalue -> llvalue -> 1306 AtomicOrdering.t -> bool -> string -> llbuilder -> 1307 llvalue 1308 = "llvm_build_atomicrmw_bytecode" 1309 "llvm_build_atomicrmw_native" 1310external build_gep : llvalue -> llvalue array -> string -> llbuilder -> llvalue 1311 = "llvm_build_gep" 1312external build_in_bounds_gep : llvalue -> llvalue array -> string -> 1313 llbuilder -> llvalue = "llvm_build_in_bounds_gep" 1314external build_struct_gep : llvalue -> int -> string -> llbuilder -> llvalue 1315 = "llvm_build_struct_gep" 1316 1317external build_global_string : string -> string -> llbuilder -> llvalue 1318 = "llvm_build_global_string" 1319external build_global_stringptr : string -> string -> llbuilder -> llvalue 1320 = "llvm_build_global_stringptr" 1321 1322(*--... Casts ..............................................................--*) 1323external build_trunc : llvalue -> lltype -> string -> llbuilder -> llvalue 1324 = "llvm_build_trunc" 1325external build_zext : llvalue -> lltype -> string -> llbuilder -> llvalue 1326 = "llvm_build_zext" 1327external build_sext : llvalue -> lltype -> string -> llbuilder -> llvalue 1328 = "llvm_build_sext" 1329external build_fptoui : llvalue -> lltype -> string -> llbuilder -> llvalue 1330 = "llvm_build_fptoui" 1331external build_fptosi : llvalue -> lltype -> string -> llbuilder -> llvalue 1332 = "llvm_build_fptosi" 1333external build_uitofp : llvalue -> lltype -> string -> llbuilder -> llvalue 1334 = "llvm_build_uitofp" 1335external build_sitofp : llvalue -> lltype -> string -> llbuilder -> llvalue 1336 = "llvm_build_sitofp" 1337external build_fptrunc : llvalue -> lltype -> string -> llbuilder -> llvalue 1338 = "llvm_build_fptrunc" 1339external build_fpext : llvalue -> lltype -> string -> llbuilder -> llvalue 1340 = "llvm_build_fpext" 1341external build_ptrtoint : llvalue -> lltype -> string -> llbuilder -> llvalue 1342 = "llvm_build_prttoint" 1343external build_inttoptr : llvalue -> lltype -> string -> llbuilder -> llvalue 1344 = "llvm_build_inttoptr" 1345external build_bitcast : llvalue -> lltype -> string -> llbuilder -> llvalue 1346 = "llvm_build_bitcast" 1347external build_zext_or_bitcast : llvalue -> lltype -> string -> llbuilder -> 1348 llvalue = "llvm_build_zext_or_bitcast" 1349external build_sext_or_bitcast : llvalue -> lltype -> string -> llbuilder -> 1350 llvalue = "llvm_build_sext_or_bitcast" 1351external build_trunc_or_bitcast : llvalue -> lltype -> string -> llbuilder -> 1352 llvalue = "llvm_build_trunc_or_bitcast" 1353external build_pointercast : llvalue -> lltype -> string -> llbuilder -> llvalue 1354 = "llvm_build_pointercast" 1355external build_intcast : llvalue -> lltype -> string -> llbuilder -> llvalue 1356 = "llvm_build_intcast" 1357external build_fpcast : llvalue -> lltype -> string -> llbuilder -> llvalue 1358 = "llvm_build_fpcast" 1359 1360(*--... Comparisons ........................................................--*) 1361external build_icmp : Icmp.t -> llvalue -> llvalue -> string -> 1362 llbuilder -> llvalue = "llvm_build_icmp" 1363external build_fcmp : Fcmp.t -> llvalue -> llvalue -> string -> 1364 llbuilder -> llvalue = "llvm_build_fcmp" 1365 1366(*--... Miscellaneous instructions .........................................--*) 1367external build_phi : (llvalue * llbasicblock) list -> string -> llbuilder -> 1368 llvalue = "llvm_build_phi" 1369external build_empty_phi : lltype -> string -> llbuilder -> llvalue 1370 = "llvm_build_empty_phi" 1371external build_call : llvalue -> llvalue array -> string -> llbuilder -> llvalue 1372 = "llvm_build_call" 1373external build_select : llvalue -> llvalue -> llvalue -> string -> llbuilder -> 1374 llvalue = "llvm_build_select" 1375external build_va_arg : llvalue -> lltype -> string -> llbuilder -> llvalue 1376 = "llvm_build_va_arg" 1377external build_extractelement : llvalue -> llvalue -> string -> llbuilder -> 1378 llvalue = "llvm_build_extractelement" 1379external build_insertelement : llvalue -> llvalue -> llvalue -> string -> 1380 llbuilder -> llvalue = "llvm_build_insertelement" 1381external build_shufflevector : llvalue -> llvalue -> llvalue -> string -> 1382 llbuilder -> llvalue = "llvm_build_shufflevector" 1383external build_extractvalue : llvalue -> int -> string -> llbuilder -> llvalue 1384 = "llvm_build_extractvalue" 1385external build_insertvalue : llvalue -> llvalue -> int -> string -> llbuilder -> 1386 llvalue = "llvm_build_insertvalue" 1387 1388external build_is_null : llvalue -> string -> llbuilder -> llvalue 1389 = "llvm_build_is_null" 1390external build_is_not_null : llvalue -> string -> llbuilder -> llvalue 1391 = "llvm_build_is_not_null" 1392external build_ptrdiff : llvalue -> llvalue -> string -> llbuilder -> llvalue 1393 = "llvm_build_ptrdiff" 1394external build_freeze : llvalue -> string -> llbuilder -> llvalue 1395 = "llvm_build_freeze" 1396 1397 1398(*===-- Memory buffers ----------------------------------------------------===*) 1399 1400module 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" 1407end 1408 1409 1410(*===-- Pass Manager ------------------------------------------------------===*) 1411 1412module 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" 1425end 1426