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