diff options
Diffstat (limited to 'llvm/lib/MC/MCInst.cpp')
| -rw-r--r-- | llvm/lib/MC/MCInst.cpp | 98 | 
1 files changed, 98 insertions, 0 deletions
diff --git a/llvm/lib/MC/MCInst.cpp b/llvm/lib/MC/MCInst.cpp new file mode 100644 index 0000000000000..f6f6edee5822e --- /dev/null +++ b/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  | 
