#include "llvm/IR/Constants.h" #include "llvm/IR/Function.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/InstIterator.h" #include "llvm/IR/Module.h" #include "llvm/Pass.h" #include using namespace llvm; namespace instrument { #define RET 1 #define BR 2 #define ADD 13 /// + #define SUB 15 /// - #define MUL 17 /// * #define SDIV 20 /// / #define SREM 23 /// % #define ALLOCA 31 #define LOAD 32 #define STORE 33 #define ICMP 53 #define CALL 56 #define DSE_Init "__DSE_Init__" #define DSE_Alloca "__DSE_Alloca__" #define DSE_Store "__DSE_Store__" #define DSE_Load "__DSE_Load__" #define DSE_ICmp "__DSE_ICmp__" #define DSE_Label "__DSE_Label__" #define DSE_Loop "__DSE_Loop__" #define DSE_BinOP "__DSE_BinOp__" #define DSE_Branch "__DSE_Branch__" #define DSE_Const "__DSE_Const__" #define DSE_Register "__DSE_Register__" int RegisterID = 0; std::map RegisterMap; int BranchID = 0; std::map BranchMap; int getRegisterID(Value *I) { /// 找当前地址的ID,没有则分配一个 if (RegisterMap.find(I) == RegisterMap.end()) { /// 为地址 *I 分配一个 ID RegisterMap[I] = RegisterID; return RegisterID++; } else { return RegisterMap[I]; } } int getBranchID(Value *I) { if (BranchMap.find(I) == BranchMap.end()) { BranchMap[I] = BranchID; return BranchID++; } else { return BranchMap[I]; } } /// 插桩,详细可以看官网文档 /// https://releases.llvm.org/14.0.0/docs/WritingAnLLVMPass.html struct Instrument : public FunctionPass { static char ID; static const char *checkFunctionName; Instrument() : FunctionPass(ID) {} bool runOnFunction(Function &F) override; }; } // namespace instrument