// // Method: visitGetElementPtrInst() // // Description: // This method checks to see if the specified GEP is safe. If it cannot prove // it safe, it then adds a run-time check for it. // void InsertGEPChecks::visitGetElementPtrInst (GetElementPtrInst & GEP) { // // Don't insert a check if GEP only indexes into a structure and the // user doesn't want to do structure index checking. // if (DisableStructChecks && indexesStructsOnly (&GEP)) { return; } // // Get the function in which the GEP instruction lives. // Value * PH = ConstantPointerNull::get (getVoidPtrType(GEP.getContext())); BasicBlock::iterator InsertPt = &GEP; ++InsertPt; Instruction * ResultPtr = castTo (&GEP, getVoidPtrType(GEP.getContext()), GEP.getName() + ".cast", InsertPt); // // Make this an actual cast instruction; it will make it easier to update // DSA. // Value * SrcPtr = castTo (GEP.getPointerOperand(), getVoidPtrType(GEP.getContext()), GEP.getName()+".cast", InsertPt); // // Create the call to the run-time check. // std::vector<Value *> args(1, PH); args.push_back (SrcPtr); args.push_back (ResultPtr); CallInst * CI = CallInst::Create (PoolCheckArrayUI, args, "", InsertPt); // // Add debugging info metadata to the run-time check. // if (MDNode * MD = GEP.getMetadata ("dbg")) CI->setMetadata ("dbg", MD); // // Update the statistics. // ++GEPChecks; return; }