Oops! didn't mean to put this in there yet.
[oota-llvm.git] / include / llvm / Function.h
index a4545a79ab1404813aa587acacd831c067b347d8..58184de3b18993c9746d75fe492a15c2c47c0603 100644 (file)
@@ -1,13 +1,13 @@
 //===-- llvm/Function.h - Class to represent a single function --*- C++ -*-===//
-// 
+//
 //                     The LLVM Compiler Infrastructure
 //
 // This file was developed by the LLVM research group and is distributed under
 // the University of Illinois Open Source License. See LICENSE.TXT for details.
-// 
+//
 //===----------------------------------------------------------------------===//
 //
-// This file contains the declaration of the Function class, which represents a 
+// This file contains the declaration of the Function class, which represents a
 // single function/procedure in LLVM.
 //
 // A function basically consists of a list of basic blocks, a list of arguments,
@@ -31,17 +31,18 @@ class FunctionType;
 template<> struct ilist_traits<BasicBlock>
   : public SymbolTableListTraits<BasicBlock, Function, Function> {
 
-  // createNode is used to create a node that marks the end of the list...
-  static BasicBlock *createNode();
-
+  // createSentinel is used to create a node that marks the end of the list...
+  static BasicBlock *createSentinel();
+  static void destroySentinel(BasicBlock *BB) { delete BB; }
   static iplist<BasicBlock> &getList(Function *F);
 };
 
 template<> struct ilist_traits<Argument>
   : public SymbolTableListTraits<Argument, Function, Function> {
 
-  // createNode is used to create a node that marks the end of the list...
-  static Argument *createNode();
+  // createSentinel is used to create a node that marks the end of the list...
+  static Argument *createSentinel();
+  static void destroySentinel(Argument *A) { delete A; }
   static iplist<Argument> &getList(Function *F);
 };
 
@@ -53,13 +54,9 @@ public:
   // BasicBlock iterators...
   typedef BasicBlockListType::iterator iterator;
   typedef BasicBlockListType::const_iterator const_iterator;
-  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
-  typedef std::reverse_iterator<iterator>             reverse_iterator;
 
-  typedef ArgumentListType::iterator aiterator;
-  typedef ArgumentListType::const_iterator const_aiterator;
-  typedef std::reverse_iterator<const_aiterator> const_reverse_aiterator;
-  typedef std::reverse_iterator<aiterator>             reverse_aiterator;
+  typedef ArgumentListType::iterator arg_iterator;
+  typedef ArgumentListType::const_iterator const_arg_iterator;
 
 private:
   // Important things that make up a function!
@@ -67,7 +64,8 @@ private:
   ArgumentListType ArgumentList;        // The formal arguments
 
   SymbolTable *SymTab;
-  
+  unsigned CallingConvention;
+
   friend class SymbolTableListTraits<Function, Module, Module>;
 
   void setParent(Module *parent);
@@ -84,9 +82,6 @@ public:
            const std::string &N = "", Module *M = 0);
   ~Function();
 
-  // Specialize setName to handle symbol table majik...
-  virtual void setName(const std::string &name, SymbolTable *ST = 0);
-
   const Type *getReturnType() const;           // Return the type of the ret val
   const FunctionType *getFunctionType() const; // Return the FunctionType for me
 
@@ -110,6 +105,12 @@ public:
   unsigned getIntrinsicID() const;
   bool isIntrinsic() const { return getIntrinsicID() != 0; }
 
+  /// getCallingConv()/setCallingConv(uint) - These method get and set the
+  /// calling convention of this function.  The enum values for the known
+  /// calling conventions are defined in CallingConv.h.
+  unsigned getCallingConv() const { return CallingConvention; }
+  void setCallingConv(unsigned CC) { CallingConvention = CC; }
+
   /// renameLocalSymbols - This method goes through the Function's symbol table
   /// and renames any symbols that conflict with symbols at global scope.  This
   /// is required before printing out to a textual form, to ensure that there is
@@ -165,7 +166,7 @@ public:
   inline       SymbolTable &getSymbolTable()       { return *SymTab; }
   inline const SymbolTable &getSymbolTable() const { return *SymTab; }
 
-  
+
   //===--------------------------------------------------------------------===//
   // BasicBlock iterator forwarding functions
   //
@@ -174,11 +175,6 @@ public:
   iterator                end  ()       { return BasicBlocks.end();   }
   const_iterator          end  () const { return BasicBlocks.end();   }
 
-  reverse_iterator       rbegin()       { return BasicBlocks.rbegin(); }
-  const_reverse_iterator rbegin() const { return BasicBlocks.rbegin(); }
-  reverse_iterator       rend  ()       { return BasicBlocks.rend();   }
-  const_reverse_iterator rend  () const { return BasicBlocks.rend();   }
-
   size_t                   size() const { return BasicBlocks.size();  }
   bool                    empty() const { return BasicBlocks.empty(); }
   const BasicBlock       &front() const { return BasicBlocks.front(); }
@@ -189,22 +185,13 @@ public:
   //===--------------------------------------------------------------------===//
   // Argument iterator forwarding functions
   //
-  aiterator                abegin()       { return ArgumentList.begin(); }
-  const_aiterator          abegin() const { return ArgumentList.begin(); }
-  aiterator                aend  ()       { return ArgumentList.end();   }
-  const_aiterator          aend  () const { return ArgumentList.end();   }
-
-  reverse_aiterator       arbegin()       { return ArgumentList.rbegin(); }
-  const_reverse_aiterator arbegin() const { return ArgumentList.rbegin(); }
-  reverse_aiterator       arend  ()       { return ArgumentList.rend();   }
-  const_reverse_aiterator arend  () const { return ArgumentList.rend();   }
-
-  size_t                    asize() const { return ArgumentList.size();  }
-  bool                     aempty() const { return ArgumentList.empty(); }
-  const Argument          &afront() const { return ArgumentList.front(); }
-        Argument          &afront()       { return ArgumentList.front(); }
-  const Argument           &aback() const { return ArgumentList.back();  }
-        Argument           &aback()       { return ArgumentList.back();  }
+  arg_iterator                arg_begin()       { return ArgumentList.begin(); }
+  const_arg_iterator          arg_begin() const { return ArgumentList.begin(); }
+  arg_iterator                arg_end  ()       { return ArgumentList.end();   }
+  const_arg_iterator          arg_end  () const { return ArgumentList.end();   }
+
+  size_t                      arg_size () const { return ArgumentList.size();  }
+  bool                        arg_empty() const { return ArgumentList.empty(); }
 
   virtual void print(std::ostream &OS) const { print(OS, 0); }
   void print(std::ostream &OS, AssemblyAnnotationWriter *AAW) const;
@@ -216,7 +203,7 @@ public:
   /// in your path.
   ///
   void viewCFG() const;
-  
+
   /// viewCFGOnly - This function is meant for use from the debugger.  It works
   /// just like viewCFG, but it does not include the contents of basic blocks
   /// into the nodes, just the label.  If you are only interested in the CFG
@@ -235,7 +222,7 @@ public:
   /// 'delete' a whole module at a time, even though there may be circular
   /// references... first all references are dropped, and all use counts go to
   /// zero.  Then everything is deleted for real.  Note that no operations are
-  /// valid on an object that has "dropped all references", except operator 
+  /// valid on an object that has "dropped all references", except operator
   /// delete.
   ///
   /// Since no other object in the module can have references into the body of a