Provide support for detecting if the Win32 imaghlp and psapi libraries
[oota-llvm.git] / include / llvm / CodeGen / MachineInstr.h
index 0cf822aa0e85104c979de514fbde282b14aeb474..35092b5536f3a997c301f9b1a15d1842b8ddffd9 100644 (file)
@@ -32,8 +32,6 @@ class GlobalValue;
 template <typename T> struct ilist_traits;
 template <typename T> struct ilist;
 
-typedef short MachineOpCode;
-
 //===----------------------------------------------------------------------===//
 // class MachineOperand
 //
@@ -44,7 +42,7 @@ private:
   // Bit fields of the flags variable used for different operand properties
   enum {
     DEFFLAG     = 0x01,       // this is a def of the operand
-    USEFLAG     = 0x02,       // this is a use of the operand
+    USEFLAG     = 0x02        // this is a use of the operand
   };
 
 public:
@@ -73,68 +71,24 @@ public:
 
 private:
   union {
-    GlobalValue *GV;    // LLVM global for MO_GlobalAddress.
-    int64_t immedVal;   // Constant value for an explicit constant
-    MachineBasicBlock *MBB;     // For MO_MachineBasicBlock type
-    const char *SymbolName;     // For MO_ExternalSymbol type
+    GlobalValue *GV;          // For MO_GlobalAddress.
+    MachineBasicBlock *MBB;   // For MO_MachineBasicBlock.
+    const char *SymbolName;   // For MO_ExternalSymbol.
+    unsigned RegNo;           // For MO_Register.
+    int64_t immedVal;         // For MO_Immediate and MO_*Index.
   } contents;
 
   char flags;                   // see bit field definitions above
   MachineOperandType opType:8;  // Pack into 8 bits efficiently after flags.
-  union {
-    int regNum;     // register number for an explicit register
-    int offset;     // Offset to address of global or external, only
-                    // valid for MO_GlobalAddress, MO_ExternalSym
-                    // and MO_ConstantPoolIndex
-  } extra;
-
-  void zeroContents() {
-    contents.immedVal = 0;
-    extra.offset = 0;
-  }
-
-  MachineOperand(int64_t ImmVal) : flags(0), opType(MO_Immediate) {
-    contents.immedVal = ImmVal;
-    extra.offset = 0;
-  }
-
-  MachineOperand(unsigned Idx, MachineOperandType OpTy)
-    : flags(0), opType(OpTy) {
-    contents.immedVal = Idx;
-    extra.offset = 0;
-  }
   
-  MachineOperand(int Reg, MachineOperandType OpTy, UseType UseTy)
-    : flags(UseTy), opType(OpTy) {
-    zeroContents();
-    extra.regNum = Reg;
-  }
-
-  MachineOperand(GlobalValue *V, int Offset = 0)
-    : flags(MachineOperand::Use), opType(MachineOperand::MO_GlobalAddress) {
-    contents.GV = V;
-    extra.offset = Offset;
-  }
-
-  MachineOperand(MachineBasicBlock *mbb)
-    : flags(0), opType(MO_MachineBasicBlock) {
-    zeroContents ();
-    contents.MBB = mbb;
-  }
-
-  MachineOperand(const char *SymName, int Offset)
-    : flags(0), opType(MO_ExternalSymbol) {
-    zeroContents ();
-    contents.SymbolName = SymName;
-    extra.offset = Offset;
-  }
+  /// offset - Offset to address of global or external, only valid for
+  /// MO_GlobalAddress, MO_ExternalSym and MO_ConstantPoolIndex
+  int offset;
 
+  MachineOperand() {}
 public:
-  MachineOperand(const MachineOperand &M)
-    : flags(M.flags), opType(M.opType) {
-    zeroContents ();
-    contents = M.contents;
-    extra = M.extra;
+  MachineOperand(const MachineOperand &M) {
+    *this = M;
   }
 
   ~MachineOperand() {}
@@ -143,7 +97,7 @@ public:
     contents = MO.contents;
     flags    = MO.flags;
     opType   = MO.opType;
-    extra    = MO.extra;
+    offset   = MO.offset;
     return *this;
   }
 
