namespace llvm {
class FunctionType;
+class ParamAttrsList;
// Traits for intrusive list of instructions...
template<> struct ilist_traits<BasicBlock>
- : public SymbolTableListTraits<BasicBlock, Function, Function> {
+ : public SymbolTableListTraits<BasicBlock, Function> {
// 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);
+ static ValueSymbolTable *getSymTab(Function *ItemParent);
+ static int getListOffset();
};
template<> struct ilist_traits<Argument>
- : public SymbolTableListTraits<Argument, Function, Function> {
+ : public SymbolTableListTraits<Argument, Function> {
// 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);
+ static ValueSymbolTable *getSymTab(Function *ItemParent);
+ static int getListOffset();
};
class Function : public GlobalValue, public Annotable {
private:
// Important things that make up a function!
- BasicBlockListType BasicBlocks; // The basic blocks
- ArgumentListType ArgumentList; // The formal arguments
+ BasicBlockListType BasicBlocks; ///< The basic blocks
+ ArgumentListType ArgumentList; ///< The formal arguments
+ ValueSymbolTable *SymTab; ///< Symbol table of args/instructions
+ ParamAttrsList *ParamAttrs; ///< Parameter attributes
- SymbolTable *SymTab;
- unsigned CallingConvention;
+
+ // The Calling Convention is stored in Value::SubclassData.
+ /*unsigned CallingConvention;*/
- friend class SymbolTableListTraits<Function, Module, Module>;
+ friend class SymbolTableListTraits<Function, Module>;
void setParent(Module *parent);
Function *Prev, *Next;
/// 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
+ /// isDeclaration - Is the body of this function unknown? (The basic block
+ /// list is empty if so.) This is true for function declarations, but not
+ /// true for function definitions.
///
- virtual bool isExternal() const { return BasicBlocks.empty(); }
+ virtual bool isDeclaration() const { return BasicBlocks.empty(); }
/// getIntrinsicID - This method returns the ID number of the specified
/// function, or Intrinsic::not_intrinsic if the function is not an
/// The particular intrinsic functions which correspond to this value are
/// defined in llvm/Intrinsics.h.
///
- unsigned getIntrinsicID() const;
+ unsigned getIntrinsicID(bool noAssert = false) 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; }
+ unsigned getCallingConv() const { return SubclassData; }
+ void setCallingConv(unsigned CC) { SubclassData = 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
- /// no ambiguity when parsing.
- void renameLocalSymbols();
+ /// Obtains a constant pointer to the ParamAttrsList object which holds the
+ /// parameter attributes information, if any.
+ /// @returns 0 if no parameter attributes have been set.
+ /// @brief Get the parameter attributes.
+ const ParamAttrsList *getParamAttrs() const { return ParamAttrs; }
+ /// Sets the parameter attributes for this Function. To construct a
+ /// ParamAttrsList, see ParameterAttributes.h
+ /// @brief Set the parameter attributes.
+ void setParamAttrs(ParamAttrsList *attrs) { ParamAttrs = attrs; }
/// deleteBody - This method deletes the body of the function, and converts
/// the linkage to external.
void eraseFromParent();
- // getNext/Prev - Return the next or previous function in the list. These
- // methods should never be used directly, and are only used to implement the
- // function list as part of the module.
- //
- Function *getNext() { return Next; }
- const Function *getNext() const { return Next; }
- Function *getPrev() { return Prev; }
- const Function *getPrev() const { return Prev; }
-
/// Get the underlying elements of the Function... the basic block list is
/// empty for external functions.
///
/// getSymbolTable() - Return the symbol table...
///
- inline SymbolTable &getSymbolTable() { return *SymTab; }
- inline const SymbolTable &getSymbolTable() const { return *SymTab; }
+ inline ValueSymbolTable &getValueSymbolTable() { return *SymTab; }
+ inline const ValueSymbolTable &getValueSymbolTable() const { return *SymTab; }
//===--------------------------------------------------------------------===//
/// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const Function *) { return true; }
static inline bool classof(const Value *V) {
- return V->getValueType() == Value::FunctionVal;
+ return V->getValueID() == Value::FunctionVal;
}
/// dropAllReferences() - This method causes all the subinstructions to "let
/// including any contained basic blocks.
///
void dropAllReferences();
+
+ static unsigned getBasicBlockListOffset() {
+ Function *Obj = 0;
+ return unsigned(reinterpret_cast<uintptr_t>(&Obj->BasicBlocks));
+ }
+ static unsigned getArgumentListOffset() {
+ Function *Obj = 0;
+ return unsigned(reinterpret_cast<uintptr_t>(&Obj->ArgumentList));
+ }
+private:
+ // getNext/Prev - Return the next or previous function in the list. These
+ // methods should never be used directly, and are only used to implement the
+ // function list as part of the module.
+ //
+ Function *getNext() { return Next; }
+ const Function *getNext() const { return Next; }
+ Function *getPrev() { return Prev; }
+ const Function *getPrev() const { return Prev; }
};
+inline ValueSymbolTable *
+ilist_traits<BasicBlock>::getSymTab(Function *F) {
+ return F ? &F->getValueSymbolTable() : 0;
+}
+
+inline ValueSymbolTable *
+ilist_traits<Argument>::getSymTab(Function *F) {
+ return F ? &F->getValueSymbolTable() : 0;
+}
+
+inline int
+ilist_traits<BasicBlock>::getListOffset() {
+ return Function::getBasicBlockListOffset();
+}
+
+inline int
+ilist_traits<Argument>::getListOffset() {
+ return Function::getArgumentListOffset();
+}
+
+
} // End llvm namespace
#endif