|  | //===-- llvm/Function.h - Class to represent a single function --*- C++ -*-===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file 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 | 
|  | // single function/procedure in LLVM. | 
|  | // | 
|  | // A function basically consists of a list of basic blocks, a list of arguments, | 
|  | // and a symbol table. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_FUNCTION_H | 
|  | #define LLVM_FUNCTION_H | 
|  |  | 
|  | #include "llvm/GlobalValue.h" | 
|  | #include "llvm/CallingConv.h" | 
|  | #include "llvm/BasicBlock.h" | 
|  | #include "llvm/Argument.h" | 
|  | #include "llvm/Attributes.h" | 
|  | #include "llvm/Support/Compiler.h" | 
|  |  | 
|  | namespace llvm { | 
|  |  | 
|  | class FunctionType; | 
|  | class LLVMContext; | 
|  |  | 
|  | // Traits for intrusive list of basic blocks... | 
|  | template<> struct ilist_traits<BasicBlock> | 
|  | : public SymbolTableListTraits<BasicBlock, Function> { | 
|  |  | 
|  | // createSentinel is used to get hold of the node that marks the end of the | 
|  | // list... (same trick used here as in ilist_traits<Instruction>) | 
|  | BasicBlock *createSentinel() const { | 
|  | return static_cast<BasicBlock*>(&Sentinel); | 
|  | } | 
|  | static void destroySentinel(BasicBlock*) {} | 
|  |  | 
|  | BasicBlock *provideInitialHead() const { return createSentinel(); } | 
|  | BasicBlock *ensureHead(BasicBlock*) const { return createSentinel(); } | 
|  | static void noteHead(BasicBlock*, BasicBlock*) {} | 
|  |  | 
|  | static ValueSymbolTable *getSymTab(Function *ItemParent); | 
|  | private: | 
|  | mutable ilist_half_node<BasicBlock> Sentinel; | 
|  | }; | 
|  |  | 
|  | template<> struct ilist_traits<Argument> | 
|  | : public SymbolTableListTraits<Argument, Function> { | 
|  |  | 
|  | Argument *createSentinel() const { | 
|  | return static_cast<Argument*>(&Sentinel); | 
|  | } | 
|  | static void destroySentinel(Argument*) {} | 
|  |  | 
|  | Argument *provideInitialHead() const { return createSentinel(); } | 
|  | Argument *ensureHead(Argument*) const { return createSentinel(); } | 
|  | static void noteHead(Argument*, Argument*) {} | 
|  |  | 
|  | static ValueSymbolTable *getSymTab(Function *ItemParent); | 
|  | private: | 
|  | mutable ilist_half_node<Argument> Sentinel; | 
|  | }; | 
|  |  | 
|  | class Function : public GlobalValue, | 
|  | public ilist_node<Function> { | 
|  | public: | 
|  | typedef iplist<Argument> ArgumentListType; | 
|  | typedef iplist<BasicBlock> BasicBlockListType; | 
|  |  | 
|  | // BasicBlock iterators... | 
|  | typedef BasicBlockListType::iterator iterator; | 
|  | typedef BasicBlockListType::const_iterator const_iterator; | 
|  |  | 
|  | typedef ArgumentListType::iterator arg_iterator; | 
|  | typedef ArgumentListType::const_iterator const_arg_iterator; | 
|  |  | 
|  | private: | 
|  | // Important things that make up a function! | 
|  | BasicBlockListType  BasicBlocks;        ///< The basic blocks | 
|  | mutable ArgumentListType ArgumentList;  ///< The formal arguments | 
|  | ValueSymbolTable *SymTab;               ///< Symbol table of args/instructions | 
|  | AttrListPtr AttributeList;              ///< Parameter attributes | 
|  |  | 
|  | // HasLazyArguments is stored in Value::SubclassData. | 
|  | /*bool HasLazyArguments;*/ | 
|  |  | 
|  | // The Calling Convention is stored in Value::SubclassData. | 
|  | /*CallingConv::ID CallingConvention;*/ | 
|  |  | 
|  | unsigned intrinsicID;                   ///< ID of intrinsic, 0 otherwise | 
|  |  | 
|  | friend class SymbolTableListTraits<Function, Module>; | 
|  |  | 
|  | void setParent(Module *parent); | 
|  |  | 
|  | /// hasLazyArguments/CheckLazyArguments - The argument list of a function is | 
|  | /// built on demand, so that the list isn't allocated until the first client | 
|  | /// needs it.  The hasLazyArguments predicate returns true if the arg list | 
|  | /// hasn't been set up yet. | 
|  | bool hasLazyArguments() const { | 
|  | return getSubclassDataFromValue() & 1; | 
|  | } | 
|  | void CheckLazyArguments() const { | 
|  | if (hasLazyArguments()) | 
|  | BuildLazyArguments(); | 
|  | } | 
|  | void BuildLazyArguments() const; | 
|  |  | 
|  | unsigned initIntrinsicID() const; | 
|  |  | 
|  | Function(const Function&); // DO NOT IMPLEMENT | 
|  | void operator=(const Function&); // DO NOT IMPLEMENT | 
|  |  | 
|  | /// Function ctor - If the (optional) Module argument is specified, the | 
|  | /// function is automatically inserted into the end of the function list for | 
|  | /// the module. | 
|  | /// | 
|  | Function(FunctionType *Ty, LinkageTypes Linkage, | 
|  | const Twine &N = "", Module *M = 0); | 
|  |  | 
|  | public: | 
|  | static Function *Create(FunctionType *Ty, LinkageTypes Linkage, | 
|  | const Twine &N = "", Module *M = 0) { | 
|  | return new(0) Function(Ty, Linkage, N, M); | 
|  | } | 
|  |  | 
|  | ~Function(); | 
|  |  | 
|  | Type *getReturnType() const;           // Return the type of the ret val | 
|  | FunctionType *getFunctionType() const; // Return the FunctionType for me | 
|  |  | 
|  | /// getContext - Return a pointer to the LLVMContext associated with this | 
|  | /// function, or NULL if this function is not bound to a context yet. | 
|  | LLVMContext &getContext() const; | 
|  |  | 
|  | /// isVarArg - Return true if this function takes a variable number of | 
|  | /// arguments. | 
|  | bool isVarArg() const; | 
|  |  | 
|  | /// getIntrinsicID - This method returns the ID number of the specified | 
|  | /// function, or Intrinsic::not_intrinsic if the function is not an | 
|  | /// instrinsic, or if the pointer is null.  This value is always defined to be | 
|  | /// zero to allow easy checking for whether a function is intrinsic or not. | 
|  | /// The particular intrinsic functions which correspond to this value are | 
|  | /// defined in llvm/Intrinsics.h. | 
|  | /// | 
|  | unsigned getIntrinsicID() const { return intrinsicID; } | 
|  | bool isIntrinsic() const { return intrinsicID != 0; } | 
|  |  | 
|  | /// getCallingConv()/setCallingConv(CC) - These method get and set the | 
|  | /// calling convention of this function.  The enum values for the known | 
|  | /// calling conventions are defined in CallingConv.h. | 
|  | CallingConv::ID getCallingConv() const { | 
|  | return static_cast<CallingConv::ID>(getSubclassDataFromValue() >> 1); | 
|  | } | 
|  | void setCallingConv(CallingConv::ID CC) { | 
|  | setValueSubclassData((getSubclassDataFromValue() & 1) | | 
|  | (static_cast<unsigned>(CC) << 1)); | 
|  | } | 
|  |  | 
|  | /// getAttributes - Return the attribute list for this Function. | 
|  | /// | 
|  | const AttrListPtr &getAttributes() const { return AttributeList; } | 
|  |  | 
|  | /// setAttributes - Set the attribute list for this Function. | 
|  | /// | 
|  | void setAttributes(const AttrListPtr &attrs) { AttributeList = attrs; } | 
|  |  | 
|  | /// hasFnAttr - Return true if this function has the given attribute. | 
|  | bool hasFnAttr(Attributes N) const { | 
|  | // Function Attributes are stored at ~0 index | 
|  | return AttributeList.paramHasAttr(~0U, N); | 
|  | } | 
|  |  | 
|  | /// addFnAttr - Add function attributes to this function. | 
|  | /// | 
|  | void addFnAttr(Attributes N) { | 
|  | // Function Attributes are stored at ~0 index | 
|  | addAttribute(~0U, N); | 
|  | } | 
|  |  | 
|  | /// removeFnAttr - Remove function attributes from this function. | 
|  | /// | 
|  | void removeFnAttr(Attributes N) { | 
|  | // Function Attributes are stored at ~0 index | 
|  | removeAttribute(~0U, N); | 
|  | } | 
|  |  | 
|  | /// hasGC/getGC/setGC/clearGC - The name of the garbage collection algorithm | 
|  | ///                             to use during code generation. | 
|  | bool hasGC() const; | 
|  | const char *getGC() const; | 
|  | void setGC(const char *Str); | 
|  | void clearGC(); | 
|  |  | 
|  | /// @brief Determine whether the function has the given attribute. | 
|  | bool paramHasAttr(unsigned i, Attributes attr) const { | 
|  | return AttributeList.paramHasAttr(i, attr); | 
|  | } | 
|  |  | 
|  | /// addAttribute - adds the attribute to the list of attributes. | 
|  | void addAttribute(unsigned i, Attributes attr); | 
|  |  | 
|  | /// removeAttribute - removes the attribute from the list of attributes. | 
|  | void removeAttribute(unsigned i, Attributes attr); | 
|  |  | 
|  | /// @brief Extract the alignment for a call or parameter (0=unknown). | 
|  | unsigned getParamAlignment(unsigned i) const { | 
|  | return AttributeList.getParamAlignment(i); | 
|  | } | 
|  |  | 
|  | /// @brief Determine if the function does not access memory. | 
|  | bool doesNotAccessMemory() const { | 
|  | return hasFnAttr(Attribute::ReadNone); | 
|  | } | 
|  | void setDoesNotAccessMemory(bool DoesNotAccessMemory = true) { | 
|  | if (DoesNotAccessMemory) addFnAttr(Attribute::ReadNone); | 
|  | else removeFnAttr(Attribute::ReadNone); | 
|  | } | 
|  |  | 
|  | /// @brief Determine if the function does not access or only reads memory. | 
|  | bool onlyReadsMemory() const { | 
|  | return doesNotAccessMemory() || hasFnAttr(Attribute::ReadOnly); | 
|  | } | 
|  | void setOnlyReadsMemory(bool OnlyReadsMemory = true) { | 
|  | if (OnlyReadsMemory) addFnAttr(Attribute::ReadOnly); | 
|  | else removeFnAttr(Attribute::ReadOnly | Attribute::ReadNone); | 
|  | } | 
|  |  | 
|  | /// @brief Determine if the function cannot return. | 
|  | bool doesNotReturn() const { | 
|  | return hasFnAttr(Attribute::NoReturn); | 
|  | } | 
|  | void setDoesNotReturn(bool DoesNotReturn = true) { | 
|  | if (DoesNotReturn) addFnAttr(Attribute::NoReturn); | 
|  | else removeFnAttr(Attribute::NoReturn); | 
|  | } | 
|  |  | 
|  | /// @brief Determine if the function cannot unwind. | 
|  | bool doesNotThrow() const { | 
|  | return hasFnAttr(Attribute::NoUnwind); | 
|  | } | 
|  | void setDoesNotThrow(bool DoesNotThrow = true) { | 
|  | if (DoesNotThrow) addFnAttr(Attribute::NoUnwind); | 
|  | else removeFnAttr(Attribute::NoUnwind); | 
|  | } | 
|  |  | 
|  | /// @brief True if the ABI mandates (or the user requested) that this | 
|  | /// function be in a unwind table. | 
|  | bool hasUWTable() const { | 
|  | return hasFnAttr(Attribute::UWTable); | 
|  | } | 
|  | void setHasUWTable(bool HasUWTable = true) { | 
|  | if (HasUWTable) | 
|  | addFnAttr(Attribute::UWTable); | 
|  | else | 
|  | removeFnAttr(Attribute::UWTable); | 
|  | } | 
|  |  | 
|  | /// @brief True if this function needs an unwind table. | 
|  | bool needsUnwindTableEntry() const { | 
|  | return hasUWTable() || !doesNotThrow(); | 
|  | } | 
|  |  | 
|  | /// @brief Determine if the function returns a structure through first | 
|  | /// pointer argument. | 
|  | bool hasStructRetAttr() const { | 
|  | return paramHasAttr(1, Attribute::StructRet); | 
|  | } | 
|  |  | 
|  | /// @brief Determine if the parameter does not alias other parameters. | 
|  | /// @param n The parameter to check. 1 is the first parameter, 0 is the return | 
|  | bool doesNotAlias(unsigned n) const { | 
|  | return paramHasAttr(n, Attribute::NoAlias); | 
|  | } | 
|  | void setDoesNotAlias(unsigned n, bool DoesNotAlias = true) { | 
|  | if (DoesNotAlias) addAttribute(n, Attribute::NoAlias); | 
|  | else removeAttribute(n, Attribute::NoAlias); | 
|  | } | 
|  |  | 
|  | /// @brief Determine if the parameter can be captured. | 
|  | /// @param n The parameter to check. 1 is the first parameter, 0 is the return | 
|  | bool doesNotCapture(unsigned n) const { | 
|  | return paramHasAttr(n, Attribute::NoCapture); | 
|  | } | 
|  | void setDoesNotCapture(unsigned n, bool DoesNotCapture = true) { | 
|  | if (DoesNotCapture) addAttribute(n, Attribute::NoCapture); | 
|  | else removeAttribute(n, Attribute::NoCapture); | 
|  | } | 
|  |  | 
|  | /// copyAttributesFrom - copy all additional attributes (those not needed to | 
|  | /// create a Function) from the Function Src to this one. | 
|  | void copyAttributesFrom(const GlobalValue *Src); | 
|  |  | 
|  | /// deleteBody - This method deletes the body of the function, and converts | 
|  | /// the linkage to external. | 
|  | /// | 
|  | void deleteBody() { | 
|  | dropAllReferences(); | 
|  | setLinkage(ExternalLinkage); | 
|  | } | 
|  |  | 
|  | /// removeFromParent - This method unlinks 'this' from the containing module, | 
|  | /// but does not delete it. | 
|  | /// | 
|  | virtual void removeFromParent(); | 
|  |  | 
|  | /// eraseFromParent - This method unlinks 'this' from the containing module | 
|  | /// and deletes it. | 
|  | /// | 
|  | virtual void eraseFromParent(); | 
|  |  | 
|  |  | 
|  | /// Get the underlying elements of the Function... the basic block list is | 
|  | /// empty for external functions. | 
|  | /// | 
|  | const ArgumentListType &getArgumentList() const { | 
|  | CheckLazyArguments(); | 
|  | return ArgumentList; | 
|  | } | 
|  | ArgumentListType &getArgumentList() { | 
|  | CheckLazyArguments(); | 
|  | return ArgumentList; | 
|  | } | 
|  | static iplist<Argument> Function::*getSublistAccess(Argument*) { | 
|  | return &Function::ArgumentList; | 
|  | } | 
|  |  | 
|  | const BasicBlockListType &getBasicBlockList() const { return BasicBlocks; } | 
|  | BasicBlockListType &getBasicBlockList()       { return BasicBlocks; } | 
|  | static iplist<BasicBlock> Function::*getSublistAccess(BasicBlock*) { | 
|  | return &Function::BasicBlocks; | 
|  | } | 
|  |  | 
|  | const BasicBlock       &getEntryBlock() const   { return front(); } | 
|  | BasicBlock       &getEntryBlock()         { return front(); } | 
|  |  | 
|  | //===--------------------------------------------------------------------===// | 
|  | // Symbol Table Accessing functions... | 
|  |  | 
|  | /// getSymbolTable() - Return the symbol table... | 
|  | /// | 
|  | inline       ValueSymbolTable &getValueSymbolTable()       { return *SymTab; } | 
|  | inline const ValueSymbolTable &getValueSymbolTable() const { return *SymTab; } | 
|  |  | 
|  |  | 
|  | //===--------------------------------------------------------------------===// | 
|  | // BasicBlock iterator forwarding functions | 
|  | // | 
|  | iterator                begin()       { return BasicBlocks.begin(); } | 
|  | const_iterator          begin() const { return BasicBlocks.begin(); } | 
|  | iterator                end  ()       { return BasicBlocks.end();   } | 
|  | const_iterator          end  () const { return BasicBlocks.end();   } | 
|  |  | 
|  | 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(); } | 
|  | const BasicBlock        &back() const { return BasicBlocks.back();  } | 
|  | BasicBlock        &back()       { return BasicBlocks.back();  } | 
|  |  | 
|  | //===--------------------------------------------------------------------===// | 
|  | // Argument iterator forwarding functions | 
|  | // | 
|  | arg_iterator arg_begin() { | 
|  | CheckLazyArguments(); | 
|  | return ArgumentList.begin(); | 
|  | } | 
|  | const_arg_iterator arg_begin() const { | 
|  | CheckLazyArguments(); | 
|  | return ArgumentList.begin(); | 
|  | } | 
|  | arg_iterator arg_end() { | 
|  | CheckLazyArguments(); | 
|  | return ArgumentList.end(); | 
|  | } | 
|  | const_arg_iterator arg_end() const { | 
|  | CheckLazyArguments(); | 
|  | return ArgumentList.end(); | 
|  | } | 
|  |  | 
|  | size_t arg_size() const; | 
|  | bool arg_empty() const; | 
|  |  | 
|  | /// viewCFG - This function is meant for use from the debugger.  You can just | 
|  | /// say 'call F->viewCFG()' and a ghostview window should pop up from the | 
|  | /// program, displaying the CFG of the current function with the code for each | 
|  | /// basic block inside.  This depends on there being a 'dot' and 'gv' program | 
|  | /// 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 | 
|  | /// this can make the graph smaller. | 
|  | /// | 
|  | void viewCFGOnly() const; | 
|  |  | 
|  | /// 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->getValueID() == Value::FunctionVal; | 
|  | } | 
|  |  | 
|  | /// dropAllReferences() - This method causes all the subinstructions to "let | 
|  | /// go" of all references that they are maintaining.  This allows one to | 
|  | /// '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 | 
|  | /// delete. | 
|  | /// | 
|  | /// Since no other object in the module can have references into the body of a | 
|  | /// function, dropping all references deletes the entire body of the function, | 
|  | /// including any contained basic blocks. | 
|  | /// | 
|  | void dropAllReferences(); | 
|  |  | 
|  | /// hasAddressTaken - returns true if there are any uses of this function | 
|  | /// other than direct calls or invokes to it. Optionally passes back the | 
|  | /// offending user for diagnostic purposes. | 
|  | /// | 
|  | bool hasAddressTaken(const User** = 0) const; | 
|  |  | 
|  | /// callsFunctionThatReturnsTwice - Return true if the function has a call to | 
|  | /// setjmp or other function that gcc recognizes as "returning twice". | 
|  | bool callsFunctionThatReturnsTwice() const; | 
|  |  | 
|  | private: | 
|  | // Shadow Value::setValueSubclassData with a private forwarding method so that | 
|  | // subclasses cannot accidentally use it. | 
|  | void setValueSubclassData(unsigned short D) { | 
|  | Value::setValueSubclassData(D); | 
|  | } | 
|  | }; | 
|  |  | 
|  | 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; | 
|  | } | 
|  |  | 
|  | } // End llvm namespace | 
|  |  | 
|  | #endif |