X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FParameterAttributes.h;h=35d347690da915d43934b519e4dc06f46e17c27b;hb=a727d5502c8e23c090da658bf14c5ebc1169a070;hp=6f774e0819d1e8225386a174986bc7a071bd64a0;hpb=b2ff383d493162d1de73bd9f956f468db2a88127;p=oota-llvm.git diff --git a/include/llvm/ParameterAttributes.h b/include/llvm/ParameterAttributes.h index 6f774e0819d..35d347690da 100644 --- a/include/llvm/ParameterAttributes.h +++ b/include/llvm/ParameterAttributes.h @@ -1,4 +1,4 @@ -//===-- llvm/ParameterAttributes.h - Container for Param Attrs --*- C++ -*-===// +//===-- llvm/ParameterAttributes.h - Container for ParamAttrs ---*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -18,33 +18,87 @@ #define LLVM_PARAMETER_ATTRIBUTES_H #include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/FoldingSet.h" namespace llvm { +namespace ParamAttr { -/// Function parameters can have attributes to indicate how they should be -/// treated by optimizations and code generation. This enumeration lists the -/// attributes that can be associated with parameters or function results. +/// Function parameters and results can have attributes to indicate how they +/// should be treated by optimizations and code generation. This enumeration +/// lists the attributes that can be associated with parameters or function +/// results. /// @brief Function parameter attributes. -enum ParameterAttributes { - NoAttributeSet = 0, ///< No attributes have been set - ZExtAttribute = 1 << 0, ///< zero extended before/after call - SExtAttribute = 1 << 1, ///< sign extended before/after call - NoReturnAttribute = 1 << 2, ///< mark the function as not returning - InRegAttribute = 1 << 3, ///< force argument to be passed in register - StructRetAttribute = 1 << 4, ///< hidden pointer to structure to return - NoUnwindAttribute = 1 << 5 ///< Function doesn't unwind stack +enum Attributes { + None = 0, ///< No attributes have been set + ZExt = 1 << 0, ///< zero extended before/after call + SExt = 1 << 1, ///< sign extended before/after call + NoReturn = 1 << 2, ///< mark the function as not returning + InReg = 1 << 3, ///< force argument to be passed in register + StructRet = 1 << 4, ///< hidden pointer to structure to return + NoUnwind = 1 << 5 ///< Function doesn't unwind stack }; -/// This class is used by Function and CallInst to represent the set of -/// parameter attributes used. It represents a list of pairs of uint16_t, one -/// for the parameter index, and one a set of ParameterAttributes bits. -/// Parameters that have no attributes are not present in the list. The list -/// may also be empty, but this doesn't occur in practice. The list constructs -/// as empty and is filled by the insert method. The list can be turned into -/// a string of mnemonics suitable for LLVM Assembly output. Various accessors -/// are provided to obtain information about the attributes. +} + +/// This is just a pair of values to associate a set of parameter attributes +/// with a parameter index. +/// @brief ParameterAttributes with a parameter index. +struct ParamAttrsWithIndex { + uint16_t attrs; ///< The attributes that are set, |'d together + uint16_t index; ///< Index of the parameter for which the attributes apply +}; + +/// @brief A vector of attribute/index pairs. +typedef SmallVector ParamAttrsVector; + +/// @brief A more friendly way to reference the attributes. +typedef ParamAttr::Attributes ParameterAttributes; + +/// This class represents a list of attribute/index pairs for parameter +/// attributes. Each entry in the list contains the index of a function +/// parameter and the associated ParameterAttributes. If a parameter's index is +/// not present in the list, then no attributes are set for that parameter. The +/// list may also be empty, but this does not occur in practice. An item in +/// the list with an index of 0 refers to the function as a whole or its result. +/// To construct a ParamAttrsList, you must first fill a ParamAttrsVector with +/// the attribute/index pairs you wish to set. The list of attributes can be +/// turned into a string of mnemonics suitable for LLVM Assembly output. +/// Various accessors are provided to obtain information about the attributes. +/// Note that objects of this class are "uniqued". The \p get method can return +/// the pointer of an existing and identical instance. Consequently, reference +/// counting is necessary in order to determine when the last reference to a +/// ParamAttrsList of a given shape is dropped. Users of this class should use +/// the addRef and dropRef methods to add/drop references. When the reference +/// count goes to zero, the ParamAttrsList object is deleted. +/// This class is used by Function, CallInst and InvokeInst to represent their +/// sets of parameter attributes. /// @brief A List of ParameterAttributes. -class ParamAttrsList { +class ParamAttrsList : public FoldingSetNode { + /// @name Construction + /// @{ + private: + // ParamAttrsList is uniqued, these should not be publicly available + void operator=(const ParamAttrsList &); // Do not implement + ParamAttrsList(const ParamAttrsList &); // Do not implement + ParamAttrsList(); // Do not implement + ~ParamAttrsList(); // Private implementation + + /// Only the \p get method can invoke this when it wants to create a + /// new instance. + /// @brief Construct an ParamAttrsList from a ParamAttrsVector + explicit ParamAttrsList(const ParamAttrsVector &attrVec) + : attrs(attrVec), refCount(0) {} + + public: + /// This method ensures the uniqueness of ParamAttrsList instances. The + /// argument is a vector of attribute/index pairs as represented by the + /// ParamAttrsWithIndex structure. The vector is used in the construction of + /// the ParamAttrsList instance. If an instance with identical vector pairs + /// exists, it will be returned instead of creating a new instance. + /// @brief Get a ParamAttrsList instance. + static ParamAttrsList *get(const ParamAttrsVector &attrVec); + + /// @} /// @name Accessors /// @{ public: @@ -107,6 +161,10 @@ class ParamAttrsList { return attrs[attr_index].index; } + uint16_t getParamAttrsAtIndex(unsigned attr_index) const { + return attrs[attr_index].attrs; + } + /// Determines how many parameter attributes are set in this ParamAttrsList. /// This says nothing about how many parameters the function has. It also /// says nothing about the highest parameter index that has attributes. @@ -116,59 +174,36 @@ class ParamAttrsList { /// @brief Return the number of parameter attributes this type has. unsigned size() const { return attrs.size(); } - /// Clients generally should not use this method. It is used internally by - /// LLVM. - /// @returns true if this ParamAttrsList is empty. - /// @brief Determine emptiness of ParamAttrsList. - unsigned empty() const { return attrs.empty(); } + /// Classes retaining references to ParamAttrsList objects should call this + /// method to increment the reference count. This ensures that the + /// ParamAttrsList object will not disappear until the class drops it. + /// @brief Add a reference to this instance. + void addRef() const { refCount++; } + + /// Classes retaining references to ParamAttrsList objects should call this + /// method to decrement the reference count and possibly delete the + /// ParamAttrsList object. This ensures that ParamAttrsList objects are + /// cleaned up only when the last reference to them is dropped. + /// @brief Drop a reference to this instance. + void dropRef() const { + assert(refCount != 0 && "dropRef without addRef"); + if (--refCount == 0) + delete this; + } /// @} - /// @name Mutators + /// @name Implementation Details /// @{ public: - /// This method will add the \p attr to the parameter with index - /// \p param_index. If the parameter index does not exist it will be created - /// and the \p will be the only attribute set. Otherwise, any existing - /// attributes for the specified parameter remain set and the attribute - /// given by \p attr is also set. - /// @brief Add a single ParameterAttribute - void addAttribute(uint16_t param_index, ParameterAttributes attr); - - /// This method will remove the \p attr to the parameter with index - /// \p param_index. If the parameter index does not exist in the list, - /// an assertion will occur. If the specified attribute is the last - /// attribute set for the specified parameter index, the attributes for - /// that index are removed completely from the list (size is decremented). - /// Otherwise, the specified attribute is removed from the set of attributes - /// for the given index. - /// @brief Remove a single ParameterAttribute - void removeAttribute(uint16_t param_index, ParameterAttributes attr); - - /// This is identical to addAttribute but permits you to set multiple - /// attributes at the same time. The \p attrs value is expected to be a - /// bitwise OR of the attributes you would like to have added. - /// @brief Insert ParameterAttributes for an index - void addAttributes(uint16_t param_index, uint16_t attrs); - - /// This is identical to removeAttribute but permits you to remove multiple - /// attributes at the same time. The\p attrs value is expected to be a - /// bitwise OR of the attribute syou would like to have removed. - /// @brief Remove ParameterAttributes for an index - void removeAttributes(uint16_t param_index, uint16_t attrs); + void Profile(FoldingSetNodeID &ID) const; + void dump() const; /// @} /// @name Data /// @{ private: - /// This is an internal structure used to associate the ParameterAttributes - /// with a parameter index. - /// @brief ParameterAttributes with a parameter index. - struct ParamAttrsWithIndex { - uint16_t attrs; ///< The attributes that are set, |'d together - uint16_t index; ///< Index of the parameter for which the attributes apply - }; - - SmallVector attrs; ///< The list of attributes + ParamAttrsVector attrs; ///< The list of attributes + mutable unsigned refCount; ///< The number of references to this object /// @} };