llvm.mli revision e3b989d4a4ba47f77d5d38c35ff17e9673d9f87b
1(*===-- tools/ml/llvm.ml - LLVM Ocaml Interface ---------------------------===* 2 * 3 * The LLVM Compiler Infrastructure 4 * 5 * This file was developed by Gordon Henriksen and is distributed under the 6 * University of Illinois Open Source License. See LICENSE.TXT for details. 7 * 8 *===----------------------------------------------------------------------=== 9 * 10 * This interface provides an ocaml API for the LLVM intermediate 11 * representation, the classes in the VMCore library. 12 * 13 *===----------------------------------------------------------------------===*) 14 15 16(* These abstract types correlate directly to the LLVM VMCore classes. *) 17type llmodule 18type lltype 19type llvalue 20type llbasicblock (* These are actually values, but 21 benefit from type checking. *) 22type llbuilder 23 24type type_kind = 25 Void_type 26| Float_type 27| Double_type 28| X86fp80_type 29| Fp128_type 30| Ppc_fp128_type 31| Label_type 32| Integer_type 33| Function_type 34| Struct_type 35| Array_type 36| Pointer_type 37| Opaque_type 38| Vector_type 39 40type linkage = 41 External_linkage 42| Link_once_linkage 43| Weak_linkage 44| Appending_linkage 45| Internal_linkage 46| Dllimport_linkage 47| Dllexport_linkage 48| External_weak_linkage 49| Ghost_linkage 50 51type visibility = 52 Default_visibility 53| Hidden_visibility 54| Protected_visibility 55 56val ccc : int 57val fastcc : int 58val coldcc : int 59val x86_stdcallcc : int 60val x86_fastcallcc : int 61 62type int_predicate = 63 Icmp_eq 64| Icmp_ne 65| Icmp_ugt 66| Icmp_uge 67| Icmp_ult 68| Icmp_ule 69| Icmp_sgt 70| Icmp_sge 71| Icmp_slt 72| Icmp_sle 73 74type real_predicate = 75 Fcmp_false 76| Fcmp_oeq 77| Fcmp_ogt 78| Fcmp_oge 79| Fcmp_olt 80| Fcmp_ole 81| Fcmp_one 82| Fcmp_ord 83| Fcmp_uno 84| Fcmp_ueq 85| Fcmp_ugt 86| Fcmp_uge 87| Fcmp_ult 88| Fcmp_ule 89| Fcmp_une 90| Fcmp_true 91 92 93(*===-- Modules -----------------------------------------------------------===*) 94 95(* Creates a module with the supplied module ID. Modules are not garbage 96 collected; it is mandatory to call dispose_module to free memory. *) 97external create_module : string -> llmodule = "llvm_create_module" 98 99(* Disposes a module. All references to subordinate objects are invalidated; 100 referencing them will invoke undefined behavior. *) 101external dispose_module : llmodule -> unit = "llvm_dispose_module" 102 103(* Adds a named type to the module's symbol table. Returns true if successful. 104 If such a name already exists, then no entry is added and returns false. *) 105external define_type_name : string -> lltype -> llmodule -> bool 106 = "llvm_add_type_name" 107 108external delete_type_name : string -> llmodule -> unit 109 = "llvm_delete_type_name" 110 111 112(*===-- Types -------------------------------------------------------------===*) 113external classify_type : lltype -> type_kind = "llvm_classify_type" 114external refine_abstract_type : lltype -> lltype -> unit 115 = "llvm_refine_abstract_type" 116val string_of_lltype : lltype -> string 117 118(*--... Operations on integer types ........................................--*) 119val i1_type : lltype 120val i8_type : lltype 121val i16_type : lltype 122val i32_type : lltype 123val i64_type : lltype 124external make_integer_type : int -> lltype = "llvm_make_integer_type" 125external integer_bitwidth : lltype -> int = "llvm_integer_bitwidth" 126 127(*--... Operations on real types ...........................................--*) 128val float_type : lltype 129val double_type : lltype 130val x86fp80_type : lltype 131val fp128_type : lltype 132val ppc_fp128_type : lltype 133 134(*--... Operations on function types .......................................--*) 135(* FIXME: handle parameter attributes *) 136external make_function_type : lltype -> lltype array -> bool -> lltype 137 = "llvm_make_function_type" 138external is_var_arg : lltype -> bool = "llvm_is_var_arg" 139external return_type : lltype -> lltype = "llvm_return_type" 140external param_types : lltype -> lltype array = "llvm_param_types" 141 142(*--... Operations on struct types .........................................--*) 143external make_struct_type : lltype array -> bool -> lltype 144 = "llvm_make_struct_type" 145external element_types : lltype -> lltype array = "llvm_element_types" 146external is_packed : lltype -> bool = "llvm_is_packed" 147 148(*--... Operations on pointer, vector, and array types .....................--*) 149external make_array_type : lltype -> int -> lltype = "llvm_make_array_type" 150external make_pointer_type : lltype -> lltype = "llvm_make_pointer_type" 151external make_vector_type : lltype -> int -> lltype = "llvm_make_vector_type" 152 153external element_type : lltype -> lltype = "llvm_element_type" 154external array_length : lltype -> int = "llvm_array_length" 155external vector_size : lltype -> int = "llvm_vector_size" 156 157(*--... Operations on other types ..........................................--*) 158external make_opaque_type : unit -> lltype = "llvm_make_opaque_type" 159val void_type : lltype 160val label_type : lltype 161 162 163(*===-- Values ------------------------------------------------------------===*) 164external type_of : llvalue -> lltype = "llvm_type_of" 165external value_name : llvalue -> string = "llvm_value_name" 166external set_value_name : string -> llvalue -> unit = "llvm_set_value_name" 167external dump_value : llvalue -> unit = "llvm_dump_value" 168 169(*--... Operations on constants of (mostly) any type .......................--*) 170external is_constant : llvalue -> bool = "llvm_is_constant" 171external const_null : lltype -> llvalue = "LLVMConstNull" 172external const_all_ones : (*int|vec*)lltype -> llvalue = "LLVMConstAllOnes" 173external undef : lltype -> llvalue = "LLVMGetUndef" 174external is_null : llvalue -> bool = "llvm_is_null" 175external is_undef : llvalue -> bool = "llvm_is_undef" 176 177(*--... Operations on scalar constants .....................................--*) 178external const_int : lltype -> int -> llvalue = "llvm_const_int" 179external const_of_int64 : lltype -> Int64.t -> bool -> llvalue 180 = "llvm_const_of_int64" 181external const_float : lltype -> float -> llvalue = "llvm_const_float" 182 183(*--... Operations on composite constants ..................................--*) 184external const_string : string -> llvalue = "llvm_const_string" 185external const_stringz : string -> llvalue = "llvm_const_stringz" 186external const_array : lltype -> llvalue array -> llvalue = "llvm_const_array" 187external const_struct : llvalue array -> llvalue = "llvm_const_struct" 188external const_packed_struct : llvalue array -> llvalue 189 = "llvm_const_packed_struct" 190external const_vector : llvalue array -> llvalue = "llvm_const_vector" 191 192(*--... Constant expressions ...............................................--*) 193external size_of : lltype -> llvalue = "LLVMSizeOf" 194external const_neg : llvalue -> llvalue = "LLVMConstNeg" 195external const_not : llvalue -> llvalue = "LLVMConstNot" 196external const_add : llvalue -> llvalue -> llvalue = "LLVMConstAdd" 197external const_sub : llvalue -> llvalue -> llvalue = "LLVMConstSub" 198external const_mul : llvalue -> llvalue -> llvalue = "LLVMConstMul" 199external const_udiv : llvalue -> llvalue -> llvalue = "LLVMConstUDiv" 200external const_sdiv : llvalue -> llvalue -> llvalue = "LLVMConstSDiv" 201external const_fdiv : llvalue -> llvalue -> llvalue = "LLVMConstFDiv" 202external const_urem : llvalue -> llvalue -> llvalue = "LLVMConstURem" 203external const_srem : llvalue -> llvalue -> llvalue = "LLVMConstSRem" 204external const_frem : llvalue -> llvalue -> llvalue = "LLVMConstFRem" 205external const_and : llvalue -> llvalue -> llvalue = "LLVMConstAnd" 206external const_or : llvalue -> llvalue -> llvalue = "LLVMConstOr" 207external const_xor : llvalue -> llvalue -> llvalue = "LLVMConstXor" 208external const_icmp : int_predicate -> llvalue -> llvalue -> llvalue 209 = "llvm_const_icmp" 210external const_fcmp : real_predicate -> llvalue -> llvalue -> llvalue 211 = "llvm_const_fcmp" 212external const_shl : llvalue -> llvalue -> llvalue = "LLVMConstShl" 213external const_lshr : llvalue -> llvalue -> llvalue = "LLVMConstLShr" 214external const_ashr : llvalue -> llvalue -> llvalue = "LLVMConstAShr" 215external const_gep : llvalue -> llvalue array -> llvalue = "llvm_const_gep" 216external const_trunc : llvalue -> lltype -> llvalue = "LLVMConstTrunc" 217external const_sext : llvalue -> lltype -> llvalue = "LLVMConstSExt" 218external const_zext : llvalue -> lltype -> llvalue = "LLVMConstZExt" 219external const_fptrunc : llvalue -> lltype -> llvalue = "LLVMConstFPTrunc" 220external const_fpext : llvalue -> lltype -> llvalue = "LLVMConstFPExt" 221external const_uitofp : llvalue -> lltype -> llvalue = "LLVMConstUIToFP" 222external const_sitofp : llvalue -> lltype -> llvalue = "LLVMConstSIToFP" 223external const_fptoui : llvalue -> lltype -> llvalue = "LLVMConstFPToUI" 224external const_fptosi : llvalue -> lltype -> llvalue = "LLVMConstFPToSI" 225external const_ptrtoint : llvalue -> lltype -> llvalue = "LLVMConstPtrToInt" 226external const_inttoptr : llvalue -> lltype -> llvalue = "LLVMConstIntToPtr" 227external const_bitcast : llvalue -> lltype -> llvalue = "LLVMConstBitCast" 228external const_select : llvalue -> llvalue -> llvalue -> llvalue 229 = "LLVMConstSelect" 230external const_extractelement : llvalue -> llvalue -> llvalue 231 = "LLVMConstExtractElement" 232external const_insertelement : llvalue -> llvalue -> llvalue -> llvalue 233 = "LLVMConstInsertElement" 234external const_shufflevector : llvalue -> llvalue -> llvalue -> llvalue 235 = "LLVMConstShuffleVector" 236 237(*--... Operations on global variables, functions, and aliases (globals) ...--*) 238external is_declaration : llvalue -> bool = "llvm_is_declaration" 239external linkage : llvalue -> linkage = "llvm_linkage" 240external set_linkage : linkage -> llvalue -> unit = "llvm_set_linkage" 241external section : llvalue -> string = "llvm_section" 242external set_section : string -> llvalue -> unit = "llvm_set_section" 243external visibility : llvalue -> visibility = "llvm_visibility" 244external set_visibility : visibility -> llvalue -> unit = "llvm_set_visibility" 245external alignment : llvalue -> int = "llvm_alignment" 246external set_alignment : int -> llvalue -> unit = "llvm_set_alignment" 247 248(*--... Operations on global variables .....................................--*) 249external declare_global : lltype -> string -> llmodule -> llvalue 250 = "llvm_declare_global" 251external define_global : string -> llvalue -> llmodule -> llvalue 252 = "llvm_define_global" 253external delete_global : llvalue -> unit = "llvm_delete_global" 254external global_initializer : llvalue -> llvalue = "LLVMGetInitializer" 255external set_initializer : llvalue -> llvalue -> unit = "llvm_set_initializer" 256external remove_initializer : llvalue -> unit = "llvm_remove_initializer" 257external is_thread_local : llvalue -> bool = "llvm_is_thread_local" 258external set_thread_local : bool -> llvalue -> unit = "llvm_set_thread_local" 259 260(*--... Operations on functions ............................................--*) 261external declare_function : string -> lltype -> llmodule -> llvalue 262 = "llvm_declare_function" 263external define_function : string -> lltype -> llmodule -> llvalue 264 = "llvm_define_function" 265external delete_function : llvalue -> unit = "llvm_delete_function" 266external params : llvalue -> llvalue array = "llvm_params" 267external param : llvalue -> int -> llvalue = "llvm_param" 268external is_intrinsic : llvalue -> bool = "llvm_is_intrinsic" 269external function_call_conv : llvalue -> int = "llvm_function_call_conv" 270external set_function_call_conv : int -> llvalue -> unit 271 = "llvm_set_function_call_conv" 272 273(*--... Operations on basic blocks .........................................--*) 274external basic_blocks : llvalue -> llbasicblock array = "llvm_basic_blocks" 275external entry_block : llvalue -> llbasicblock = "LLVMGetEntryBasicBlock" 276external delete_block : llbasicblock -> unit = "llvm_delete_block" 277external append_block : string -> llvalue -> llbasicblock = "llvm_append_block" 278external insert_block : string -> llbasicblock -> llbasicblock 279 = "llvm_insert_block" 280external value_of_block : llbasicblock -> llvalue = "LLVMBasicBlockAsValue" 281external value_is_block : llvalue -> bool = "llvm_value_is_block" 282external block_of_value : llvalue -> llbasicblock = "LLVMValueAsBasicBlock" 283 284 285(*===-- Instruction builders ----------------------------------------------===*) 286external builder_before : llvalue -> llbuilder = "llvm_builder_before" 287external builder_at_end : llbasicblock -> llbuilder = "llvm_builder_at_end" 288external position_before : llvalue -> llbuilder -> unit = "llvm_position_before" 289external position_at_end : llbasicblock -> llbuilder -> unit 290 = "llvm_position_at_end" 291 292(*--... Terminators ........................................................--*) 293external build_ret_void : llbuilder -> llvalue = "llvm_build_ret_void" 294external build_ret : llvalue -> llbuilder -> llvalue = "llvm_build_ret" 295external build_br : llbasicblock -> llbuilder -> llvalue = "llvm_build_br" 296external build_cond_br : llvalue -> llbasicblock -> llbasicblock -> llbuilder -> 297 llvalue = "llvm_build_cond_br" 298external build_switch : llvalue -> llbasicblock -> int -> llbuilder -> llvalue 299 = "llvm_build_switch" 300external build_invoke : llvalue -> llvalue array -> llbasicblock -> 301 llbasicblock -> string -> llbuilder -> llvalue 302 = "llvm_build_invoke_bc" "llvm_build_invoke_nat" 303external build_unwind : llbuilder -> llvalue = "llvm_build_unwind" 304external build_unreachable : llbuilder -> llvalue = "llvm_build_unreachable" 305 306(*--... Arithmetic .........................................................--*) 307external build_add : llvalue -> llvalue -> string -> llbuilder -> llvalue 308 = "llvm_build_add" 309external build_sub : llvalue -> llvalue -> string -> llbuilder -> llvalue 310 = "llvm_build_sub" 311external build_mul : llvalue -> llvalue -> string -> llbuilder -> llvalue 312 = "llvm_build_mul" 313external build_udiv : llvalue -> llvalue -> string -> llbuilder -> llvalue 314 = "llvm_build_udiv" 315external build_sdiv : llvalue -> llvalue -> string -> llbuilder -> llvalue 316 = "llvm_build_sdiv" 317external build_fdiv : llvalue -> llvalue -> string -> llbuilder -> llvalue 318 = "llvm_build_fdiv" 319external build_urem : llvalue -> llvalue -> string -> llbuilder -> llvalue 320 = "llvm_build_urem" 321external build_srem : llvalue -> llvalue -> string -> llbuilder -> llvalue 322 = "llvm_build_srem" 323external build_frem : llvalue -> llvalue -> string -> llbuilder -> llvalue 324 = "llvm_build_frem" 325external build_shl : llvalue -> llvalue -> string -> llbuilder -> llvalue 326 = "llvm_build_shl" 327external build_lshr : llvalue -> llvalue -> string -> llbuilder -> llvalue 328 = "llvm_build_lshr" 329external build_ashr : llvalue -> llvalue -> string -> llbuilder -> llvalue 330 = "llvm_build_ashr" 331external build_and : llvalue -> llvalue -> string -> llbuilder -> llvalue 332 = "llvm_build_and" 333external build_or : llvalue -> llvalue -> string -> llbuilder -> llvalue 334 = "llvm_build_or" 335external build_xor : llvalue -> llvalue -> string -> llbuilder -> llvalue 336 = "llvm_build_xor" 337external build_neg : llvalue -> string -> llbuilder -> llvalue 338 = "llvm_build_neg" 339external build_not : llvalue -> string -> llbuilder -> llvalue 340 = "llvm_build_not" 341 342(*--... Memory .............................................................--*) 343external build_malloc : lltype -> string -> llbuilder -> llvalue 344 = "llvm_build_malloc" 345external build_array_malloc : lltype -> llvalue -> string -> llbuilder -> 346 llvalue = "llvm_build_array_malloc" 347external build_alloca : lltype -> string -> llbuilder -> llvalue 348 = "llvm_build_alloca" 349external build_array_alloca : lltype -> llvalue -> string -> llbuilder -> 350 llvalue = "llvm_build_array_alloca" 351external build_free : llvalue -> llbuilder -> llvalue = "llvm_build_free" 352external build_load : llvalue -> string -> llbuilder -> llvalue 353 = "llvm_build_load" 354external build_store : llvalue -> llvalue -> llbuilder -> llvalue 355 = "llvm_build_store" 356external build_gep : llvalue -> llvalue array -> string -> llbuilder -> llvalue 357 = "llvm_build_gep" 358 359(*--... Casts ..............................................................--*) 360external build_trunc : llvalue -> lltype -> string -> llbuilder -> llvalue 361 = "llvm_build_trunc" 362external build_zext : llvalue -> lltype -> string -> llbuilder -> llvalue 363 = "llvm_build_zext" 364external build_sext : llvalue -> lltype -> string -> llbuilder -> llvalue 365 = "llvm_build_sext" 366external build_fptoui : llvalue -> lltype -> string -> llbuilder -> llvalue 367 = "llvm_build_fptoui" 368external build_fptosi : llvalue -> lltype -> string -> llbuilder -> llvalue 369 = "llvm_build_fptosi" 370external build_uitofp : llvalue -> lltype -> string -> llbuilder -> llvalue 371 = "llvm_build_uitofp" 372external build_sitofp : llvalue -> lltype -> string -> llbuilder -> llvalue 373 = "llvm_build_sitofp" 374external build_fptrunc : llvalue -> lltype -> string -> llbuilder -> llvalue 375 = "llvm_build_fptrunc" 376external build_fpext : llvalue -> lltype -> string -> llbuilder -> llvalue 377 = "llvm_build_fpext" 378external build_ptrtoint : llvalue -> lltype -> string -> llbuilder -> llvalue 379 = "llvm_build_prttoint" 380external build_inttoptr : llvalue -> lltype -> string -> llbuilder -> llvalue 381 = "llvm_build_inttoptr" 382external build_bitcast : llvalue -> lltype -> string -> llbuilder -> llvalue 383 = "llvm_build_bitcast" 384 385(*--... Comparisons ........................................................--*) 386external build_icmp : int_predicate -> llvalue -> llvalue -> string -> 387 llbuilder -> llvalue = "llvm_build_icmp" 388external build_fcmp : real_predicate -> llvalue -> llvalue -> string -> 389 llbuilder -> llvalue = "llvm_build_fcmp" 390 391(*--... Miscellaneous instructions .........................................--*) 392external build_phi : lltype -> string -> llbuilder -> llvalue = "llvm_build_phi" 393external build_call : llvalue -> llvalue array -> string -> llbuilder -> llvalue 394 = "llvm_build_call" 395external build_select : llvalue -> llvalue -> llvalue -> string -> llbuilder -> 396 llvalue = "llvm_build_select" 397external build_va_arg : llvalue -> lltype -> string -> llbuilder -> llvalue 398 = "llvm_build_va_arg" 399external build_extractelement : llvalue -> llvalue -> string -> llbuilder -> 400 llvalue = "llvm_build_extractelement" 401external build_insertelement : llvalue -> llvalue -> llvalue -> string -> 402 llbuilder -> llvalue = "llvm_build_insertelement" 403external build_shufflevector : llvalue -> llvalue -> llvalue -> string -> 404 llbuilder -> llvalue = "llvm_build_shufflevector" 405