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