From: Sanjoy Das <sanjoy@playingwithpointers.com>
Date: Thu, 5 Nov 2015 01:53:26 +0000 (+0000)
Subject: [IR] Add bounds checking to dataOperandHasImpliedAttr
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=4ae094a8512df6cdb6d3f8f17ef2565b8f9cd7e5;p=oota-llvm.git

[IR] Add bounds checking to dataOperandHasImpliedAttr

This is similar to the bounds check added to paramHasAttr in r252073.

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

diff --git a/lib/IR/Instructions.cpp b/lib/IR/Instructions.cpp
index 7c3695b1531..dfd711f5c23 100644
--- a/lib/IR/Instructions.cpp
+++ b/lib/IR/Instructions.cpp
@@ -343,6 +343,10 @@ bool CallInst::paramHasAttr(unsigned i, Attribute::AttrKind A) const {
 bool CallInst::dataOperandHasImpliedAttr(unsigned i,
                                          Attribute::AttrKind A) const {
 
+  // There are getNumOperands() - 1 data operands.  The last operand is the
+  // callee.
+  assert(i < getNumOperands() && "Data operand index out of bounds!");
+
   // The attribute A can either be directly specified, if the operand in
   // question is a call argument; or be indirectly implied by the kind of its
   // containing operand bundle, if the operand is a bundle operand.
@@ -603,6 +607,10 @@ bool InvokeInst::paramHasAttr(unsigned i, Attribute::AttrKind A) const {
 
 bool InvokeInst::dataOperandHasImpliedAttr(unsigned i,
                                            Attribute::AttrKind A) const {
+  // There are getNumOperands() - 3 data operands.  The last three operands are
+  // the callee and the two successor basic blocks.
+  assert(i < (getNumOperands() - 2) && "Data operand index out of bounds!");
+
   // The attribute A can either be directly specified, if the operand in
   // question is an invoke argument; or be indirectly implied by the kind of its
   // containing operand bundle, if the operand is a bundle operand.