@@ -197,7 +151,7 @@ public:
   int getOffset() const {
     assert((isGlobalAddress() || isExternalSymbol() || isConstantPoolIndex()) &&
         "Wrong MachineOperand accessor");
-    return extra.offset;
+    return offset;
   }
   const char *getSymbolName() const {
     assert(isExternalSymbol() && "Wrong MachineOperand accessor");
@@ -216,14 +170,14 @@ public:
   ///
   unsigned getReg() const {
     assert(isRegister() && "This is not a register operand!");
-    return extra.regNum;
+    return contents.RegNo;
   }
 
   /// MachineOperand mutators.
   ///
   void setReg(unsigned Reg) {
     assert(isRegister() && "This is not a register operand!");
-    extra.regNum = Reg;
+    contents.RegNo = Reg;
   }
 
   void setImmedValue(int64_t immVal) {
@@ -235,7 +189,7 @@ public:
     assert((isGlobalAddress() || isExternalSymbol() || isConstantPoolIndex() ||
             isJumpTableIndex()) &&
         "Wrong MachineOperand accessor");
-    extra.offset = Offset;
+    offset = Offset;
   }
   
   /// ChangeToImmediate - Replace this operand with a new immediate operand of
@@ -251,7 +205,7 @@ public:
   /// the setReg method should be used.
   void ChangeToRegister(unsigned Reg) {
     opType = MO_Register;
-    extra.regNum = Reg;
+    contents.RegNo = Reg;
   }
 
   friend std::ostream& operator<<(std::ostream& os, const MachineOperand& mop);
@@ -261,35 +215,18 @@ public:
 
 
 //===----------------------------------------------------------------------===//
-// class MachineInstr
-//
-// Purpose:
-//   Representation of each machine instruction.
-//
-//   MachineOpCode must be an enum, defined separately for each target.
-//   E.g., It is defined in SparcInstructionSelection.h for the SPARC.
-//
-//  There are 2 kinds of operands:
-//
-//  (1) Explicit operands of the machine instruction in vector operands[]
-//
-//  (2) "Implicit operands" are values implicitly used or defined by the
-//      machine instruction, such as arguments to a CALL, return value of
-//      a CALL (if any), and return value of a RETURN.
-//===----------------------------------------------------------------------===//
-
+/// MachineInstr - Representation of each machine instruction.
+///
 class MachineInstr {
   short Opcode;                         // the opcode
-  std::vector<MachineOperand> operands; // the operands
+  std::vector<MachineOperand> Operands; // the operands
   MachineInstr* prev, *next;            // links for our intrusive list
   MachineBasicBlock* parent;            // pointer to the owning basic block
 
   // OperandComplete - Return true if it's illegal to add a new operand
   bool OperandsComplete() const;
 
-  //Constructor used by clone() method
   MachineInstr(const MachineInstr&);
-
   void operator=(const MachineInstr&); // DO NOT IMPLEMENT
 
   // Intrusive list support
@@ -297,12 +234,9 @@ class MachineInstr {
   friend struct ilist_traits<MachineInstr>;
 
 public:
-  /// MachineInstr ctor - This constructor only does a _reserve_ of the
-  /// operands, not a resize for them.  It is expected that if you use this that
-  /// you call add* methods below to fill up the operands, instead of the Set
-  /// methods.  Eventually, the "resizing" ctors will be phased out.
-  ///
-  MachineInstr(short Opcode, unsigned numOperands, bool XX, bool YY);
+  /// MachineInstr ctor - This constructor reserve's space for numOperand
+  /// operands.
+  MachineInstr(short Opcode, unsigned numOperands);
 
   /// MachineInstr ctor - Work exactly the same as the ctor above, except that
   /// the MachineInstr is created and added to the end of the specified basic
@@ -321,21 +255,21 @@ public:
 
   /// Access to explicit operands of the instruction.
   ///
-  unsigned getNumOperands() const { return operands.size(); }
+  unsigned getNumOperands() const { return Operands.size(); }
 
   const MachineOperand& getOperand(unsigned i) const {
     assert(i < getNumOperands() && "getOperand() out of range!");
-    return operands[i];
+    return Operands[i];
   }
   MachineOperand& getOperand(unsigned i) {
     assert(i < getNumOperands() && "getOperand() out of range!");
-    return operands[i];
+    return Operands[i];
   }
 
 
   /// clone - Create a copy of 'this' instruction that is identical in
   /// all ways except the the instruction has no parent, prev, or next.
-  MachineInstr* clone() const;
+  MachineInstr* clone() const { return new MachineInstr(*this); }
   
   /// removeFromParent - This method unlinks 'this' from the containing basic
   /// block, and returns it, but does not delete it.
@@ -355,70 +289,87 @@ public:
   friend std::ostream& operator<<(std::ostream& os, const MachineInstr& minstr);
 
   //===--------------------------------------------------------------------===//
-  // Accessors to add operands when building up machine instructions
+  // Accessors to add operands when building up machine instructions.
   //
 
-  /// addRegOperand - Add a symbolic virtual register reference...
+  /// addRegOperand - Add a register operand.
   ///
-  void addRegOperand(int reg,
+  void addRegOperand(unsigned Reg,
                      MachineOperand::UseType UTy = MachineOperand::Use) {
-    assert(!OperandsComplete() &&
-           "Trying to add an operand to a machine instr that is already done!");
-    operands.push_back(
-      MachineOperand(reg, MachineOperand::MO_Register, UTy));
+    MachineOperand &Op = AddNewOperand();
+    Op.opType = MachineOperand::MO_Register;
+    Op.flags = UTy;
+    Op.contents.RegNo = Reg;
+    Op.offset = 0;
   }
 
   /// addImmOperand - Add a zero extended constant argument to the
   /// machine instruction.
   ///
   void addImmOperand(int64_t Val) {
-    assert(!OperandsComplete() &&
-           "Trying to add an operand to a machine instr that is already done!");
-    operands.push_back(MachineOperand(Val));
+    MachineOperand &Op = AddNewOperand();
+    Op.opType = MachineOperand::MO_Immediate;
+    Op.flags = 0;
+    Op.contents.immedVal = Val;
+    Op.offset = 0;
   }
 
   void addMachineBasicBlockOperand(MachineBasicBlock *MBB) {
-    assert(!OperandsComplete() &&
-           "Trying to add an operand to a machine instr that is already done!");
-    operands.push_back(MachineOperand(MBB));
+    MachineOperand &Op = AddNewOperand();
+    Op.opType = MachineOperand::MO_MachineBasicBlock;
+    Op.flags = 0;
+    Op.contents.MBB = MBB;
+    Op.offset = 0;
   }
 
   /// addFrameIndexOperand - Add an abstract frame index to the instruction
   ///
   void addFrameIndexOperand(unsigned Idx) {
-    assert(!OperandsComplete() &&
-           "Trying to add an operand to a machine instr that is already done!");
-    operands.push_back(MachineOperand(Idx, MachineOperand::MO_FrameIndex));
+    MachineOperand &Op = AddNewOperand();
+    Op.opType = MachineOperand::MO_FrameIndex;
+    Op.flags = 0;
+    Op.contents.immedVal = Idx;
+    Op.offset = 0;
   }
 
   /// addConstantPoolndexOperand - Add a constant pool object index to the
   /// instruction.
   ///
-  void addConstantPoolIndexOperand(unsigned I, int Offset=0) {
-    assert(!OperandsComplete() &&
-           "Trying to add an operand to a machine instr that is already done!");
-    operands.push_back(MachineOperand(I, MachineOperand::MO_ConstantPoolIndex));
+  void addConstantPoolIndexOperand(unsigned Idx, int Offset) {
+    MachineOperand &Op = AddNewOperand();
+    Op.opType = MachineOperand::MO_ConstantPoolIndex;
+    Op.flags = 0;
+    Op.contents.immedVal = Idx;
+    Op.offset = Offset;
   }
 
   /// addJumpTableIndexOperand - Add a jump table object index to the
   /// instruction.
   ///
-  void addJumpTableIndexOperand(unsigned I) {
-    assert(!OperandsComplete() &&
-           "Trying to add an operand to a machine instr that is already done!");
-    operands.push_back(MachineOperand(I, MachineOperand::MO_JumpTableIndex));
+  void addJumpTableIndexOperand(unsigned Idx) {
+    MachineOperand &Op = AddNewOperand();
+    Op.opType = MachineOperand::MO_JumpTableIndex;
+    Op.flags = 0;
+    Op.contents.immedVal = Idx;
+    Op.offset = 0;
   }
   
   void addGlobalAddressOperand(GlobalValue *GV, int Offset) {
-    assert(!OperandsComplete() &&
-           "Trying to add an operand to a machine instr that is already done!");
-    operands.push_back(MachineOperand(GV, Offset));
+    MachineOperand &Op = AddNewOperand();
+    Op.opType = MachineOperand::MO_GlobalAddress;
+    Op.flags = 0;
+    Op.contents.GV = GV;
+    Op.offset = Offset;
   }
 
   /// addExternalSymbolOperand - Add an external symbol operand to this instr
   ///
   void addExternalSymbolOperand(const char *SymName) {
-    operands.push_back(MachineOperand(SymName, 0));
+    MachineOperand &Op = AddNewOperand();
+    Op.opType = MachineOperand::MO_ExternalSymbol;
+    Op.flags = 0;
+    Op.contents.SymbolName = SymName;
+    Op.offset = 0;
   }
 
   //===--------------------------------------------------------------------===//
@@ -433,7 +384,14 @@ public:
   /// fewer operand than it started with.
   ///
   void RemoveOperand(unsigned i) {
-    operands.erase(operands.begin()+i);
+    Operands.erase(Operands.begin()+i);
+  }
+private:
+  MachineOperand &AddNewOperand() {
+    assert(!OperandsComplete() &&
+           "Trying to add an operand to a machine instr that is already done!");
+    Operands.push_back(MachineOperand());
+    return Operands.back();
   }
 };