Author: Yaxun (Sam) Liu Date: 2021-09-16T10:57:31-04:00 New Revision: abe8b354e37d8d6a163a6402d8e68ddcfc462dfc
URL: https://github.com/llvm/llvm-project/commit/abe8b354e37d8d6a163a6402d8e68ddcfc462dfc DIFF: https://github.com/llvm/llvm-project/commit/abe8b354e37d8d6a163a6402d8e68ddcfc462dfc.diff LOG: Fix vtbl field addr space Storing the vtable field of an object should use the same address space as the this pointer. Currently it is assumed to be addr space 0 but this may not be true. This assumption (added in 054cc3b1b469de4b0cb25d1dc3af43c679c5dc44) caused issues for the out-of-tree CHERI targets. Reviewed by: John McCall, Alexander Richardson Differential Revision: https://reviews.llvm.org/D109841 Added: Modified: clang/lib/CodeGen/CGClass.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp index 9895a23b7093..828dd7147da5 100644 --- a/clang/lib/CodeGen/CGClass.cpp +++ b/clang/lib/CodeGen/CGClass.cpp @@ -2502,6 +2502,8 @@ void CodeGenFunction::InitializeVTablePointer(const VPtr &Vptr) { // Apply the offsets. Address VTableField = LoadCXXThisAddress(); + unsigned ThisAddrSpace = + VTableField.getPointer()->getType()->getPointerAddressSpace(); if (!NonVirtualOffset.isZero() || VirtualOffset) VTableField = ApplyNonVirtualAndVirtualOffset( @@ -2516,12 +2518,11 @@ void CodeGenFunction::InitializeVTablePointer(const VPtr &Vptr) { llvm::FunctionType::get(CGM.Int32Ty, /*isVarArg=*/true) ->getPointerTo(ProgAS) ->getPointerTo(GlobalsAS); - // vtable field is is derived from `this` pointer, therefore it should be in - // default address space. - VTableField = Builder.CreatePointerBitCastOrAddrSpaceCast( - VTableField, VTablePtrTy->getPointerTo()); - VTableAddressPoint = Builder.CreatePointerBitCastOrAddrSpaceCast( - VTableAddressPoint, VTablePtrTy); + // vtable field is is derived from `this` pointer, therefore they should be in + // the same addr space. Note that this might not be LLVM address space 0. + VTableField = Builder.CreateBitCast(VTableField, + VTablePtrTy->getPointerTo(ThisAddrSpace)); + VTableAddressPoint = Builder.CreateBitCast(VTableAddressPoint, VTablePtrTy); llvm::StoreInst *Store = Builder.CreateStore(VTableAddressPoint, VTableField); TBAAAccessInfo TBAAInfo = CGM.getTBAAVTablePtrAccessInfo(VTablePtrTy); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits