X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FInstruction.h;h=0674f0ed1ab34193f6170df3c3b7939ef486e081;hb=2542d9a18304d60576158e635f6123f60bbd80ba;hp=71bb8e25a1d749764ae7b212a79107baf03aa127;hpb=b00c582b6d40e6b9ff2d1ed4f5eaf7930e792ace;p=oota-llvm.git diff --git a/include/llvm/Instruction.h b/include/llvm/Instruction.h index 71bb8e25a1d..0674f0ed1ab 100644 --- a/include/llvm/Instruction.h +++ b/include/llvm/Instruction.h @@ -1,7 +1,7 @@ -//===-- llvm/Instruction.h - Instruction class definition --------*- C++ -*--=// +//===-- llvm/Instruction.h - Instruction class definition -------*- C++ -*-===// // // This file contains the declaration of the Instruction class, which is the -// base class for all of the VM instructions. +// base class for all of the LLVM instructions. // //===----------------------------------------------------------------------===// @@ -9,82 +9,74 @@ #define LLVM_INSTRUCTION_H #include "llvm/User.h" - -class Type; -class BasicBlock; -class Method; -class MachineInstr; -class MachineCodeForVMInstr; +template struct ilist_traits; +template class SymbolTableListTraits; class Instruction : public User { BasicBlock *Parent; - unsigned iType; // InstructionType + Instruction *Prev, *Next; // Next and Prev links for our intrusive linked list + + void setNext(Instruction *N) { Next = N; } + void setPrev(Instruction *N) { Prev = N; } - MachineCodeForVMInstr* machineInstrVec; - friend class ValueHolder; - inline void setParent(BasicBlock *P) { Parent = P; } + friend class SymbolTableListTraits >; + void setParent(BasicBlock *P); +protected: + unsigned iType; // InstructionType: The opcode of the instruction + Instruction(const Type *Ty, unsigned iType, const std::string &Name = "", + Instruction *InsertBefore = 0); public: - Instruction(const Type *Ty, unsigned iType, const string &Name = ""); - virtual ~Instruction(); // Virtual dtor == good. + virtual ~Instruction() { + assert(Parent == 0 && "Instruction still embedded in basic block!"); + } // Specialize setName to handle symbol table majik... - virtual void setName(const string &name, SymbolTable *ST = 0); + virtual void setName(const std::string &name, SymbolTable *ST = 0); - // clone() - Create a copy of 'this' instruction that is identical in all ways - // except the following: - // * The instruction has no parent - // * The instruction has no name - // + /// clone() - Create a copy of 'this' instruction that is identical in all + /// ways except the following: + /// * The instruction has no parent + /// * The instruction has no name + /// virtual Instruction *clone() const = 0; // Accessor methods... // inline const BasicBlock *getParent() const { return Parent; } inline BasicBlock *getParent() { return Parent; } + + // getNext/Prev - Return the next or previous instruction in the list. The + // last node in the list is a terminator instruction. + Instruction *getNext() { return Next; } + const Instruction *getNext() const { return Next; } + Instruction *getPrev() { return Prev; } + const Instruction *getPrev() const { return Prev; } + virtual bool hasSideEffects() const { return false; } // Memory & Call insts // --------------------------------------------------------------------------- - // Machine code accessors... - // - inline MachineCodeForVMInstr &getMachineInstrVec() const { - return *machineInstrVec; - } - - // Add a machine instruction used to implement this instruction - // - void addMachineInstruction(MachineInstr* minstr); - - // --------------------------------------------------------------------------- - // Subclass classification... getInstType() returns a member of - // one of the enums that is coming soon (down below)... - // - virtual const char *getOpcodeName() const = 0; + /// Subclass classification... getOpcode() returns a member of + /// one of the enums that is coming soon (down below)... + /// unsigned getOpcode() const { return iType; } - - // getInstType is deprecated, use getOpcode() instead. - unsigned getInstType() const { return iType; } + virtual const char *getOpcodeName() const { + return getOpcodeName(getOpcode()); + } + static const char* getOpcodeName(unsigned OpCode); inline bool isTerminator() const { // Instance of TerminatorInst? return iType >= FirstTermOp && iType < NumTermOps; } - inline bool isDefinition() const { return !isTerminator(); } - inline bool isUnaryOp() const { - return iType >= FirstUnaryOp && iType < NumUnaryOps; - } inline bool isBinaryOp() const { return iType >= FirstBinaryOp && iType < NumBinaryOps; } - // dropAllReferences() - This function is in charge of "letting go" of all - // objects that this Instruction refers to. This first lets go of all - // references to hidden values generated code for this instruction, - // and then drops all references to its operands. - // - void dropAllReferences(); + virtual void print(std::ostream &OS) const; - - // Methods for support type inquiry through isa, cast, and dyn_cast: + /// Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const Instruction *I) { return true; } static inline bool classof(const Value *V) { return V->getValueType() == Value::InstructionVal; @@ -94,53 +86,31 @@ public: // Exported enumerations... // enum TermOps { // These terminate basic blocks - FirstTermOp = 1, - Ret = 1, Br, Switch, - NumTermOps // Must remain at end of enum - }; - - enum UnaryOps { - FirstUnaryOp = NumTermOps, - Not = NumTermOps, // Binary inverse - - NumUnaryOps // Must remain at end of enum +#define FIRST_TERM_INST(N) FirstTermOp = N, +#define HANDLE_TERM_INST(N, OPC, CLASS) OPC = N, +#define LAST_TERM_INST(N) NumTermOps = N+1, +#include "llvm/Instruction.def" }; enum BinaryOps { - // Standard binary operators... - FirstBinaryOp = NumUnaryOps, - Add = NumUnaryOps, Sub, Mul, Div, Rem, - - // Logical operators... - And, Or, Xor, - - // Binary comparison operators... - SetEQ, SetNE, SetLE, SetGE, SetLT, SetGT, - - NumBinaryOps +#define FIRST_BINARY_INST(N) FirstBinaryOp = N, +#define HANDLE_BINARY_INST(N, OPC, CLASS) OPC = N, +#define LAST_BINARY_INST(N) NumBinaryOps = N+1, +#include "llvm/Instruction.def" }; enum MemoryOps { - FirstMemoryOp = NumBinaryOps, - Malloc = NumBinaryOps, Free, // Heap management instructions - Alloca, // Stack management instruction - - Load, Store, // Memory manipulation instructions. - GetElementPtr, // Get addr of Structure or Array element - - NumMemoryOps +#define FIRST_MEMORY_INST(N) FirstMemoryOp = N, +#define HANDLE_MEMORY_INST(N, OPC, CLASS) OPC = N, +#define LAST_MEMORY_INST(N) NumMemoryOps = N+1, +#include "llvm/Instruction.def" }; enum OtherOps { - FirstOtherOp = NumMemoryOps, - PHINode = NumMemoryOps, // PHI node instruction - Cast, // Type cast... - Call, // Call a function - - Shl, Shr, // Shift operations... - - NumOps, // Must be the last 'op' defined. - UserOp1, UserOp2 // May be used internally to a pass... +#define FIRST_OTHER_INST(N) FirstOtherOp = N, +#define HANDLE_OTHER_INST(N, OPC, CLASS) OPC = N, +#define LAST_OTHER_INST(N) NumOtherOps = N+1, +#include "llvm/Instruction.def" }; };