X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FAttributes.h;h=2a0fbc0ee13fe74d3365d7c070794b02b9cf0e16;hb=15c3789763e82b7c781ea1ebcae24de826259b75;hp=a564441deff4762cc6f6bee21b2c2fea3cbf250c;hpb=8831c0605bbc0c82ce56c2fb85bd681d1c013925;p=oota-llvm.git diff --git a/include/llvm/Attributes.h b/include/llvm/Attributes.h index a564441deff..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,46 +139,46 @@ class AttributesImpl; /// Attributes - A bitset of attributes. class Attributes { - // Currently, we need less than 64 bits. - AttributesImpl Attrs; -#if 0 - enum Attribute { - 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 - NoInline = 1 << 11, ///< inline=never - AlwaysInline = 1 << 12, ///< inline=always - OptimizeForSize = 1 << 13, ///< opt_size - StackProtect = 1 << 14, ///< Stack protection. - StackProtectReq = 1 << 15, ///< Stack protection required. - Alignment = 31 << 16, ///< Alignment of parameter (5 bits) - ///< stored as log2 of alignment with +1 bias - ///< 0 means unaligned different from align 1 - NoCapture = 1 << 21, ///< Function creates no aliases of pointer - NoRedZone = 1 << 22, ///< Disable redzone - NoImplicitFloat = 1 << 23, ///< Disable implicit floating point insts - Naked = 1 << 24, ///< Naked function - InlineHint = 1 << 25, ///< Source said inlining was desirable - StackAlignment = 7 << 26, ///< Alignment of stack for function (3 bits) - ///< stored as log2 of alignment with +1 bias 0 - ///< means unaligned (different from - ///< alignstack={1)) - ReturnsTwice = 1 << 29, ///< Function can return twice - UWTable = 1 << 30, ///< Function must be in a unwind table - NonLazyBind = 1U << 31, ///< Function is called early and/or - ///< often, so lazy binding isn't worthwhile - AddressSafety = 1ULL << 32 ///< Address safety checking is on. +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. }; -#endif +private: + AttributesImpl Attrs; + explicit Attributes(AttributesImpl *A); public: Attributes() : Attrs(0) {} @@ -204,65 +201,13 @@ public: uint64_t getAlignment() const; - 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 addAttribute(Attributes::AttrVal Val); + void removeAttribute(Attributes::AttrVal Val); void addAlignmentAttr(unsigned Align); void addStackAlignmentAttr(unsigned Align); void removeAttributes(const Attributes &A); - - 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 removeAlignmentAttr(); - void removeStackAlignmentAttr(); }; /// get - Return a uniquified Attributes object. This takes the uniquified @@ -272,42 +217,19 @@ public: /// @brief Parameter attributes that do not apply to vararg call arguments. bool hasIncompatibleWithVarArgsAttrs() const { - return hasStructRetAttr(); + return hasAttribute(Attributes::StructRet); } - // Attribute query methods. - // FIXME: StackAlignment & Alignment attributes have no predicate methods. + /// @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. @@ -379,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;