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