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 getInst()->print(OS, RegInfo); 42 OS << ")"; 43 } else 44 OS << "UNDEFINED"; 45 OS << ">"; 46 } 47 48 bool MCOperand::evaluateAsConstantImm(int64_t &Imm) const { 49 if (isImm()) { 50 Imm = getImm(); 51 return true; 52 } 53 return false; 54 } 55 56 bool MCOperand::isBareSymbolRef() const { 57 assert(isExpr() && 58 "isBareSymbolRef expects only expressions"); 59 const MCExpr *Expr = getExpr(); 60 MCExpr::ExprKind Kind = getExpr()->getKind(); 61 return Kind == MCExpr::SymbolRef && 62 cast<MCSymbolRefExpr>(Expr)->getKind() == MCSymbolRefExpr::VK_None; 63 } 64 65 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 66 LLVM_DUMP_METHOD void MCOperand::dump() const { 67 print(dbgs()); 68 dbgs() << "\n"; 69 } 70 #endif 71 72 void MCInst::print(raw_ostream &OS, const MCRegisterInfo *RegInfo) const { 73 OS << "<MCInst " << getOpcode(); 74 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 75 OS << " "; 76 getOperand(i).print(OS, RegInfo); 77 } 78 OS << ">"; 79 } 80 81 void MCInst::dump_pretty(raw_ostream &OS, const MCInstPrinter *Printer, 82 StringRef Separator, 83 const MCRegisterInfo *RegInfo) const { 84 StringRef InstName = Printer ? Printer->getOpcodeName(getOpcode()) : ""; 85 dump_pretty(OS, InstName, Separator, RegInfo); 86 } 87 88 void MCInst::dump_pretty(raw_ostream &OS, StringRef Name, StringRef Separator, 89 const MCRegisterInfo *RegInfo) const { 90 OS << "<MCInst #" << getOpcode(); 91 92 // Show the instruction opcode name if we have it. 93 if (!Name.empty()) 94 OS << ' ' << Name; 95 96 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 97 OS << Separator; 98 getOperand(i).print(OS, RegInfo); 99 } 100 OS << ">"; 101 } 102 103 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 104 LLVM_DUMP_METHOD void MCInst::dump() const { 105 print(dbgs()); 106 dbgs() << "\n"; 107 } 108 #endif 109