summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGExprCXX.cpp
diff options
context:
space:
mode:
authorPiotr Padlewski <prazek@google.com>2015-09-15 21:46:47 +0000
committerPiotr Padlewski <prazek@google.com>2015-09-15 21:46:47 +0000
commit338c9d0ade222e60bca1ad9f76fb837d071bd41f (patch)
tree3c3025c0946cc52e9c394794dd13d3814f98e680 /clang/lib/CodeGen/CGExprCXX.cpp
parent68615ce60647672e2c23013abc9d17112b1eb8d3 (diff)
downloadbcm5719-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.cpp8
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()) {
OpenPOWER on IntegriCloud