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