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