Skip to content

Commit

Permalink
[PR40778] Preserve addr space in Derived to Base cast.
Browse files Browse the repository at this point in the history
The address space for the Base class pointer when up-casting
from Derived should be taken from the Derived class pointer.

Differential Revision: https://reviews.llvm.org/D53818

llvm-svn: 355606
  • Loading branch information
Anastasia Stulova committed Mar 7, 2019
1 parent eb39991 commit 9404955
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 3 deletions.
3 changes: 2 additions & 1 deletion clang/lib/CodeGen/CGClass.cpp
Expand Up @@ -302,7 +302,8 @@ Address CodeGenFunction::GetAddressOfBaseClass(

// 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);
Expand Down
9 changes: 7 additions & 2 deletions clang/lib/Sema/SemaExpr.cpp
Expand Up @@ -2660,10 +2660,15 @@ Sema::PerformObjectMemberConversion(Expr *From,
bool PointerConversions = false;
if (isa<FieldDecl>(Member)) {
DestRecordType = Context.getCanonicalType(Context.getTypeDeclType(RD));
auto FromPtrType = FromType->getAs<PointerType>();
DestRecordType = Context.getAddrSpaceQualType(
DestRecordType, FromPtrType
? FromType->getPointeeType().getAddressSpace()
: FromType.getAddressSpace());

if (FromType->getAs<PointerType>()) {
if (FromPtrType) {
DestType = Context.getPointerType(DestRecordType);
FromRecordType = FromType->getPointeeType();
FromRecordType = FromPtrType->getPointeeType();
PointerConversions = true;
} else {
DestType = DestRecordType;
Expand Down
22 changes: 22 additions & 0 deletions clang/test/CodeGenOpenCLCXX/addrspace-derived-base.cl
@@ -0,0 +1,22 @@
// 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)*

0 comments on commit 9404955

Please sign in to comment.