LLVM MachineFunctionPass

#48 · open · 1 comments

View on GitHub ↗

jmpews

## LLVM MachineFunctionPass ## Prologue IR 层的 pass 有 FunctionPass 和 ModulePass, 但是对于特定 Target / Triple 下的更细粒度的控制, IR 则是无能为力, 这时候需要在 MIR 层做一些事情, MIR 层的 pass 可以使用 MachineFunctionPass #### 1. MachineFunctionPass 基本结构 ``` class TrampolineMIR : public MachineFunctionPass { public: static char ID; TrampolineMIR() : MachineFunctionPass(ID) { errs() << "TrampolineMIR initialized !!!\n"; } bool runOnMachineFunctionExtra(MachineFunction &MF) { } } char TrampolineMIR::ID = 0; FunctionPass *llvm::createTrampolineMIR() { return new TrampolineMIR(); } ``` #### 2. 重写/控制 MI 指令 ``` void transformInstruction(MachineInstr &MI) { // dbgs() << "AArch64 Opcdoe: " << MI.getOpcode() << "\n"; switch (MI.getOpcode()) { case AArch64::ADRP: case AArch64::ADDXri: case AArch64::LDRXui: case AArch64::BR: { dbgs() << "Origin MI:\t" << MI; unsigned NumOperandsToProcess = MI.getNumOperands(); for (unsigned i = 0; i != NumOperandsToProcess; ++i) { MachineOperand &MO = MI.getOperand(i); if (!MO.isReg()) continue; unsigned Reg = MO.getReg(); if (!TargetRegisterInfo::isVirtualRegister(Reg)) return; unsigned NewReg = AArch64::X17; MO.setReg(NewReg); Changed = true; } dbgs() << "Changed MI:\t" << MI; }; break; default: break; } } bool processMachineBasicBlock(MachineBasicBlock *MBB) { for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end(); I != E;) { MachineInstr &MI = *I++; if (&MI) { transformInstruction(MI); Changed = true; } } return Changed; } bool runOnMachineFunctionExtra(MachineFunction &MF) { Changed = false; TRI = MF.getSubtarget().getRegisterInfo(); TII = MF.getSubtarget().getInstrInfo(); MRI = &MF.getRegInfo(); errs() << "List of function calls:" << "::" << MF.getName() << "\n"; if (MF.getName() != "_Z3addii") return false; // Just check things on a one-block-at-a-time basis. for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) processMachineBasicBlock(&*I); return Changed; } ```

Comments

wangjieest

llvm 新增了 asm goto 支持。不知道可不可以直接支持 detours/hook之类的