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