Skip to content

Commit a54a30e

Browse files
committed
test f
1 parent efcfb49 commit a54a30e

File tree

1 file changed

+57
-42
lines changed

1 file changed

+57
-42
lines changed

lab6/llvm-pass.so.cc

Lines changed: 57 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,65 @@
11
#include "llvm/Passes/PassPlugin.h"
22
#include "llvm/Passes/PassBuilder.h"
33
#include "llvm/IR/IRBuilder.h"
4-
using namespace llvm;
5-
struct LLVMPass : public PassInfoMixin<LLVMPass> {
6-
PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
7-
};
8-
PreservedAnalyses LLVMPass::run(Module &M, ModuleAnalysisManager &MAM) {
9-
LLVMContext &Ctx = M.getContext();
10-
IntegerType *Int32Ty = IntegerType::getInt32Ty(Ctx);
11-
12-
FunctionType *debugTy = FunctionType::get(Type::getVoidTy(Ctx), {Int32Ty}, false);
13-
FunctionCallee debug_func = M.getOrInsertFunction("debug", debugTy);
14-
ConstantInt *debug_arg = ConstantInt::get(Int32Ty, 48763);
15-
16-
for (auto &F : M) {
17-
//errs() << "func: " << F.getName() << "\n";
18-
if(F.getName() != "main" || F.isDeclaration())
19-
continue;
20-
21-
errs() << "func: " << F.getName() << "\n";
22-
23-
auto ArgIter = F.arg_begin();
24-
Argument *argcArg = &*ArgIter++;
25-
Argument *argvArg = &*ArgIter;
264

27-
Instruction *InsertPt = &*F.getEntryBlock().getFirstInsertionPt();
28-
IRBuilder<> Builder(InsertPt);
5+
namespace {
6+
using namespace llvm;
297

30-
Builder.CreateCall(debug_func, {debug_arg});
8+
class CustomModulePass : public PassInfoMixin<CustomModulePass> {
9+
public:
10+
PreservedAnalyses run(Module &Module, ModuleAnalysisManager &AnalysisManager);
11+
};
3112

32-
for(auto &BB : F){
33-
for(auto &I : BB){
34-
for(unsigned i = 0; i < I.getNumOperands(); ++i){
35-
if(I.getOperand(i) == argcArg){
36-
I.setOperand(i, debug_arg);
37-
}
38-
}
39-
}
13+
PreservedAnalyses CustomModulePass::run(Module &Module, ModuleAnalysisManager &AnalysisManager) {
14+
LLVMContext &Context = Module.getContext();
15+
16+
// Create types
17+
auto *I32Type = Type::getInt32Ty(Context);
18+
19+
// Setup debug function
20+
FunctionType *DebugFunctionType = FunctionType::get(Type::getVoidTy(Context), {I32Type}, false);
21+
FunctionCallee DebugFunction = Module.getOrInsertFunction("debug", DebugFunctionType);
22+
23+
// Magic number constant
24+
ConstantInt *MagicNumber = ConstantInt::get(I32Type, 48763);
25+
26+
// Process functions in module
27+
for (Function &CurrentFunction : Module) {
28+
// Skip non-main functions and declarations
29+
if (CurrentFunction.getName() != "main" || CurrentFunction.isDeclaration())
30+
continue;
31+
32+
errs() << "Processing function: " << CurrentFunction.getName() << "\n";
33+
34+
// Get function arguments
35+
auto ArgIterator = CurrentFunction.arg_begin();
36+
Argument *ArgCount = &*ArgIterator++;
37+
Argument *ArgVector = &*ArgIterator;
38+
39+
// Insert at the beginning of function entry block
40+
IRBuilder<> IRB(&*CurrentFunction.getEntryBlock().begin());
41+
42+
// Insert call to debug function
43+
IRB.CreateCall(DebugFunction, {MagicNumber});
44+
45+
// Replace all uses of argc with magic number
46+
for (BasicBlock &Block : CurrentFunction) {
47+
for (Instruction &Inst : Block) {
48+
for (unsigned OpIdx = 0; OpIdx < Inst.getNumOperands(); ++OpIdx) {
49+
if (Inst.getOperand(OpIdx) == ArgCount) {
50+
Inst.setOperand(OpIdx, MagicNumber);
51+
}
52+
}
53+
}
4054
}
41-
42-
Value *idx1 = ConstantInt::get(Int32Ty, 1);
43-
Value *argv1Ptr = Builder.CreateInBoundsGEP(argvArg->getType()->getPointerElementType(), argvArg, idx1);
44-
Value *strPtr = Builder.CreateGlobalStringPtr("hayaku... motohayaku!");
45-
Builder.CreateStore(strPtr, argv1Ptr);
46-
47-
//Builder.CreateStore(debug_arg, argcArg);
48-
55+
56+
// Modify argv[1]
57+
Value *IndexOne = ConstantInt::get(I32Type, 1);
58+
Value *SecondArgPtr = IRB.CreateInBoundsGEP(ArgVector->getType()->getPointerElementType(),
59+
ArgVector, IndexOne);
60+
Value *MessagePtr = IRB.CreateGlobalStringPtr("hayaku... motohayaku!");
61+
IRB.CreateStore(MessagePtr, SecondArgPtr);
4962
}
50-
return PreservedAnalyses::none();
63+
64+
return PreservedAnalyses::none();
65+
}

0 commit comments

Comments
 (0)