//
// The LLVM Compiler Infrastructure
//
-// This file was developed by Reid Spencer and is distributed under the
-// University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/FoldingSet.h"
+#include <cassert>
namespace llvm {
+class Type;
+
namespace ParamAttr {
/// Function parameters and results can have attributes to indicate how they
/// results.
/// @brief Function parameter attributes.
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
- NoAlias = 1 << 6, ///< Considered to not alias after call
- ByVal = 1 << 7, ///< Pass structure by value
- Nest = 1 << 8 ///< Nested function static chain
+ 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
+ NoAlias = 1 << 6, ///< Considered to not alias after call
+ ByVal = 1 << 7, ///< Pass structure by value
+ Nest = 1 << 8, ///< Nested function static chain
+ ReadNone = 1 << 9, ///< Function does not access memory
+ ReadOnly = 1 << 10 ///< Function only reads from memory
+};
+
+/// @brief Attributes that only apply to function parameters.
+const uint16_t ParameterOnly = ByVal | InReg | Nest | StructRet;
+
+/// @brief Attributes that only apply to function return values.
+const uint16_t ReturnOnly = NoReturn | NoUnwind | ReadNone | ReadOnly;
+
+/// @brief Parameter attributes that do not apply to vararg call arguments.
+const uint16_t VarArgsIncompatible = StructRet;
+
+/// @brief Attributes that are mutually incompatible.
+const uint16_t MutuallyIncompatible[3] = {
+ ByVal | InReg | Nest | StructRet,
+ ZExt | SExt,
+ ReadNone | ReadOnly
};
-}
+/// @brief Which attributes cannot be applied to a type.
+uint16_t typeIncompatible (const Type *Ty);
+
+} // end namespace ParamAttr
/// 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 attrs; ///< The attributes that are set, or'd together
uint16_t index; ///< Index of the parameter for which the attributes apply
static ParamAttrsWithIndex get(uint16_t idx, uint16_t attrs) {
// 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) {}
+ explicit ParamAttrsList(const ParamAttrsVector &attrVec);
public:
- /// This method ensures the uniqueness of ParamAttrsList instances. The
+ /// 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.
+ /// ParamAttrsWithIndex structure. The index values must be in strictly
+ /// increasing order and ParamAttr::None is not allowed. The vector is
+ /// used to construct 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);
+ static const ParamAttrsList *get(const ParamAttrsVector &attrVec);
+
+ /// Returns the ParamAttrsList obtained by modifying PAL using the supplied
+ /// list of attribute/index pairs. Any existing attributes for the given
+ /// index are replaced by the given attributes. If there were no attributes
+ /// then the new ones are inserted. Attributes can be deleted by replacing
+ /// them with ParamAttr::None. Index values must be strictly increasing.
+ /// @brief Get a new ParamAttrsList instance by modifying an existing one.
+ static const ParamAttrsList *getModified(const ParamAttrsList *PAL,
+ const ParamAttrsVector &modVec);
+
+ /// @brief Add the specified attributes to those in PAL at index idx.
+ static const ParamAttrsList *includeAttrs(const ParamAttrsList *PAL,
+ uint16_t idx, uint16_t attrs);
+
+ /// @brief Remove the specified attributes from those in PAL at index idx.
+ static const ParamAttrsList *excludeAttrs(const ParamAttrsList *PAL,
+ uint16_t idx, uint16_t attrs);
/// @}
/// @name Accessors
return getParamAttrs(i) & attr;
}
+ /// This returns whether the given attribute is set for at least one
+ /// parameter or for the return value.
+ /// @returns true if the parameter attribute is set somewhere
+ /// @brief Determine if a ParameterAttributes is set somewhere
+ bool hasAttrSomewhere(ParameterAttributes attr) const;
+
/// 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 Return the number of parameter attributes this type has.
unsigned size() const { return attrs.size(); }
+ /// @brief Return the number of references to this ParamAttrsList.
+ unsigned numRefs() const { return refCount; }
+
+ /// @}
+ /// @name Mutators
+ /// @{
+ public:
/// 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.
/// @name Implementation Details
/// @{
public:
- void Profile(FoldingSetNodeID &ID) const;
+ void Profile(FoldingSetNodeID &ID) const {
+ Profile(ID, attrs);
+ }
+ static void Profile(FoldingSetNodeID &ID, const ParamAttrsVector &Attrs);
void dump() const;
/// @}