diff options
author | Vedant Kumar <vsk@apple.com> | 2017-02-17 01:42:36 +0000 |
---|---|---|
committer | Vedant Kumar <vsk@apple.com> | 2017-02-17 01:42:36 +0000 |
commit | 4f94a94bea308938a0ef2cc591b158f787ebd5d3 (patch) | |
tree | 300e50b21d6f4e28dda36f9299b1d22612685ac0 /clang/lib | |
parent | 95ed51dcfe578047734aa91476132d09c3683f9a (diff) | |
download | bcm5719-llvm-4f94a94bea308938a0ef2cc591b158f787ebd5d3.tar.gz bcm5719-llvm-4f94a94bea308938a0ef2cc591b158f787ebd5d3.zip |
Revert "[ubsan] Reduce null checking of C++ object pointers (PR27581)"
This reverts commit r295391. It breaks this bot:
http://lab.llvm.org:8011/builders/clang-with-thin-lto-ubuntu/builds/1898
I need to not rely on labels in the IR test.
llvm-svn: 295396
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 38 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGExprCXX.cpp | 13 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 5 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.h | 3 |
4 files changed, 7 insertions, 52 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index c0a7f5d1ad6..e5e34a5f3ed 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -947,45 +947,15 @@ LValue CodeGenFunction::EmitUnsupportedLValue(const Expr *E, E->getType()); } -bool CodeGenFunction::CanElideObjectPointerNullCheck(const Expr *Obj) { - if (isa<DeclRefExpr>(Obj)) - return true; - - const Expr *Base = Obj; - while (!isa<CXXThisExpr>(Base)) { - // The result of a dynamic_cast can be null. - if (isa<CXXDynamicCastExpr>(Base)) - return false; - - if (const auto *CE = dyn_cast<CastExpr>(Base)) { - Base = CE->getSubExpr(); - } else if (const auto *PE = dyn_cast<ParenExpr>(Base)) { - Base = PE->getSubExpr(); - } else if (const auto *UO = dyn_cast<UnaryOperator>(Base)) { - if (UO->getOpcode() == UO_Extension) - Base = UO->getSubExpr(); - else - return false; - } else { - return false; - } - } - return true; -} - LValue CodeGenFunction::EmitCheckedLValue(const Expr *E, TypeCheckKind TCK) { LValue LV; if (SanOpts.has(SanitizerKind::ArrayBounds) && isa<ArraySubscriptExpr>(E)) LV = EmitArraySubscriptExpr(cast<ArraySubscriptExpr>(E), /*Accessed*/true); else LV = EmitLValue(E); - if (!isa<DeclRefExpr>(E) && !LV.isBitField() && LV.isSimple()) { - bool SkipNullCheck = false; - if (const auto *ME = dyn_cast<MemberExpr>(E)) - SkipNullCheck = CanElideObjectPointerNullCheck(ME->getBase()); + if (!isa<DeclRefExpr>(E) && !LV.isBitField() && LV.isSimple()) EmitTypeCheck(TCK, E->getExprLoc(), LV.getPointer(), - E->getType(), LV.getAlignment(), SkipNullCheck); - } + E->getType(), LV.getAlignment()); return LV; } @@ -3365,9 +3335,7 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) { AlignmentSource AlignSource; Address Addr = EmitPointerWithAlignment(BaseExpr, &AlignSource); QualType PtrTy = BaseExpr->getType()->getPointeeType(); - bool SkipNullCheck = CanElideObjectPointerNullCheck(BaseExpr); - EmitTypeCheck(TCK_MemberAccess, E->getExprLoc(), Addr.getPointer(), PtrTy, - /*Alignment=*/CharUnits::Zero(), SkipNullCheck); + EmitTypeCheck(TCK_MemberAccess, E->getExprLoc(), Addr.getPointer(), PtrTy); BaseLV = MakeAddrLValue(Addr, PtrTy, AlignSource); } else BaseLV = EmitCheckedLValue(BaseExpr, TCK_MemberAccess); diff --git a/clang/lib/CodeGen/CGExprCXX.cpp b/clang/lib/CodeGen/CGExprCXX.cpp index 1c6a577a95a..ebe0841b3c2 100644 --- a/clang/lib/CodeGen/CGExprCXX.cpp +++ b/clang/lib/CodeGen/CGExprCXX.cpp @@ -290,15 +290,10 @@ RValue CodeGenFunction::EmitCXXMemberOrOperatorMemberCallExpr( if (CE) CallLoc = CE->getExprLoc(); - bool SkipNullCheck = false; - if (const auto *CMCE = dyn_cast<CXXMemberCallExpr>(CE)) - SkipNullCheck = - CanElideObjectPointerNullCheck(CMCE->getImplicitObjectArgument()); - EmitTypeCheck( - isa<CXXConstructorDecl>(CalleeDecl) ? CodeGenFunction::TCK_ConstructorCall - : CodeGenFunction::TCK_MemberCall, - CallLoc, This.getPointer(), C.getRecordType(CalleeDecl->getParent()), - /*Alignment=*/CharUnits::Zero(), SkipNullCheck); + EmitTypeCheck(isa<CXXConstructorDecl>(CalleeDecl) + ? CodeGenFunction::TCK_ConstructorCall + : CodeGenFunction::TCK_MemberCall, + CallLoc, This.getPointer(), C.getRecordType(CalleeDecl->getParent())); // FIXME: Uses of 'MD' past this point need to be audited. We may need to use // 'CalleeDecl' instead. diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index ddcdc030d94..00d5b5fe688 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -948,11 +948,6 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, // fast register allocator would be happier... CXXThisValue = CXXABIThisValue; } - - // Sanitize the 'this' pointer once per function, if it's available. - if (CXXThisValue) - EmitTypeCheck(TCK_MemberAccess, Loc, CXXThisValue, - MD->getThisType(getContext())); } // If any of the arguments have a variably modified type, make sure to diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 406e3db7969..b830df73ca7 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -2030,9 +2030,6 @@ public: llvm::BlockAddress *GetAddrOfLabel(const LabelDecl *L); llvm::BasicBlock *GetIndirectGotoBlock(); - /// Check if the null check for \p ObjectPointer can be skipped. - static bool CanElideObjectPointerNullCheck(const Expr *ObjectPointer); - /// EmitNullInitialization - Generate code to set a value of the given type to /// null, If the type contains data member pointers, they will be initialized /// to -1 in accordance with the Itanium C++ ABI. |