// Handle pointer conversions next: pointers can only be converted to/from
// other pointers and integers. Check for pointer types in terms of LLVM, as
// some native types (like Obj-C id) may map to a pointer type.
- if (auto DstPT = dyn_cast<llvm::PointerType>(DstTy)) {
+ if (isa<llvm::PointerType>(DstTy)) {
// The source value may be an integer, or a pointer.
if (isa<llvm::PointerType>(SrcTy))
return Builder.CreateBitCast(Src, DstTy, "conv");
assert(SrcType->isIntegerType() && "Not ptr->ptr or int->ptr conversion?");
// First, convert to the correct width so that we control the kind of
// extension.
- llvm::Type *MiddleTy = CGF.CGM.getDataLayout().getIntPtrType(DstPT);
+ llvm::Type *MiddleTy = CGF.IntPtrTy;
bool InputSigned = SrcType->isSignedIntegerOrEnumerationType();
llvm::Value* IntResult =
Builder.CreateIntCast(Src, MiddleTy, InputSigned, "conv");
// First, convert to the correct width so that we control the kind of
// extension.
- auto DestLLVMTy = ConvertType(DestTy);
- llvm::Type *MiddleTy = CGF.CGM.getDataLayout().getIntPtrType(DestLLVMTy);
+ llvm::Type *MiddleTy = CGF.IntPtrTy;
bool InputSigned = E->getType()->isSignedIntegerOrEnumerationType();
llvm::Value* IntResult =
Builder.CreateIntCast(Src, MiddleTy, InputSigned, "conv");
- return Builder.CreateIntToPtr(IntResult, DestLLVMTy);
+ return Builder.CreateIntToPtr(IntResult, ConvertType(DestTy));
}
case CK_PointerToIntegral:
assert(!DestTy->isBooleanType() && "bool should use PointerToBool");
Value *pointer = op.LHS;
Expr *pointerOperand = expr->getLHS();
- auto PtrTy = cast<llvm::PointerType>(pointer->getType());
Value *index = op.RHS;
Expr *indexOperand = expr->getRHS();
}
unsigned width = cast<llvm::IntegerType>(index->getType())->getBitWidth();
- auto &DL = CGF.CGM.getDataLayout();
- if (width != DL.getTypeSizeInBits(PtrTy)) {
+ if (width != CGF.PointerWidthInBits) {
// Zero-extend or sign-extend the pointer value according to
// whether the index is signed or not.
bool isSigned = indexOperand->getType()->isSignedIntegerOrEnumerationType();
- index = CGF.Builder.CreateIntCast(index, DL.getIntPtrType(PtrTy), isSigned,
+ index = CGF.Builder.CreateIntCast(index, CGF.PtrDiffTy, isSigned,
"idx.ext");
}
+++ /dev/null
-// RUN: %clang_cc1 %s -cl-std=CL2.0 -finclude-default-header -emit-llvm -O0 -triple spir-unknown-unknown -o - | FileCheck --check-prefix=SZ32 %s
-// RUN: %clang_cc1 %s -cl-std=CL2.0 -finclude-default-header -emit-llvm -O0 -triple spir64-unknown-unknown -o - | FileCheck --check-prefix=SZ64 --check-prefix=SZ64ONLY %s
-// RUN: %clang_cc1 %s -cl-std=CL2.0 -finclude-default-header -emit-llvm -O0 -triple amdgcn-- -o - | FileCheck --check-prefix=SZ64 --check-prefix=AMDONLY %s
-
-//SZ32: define{{.*}} i32 @test_ptrtoint_private(i8* %x)
-//SZ32: ptrtoint i8* %{{.*}} to i32
-//SZ64: define{{.*}} i64 @test_ptrtoint_private(i8* %x)
-//SZ64: ptrtoint i8* %{{.*}} to i64
-size_t test_ptrtoint_private(private char* x) {
- return (size_t)x;
-}
-
-//SZ32: define{{.*}} i32 @test_ptrtoint_global(i8 addrspace(1)* %x)
-//SZ32: ptrtoint i8 addrspace(1)* %{{.*}} to i32
-//SZ64: define{{.*}} i64 @test_ptrtoint_global(i8 addrspace(1)* %x)
-//SZ64: ptrtoint i8 addrspace(1)* %{{.*}} to i64
-intptr_t test_ptrtoint_global(global char* x) {
- return (intptr_t)x;
-}
-
-//SZ32: define{{.*}} i32 @test_ptrtoint_constant(i8 addrspace(2)* %x)
-//SZ32: ptrtoint i8 addrspace(2)* %{{.*}} to i32
-//SZ64: define{{.*}} i64 @test_ptrtoint_constant(i8 addrspace(2)* %x)
-//SZ64: ptrtoint i8 addrspace(2)* %{{.*}} to i64
-uintptr_t test_ptrtoint_constant(constant char* x) {
- return (uintptr_t)x;
-}
-
-//SZ32: define{{.*}} i32 @test_ptrtoint_local(i8 addrspace(3)* %x)
-//SZ32: ptrtoint i8 addrspace(3)* %{{.*}} to i32
-//SZ64: define{{.*}} i64 @test_ptrtoint_local(i8 addrspace(3)* %x)
-//SZ64: ptrtoint i8 addrspace(3)* %{{.*}} to i64
-size_t test_ptrtoint_local(local char* x) {
- return (size_t)x;
-}
-
-//SZ32: define{{.*}} i32 @test_ptrtoint_generic(i8 addrspace(4)* %x)
-//SZ32: ptrtoint i8 addrspace(4)* %{{.*}} to i32
-//SZ64: define{{.*}} i64 @test_ptrtoint_generic(i8 addrspace(4)* %x)
-//SZ64: ptrtoint i8 addrspace(4)* %{{.*}} to i64
-size_t test_ptrtoint_generic(generic char* x) {
- return (size_t)x;
-}
-
-//SZ32: define{{.*}} i8* @test_inttoptr_private(i32 %x)
-//SZ32: inttoptr i32 %{{.*}} to i8*
-//SZ64: define{{.*}} i8* @test_inttoptr_private(i64 %x)
-//AMDONLY: trunc i64 %{{.*}} to i32
-//AMDONLY: inttoptr i32 %{{.*}} to i8*
-//SZ64ONLY: inttoptr i64 %{{.*}} to i8*
-private char* test_inttoptr_private(size_t x) {
- return (private char*)x;
-}
-
-//SZ32: define{{.*}} i8 addrspace(1)* @test_inttoptr_global(i32 %x)
-//SZ32: inttoptr i32 %{{.*}} to i8 addrspace(1)*
-//SZ64: define{{.*}} i8 addrspace(1)* @test_inttoptr_global(i64 %x)
-//SZ64: inttoptr i64 %{{.*}} to i8 addrspace(1)*
-global char* test_inttoptr_global(size_t x) {
- return (global char*)x;
-}
-
-//SZ32: define{{.*}} i8 addrspace(3)* @test_add_local(i8 addrspace(3)* %x, i32 %y)
-//SZ32: getelementptr inbounds i8, i8 addrspace(3)* %{{.*}}, i32
-//SZ64: define{{.*}} i8 addrspace(3)* @test_add_local(i8 addrspace(3)* %x, i64 %y)
-//AMDONLY: trunc i64 %{{.*}} to i32
-//AMDONLY: getelementptr inbounds i8, i8 addrspace(3)* %{{.*}}, i32
-//SZ64ONLY: getelementptr inbounds i8, i8 addrspace(3)* %{{.*}}, i64
-local char* test_add_local(local char* x, ptrdiff_t y) {
- return x + y;
-}
-
-//SZ32: define{{.*}} i8 addrspace(1)* @test_add_global(i8 addrspace(1)* %x, i32 %y)
-//SZ32: getelementptr inbounds i8, i8 addrspace(1)* %{{.*}}, i32
-//SZ64: define{{.*}} i8 addrspace(1)* @test_add_global(i8 addrspace(1)* %x, i64 %y)
-//SZ64: getelementptr inbounds i8, i8 addrspace(1)* %{{.*}}, i64
-global char* test_add_global(global char* x, ptrdiff_t y) {
- return x + y;
-}
-
-//SZ32: define{{.*}} i32 @test_sub_local(i8 addrspace(3)* %x, i8 addrspace(3)* %y)
-//SZ32: ptrtoint i8 addrspace(3)* %{{.*}} to i32
-//SZ32: ptrtoint i8 addrspace(3)* %{{.*}} to i32
-//SZ64: define{{.*}} i64 @test_sub_local(i8 addrspace(3)* %x, i8 addrspace(3)* %y)
-//SZ64: ptrtoint i8 addrspace(3)* %{{.*}} to i64
-//SZ64: ptrtoint i8 addrspace(3)* %{{.*}} to i64
-ptrdiff_t test_sub_local(local char* x, local char *y) {
- return x - y;
-}
-
-//SZ32: define{{.*}} i32 @test_sub_private(i8* %x, i8* %y)
-//SZ32: ptrtoint i8* %{{.*}} to i32
-//SZ32: ptrtoint i8* %{{.*}} to i32
-//SZ64: define{{.*}} i64 @test_sub_private(i8* %x, i8* %y)
-//SZ64: ptrtoint i8* %{{.*}} to i64
-//SZ64: ptrtoint i8* %{{.*}} to i64
-ptrdiff_t test_sub_private(private char* x, private char *y) {
- return x - y;
-}
-
-//SZ32: define{{.*}} i32 @test_sub_mix(i8* %x, i8 addrspace(4)* %y)
-//SZ32: ptrtoint i8* %{{.*}} to i32
-//SZ32: ptrtoint i8 addrspace(4)* %{{.*}} to i32
-//SZ64: define{{.*}} i64 @test_sub_mix(i8* %x, i8 addrspace(4)* %y)
-//SZ64: ptrtoint i8* %{{.*}} to i64
-//SZ64: ptrtoint i8 addrspace(4)* %{{.*}} to i64
-ptrdiff_t test_sub_mix(private char* x, generic char *y) {
- return x - y;
-}
-