Anastasia created this revision. Anastasia added a reviewer: rjmccall. Herald added a subscriber: ebevhan.
The address space for the Base class pointer when up-casting from Derived should be taken from the Derived class pointer. https://reviews.llvm.org/D58708 Files: lib/CodeGen/CGClass.cpp lib/Sema/SemaExpr.cpp test/CodeGenOpenCLCXX/addrspace-derived-base.cl Index: test/CodeGenOpenCLCXX/addrspace-derived-base.cl =================================================================== --- /dev/null +++ test/CodeGenOpenCLCXX/addrspace-derived-base.cl @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 %s -triple spir -cl-std=c++ -emit-llvm -O0 -o - | FileCheck %s +struct B { + int mb; +}; + +class D : public B { +public: + int getmb() { return mb; } +}; + +void foo() { + D d; + //CHECK: addrspacecast %class.D* %d to %class.D addrspace(4)* + //CHECK: call i32 @_ZNU3AS41D5getmbEv(%class.D addrspace(4)* + d.getmb(); +} + +//Derived and Base are in the same address space. + +//CHECK: define linkonce_odr i32 @_ZNU3AS41D5getmbEv(%class.D addrspace(4)* %this) +//CHECK: bitcast %class.D addrspace(4)* %this1 to %struct.B addrspace(4)* Index: lib/Sema/SemaExpr.cpp =================================================================== --- lib/Sema/SemaExpr.cpp +++ lib/Sema/SemaExpr.cpp @@ -2662,7 +2662,8 @@ DestRecordType = Context.getCanonicalType(Context.getTypeDeclType(RD)); if (FromType->getAs<PointerType>()) { - DestType = Context.getPointerType(DestRecordType); + DestType = Context.getPointerType(Context.getAddrSpaceQualType( + DestRecordType, FromType->getPointeeType().getAddressSpace())); FromRecordType = FromType->getPointeeType(); PointerConversions = true; } else { Index: lib/CodeGen/CGClass.cpp =================================================================== --- lib/CodeGen/CGClass.cpp +++ lib/CodeGen/CGClass.cpp @@ -302,7 +302,8 @@ // Get the base pointer type. llvm::Type *BasePtrTy = - ConvertType((PathEnd[-1])->getType())->getPointerTo(); + ConvertType((PathEnd[-1])->getType()) + ->getPointerTo(Value.getType()->getPointerAddressSpace()); QualType DerivedTy = getContext().getRecordType(Derived); CharUnits DerivedAlign = CGM.getClassPointerAlignment(Derived);
Index: test/CodeGenOpenCLCXX/addrspace-derived-base.cl =================================================================== --- /dev/null +++ test/CodeGenOpenCLCXX/addrspace-derived-base.cl @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 %s -triple spir -cl-std=c++ -emit-llvm -O0 -o - | FileCheck %s +struct B { + int mb; +}; + +class D : public B { +public: + int getmb() { return mb; } +}; + +void foo() { + D d; + //CHECK: addrspacecast %class.D* %d to %class.D addrspace(4)* + //CHECK: call i32 @_ZNU3AS41D5getmbEv(%class.D addrspace(4)* + d.getmb(); +} + +//Derived and Base are in the same address space. + +//CHECK: define linkonce_odr i32 @_ZNU3AS41D5getmbEv(%class.D addrspace(4)* %this) +//CHECK: bitcast %class.D addrspace(4)* %this1 to %struct.B addrspace(4)* Index: lib/Sema/SemaExpr.cpp =================================================================== --- lib/Sema/SemaExpr.cpp +++ lib/Sema/SemaExpr.cpp @@ -2662,7 +2662,8 @@ DestRecordType = Context.getCanonicalType(Context.getTypeDeclType(RD)); if (FromType->getAs<PointerType>()) { - DestType = Context.getPointerType(DestRecordType); + DestType = Context.getPointerType(Context.getAddrSpaceQualType( + DestRecordType, FromType->getPointeeType().getAddressSpace())); FromRecordType = FromType->getPointeeType(); PointerConversions = true; } else { Index: lib/CodeGen/CGClass.cpp =================================================================== --- lib/CodeGen/CGClass.cpp +++ lib/CodeGen/CGClass.cpp @@ -302,7 +302,8 @@ // Get the base pointer type. llvm::Type *BasePtrTy = - ConvertType((PathEnd[-1])->getType())->getPointerTo(); + ConvertType((PathEnd[-1])->getType()) + ->getPointerTo(Value.getType()->getPointerAddressSpace()); QualType DerivedTy = getContext().getRecordType(Derived); CharUnits DerivedAlign = CGM.getClassPointerAlignment(Derived);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits