From 42358b686cfd7394a453cc9c86680376adc7f208 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 2 Jun 2022 10:53:32 +0200 Subject: [PATCH] [llvm-ocaml] Add and use opaque pointer compatible bindings Add bindings for LLVMConstGEP2, LLVMAddAlias2, LLVMBuildLoad2, LLVMBuildInvoke2, LLVMBuildGEP2, LLVMBuildInBoundsGEP2, LLVMBuildStructGEP2, LLVMBuildPtrDiff2 and use these in tests. --- llvm/bindings/ocaml/llvm/llvm.ml | 18 +++++++ llvm/bindings/ocaml/llvm/llvm.mli | 51 +++++++++++++++++++ llvm/bindings/ocaml/llvm/llvm_ocaml.c | 73 +++++++++++++++++++++++++-- llvm/test/Bindings/OCaml/core.ml | 61 +++++++++++----------- 4 files changed, 170 insertions(+), 33 deletions(-) diff --git a/llvm/bindings/ocaml/llvm/llvm.ml b/llvm/bindings/ocaml/llvm/llvm.ml index 9c79035167b9..b20c113ef32e 100644 --- a/llvm/bindings/ocaml/llvm/llvm.ml +++ b/llvm/bindings/ocaml/llvm/llvm.ml @@ -669,6 +669,8 @@ external const_shl : llvalue -> llvalue -> llvalue = "LLVMConstShl" external const_lshr : llvalue -> llvalue -> llvalue = "LLVMConstLShr" external const_ashr : llvalue -> llvalue -> llvalue = "LLVMConstAShr" external const_gep : llvalue -> llvalue array -> llvalue = "llvm_const_gep" +external const_gep2 : lltype -> llvalue -> llvalue array -> llvalue + = "llvm_const_gep2" external const_in_bounds_gep : llvalue -> llvalue array -> llvalue = "llvm_const_in_bounds_gep" external const_trunc : llvalue -> lltype -> llvalue = "LLVMConstTrunc" @@ -812,6 +814,9 @@ let fold_right_globals f m init = external add_alias : llmodule -> lltype -> llvalue -> string -> llvalue = "llvm_add_alias" +external add_alias2 : llmodule -> lltype -> int -> llvalue -> string -> llvalue + = "llvm_add_alias2" + (*--... Operations on functions ............................................--*) external declare_function : string -> lltype -> llmodule -> llvalue = "llvm_declare_function" @@ -1223,6 +1228,9 @@ external add_destination : llvalue -> llbasicblock -> unit external build_invoke : llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string -> llbuilder -> llvalue = "llvm_build_invoke_bc" "llvm_build_invoke_nat" +external build_invoke2 : lltype -> llvalue -> llvalue array -> llbasicblock -> + llbasicblock -> string -> llbuilder -> llvalue + = "llvm_build_invoke2_bc" "llvm_build_invoke2_nat" external build_landingpad : lltype -> llvalue -> int -> string -> llbuilder -> llvalue = "llvm_build_landingpad" external is_cleanup : llvalue -> bool = "llvm_is_cleanup" @@ -1300,6 +1308,8 @@ external build_array_alloca : lltype -> llvalue -> string -> llbuilder -> llvalue = "llvm_build_array_alloca" external build_load : llvalue -> string -> llbuilder -> llvalue = "llvm_build_load" +external build_load2 : lltype -> llvalue -> string -> llbuilder -> llvalue + = "llvm_build_load2" external build_store : llvalue -> llvalue -> llbuilder -> llvalue = "llvm_build_store" external build_atomicrmw : AtomicRMWBinOp.t -> llvalue -> llvalue -> @@ -1309,10 +1319,16 @@ external build_atomicrmw : AtomicRMWBinOp.t -> llvalue -> llvalue -> "llvm_build_atomicrmw_native" external build_gep : llvalue -> llvalue array -> string -> llbuilder -> llvalue = "llvm_build_gep" +external build_gep2 : lltype -> llvalue -> llvalue array -> string -> llbuilder + -> llvalue = "llvm_build_gep2" external build_in_bounds_gep : llvalue -> llvalue array -> string -> llbuilder -> llvalue = "llvm_build_in_bounds_gep" +external build_in_bounds_gep2 : lltype -> llvalue -> llvalue array -> string -> + llbuilder -> llvalue = "llvm_build_in_bounds_gep2" external build_struct_gep : llvalue -> int -> string -> llbuilder -> llvalue = "llvm_build_struct_gep" +external build_struct_gep2 : lltype -> llvalue -> int -> string -> llbuilder -> + llvalue = "llvm_build_struct_gep2" external build_global_string : string -> string -> llbuilder -> llvalue = "llvm_build_global_string" @@ -1393,6 +1409,8 @@ external build_is_not_null : llvalue -> string -> llbuilder -> llvalue = "llvm_build_is_not_null" external build_ptrdiff : llvalue -> llvalue -> string -> llbuilder -> llvalue = "llvm_build_ptrdiff" +external build_ptrdiff2 : lltype -> llvalue -> llvalue -> string -> llbuilder -> + llvalue = "llvm_build_ptrdiff2" external build_freeze : llvalue -> string -> llbuilder -> llvalue = "llvm_build_freeze" diff --git a/llvm/bindings/ocaml/llvm/llvm.mli b/llvm/bindings/ocaml/llvm/llvm.mli index c8f0f14cdf79..af303774e0b9 100644 --- a/llvm/bindings/ocaml/llvm/llvm.mli +++ b/llvm/bindings/ocaml/llvm/llvm.mli @@ -1219,6 +1219,12 @@ val const_ashr : llvalue -> llvalue -> llvalue See the method [llvm::ConstantExpr::getGetElementPtr]. *) val const_gep : llvalue -> llvalue array -> llvalue +(** [const_gep2 srcty pc indices] returns the constant [getElementPtr] of [pc] + with source element type [srcty] and the constant integers indices from the + array [indices]. + See the method [llvm::ConstantExpr::getGetElementPtr]. *) +val const_gep2 : lltype -> llvalue -> llvalue array -> llvalue + (** [const_in_bounds_gep pc indices] returns the constant [getElementPtr] of [pc] with the constant integers indices from the array [indices]. See the method [llvm::ConstantExpr::getInBoundsGetElementPtr]. *) @@ -1564,6 +1570,10 @@ val set_externally_initialized : bool -> llvalue -> unit See the constructor for [llvm::GlobalAlias]. *) val add_alias : llmodule -> lltype -> llvalue -> string -> llvalue +(** [add_alias m vt as a n] inserts an alias in the module [m] with the value + type [vt] the address space [as] the aliasee [a] with the name [n]. + See the constructor for [llvm::GlobalAlias]. *) +val add_alias2 : llmodule -> lltype -> int -> llvalue -> string -> llvalue (** {7 Operations on functions} *) @@ -2150,6 +2160,13 @@ val add_destination : llvalue -> llbasicblock -> unit val build_invoke : llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string -> llbuilder -> llvalue +(** [build_invoke2 fnty fn args tobb unwindbb name b] creates an + [%name = invoke %fn(args) to %tobb unwind %unwindbb] + instruction at the position specified by the instruction builder [b]. + See the method [llvm::LLVMBuilder::CreateInvoke]. *) +val build_invoke2 : lltype -> llvalue -> llvalue array -> llbasicblock -> + llbasicblock -> string -> llbuilder -> llvalue + (** [build_landingpad ty persfn numclauses name b] creates an [landingpad] instruction at the position specified by the instruction builder [b]. @@ -2390,6 +2407,12 @@ val build_array_alloca : lltype -> llvalue -> string -> llbuilder -> See the method [llvm::LLVMBuilder::CreateLoad]. *) val build_load : llvalue -> string -> llbuilder -> llvalue +(** [build_load2 ty v name b] creates a + [%name = load %ty, %v] + instruction at the position specified by the instruction builder [b]. + See the method [llvm::LLVMBuilder::CreateLoad]. *) +val build_load2 : lltype -> llvalue -> string -> llbuilder -> llvalue + (** [build_store v p b] creates a [store %v, %p] instruction at the position specified by the instruction builder [b]. @@ -2410,6 +2433,13 @@ val build_atomicrmw : AtomicRMWBinOp.t -> llvalue -> llvalue -> See the method [llvm::LLVMBuilder::CreateGetElementPtr]. *) val build_gep : llvalue -> llvalue array -> string -> llbuilder -> llvalue +(** [build_gep2 srcty p indices name b] creates a + [%name = getelementptr srcty, %p, indices...] + instruction at the position specified by the instruction builder [b]. + See the method [llvm::LLVMBuilder::CreateGetElementPtr]. *) +val build_gep2 : lltype -> llvalue -> llvalue array -> string -> llbuilder -> + llvalue + (** [build_in_bounds_gep p indices name b] creates a [%name = gelementptr inbounds %p, indices...] instruction at the position specified by the instruction builder [b]. @@ -2417,6 +2447,13 @@ val build_gep : llvalue -> llvalue array -> string -> llbuilder -> llvalue val build_in_bounds_gep : llvalue -> llvalue array -> string -> llbuilder -> llvalue +(** [build_in_bounds_gep2 srcty p indices name b] creates a + [%name = gelementptr inbounds srcty, %p, indices...] + instruction at the position specified by the instruction builder [b]. + See the method [llvm::LLVMBuilder::CreateInBoundsGetElementPtr]. *) +val build_in_bounds_gep2 : lltype -> llvalue -> llvalue array -> string -> + llbuilder -> llvalue + (** [build_struct_gep p idx name b] creates a [%name = getelementptr %p, 0, idx] instruction at the position specified by the instruction builder [b]. @@ -2424,6 +2461,13 @@ val build_in_bounds_gep : llvalue -> llvalue array -> string -> llbuilder -> val build_struct_gep : llvalue -> int -> string -> llbuilder -> llvalue +(** [build_struct_gep2 srcty p idx name b] creates a + [%name = getelementptr srcty, %p, 0, idx] + instruction at the position specified by the instruction builder [b]. + See the method [llvm::LLVMBuilder::CreateStructGetElementPtr]. *) +val build_struct_gep2 : lltype -> llvalue -> int -> string -> llbuilder -> + llvalue + (** [build_global_string str name b] creates a series of instructions that adds a global string at the position specified by the instruction builder [b]. See the method [llvm::LLVMBuilder::CreateGlobalString]. *) @@ -2656,6 +2700,13 @@ val build_is_not_null : llvalue -> string -> llbuilder -> llvalue See the method [llvm::LLVMBuilder::CreatePtrDiff]. *) val build_ptrdiff : llvalue -> llvalue -> string -> llbuilder -> llvalue +(** [build_ptrdiff2 elemty lhs rhs name b] creates a series of instructions + that measure the difference between two pointer values in multiples of + [elemty] at the position specified by the instruction builder [b]. + See the method [llvm::LLVMBuilder::CreatePtrDiff]. *) +val build_ptrdiff2 : lltype -> llvalue -> llvalue -> string -> llbuilder -> + llvalue + (** [build_freeze x name b] creates a [%name = freeze %x] instruction at the position specified by the instruction builder [b]. diff --git a/llvm/bindings/ocaml/llvm/llvm_ocaml.c b/llvm/bindings/ocaml/llvm/llvm_ocaml.c index fe819d9f92c9..8a1b63aa8bf9 100644 --- a/llvm/bindings/ocaml/llvm/llvm_ocaml.c +++ b/llvm/bindings/ocaml/llvm/llvm_ocaml.c @@ -994,6 +994,13 @@ LLVMValueRef llvm_const_gep(LLVMValueRef ConstantVal, value Indices) { Wosize_val(Indices)); } +/* lltype -> llvalue -> llvalue array -> llvalue */ +LLVMValueRef llvm_const_gep2(LLVMTypeRef Ty, LLVMValueRef ConstantVal, + value Indices) { + return LLVMConstGEP2(Ty, ConstantVal, (LLVMValueRef *)Op_val(Indices), + Wosize_val(Indices)); +} + /* llvalue -> llvalue array -> llvalue */ LLVMValueRef llvm_const_in_bounds_gep(LLVMValueRef ConstantVal, value Indices) { return LLVMConstInBoundsGEP(ConstantVal, (LLVMValueRef *)Op_val(Indices), @@ -1162,7 +1169,7 @@ DEFINE_ITERATORS(global, Global, LLVMModuleRef, LLVMValueRef, LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name, LLVMModuleRef M) { LLVMValueRef GlobalVar; if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) { - if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty) + if (LLVMGlobalGetValueType(GlobalVar) != Ty) return LLVMConstBitCast(GlobalVar, LLVMPointerType(Ty, 0)); return GlobalVar; } @@ -1175,7 +1182,7 @@ LLVMValueRef llvm_declare_qualified_global(LLVMTypeRef Ty, value Name, LLVMModuleRef M) { LLVMValueRef GlobalVar; if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) { - if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty) + if (LLVMGlobalGetValueType(GlobalVar) != Ty) return LLVMConstBitCast(GlobalVar, LLVMPointerType(Ty, Int_val(AddressSpace))); return GlobalVar; @@ -1283,6 +1290,12 @@ LLVMValueRef llvm_add_alias(LLVMModuleRef M, LLVMTypeRef Ty, return LLVMAddAlias(M, Ty, Aliasee, String_val(Name)); } +LLVMValueRef llvm_add_alias2(LLVMModuleRef M, LLVMTypeRef ValueTy, + value AddrSpace, LLVMValueRef Aliasee, value Name) { + return LLVMAddAlias2(M, ValueTy, Int_val(AddrSpace), Aliasee, + String_val(Name)); +} + /*--... Operations on functions ............................................--*/ DEFINE_ITERATORS(function, Function, LLVMModuleRef, LLVMValueRef, @@ -1293,7 +1306,7 @@ LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty, LLVMModuleRef M) { LLVMValueRef Fn; if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) { - if (LLVMGetElementType(LLVMTypeOf(Fn)) != Ty) + if (LLVMGlobalGetValueType(Fn) != Ty) return LLVMConstBitCast(Fn, LLVMPointerType(Ty, 0)); return Fn; } @@ -1797,6 +1810,25 @@ LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) { (LLVMBasicBlockRef)Args[3], Args[4], Args[5]); } +/* lltype -> llvalue -> llvalue array -> llbasicblock -> llbasicblock -> + string -> llbuilder -> llvalue */ +LLVMValueRef llvm_build_invoke2_nat(LLVMTypeRef FnTy, LLVMValueRef Fn, + value Args, LLVMBasicBlockRef Then, + LLVMBasicBlockRef Catch, value Name, + value B) { + return LLVMBuildInvoke2(Builder_val(B), FnTy, Fn, + (LLVMValueRef *)Op_val(Args), Wosize_val(Args), + Then, Catch, String_val(Name)); +} + +/* lltype -> llvalue -> llvalue array -> llbasicblock -> llbasicblock -> + string -> llbuilder -> llvalue */ +LLVMValueRef llvm_build_invoke2_bc(value Args[], int NumArgs) { + return llvm_build_invoke2_nat((LLVMTypeRef)Args[0], (LLVMValueRef)Args[1], + Args[2], (LLVMBasicBlockRef)Args[3], + (LLVMBasicBlockRef)Args[4], Args[5], Args[6]); +} + /* lltype -> llvalue -> int -> string -> llbuilder -> llvalue */ LLVMValueRef llvm_build_landingpad(LLVMTypeRef Ty, LLVMValueRef PersFn, value NumClauses, value Name, value B) { @@ -2026,6 +2058,12 @@ LLVMValueRef llvm_build_load(LLVMValueRef Pointer, value Name, value B) { return LLVMBuildLoad(Builder_val(B), Pointer, String_val(Name)); } +/* lltype -> llvalue -> string -> llbuilder -> llvalue */ +LLVMValueRef llvm_build_load2(LLVMTypeRef Ty, LLVMValueRef Pointer, value Name, + value B) { + return LLVMBuildLoad2(Builder_val(B), Ty, Pointer, String_val(Name)); +} + /* llvalue -> llvalue -> llbuilder -> llvalue */ LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer, value B) { @@ -2057,6 +2095,14 @@ LLVMValueRef llvm_build_gep(LLVMValueRef Pointer, value Indices, value Name, Wosize_val(Indices), String_val(Name)); } +/* lltype -> llvalue -> llvalue array -> string -> llbuilder -> llvalue */ +LLVMValueRef llvm_build_gep2(LLVMTypeRef Ty, LLVMValueRef Pointer, + value Indices, value Name, value B) { + return LLVMBuildGEP2(Builder_val(B), Ty, Pointer, + (LLVMValueRef *)Op_val(Indices), Wosize_val(Indices), + String_val(Name)); +} + /* llvalue -> llvalue array -> string -> llbuilder -> llvalue */ LLVMValueRef llvm_build_in_bounds_gep(LLVMValueRef Pointer, value Indices, value Name, value B) { @@ -2065,6 +2111,14 @@ LLVMValueRef llvm_build_in_bounds_gep(LLVMValueRef Pointer, value Indices, Wosize_val(Indices), String_val(Name)); } +/* lltype -> llvalue -> llvalue array -> string -> llbuilder -> llvalue */ +LLVMValueRef llvm_build_in_bounds_gep2(LLVMTypeRef Ty, LLVMValueRef Pointer, + value Indices, value Name, value B) { + return LLVMBuildInBoundsGEP2(Builder_val(B), Ty, Pointer, + (LLVMValueRef *)Op_val(Indices), + Wosize_val(Indices), String_val(Name)); +} + /* llvalue -> int -> string -> llbuilder -> llvalue */ LLVMValueRef llvm_build_struct_gep(LLVMValueRef Pointer, value Index, value Name, value B) { @@ -2072,6 +2126,13 @@ LLVMValueRef llvm_build_struct_gep(LLVMValueRef Pointer, value Index, String_val(Name)); } +/* lltype -> llvalue -> int -> string -> llbuilder -> llvalue */ +LLVMValueRef llvm_build_struct_gep2(LLVMTypeRef Ty, LLVMValueRef Pointer, + value Index, value Name, value B) { + return LLVMBuildStructGEP2(Builder_val(B), Ty, Pointer, Int_val(Index), + String_val(Name)); +} + /* string -> string -> llbuilder -> llvalue */ LLVMValueRef llvm_build_global_string(value Str, value Name, value B) { return LLVMBuildGlobalString(Builder_val(B), String_val(Str), @@ -2314,6 +2375,12 @@ LLVMValueRef llvm_build_ptrdiff(LLVMValueRef LHS, LLVMValueRef RHS, value Name, return LLVMBuildPtrDiff(Builder_val(B), LHS, RHS, String_val(Name)); } +/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ +LLVMValueRef llvm_build_ptrdiff2(LLVMTypeRef ElemTy, LLVMValueRef LHS, + LLVMValueRef RHS, value Name, value B) { + return LLVMBuildPtrDiff2(Builder_val(B), ElemTy, LHS, RHS, String_val(Name)); +} + /* llvalue -> string -> llbuilder -> llvalue */ LLVMValueRef llvm_build_freeze(LLVMValueRef X, value Name, value B) { return LLVMBuildFreeze(Builder_val(B), X, String_val(Name)); diff --git a/llvm/test/Bindings/OCaml/core.ml b/llvm/test/Bindings/OCaml/core.ml index 5eeb27155dd7..41200cad4996 100644 --- a/llvm/test/Bindings/OCaml/core.ml +++ b/llvm/test/Bindings/OCaml/core.ml @@ -213,7 +213,7 @@ let test_constants () = ignore (define_global "const_all_ones" c m); group "pointer null"; begin - (* CHECK: const_pointer_null = global i64* null + (* CHECK: const_pointer_null = global ptr null *) let c = const_pointer_null (pointer_type i64_type) in ignore (define_global "const_pointer_null" c m); @@ -329,8 +329,8 @@ let test_constants () = ignore (define_global "const_fptoui" (const_fptoui ffoldbomb i32_type) m); ignore (define_global "const_fptosi" (const_fptosi ffoldbomb i32_type) m); ignore (define_global "const_ptrtoint" (const_ptrtoint - (const_gep (const_null (pointer_type i8_type)) - [| const_int i32_type 1 |]) + (const_gep2 i8_type (const_null (pointer_type i8_type)) + [| const_int i32_type 1 |]) i32_type) m); ignore (define_global "const_inttoptr" (const_inttoptr (const_add foldbomb five) void_ptr) m); @@ -347,7 +347,8 @@ let test_constants () = * CHECK: const_shufflevector = global <4 x i32> *) ignore (define_global "const_size_of" (size_of (pointer_type i8_type)) m); - ignore (define_global "const_gep" (const_gep foldbomb_gv [| five |]) m); + ignore (define_global "const_gep" (const_gep2 i8_type foldbomb_gv [| five |]) + m); ignore (define_global "const_select" (const_select (const_icmp Icmp.Sle foldbomb five) (const_int i8_type (-1)) @@ -630,7 +631,7 @@ let test_users () = let p1 = param fn 0 in let p2 = param fn 1 in let a3 = build_alloca i32_type "user_alloca" b in - let p3 = build_load a3 "user_load" b in + let p3 = build_load2 i32_type a3 "user_load" b in let i = build_add p1 p2 "sum" b in insist ((num_operands i) = 2); @@ -647,11 +648,11 @@ let test_users () = (*===-- Aliases -----------------------------------------------------------===*) let test_aliases () = - (* CHECK: @alias = alias i32, i32* @aliasee + (* CHECK: @alias = alias i32, ptr @aliasee *) let forty_two32 = const_int i32_type 42 in let v = define_global "aliasee" forty_two32 m in - ignore (add_alias m (pointer_type i32_type) v "alias") + ignore (add_alias2 m i32_type 0 v "alias") (*===-- Functions ---------------------------------------------------------===*) @@ -1017,14 +1018,13 @@ let test_builder () = * CHECK-DAG: %build_fptrunc2 = fptrunc double %build_sitofp to float * CHECK-DAG: %build_fpext = fpext float %build_fptrunc to double * CHECK-DAG: %build_fpext2 = fpext float %build_fptrunc to double - * CHECK-DAG: %build_inttoptr = inttoptr i32 %P1 to i8* - * CHECK-DAG: %build_ptrtoint = ptrtoint i8* %build_inttoptr to i64 - * CHECK-DAG: %build_ptrtoint2 = ptrtoint i8* %build_inttoptr to i64 + * CHECK-DAG: %build_inttoptr = inttoptr i32 %P1 to ptr + * CHECK-DAG: %build_ptrtoint = ptrtoint ptr %build_inttoptr to i64 + * CHECK-DAG: %build_ptrtoint2 = ptrtoint ptr %build_inttoptr to i64 * CHECK-DAG: %build_bitcast = bitcast i64 %build_ptrtoint to double * CHECK-DAG: %build_bitcast2 = bitcast i64 %build_ptrtoint to double * CHECK-DAG: %build_bitcast3 = bitcast i64 %build_ptrtoint to double * CHECK-DAG: %build_bitcast4 = bitcast i64 %build_ptrtoint to double - * CHECK-DAG: %build_pointercast = bitcast i8* %build_inttoptr to i16* *) let inst28 = build_trunc p1 i8_type "build_trunc" atentry in let inst29 = build_zext inst28 i32_type "build_zext" atentry in @@ -1059,7 +1059,7 @@ let test_builder () = * CHECK: %build_fcmp_false = fcmp false float %F1, %F2 * CHECK: %build_fcmp_true = fcmp true float %F2, %F1 * CHECK: %build_is_null{{.*}}= icmp eq{{.*}}%X0,{{.*}}null - * CHECK: %build_is_not_null = icmp ne i8* %X1, null + * CHECK: %build_is_not_null = icmp ne ptr %X1, null * CHECK: %build_ptrdiff *) let c = build_icmp Icmp.Ne p1 p2 "build_icmp_ne" atentry in @@ -1080,17 +1080,17 @@ let test_builder () = let g0 = declare_global (pointer_type i8_type) "g0" m in let g1 = declare_global (pointer_type i8_type) "g1" m in - let p0 = build_load g0 "X0" atentry in - let p1 = build_load g1 "X1" atentry in + let p0 = build_load2 (pointer_type i8_type) g0 "X0" atentry in + let p1 = build_load2 (pointer_type i8_type) g1 "X1" atentry in ignore (build_is_null p0 "build_is_null" atentry); ignore (build_is_not_null p1 "build_is_not_null" atentry); - ignore (build_ptrdiff p1 p0 "build_ptrdiff" atentry); + ignore (build_ptrdiff2 i8_type p1 p0 "build_ptrdiff" atentry); end; group "miscellaneous"; begin (* CHECK: %build_call = tail call cc63 zeroext i32 @{{.*}}(i32 signext %P2, i32 %P1) * CHECK: %build_select = select i1 %build_icmp, i32 %P1, i32 %P2 - * CHECK: %build_va_arg = va_arg i8** null, i32 + * CHECK: %build_va_arg = va_arg ptr null, i32 * CHECK: %build_extractelement = extractelement <4 x i32> %Vec1, i32 %P2 * CHECK: %build_insertelement = insertelement <4 x i32> %Vec1, i32 %P1, i32 %P2 * CHECK: %build_shufflevector = shufflevector <4 x i32> %Vec1, <4 x i32> %Vec2, <4 x i32> @@ -1143,7 +1143,7 @@ let test_builder () = ignore (build_shufflevector vec1 vec2 t3 "build_shufflevector" atentry); let p = build_alloca sty "ba" atentry in - let agg = build_load p "bl" atentry in + let agg = build_load2 sty p "bl" atentry in let agg0 = build_insertvalue agg (const_int i32_type 1) 0 "build_insertvalue0" atentry in let agg1 = build_insertvalue agg0 (const_int i8_type 2) 1 @@ -1218,7 +1218,7 @@ let test_builder () = end; (* CHECK: landingpad * CHECK: cleanup - * CHECK: catch{{.*}}i8**{{.*}}@_ZTIc + * CHECK: catch{{.*}}ptr{{.*}}@_ZTIc * CHECK: filter{{.*}}@_ZTIPKc{{.*}}@_ZTId * CHECK: resume * *) @@ -1268,7 +1268,7 @@ let test_builder () = group "malloc/free"; begin (* CHECK: call{{.*}}@malloc(i32 ptrtoint - * CHECK: call{{.*}}@free(i8* + * CHECK: call{{.*}}@free(ptr * CHECK: call{{.*}}@malloc(i32 % *) let bb1 = append_block context "MallocBlock1" fn in @@ -1280,7 +1280,7 @@ let test_builder () = end; group "indirectbr"; begin - (* CHECK: indirectbr i8* blockaddress(@X7, %IBRBlock2), [label %IBRBlock2, label %IBRBlock3] + (* CHECK: indirectbr ptr blockaddress(@X7, %IBRBlock2), [label %IBRBlock2, label %IBRBlock3] *) let bb1 = append_block context "IBRBlock1" fn in @@ -1302,7 +1302,7 @@ let test_builder () = *) let bb04 = append_block context "Bb04" fn in let b = builder_at_end context bb04 in - ignore (build_invoke fn [| p1; p2 |] bb04 bblpad "build_invoke" b) + ignore (build_invoke2 fty fn [| p1; p2 |] bb04 bblpad "build_invoke" b) end; group "unreachable"; begin @@ -1389,17 +1389,17 @@ let test_builder () = (* CHECK: %build_alloca = alloca i32 * CHECK: %build_array_alloca = alloca i32, i32 %P2 - * CHECK: %build_load = load volatile i32, i32* %build_array_alloca, align 4 - * CHECK: store volatile i32 %P2, i32* %build_alloca, align 4 - * CHECK: %build_gep = getelementptr i32, i32* %build_array_alloca, i32 %P2 - * CHECK: %build_in_bounds_gep = getelementptr inbounds i32, i32* %build_array_alloca, i32 %P2 + * CHECK: %build_load = load volatile i32, ptr %build_array_alloca, align 4 + * CHECK: store volatile i32 %P2, ptr %build_alloca, align 4 + * CHECK: %build_gep = getelementptr i32, ptr %build_array_alloca, i32 %P2 + * CHECK: %build_in_bounds_gep = getelementptr inbounds i32, ptr %build_array_alloca, i32 %P2 * CHECK: %build_struct_gep = getelementptr inbounds{{.*}}%build_alloca2, i32 0, i32 1 - * CHECK: %build_atomicrmw = atomicrmw xchg i8* %p, i8 42 seq_cst + * CHECK: %build_atomicrmw = atomicrmw xchg ptr %p, i8 42 seq_cst *) let alloca = build_alloca i32_type "build_alloca" b in let array_alloca = build_array_alloca i32_type p2 "build_array_alloca" b in - let load = build_load array_alloca "build_load" b in + let load = build_load2 i32_type array_alloca "build_load" b in ignore(set_alignment 4 load); ignore(set_volatile true load); insist(true = is_volatile load); @@ -1410,12 +1410,13 @@ let test_builder () = ignore(set_alignment 4 store); insist(true = is_volatile store); insist(4 = alignment store); - ignore(build_gep array_alloca [| p2 |] "build_gep" b); - ignore(build_in_bounds_gep array_alloca [| p2 |] "build_in_bounds_gep" b); + ignore(build_gep2 i32_type array_alloca [| p2 |] "build_gep" b); + ignore(build_in_bounds_gep2 i32_type array_alloca [| p2 |] + "build_in_bounds_gep" b); let sty = struct_type context [| i32_type; i8_type |] in let alloca2 = build_alloca sty "build_alloca2" b in - ignore(build_struct_gep alloca2 1 "build_struct_gep" b); + ignore(build_struct_gep2 sty alloca2 1 "build_struct_gep" b); let p = build_alloca i8_type "p" b in ignore(build_atomicrmw AtomicRMWBinOp.Xchg p (const_int i8_type 42)