[llvm-commits] CVS: llvm/include/llvm/ParameterAttributes.h
Reid Spencer
reid at x10sys.com
Sun Apr 8 14:51:52 PDT 2007
On Sun, 2007-04-08 at 14:29 -0700, Chris Lattner wrote:
> > + #ifndef LLVM_PARAMETER_ATTRIBUTES_H
> > + #define LLVM_PARAMETER_ATTRIBUTES_H
> > +
> > + #include <llvm/ADT/SmallVector.h>
>
> Please use ""'s instead of <>'s.
Okay.
>
> > + public:
> > + /// Returns the parameter index of a particular parameter
> > attribute in this
> > + /// list of attributes. Note that the attr_index is an index
> > into this
> > + /// class's list of attributes, not the index of the
> > parameter. The result
> > + /// is the index of the parameter.
> > + /// @brief Get a parameter index
> > + uint16_t getParamIndex(unsigned attr_index) const {
> > + return attrs[attr_index].index;
> > + }
>
> What is this used for? I'd expect getParamAttrs to be the main
> useful api for this class.
Sole client: Bytecode Writer. Its useful in situations where you want to
traverse the attributes and get the index/attr pairs.
>
> > + /// The parameter attributes for the \p indexth parameter are
> > returned.
> > + /// The 0th parameter refers to the return type of the
> > function. Note that
> > + /// the \p param_index is an index into the function's
> > parameters, not an
> > + /// index into this class's list of attributes. The result of
> > getParamIndex
> > + /// is always suitable input to this function.
> > + /// @returns The all the ParameterAttributes for the \p
> > indexth parameter
> > + /// as a uint16_t of enumeration values OR'd together.
> > + /// @brief Get the attributes for a parameter
> > + uint16_t getParamAttrs(uint16_t param_index) const;
>
> Did you forget to check in the .cpp file?
No. This is a preview for you to review, which you've done :)
This isn't #included anywhere.
>
> > + /// 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.
> > + /// @returns the number of parameter attributes in this
> > ParamAttrsList.
> > + /// @brief Return the number of parameter attributes this
> > type has.
> > + unsigned size() const { return attrs.size(); }
>
> What is this useful for?
Bytecode writer.
>
> > + /// The set of ParameterAttributes set in Attributes is
> > converted to a
> > + /// string of equivalent mnemonics. This is, presumably, for
> > writing out
> > + /// the mnemonics for the assembly writer.
> > + /// @brief Convert parameter attribute bits to text
> > + static std::string getParamAttrsText(uint16_t Attributes);
>
>
> This requires #include'ing <string>
No, its only #Included into .cpp files, never a .h file. String is
invariably already included. I can add it if you like, but its
redundant. For that matter, smallvector probably is too, I didn't check.
>
> > + /// The \p Indexth parameter attribute is converted to string.
> > + /// @brief Get the text for the parmeter attributes for one
> > parameter.
> > + std::string getParamAttrsTextByIndex(uint16_t Index) const {
> > + return getParamAttrsText(getParamAttrs(Index));
> > + }
>
> I think indexes into the array should be an implementation detail of
> the class, not exposed to users.
It seems like overkill to make iterators and expose the index/value
pair.
>
> > + /// @brief Comparison operator for ParamAttrsList
> > + bool operator < (const ParamAttrsList& that) const {
> > + if (this->attrs.size() < that.attrs.size())
> > + return true;
> > + if (this->attrs.size() > that.attrs.size())
> > + return false;
> > + for (unsigned i = 0; i < attrs.size(); ++i) {
> > + if (attrs[i].index < that.attrs[i].index)
> > + return true;
> > + if (attrs[i].index > that.attrs[i].index)
> > + return false;
> > + if (attrs[i].attrs < that.attrs[i].attrs)
> > + return true;
> > + if (attrs[i].attrs > that.attrs[i].attrs)
> > + return false;
> > + }
>
> It seems more straight-forward to implement operator< for smallvector
> and ParamAttrsWithIndex.
Perhaps but this is temporary code. It goes away when FunctionTypes are
no longer using this to determine type equality. *shrug*
>
> > + public:
> > + /// This adds a pair to the list of parameter index and
> > attribute pairs
> > + /// represented by this class. No check is made to determine
> > whether
> > + /// param_index exists already. This pair is just added to
> > the end. It is
> > + /// the user's responsibility to insert the pairs wisely.
> > + /// @brief Insert ParameterAttributes for an index
> > + void insert(uint16_t param_index, uint16_t attrs);
>
> I don't like this API. I think the class should take care of merging
> attributes for parameters. Also, should this be named "addAttributes
> ()" or something? Logically this is a bucket of attributes, not a
> sequence, so I don't think 'insert' is a good name.
Okay. If you "add" an attribute does it OR it with existing contents or
replace existing contents?
It is this way because there are 0 uses of anyone trying to set multiple
attributes on a given parameter at different points. Generally what is
done is the bit mask is OR'd together and then insert is called.
Renaming to setAttributes would be acceptable.
>
> > + SmallVector<ParamAttrsWithIndex,2> attrs; ///< The list of
> > attributes
>
> Obviously random/subjective, but I'd suggest bumping this up to
> having storage for 4 or 6 attributes.
Why? The typical use case that I have seen is 1-2 (sret/sext). Why do
you think 4-6 is typical?
>
> Thanks for tackling this Reid!
>
> -Chris
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20070408/cb7ac0da/attachment.sig>
More information about the llvm-commits
mailing list