Home | History | Annotate | Download | only in llvm
      1 //===-- llvm/Attributes.h - Container for Attributes ------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file contains the simple types necessary to represent the
     11 // attributes associated with functions and their calls.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_ATTRIBUTES_H
     16 #define LLVM_ATTRIBUTES_H
     17 
     18 #include "llvm/Support/MathExtras.h"
     19 #include "llvm/ADT/ArrayRef.h"
     20 #include <cassert>
     21 #include <string>
     22 
     23 namespace llvm {
     24 class Type;
     25 
     26 namespace Attribute {
     27 /// We use this proxy POD type to allow constructing Attributes constants
     28 /// using initializer lists. Do not use this class directly.
     29 struct AttrConst {
     30   uint64_t v;
     31   AttrConst operator | (const AttrConst Attrs) const {
     32     AttrConst Res = {v | Attrs.v};
     33     return Res;
     34   }
     35   AttrConst operator ~ () const {
     36     AttrConst Res = {~v};
     37     return Res;
     38   }
     39 };
     40 }  // namespace Attribute
     41 
     42 
     43 /// Attributes - A bitset of attributes.
     44 class Attributes {
     45  public:
     46   Attributes() : Bits(0) { }
     47   explicit Attributes(uint64_t Val) : Bits(Val) { }
     48   /*implicit*/ Attributes(Attribute::AttrConst Val) : Bits(Val.v) { }
     49   // This is a "safe bool() operator".
     50   operator const void *() const { return Bits ? this : 0; }
     51   bool isEmptyOrSingleton() const { return (Bits & (Bits - 1)) == 0; }
     52   bool operator == (const Attributes &Attrs) const {
     53     return Bits == Attrs.Bits;
     54   }
     55   bool operator != (const Attributes &Attrs) const {
     56     return Bits != Attrs.Bits;
     57   }
     58   Attributes operator | (const Attributes &Attrs) const {
     59     return Attributes(Bits | Attrs.Bits);
     60   }
     61   Attributes operator & (const Attributes &Attrs) const {
     62     return Attributes(Bits & Attrs.Bits);
     63   }
     64   Attributes operator ^ (const Attributes &Attrs) const {
     65     return Attributes(Bits ^ Attrs.Bits);
     66   }
     67   Attributes &operator |= (const Attributes &Attrs) {
     68     Bits |= Attrs.Bits;
     69     return *this;
     70   }
     71   Attributes &operator &= (const Attributes &Attrs) {
     72     Bits &= Attrs.Bits;
     73     return *this;
     74   }
     75   Attributes operator ~ () const { return Attributes(~Bits); }
     76   uint64_t Raw() const { return Bits; }
     77  private:
     78   // Currently, we need less than 64 bits.
     79   uint64_t Bits;
     80 };
     81 
     82 namespace Attribute {
     83 
     84 /// Function parameters and results can have attributes to indicate how they
     85 /// should be treated by optimizations and code generation. This enumeration
     86 /// lists the attributes that can be associated with parameters, function
     87 /// results or the function itself.
     88 /// @brief Function attributes.
     89 
     90 // We declare AttrConst objects that will be used throughout the code
     91 // and also raw uint64_t objects with _i suffix to be used below for other
     92 // constant declarations. This is done to avoid static CTORs and at the same
     93 // time to keep type-safety of Attributes.
     94 #define DECLARE_LLVM_ATTRIBUTE(name, value) \
     95   const uint64_t name##_i = value; \
     96   const AttrConst name = {value};
     97 
     98 DECLARE_LLVM_ATTRIBUTE(None,0)    ///< No attributes have been set
     99 DECLARE_LLVM_ATTRIBUTE(ZExt,1<<0) ///< Zero extended before/after call
    100 DECLARE_LLVM_ATTRIBUTE(SExt,1<<1) ///< Sign extended before/after call
    101 DECLARE_LLVM_ATTRIBUTE(NoReturn,1<<2) ///< Mark the function as not returning
    102 DECLARE_LLVM_ATTRIBUTE(InReg,1<<3) ///< Force argument to be passed in register
    103 DECLARE_LLVM_ATTRIBUTE(StructRet,1<<4) ///< Hidden pointer to structure to return
    104 DECLARE_LLVM_ATTRIBUTE(NoUnwind,1<<5) ///< Function doesn't unwind stack
    105 DECLARE_LLVM_ATTRIBUTE(NoAlias,1<<6) ///< Considered to not alias after call
    106 DECLARE_LLVM_ATTRIBUTE(ByVal,1<<7) ///< Pass structure by value
    107 DECLARE_LLVM_ATTRIBUTE(Nest,1<<8) ///< Nested function static chain
    108 DECLARE_LLVM_ATTRIBUTE(ReadNone,1<<9) ///< Function does not access memory
    109 DECLARE_LLVM_ATTRIBUTE(ReadOnly,1<<10) ///< Function only reads from memory
    110 DECLARE_LLVM_ATTRIBUTE(NoInline,1<<11) ///< inline=never
    111 DECLARE_LLVM_ATTRIBUTE(AlwaysInline,1<<12) ///< inline=always
    112 DECLARE_LLVM_ATTRIBUTE(OptimizeForSize,1<<13) ///< opt_size
    113 DECLARE_LLVM_ATTRIBUTE(StackProtect,1<<14) ///< Stack protection.
    114 DECLARE_LLVM_ATTRIBUTE(StackProtectReq,1<<15) ///< Stack protection required.
    115 DECLARE_LLVM_ATTRIBUTE(Alignment,31<<16) ///< Alignment of parameter (5 bits)
    116                                      // stored as log2 of alignment with +1 bias
    117                                      // 0 means unaligned different from align 1
    118 DECLARE_LLVM_ATTRIBUTE(NoCapture,1<<21) ///< Function creates no aliases of pointer
    119 DECLARE_LLVM_ATTRIBUTE(NoRedZone,1<<22) /// disable redzone
    120 DECLARE_LLVM_ATTRIBUTE(NoImplicitFloat,1<<23) /// disable implicit floating point
    121                                            /// instructions.
    122 DECLARE_LLVM_ATTRIBUTE(Naked,1<<24) ///< Naked function
    123 DECLARE_LLVM_ATTRIBUTE(InlineHint,1<<25) ///< source said inlining was
    124                                            ///desirable
    125 DECLARE_LLVM_ATTRIBUTE(StackAlignment,7<<26) ///< Alignment of stack for
    126                                            ///function (3 bits) stored as log2
    127                                            ///of alignment with +1 bias
    128                                            ///0 means unaligned (different from
    129                                            ///alignstack= {1))
    130 DECLARE_LLVM_ATTRIBUTE(ReturnsTwice,1<<29) ///< Function can return twice
    131 DECLARE_LLVM_ATTRIBUTE(UWTable,1<<30) ///< Function must be in a unwind
    132                                            ///table
    133 DECLARE_LLVM_ATTRIBUTE(NonLazyBind,1U<<31) ///< Function is called early and/or
    134                                             /// often, so lazy binding isn't
    135                                             /// worthwhile.
    136 DECLARE_LLVM_ATTRIBUTE(AddressSafety,1ULL<<32) ///< Address safety checking is on.
    137 
    138 #undef DECLARE_LLVM_ATTRIBUTE
    139 
    140 /// Note that uwtable is about the ABI or the user mandating an entry in the
    141 /// unwind table. The nounwind attribute is about an exception passing by the
    142 /// function.
    143 /// In a theoretical system that uses tables for profiling and sjlj for
    144 /// exceptions, they would be fully independent. In a normal system that
    145 /// uses tables for both, the semantics are:
    146 /// nil                = Needs an entry because an exception might pass by.
    147 /// nounwind           = No need for an entry
    148 /// uwtable            = Needs an entry because the ABI says so and because
    149 ///                      an exception might pass by.
    150 /// uwtable + nounwind = Needs an entry because the ABI says so.
    151 
    152 /// @brief Attributes that only apply to function parameters.
    153 const AttrConst ParameterOnly = {ByVal_i | Nest_i |
    154     StructRet_i | NoCapture_i};
    155 
    156 /// @brief Attributes that may be applied to the function itself.  These cannot
    157 /// be used on return values or function parameters.
    158 const AttrConst FunctionOnly = {NoReturn_i | NoUnwind_i | ReadNone_i |
    159   ReadOnly_i | NoInline_i | AlwaysInline_i | OptimizeForSize_i |
    160   StackProtect_i | StackProtectReq_i | NoRedZone_i | NoImplicitFloat_i |
    161   Naked_i | InlineHint_i | StackAlignment_i |
    162   UWTable_i | NonLazyBind_i | ReturnsTwice_i | AddressSafety_i};
    163 
    164 /// @brief Parameter attributes that do not apply to vararg call arguments.
    165 const AttrConst VarArgsIncompatible = {StructRet_i};
    166 
    167 /// @brief Attributes that are mutually incompatible.
    168 const AttrConst MutuallyIncompatible[5] = {
    169   {ByVal_i | Nest_i | StructRet_i},
    170   {ByVal_i | Nest_i | InReg_i },
    171   {ZExt_i  | SExt_i},
    172   {ReadNone_i | ReadOnly_i},
    173   {NoInline_i | AlwaysInline_i}
    174 };
    175 
    176 /// @brief Which attributes cannot be applied to a type.
    177 Attributes typeIncompatible(Type *Ty);
    178 
    179 /// This turns an int alignment (a power of 2, normally) into the
    180 /// form used internally in Attributes.
    181 inline Attributes constructAlignmentFromInt(unsigned i) {
    182   // Default alignment, allow the target to define how to align it.
    183   if (i == 0)
    184     return None;
    185 
    186   assert(isPowerOf2_32(i) && "Alignment must be a power of two.");
    187   assert(i <= 0x40000000 && "Alignment too large.");
    188   return Attributes((Log2_32(i)+1) << 16);
    189 }
    190 
    191 /// This returns the alignment field of an attribute as a byte alignment value.
    192 inline unsigned getAlignmentFromAttrs(Attributes A) {
    193   Attributes Align = A & Attribute::Alignment;
    194   if (!Align)
    195     return 0;
    196 
    197   return 1U << ((Align.Raw() >> 16) - 1);
    198 }
    199 
    200 /// This turns an int stack alignment (which must be a power of 2) into
    201 /// the form used internally in Attributes.
    202 inline Attributes constructStackAlignmentFromInt(unsigned i) {
    203   // Default alignment, allow the target to define how to align it.
    204   if (i == 0)
    205     return None;
    206 
    207   assert(isPowerOf2_32(i) && "Alignment must be a power of two.");
    208   assert(i <= 0x100 && "Alignment too large.");
    209   return Attributes((Log2_32(i)+1) << 26);
    210 }
    211 
    212 /// This returns the stack alignment field of an attribute as a byte alignment
    213 /// value.
    214 inline unsigned getStackAlignmentFromAttrs(Attributes A) {
    215   Attributes StackAlign = A & Attribute::StackAlignment;
    216   if (!StackAlign)
    217     return 0;
    218 
    219   return 1U << ((StackAlign.Raw() >> 26) - 1);
    220 }
    221 
    222 /// This returns an integer containing an encoding of all the
    223 /// LLVM attributes found in the given attribute bitset.  Any
    224 /// change to this encoding is a breaking change to bitcode
    225 /// compatibility.
    226 inline uint64_t encodeLLVMAttributesForBitcode(Attributes Attrs) {
    227   // FIXME: It doesn't make sense to store the alignment information as an
    228   // expanded out value, we should store it as a log2 value.  However, we can't
    229   // just change that here without breaking bitcode compatibility.  If this ever
    230   // becomes a problem in practice, we should introduce new tag numbers in the
    231   // bitcode file and have those tags use a more efficiently encoded alignment
    232   // field.
    233 
    234   // Store the alignment in the bitcode as a 16-bit raw value instead of a
    235   // 5-bit log2 encoded value. Shift the bits above the alignment up by
    236   // 11 bits.
    237 
    238   uint64_t EncodedAttrs = Attrs.Raw() & 0xffff;
    239   if (Attrs & Attribute::Alignment)
    240     EncodedAttrs |= (1ull << 16) <<
    241       (((Attrs & Attribute::Alignment).Raw()-1) >> 16);
    242   EncodedAttrs |= (Attrs.Raw() & (0xfffull << 21)) << 11;
    243 
    244   return EncodedAttrs;
    245 }
    246 
    247 /// This returns an attribute bitset containing the LLVM attributes
    248 /// that have been decoded from the given integer.  This function
    249 /// must stay in sync with 'encodeLLVMAttributesForBitcode'.
    250 inline Attributes decodeLLVMAttributesForBitcode(uint64_t EncodedAttrs) {
    251   // The alignment is stored as a 16-bit raw value from bits 31--16.
    252   // We shift the bits above 31 down by 11 bits.
    253 
    254   unsigned Alignment = (EncodedAttrs & (0xffffull << 16)) >> 16;
    255   assert((!Alignment || isPowerOf2_32(Alignment)) &&
    256          "Alignment must be a power of two.");
    257 
    258   Attributes Attrs(EncodedAttrs & 0xffff);
    259   if (Alignment)
    260     Attrs |= Attribute::constructAlignmentFromInt(Alignment);
    261   Attrs |= Attributes((EncodedAttrs & (0xfffull << 32)) >> 11);
    262 
    263   return Attrs;
    264 }
    265 
    266 
    267 /// The set of Attributes set in Attributes is converted to a
    268 /// string of equivalent mnemonics. This is, presumably, for writing out
    269 /// the mnemonics for the assembly writer.
    270 /// @brief Convert attribute bits to text
    271 std::string getAsString(Attributes Attrs);
    272 } // end namespace Attribute
    273 
    274 /// This is just a pair of values to associate a set of attributes
    275 /// with an index.
    276 struct AttributeWithIndex {
    277   Attributes Attrs; ///< The attributes that are set, or'd together.
    278   unsigned Index; ///< Index of the parameter for which the attributes apply.
    279                   ///< Index 0 is used for return value attributes.
    280                   ///< Index ~0U is used for function attributes.
    281 
    282   static AttributeWithIndex get(unsigned Idx, Attributes Attrs) {
    283     AttributeWithIndex P;
    284     P.Index = Idx;
    285     P.Attrs = Attrs;
    286     return P;
    287   }
    288 };
    289 
    290 //===----------------------------------------------------------------------===//
    291 // AttrListPtr Smart Pointer
    292 //===----------------------------------------------------------------------===//
    293 
    294 class AttributeListImpl;
    295 
    296 /// AttrListPtr - This class manages the ref count for the opaque
    297 /// AttributeListImpl object and provides accessors for it.
    298 class AttrListPtr {
    299   /// AttrList - The attributes that we are managing.  This can be null
    300   /// to represent the empty attributes list.
    301   AttributeListImpl *AttrList;
    302 public:
    303   AttrListPtr() : AttrList(0) {}
    304   AttrListPtr(const AttrListPtr &P);
    305   const AttrListPtr &operator=(const AttrListPtr &RHS);
    306   ~AttrListPtr();
    307 
    308   //===--------------------------------------------------------------------===//
    309   // Attribute List Construction and Mutation
    310   //===--------------------------------------------------------------------===//
    311 
    312   /// get - Return a Attributes list with the specified parameters in it.
    313   static AttrListPtr get(ArrayRef<AttributeWithIndex> Attrs);
    314 
    315   /// addAttr - Add the specified attribute at the specified index to this
    316   /// attribute list.  Since attribute lists are immutable, this
    317   /// returns the new list.
    318   AttrListPtr addAttr(unsigned Idx, Attributes Attrs) const;
    319 
    320   /// removeAttr - Remove the specified attribute at the specified index from
    321   /// this attribute list.  Since attribute lists are immutable, this
    322   /// returns the new list.
    323   AttrListPtr removeAttr(unsigned Idx, Attributes Attrs) const;
    324 
    325   //===--------------------------------------------------------------------===//
    326   // Attribute List Accessors
    327   //===--------------------------------------------------------------------===//
    328   /// getParamAttributes - The attributes for the specified index are
    329   /// returned.
    330   Attributes getParamAttributes(unsigned Idx) const {
    331     assert (Idx && Idx != ~0U && "Invalid parameter index!");
    332     return getAttributes(Idx);
    333   }
    334 
    335   /// getRetAttributes - The attributes for the ret value are
    336   /// returned.
    337   Attributes getRetAttributes() const {
    338     return getAttributes(0);
    339   }
    340 
    341   /// getFnAttributes - The function attributes are returned.
    342   Attributes getFnAttributes() const {
    343     return getAttributes(~0U);
    344   }
    345 
    346   /// paramHasAttr - Return true if the specified parameter index has the
    347   /// specified attribute set.
    348   bool paramHasAttr(unsigned Idx, Attributes Attr) const {
    349     return getAttributes(Idx) & Attr;
    350   }
    351 
    352   /// getParamAlignment - Return the alignment for the specified function
    353   /// parameter.
    354   unsigned getParamAlignment(unsigned Idx) const {
    355     return Attribute::getAlignmentFromAttrs(getAttributes(Idx));
    356   }
    357 
    358   /// hasAttrSomewhere - Return true if the specified attribute is set for at
    359   /// least one parameter or for the return value.
    360   bool hasAttrSomewhere(Attributes Attr) const;
    361 
    362   /// operator==/!= - Provide equality predicates.
    363   bool operator==(const AttrListPtr &RHS) const
    364   { return AttrList == RHS.AttrList; }
    365   bool operator!=(const AttrListPtr &RHS) const
    366   { return AttrList != RHS.AttrList; }
    367 
    368   void dump() const;
    369 
    370   //===--------------------------------------------------------------------===//
    371   // Attribute List Introspection
    372   //===--------------------------------------------------------------------===//
    373 
    374   /// getRawPointer - Return a raw pointer that uniquely identifies this
    375   /// attribute list.
    376   void *getRawPointer() const {
    377     return AttrList;
    378   }
    379 
    380   // Attributes are stored as a dense set of slots, where there is one
    381   // slot for each argument that has an attribute.  This allows walking over the
    382   // dense set instead of walking the sparse list of attributes.
    383 
    384   /// isEmpty - Return true if there are no attributes.
    385   ///
    386   bool isEmpty() const {
    387     return AttrList == 0;
    388   }
    389 
    390   /// getNumSlots - Return the number of slots used in this attribute list.
    391   /// This is the number of arguments that have an attribute set on them
    392   /// (including the function itself).
    393   unsigned getNumSlots() const;
    394 
    395   /// getSlot - Return the AttributeWithIndex at the specified slot.  This
    396   /// holds a index number plus a set of attributes.
    397   const AttributeWithIndex &getSlot(unsigned Slot) const;
    398 
    399 private:
    400   explicit AttrListPtr(AttributeListImpl *L);
    401 
    402   /// getAttributes - The attributes for the specified index are
    403   /// returned.  Attributes for the result are denoted with Idx = 0.
    404   Attributes getAttributes(unsigned Idx) const;
    405 
    406 };
    407 
    408 } // End llvm namespace
    409 
    410 #endif
    411