Instruction.h revision 3a8b0f00e6d23ae57fee93f7f2c18fe8e6b45c3c
1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project//===-- llvm/Instruction.h - Instruction class definition -------*- C++ -*-===// 2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// 35c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen// This file contains the declaration of the Instruction class, which is the 4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// base class for all of the LLVM instructions. 5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project// 6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project//===----------------------------------------------------------------------===// 7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef LLVM_INSTRUCTION_H 9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define LLVM_INSTRUCTION_H 10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llvm/User.h" 12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projecttemplate<typename SC> struct ilist_traits; 13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projecttemplate<typename ValueSubClass, typename ItemParentClass, typename SymTabClass, 14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project typename SubClass> class SymbolTableListTraits; 15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectclass Instruction : public User { 17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BasicBlock *Parent; 18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project Instruction *Prev, *Next; // Next and Prev links for our intrusive linked list 195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project void setNext(Instruction *N) { Next = N; } 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project void setPrev(Instruction *N) { Prev = N; } 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project friend class SymbolTableListTraits<Instruction, BasicBlock, Function, 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ilist_traits<Instruction> >; 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project void setParent(BasicBlock *P); 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectprotected: 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project unsigned iType; // InstructionType: The opcode of the instruction 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project Instruction(const Type *Ty, unsigned iType, const std::string &Name = "", 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project Instruction *InsertBefore = 0); 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectpublic: 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project virtual ~Instruction() { 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project assert(Parent == 0 && "Instruction still embedded in basic block!"); 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // Specialize setName to handle symbol table majik... 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project virtual void setName(const std::string &name, SymbolTable *ST = 0); 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /// clone() - Create a copy of 'this' instruction that is identical in all 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /// ways except the following: 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /// * The instruction has no parent 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /// * The instruction has no name 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /// 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project virtual Instruction *clone() const = 0; 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // Accessor methods... 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project inline const BasicBlock *getParent() const { return Parent; } 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project inline BasicBlock *getParent() { return Parent; } 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // getNext/Prev - Return the next or previous instruction in the list. The 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // last node in the list is a terminator instruction. 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project Instruction *getNext() { return Next; } 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project const Instruction *getNext() const { return Next; } 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project Instruction *getPrev() { return Prev; } 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project const Instruction *getPrev() const { return Prev; } 57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project virtual bool hasSideEffects() const { return false; } // Memory & Call insts 59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // --------------------------------------------------------------------------- 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /// Subclass classification... getOpcode() returns a member of 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /// one of the enums that is coming soon (down below)... 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /// 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project unsigned getOpcode() const { return iType; } 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project virtual const char *getOpcodeName() const { 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return getOpcodeName(getOpcode()); 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static const char* getOpcodeName(unsigned OpCode); 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project inline bool isTerminator() const { // Instance of TerminatorInst? 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return iType >= FirstTermOp && iType < NumTermOps; 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project inline bool isBinaryOp() const { 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return iType >= FirstBinaryOp && iType < NumBinaryOps; 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project virtual void print(std::ostream &OS) const; 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /// Methods for support type inquiry through isa, cast, and dyn_cast: 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static inline bool classof(const Instruction *I) { return true; } 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project static inline bool classof(const Value *V) { 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return V->getValueType() == Value::InstructionVal; 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project //---------------------------------------------------------------------- 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // Exported enumerations... 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project // 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project enum TermOps { // These terminate basic blocks 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define FIRST_TERM_INST(N) FirstTermOp = N, 90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define HANDLE_TERM_INST(N, OPC, CLASS) OPC = N, 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define LAST_TERM_INST(N) NumTermOps = N+1, 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llvm/Instruction.def" 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project }; 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project enum BinaryOps { 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define FIRST_BINARY_INST(N) FirstBinaryOp = N, 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define HANDLE_BINARY_INST(N, OPC, CLASS) OPC = N, 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define LAST_BINARY_INST(N) NumBinaryOps = N+1, 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llvm/Instruction.def" 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project }; 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project enum MemoryOps { 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define FIRST_MEMORY_INST(N) FirstMemoryOp = N, 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define HANDLE_MEMORY_INST(N, OPC, CLASS) OPC = N, 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define LAST_MEMORY_INST(N) NumMemoryOps = N+1, 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llvm/Instruction.def" 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project }; 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project enum OtherOps { 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define FIRST_OTHER_INST(N) FirstOtherOp = N, 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define HANDLE_OTHER_INST(N, OPC, CLASS) OPC = N, 112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define LAST_OTHER_INST(N) NumOtherOps = N+1, 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llvm/Instruction.def" 114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project }; 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project