diff options
author | Vedant Kumar <vsk@apple.com> | 2017-02-17 23:22:59 +0000 |
---|---|---|
committer | Vedant Kumar <vsk@apple.com> | 2017-02-17 23:22:59 +0000 |
commit | 34b1fd6aaaf7e31ddcf65437ba8e274fe79bb7d2 (patch) | |
tree | 2faba601747f6814bed2cf9e4d8c23265000bacc /clang/lib/CodeGen/CodeGenFunction.h | |
parent | 18348ea9b9d991ce70664187576a13f773496144 (diff) | |
download | bcm5719-llvm-34b1fd6aaaf7e31ddcf65437ba8e274fe79bb7d2.tar.gz bcm5719-llvm-34b1fd6aaaf7e31ddcf65437ba8e274fe79bb7d2.zip |
Retry^2: [ubsan] Reduce null checking of C++ object pointers (PR27581)
This patch teaches ubsan to insert exactly one null check for the 'this'
pointer per method/lambda.
Previously, given a load of a member variable from an instance method
('this->x'), ubsan would insert a null check for 'this', and another
null check for '&this->x', before allowing the load to occur.
Similarly, given a call to a method from another method bound to the
same instance ('this->foo()'), ubsan would a redundant null check for
'this'. There is also a redundant null check in the case where the
object pointer is a reference ('Ref.foo()').
This patch teaches ubsan to remove the redundant null checks identified
above.
Testing: check-clang, check-ubsan, and a stage2 ubsan build.
I also compiled X86FastISel.cpp with -fsanitize=null using
patched/unpatched clangs based on r293572. Here are the number of null
checks emitted:
-------------------------------------
| Setup | # of null checks |
-------------------------------------
| unpatched, -O0 | 21767 |
| patched, -O0 | 10758 |
-------------------------------------
Changes since the initial commit:
- Don't introduce any unintentional object-size or alignment checks.
- Don't rely on IRGen of C labels in the test.
Differential Revision: https://reviews.llvm.org/D29530
llvm-svn: 295515
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.h')
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 09f17638509..80a9a0e5b11 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -2030,6 +2030,9 @@ 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. |