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