+ 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 LLVM_READONLY;
+ bool isIntrinsic() const { return getIntrinsicID() != 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 AttributeSet &getAttributes() const { return AttributeList; }
+
+ /// setAttributes - Set the attribute list for this Function.
+ ///
+ void setAttributes(const AttributeSet &attrs) { AttributeList = attrs; }
+
+ /// getFnAttributes - Return the function attributes for querying.
+ ///
+ Attributes getFnAttributes() const {
+ return AttributeList.getFnAttributes();
+ }
+
+ /// addFnAttr - Add function attributes to this function.
+ ///
+ void addFnAttr(Attributes::AttrVal N) {
+ // Function Attributes are stored at ~0 index
+ addAttribute(AttributeSet::FunctionIndex, Attributes::get(getContext(), 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();
+
+
+ /// getRetAttributes - Return the return attributes for querying.
+ Attributes getRetAttributes() const {
+ return AttributeList.getRetAttributes();
+ }
+
+ /// getParamAttributes - Return the parameter attributes for querying.
+ Attributes getParamAttributes(unsigned Idx) const {
+ return AttributeList.getParamAttributes(Idx);
+ }
+
+ /// 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 getFnAttributes().hasAttribute(Attributes::ReadNone);
+ }
+ void setDoesNotAccessMemory() {
+ addFnAttr(Attributes::ReadNone);
+ }
+
+ /// @brief Determine if the function does not access or only reads memory.
+ bool onlyReadsMemory() const {
+ return doesNotAccessMemory() ||
+ getFnAttributes().hasAttribute(Attributes::ReadOnly);
+ }
+ void setOnlyReadsMemory() {
+ addFnAttr(Attributes::ReadOnly);
+ }
+
+ /// @brief Determine if the function cannot return.
+ bool doesNotReturn() const {
+ return getFnAttributes().hasAttribute(Attributes::NoReturn);
+ }
+ void setDoesNotReturn() {
+ addFnAttr(Attributes::NoReturn);
+ }
+
+ /// @brief Determine if the function cannot unwind.
+ bool doesNotThrow() const {
+ return getFnAttributes().hasAttribute(Attributes::NoUnwind);
+ }
+ void setDoesNotThrow() {
+ addFnAttr(Attributes::NoUnwind);
+ }
+
+ /// @brief True if the ABI mandates (or the user requested) that this
+ /// function be in a unwind table.
+ bool hasUWTable() const {
+ return getFnAttributes().hasAttribute(Attributes::UWTable);
+ }
+ void setHasUWTable() {
+ addFnAttr(Attributes::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 getParamAttributes(1).hasAttribute(Attributes::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 getParamAttributes(n).hasAttribute(Attributes::NoAlias);
+ }
+ void setDoesNotAlias(unsigned n) {
+ addAttribute(n, Attributes::get(getContext(), Attributes::NoAlias));
+ }