diff --git a/include/InstModel/LFCPAInstModel/LFCPAInstModel.h b/include/InstModel/LFCPAInstModel/LFCPAInstModel.h index 9658ac6..8299e6f 100644 --- a/include/InstModel/LFCPAInstModel/LFCPAInstModel.h +++ b/include/InstModel/LFCPAInstModel/LFCPAInstModel.h @@ -6,6 +6,7 @@ #include "Token/Token.h" #include "vector" +#include "iostream" #include "llvm/IR/Argument.h" #include "llvm/IR/Function.h" #include "llvm/IR/GlobalVariable.h" @@ -42,6 +43,8 @@ class LFCPAInstModel : public InstModel { bool isInstSkip(llvm::Instruction *); template bool isStructFieldPointerTy(GOP *); + template bool isGEPOperandArrayTy(GOP *, int); + template std::vector getGEPArrayIndex(GOP *); Token *extractDummy(std::string); }; } // namespace spatial diff --git a/lib/InstModel/LFCPAInstModel/LFCPAInstModel.cpp b/lib/InstModel/LFCPAInstModel/LFCPAInstModel.cpp index 4af588e..9f29286 100644 --- a/lib/InstModel/LFCPAInstModel/LFCPAInstModel.cpp +++ b/lib/InstModel/LFCPAInstModel/LFCPAInstModel.cpp @@ -407,12 +407,20 @@ LFCPAInstModel::handleGEPUtil(llvm::GEPOperator *G, Token *Ptr); template bool LFCPAInstModel::isStructFieldPointerTy(GOP *G) { - long int cntOp = G->getNumOperands(); - llvm::Type *BaseTy = G->getOperand(0)->getType()->getContainedType(0); - llvm::ConstantInt *CI = - llvm::dyn_cast(G->getOperand(cntOp - 1)); - auto conVal = CI->getSExtValue(); - return (BaseTy->getStructElementType(conVal)->isPointerTy()); + llvm::Type *StructType = G->getOperand(0)->getType(); + if(StructType->getNumContainedTypes() > 0) + StructType = StructType->getContainedType(0); + for (int i = 2; i < G->getNumOperands(); i++) { + while(StructType->isArrayTy()){ + StructType = StructType->getArrayElementType(); + i = i + 1; + } + if(i >= G->getNumOperands()) break; + llvm::Value *IdxV = G->getOperand(i); + llvm::ConstantInt *Idx = llvm::cast(IdxV); + StructType = StructType->getStructElementType(Idx->getSExtValue()); + } + return StructType->isPointerTy(); } template bool LFCPAInstModel::isStructFieldPointerTy( @@ -420,6 +428,48 @@ template bool LFCPAInstModel::isStructFieldPointerTy( template bool LFCPAInstModel::isStructFieldPointerTy(llvm::GEPOperator *G); +template bool LFCPAInstModel::isGEPOperandArrayTy(GOP *G, int Idx) { + llvm::Type *StructType = G->getOperand(0)->getType(); + if(StructType->getNumContainedTypes() > 0) + StructType = StructType->getContainedType(0); + int OpNum = G->getNumOperands(); + if(Idx > 0) + OpNum = Idx; + for (int i = 2; i <= OpNum; i++) { + while(StructType->isArrayTy()){ + StructType = StructType->getArrayElementType(); + i = i + 1; + } + if(i >= OpNum) break; + llvm::Value *IdxV = G->getOperand(i); + llvm::ConstantInt *Idx = llvm::cast(IdxV); + StructType = StructType->getStructElementType(Idx->getSExtValue()); + } + return StructType->isArrayTy(); +} + +template bool LFCPAInstModel::isGEPOperandArrayTy( + llvm::GetElementPtrInst *G, int Idx = -1); +template bool +LFCPAInstModel::isGEPOperandArrayTy(llvm::GEPOperator *G, int Idx = -1); + +template std::vector LFCPAInstModel::getGEPArrayIndex(GOP *G) { + std::vector Idx; + for (int i = 2; i < G->getNumOperands(); i++) { + if(isGEPOperandArrayTy(G, i - 1)){ + Idx.push_back(i); + } + } + std::cout << std::endl; + return Idx; +} + +template std::vector LFCPAInstModel::getGEPArrayIndex( + llvm::GetElementPtrInst *G); +template std::vector +LFCPAInstModel::getGEPArrayIndex(llvm::GEPOperator *G); + + Token *LFCPAInstModel::extractDummy(std::string S) { return (this->getTokenWrapper()->getToken(S, nullptr)); }