forked from OSchip/llvm-project
[OpenCL] Preserve addrspace in CGClass (PR43145)
PR43145 revealed two places where Clang was attempting to create a bitcast without considering the address space of class types during C++ class code generation. Differential Revision: https://reviews.llvm.org/D68403 llvm-svn: 375118
This commit is contained in:
parent
c8e3f43ab5
commit
af6248cbb9
|
@ -246,7 +246,8 @@ ApplyNonVirtualAndVirtualOffset(CodeGenFunction &CGF, Address addr,
|
|||
|
||||
// Apply the base offset.
|
||||
llvm::Value *ptr = addr.getPointer();
|
||||
ptr = CGF.Builder.CreateBitCast(ptr, CGF.Int8PtrTy);
|
||||
unsigned AddrSpace = ptr->getType()->getPointerAddressSpace();
|
||||
ptr = CGF.Builder.CreateBitCast(ptr, CGF.Int8Ty->getPointerTo(AddrSpace));
|
||||
ptr = CGF.Builder.CreateInBoundsGEP(ptr, baseOffset, "add.ptr");
|
||||
|
||||
// If we have a virtual component, the alignment of the result will
|
||||
|
@ -381,7 +382,9 @@ CodeGenFunction::GetAddressOfDerivedClass(Address BaseAddr,
|
|||
|
||||
QualType DerivedTy =
|
||||
getContext().getCanonicalType(getContext().getTagDeclType(Derived));
|
||||
llvm::Type *DerivedPtrTy = ConvertType(DerivedTy)->getPointerTo();
|
||||
unsigned AddrSpace =
|
||||
BaseAddr.getPointer()->getType()->getPointerAddressSpace();
|
||||
llvm::Type *DerivedPtrTy = ConvertType(DerivedTy)->getPointerTo(AddrSpace);
|
||||
|
||||
llvm::Value *NonVirtualOffset =
|
||||
CGM.GetNonVirtualBaseClassOffset(Derived, PathBegin, PathEnd);
|
||||
|
|
|
@ -11,6 +11,7 @@ public:
|
|||
|
||||
void foo() {
|
||||
D d;
|
||||
//CHECK-LABEL: foo
|
||||
//CHECK: addrspacecast %class.D* %d to %class.D addrspace(4)*
|
||||
//CHECK: call spir_func i32 @_ZNU3AS41D5getmbEv(%class.D addrspace(4)*
|
||||
d.getmb();
|
||||
|
@ -20,3 +21,32 @@ void foo() {
|
|||
|
||||
//CHECK: define linkonce_odr spir_func i32 @_ZNU3AS41D5getmbEv(%class.D addrspace(4)* %this)
|
||||
//CHECK: bitcast %class.D addrspace(4)* %this1 to %struct.B addrspace(4)*
|
||||
|
||||
|
||||
// Calling base method through multiple inheritance.
|
||||
|
||||
class B2 {
|
||||
public:
|
||||
void baseMethod() const { }
|
||||
int bb;
|
||||
};
|
||||
|
||||
class Derived : public B, public B2 {
|
||||
public:
|
||||
void work() const { baseMethod(); }
|
||||
// CHECK-LABEL: work
|
||||
// CHECK: bitcast i8 addrspace(4)* %add.ptr to %class.B2 addrspace(4)*
|
||||
};
|
||||
|
||||
void pr43145(const Derived *argDerived) {
|
||||
argDerived->work();
|
||||
}
|
||||
|
||||
// Casting from base to derived.
|
||||
|
||||
void pr43145_2(B *argB) {
|
||||
Derived *x = (Derived*)argB;
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @_Z9pr43145_2
|
||||
// CHECK: bitcast %struct.B addrspace(4)* %0 to %class.Derived addrspace(4)*
|
||||
|
|
Loading…
Reference in New Issue