add a new map
[oota-llvm.git] / include / llvm / Function.h
index 841912ab2d587ea2cbfa4f0b7fb7ca2fccd264a7..773f69bc8dc93531b1714f2132511d191409ca39 100644 (file)
@@ -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,11 @@ 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;
+  typedef arg_iterator aiterator; // legacy, deprecated
+  typedef const_arg_iterator const_aiterator; // legacy, deprecated
 
 private:
   // Important things that make up a function!
@@ -84,12 +83,13 @@ 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
 
+  /// isVarArg - Return true if this function takes a variable number of
+  /// arguments.
+  bool isVarArg() const;
+
   /// isExternal - Is the body of this function unknown? (The basic block list
   /// is empty if so.) This is true for external functions, defined as forward
   /// "declare"ations
@@ -106,6 +106,13 @@ public:
   unsigned getIntrinsicID() const;
   bool isIntrinsic() const { return getIntrinsicID() != 0; }
 
+  /// 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
+  /// no ambiguity when parsing.
+  void renameLocalSymbols();
+
+
   /// deleteBody - This method deletes the body of the function, and converts
   /// the linkage to external.
   ///
@@ -163,12 +170,7 @@ 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();   }
-
-  unsigned                 size() const { return BasicBlocks.size();  }
+  size_t                   size() const { return BasicBlocks.size();  }
   bool                    empty() const { return BasicBlocks.empty(); }
   const BasicBlock       &front() const { return BasicBlocks.front(); }
         BasicBlock       &front()       { return BasicBlocks.front(); }
@@ -178,22 +180,24 @@ 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();   }
-
-  unsigned                  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(); }
+
+  //===--------------------------------------------------------------------===//
+  // Argument iterator forwarding functions (legacy, deprecated, will be removed)
+  //
+  arg_iterator                abegin()       { return ArgumentList.begin(); }
+  const_arg_iterator          abegin() const { return ArgumentList.begin(); }
+  arg_iterator                aend  ()       { return ArgumentList.end();   }
+  const_arg_iterator          aend  () const { return ArgumentList.end();   }
+
+  size_t                       asize() const { return ArgumentList.size();  }
+  bool                        aempty() const { return ArgumentList.empty(); }
 
   virtual void print(std::ostream &OS) const { print(OS, 0); }
   void print(std::ostream &OS, AssemblyAnnotationWriter *AAW) const;