diff options
author | Piotr Padlewski <prazek@google.com> | 2015-09-15 21:46:47 +0000 |
---|---|---|
committer | Piotr Padlewski <prazek@google.com> | 2015-09-15 21:46:47 +0000 |
commit | 338c9d0ade222e60bca1ad9f76fb837d071bd41f (patch) | |
tree | 3c3025c0946cc52e9c394794dd13d3814f98e680 /clang/lib/CodeGen/CGExprCXX.cpp | |
parent | 68615ce60647672e2c23013abc9d17112b1eb8d3 (diff) | |
download | bcm5719-llvm-338c9d0ade222e60bca1ad9f76fb837d071bd41f.tar.gz bcm5719-llvm-338c9d0ade222e60bca1ad9f76fb837d071bd41f.zip |
Emiting llvm.invariant.group.barrier when dynamic type changes
For more goto:
http://lists.llvm.org/pipermail/cfe-dev/2015-July/044227.html
http://reviews.llvm.org/D12312
llvm-svn: 247723
Diffstat (limited to 'clang/lib/CodeGen/CGExprCXX.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExprCXX.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGExprCXX.cpp b/clang/lib/CodeGen/CGExprCXX.cpp index 8b060ce2874..1952282a07e 100644 --- a/clang/lib/CodeGen/CGExprCXX.cpp +++ b/clang/lib/CodeGen/CGExprCXX.cpp @@ -1381,6 +1381,14 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) { llvm::Type *elementTy = ConvertTypeForMem(allocType); Address result = Builder.CreateElementBitCast(allocation, elementTy); + // Passing pointer through invariant.group.barrier to avoid propagation of + // vptrs information which may be included in previous type. + if (CGM.getCodeGenOpts().StrictVTablePointers && + CGM.getCodeGenOpts().OptimizationLevel > 0 && + allocator->isReservedGlobalPlacementOperator()) + result = Address(Builder.CreateInvariantGroupBarrier(result.getPointer()), + result.getAlignment()); + EmitNewInitializer(*this, E, allocType, elementTy, result, numElements, allocSizeWithoutCookie); if (E->isArray()) { |