From e41fa757ec37d8bf741b1f8f371f658a3f8d46be Mon Sep 17 00:00:00 2001 From: ayush-qubit Date: Sun, 11 Apr 2021 18:50:12 +0530 Subject: [PATCH 01/10] Added PHINode support --- lib/Utils/ReplaceIRVar.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/Utils/ReplaceIRVar.cpp b/lib/Utils/ReplaceIRVar.cpp index 5f3a097..bdafc1e 100644 --- a/lib/Utils/ReplaceIRVar.cpp +++ b/lib/Utils/ReplaceIRVar.cpp @@ -60,9 +60,14 @@ void ReplaceIRVar::runOnBasicBlock(llvm::BasicBlock &BB) { (DbgDeclare->getVariable()->getName()).str()); if (llvm::Instruction *I = llvm::dyn_cast(DbgDeclare->getAddress())) { - llvm::StringRef strref(this->NewName); - HashMap.insert(std::pair(I->getName().str(), + std::string Name = I->getName().str(); + if(HashMap.find(Name) != HashMap.end()){ + HashMap[Name] = this->NewName; + } + else{ + HashMap.insert(std::pair(I->getName().str(), this->NewName)); + } } } } From 5227262b62dd2bd616b0d69d29f7cf8d46c95c4b Mon Sep 17 00:00:00 2001 From: ayush-qubit Date: Thu, 15 Apr 2021 19:39:02 +0530 Subject: [PATCH 02/10] Added NULL Pointer --- lib/Token/Token.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/Token/Token.cpp b/lib/Token/Token.cpp index 862ab27..dff58da 100644 --- a/lib/Token/Token.cpp +++ b/lib/Token/Token.cpp @@ -198,6 +198,15 @@ bool Token::isArg() const { return this->Kind == 2; } /// isField - Returns true if alias is a field bool Token::isField() const { return this->Index != ""; } +bool Token::isNull(){ + if(this->Kind == 3 && this->name == "NULL"){ + return true; + } + else{ + return false; + } +} + /// isAllocaOrArgOrGlobal - Returns true if the alias is global, an argument or /// alloca bool Token::isAllocaOrArgOrGlobal() const { From 137b91c33da79d59e15b5c02db420ef0690d5e37 Mon Sep 17 00:00:00 2001 From: ayush-qubit Date: Mon, 19 Apr 2021 18:04:51 +0530 Subject: [PATCH 03/10] Update ReplaceIRVar --- include/Utils/ReplaceIRVar.h | 1 + lib/Token/Token.cpp | 9 +-------- lib/Utils/ReplaceIRVar.cpp | 20 ++++++++++++-------- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/include/Utils/ReplaceIRVar.h b/include/Utils/ReplaceIRVar.h index cd6ddd7..3f401f3 100644 --- a/include/Utils/ReplaceIRVar.h +++ b/include/Utils/ReplaceIRVar.h @@ -23,6 +23,7 @@ class ReplaceIRVar { void init(llvm::BasicBlock &BB); void init(llvm::Module &M); void format(std::string First, std::string Second); + void insert(std::string); public: ReplaceIRVar(); diff --git a/lib/Token/Token.cpp b/lib/Token/Token.cpp index dff58da..1a8d26c 100644 --- a/lib/Token/Token.cpp +++ b/lib/Token/Token.cpp @@ -198,14 +198,7 @@ bool Token::isArg() const { return this->Kind == 2; } /// isField - Returns true if alias is a field bool Token::isField() const { return this->Index != ""; } -bool Token::isNull(){ - if(this->Kind == 3 && this->name == "NULL"){ - return true; - } - else{ - return false; - } -} +bool Token::isNull() { return this->Kind == 3 && this->name == "NULL"; } /// isAllocaOrArgOrGlobal - Returns true if the alias is global, an argument or /// alloca diff --git a/lib/Utils/ReplaceIRVar.cpp b/lib/Utils/ReplaceIRVar.cpp index bdafc1e..bec91e9 100644 --- a/lib/Utils/ReplaceIRVar.cpp +++ b/lib/Utils/ReplaceIRVar.cpp @@ -41,6 +41,17 @@ void ReplaceIRVar::init(llvm::Module &M) { } } +/// insert IR Name and Source Name mapping +void ReplaceIRVar::insert(std::string Name){ + if(HashMap.find(Name) != HashMap.end()){ + HashMap[Name] = this->NewName; + } + else{ + HashMap.insert(std::pair(Name, + this->NewName)); + } +} + /// replace IR variable to Actual Variable for the Function passed as parameter void ReplaceIRVar::runOnFunction(llvm::Function &F) { this->init(F); @@ -60,14 +71,7 @@ void ReplaceIRVar::runOnBasicBlock(llvm::BasicBlock &BB) { (DbgDeclare->getVariable()->getName()).str()); if (llvm::Instruction *I = llvm::dyn_cast(DbgDeclare->getAddress())) { - std::string Name = I->getName().str(); - if(HashMap.find(Name) != HashMap.end()){ - HashMap[Name] = this->NewName; - } - else{ - HashMap.insert(std::pair(I->getName().str(), - this->NewName)); - } + this->insert(I->getName().str()); } } } From 55bd3af9b764145cd6c2f5add9db86525e4611a8 Mon Sep 17 00:00:00 2001 From: ayush-qubit Date: Wed, 28 Apr 2021 21:58:05 +0530 Subject: [PATCH 04/10] Update ReplaceIRVar --- include/Utils/ReplaceIRVar.h | 6 +++--- lib/Utils/CFGUtils.cpp | 2 +- lib/Utils/ReplaceIRVar.cpp | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/include/Utils/ReplaceIRVar.h b/include/Utils/ReplaceIRVar.h index 3f401f3..55bdba4 100644 --- a/include/Utils/ReplaceIRVar.h +++ b/include/Utils/ReplaceIRVar.h @@ -27,8 +27,8 @@ class ReplaceIRVar { public: ReplaceIRVar(); - void runOnFunction(llvm::Function &F); - void runOnBasicBlock(llvm::BasicBlock &BB); - void runOnModule(llvm::Module &M); + void run(llvm::Function &F); + void run(llvm::BasicBlock &BB); + void run(llvm::Module &M); }; #endif \ No newline at end of file diff --git a/lib/Utils/CFGUtils.cpp b/lib/Utils/CFGUtils.cpp index ed14675..737c0ce 100644 --- a/lib/Utils/CFGUtils.cpp +++ b/lib/Utils/CFGUtils.cpp @@ -13,7 +13,7 @@ namespace spatial { /// InstNamer - sets name to the SSA temporaries void InstNamer(llvm::Function &F) { ReplaceIRVar Replace; - Replace.runOnFunction(F); + Replace.run(F); } bool SkipFunction(llvm::Function &F) { diff --git a/lib/Utils/ReplaceIRVar.cpp b/lib/Utils/ReplaceIRVar.cpp index bec91e9..cbc9b58 100644 --- a/lib/Utils/ReplaceIRVar.cpp +++ b/lib/Utils/ReplaceIRVar.cpp @@ -53,16 +53,16 @@ void ReplaceIRVar::insert(std::string Name){ } /// replace IR variable to Actual Variable for the Function passed as parameter -void ReplaceIRVar::runOnFunction(llvm::Function &F) { +void ReplaceIRVar::run(llvm::Function &F) { this->init(F); for (llvm::BasicBlock &BB : F) { - this->runOnBasicBlock(BB); + this->run(BB); } } /// replace IR variable to Actual Variable for the Basic Block passed as /// parameter -void ReplaceIRVar::runOnBasicBlock(llvm::BasicBlock &BB) { +void ReplaceIRVar::run(llvm::BasicBlock &BB) { this->init(BB); for (llvm::Instruction &I : BB) { if (const llvm::DbgDeclareInst *DbgDeclare = @@ -84,9 +84,9 @@ void ReplaceIRVar::runOnBasicBlock(llvm::BasicBlock &BB) { } /// replace IR variable to Actual Variable for the Module passed as parameter -void ReplaceIRVar::runOnModule(llvm::Module &M) { +void ReplaceIRVar::run(llvm::Module &M) { this->init(M); for (llvm::Function &F : M) { - this->runOnFunction(F); + this->run(F); } } From 95b547916f22510854f09eea04a06c2cd70effc7 Mon Sep 17 00:00:00 2001 From: ayush-qubit Date: Thu, 29 Apr 2021 19:49:57 +0530 Subject: [PATCH 05/10] Added comment --- lib/Token/Token.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Token/Token.cpp b/lib/Token/Token.cpp index 1a8d26c..d00b456 100644 --- a/lib/Token/Token.cpp +++ b/lib/Token/Token.cpp @@ -198,7 +198,8 @@ bool Token::isArg() const { return this->Kind == 2; } /// isField - Returns true if alias is a field bool Token::isField() const { return this->Index != ""; } -bool Token::isNull() { return this->Kind == 3 && this->name == "NULL"; } +///isNull - Returns true if alias is NULL +bool Token::isNull() const { return this->Kind == 3 && this->name == "NULL"; } /// isAllocaOrArgOrGlobal - Returns true if the alias is global, an argument or /// alloca From 04b52d55af3ea83b414b1dc7e13d69c8c7aaf058 Mon Sep 17 00:00:00 2001 From: ayush-qubit <37446683+ayush-qubit@users.noreply.github.com> Date: Fri, 4 Jun 2021 17:40:20 +0530 Subject: [PATCH 06/10] Added NULL support and PHInode support --- .gitignore | 4 ++- include/Graph/Graph.h | 4 +++ .../GenericInstModel/GenericInstModel.h | 1 + include/Token/Token.h | 1 + .../GenericInstModel/GenericInstModel.cpp | 29 +++++++++++++++++-- lib/Token/Token.cpp | 4 +-- 6 files changed, 37 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index d163863..0e27f6a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -build/ \ No newline at end of file +build/ +.vscode/ +.github/ \ No newline at end of file diff --git a/include/Graph/Graph.h b/include/Graph/Graph.h index 27e3046..acc4532 100644 --- a/include/Graph/Graph.h +++ b/include/Graph/Graph.h @@ -67,6 +67,10 @@ void Graph::insert(Node *Src, Node *Dest, int Left, int Right) { this->insert(Src, DestDest); } } + } else if(Left == 2 && Right == 0){ + for(auto Src : this->getPointee(Src)){ + this->insert(Src,Dest); + } } } diff --git a/include/InstModel/GenericInstModel/GenericInstModel.h b/include/InstModel/GenericInstModel/GenericInstModel.h index 45a4d21..4629066 100644 --- a/include/InstModel/GenericInstModel/GenericInstModel.h +++ b/include/InstModel/GenericInstModel/GenericInstModel.h @@ -32,6 +32,7 @@ class GenericInstModel : public InstModel { std::vector extractToken(llvm::GlobalVariable *); std::vector extractToken(llvm::CallInst *); std::vector extractToken(llvm::Argument *, llvm::Function *); + std::vector extractPHINodeToken(llvm::Instruction *); std::vector extractRedirections(llvm::GlobalVariable *); template Token *handleGEPUtil(GEP *, Token *); diff --git a/include/Token/Token.h b/include/Token/Token.h index 4baf33f..25095e7 100644 --- a/include/Token/Token.h +++ b/include/Token/Token.h @@ -63,6 +63,7 @@ class Token { bool isAllocaOrArgOrGlobal() const; bool sameFunc(llvm::Function *Func) const; bool isBasePointerType() const; + bool isNull() const; std::string getHash() const; bool operator<(const Token &TheToken) const; diff --git a/lib/InstModel/GenericInstModel/GenericInstModel.cpp b/lib/InstModel/GenericInstModel/GenericInstModel.cpp index d7c492d..fa06c32 100644 --- a/lib/InstModel/GenericInstModel/GenericInstModel.cpp +++ b/lib/InstModel/GenericInstModel/GenericInstModel.cpp @@ -29,6 +29,8 @@ std::vector GenericInstModel::extractToken(llvm::Instruction *Inst) { return extractToken(GEP); } else if (llvm::CallInst *CI = llvm::dyn_cast(Inst)) { return extractToken(CI); + } else if(llvm::isa(Inst)){ + return extractPHINodeToken(Inst); } else { // Direct support to some instructions may not be useful example // CallInst, as it is more useful to generate alias object for call @@ -60,8 +62,15 @@ std::vector GenericInstModel::extractToken(llvm::StoreInst *Inst) { TokenVec.push_back( this->getTokenWrapper()->getToken(Inst->getPointerOperand())); llvm::Value *ValOp = Inst->getValueOperand(); - if (!llvm::isa(ValOp)) - TokenVec.push_back(this->getTokenWrapper()->getToken(ValOp)); + if (!llvm::isa(ValOp)){ + if(llvm::isa(ValOp)){ + std::string s("NULL"); + TokenVec.push_back(this->getTokenWrapper()->getToken(s,nullptr)); + } + else{ + TokenVec.push_back(this->getTokenWrapper()->getToken(ValOp)); + } + } return TokenVec; } @@ -160,11 +169,23 @@ std::vector GenericInstModel::extractToken(llvm::CallInst *CI) { return TokenVec; } +std::vector GenericInstModel::extractPHINodeToken(llvm::Instruction *Inst){ + std::vector TokenVec; + TokenVec.push_back(this->getTokenWrapper()->getToken(Inst)); + if(Inst->getOperand(0)->hasName()){ + TokenVec.push_back(this->getTokenWrapper()->getToken(Inst->getOperand(0))); + } + if(Inst->getOperand(1)->hasName()){ + TokenVec.push_back(this->getTokenWrapper()->getToken(Inst->getOperand(1))); + } + return TokenVec; +} + /// extractRedirections - Returns the relative level of redirection based of /// LHS and RHS on the statement std::vector GenericInstModel::extractRedirections(llvm::Instruction *Inst) { - std::vector load{1, 2}, store{2, 1}, copy{1, 1}, assign{1, 0}; + std::vector load{1, 2}, store{2, 1}, copy{1, 1}, assign{1, 0}, phiNode{1,1,1}; if (llvm::isa(Inst) || llvm::isa(Inst)) return assign; @@ -172,6 +193,8 @@ GenericInstModel::extractRedirections(llvm::Instruction *Inst) { return store; if (llvm::isa(Inst)) return load; + if(llvm::isa(Inst)) + return phiNode; return copy; } diff --git a/lib/Token/Token.cpp b/lib/Token/Token.cpp index d00b456..72c92b7 100644 --- a/lib/Token/Token.cpp +++ b/lib/Token/Token.cpp @@ -168,7 +168,7 @@ llvm::StringRef Token::getName() const { /// getMemTypeName - Returns the memory type name std::string Token::getMemTypeName() const { std::string MemTyName = ""; - if (!this->isMem()) + if (!this->isMem() || this->isNull()) return MemTyName; llvm::raw_string_ostream RSO(MemTyName); this->Ty->print(RSO); @@ -187,7 +187,7 @@ std::string Token::getFunctionName() const { std::string Token::getFieldIndex() const { return this->Index; } /// isMem - Returns true if the alias denotes a location in heap -bool Token::isMem() const { return this->Kind == 1; } +bool Token::isMem() const { return this->Kind == 1 || this->isNull(); } /// isGlobalVar - Returns true if the alias is global bool Token::isGlobalVar() const { return this->IsGlobal; } From 95eb7ca7ed6b9fdf86fa743d4377e25410b9d64a Mon Sep 17 00:00:00 2001 From: ayush-qubit <37446683+ayush-qubit@users.noreply.github.com> Date: Fri, 4 Jun 2021 17:52:52 +0530 Subject: [PATCH 07/10] Update GenericModel.cpp --- lib/InstModel/GenericInstModel/GenericInstModel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/InstModel/GenericInstModel/GenericInstModel.cpp b/lib/InstModel/GenericInstModel/GenericInstModel.cpp index fa06c32..fd1b78c 100644 --- a/lib/InstModel/GenericInstModel/GenericInstModel.cpp +++ b/lib/InstModel/GenericInstModel/GenericInstModel.cpp @@ -168,7 +168,7 @@ std::vector GenericInstModel::extractToken(llvm::CallInst *CI) { } return TokenVec; } - +/// extractPHINodeToken - Returns the alias objects for PHInode instruction std::vector GenericInstModel::extractPHINodeToken(llvm::Instruction *Inst){ std::vector TokenVec; TokenVec.push_back(this->getTokenWrapper()->getToken(Inst)); From 5675b38a0ebc0dff88930839bb56d9c9d51ae39a Mon Sep 17 00:00:00 2001 From: ayush-qubit <37446683+ayush-qubit@users.noreply.github.com> Date: Fri, 4 Jun 2021 21:41:21 +0530 Subject: [PATCH 08/10] Update Graph.h --- include/Graph/Graph.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/Graph/Graph.h b/include/Graph/Graph.h index acc4532..a0abb19 100644 --- a/include/Graph/Graph.h +++ b/include/Graph/Graph.h @@ -68,8 +68,8 @@ void Graph::insert(Node *Src, Node *Dest, int Left, int Right) { } } } else if(Left == 2 && Right == 0){ - for(auto Src : this->getPointee(Src)){ - this->insert(Src,Dest); + for(auto S : this->getPointee(Src)){ + this->insert(S,Dest); } } } From 6c274703b787466ea17f793bfbfaa92316231570 Mon Sep 17 00:00:00 2001 From: ayush-qubit <37446683+ayush-qubit@users.noreply.github.com> Date: Sun, 6 Jun 2021 12:11:55 +0530 Subject: [PATCH 09/10] Updated GenericInstModel --- .gitignore | 4 +- .vscode/settings.json | 47 +++++++++++++++++++ .../GenericInstModel/GenericInstModel.cpp | 18 ++++--- 3 files changed, 56 insertions(+), 13 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index 0e27f6a..d163863 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1 @@ -build/ -.vscode/ -.github/ \ No newline at end of file +build/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f3a894c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,47 @@ +{ + "files.associations": { + "array": "cpp", + "atomic": "cpp", + "*.tcc": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "map": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "optional": "cpp", + "set": "cpp", + "string": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "new": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "typeinfo": "cpp" + } +} \ No newline at end of file diff --git a/lib/InstModel/GenericInstModel/GenericInstModel.cpp b/lib/InstModel/GenericInstModel/GenericInstModel.cpp index fd1b78c..9bc86f9 100644 --- a/lib/InstModel/GenericInstModel/GenericInstModel.cpp +++ b/lib/InstModel/GenericInstModel/GenericInstModel.cpp @@ -62,14 +62,12 @@ std::vector GenericInstModel::extractToken(llvm::StoreInst *Inst) { TokenVec.push_back( this->getTokenWrapper()->getToken(Inst->getPointerOperand())); llvm::Value *ValOp = Inst->getValueOperand(); - if (!llvm::isa(ValOp)){ - if(llvm::isa(ValOp)){ - std::string s("NULL"); - TokenVec.push_back(this->getTokenWrapper()->getToken(s,nullptr)); - } - else{ - TokenVec.push_back(this->getTokenWrapper()->getToken(ValOp)); - } + if(llvm::isa(ValOp)){ + std::string s("NULL"); + TokenVec.push_back(this->getTokenWrapper()->getToken(s,nullptr)); + } + else if(!llvm::isa(ValOp)){ + TokenVec.push_back(this->getTokenWrapper()->getToken(ValOp)); } return TokenVec; } @@ -172,10 +170,10 @@ std::vector GenericInstModel::extractToken(llvm::CallInst *CI) { std::vector GenericInstModel::extractPHINodeToken(llvm::Instruction *Inst){ std::vector TokenVec; TokenVec.push_back(this->getTokenWrapper()->getToken(Inst)); - if(Inst->getOperand(0)->hasName()){ + if(!llvm::isa(Inst->getOperand(0))){ TokenVec.push_back(this->getTokenWrapper()->getToken(Inst->getOperand(0))); } - if(Inst->getOperand(1)->hasName()){ + if(!llvm::isa(Inst->getOperand(1))){ TokenVec.push_back(this->getTokenWrapper()->getToken(Inst->getOperand(1))); } return TokenVec; From 48d0d0d307f40b5f58ddaa1c6dfef6d3080c9a90 Mon Sep 17 00:00:00 2001 From: ayush-qubit <37446683+ayush-qubit@users.noreply.github.com> Date: Mon, 21 Jun 2021 19:49:18 +0530 Subject: [PATCH 10/10] Delete .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index d163863..0000000 --- a/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build/ \ No newline at end of file