d585843e90513a1a263b734dab82dabf7d76f99a
[oota-llvm.git] / lib / IR / Attributes.cpp
1 //===-- Attributes.cpp - Implement AttributesList -------------------------===//
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 // \file
11 // \brief This file implements the Attribute, AttributeImpl, AttrBuilder,
12 // AttributeSetImpl, and AttributeSet classes.
13 //
14 //===----------------------------------------------------------------------===//
15
16 #include "llvm/IR/Attributes.h"
17 #include "AttributeImpl.h"
18 #include "LLVMContextImpl.h"
19 #include "llvm/ADT/StringExtras.h"
20 #include "llvm/IR/Type.h"
21 #include "llvm/Support/Atomic.h"
22 #include "llvm/Support/Debug.h"
23 #include "llvm/Support/ManagedStatic.h"
24 #include "llvm/Support/Mutex.h"
25 #include "llvm/Support/raw_ostream.h"
26 #include <algorithm>
27 using namespace llvm;
28
29 //===----------------------------------------------------------------------===//
30 // Attribute Construction Methods
31 //===----------------------------------------------------------------------===//
32
33 Attribute Attribute::get(LLVMContext &Context, Constant *Kind, Constant *Val) {
34   LLVMContextImpl *pImpl = Context.pImpl;
35   FoldingSetNodeID ID;
36   ID.AddPointer(Kind);
37   if (Val) ID.AddPointer(Val);
38
39   void *InsertPoint;
40   AttributeImpl *PA = pImpl->AttrsSet.FindNodeOrInsertPos(ID, InsertPoint);
41
42   if (!PA) {
43     // If we didn't find any existing attributes of the same shape then create a
44     // new one and insert it.
45     PA = new AttributeImpl(Context, Kind, Val);
46     pImpl->AttrsSet.InsertNode(PA, InsertPoint);
47   }
48
49   // Return the AttributesList that we found or created.
50   return Attribute(PA);
51 }
52
53 Attribute Attribute::get(LLVMContext &Context, AttrKind Kind, Constant *Val) {
54   ConstantInt *KindVal = ConstantInt::get(Type::getInt64Ty(Context), Kind);
55   return get(Context, KindVal, Val);
56 }
57
58 Attribute Attribute::getWithAlignment(LLVMContext &Context, uint64_t Align) {
59   assert(isPowerOf2_32(Align) && "Alignment must be a power of two.");
60   assert(Align <= 0x40000000 && "Alignment too large.");
61   return get(Context, Alignment,
62              ConstantInt::get(Type::getInt64Ty(Context), Align));
63 }
64
65 Attribute Attribute::getWithStackAlignment(LLVMContext &Context,
66                                            uint64_t Align) {
67   assert(isPowerOf2_32(Align) && "Alignment must be a power of two.");
68   assert(Align <= 0x100 && "Alignment too large.");
69   return get(Context, StackAlignment,
70              ConstantInt::get(Type::getInt64Ty(Context), Align));
71 }
72
73 //===----------------------------------------------------------------------===//
74 // Attribute Accessor Methods
75 //===----------------------------------------------------------------------===//
76
77 bool Attribute::hasAttribute(AttrKind Val) const {
78   return pImpl && pImpl->hasAttribute(Val);
79 }
80
81 Constant *Attribute::getAttributeKind() const {
82   return pImpl ? pImpl->getAttributeKind() : 0;
83 }
84
85 Constant *Attribute::getAttributeValues() const {
86   return pImpl ? pImpl->getAttributeValues() : 0;
87 }
88
89 /// This returns the alignment field of an attribute as a byte alignment value.
90 unsigned Attribute::getAlignment() const {
91   assert(hasAttribute(Attribute::Alignment) &&
92          "Trying to get alignment from non-alignment attribute!");
93   return pImpl->getAlignment();
94 }
95
96 /// This returns the stack alignment field of an attribute as a byte alignment
97 /// value.
98 unsigned Attribute::getStackAlignment() const {
99   assert(hasAttribute(Attribute::StackAlignment) &&
100          "Trying to get alignment from non-alignment attribute!");
101   return pImpl->getStackAlignment();
102 }
103
104 std::string Attribute::getAsString() const {
105   if (!pImpl) return "";
106
107   if (hasAttribute(Attribute::AddressSafety))
108     return "address_safety";
109   if (hasAttribute(Attribute::AlwaysInline))
110     return "alwaysinline";
111   if (hasAttribute(Attribute::ByVal))
112     return "byval";
113   if (hasAttribute(Attribute::InlineHint))
114     return "inlinehint";
115   if (hasAttribute(Attribute::InReg))
116     return "inreg";
117   if (hasAttribute(Attribute::MinSize))
118     return "minsize";
119   if (hasAttribute(Attribute::Naked))
120     return "naked";
121   if (hasAttribute(Attribute::Nest))
122     return "nest";
123   if (hasAttribute(Attribute::NoAlias))
124     return "noalias";
125   if (hasAttribute(Attribute::NoCapture))
126     return "nocapture";
127   if (hasAttribute(Attribute::NoDuplicate))
128     return "noduplicate";
129   if (hasAttribute(Attribute::NoImplicitFloat))
130     return "noimplicitfloat";
131   if (hasAttribute(Attribute::NoInline))
132     return "noinline";
133   if (hasAttribute(Attribute::NonLazyBind))
134     return "nonlazybind";
135   if (hasAttribute(Attribute::NoRedZone))
136     return "noredzone";
137   if (hasAttribute(Attribute::NoReturn))
138     return "noreturn";
139   if (hasAttribute(Attribute::NoUnwind))
140     return "nounwind";
141   if (hasAttribute(Attribute::OptimizeForSize))
142     return "optsize";
143   if (hasAttribute(Attribute::ReadNone))
144     return "readnone";
145   if (hasAttribute(Attribute::ReadOnly))
146     return "readonly";
147   if (hasAttribute(Attribute::ReturnsTwice))
148     return "returns_twice";
149   if (hasAttribute(Attribute::SExt))
150     return "signext";
151   if (hasAttribute(Attribute::StackProtect))
152     return "ssp";
153   if (hasAttribute(Attribute::StackProtectReq))
154     return "sspreq";
155   if (hasAttribute(Attribute::StackProtectStrong))
156     return "sspstrong";
157   if (hasAttribute(Attribute::StructRet))
158     return "sret";
159   if (hasAttribute(Attribute::UWTable))
160     return "uwtable";
161   if (hasAttribute(Attribute::ZExt))
162     return "zeroext";
163
164   // FIXME: These should be output like this:
165   //
166   //   align=4
167   //   alignstack=8
168   //
169   if (hasAttribute(Attribute::StackAlignment)) {
170     std::string Result;
171     Result += "alignstack(";
172     Result += utostr(getStackAlignment());
173     Result += ")";
174     return Result;
175   }
176   if (hasAttribute(Attribute::Alignment)) {
177     std::string Result;
178     Result += "align ";
179     Result += utostr(getAlignment());
180     return Result;
181   }
182
183   // Convert target-dependent attributes to strings of the form:
184   //
185   //   "kind"
186   //   "kind" = "value"
187   //   "kind" = ( "value1" "value2" "value3" )
188   //
189   if (ConstantDataArray *CDA =
190       dyn_cast<ConstantDataArray>(pImpl->getAttributeKind())) {
191     std::string Result;
192     Result += '\"' + CDA->getAsString().str() + '"';
193
194     Constant *Vals = pImpl->getAttributeValues();
195     if (!Vals) return Result;
196
197     // FIXME: This should support more than just ConstantDataArrays. Also,
198     // support a vector of attribute values.
199
200     Result += " = ";
201     Result += '\"' + cast<ConstantDataArray>(Vals)->getAsString().str() + '"';
202
203     return Result;
204   }
205
206   llvm_unreachable("Unknown attribute");
207 }
208
209 bool Attribute::operator==(AttrKind K) const {
210   return (pImpl && *pImpl == K) || (!pImpl && K == None);
211 }
212 bool Attribute::operator!=(AttrKind K) const {
213   return !(*this == K);
214 }
215
216 bool Attribute::operator<(Attribute A) const {
217   if (!pImpl && !A.pImpl) return false;
218   if (!pImpl) return true;
219   if (!A.pImpl) return false;
220   return *pImpl < *A.pImpl;
221 }
222
223 //===----------------------------------------------------------------------===//
224 // AttributeImpl Definition
225 //===----------------------------------------------------------------------===//
226
227 bool AttributeImpl::hasAttribute(Attribute::AttrKind A) const {
228   if (ConstantInt *CI = dyn_cast<ConstantInt>(Kind))
229     return CI->getZExtValue() == A;
230   return false;
231 }
232
233 uint64_t AttributeImpl::getAlignment() const {
234   assert(hasAttribute(Attribute::Alignment) &&
235          "Trying to retrieve the alignment from a non-alignment attr!");
236   return cast<ConstantInt>(Values)->getZExtValue();
237 }
238
239 uint64_t AttributeImpl::getStackAlignment() const {
240   assert(hasAttribute(Attribute::StackAlignment) &&
241          "Trying to retrieve the stack alignment from a non-alignment attr!");
242   return cast<ConstantInt>(Values)->getZExtValue();
243 }
244
245 bool AttributeImpl::operator==(Attribute::AttrKind kind) const {
246   if (ConstantInt *CI = dyn_cast<ConstantInt>(Kind))
247     return CI->getZExtValue() == kind;
248   return false;
249 }
250 bool AttributeImpl::operator!=(Attribute::AttrKind kind) const {
251   return !(*this == kind);
252 }
253
254 bool AttributeImpl::operator==(StringRef kind) const {
255   if (ConstantDataArray *CDA = dyn_cast<ConstantDataArray>(Kind))
256     if (CDA->isString())
257       return CDA->getAsString() == kind;
258   return false;
259 }
260
261 bool AttributeImpl::operator!=(StringRef kind) const {
262   return !(*this == kind);
263 }
264
265 bool AttributeImpl::operator<(const AttributeImpl &AI) const {
266   // This sorts the attributes with Attribute::AttrKinds coming first (sorted
267   // relative to their enum value) and then strings.
268
269   if (!Kind && !AI.Kind) return false;
270   if (!Kind && AI.Kind) return true;
271   if (Kind && !AI.Kind) return false;
272
273   ConstantInt *ThisCI = dyn_cast<ConstantInt>(Kind);
274   ConstantInt *ThatCI = dyn_cast<ConstantInt>(AI.Kind);
275
276   ConstantDataArray *ThisCDA = dyn_cast<ConstantDataArray>(Kind);
277   ConstantDataArray *ThatCDA = dyn_cast<ConstantDataArray>(AI.Kind);
278
279   if (ThisCI && ThatCI)
280     return ThisCI->getZExtValue() < ThatCI->getZExtValue();
281
282   if (ThisCI && ThatCDA)
283     return true;
284
285   if (ThisCDA && ThatCI)
286     return false;
287
288   return ThisCDA->getAsString() < ThatCDA->getAsString();
289 }
290
291 uint64_t AttributeImpl::getAttrMask(Attribute::AttrKind Val) {
292   // FIXME: Remove this.
293   switch (Val) {
294   case Attribute::EndAttrKinds:
295   case Attribute::AttrKindEmptyKey:
296   case Attribute::AttrKindTombstoneKey:
297     llvm_unreachable("Synthetic enumerators which should never get here");
298
299   case Attribute::None:            return 0;
300   case Attribute::ZExt:            return 1 << 0;
301   case Attribute::SExt:            return 1 << 1;
302   case Attribute::NoReturn:        return 1 << 2;
303   case Attribute::InReg:           return 1 << 3;
304   case Attribute::StructRet:       return 1 << 4;
305   case Attribute::NoUnwind:        return 1 << 5;
306   case Attribute::NoAlias:         return 1 << 6;
307   case Attribute::ByVal:           return 1 << 7;
308   case Attribute::Nest:            return 1 << 8;
309   case Attribute::ReadNone:        return 1 << 9;
310   case Attribute::ReadOnly:        return 1 << 10;
311   case Attribute::NoInline:        return 1 << 11;
312   case Attribute::AlwaysInline:    return 1 << 12;
313   case Attribute::OptimizeForSize: return 1 << 13;
314   case Attribute::StackProtect:    return 1 << 14;
315   case Attribute::StackProtectReq: return 1 << 15;
316   case Attribute::Alignment:       return 31 << 16;
317   case Attribute::NoCapture:       return 1 << 21;
318   case Attribute::NoRedZone:       return 1 << 22;
319   case Attribute::NoImplicitFloat: return 1 << 23;
320   case Attribute::Naked:           return 1 << 24;
321   case Attribute::InlineHint:      return 1 << 25;
322   case Attribute::StackAlignment:  return 7 << 26;
323   case Attribute::ReturnsTwice:    return 1 << 29;
324   case Attribute::UWTable:         return 1 << 30;
325   case Attribute::NonLazyBind:     return 1U << 31;
326   case Attribute::AddressSafety:   return 1ULL << 32;
327   case Attribute::MinSize:         return 1ULL << 33;
328   case Attribute::NoDuplicate:     return 1ULL << 34;
329   case Attribute::StackProtectStrong: return 1ULL << 35;
330   }
331   llvm_unreachable("Unsupported attribute type");
332 }
333
334 //===----------------------------------------------------------------------===//
335 // AttributeSetNode Definition
336 //===----------------------------------------------------------------------===//
337
338 AttributeSetNode *AttributeSetNode::get(LLVMContext &C,
339                                         ArrayRef<Attribute> Attrs) {
340   if (Attrs.empty())
341     return 0;
342
343   // Otherwise, build a key to look up the existing attributes.
344   LLVMContextImpl *pImpl = C.pImpl;
345   FoldingSetNodeID ID;
346
347   SmallVector<Attribute, 8> SortedAttrs(Attrs.begin(), Attrs.end());
348   std::sort(SortedAttrs.begin(), SortedAttrs.end());
349
350   for (SmallVectorImpl<Attribute>::iterator I = SortedAttrs.begin(),
351          E = SortedAttrs.end(); I != E; ++I)
352     I->Profile(ID);
353
354   void *InsertPoint;
355   AttributeSetNode *PA =
356     pImpl->AttrsSetNodes.FindNodeOrInsertPos(ID, InsertPoint);
357
358   // If we didn't find any existing attributes of the same shape then create a
359   // new one and insert it.
360   if (!PA) {
361     PA = new AttributeSetNode(SortedAttrs);
362     pImpl->AttrsSetNodes.InsertNode(PA, InsertPoint);
363   }
364
365   // Return the AttributesListNode that we found or created.
366   return PA;
367 }
368
369 bool AttributeSetNode::hasAttribute(Attribute::AttrKind Kind) const {
370   for (SmallVectorImpl<Attribute>::const_iterator I = AttrList.begin(),
371          E = AttrList.end(); I != E; ++I)
372     if (I->hasAttribute(Kind))
373       return true;
374   return false;
375 }
376
377 unsigned AttributeSetNode::getAlignment() const {
378   for (SmallVectorImpl<Attribute>::const_iterator I = AttrList.begin(),
379          E = AttrList.end(); I != E; ++I)
380     if (I->hasAttribute(Attribute::Alignment))
381       return I->getAlignment();
382   return 0;
383 }
384
385 unsigned AttributeSetNode::getStackAlignment() const {
386   for (SmallVectorImpl<Attribute>::const_iterator I = AttrList.begin(),
387          E = AttrList.end(); I != E; ++I)
388     if (I->hasAttribute(Attribute::StackAlignment))
389       return I->getStackAlignment();
390   return 0;
391 }
392
393 std::string AttributeSetNode::getAsString() const {
394   std::string Str = "";
395   for (SmallVectorImpl<Attribute>::const_iterator I = AttrList.begin(),
396          E = AttrList.end(); I != E; ) {
397     Str += I->getAsString();
398     if (++I != E) Str += " ";
399   }
400   return Str;
401 }
402
403 //===----------------------------------------------------------------------===//
404 // AttributeSetImpl Definition
405 //===----------------------------------------------------------------------===//
406
407 uint64_t AttributeSetImpl::Raw(uint64_t Index) const {
408   for (unsigned I = 0, E = getNumAttributes(); I != E; ++I) {
409     if (getSlotIndex(I) != Index) continue;
410     const AttributeSetNode *ASN = AttrNodes[I].second;
411     AttrBuilder B;
412
413     for (AttributeSetNode::const_iterator II = ASN->begin(),
414            IE = ASN->end(); II != IE; ++II)
415       B.addAttribute(*II);
416     return B.Raw();
417   }
418
419   return 0;
420 }
421
422 //===----------------------------------------------------------------------===//
423 // AttributeSet Construction and Mutation Methods
424 //===----------------------------------------------------------------------===//
425
426 AttributeSet
427 AttributeSet::getImpl(LLVMContext &C,
428                       ArrayRef<std::pair<unsigned, AttributeSetNode*> > Attrs) {
429   LLVMContextImpl *pImpl = C.pImpl;
430   FoldingSetNodeID ID;
431   AttributeSetImpl::Profile(ID, Attrs);
432
433   void *InsertPoint;
434   AttributeSetImpl *PA = pImpl->AttrsLists.FindNodeOrInsertPos(ID, InsertPoint);
435
436   // If we didn't find any existing attributes of the same shape then
437   // create a new one and insert it.
438   if (!PA) {
439     PA = new AttributeSetImpl(C, Attrs);
440     pImpl->AttrsLists.InsertNode(PA, InsertPoint);
441   }
442
443   // Return the AttributesList that we found or created.
444   return AttributeSet(PA);
445 }
446
447 AttributeSet AttributeSet::get(LLVMContext &C,
448                                ArrayRef<std::pair<unsigned, Attribute> > Attrs){
449   // If there are no attributes then return a null AttributesList pointer.
450   if (Attrs.empty())
451     return AttributeSet();
452
453 #ifndef NDEBUG
454   for (unsigned i = 0, e = Attrs.size(); i != e; ++i) {
455     assert((!i || Attrs[i-1].first <= Attrs[i].first) &&
456            "Misordered Attributes list!");
457     assert(Attrs[i].second != Attribute::None &&
458            "Pointless attribute!");
459   }
460 #endif
461
462   // Create a vector if (unsigned, AttributeSetNode*) pairs from the attributes
463   // list.
464   SmallVector<std::pair<unsigned, AttributeSetNode*>, 8> AttrPairVec;
465   for (ArrayRef<std::pair<unsigned, Attribute> >::iterator I = Attrs.begin(),
466          E = Attrs.end(); I != E; ) {
467     unsigned Index = I->first;
468     SmallVector<Attribute, 4> AttrVec;
469     while (I != E && I->first == Index) {
470       AttrVec.push_back(I->second);
471       ++I;
472     }
473
474     AttrPairVec.push_back(std::make_pair(Index,
475                                          AttributeSetNode::get(C, AttrVec)));
476   }
477
478   return getImpl(C, AttrPairVec);
479 }
480
481 AttributeSet AttributeSet::get(LLVMContext &C,
482                                ArrayRef<std::pair<unsigned,
483                                                   AttributeSetNode*> > Attrs) {
484   // If there are no attributes then return a null AttributesList pointer.
485   if (Attrs.empty())
486     return AttributeSet();
487
488   return getImpl(C, Attrs);
489 }
490
491 AttributeSet AttributeSet::get(LLVMContext &C, unsigned Idx, AttrBuilder &B) {
492   if (!B.hasAttributes())
493     return AttributeSet();
494
495   SmallVector<std::pair<unsigned, Attribute>, 8> Attrs;
496   for (AttrBuilder::iterator I = B.begin(), E = B.end(); I != E; ++I) {
497     Attribute::AttrKind Kind = *I;
498     if (Kind == Attribute::Alignment)
499       Attrs.push_back(std::make_pair(Idx, Attribute::
500                                      getWithAlignment(C, B.getAlignment())));
501     else if (Kind == Attribute::StackAlignment)
502       Attrs.push_back(std::make_pair(Idx, Attribute::
503                               getWithStackAlignment(C, B.getStackAlignment())));
504     else
505       Attrs.push_back(std::make_pair(Idx, Attribute::get(C, Kind)));
506   }
507
508   return get(C, Attrs);
509 }
510
511 AttributeSet AttributeSet::get(LLVMContext &C, unsigned Idx,
512                                ArrayRef<Attribute::AttrKind> Kind) {
513   SmallVector<std::pair<unsigned, Attribute>, 8> Attrs;
514   for (ArrayRef<Attribute::AttrKind>::iterator I = Kind.begin(),
515          E = Kind.end(); I != E; ++I)
516     Attrs.push_back(std::make_pair(Idx, Attribute::get(C, *I)));
517   return get(C, Attrs);
518 }
519
520 AttributeSet AttributeSet::get(LLVMContext &C, ArrayRef<AttributeSet> Attrs) {
521   if (Attrs.empty()) return AttributeSet();
522
523   SmallVector<std::pair<unsigned, AttributeSetNode*>, 8> AttrNodeVec;
524   for (unsigned I = 0, E = Attrs.size(); I != E; ++I) {
525     AttributeSet AS = Attrs[I];
526     if (!AS.pImpl) continue;
527     AttrNodeVec.append(AS.pImpl->AttrNodes.begin(), AS.pImpl->AttrNodes.end());
528   }
529
530   return getImpl(C, AttrNodeVec);
531 }
532
533 AttributeSet AttributeSet::addAttribute(LLVMContext &C, unsigned Idx,
534                                         Attribute::AttrKind Attr) const {
535   return addAttributes(C, Idx, AttributeSet::get(C, Idx, Attr));
536 }
537
538 AttributeSet AttributeSet::addAttributes(LLVMContext &C, unsigned Idx,
539                                          AttributeSet Attrs) const {
540   if (!pImpl) return Attrs;
541   if (!Attrs.pImpl) return *this;
542
543 #ifndef NDEBUG
544   // FIXME it is not obvious how this should work for alignment. For now, say
545   // we can't change a known alignment.
546   unsigned OldAlign = getParamAlignment(Idx);
547   unsigned NewAlign = Attrs.getParamAlignment(Idx);
548   assert((!OldAlign || !NewAlign || OldAlign == NewAlign) &&
549          "Attempt to change alignment!");
550 #endif
551
552   // Add the attribute slots before the one we're trying to add.
553   SmallVector<AttributeSet, 4> AttrSet;
554   uint64_t NumAttrs = pImpl->getNumAttributes();
555   AttributeSet AS;
556   uint64_t LastIndex = 0;
557   for (unsigned I = 0, E = NumAttrs; I != E; ++I) {
558     if (getSlotIndex(I) >= Idx) {
559       if (getSlotIndex(I) == Idx) AS = getSlotAttributes(LastIndex++);
560       break;
561     }
562     LastIndex = I + 1;
563     AttrSet.push_back(getSlotAttributes(I));
564   }
565
566   // Now add the attribute into the correct slot. There may already be an
567   // AttributeSet there.
568   AttrBuilder B(AS, Idx);
569
570   for (unsigned I = 0, E = Attrs.pImpl->getNumAttributes(); I != E; ++I)
571     if (Attrs.getSlotIndex(I) == Idx) {
572       for (AttributeSetImpl::const_iterator II = Attrs.pImpl->begin(I),
573              IE = Attrs.pImpl->end(I); II != IE; ++II)
574         B.addAttribute(*II);
575       break;
576     }
577
578   AttrSet.push_back(AttributeSet::get(C, Idx, B));
579
580   // Add the remaining attribute slots.
581   for (unsigned I = LastIndex, E = NumAttrs; I < E; ++I)
582     AttrSet.push_back(getSlotAttributes(I));
583
584   return get(C, AttrSet);
585 }
586
587 AttributeSet AttributeSet::removeAttribute(LLVMContext &C, unsigned Idx,
588                                            Attribute::AttrKind Attr) const {
589   return removeAttributes(C, Idx, AttributeSet::get(C, Idx, Attr));
590 }
591
592 AttributeSet AttributeSet::removeAttributes(LLVMContext &C, unsigned Idx,
593                                             AttributeSet Attrs) const {
594   if (!pImpl) return AttributeSet();
595   if (!Attrs.pImpl) return *this;
596
597 #ifndef NDEBUG
598   // FIXME it is not obvious how this should work for alignment.
599   // For now, say we can't pass in alignment, which no current use does.
600   assert(!Attrs.hasAttribute(Idx, Attribute::Alignment) &&
601          "Attempt to change alignment!");
602 #endif
603
604   // Add the attribute slots before the one we're trying to add.
605   SmallVector<AttributeSet, 4> AttrSet;
606   uint64_t NumAttrs = pImpl->getNumAttributes();
607   AttributeSet AS;
608   uint64_t LastIndex = 0;
609   for (unsigned I = 0, E = NumAttrs; I != E; ++I) {
610     if (getSlotIndex(I) >= Idx) {
611       if (getSlotIndex(I) == Idx) AS = getSlotAttributes(LastIndex++);
612       break;
613     }
614     LastIndex = I + 1;
615     AttrSet.push_back(getSlotAttributes(I));
616   }
617
618   // Now remove the attribute from the correct slot. There may already be an
619   // AttributeSet there.
620   AttrBuilder B(AS, Idx);
621
622   for (unsigned I = 0, E = Attrs.pImpl->getNumAttributes(); I != E; ++I)
623     if (Attrs.getSlotIndex(I) == Idx) {
624       B.removeAttributes(Attrs.pImpl->getSlotAttributes(I), Idx);
625       break;
626     }
627
628   AttrSet.push_back(AttributeSet::get(C, Idx, B));
629
630   // Add the remaining attribute slots.
631   for (unsigned I = LastIndex, E = NumAttrs; I < E; ++I)
632     AttrSet.push_back(getSlotAttributes(I));
633
634   return get(C, AttrSet);
635 }
636
637 //===----------------------------------------------------------------------===//
638 // AttributeSet Accessor Methods
639 //===----------------------------------------------------------------------===//
640
641 AttributeSet AttributeSet::getParamAttributes(unsigned Idx) const {
642   return pImpl && hasAttributes(Idx) ?
643     AttributeSet::get(pImpl->getContext(),
644                       ArrayRef<std::pair<unsigned, AttributeSetNode*> >(
645                         std::make_pair(Idx, getAttributes(Idx)))) :
646     AttributeSet();
647 }
648
649 AttributeSet AttributeSet::getRetAttributes() const {
650   return pImpl && hasAttributes(ReturnIndex) ?
651     AttributeSet::get(pImpl->getContext(),
652                       ArrayRef<std::pair<unsigned, AttributeSetNode*> >(
653                         std::make_pair(ReturnIndex,
654                                        getAttributes(ReturnIndex)))) :
655     AttributeSet();
656 }
657
658 AttributeSet AttributeSet::getFnAttributes() const {
659   return pImpl && hasAttributes(FunctionIndex) ?
660     AttributeSet::get(pImpl->getContext(),
661                       ArrayRef<std::pair<unsigned, AttributeSetNode*> >(
662                         std::make_pair(FunctionIndex,
663                                        getAttributes(FunctionIndex)))) :
664     AttributeSet();
665 }
666
667 bool AttributeSet::hasAttribute(unsigned Index, Attribute::AttrKind Kind) const{
668   AttributeSetNode *ASN = getAttributes(Index);
669   return ASN ? ASN->hasAttribute(Kind) : false;
670 }
671
672 bool AttributeSet::hasAttributes(unsigned Index) const {
673   AttributeSetNode *ASN = getAttributes(Index);
674   return ASN ? ASN->hasAttributes() : false;
675 }
676
677 /// \brief Return true if the specified attribute is set for at least one
678 /// parameter or for the return value.
679 bool AttributeSet::hasAttrSomewhere(Attribute::AttrKind Attr) const {
680   if (pImpl == 0) return false;
681
682   for (unsigned I = 0, E = pImpl->getNumAttributes(); I != E; ++I)
683     for (AttributeSetImpl::const_iterator II = pImpl->begin(I),
684            IE = pImpl->end(I); II != IE; ++II)
685       if (II->hasAttribute(Attr))
686         return true;
687
688   return false;
689 }
690
691 unsigned AttributeSet::getParamAlignment(unsigned Index) const {
692   AttributeSetNode *ASN = getAttributes(Index);
693   return ASN ? ASN->getAlignment() : 0;
694 }
695
696 unsigned AttributeSet::getStackAlignment(unsigned Index) const {
697   AttributeSetNode *ASN = getAttributes(Index);
698   return ASN ? ASN->getStackAlignment() : 0;
699 }
700
701 std::string AttributeSet::getAsString(unsigned Index) const {
702   AttributeSetNode *ASN = getAttributes(Index);
703   return ASN ? ASN->getAsString() : std::string("");
704 }
705
706 /// \brief The attributes for the specified index are returned.
707 AttributeSetNode *AttributeSet::getAttributes(unsigned Idx) const {
708   if (!pImpl) return 0;
709
710   // Loop through to find the attribute node we want.
711   for (unsigned I = 0, E = pImpl->getNumAttributes(); I != E; ++I)
712     if (pImpl->getSlotIndex(I) == Idx)
713       return pImpl->getSlotNode(I);
714
715   return 0;
716 }
717
718 AttributeSet::iterator AttributeSet::begin(unsigned Idx) const {
719   if (!pImpl)
720     return ArrayRef<Attribute>().begin();
721   return pImpl->begin(Idx);
722 }
723
724 AttributeSet::iterator AttributeSet::end(unsigned Idx) const {
725   if (!pImpl)
726     return ArrayRef<Attribute>().end();
727   return pImpl->end(Idx);
728 }
729
730 //===----------------------------------------------------------------------===//
731 // AttributeSet Introspection Methods
732 //===----------------------------------------------------------------------===//
733
734 /// \brief Return the number of slots used in this attribute list.  This is the
735 /// number of arguments that have an attribute set on them (including the
736 /// function itself).
737 unsigned AttributeSet::getNumSlots() const {
738   return pImpl ? pImpl->getNumAttributes() : 0;
739 }
740
741 uint64_t AttributeSet::getSlotIndex(unsigned Slot) const {
742   assert(pImpl && Slot < pImpl->getNumAttributes() &&
743          "Slot # out of range!");
744   return pImpl->getSlotIndex(Slot);
745 }
746
747 AttributeSet AttributeSet::getSlotAttributes(unsigned Slot) const {
748   assert(pImpl && Slot < pImpl->getNumAttributes() &&
749          "Slot # out of range!");
750   return pImpl->getSlotAttributes(Slot);
751 }
752
753 uint64_t AttributeSet::Raw(unsigned Index) const {
754   // FIXME: Remove this.
755   return pImpl ? pImpl->Raw(Index) : 0;
756 }
757
758 void AttributeSet::dump() const {
759   dbgs() << "PAL[\n";
760
761   for (unsigned i = 0, e = getNumSlots(); i < e; ++i) {
762     uint64_t Index = getSlotIndex(i);
763     dbgs() << "  { ";
764     if (Index == ~0U)
765       dbgs() << "~0U";
766     else
767       dbgs() << Index;
768     dbgs() << " => " << getAsString(Index) << " }\n";
769   }
770
771   dbgs() << "]\n";
772 }
773
774 //===----------------------------------------------------------------------===//
775 // AttrBuilder Method Implementations
776 //===----------------------------------------------------------------------===//
777
778 AttrBuilder::AttrBuilder(AttributeSet AS, unsigned Idx)
779   : Alignment(0), StackAlignment(0) {
780   AttributeSetImpl *pImpl = AS.pImpl;
781   if (!pImpl) return;
782
783   for (unsigned I = 0, E = pImpl->getNumAttributes(); I != E; ++I) {
784     if (pImpl->getSlotIndex(I) != Idx) continue;
785
786     for (AttributeSetImpl::const_iterator II = pImpl->begin(I),
787            IE = pImpl->end(I); II != IE; ++II)
788       addAttribute(*II);
789
790     break;
791   }
792 }
793
794 void AttrBuilder::clear() {
795   Attrs.clear();
796   Alignment = StackAlignment = 0;
797 }
798
799 AttrBuilder &AttrBuilder::addAttribute(Attribute::AttrKind Val) {
800   assert(Val != Attribute::Alignment && Val != Attribute::StackAlignment &&
801          "Adding alignment attribute without adding alignment value!");
802   Attrs.insert(Val);
803   return *this;
804 }
805
806 AttrBuilder &AttrBuilder::addAttribute(Attribute Attr) {
807   ConstantInt *Kind = cast<ConstantInt>(Attr.getAttributeKind());
808   Attribute::AttrKind KindVal = Attribute::AttrKind(Kind->getZExtValue());
809   Attrs.insert(KindVal);
810
811   if (KindVal == Attribute::Alignment)
812     Alignment = Attr.getAlignment();
813   else if (KindVal == Attribute::StackAlignment)
814     StackAlignment = Attr.getStackAlignment();
815   return *this;
816 }
817
818 AttrBuilder &AttrBuilder::removeAttribute(Attribute::AttrKind Val) {
819   Attrs.erase(Val);
820
821   if (Val == Attribute::Alignment)
822     Alignment = 0;
823   else if (Val == Attribute::StackAlignment)
824     StackAlignment = 0;
825
826   return *this;
827 }
828
829 AttrBuilder &AttrBuilder::removeAttributes(AttributeSet A, uint64_t Index) {
830   unsigned Idx = ~0U;
831   for (unsigned I = 0, E = A.getNumSlots(); I != E; ++I)
832     if (A.getSlotIndex(I) == Index) {
833       Idx = I;
834       break;
835     }
836
837   assert(Idx != ~0U && "Couldn't find index in AttributeSet!");
838
839   for (AttributeSet::iterator I = A.begin(Idx), E = A.end(Idx); I != E; ++I) {
840     ConstantInt *CI = cast<ConstantInt>(I->getAttributeKind());
841     Attribute::AttrKind Kind = Attribute::AttrKind(CI->getZExtValue());
842     Attrs.erase(Kind);
843
844     if (Kind == Attribute::Alignment)
845       Alignment = 0;
846     else if (Kind == Attribute::StackAlignment)
847       StackAlignment = 0;
848   }
849
850   return *this;
851 }
852
853 AttrBuilder &AttrBuilder::addAlignmentAttr(unsigned Align) {
854   if (Align == 0) return *this;
855
856   assert(isPowerOf2_32(Align) && "Alignment must be a power of two.");
857   assert(Align <= 0x40000000 && "Alignment too large.");
858
859   Attrs.insert(Attribute::Alignment);
860   Alignment = Align;
861   return *this;
862 }
863
864 AttrBuilder &AttrBuilder::addStackAlignmentAttr(unsigned Align) {
865   // Default alignment, allow the target to define how to align it.
866   if (Align == 0) return *this;
867
868   assert(isPowerOf2_32(Align) && "Alignment must be a power of two.");
869   assert(Align <= 0x100 && "Alignment too large.");
870
871   Attrs.insert(Attribute::StackAlignment);
872   StackAlignment = Align;
873   return *this;
874 }
875
876 bool AttrBuilder::contains(Attribute::AttrKind A) const {
877   return Attrs.count(A);
878 }
879
880 bool AttrBuilder::hasAttributes() const {
881   return !Attrs.empty();
882 }
883
884 bool AttrBuilder::hasAttributes(AttributeSet A, uint64_t Index) const {
885   unsigned Idx = ~0U;
886   for (unsigned I = 0, E = A.getNumSlots(); I != E; ++I)
887     if (A.getSlotIndex(I) == Index) {
888       Idx = I;
889       break;
890     }
891
892   assert(Idx != ~0U && "Couldn't find the index!");
893
894   for (AttributeSet::iterator I = A.begin(Idx), E = A.end(Idx);
895        I != E; ++I) {
896     Attribute Attr = *I;
897     // FIXME: Support StringRefs.
898     Attribute::AttrKind Kind = Attribute::AttrKind(
899       cast<ConstantInt>(Attr.getAttributeKind())->getZExtValue());
900
901     if (Attrs.count(Kind))
902       return true;
903   }
904
905   return false;
906 }
907
908 bool AttrBuilder::hasAlignmentAttr() const {
909   return Alignment != 0;
910 }
911
912 bool AttrBuilder::operator==(const AttrBuilder &B) {
913   SmallVector<Attribute::AttrKind, 8> This(Attrs.begin(), Attrs.end());
914   SmallVector<Attribute::AttrKind, 8> That(B.Attrs.begin(), B.Attrs.end());
915   return This == That;
916 }
917
918 AttrBuilder &AttrBuilder::addRawValue(uint64_t Val) {
919   if (!Val) return *this;
920
921   for (Attribute::AttrKind I = Attribute::None; I != Attribute::EndAttrKinds;
922        I = Attribute::AttrKind(I + 1)) {
923     if (uint64_t A = (Val & AttributeImpl::getAttrMask(I))) {
924       Attrs.insert(I);
925  
926       if (I == Attribute::Alignment)
927         Alignment = 1ULL << ((A >> 16) - 1);
928       else if (I == Attribute::StackAlignment)
929         StackAlignment = 1ULL << ((A >> 26)-1);
930     }
931   }
932  
933   return *this;
934 }
935
936 uint64_t AttrBuilder::Raw() const {
937   uint64_t Mask = 0;
938
939   for (DenseSet<Attribute::AttrKind>::const_iterator I = Attrs.begin(),
940          E = Attrs.end(); I != E; ++I) {
941     Attribute::AttrKind Kind = *I;
942
943     if (Kind == Attribute::Alignment)
944       Mask |= (Log2_32(Alignment) + 1) << 16;
945     else if (Kind == Attribute::StackAlignment)
946       Mask |= (Log2_32(StackAlignment) + 1) << 26;
947     else
948       Mask |= AttributeImpl::getAttrMask(Kind);
949   }
950
951   return Mask;
952 }
953
954 //===----------------------------------------------------------------------===//
955 // AttributeFuncs Function Defintions
956 //===----------------------------------------------------------------------===//
957
958 /// \brief Which attributes cannot be applied to a type.
959 AttributeSet AttributeFuncs::typeIncompatible(Type *Ty, uint64_t Index) {
960   AttrBuilder Incompatible;
961
962   if (!Ty->isIntegerTy())
963     // Attribute that only apply to integers.
964     Incompatible.addAttribute(Attribute::SExt)
965       .addAttribute(Attribute::ZExt);
966
967   if (!Ty->isPointerTy())
968     // Attribute that only apply to pointers.
969     Incompatible.addAttribute(Attribute::ByVal)
970       .addAttribute(Attribute::Nest)
971       .addAttribute(Attribute::NoAlias)
972       .addAttribute(Attribute::NoCapture)
973       .addAttribute(Attribute::StructRet);
974
975   return AttributeSet::get(Ty->getContext(), Index, Incompatible);
976 }
977
978 /// \brief This returns an integer containing an encoding of all the LLVM
979 /// attributes found in the given attribute bitset.  Any change to this encoding
980 /// is a breaking change to bitcode compatibility.
981 /// N.B. This should be used only by the bitcode reader!
982 uint64_t AttributeFuncs::encodeLLVMAttributesForBitcode(AttributeSet Attrs,
983                                                         unsigned Index) {
984   // FIXME: It doesn't make sense to store the alignment information as an
985   // expanded out value, we should store it as a log2 value.  However, we can't
986   // just change that here without breaking bitcode compatibility.  If this ever
987   // becomes a problem in practice, we should introduce new tag numbers in the
988   // bitcode file and have those tags use a more efficiently encoded alignment
989   // field.
990
991   // Store the alignment in the bitcode as a 16-bit raw value instead of a 5-bit
992   // log2 encoded value. Shift the bits above the alignment up by 11 bits.
993   uint64_t EncodedAttrs = Attrs.Raw(Index) & 0xffff;
994   if (Attrs.hasAttribute(Index, Attribute::Alignment))
995     EncodedAttrs |= Attrs.getParamAlignment(Index) << 16;
996   EncodedAttrs |= (Attrs.Raw(Index) & (0xffffULL << 21)) << 11;
997   return EncodedAttrs;
998 }
999
1000 /// \brief This fills an AttrBuilder object with the LLVM attributes that have
1001 /// been decoded from the given integer. This function must stay in sync with
1002 /// 'encodeLLVMAttributesForBitcode'.
1003 /// N.B. This should be used only by the bitcode reader!
1004 void AttributeFuncs::decodeLLVMAttributesForBitcode(LLVMContext &C,
1005                                                     AttrBuilder &B,
1006                                                     uint64_t EncodedAttrs) {
1007   // The alignment is stored as a 16-bit raw value from bits 31--16.  We shift
1008   // the bits above 31 down by 11 bits.
1009   unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16;
1010   assert((!Alignment || isPowerOf2_32(Alignment)) &&
1011          "Alignment must be a power of two.");
1012
1013   if (Alignment)
1014     B.addAlignmentAttr(Alignment);
1015   B.addRawValue(((EncodedAttrs & (0xffffULL << 32)) >> 11) |
1016                 (EncodedAttrs & 0xffff));
1017 }