From 0234cf212167d1d2ca061969c04738e09801b284 Mon Sep 17 00:00:00 2001 From: SHREYASINGH29 <296shreya@gmail.com> Date: Fri, 3 Sep 2021 15:30:24 +0530 Subject: [PATCH 1/3] Find if gep operand is a array type --- .../InstModel/LFCPAInstModel/LFCPAInstModel.h | 1 + .../LFCPAInstModel/LFCPAInstModel.cpp | 42 ++++++++++++++++--- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/include/InstModel/LFCPAInstModel/LFCPAInstModel.h b/include/InstModel/LFCPAInstModel/LFCPAInstModel.h index 9658ac6..0f2db7c 100644 --- a/include/InstModel/LFCPAInstModel/LFCPAInstModel.h +++ b/include/InstModel/LFCPAInstModel/LFCPAInstModel.h @@ -42,6 +42,7 @@ class LFCPAInstModel : public InstModel { bool isInstSkip(llvm::Instruction *); template bool isStructFieldPointerTy(GOP *); + template bool isGEPOperandArrayTy(GOP *); Token *extractDummy(std::string); }; } // namespace spatial diff --git a/lib/InstModel/LFCPAInstModel/LFCPAInstModel.cpp b/lib/InstModel/LFCPAInstModel/LFCPAInstModel.cpp index 4af588e..990478e 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,28 @@ template bool LFCPAInstModel::isStructFieldPointerTy( template bool LFCPAInstModel::isStructFieldPointerTy(llvm::GEPOperator *G); +template bool LFCPAInstModel::isGEPOperandArrayTy(GOP *G) { + 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->isArrayTy(); +} + +template bool LFCPAInstModel::isGEPOperandArrayTy( + llvm::GetElementPtrInst *G); +template bool +LFCPAInstModel::isGEPOperandArrayTy(llvm::GEPOperator *G); + Token *LFCPAInstModel::extractDummy(std::string S) { return (this->getTokenWrapper()->getToken(S, nullptr)); } From 7c18376ff103bdb48c669663e18115eed8663c6f Mon Sep 17 00:00:00 2001 From: SHREYASINGH29 <296shreya@gmail.com> Date: Mon, 13 Sep 2021 01:13:30 +0530 Subject: [PATCH 2/3] Return array index in GEP --- .../InstModel/LFCPAInstModel/LFCPAInstModel.h | 4 ++- .../LFCPAInstModel/LFCPAInstModel.cpp | 30 +++++++++++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/include/InstModel/LFCPAInstModel/LFCPAInstModel.h b/include/InstModel/LFCPAInstModel/LFCPAInstModel.h index 0f2db7c..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,7 +43,8 @@ class LFCPAInstModel : public InstModel { bool isInstSkip(llvm::Instruction *); template bool isStructFieldPointerTy(GOP *); - template bool isGEPOperandArrayTy(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 990478e..2e424e3 100644 --- a/lib/InstModel/LFCPAInstModel/LFCPAInstModel.cpp +++ b/lib/InstModel/LFCPAInstModel/LFCPAInstModel.cpp @@ -428,16 +428,20 @@ template bool LFCPAInstModel::isStructFieldPointerTy( template bool LFCPAInstModel::isStructFieldPointerTy(llvm::GEPOperator *G); -template bool LFCPAInstModel::isGEPOperandArrayTy(GOP *G) { +template bool LFCPAInstModel::isGEPOperandArrayTy(GOP *G, int Idx) { llvm::Type *StructType = G->getOperand(0)->getType(); if(StructType->getNumContainedTypes() > 0) StructType = StructType->getContainedType(0); - for (int i = 2; i < G->getNumOperands(); i++) { + int OpNum = G->getNumOperands(); + Idx += 1; + if(Idx > 1) + OpNum = Idx; + for (int i = 2; i < OpNum; i++) { while(StructType->isArrayTy()){ StructType = StructType->getArrayElementType(); i = i + 1; } - if(i >= G->getNumOperands()) break; + if(i >= OpNum) break; llvm::Value *IdxV = G->getOperand(i); llvm::ConstantInt *Idx = llvm::cast(IdxV); StructType = StructType->getStructElementType(Idx->getSExtValue()); @@ -446,9 +450,25 @@ template bool LFCPAInstModel::isGEPOperandArrayTy(GOP *G) { } template bool LFCPAInstModel::isGEPOperandArrayTy( - llvm::GetElementPtrInst *G); + llvm::GetElementPtrInst *G, int Idx = -1); template bool -LFCPAInstModel::isGEPOperandArrayTy(llvm::GEPOperator *G); +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)){ + Idx.push_back(i + 1); + } + } + 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)); From 37915219ce46f0c439aad82773745c6eff273a37 Mon Sep 17 00:00:00 2001 From: SHREYASINGH29 <296shreya@gmail.com> Date: Fri, 1 Oct 2021 18:59:41 +0530 Subject: [PATCH 3/3] fix not working on first index --- lib/InstModel/LFCPAInstModel/LFCPAInstModel.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/InstModel/LFCPAInstModel/LFCPAInstModel.cpp b/lib/InstModel/LFCPAInstModel/LFCPAInstModel.cpp index 2e424e3..9f29286 100644 --- a/lib/InstModel/LFCPAInstModel/LFCPAInstModel.cpp +++ b/lib/InstModel/LFCPAInstModel/LFCPAInstModel.cpp @@ -433,10 +433,9 @@ template bool LFCPAInstModel::isGEPOperandArrayTy(GOP *G, int Idx if(StructType->getNumContainedTypes() > 0) StructType = StructType->getContainedType(0); int OpNum = G->getNumOperands(); - Idx += 1; - if(Idx > 1) + if(Idx > 0) OpNum = Idx; - for (int i = 2; i < OpNum; i++) { + for (int i = 2; i <= OpNum; i++) { while(StructType->isArrayTy()){ StructType = StructType->getArrayElementType(); i = i + 1; @@ -457,10 +456,11 @@ LFCPAInstModel::isGEPOperandArrayTy(llvm::GEPOperator *G, int template std::vector LFCPAInstModel::getGEPArrayIndex(GOP *G) { std::vector Idx; for (int i = 2; i < G->getNumOperands(); i++) { - if(isGEPOperandArrayTy(G, i)){ - Idx.push_back(i + 1); + if(isGEPOperandArrayTy(G, i - 1)){ + Idx.push_back(i); } } + std::cout << std::endl; return Idx; }