X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FParameterAttributes.h;h=c2d60786c259ff08446b0e228364fb6d4d73ff96;hb=1a957d563fe894c797e0eba00bf069fbe7ecba77;hp=48044b95914ea994e0b38c664f6a7d51a3bb3b9a;hpb=18da0720887527ed570e9703ae5f290beb491ee1;p=oota-llvm.git diff --git a/include/llvm/ParameterAttributes.h b/include/llvm/ParameterAttributes.h index 48044b95914..c2d60786c25 100644 --- a/include/llvm/ParameterAttributes.h +++ b/include/llvm/ParameterAttributes.h @@ -18,15 +18,16 @@ #define LLVM_PARAMETER_ATTRIBUTES_H #include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/FoldingSet.h" namespace llvm { - -/// 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. -/// @brief Function parameter attributes. namespace ParamAttr { +/// 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 Attributes { None = 0, ///< No attributes have been set ZExt = 1 << 0, ///< zero extended before/after call @@ -34,54 +35,76 @@ enum Attributes { 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 + NoUnwind = 1 << 5, ///< Function doesn't unwind stack + NoAlias = 1 << 6 ///< Considered to not alias after call. }; } -typedef ParamAttr::Attributes ParameterAttributes; - -/// 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. -/// @brief A List of ParameterAttributes. -class ParamAttrsList { - //void operator=(const ParamAttrsList &); // Do not implement - //ParamAttrsList(const ParamAttrsList &); // Do not implement +/// 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 + + static ParamAttrsWithIndex get(uint16_t idx, uint16_t attrs) { + ParamAttrsWithIndex P; + P.index = idx; + P.attrs = attrs; + return P; + } +}; - /// @name Types - /// @{ - public: - /// 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 - }; +/// @brief A vector of attribute/index pairs. +typedef SmallVector ParamAttrsVector; - /// @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 : public FoldingSetNode { /// @name Construction /// @{ - public: - /// @brief Construct an empty ParamAttrsList - ParamAttrsList() {} + 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. - ParamAttrsList *get(const ParamAttrsVector &attrVec); + static ParamAttrsList *get(const ParamAttrsVector &attrVec); /// @} /// @name Accessors @@ -146,6 +169,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. @@ -155,39 +182,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 attrs to the parameter with index - /// \p param_index. If the parameter index does not exist it will be created - /// and the \p attrs will be the only attributes set. Otherwise, any - /// existing attributes for the specified parameter remain set and the - /// attributes given by \p attrs are also set. - /// @brief Add ParameterAttributes. - void addAttributes(uint16_t param_index, uint16_t attrs); - - /// This method will remove the \p attrs 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 attributes are the last - /// attributes set for the specified parameter index, the attributes for - /// that index are removed completely from the list (size is decremented). - /// Otherwise, the specified attributes are removed from the set of - /// attributes for the given index, retaining any others. - /// @brief Remove a single ParameterAttribute - void removeAttributes(uint16_t param_index, uint16_t attrs); + void Profile(FoldingSetNodeID &ID) const; + void dump() const; /// @} /// @name Data /// @{ private: - ParamAttrsVector attrs; ///< The list of attributes + ParamAttrsVector attrs; ///< The list of attributes + mutable unsigned refCount; ///< The number of references to this object /// @} };