1 //===-- BPFAsmPrinter.cpp - BPF LLVM assembly writer ----------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file contains a printer that converts from our internal representation 11 // of machine-dependent LLVM code to the BPF assembly language. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "BPF.h" 16 #include "BPFInstrInfo.h" 17 #include "BPFMCInstLower.h" 18 #include "BPFTargetMachine.h" 19 #include "InstPrinter/BPFInstPrinter.h" 20 #include "llvm/CodeGen/AsmPrinter.h" 21 #include "llvm/CodeGen/MachineModuleInfo.h" 22 #include "llvm/CodeGen/MachineFunctionPass.h" 23 #include "llvm/CodeGen/MachineConstantPool.h" 24 #include "llvm/CodeGen/MachineInstr.h" 25 #include "llvm/MC/MCAsmInfo.h" 26 #include "llvm/MC/MCInst.h" 27 #include "llvm/MC/MCStreamer.h" 28 #include "llvm/MC/MCSymbol.h" 29 #include "llvm/Support/TargetRegistry.h" 30 #include "llvm/Support/raw_ostream.h" 31 using namespace llvm; 32 33 #define DEBUG_TYPE "asm-printer" 34 35 namespace { 36 class BPFAsmPrinter : public AsmPrinter { 37 public: 38 explicit BPFAsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer) 39 : AsmPrinter(TM, std::move(Streamer)) {} 40 41 const char *getPassName() const override { return "BPF Assembly Printer"; } 42 43 void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O, 44 const char *Modifier = nullptr); 45 void EmitInstruction(const MachineInstr *MI) override; 46 }; 47 } 48 49 void BPFAsmPrinter::printOperand(const MachineInstr *MI, int OpNum, 50 raw_ostream &O, const char *Modifier) { 51 const MachineOperand &MO = MI->getOperand(OpNum); 52 53 switch (MO.getType()) { 54 case MachineOperand::MO_Register: 55 O << BPFInstPrinter::getRegisterName(MO.getReg()); 56 break; 57 58 case MachineOperand::MO_Immediate: 59 O << MO.getImm(); 60 break; 61 62 case MachineOperand::MO_MachineBasicBlock: 63 O << *MO.getMBB()->getSymbol(); 64 break; 65 66 case MachineOperand::MO_GlobalAddress: 67 O << *getSymbol(MO.getGlobal()); 68 break; 69 70 default: 71 llvm_unreachable("<unknown operand type>"); 72 } 73 } 74 75 void BPFAsmPrinter::EmitInstruction(const MachineInstr *MI) { 76 77 BPFMCInstLower MCInstLowering(OutContext, *this); 78 79 MCInst TmpInst; 80 MCInstLowering.Lower(MI, TmpInst); 81 EmitToStreamer(*OutStreamer, TmpInst); 82 } 83 84 // Force static initialization. 85 extern "C" void LLVMInitializeBPFAsmPrinter() { 86 RegisterAsmPrinter<BPFAsmPrinter> X(TheBPFleTarget); 87 RegisterAsmPrinter<BPFAsmPrinter> Y(TheBPFbeTarget); 88 RegisterAsmPrinter<BPFAsmPrinter> Z(TheBPFTarget); 89 } 90