http://reviews.llvm.org/D4412

Files:
  lib/CodeGen/CGExpr.cpp

Index: lib/CodeGen/CGExpr.cpp
===================================================================
--- lib/CodeGen/CGExpr.cpp
+++ lib/CodeGen/CGExpr.cpp
@@ -547,6 +547,23 @@
 
     // Blacklist based on the mangled type.
     if (!CGM.getSanitizerBlacklist().isBlacklistedType(Out.str())) {
+      llvm::BasicBlock *VptrNullBlock = nullptr;
+      llvm::BasicBlock *VptrNotNullBlock = nullptr;
+
+      // Skip Vptr checks when the pointer value is null. This is redundant if
+      // -fsanitize=null is used.
+      // FIXME: Add optional flags.
+      if (TCK_DowncastPointer && !SanOpts->Null) {
+        Cond = Builder.CreateICmpNE(
+          Address, llvm::Constant::getNullValue(Address->getType()));
+
+        VptrNullBlock = createBasicBlock("vptr_null");
+        VptrNotNullBlock = createBasicBlock("not.vptr_null");
+
+        Builder.CreateCondBr(Cond, VptrNotNullBlock, VptrNullBlock);
+        EmitBlock(VptrNotNullBlock);
+      }
+
       llvm::hash_code TypeHash = hash_value(Out.str());
 
       // Load the vptr, and compute hash_16_bytes(TypeHash, vptr).
@@ -585,6 +602,11 @@
       EmitCheck(Builder.CreateICmpEQ(CacheVal, Hash),
                 "dynamic_type_cache_miss", StaticData, DynamicData,
                 CRK_AlwaysRecoverable);
+
+      if (VptrNullBlock) {
+        Builder.CreateBr(VptrNullBlock);
+        EmitBlock(VptrNullBlock);
+      }
     }
   }
Index: lib/CodeGen/CGExpr.cpp
===================================================================
--- lib/CodeGen/CGExpr.cpp
+++ lib/CodeGen/CGExpr.cpp
@@ -547,6 +547,23 @@
 
     // Blacklist based on the mangled type.
     if (!CGM.getSanitizerBlacklist().isBlacklistedType(Out.str())) {
+      llvm::BasicBlock *VptrNullBlock = nullptr;
+      llvm::BasicBlock *VptrNotNullBlock = nullptr;
+
+      // Skip Vptr checks when the pointer value is null. This is redundant if
+      // -fsanitize=null is used.
+      // FIXME: Add optional flags.
+      if (TCK_DowncastPointer && !SanOpts->Null) {
+        Cond = Builder.CreateICmpNE(
+          Address, llvm::Constant::getNullValue(Address->getType()));
+
+        VptrNullBlock = createBasicBlock("vptr_null");
+        VptrNotNullBlock = createBasicBlock("not.vptr_null");
+
+        Builder.CreateCondBr(Cond, VptrNotNullBlock, VptrNullBlock);
+        EmitBlock(VptrNotNullBlock);
+      }
+
       llvm::hash_code TypeHash = hash_value(Out.str());
 
       // Load the vptr, and compute hash_16_bytes(TypeHash, vptr).
@@ -585,6 +602,11 @@
       EmitCheck(Builder.CreateICmpEQ(CacheVal, Hash),
                 "dynamic_type_cache_miss", StaticData, DynamicData,
                 CRK_AlwaysRecoverable);
+
+      if (VptrNullBlock) {
+        Builder.CreateBr(VptrNullBlock);
+        EmitBlock(VptrNullBlock);
+      }
     }
   }
 
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to