diff options
author | Yaxun Liu <Yaxun.Liu@amd.com> | 2018-05-17 11:16:35 +0000 |
---|---|---|
committer | Yaxun Liu <Yaxun.Liu@amd.com> | 2018-05-17 11:16:35 +0000 |
commit | a2a9cfab83a9252b3fbdb0b487fd5acb6e32b323 (patch) | |
tree | 30e72c76769d7131b0a4ed072e57a6552433910e /clang/lib/CodeGen/CGExpr.cpp | |
parent | 0e69e2d74739a119a78d131c29b92c25787ec2f3 (diff) | |
download | bcm5719-llvm-a2a9cfab83a9252b3fbdb0b487fd5acb6e32b323.tar.gz bcm5719-llvm-a2a9cfab83a9252b3fbdb0b487fd5acb6e32b323.zip |
CodeGen: Fix invalid bitcast for lifetime.start/end
lifetime.start/end expects pointer argument in alloca address space.
However in C++ a temporary variable is in default address space.
This patch changes API CreateMemTemp and CreateTempAlloca to
get the original alloca instruction and pass it lifetime.start/end.
It only affects targets with non-zero alloca address space.
Differential Revision: https://reviews.llvm.org/D45900
llvm-svn: 332593
Diffstat (limited to 'clang/lib/CodeGen/CGExpr.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 194eb412382..6e10a9dcf17 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -64,9 +64,12 @@ llvm::Value *CodeGenFunction::EmitCastToVoidPtr(llvm::Value *value) { Address CodeGenFunction::CreateTempAlloca(llvm::Type *Ty, CharUnits Align, const Twine &Name, llvm::Value *ArraySize, + Address *AllocaAddr, bool CastToDefaultAddrSpace) { auto Alloca = CreateTempAlloca(Ty, Name, ArraySize); Alloca->setAlignment(Align.getQuantity()); + if (AllocaAddr) + *AllocaAddr = Address(Alloca, Align); llvm::Value *V = Alloca; // Alloca always returns a pointer in alloca address space, which may // be different from the type defined by the language. For example, @@ -125,16 +128,18 @@ Address CodeGenFunction::CreateIRTemp(QualType Ty, const Twine &Name) { } Address CodeGenFunction::CreateMemTemp(QualType Ty, const Twine &Name, + Address *Alloca, bool CastToDefaultAddrSpace) { // FIXME: Should we prefer the preferred type alignment here? - return CreateMemTemp(Ty, getContext().getTypeAlignInChars(Ty), Name, + return CreateMemTemp(Ty, getContext().getTypeAlignInChars(Ty), Name, Alloca, CastToDefaultAddrSpace); } Address CodeGenFunction::CreateMemTemp(QualType Ty, CharUnits Align, - const Twine &Name, + const Twine &Name, Address *Alloca, bool CastToDefaultAddrSpace) { - return CreateTempAlloca(ConvertTypeForMem(Ty), Align, Name, nullptr, + return CreateTempAlloca(ConvertTypeForMem(Ty), Align, Name, + /*ArraySize=*/nullptr, Alloca, CastToDefaultAddrSpace); } @@ -348,7 +353,8 @@ pushTemporaryCleanup(CodeGenFunction &CGF, const MaterializeTemporaryExpr *M, static Address createReferenceTemporary(CodeGenFunction &CGF, const MaterializeTemporaryExpr *M, - const Expr *Inner) { + const Expr *Inner, + Address *Alloca = nullptr) { auto &TCG = CGF.getTargetHooks(); switch (M->getStorageDuration()) { case SD_FullExpression: @@ -381,7 +387,7 @@ static Address createReferenceTemporary(CodeGenFunction &CGF, return Address(C, alignment); } } - return CGF.CreateMemTemp(Ty, "ref.tmp"); + return CGF.CreateMemTemp(Ty, "ref.tmp", Alloca); } case SD_Thread: case SD_Static: @@ -458,7 +464,8 @@ EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *M) { } // Create and initialize the reference temporary. - Address Object = createReferenceTemporary(*this, M, E); + Address Alloca = Address::invalid(); + Address Object = createReferenceTemporary(*this, M, E, &Alloca); if (auto *Var = dyn_cast<llvm::GlobalVariable>( Object.getPointer()->stripPointerCasts())) { Object = Address(llvm::ConstantExpr::getBitCast( @@ -477,13 +484,13 @@ EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *M) { case SD_Automatic: case SD_FullExpression: if (auto *Size = EmitLifetimeStart( - CGM.getDataLayout().getTypeAllocSize(Object.getElementType()), - Object.getPointer())) { + CGM.getDataLayout().getTypeAllocSize(Alloca.getElementType()), + Alloca.getPointer())) { if (M->getStorageDuration() == SD_Automatic) pushCleanupAfterFullExpr<CallLifetimeEnd>(NormalEHLifetimeMarker, - Object, Size); + Alloca, Size); else - pushFullExprCleanup<CallLifetimeEnd>(NormalEHLifetimeMarker, Object, + pushFullExprCleanup<CallLifetimeEnd>(NormalEHLifetimeMarker, Alloca, Size); } break; |