[PATCH] D58708: [PR40778] Preserve addr space in Derived to Base cast
Anastasia Stulova via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 27 03:32:01 PST 2019
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);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D58708.188510.patch
Type: text/x-patch
Size: 1906 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190227/a13b169f/attachment.bin>
More information about the cfe-commits
mailing list