xref: /freebsd/contrib/llvm-project/llvm/lib/MC/MCInst.cpp (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
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