]> granicus.if.org Git - clang/commitdiff
[ubsan] Don't check alignment if the alignment is 1
authorVedant Kumar <vsk@apple.com>
Fri, 14 Apr 2017 22:03:37 +0000 (22:03 +0000)
committerVedant Kumar <vsk@apple.com>
Fri, 14 Apr 2017 22:03:37 +0000 (22:03 +0000)
If a pointer is 1-byte aligned, there's no use in checking its
alignment. Somewhat surprisingly, ubsan can spend a significant amount
of time doing just that!

This loosely depends on D30283.

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

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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@300371 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExpr.cpp
test/CodeGenCXX/ubsan-suppress-checks.cpp
test/CodeGenCXX/ubsan-type-checks.cpp

index 428c8ffd2a139699c2a67d7eb6322b4b04c5971f..265ef27a46b0f4457ee3813688b75f0a5d710253 100644 (file)
@@ -599,7 +599,7 @@ void CodeGenFunction::EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc,
       AlignVal = getContext().getTypeAlignInChars(Ty).getQuantity();
 
     // The glvalue must be suitably aligned.
-    if (AlignVal) {
+    if (AlignVal > 1) {
       llvm::Value *Align =
           Builder.CreateAnd(Builder.CreatePtrToInt(Ptr, IntPtrTy),
                             llvm::ConstantInt::get(IntPtrTy, AlignVal - 1));
index 6ad417e211d62c2b50572af981895119cd35e2df..8ec94556c1365b87d916943687ad00c5fa60aaa3 100644 (file)
@@ -133,7 +133,7 @@ struct B {
     // CHECK: call void @__ubsan_handle_type_mismatch
     //
     // Check the result of the conversion before using it.
-    // CHECK: call void @__ubsan_handle_type_mismatch
+    // NULL: call void @__ubsan_handle_type_mismatch
     //
     // CHECK-NOT: call void @__ubsan_handle_type_mismatch
     B b;
index 150b2fc40c251202e4d0df8f6ddf87a172e1c87c..786d049dfb56a3102a88c6542db903295eddc1ad 100644 (file)
@@ -5,8 +5,7 @@
 struct A {
   // COMMON-LABEL: define linkonce_odr void @_ZN1A10do_nothingEv
   void do_nothing() {
-    // ALIGN: ptrtoint %struct.A* %{{.*}} to i64, !nosanitize
-    // ALIGN: and i64 %{{.*}}, 0, !nosanitize
+    // ALIGN-NOT: ptrtoint %struct.A* %{{.*}} to i64, !nosanitize
  
     // NULL: icmp ne %struct.A* %{{.*}}, null, !nosanitize
  
@@ -14,7 +13,24 @@ struct A {
   }
 };
 
+struct B {
+  int x;
+
+  // COMMON-LABEL: define linkonce_odr void @_ZN1B10do_nothingEv
+  void do_nothing() {
+    // ALIGN: ptrtoint %struct.B* %{{.*}} to i64, !nosanitize
+    // ALIGN: and i64 %{{.*}}, 3, !nosanitize
+
+    // NULL: icmp ne %struct.B* %{{.*}}, null, !nosanitize
+
+    // OBJSIZE-NOT: call i64 @llvm.objectsize
+  }
+};
+
 void force_irgen() {
   A a;
   a.do_nothing();
+
+  B b;
+  b.do_nothing();
 }