[NFC][CodeGen][UBSan] EmitCheckedInBoundsGEP(): pass a vector to EmitCheck()
authorRoman Lebedev <lebedev.ri@gmail.com>
Fri, 6 Sep 2019 14:19:04 +0000 (14:19 +0000)
committerRoman Lebedev <lebedev.ri@gmail.com>
Fri, 6 Sep 2019 14:19:04 +0000 (14:19 +0000)
Will be easier to add a new 'check' in a follow-up.

This was originally part of https://reviews.llvm.org/D67122

llvm-svn: 371208

clang/lib/CodeGen/CGExprScalar.cpp

index fc5f072..77ec54d 100644 (file)
@@ -4662,6 +4662,8 @@ CodeGenFunction::EmitCheckedInBoundsGEP(Value *Ptr, ArrayRef<Value *> IdxList,
   auto *IntPtr = Builder.CreatePtrToInt(GEP->getPointerOperand(), IntPtrTy);
   auto *ComputedGEP = Builder.CreateAdd(IntPtr, EvaluatedGEP.TotalOffset);
 
+  llvm::SmallVector<std::pair<llvm::Value *, SanitizerMask>, 1> Checks;
+
   // The GEP is valid if:
   // 1) The total offset doesn't overflow, and
   // 2) The sign of the difference between the computed address and the base
@@ -4693,12 +4695,14 @@ CodeGenFunction::EmitCheckedInBoundsGEP(Value *Ptr, ArrayRef<Value *> IdxList,
     ValidGEP = Builder.CreateICmpULE(ComputedGEP, IntPtr);
   }
   ValidGEP = Builder.CreateAnd(ValidGEP, NoOffsetOverflow);
+  Checks.emplace_back(ValidGEP, SanitizerKind::PointerOverflow);
+
+  assert(!Checks.empty() && "Should have produced some checks.");
 
   llvm::Constant *StaticArgs[] = {EmitCheckSourceLocation(Loc)};
   // Pass the computed GEP to the runtime to avoid emitting poisoned arguments.
   llvm::Value *DynamicArgs[] = {IntPtr, ComputedGEP};
-  EmitCheck(std::make_pair(ValidGEP, SanitizerKind::PointerOverflow),
-            SanitizerHandler::PointerOverflow, StaticArgs, DynamicArgs);
+  EmitCheck(Checks, SanitizerHandler::PointerOverflow, StaticArgs, DynamicArgs);
 
   return GEPVal;
 }