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