34b6c0f252160f9f666ccd5825d8f131b5d92f05
[oota-llvm.git] / include / llvm / Function.h
1 //===-- llvm/Function.h - Class to represent a single function --*- C++ -*-===//
2 //
3 // This file contains the declaration of the Function class, which represents a 
4 // single function/procedure in LLVM.
5 //
6 // A function basically consists of a list of basic blocks, a list of arguments,
7 // and a symbol table.
8 //
9 //===----------------------------------------------------------------------===//
10
11 #ifndef LLVM_FUNCTION_H
12 #define LLVM_FUNCTION_H
13
14 #include "llvm/GlobalValue.h"
15 #include "llvm/BasicBlock.h"
16 #include "llvm/Argument.h"
17
18 class FunctionType;
19
20 // Traits for intrusive list of instructions...
21 template<> struct ilist_traits<BasicBlock>
22   : public SymbolTableListTraits<BasicBlock, Function, Function> {
23
24   // createNode is used to create a node that marks the end of the list...
25   static BasicBlock *createNode();
26
27   static iplist<BasicBlock> &getList(Function *F);
28 };
29
30 template<> struct ilist_traits<Argument>
31   : public SymbolTableListTraits<Argument, Function, Function> {
32
33   // createNode is used to create a node that marks the end of the list...
34   static Argument *createNode();
35   static iplist<Argument> &getList(Function *F);
36 };
37
38 class Function : public GlobalValue {
39 public:
40   typedef iplist<Argument> ArgumentListType;
41   typedef iplist<BasicBlock> BasicBlockListType;
42
43   // BasicBlock iterators...
44   typedef BasicBlockListType::iterator iterator;
45   typedef BasicBlockListType::const_iterator const_iterator;
46   typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
47   typedef std::reverse_iterator<iterator>             reverse_iterator;
48
49   typedef ArgumentListType::iterator aiterator;
50   typedef ArgumentListType::const_iterator const_aiterator;
51   typedef std::reverse_iterator<const_aiterator> const_reverse_aiterator;
52   typedef std::reverse_iterator<aiterator>             reverse_aiterator;
53
54 private:
55
56   // Important things that make up a function!
57   BasicBlockListType  BasicBlocks;      // The basic blocks
58   ArgumentListType ArgumentList;        // The formal arguments
59
60   SymbolTable *SymTab;
61   
62   friend class SymbolTableListTraits<Function, Module, Module>;
63
64   void setParent(Module *parent);
65   Function *Prev, *Next;
66   void setNext(Function *N) { Next = N; }
67   void setPrev(Function *N) { Prev = N; }
68
69 public:
70   /// Function ctor - If the (optional) Module argument is specified, the
71   /// function is automatically inserted into the end of the function list for
72   /// the module.
73   ///
74   Function(const FunctionType *Ty, bool isInternal, const std::string &N = "",
75            Module *M = 0);
76   ~Function();
77
78   // Specialize setName to handle symbol table majik...
79   virtual void setName(const std::string &name, SymbolTable *ST = 0);
80
81   const Type *getReturnType() const;           // Return the type of the ret val
82   const FunctionType *getFunctionType() const; // Return the FunctionType for me
83
84   /// isExternal - Is the body of this function unknown? (the basic block list
85   /// is empty if so) this is true for external functions, defined as forward
86   /// "declare"ations
87   ///
88   virtual bool isExternal() const { return BasicBlocks.empty(); }
89
90   // getNext/Prev - Return the next or previous function in the list.  These
91   // methods should never be used directly, and are only used to implement the
92   // function list as part of the module.
93   //
94         Function *getNext()       { return Next; }
95   const Function *getNext() const { return Next; }
96         Function *getPrev()       { return Prev; }
97   const Function *getPrev() const { return Prev; }
98
99   /// Get the underlying elements of the Function... both the argument list and
100   /// basic block list are empty for external functions.
101   ///
102   const ArgumentListType &getArgumentList() const { return ArgumentList; }
103         ArgumentListType &getArgumentList()       { return ArgumentList; }
104
105   const BasicBlockListType &getBasicBlockList() const { return BasicBlocks; }
106         BasicBlockListType &getBasicBlockList()       { return BasicBlocks; }
107
108   const BasicBlock       &getEntryNode() const   { return front(); }
109         BasicBlock       &getEntryNode()         { return front(); }
110
111   //===--------------------------------------------------------------------===//
112   // Symbol Table Accessing functions...
113
114   /// getSymbolTable() - Return the symbol table...
115   ///
116   inline       SymbolTable *getSymbolTable()       { return SymTab; }
117   inline const SymbolTable *getSymbolTable() const { return SymTab; }
118   SymbolTable *getSymbolTableSure() { return SymTab; }
119   bool hasSymbolTable() const { return true; }
120
121   
122   //===--------------------------------------------------------------------===//
123   // BasicBlock iterator forwarding functions
124   //
125   iterator                begin()       { return BasicBlocks.begin(); }
126   const_iterator          begin() const { return BasicBlocks.begin(); }
127   iterator                end  ()       { return BasicBlocks.end();   }
128   const_iterator          end  () const { return BasicBlocks.end();   }
129
130   reverse_iterator       rbegin()       { return BasicBlocks.rbegin(); }
131   const_reverse_iterator rbegin() const { return BasicBlocks.rbegin(); }
132   reverse_iterator       rend  ()       { return BasicBlocks.rend();   }
133   const_reverse_iterator rend  () const { return BasicBlocks.rend();   }
134
135   unsigned                 size() const { return BasicBlocks.size(); }
136   bool                    empty() const { return BasicBlocks.empty(); }
137   const BasicBlock       &front() const { return BasicBlocks.front(); }
138         BasicBlock       &front()       { return BasicBlocks.front(); }
139   const BasicBlock        &back() const { return BasicBlocks.back(); }
140         BasicBlock        &back()       { return BasicBlocks.back(); }
141
142   //===--------------------------------------------------------------------===//
143   // Argument iterator forwarding functions
144   //
145   aiterator                abegin()       { return ArgumentList.begin(); }
146   const_aiterator          abegin() const { return ArgumentList.begin(); }
147   aiterator                aend  ()       { return ArgumentList.end();   }
148   const_aiterator          aend  () const { return ArgumentList.end();   }
149
150   reverse_aiterator       arbegin()       { return ArgumentList.rbegin(); }
151   const_reverse_aiterator arbegin() const { return ArgumentList.rbegin(); }
152   reverse_aiterator       arend  ()       { return ArgumentList.rend();   }
153   const_reverse_aiterator arend  () const { return ArgumentList.rend();   }
154
155   unsigned                  asize() const { return ArgumentList.size(); }
156   bool                     aempty() const { return ArgumentList.empty(); }
157   const Argument          &afront() const { return ArgumentList.front(); }
158         Argument          &afront()       { return ArgumentList.front(); }
159   const Argument           &aback() const { return ArgumentList.back(); }
160         Argument           &aback()       { return ArgumentList.back(); }
161
162   virtual void print(std::ostream &OS) const;
163
164   /// Methods for support type inquiry through isa, cast, and dyn_cast:
165   static inline bool classof(const Function *) { return true; }
166   static inline bool classof(const Value *V) {
167     return V->getValueType() == Value::FunctionVal;
168   }
169
170   /// dropAllReferences() - This function causes all the subinstructions to "let
171   /// go" of all references that they are maintaining.  This allows one to
172   /// 'delete' a whole class at a time, even though there may be circular
173   /// references... first all references are dropped, and all use counts go to
174   /// zero.  Then everything is delete'd for real.  Note that no operations are
175   /// valid on an object that has "dropped all references", except operator 
176   /// delete.
177   ///
178   void dropAllReferences();
179 };
180
181 #endif