1*0b57cec5SDimitry Andric //===- lib/MC/MCInst.cpp - MCInst implementation --------------------------===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andric #include "llvm/MC/MCInst.h" 10*0b57cec5SDimitry Andric #include "llvm/Config/llvm-config.h" 11*0b57cec5SDimitry Andric #include "llvm/MC/MCExpr.h" 12*0b57cec5SDimitry Andric #include "llvm/MC/MCInstPrinter.h" 13*0b57cec5SDimitry Andric #include "llvm/Support/Casting.h" 14*0b57cec5SDimitry Andric #include "llvm/Support/Compiler.h" 15*0b57cec5SDimitry Andric #include "llvm/Support/Debug.h" 16*0b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 17*0b57cec5SDimitry Andric 18*0b57cec5SDimitry Andric using namespace llvm; 19*0b57cec5SDimitry Andric 20*0b57cec5SDimitry Andric void MCOperand::print(raw_ostream &OS) const { 21*0b57cec5SDimitry Andric OS << "<MCOperand "; 22*0b57cec5SDimitry Andric if (!isValid()) 23*0b57cec5SDimitry Andric OS << "INVALID"; 24*0b57cec5SDimitry Andric else if (isReg()) 25*0b57cec5SDimitry Andric OS << "Reg:" << getReg(); 26*0b57cec5SDimitry Andric else if (isImm()) 27*0b57cec5SDimitry Andric OS << "Imm:" << getImm(); 28*0b57cec5SDimitry Andric else if (isFPImm()) 29*0b57cec5SDimitry Andric OS << "FPImm:" << getFPImm(); 30*0b57cec5SDimitry Andric else if (isExpr()) { 31*0b57cec5SDimitry Andric OS << "Expr:(" << *getExpr() << ")"; 32*0b57cec5SDimitry Andric } else if (isInst()) { 33*0b57cec5SDimitry Andric OS << "Inst:(" << *getInst() << ")"; 34*0b57cec5SDimitry Andric } else 35*0b57cec5SDimitry Andric OS << "UNDEFINED"; 36*0b57cec5SDimitry Andric OS << ">"; 37*0b57cec5SDimitry Andric } 38*0b57cec5SDimitry Andric 39*0b57cec5SDimitry Andric bool MCOperand::evaluateAsConstantImm(int64_t &Imm) const { 40*0b57cec5SDimitry Andric if (isImm()) { 41*0b57cec5SDimitry Andric Imm = getImm(); 42*0b57cec5SDimitry Andric return true; 43*0b57cec5SDimitry Andric } 44*0b57cec5SDimitry Andric return false; 45*0b57cec5SDimitry Andric } 46*0b57cec5SDimitry Andric 47*0b57cec5SDimitry Andric bool MCOperand::isBareSymbolRef() const { 48*0b57cec5SDimitry Andric assert(isExpr() && 49*0b57cec5SDimitry Andric "isBareSymbolRef expects only expressions"); 50*0b57cec5SDimitry Andric const MCExpr *Expr = getExpr(); 51*0b57cec5SDimitry Andric MCExpr::ExprKind Kind = getExpr()->getKind(); 52*0b57cec5SDimitry Andric return Kind == MCExpr::SymbolRef && 53*0b57cec5SDimitry Andric cast<MCSymbolRefExpr>(Expr)->getKind() == MCSymbolRefExpr::VK_None; 54*0b57cec5SDimitry Andric } 55*0b57cec5SDimitry Andric 56*0b57cec5SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 57*0b57cec5SDimitry Andric LLVM_DUMP_METHOD void MCOperand::dump() const { 58*0b57cec5SDimitry Andric print(dbgs()); 59*0b57cec5SDimitry Andric dbgs() << "\n"; 60*0b57cec5SDimitry Andric } 61*0b57cec5SDimitry Andric #endif 62*0b57cec5SDimitry Andric 63*0b57cec5SDimitry Andric void MCInst::print(raw_ostream &OS) const { 64*0b57cec5SDimitry Andric OS << "<MCInst " << getOpcode(); 65*0b57cec5SDimitry Andric for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 66*0b57cec5SDimitry Andric OS << " "; 67*0b57cec5SDimitry Andric getOperand(i).print(OS); 68*0b57cec5SDimitry Andric } 69*0b57cec5SDimitry Andric OS << ">"; 70*0b57cec5SDimitry Andric } 71*0b57cec5SDimitry Andric 72*0b57cec5SDimitry Andric void MCInst::dump_pretty(raw_ostream &OS, const MCInstPrinter *Printer, 73*0b57cec5SDimitry Andric StringRef Separator) const { 74*0b57cec5SDimitry Andric StringRef InstName = Printer ? Printer->getOpcodeName(getOpcode()) : ""; 75*0b57cec5SDimitry Andric dump_pretty(OS, InstName, Separator); 76*0b57cec5SDimitry Andric } 77*0b57cec5SDimitry Andric 78*0b57cec5SDimitry Andric void MCInst::dump_pretty(raw_ostream &OS, StringRef Name, 79*0b57cec5SDimitry Andric StringRef Separator) const { 80*0b57cec5SDimitry Andric OS << "<MCInst #" << getOpcode(); 81*0b57cec5SDimitry Andric 82*0b57cec5SDimitry Andric // Show the instruction opcode name if we have it. 83*0b57cec5SDimitry Andric if (!Name.empty()) 84*0b57cec5SDimitry Andric OS << ' ' << Name; 85*0b57cec5SDimitry Andric 86*0b57cec5SDimitry Andric for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 87*0b57cec5SDimitry Andric OS << Separator; 88*0b57cec5SDimitry Andric getOperand(i).print(OS); 89*0b57cec5SDimitry Andric } 90*0b57cec5SDimitry Andric OS << ">"; 91*0b57cec5SDimitry Andric } 92*0b57cec5SDimitry Andric 93*0b57cec5SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 94*0b57cec5SDimitry Andric LLVM_DUMP_METHOD void MCInst::dump() const { 95*0b57cec5SDimitry Andric print(dbgs()); 96*0b57cec5SDimitry Andric dbgs() << "\n"; 97*0b57cec5SDimitry Andric } 98*0b57cec5SDimitry Andric #endif 99