X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FAttributes.h;h=8ce7651ae9449b9db9f9f6f2b21fd8a796cf46b3;hb=39cd0c8e477255a7296b2bd1dc67193f8d38c003;hp=e158d7e8f29cccbfc617391ba0f1d2b3d4dfac67;hpb=f6670729aabc1fab85238d2b306a1c1767a807bb;p=oota-llvm.git diff --git a/include/llvm/Attributes.h b/include/llvm/Attributes.h index e158d7e8f29..8ce7651ae94 100644 --- a/include/llvm/Attributes.h +++ b/include/llvm/Attributes.h @@ -6,10 +6,11 @@ // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// -// -// This file contains the simple types necessary to represent the -// attributes associated with functions and their calls. -// +/// +/// \file +/// \brief This file contains the simple types necessary to represent the +/// attributes associated with functions and their calls. +/// //===----------------------------------------------------------------------===// #ifndef LLVM_ATTRIBUTES_H @@ -28,7 +29,8 @@ class LLVMContext; class Type; //===----------------------------------------------------------------------===// -/// \class Functions, function parameters, and return types can have attributes +/// \class +/// \brief Functions, function parameters, and return types can have attributes /// to indicate how they should be treated by optimizations and code /// generation. This class represents one of those attributes. It's light-weight /// and should be passed around by-value. @@ -51,7 +53,7 @@ public: /// an exception might pass by. /// uwtable + nounwind = Needs an entry because the ABI says so. - enum AttrVal { + enum AttrKind { // IR-Level Attributes None, ///< No attributes have been set AddressSafety, ///< Address safety checking is on. @@ -67,6 +69,7 @@ public: Nest, ///< Nested function static chain NoAlias, ///< Considered to not alias after call NoCapture, ///< Function creates no aliases of pointer + NoDuplicate, ///< Call cannot be duplicated NoImplicitFloat, ///< Disable implicit floating point insts NoInline, ///< inline=never NonLazyBind, ///< Function is called early and/or @@ -90,18 +93,18 @@ public: ZExt ///< Zero extended before/after call }; private: - AttributeImpl *Attrs; - Attribute(AttributeImpl *A) : Attrs(A) {} + AttributeImpl *pImpl; + Attribute(AttributeImpl *A) : pImpl(A) {} public: - Attribute() : Attrs(0) {} + Attribute() : pImpl(0) {} /// \brief Return a uniquified Attribute object. This takes the uniquified /// value from the Builder and wraps it in the Attribute class. - static Attribute get(LLVMContext &Context, ArrayRef Vals); + static Attribute get(LLVMContext &Context, ArrayRef Vals); static Attribute get(LLVMContext &Context, AttrBuilder &B); /// \brief Return true if the attribute is present. - bool hasAttribute(AttrVal Val) const; + bool hasAttribute(AttrKind Val) const; /// \brief Return true if attributes exist bool hasAttributes() const; @@ -118,13 +121,13 @@ public: unsigned getStackAlignment() const; bool operator==(const Attribute &A) const { - return Attrs == A.Attrs; + return pImpl == A.pImpl; } bool operator!=(const Attribute &A) const { - return Attrs != A.Attrs; + return pImpl != A.pImpl; } - uint64_t Raw() const; + uint64_t getBitMask() const; /// \brief Which attributes cannot be applied to a type. static Attribute typeIncompatible(Type *Ty); @@ -147,24 +150,25 @@ public: }; //===----------------------------------------------------------------------===// -/// AttrBuilder - This class is used in conjunction with the Attribute::get -/// method to create an Attribute object. The object itself is uniquified. The -/// Builder's value, however, is not. So this can be used as a quick way to test -/// for equality, presence of attributes, etc. +/// \class +/// \brief This class is used in conjunction with the Attribute::get method to +/// create an Attribute object. The object itself is uniquified. The Builder's +/// value, however, is not. So this can be used as a quick way to test for +/// equality, presence of attributes, etc. class AttrBuilder { uint64_t Bits; public: AttrBuilder() : Bits(0) {} explicit AttrBuilder(uint64_t B) : Bits(B) {} - AttrBuilder(const Attribute &A) : Bits(A.Raw()) {} + AttrBuilder(const Attribute &A) : Bits(A.getBitMask()) {} void clear() { Bits = 0; } /// addAttribute - Add an attribute to the builder. - AttrBuilder &addAttribute(Attribute::AttrVal Val); + AttrBuilder &addAttribute(Attribute::AttrKind Val); /// removeAttribute - Remove an attribute from the builder. - AttrBuilder &removeAttribute(Attribute::AttrVal Val); + AttrBuilder &removeAttribute(Attribute::AttrKind Val); /// addAttribute - Add the attributes from A to the builder. AttrBuilder &addAttributes(const Attribute &A); @@ -172,8 +176,8 @@ public: /// removeAttribute - Remove the attributes from A from the builder. AttrBuilder &removeAttributes(const Attribute &A); - /// hasAttribute - Return true if the builder has the specified attribute. - bool hasAttribute(Attribute::AttrVal A) const; + /// \brief Return true if the builder has the specified attribute. + bool contains(Attribute::AttrKind A) const; /// hasAttributes - Return true if the builder has IR-level attributes. bool hasAttributes() const; @@ -223,10 +227,11 @@ public: .removeAttribute(Attribute::NonLazyBind) .removeAttribute(Attribute::ReturnsTwice) .removeAttribute(Attribute::AddressSafety) - .removeAttribute(Attribute::MinSize); + .removeAttribute(Attribute::MinSize) + .removeAttribute(Attribute::NoDuplicate); } - uint64_t Raw() const { return Bits; } + uint64_t getBitMask() const { return Bits; } bool operator==(const AttrBuilder &B) { return Bits == B.Bits; @@ -237,7 +242,8 @@ public: }; //===----------------------------------------------------------------------===// -/// \class This is just a pair of values to associate a set of attributes with +/// \class +/// \brief This is just a pair of values to associate a set of attributes with /// an index. struct AttributeWithIndex { Attribute Attrs; ///< The attributes that are set, or'd together. @@ -246,7 +252,7 @@ struct AttributeWithIndex { ///< Index ~0U is used for function attributes. static AttributeWithIndex get(LLVMContext &C, unsigned Idx, - ArrayRef Attrs) { + ArrayRef Attrs) { return get(Idx, Attribute::get(C, Attrs)); } static AttributeWithIndex get(unsigned Idx, Attribute Attrs) { @@ -264,7 +270,8 @@ struct AttributeWithIndex { class AttributeSetImpl; //===----------------------------------------------------------------------===// -/// \class This class manages the ref count for the opaque AttributeSetImpl +/// \class +/// \brief This class manages the ref count for the opaque AttributeSetImpl /// object and provides accessors for it. class AttributeSet { public: @@ -334,9 +341,23 @@ public: return getAttributes(Idx).getAlignment(); } + /// \brief Return true if the attribute exists at the given index. + bool hasAttribute(unsigned Index, Attribute::AttrKind Kind) const; + + /// \brief Return true if attribute exists at the given index. + bool hasAttributes(unsigned Index) const; + + /// \brief Get the stack alignment. + unsigned getStackAlignment(unsigned Index) const; + + /// \brief Return the attributes at the index as a string. + std::string getAsString(unsigned Index) const; + + uint64_t getBitMask(unsigned Index) const; + /// \brief Return true if the specified attribute is set for at least one /// parameter or for the return value. - bool hasAttrSomewhere(Attribute::AttrVal Attr) const; + bool hasAttrSomewhere(Attribute::AttrKind Attr) const; unsigned getNumAttrs() const; Attribute &getAttributesAtIndex(unsigned i) const; @@ -379,6 +400,6 @@ public: void dump() const; }; -} // End llvm namespace +} // end llvm namespace #endif