Added the MakeFileExecutable() method. This method takes a filename 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, LinkageTypes Linkage,
75            const std::string &N = "", 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   /// getIntrinsicID - This method returns the ID number of the specified
91   /// function, or LLVMIntrinsic::not_intrinsic if the function is not an
92   /// instrinsic, or if the pointer is null.  This value is always defined to be
93   /// zero to allow easy checking for whether a function is intrinsic or not.
94   /// The particular intrinsic functions which correspond to this value are
95   /// defined in llvm/Intrinsics.h.
96   ///
97   unsigned getIntrinsicID() const;
98   bool isIntrinsic() const { return getIntrinsicID() != 0; }
99
100   // getNext/Prev - Return the next or previous function in the list.  These
101   // methods should never be used directly, and are only used to implement the
102   // function list as part of the module.
103   //
104         Function *getNext()       { return Next; }
105   const Function *getNext() const { return Next; }
106         Function *getPrev()       { return Prev; }
107   const Function *getPrev() const { return Prev; }
108
109   /// Get the underlying elements of the Function... the basic block list is
110   /// empty for external functions.
111   ///
112   const ArgumentListType &getArgumentList() const { return ArgumentList; }
113         ArgumentListType &getArgumentList()       { return ArgumentList; }
114
115   const BasicBlockListType &getBasicBlockList() const { return BasicBlocks; }
116         BasicBlockListType &getBasicBlockList()       { return BasicBlocks; }
117
118   const BasicBlock       &getEntryNode() const   { return front(); }
119         BasicBlock       &getEntryNode()         { return front(); }
120
121   //===--------------------------------------------------------------------===//
122   // Symbol Table Accessing functions...
123
124   /// getSymbolTable() - Return the symbol table...
125   ///
126   inline       SymbolTable &getSymbolTable()       { return *SymTab; }
127   inline const SymbolTable &getSymbolTable() const { return *SymTab; }
128
129   
130   //===--------------------------------------------------------------------===//
131   // BasicBlock iterator forwarding functions
132   //
133   iterator                begin()       { return BasicBlocks.begin(); }
134   const_iterator          begin() const { return BasicBlocks.begin(); }
135   iterator                end  ()       { return BasicBlocks.end();   }
136   const_iterator          end  () const { return BasicBlocks.end();   }
137
138   reverse_iterator       rbegin()       { return BasicBlocks.rbegin(); }
139   const_reverse_iterator rbegin() const { return BasicBlocks.rbegin(); }
140   reverse_iterator       rend  ()       { return BasicBlocks.rend();   }
141   const_reverse_iterator rend  () const { return BasicBlocks.rend();   }
142
143   unsigned                 size() const { return BasicBlocks.size(); }
144   bool                    empty() const { return BasicBlocks.empty(); }
145   const BasicBlock       &front() const { return BasicBlocks.front(); }
146         BasicBlock       &front()       { return BasicBlocks.front(); }
147   const BasicBlock        &back() const { return BasicBlocks.back(); }
148         BasicBlock        &back()       { return BasicBlocks.back(); }
149
150   //===--------------------------------------------------------------------===//
151   // Argument iterator forwarding functions
152   //
153   aiterator                abegin()       { return ArgumentList.begin(); }
154   const_aiterator          abegin() const { return ArgumentList.begin(); }
155   aiterator                aend  ()       { return ArgumentList.end();   }
156   const_aiterator          aend  () const { return ArgumentList.end();   }
157
158   reverse_aiterator       arbegin()       { return ArgumentList.rbegin(); }
159   const_reverse_aiterator arbegin() const { return ArgumentList.rbegin(); }
160   reverse_aiterator       arend  ()       { return ArgumentList.rend();   }
161   const_reverse_aiterator arend  () const { return ArgumentList.rend();   }
162
163   unsigned                  asize() const { return ArgumentList.size(); }
164   bool                     aempty() const { return ArgumentList.empty(); }
165   const Argument          &afront() const { return ArgumentList.front(); }
166         Argument          &afront()       { return ArgumentList.front(); }
167   const Argument           &aback() const { return ArgumentList.back(); }
168         Argument           &aback()       { return ArgumentList.back(); }
169
170   virtual void print(std::ostream &OS) const;
171
172   /// Methods for support type inquiry through isa, cast, and dyn_cast:
173   static inline bool classof(const Function *) { return true; }
174   static inline bool classof(const Value *V) {
175     return V->getValueType() == Value::FunctionVal;
176   }
177
178   /// dropAllReferences() - This function causes all the subinstructions to "let
179   /// go" of all references that they are maintaining.  This allows one to
180   /// 'delete' a whole class at a time, even though there may be circular
181   /// references... first all references are dropped, and all use counts go to
182   /// zero.  Then everything is delete'd for real.  Note that no operations are
183   /// valid on an object that has "dropped all references", except operator 
184   /// delete.
185   ///
186   void dropAllReferences();
187 };
188
189 #endif