From: David Blaikie Date: Thu, 21 May 2015 21:17:12 +0000 (+0000) Subject: Put GEPOperator member function definition in the appropriate .cpp file X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=6777be34467c88d1a5fa3ac1ebdf220f5a3206e9;ds=sidebyside Put GEPOperator member function definition in the appropriate .cpp file Last commit put it in Constants.cpp instead of Operator.cpp git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237960 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/IR/Constants.cpp b/lib/IR/Constants.cpp index 3665d5abb41..d35372a2f8e 100644 --- a/lib/IR/Constants.cpp +++ b/lib/IR/Constants.cpp @@ -3050,33 +3050,3 @@ Instruction *ConstantExpr::getAsInstruction() { return BO; } } - -bool GEPOperator::accumulateConstantOffset(const DataLayout &DL, - APInt &Offset) const { - assert(Offset.getBitWidth() == - DL.getPointerSizeInBits(getPointerAddressSpace()) && - "The offset must have exactly as many bits as our pointer."); - - for (gep_type_iterator GTI = gep_type_begin(this), GTE = gep_type_end(this); - GTI != GTE; ++GTI) { - ConstantInt *OpC = dyn_cast(GTI.getOperand()); - if (!OpC) - return false; - if (OpC->isZero()) - continue; - - // Handle a struct index, which adds its field offset to the pointer. - if (StructType *STy = dyn_cast(*GTI)) { - unsigned ElementIdx = OpC->getZExtValue(); - const StructLayout *SL = DL.getStructLayout(STy); - Offset += APInt(Offset.getBitWidth(), SL->getElementOffset(ElementIdx)); - continue; - } - - // For array or vector indices, scale the index by the size of the type. - APInt Index = OpC->getValue().sextOrTrunc(Offset.getBitWidth()); - Offset += Index * APInt(Offset.getBitWidth(), - DL.getTypeAllocSize(GTI.getIndexedType())); - } - return true; -} diff --git a/lib/IR/Operator.cpp b/lib/IR/Operator.cpp index dd62b04c867..77dc680af11 100644 --- a/lib/IR/Operator.cpp +++ b/lib/IR/Operator.cpp @@ -1,4 +1,5 @@ #include "llvm/IR/Operator.h" +#include "llvm/IR/GetElementPtrTypeIterator.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/Type.h" @@ -10,4 +11,34 @@ Type *GEPOperator::getSourceElementType() const { return I->getSourceElementType(); return cast(this)->getSourceElementType(); } + +bool GEPOperator::accumulateConstantOffset(const DataLayout &DL, + APInt &Offset) const { + assert(Offset.getBitWidth() == + DL.getPointerSizeInBits(getPointerAddressSpace()) && + "The offset must have exactly as many bits as our pointer."); + + for (gep_type_iterator GTI = gep_type_begin(this), GTE = gep_type_end(this); + GTI != GTE; ++GTI) { + ConstantInt *OpC = dyn_cast(GTI.getOperand()); + if (!OpC) + return false; + if (OpC->isZero()) + continue; + + // Handle a struct index, which adds its field offset to the pointer. + if (StructType *STy = dyn_cast(*GTI)) { + unsigned ElementIdx = OpC->getZExtValue(); + const StructLayout *SL = DL.getStructLayout(STy); + Offset += APInt(Offset.getBitWidth(), SL->getElementOffset(ElementIdx)); + continue; + } + + // For array or vector indices, scale the index by the size of the type. + APInt Index = OpC->getValue().sextOrTrunc(Offset.getBitWidth()); + Offset += Index * APInt(Offset.getBitWidth(), + DL.getTypeAllocSize(GTI.getIndexedType())); + } + return true; +} }