- Eliminate SymbolTable::ParentSymTab, ST::localLookup, and
[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   /// hasSymbolTable() - Returns true if there is a symbol table allocated to
115   /// this object AND if there is at least one name in it!
116   ///
117   bool hasSymbolTable() const;
118
119   /// getSymbolTable() - CAUTION: The current symbol table may be null if there
120   /// are no names (ie, the symbol table is empty)
121   ///
122   inline       SymbolTable *getSymbolTable()       { return SymTab; }
123   inline const SymbolTable *getSymbolTable() const { return SymTab; }
124
125   /// getSymbolTableSure is guaranteed to not return a null pointer, because if
126   /// the function does not already have a symtab, one is created.  Use this if
127   /// you intend to put something into the symbol table for the function.
128   ///
129   SymbolTable *getSymbolTableSure();  // Implemented in Value.cpp
130
131   
132   //===--------------------------------------------------------------------===//
133   // BasicBlock iterator forwarding functions
134   //
135   iterator                begin()       { return BasicBlocks.begin(); }
136   const_iterator          begin() const { return BasicBlocks.begin(); }
137   iterator                end  ()       { return BasicBlocks.end();   }
138   const_iterator          end  () const { return BasicBlocks.end();   }
139
140   reverse_iterator       rbegin()       { return BasicBlocks.rbegin(); }
141   const_reverse_iterator rbegin() const { return BasicBlocks.rbegin(); }
142   reverse_iterator       rend  ()       { return BasicBlocks.rend();   }
143   const_reverse_iterator rend  () const { return BasicBlocks.rend();   }
144
145   unsigned                 size() const { return BasicBlocks.size(); }
146   bool                    empty() const { return BasicBlocks.empty(); }
147   const BasicBlock       &front() const { return BasicBlocks.front(); }
148         BasicBlock       &front()       { return BasicBlocks.front(); }
149   const BasicBlock        &back() const { return BasicBlocks.back(); }
150         BasicBlock        &back()       { return BasicBlocks.back(); }
151
152   //===--------------------------------------------------------------------===//
153   // Argument iterator forwarding functions
154   //
155   aiterator                abegin()       { return ArgumentList.begin(); }
156   const_aiterator          abegin() const { return ArgumentList.begin(); }
157   aiterator                aend  ()       { return ArgumentList.end();   }
158   const_aiterator          aend  () const { return ArgumentList.end();   }
159
160   reverse_aiterator       arbegin()       { return ArgumentList.rbegin(); }
161   const_reverse_aiterator arbegin() const { return ArgumentList.rbegin(); }
162   reverse_aiterator       arend  ()       { return ArgumentList.rend();   }
163   const_reverse_aiterator arend  () const { return ArgumentList.rend();   }
164
165   unsigned                  asize() const { return ArgumentList.size(); }
166   bool                     aempty() const { return ArgumentList.empty(); }
167   const Argument          &afront() const { return ArgumentList.front(); }
168         Argument          &afront()       { return ArgumentList.front(); }
169   const Argument           &aback() const { return ArgumentList.back(); }
170         Argument           &aback()       { return ArgumentList.back(); }
171
172   virtual void print(std::ostream &OS) const;
173
174   /// Methods for support type inquiry through isa, cast, and dyn_cast:
175   static inline bool classof(const Function *) { return true; }
176   static inline bool classof(const Value *V) {
177     return V->getValueType() == Value::FunctionVal;
178   }
179
180   /// dropAllReferences() - This function causes all the subinstructions to "let
181   /// go" of all references that they are maintaining.  This allows one to
182   /// 'delete' a whole class at a time, even though there may be circular
183   /// references... first all references are dropped, and all use counts go to
184   /// zero.  Then everything is delete'd for real.  Note that no operations are
185   /// valid on an object that has "dropped all references", except operator 
186   /// delete.
187   ///
188   void dropAllReferences();
189 };
190
191 #endif