X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FAttributes.h;h=2a0fbc0ee13fe74d3365d7c070794b02b9cf0e16;hb=15c3789763e82b7c781ea1ebcae24de826259b75;hp=fc666c71c3833d3a3cab7774ea557427e0bbcb42;hpb=8e635dbc78996bc18cf13b4806706cf3529ea646;p=oota-llvm.git diff --git a/include/llvm/Attributes.h b/include/llvm/Attributes.h index fc666c71c38..2a0fbc0ee13 100644 --- a/include/llvm/Attributes.h +++ b/include/llvm/Attributes.h @@ -122,9 +122,6 @@ const AttrConst FunctionOnly = {NoReturn_i | NoUnwind_i | ReadNone_i | Naked_i | InlineHint_i | StackAlignment_i | UWTable_i | NonLazyBind_i | ReturnsTwice_i | AddressSafety_i}; -/// @brief Parameter attributes that do not apply to vararg call arguments. -const AttrConst VarArgsIncompatible = {StructRet_i}; - /// @brief Attributes that are mutually incompatible. const AttrConst MutuallyIncompatible[5] = { {ByVal_i | Nest_i | StructRet_i}, @@ -142,7 +139,44 @@ class AttributesImpl; /// Attributes - A bitset of attributes. class Attributes { - // Currently, we need less than 64 bits. +public: + enum AttrVal { + None = 0, ///< No attributes have been set + ZExt = 1, ///< Zero extended before/after call + SExt = 2, ///< Sign extended before/after call + NoReturn = 3, ///< Mark the function as not returning + InReg = 4, ///< Force argument to be passed in register + StructRet = 5, ///< Hidden pointer to structure to return + NoUnwind = 6, ///< Function doesn't unwind stack + NoAlias = 7, ///< Considered to not alias after call + ByVal = 8, ///< Pass structure by value + Nest = 9, ///< Nested function static chain + ReadNone = 10, ///< Function does not access memory + ReadOnly = 11, ///< Function only reads from memory + NoInline = 12, ///< inline=never + AlwaysInline = 13, ///< inline=always + OptimizeForSize = 14, ///< opt_size + StackProtect = 15, ///< Stack protection. + StackProtectReq = 16, ///< Stack protection required. + Alignment = 17, ///< Alignment of parameter (5 bits) + ///< stored as log2 of alignment with +1 bias + ///< 0 means unaligned different from align 1 + NoCapture = 18, ///< Function creates no aliases of pointer + NoRedZone = 19, ///< Disable redzone + NoImplicitFloat = 20, ///< Disable implicit floating point insts + Naked = 21, ///< Naked function + InlineHint = 22, ///< Source said inlining was desirable + StackAlignment = 23, ///< Alignment of stack for function (3 bits) + ///< stored as log2 of alignment with +1 bias 0 + ///< means unaligned (different from + ///< alignstack={1)) + ReturnsTwice = 24, ///< Function can return twice + UWTable = 25, ///< Function must be in a unwind table + NonLazyBind = 26, ///< Function is called early and/or + ///< often, so lazy binding isn't worthwhile + AddressSafety = 27 ///< Address safety checking is on. + }; +private: AttributesImpl Attrs; explicit Attributes(AttributesImpl *A); @@ -150,6 +184,7 @@ public: Attributes() : Attrs(0) {} explicit Attributes(uint64_t Val); /*implicit*/ Attributes(Attribute::AttrConst Val); + Attributes(const Attributes &A); class Builder { friend class Attributes; @@ -158,99 +193,43 @@ public: Builder() : Bits(0) {} Builder(const Attributes &A) : Bits(A.Raw()) {} - void addAddressSafetyAttr(); - void addAlwaysInlineAttr(); - void addByValAttr(); - void addInlineHintAttr(); - void addInRegAttr(); - void addNakedAttr(); - void addNestAttr(); - void addNoAliasAttr(); - void addNoCaptureAttr(); - void addNoImplicitFloatAttr(); - void addNoInlineAttr(); - void addNonLazyBindAttr(); - void addNoRedZoneAttr(); - void addNoReturnAttr(); - void addNoUnwindAttr(); - void addOptimizeForSizeAttr(); - void addReadNoneAttr(); - void addReadOnlyAttr(); - void addReturnsTwiceAttr(); - void addSExtAttr(); - void addStackProtectAttr(); - void addStackProtectReqAttr(); - void addStructRetAttr(); - void addUWTableAttr(); - void addZExtAttr(); + void clear() { Bits = 0; } + + bool hasAttributes() const; + bool hasAttributes(const Attributes &A) const; + bool hasAlignmentAttr() const; + + uint64_t getAlignment() const; + + void addAttribute(Attributes::AttrVal Val); + void removeAttribute(Attributes::AttrVal Val); void addAlignmentAttr(unsigned Align); void addStackAlignmentAttr(unsigned Align); - void removeAddressSafetyAttr(); - void removeAlwaysInlineAttr(); - void removeByValAttr(); - void removeInlineHintAttr(); - void removeInRegAttr(); - void removeNakedAttr(); - void removeNestAttr(); - void removeNoAliasAttr(); - void removeNoCaptureAttr(); - void removeNoImplicitFloatAttr(); - void removeNoInlineAttr(); - void removeNonLazyBindAttr(); - void removeNoRedZoneAttr(); - void removeNoReturnAttr(); - void removeNoUnwindAttr(); - void removeOptimizeForSizeAttr(); - void removeReadNoneAttr(); - void removeReadOnlyAttr(); - void removeReturnsTwiceAttr(); - void removeSExtAttr(); - void removeStackProtectAttr(); - void removeStackProtectReqAttr(); - void removeStructRetAttr(); - void removeUWTableAttr(); - void removeZExtAttr(); + void removeAttributes(const Attributes &A); }; /// get - Return a uniquified Attributes object. This takes the uniquified /// value from the Builder and wraps it in the Attributes class. + static Attributes get(Builder &B); static Attributes get(LLVMContext &Context, Builder &B); - // Attribute query methods. - // FIXME: StackAlignment & Alignment attributes have no predicate methods. + /// @brief Parameter attributes that do not apply to vararg call arguments. + bool hasIncompatibleWithVarArgsAttrs() const { + return hasAttribute(Attributes::StructRet); + } + + /// @brief Return true if the attribute is present. + bool hasAttribute(AttrVal Val) const; + + /// @brief Return true if attributes exist bool hasAttributes() const { return Attrs.hasAttributes(); } + + /// @brief Return true if the attributes are a non-null intersection. bool hasAttributes(const Attributes &A) const; - bool hasAddressSafetyAttr() const; - bool hasAlignmentAttr() const; - bool hasAlwaysInlineAttr() const; - bool hasByValAttr() const; - bool hasInRegAttr() const; - bool hasInlineHintAttr() const; - bool hasNakedAttr() const; - bool hasNestAttr() const; - bool hasNoAliasAttr() const; - bool hasNoCaptureAttr() const; - bool hasNoImplicitFloatAttr() const; - bool hasNoInlineAttr() const; - bool hasNonLazyBindAttr() const; - bool hasNoRedZoneAttr() const; - bool hasNoReturnAttr() const; - bool hasNoUnwindAttr() const; - bool hasOptimizeForSizeAttr() const; - bool hasReadNoneAttr() const; - bool hasReadOnlyAttr() const; - bool hasReturnsTwiceAttr() const; - bool hasSExtAttr() const; - bool hasStackAlignmentAttr() const; - bool hasStackProtectAttr() const; - bool hasStackProtectReqAttr() const; - bool hasStructRetAttr() const; - bool hasUWTableAttr() const; - bool hasZExtAttr() const; /// This returns the alignment field of an attribute as a byte alignment /// value. @@ -322,7 +301,7 @@ public: // 5-bit log2 encoded value. Shift the bits above the alignment up by 11 // bits. uint64_t EncodedAttrs = Attrs.Raw() & 0xffff; - if (Attrs.hasAlignmentAttr()) + if (Attrs.hasAttribute(Attributes::Alignment)) EncodedAttrs |= (1ULL << 16) << (((Attrs.Raw() & Attribute::Alignment_i) - 1) >> 16); EncodedAttrs |= (Attrs.Raw() & (0xfffULL << 21)) << 11; @@ -445,6 +424,9 @@ public: /// least one parameter or for the return value. bool hasAttrSomewhere(Attributes Attr) const; + unsigned getNumAttrs() const; + Attributes &getAttributesAtIndex(unsigned i) const; + /// operator==/!= - Provide equality predicates. bool operator==(const AttrListPtr &RHS) const { return AttrList == RHS.AttrList; } @@ -488,7 +470,6 @@ private: /// getAttributes - The attributes for the specified index are /// returned. Attributes for the result are denoted with Idx = 0. Attributes getAttributes(unsigned Idx) const; - }; } // End llvm namespace