[ubsan] Reduce alignment checking of C++ object pointers
authorVedant Kumar <vsk@apple.com>
Fri, 14 Apr 2017 22:03:34 +0000 (22:03 +0000)
committerVedant Kumar <vsk@apple.com>
Fri, 14 Apr 2017 22:03:34 +0000 (22:03 +0000)
commitffd7c887d695433980c4ae7d739c72ae860f5682
tree9eb20c597d90c14d013889da809fb3d8353e161b
parent9edaea21afd0eb257a22cc4a32f19a497552e674
[ubsan] Reduce alignment checking of C++ object pointers

This patch teaches ubsan to insert an alignment check for the 'this'
pointer at the start of each method/lambda. This allows clang to emit
significantly fewer alignment checks overall, because if 'this' is
aligned, so are its fields.

This is essentially the same thing r295515 does, but for the alignment
check instead of the null check. One difference is that we keep the
alignment checks on member expressions where the base is a DeclRefExpr.
There's an opportunity to diagnose unaligned accesses in this situation
(as pointed out by Eli, see PR32630).

Testing: check-clang, check-ubsan, and a stage2 ubsan build.

Along with the patch from D30285, this roughly halves the amount of
alignment checks we emit when compiling X86FastISel.cpp. Here are the
numbers from patched/unpatched clangs based on r298160.

  ------------------------------------------
  | Setup          | # of alignment checks |
  ------------------------------------------
  | unpatched, -O0 |                 24326 |
  | patched, -O0   |                 12717 | (-47.7%)
  ------------------------------------------

Differential Revision: https://reviews.llvm.org/D30283

llvm-svn: 300370
clang/lib/CodeGen/CGExpr.cpp
clang/lib/CodeGen/CGExprCXX.cpp
clang/lib/CodeGen/CodeGenFunction.cpp
clang/lib/CodeGen/CodeGenFunction.h
clang/test/CodeGenCXX/ubsan-global-alignment.cpp [new file with mode: 0644]
clang/test/CodeGenCXX/ubsan-suppress-checks.cpp [new file with mode: 0644]
clang/test/CodeGenCXX/ubsan-suppress-null-checks.cpp [deleted file]
clang/test/CodeGenCXX/ubsan-type-checks.cpp