1*9880d681SAndroid Build Coastguard Worker //=-- BPFMCInstLower.cpp - Convert BPF MachineInstr to an MCInst ------------=// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file contains code to lower BPF MachineInstrs to their corresponding 11*9880d681SAndroid Build Coastguard Worker // MCInst records. 12*9880d681SAndroid Build Coastguard Worker // 13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker #include "BPFMCInstLower.h" 16*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/AsmPrinter.h" 17*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineBasicBlock.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineInstr.h" 19*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCAsmInfo.h" 20*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCContext.h" 21*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCExpr.h" 22*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInst.h" 23*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h" 24*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h" 25*9880d681SAndroid Build Coastguard Worker using namespace llvm; 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker MCSymbol * GetGlobalAddressSymbol(const MachineOperand & MO) const28*9880d681SAndroid Build Coastguard WorkerBPFMCInstLower::GetGlobalAddressSymbol(const MachineOperand &MO) const { 29*9880d681SAndroid Build Coastguard Worker return Printer.getSymbol(MO.getGlobal()); 30*9880d681SAndroid Build Coastguard Worker } 31*9880d681SAndroid Build Coastguard Worker LowerSymbolOperand(const MachineOperand & MO,MCSymbol * Sym) const32*9880d681SAndroid Build Coastguard WorkerMCOperand BPFMCInstLower::LowerSymbolOperand(const MachineOperand &MO, 33*9880d681SAndroid Build Coastguard Worker MCSymbol *Sym) const { 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker const MCExpr *Expr = MCSymbolRefExpr::create(Sym, Ctx); 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker if (!MO.isJTI() && MO.getOffset()) 38*9880d681SAndroid Build Coastguard Worker llvm_unreachable("unknown symbol op"); 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker return MCOperand::createExpr(Expr); 41*9880d681SAndroid Build Coastguard Worker } 42*9880d681SAndroid Build Coastguard Worker Lower(const MachineInstr * MI,MCInst & OutMI) const43*9880d681SAndroid Build Coastguard Workervoid BPFMCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const { 44*9880d681SAndroid Build Coastguard Worker OutMI.setOpcode(MI->getOpcode()); 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 47*9880d681SAndroid Build Coastguard Worker const MachineOperand &MO = MI->getOperand(i); 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker MCOperand MCOp; 50*9880d681SAndroid Build Coastguard Worker switch (MO.getType()) { 51*9880d681SAndroid Build Coastguard Worker default: 52*9880d681SAndroid Build Coastguard Worker MI->dump(); 53*9880d681SAndroid Build Coastguard Worker llvm_unreachable("unknown operand type"); 54*9880d681SAndroid Build Coastguard Worker case MachineOperand::MO_Register: 55*9880d681SAndroid Build Coastguard Worker // Ignore all implicit register operands. 56*9880d681SAndroid Build Coastguard Worker if (MO.isImplicit()) 57*9880d681SAndroid Build Coastguard Worker continue; 58*9880d681SAndroid Build Coastguard Worker MCOp = MCOperand::createReg(MO.getReg()); 59*9880d681SAndroid Build Coastguard Worker break; 60*9880d681SAndroid Build Coastguard Worker case MachineOperand::MO_Immediate: 61*9880d681SAndroid Build Coastguard Worker MCOp = MCOperand::createImm(MO.getImm()); 62*9880d681SAndroid Build Coastguard Worker break; 63*9880d681SAndroid Build Coastguard Worker case MachineOperand::MO_MachineBasicBlock: 64*9880d681SAndroid Build Coastguard Worker MCOp = MCOperand::createExpr( 65*9880d681SAndroid Build Coastguard Worker MCSymbolRefExpr::create(MO.getMBB()->getSymbol(), Ctx)); 66*9880d681SAndroid Build Coastguard Worker break; 67*9880d681SAndroid Build Coastguard Worker case MachineOperand::MO_RegisterMask: 68*9880d681SAndroid Build Coastguard Worker continue; 69*9880d681SAndroid Build Coastguard Worker case MachineOperand::MO_GlobalAddress: 70*9880d681SAndroid Build Coastguard Worker MCOp = LowerSymbolOperand(MO, GetGlobalAddressSymbol(MO)); 71*9880d681SAndroid Build Coastguard Worker break; 72*9880d681SAndroid Build Coastguard Worker } 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker OutMI.addOperand(MCOp); 75*9880d681SAndroid Build Coastguard Worker } 76*9880d681SAndroid Build Coastguard Worker } 77