MCInst.h revision 65c060064d129e1bacc9204fd032fe81c4c669c4
133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org//===-- llvm/MC/MCInst.h - MCInst class -------------------------*- C++ -*-===//
233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org//
333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org//                     The LLVM Compiler Infrastructure
433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org//
533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// This file is distributed under the University of Illinois Open Source
633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// License. See LICENSE.TXT for details.
733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org//
833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org//===----------------------------------------------------------------------===//
933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org//
1033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// This file contains the declaration of the MCInst and MCOperand classes, which
1133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// is the basic representation used to represent low-level machine code
1233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// instructions.
1333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org//
1433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org//===----------------------------------------------------------------------===//
1533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
1633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#ifndef LLVM_MC_MCINST_H
1733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#define LLVM_MC_MCINST_H
1833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
1933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#include "llvm/ADT/SmallVector.h"
2033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#include "llvm/Support/DataTypes.h"
2133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#include "llvm/Support/DebugLoc.h"
2233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
2333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgnamespace llvm {
2433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgclass raw_ostream;
2533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgclass MCAsmInfo;
2633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgclass MCExpr;
2733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
2833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org/// MCOperand - Instances of this class represent operands of the MCInst class.
2933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org/// This is a simple discriminated union.
3033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgclass MCOperand {
3133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  enum MachineOperandType {
3233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    kInvalid,                 ///< Uninitialized.
3333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    kRegister,                ///< Register operand.
3433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    kImmediate,               ///< Immediate operand.
3533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    kMBBLabel,                ///< Basic block label.
3633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    kExpr                     ///< Relocatable immediate operand.
37285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  };
3833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  unsigned char Kind;
3933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
4033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  union {
4133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    unsigned RegVal;
4233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    int64_t ImmVal;
4333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    const MCExpr *ExprVal;
4433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    struct {
4533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      unsigned FunctionNo;
4633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      unsigned BlockNo;
4733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    } MBBLabel;
4833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  };
4933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgpublic:
5033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
5133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  MCOperand() : Kind(kInvalid) {}
5233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  MCOperand(const MCOperand &RHS) { *this = RHS; }
5333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
5433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  bool isValid() const { return Kind != kInvalid; }
5533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  bool isReg() const { return Kind == kRegister; }
5633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  bool isImm() const { return Kind == kImmediate; }
57285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  bool isMBBLabel() const { return Kind == kMBBLabel; }
58285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  bool isExpr() const { return Kind == kExpr; }
5933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
6033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  /// getReg - Returns the register number.
6133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  unsigned getReg() const {
6233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    assert(isReg() && "This is not a register operand!");
6333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return RegVal;
6433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
6533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
6633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  /// setReg - Set the register number.
6733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  void setReg(unsigned Reg) {
6833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    assert(isReg() && "This is not a register operand!");
6933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    RegVal = Reg;
7033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
7133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
7233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  int64_t getImm() const {
7333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    assert(isImm() && "This is not an immediate");
7433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return ImmVal;
7533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
7633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  void setImm(int64_t Val) {
7733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    assert(isImm() && "This is not an immediate");
7833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    ImmVal = Val;
7933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
8033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
8133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  unsigned getMBBLabelFunction() const {
8233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    assert(isMBBLabel() && "This is not a machine basic block");
8333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return MBBLabel.FunctionNo;
8433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
8533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  unsigned getMBBLabelBlock() const {
8633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    assert(isMBBLabel() && "This is not a machine basic block");
8733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return MBBLabel.BlockNo;
8833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
8933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
9033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  const MCExpr *getExpr() const {
9133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    assert(isExpr() && "This is not an expression");
9233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return ExprVal;
9333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
9433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  void setExpr(const MCExpr *Val) {
9533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    assert(isExpr() && "This is not an expression");
9633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    ExprVal = Val;
9733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
9833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
9933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  static MCOperand CreateReg(unsigned Reg) {
10033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    MCOperand Op;
10133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    Op.Kind = kRegister;
10233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    Op.RegVal = Reg;
10333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return Op;
10433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
10533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  static MCOperand CreateImm(int64_t Val) {
10633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    MCOperand Op;
10733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    Op.Kind = kImmediate;
10833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    Op.ImmVal = Val;
10933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return Op;
11033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
11133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  static MCOperand CreateMBBLabel(unsigned Fn, unsigned MBB) {
11233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    MCOperand Op;
11333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    Op.Kind = kMBBLabel;
11433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    Op.MBBLabel.FunctionNo = Fn;
11533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    Op.MBBLabel.BlockNo = MBB;
11633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return Op;
11733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
11833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  static MCOperand CreateExpr(const MCExpr *Val) {
11933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    MCOperand Op;
12033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    Op.Kind = kExpr;
12133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    Op.ExprVal = Val;
12233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return Op;
12333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
12433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
12533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  void print(raw_ostream &OS, const MCAsmInfo *MAI) const;
12633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  void dump() const;
12733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org};
12833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
12933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
13033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org/// MCInst - Instances of this class represent a single low-level machine
13133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org/// instruction.
13233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgclass MCInst {
13333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  unsigned Opcode;
13433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  SmallVector<MCOperand, 8> Operands;
13533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
13633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  // FIXME: This is a hack!
13733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  DebugLoc Loc;
13833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgpublic:
13933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  MCInst() : Opcode(~0U) {}
14033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
14133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  void setOpcode(unsigned Op) { Opcode = Op; }
14233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
14333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  unsigned getOpcode() const { return Opcode; }
14433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
14533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  void setDebugLoc(DebugLoc L) { Loc = L; }
14633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  DebugLoc getDebugLoc() const { return Loc; }
14733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
14833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  const MCOperand &getOperand(unsigned i) const { return Operands[i]; }
14933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  MCOperand &getOperand(unsigned i) { return Operands[i]; }
15033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  unsigned getNumOperands() const { return Operands.size(); }
15133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
15233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  void addOperand(const MCOperand &Op) {
15333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    Operands.push_back(Op);
15433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
15533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
15633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  void print(raw_ostream &OS, const MCAsmInfo *MAI) const;
15733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  void dump() const;
15833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org};
15933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
16033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
16133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org} // end namespace llvm
16233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
16333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#endif
16433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org