//
// 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 {
namespace ParamAttr {
NoAlias = 1 << 6, ///< Considered to not alias after call
ByVal = 1 << 7, ///< Pass structure by value
Nest = 1 << 8, ///< Nested function static chain
- Pure = 1 << 9, ///< Function is pure
- Const = 1 << 10 ///< Function is const
+ ReadNone = 1 << 9, ///< Function does not access memory
+ ReadOnly = 1 << 10 ///< Function only reads from memory
};
-}
+/// These attributes can safely be dropped from a function or a function call:
+/// doing so may reduce the number of optimizations performed, but it will not
+/// change a correct program into an incorrect one.
+/// @brief Attributes that do not change the calling convention.
+const uint16_t Informative = NoReturn | NoUnwind | NoAlias |
+ ReadNone | ReadOnly;
+
+/// @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 Attributes that only apply to integers.
+const uint16_t IntegerTypeOnly = SExt | ZExt;
+
+/// @brief Attributes that only apply to pointers.
+const uint16_t PointerTypeOnly = ByVal | Nest | NoAlias | StructRet;
+
+/// @brief Attributes that do not apply to void type function return values.
+const uint16_t VoidTypeIncompatible = IntegerTypeOnly | PointerTypeOnly |
+ ParameterOnly;
+
+/// @brief Attributes that are mutually incompatible.
+const uint16_t MutuallyIncompatible[3] = {
+ ByVal | InReg | Nest | StructRet,
+ ZExt | SExt,
+ ReadNone | ReadOnly
+};
+
+} // 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);
+
+ /// Returns whether each of the specified lists of attributes can be safely
+ /// replaced with the other in a function or a function call.
+ /// @brief Whether one attribute list can safely replace the other.
+ static bool areCompatible(const ParamAttrsList *A, const ParamAttrsList *B);
/// @}
/// @name Accessors
/// @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;
/// @}