diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2006-12-31 05:22:12 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2006-12-31 05:22:12 +0000 |
commit | 57a0342e96b18af93972d8371e7b5eb82dc853c4 (patch) | |
tree | 57d9fcc48f0b9f0d88e331a6d9cc92e37347384b | |
parent | f306293815abb43770fcc26879400d221387bd10 (diff) |
For PR950:
Add a new feature to FunctionType, Parameter Attributes. This allows tags
such as "sext" and "zext" to be associated with a faunction's arguments
or return type. This allows signedness information to be carried forward
from the frontend to the backend for arguments and result types.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32776 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/DerivedTypes.h | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/include/llvm/DerivedTypes.h b/include/llvm/DerivedTypes.h index 3a14e0b2a9..fa1cdd3bc5 100644 --- a/include/llvm/DerivedTypes.h +++ b/include/llvm/DerivedTypes.h @@ -75,21 +75,40 @@ public: /// FunctionType - Class to represent function types /// class FunctionType : public DerivedType { +public: + /// Function parameters can have attributes to indicate how they should be + /// treated by optimizations and code generation. This enumeration lists the + /// set of possible attributes. + /// @brief Function parameter attributes enumeration. + enum ParameterAttributes { + NoAttributeSet = 0, ///< No attribute value has been set on the parameter + ZExtAttribute = 1, ///< The parameter should be zero extended before call + SExtAttribute = 2 ///< The parameter should be sign extended before call + }; + typedef std::vector<ParameterAttributes> ParamAttrsList; +private: friend class TypeMap<FunctionValType, FunctionType>; bool isVarArgs; + ParamAttrsList *ParamAttrs; FunctionType(const FunctionType &); // Do not implement const FunctionType &operator=(const FunctionType &); // Do not implement FunctionType(const Type *Result, const std::vector<const Type*> &Params, - bool IsVarArgs); + bool IsVarArgs, const ParamAttrsList &Attrs); public: /// FunctionType::get - This static method is the primary way of constructing - /// a FunctionType + /// a FunctionType. /// - static FunctionType *get(const Type *Result, - const std::vector<const Type*> &Params, - bool isVarArg); + static FunctionType *get( + const Type *Result, ///< The result type + const std::vector<const Type*> &Params, ///< The types of the parameters + bool isVarArg, ///< Whether this is a variable argument length function + const ParamAttrsList & Attrs = ParamAttrsList() + ///< Indicates the parameter attributes to use, if any. The 0th entry + ///< in the list refers to the return type. Parameters are numbered + ///< starting at 1. + ); inline bool isVarArg() const { return isVarArgs; } inline const Type *getReturnType() const { return ContainedTys[0]; } @@ -106,6 +125,25 @@ public: /// unsigned getNumParams() const { return unsigned(ContainedTys.size()-1); } + /// The parameter attributes for the \p ith parameter are returned. The 0th + /// parameter refers to the return type of the function. + /// @returns The ParameterAttributes for the \p ith parameter. + /// @brief Get the attributes for a parameter + ParameterAttributes getParamAttrs(unsigned i) const; + + /// @brief Determine if a parameter attribute is set + bool paramHasAttr(unsigned i, ParameterAttributes attr) const { + return getParamAttrs(i) & attr; + } + + /// @brief Return the number of parameter attributes this type has. + unsigned getNumAttrs() const { + return (ParamAttrs ? unsigned(ParamAttrs->size()) : 0); + } + + /// @brief Convert a ParameterAttribute into its assembly text + static const char * getParamAttrsText(ParameterAttributes Attr); + // Implement the AbstractTypeUser interface. virtual void refineAbstractType(const DerivedType *OldTy, const Type *NewTy); virtual void typeBecameConcrete(const DerivedType *AbsTy); |