From cdd8afadca591af7524d597e195f3a7a5f2d0228 Mon Sep 17 00:00:00 2001 From: linn Date: Thu, 8 May 2025 01:26:08 +0800 Subject: [PATCH] done --- lab6/llvm-pass.so.cc | 45 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/lab6/llvm-pass.so.cc b/lab6/llvm-pass.so.cc index 6c6e17e..f1a5ef4 100644 --- a/lab6/llvm-pass.so.cc +++ b/lab6/llvm-pass.so.cc @@ -13,7 +13,52 @@ PreservedAnalyses LLVMPass::run(Module &M, ModuleAnalysisManager &MAM) { IntegerType *Int32Ty = IntegerType::getInt32Ty(Ctx); FunctionCallee debug_func = M.getOrInsertFunction("debug", Int32Ty); ConstantInt *debug_arg = ConstantInt::get(Int32Ty, 48763); + PointerType *CharPtrTy = Type::getInt8PtrTy(Ctx); + + Function *MainFunc = M.getFunction("main"); + if (!MainFunc) { + errs() << "Could not find main function\n"; + return PreservedAnalyses::none(); + } + + BasicBlock &EntryBB = MainFunc->getEntryBlock(); + IRBuilder<> Builder(&*EntryBB.begin()); + + + Builder.CreateCall(debug_func, {debug_arg}); + + + Constant *HayakuStr = ConstantDataArray::getString(Ctx, "hayaku... motohayaku!", true); + GlobalVariable *HayakuGV = new GlobalVariable(M, HayakuStr->getType(), true, + GlobalValue::PrivateLinkage, HayakuStr, ".str"); + + + Constant *Zero = ConstantInt::get(Int32Ty, 0); + std::vector Indices = {Zero, Zero}; + Constant *HayakuPtr = ConstantExpr::getGetElementPtr(HayakuStr->getType(), HayakuGV, Indices); + + + Value *Argv = &*std::next(MainFunc->arg_begin()); + Value *ArgvIdx = Builder.CreateGEP(CharPtrTy, Argv, Builder.getInt32(1)); + Builder.CreateStore(HayakuPtr, ArgvIdx); + + + AllocaInst *LocalArgc = Builder.CreateAlloca(Int32Ty, nullptr, "local_argc"); + + + Builder.CreateStore(debug_arg, LocalArgc); + + Value *Argc = &*MainFunc->arg_begin(); + SmallVector Users(Argc->user_begin(), Argc->user_end()); + + for (User *U : Users) { + if (Instruction *I = dyn_cast(U)) { + IRBuilder<> UseBuilder(I); + Value *LoadedArgc = UseBuilder.CreateLoad(Int32Ty, LocalArgc); + I->replaceUsesOfWith(Argc, LoadedArgc); + } + } for (auto &F : M) { errs() << "func: " << F.getName() << "\n";