diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/MC/MCInst.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/MC/MCInst.cpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/MC/MCInst.cpp b/contrib/llvm-project/llvm/lib/MC/MCInst.cpp new file mode 100644 index 000000000000..f6f6edee5822 --- /dev/null +++ b/contrib/llvm-project/llvm/lib/MC/MCInst.cpp @@ -0,0 +1,98 @@ +//===- lib/MC/MCInst.cpp - MCInst implementation --------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/MC/MCInst.h" +#include "llvm/Config/llvm-config.h" +#include "llvm/MC/MCExpr.h" +#include "llvm/MC/MCInstPrinter.h" +#include "llvm/Support/Casting.h" +#include "llvm/Support/Compiler.h" +#include "llvm/Support/Debug.h" +#include "llvm/Support/raw_ostream.h" + +using namespace llvm; + +void MCOperand::print(raw_ostream &OS) const { + OS << "<MCOperand "; + if (!isValid()) + OS << "INVALID"; + else if (isReg()) + OS << "Reg:" << getReg(); + else if (isImm()) + OS << "Imm:" << getImm(); + else if (isFPImm()) + OS << "FPImm:" << getFPImm(); + else if (isExpr()) { + OS << "Expr:(" << *getExpr() << ")"; + } else if (isInst()) { + OS << "Inst:(" << *getInst() << ")"; + } else + OS << "UNDEFINED"; + OS << ">"; +} + +bool MCOperand::evaluateAsConstantImm(int64_t &Imm) const { + if (isImm()) { + Imm = getImm(); + return true; + } + return false; +} + +bool MCOperand::isBareSymbolRef() const { + assert(isExpr() && + "isBareSymbolRef expects only expressions"); + const MCExpr *Expr = getExpr(); + MCExpr::ExprKind Kind = getExpr()->getKind(); + return Kind == MCExpr::SymbolRef && + cast<MCSymbolRefExpr>(Expr)->getKind() == MCSymbolRefExpr::VK_None; +} + +#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) +LLVM_DUMP_METHOD void MCOperand::dump() const { + print(dbgs()); + dbgs() << "\n"; +} +#endif + +void MCInst::print(raw_ostream &OS) const { + OS << "<MCInst " << getOpcode(); + for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { + OS << " "; + getOperand(i).print(OS); + } + OS << ">"; +} + +void MCInst::dump_pretty(raw_ostream &OS, const MCInstPrinter *Printer, + StringRef Separator) const { + StringRef InstName = Printer ? Printer->getOpcodeName(getOpcode()) : ""; + dump_pretty(OS, InstName, Separator); +} + +void MCInst::dump_pretty(raw_ostream &OS, StringRef Name, + StringRef Separator) const { + OS << "<MCInst #" << getOpcode(); + + // Show the instruction opcode name if we have it. + if (!Name.empty()) + OS << ' ' << Name; + + for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { + OS << Separator; + getOperand(i).print(OS); + } + OS << ">"; +} + +#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) +LLVM_DUMP_METHOD void MCInst::dump() const { + print(dbgs()); + dbgs() << "\n"; +} +#endif |