BPFInstPrinter.cpp revision 283625
1296633Sdes//===-- BPFInstPrinter.cpp - Convert BPF MCInst to asm syntax -------------===// 276259Sgreen// 376259Sgreen// The LLVM Compiler Infrastructure 476259Sgreen// 576259Sgreen// This file is distributed under the University of Illinois Open Source 676259Sgreen// License. See LICENSE.TXT for details. 776259Sgreen// 876259Sgreen//===----------------------------------------------------------------------===// 976259Sgreen// 1076259Sgreen// This class prints an BPF MCInst to a .s file. 1176259Sgreen// 1276259Sgreen//===----------------------------------------------------------------------===// 1376259Sgreen 1476259Sgreen#include "BPF.h" 1576259Sgreen#include "BPFInstPrinter.h" 1676259Sgreen#include "llvm/MC/MCAsmInfo.h" 1776259Sgreen#include "llvm/MC/MCExpr.h" 1876259Sgreen#include "llvm/MC/MCInst.h" 1976259Sgreen#include "llvm/MC/MCSymbol.h" 2076259Sgreen#include "llvm/Support/ErrorHandling.h" 2176259Sgreen#include "llvm/Support/FormattedStream.h" 2276259Sgreenusing namespace llvm; 2376259Sgreen 2476259Sgreen#define DEBUG_TYPE "asm-printer" 2576259Sgreen 2676259Sgreen// Include the auto-generated portion of the assembly writer. 2776259Sgreen#include "BPFGenAsmWriter.inc" 2876259Sgreen 2976259Sgreenvoid BPFInstPrinter::printInst(const MCInst *MI, raw_ostream &O, 3076259Sgreen StringRef Annot, const MCSubtargetInfo &STI) { 3176259Sgreen printInstruction(MI, O); 3276259Sgreen printAnnotation(O, Annot); 3376259Sgreen} 3476259Sgreen 3576259Sgreenstatic void printExpr(const MCExpr *Expr, raw_ostream &O) { 3676259Sgreen#ifndef NDEBUG 3776259Sgreen const MCSymbolRefExpr *SRE; 38162852Sdes 39162852Sdes if (const MCBinaryExpr *BE = dyn_cast<MCBinaryExpr>(Expr)) 4076259Sgreen SRE = dyn_cast<MCSymbolRefExpr>(BE->getLHS()); 4192555Sdes else 42296633Sdes SRE = dyn_cast<MCSymbolRefExpr>(Expr); 43149749Sdes assert(SRE && "Unexpected MCExpr type."); 44126274Sdes 45137015Sdes MCSymbolRefExpr::VariantKind Kind = SRE->getKind(); 46181111Sdes 47181111Sdes assert(Kind == MCSymbolRefExpr::VK_None); 48226046Sdes#endif 49146998Sdes O << *Expr; 50181111Sdes} 51181111Sdes 52181111Sdesvoid BPFInstPrinter::printOperand(const MCInst *MI, unsigned OpNo, 53181111Sdes raw_ostream &O, const char *Modifier) { 54181111Sdes assert((Modifier == 0 || Modifier[0] == 0) && "No modifiers supported"); 55181111Sdes const MCOperand &Op = MI->getOperand(OpNo); 56181111Sdes if (Op.isReg()) { 57181111Sdes O << getRegisterName(Op.getReg()); 58181111Sdes } else if (Op.isImm()) { 59226046Sdes O << (int32_t)Op.getImm(); 60226046Sdes } else { 61226046Sdes assert(Op.isExpr() && "Expected an expression"); 62226046Sdes printExpr(Op.getExpr(), O); 63149749Sdes } 64204917Sdes} 65149749Sdes 66146998Sdesvoid BPFInstPrinter::printMemOperand(const MCInst *MI, int OpNo, raw_ostream &O, 67146998Sdes const char *Modifier) { 68146998Sdes const MCOperand &RegOp = MI->getOperand(OpNo); 69146998Sdes const MCOperand &OffsetOp = MI->getOperand(OpNo + 1); 70204917Sdes // offset 71215116Sdes if (OffsetOp.isImm()) 72226046Sdes O << formatDec(OffsetOp.getImm()); 73240075Sdes else 74146998Sdes assert(0 && "Expected an immediate"); 75181111Sdes 76181111Sdes // register 77204917Sdes assert(RegOp.isReg() && "Register operand not a register"); 78226046Sdes O << '(' << getRegisterName(RegOp.getReg()) << ')'; 79226046Sdes} 80 81void BPFInstPrinter::printImm64Operand(const MCInst *MI, unsigned OpNo, 82 raw_ostream &O) { 83 const MCOperand &Op = MI->getOperand(OpNo); 84 if (Op.isImm()) 85 O << (uint64_t)Op.getImm(); 86 else 87 O << Op; 88} 89