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 // AttributeListImpl, and AttributeList classes.
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #include "AttributeImpl.h"
17 #include "LLVMContextImpl.h"
18 #include "llvm/ADT/ArrayRef.h"
19 #include "llvm/ADT/FoldingSet.h"
20 #include "llvm/ADT/Optional.h"
21 #include "llvm/ADT/SmallVector.h"
22 #include "llvm/ADT/STLExtras.h"
23 #include "llvm/ADT/StringExtras.h"
24 #include "llvm/ADT/StringRef.h"
25 #include "llvm/ADT/Twine.h"
26 #include "llvm/IR/Attributes.h"
27 #include "llvm/IR/Function.h"
28 #include "llvm/IR/LLVMContext.h"
29 #include "llvm/IR/Type.h"
30 #include "llvm/Support/Compiler.h"
31 #include "llvm/Support/Debug.h"
32 #include "llvm/Support/ErrorHandling.h"
33 #include "llvm/Support/MathExtras.h"
34 #include "llvm/Support/raw_ostream.h"
35 #include <algorithm>
36 #include <cassert>
37 #include <cstdint>
38 #include <limits>
39 #include <map>
40 #include <string>
41 #include <tuple>
42 #include <utility>
43 
44 using namespace llvm;
45 
46 //===----------------------------------------------------------------------===//
47 // Attribute Construction Methods
48 //===----------------------------------------------------------------------===//
49 
50 // allocsize has two integer arguments, but because they're both 32 bits, we can
51 // pack them into one 64-bit value, at the cost of making said value
52 // nonsensical.
53 //
54 // In order to do this, we need to reserve one value of the second (optional)
55 // allocsize argument to signify "not present."
56 static const unsigned AllocSizeNumElemsNotPresent = -1;
57 
58 static uint64_t packAllocSizeArgs(unsigned ElemSizeArg,
59                                   const Optional<unsigned> &NumElemsArg) {
60   assert((!NumElemsArg.hasValue() ||
61           *NumElemsArg != AllocSizeNumElemsNotPresent) &&
62          "Attempting to pack a reserved value");
63 
64   return uint64_t(ElemSizeArg) << 32 |
65          NumElemsArg.getValueOr(AllocSizeNumElemsNotPresent);
66 }
67 
68 static std::pair<unsigned, Optional<unsigned>>
69 unpackAllocSizeArgs(uint64_t Num) {
70   unsigned NumElems = Num & std::numeric_limits<unsigned>::max();
71   unsigned ElemSizeArg = Num >> 32;
72 
73   Optional<unsigned> NumElemsArg;
74   if (NumElems != AllocSizeNumElemsNotPresent)
75     NumElemsArg = NumElems;
76   return std::make_pair(ElemSizeArg, NumElemsArg);
77 }
78 
79 Attribute Attribute::get(LLVMContext &Context, Attribute::AttrKind Kind,
80                          uint64_t Val) {
81   LLVMContextImpl *pImpl = Context.pImpl;
82   FoldingSetNodeID ID;
83   ID.AddInteger(Kind);
84   if (Val) ID.AddInteger(Val);
85 
86   void *InsertPoint;
87   AttributeImpl *PA = pImpl->AttrsSet.FindNodeOrInsertPos(ID, InsertPoint);
88 
89   if (!PA) {
90     // If we didn't find any existing attributes of the same shape then create a
91     // new one and insert it.
92     if (!Val)
93       PA = new EnumAttributeImpl(Kind);
94     else
95       PA = new IntAttributeImpl(Kind, Val);
96     pImpl->AttrsSet.InsertNode(PA, InsertPoint);
97   }
98 
99   // Return the Attribute that we found or created.
100   return Attribute(PA);
101 }
102 
103 Attribute Attribute::get(LLVMContext &Context, StringRef Kind, StringRef Val) {
104   LLVMContextImpl *pImpl = Context.pImpl;
105   FoldingSetNodeID ID;
106   ID.AddString(Kind);
107   if (!Val.empty()) ID.AddString(Val);
108 
109   void *InsertPoint;
110   AttributeImpl *PA = pImpl->AttrsSet.FindNodeOrInsertPos(ID, InsertPoint);
111 
112   if (!PA) {
113     // If we didn't find any existing attributes of the same shape then create a
114     // new one and insert it.
115     PA = new StringAttributeImpl(Kind, Val);
116     pImpl->AttrsSet.InsertNode(PA, InsertPoint);
117   }
118 
119   // Return the Attribute that we found or created.
120   return Attribute(PA);
121 }
122 
123 Attribute Attribute::getWithAlignment(LLVMContext &Context, uint64_t Align) {
124   assert(isPowerOf2_32(Align) && "Alignment must be a power of two.");
125   assert(Align <= 0x40000000 && "Alignment too large.");
126   return get(Context, Alignment, Align);
127 }
128 
129 Attribute Attribute::getWithStackAlignment(LLVMContext &Context,
130                                            uint64_t Align) {
131   assert(isPowerOf2_32(Align) && "Alignment must be a power of two.");
132   assert(Align <= 0x100 && "Alignment too large.");
133   return get(Context, StackAlignment, Align);
134 }
135 
136 Attribute Attribute::getWithDereferenceableBytes(LLVMContext &Context,
137                                                 uint64_t Bytes) {
138   assert(Bytes && "Bytes must be non-zero.");
139   return get(Context, Dereferenceable, Bytes);
140 }
141 
142 Attribute Attribute::getWithDereferenceableOrNullBytes(LLVMContext &Context,
143                                                        uint64_t Bytes) {
144   assert(Bytes && "Bytes must be non-zero.");
145   return get(Context, DereferenceableOrNull, Bytes);
146 }
147 
148 Attribute
149 Attribute::getWithAllocSizeArgs(LLVMContext &Context, unsigned ElemSizeArg,
150                                 const Optional<unsigned> &NumElemsArg) {
151   assert(!(ElemSizeArg == 0 && NumElemsArg && *NumElemsArg == 0) &&
152          "Invalid allocsize arguments -- given allocsize(0, 0)");
153   return get(Context, AllocSize, packAllocSizeArgs(ElemSizeArg, NumElemsArg));
154 }
155 
156 //===----------------------------------------------------------------------===//
157 // Attribute Accessor Methods
158 //===----------------------------------------------------------------------===//
159 
160 bool Attribute::isEnumAttribute() const {
161   return pImpl && pImpl->isEnumAttribute();
162 }
163 
164 bool Attribute::isIntAttribute() const {
165   return pImpl && pImpl->isIntAttribute();
166 }
167 
168 bool Attribute::isStringAttribute() const {
169   return pImpl && pImpl->isStringAttribute();
170 }
171 
172 Attribute::AttrKind Attribute::getKindAsEnum() const {
173   if (!pImpl) return None;
174   assert((isEnumAttribute() || isIntAttribute()) &&
175          "Invalid attribute type to get the kind as an enum!");
176   return pImpl->getKindAsEnum();
177 }
178 
179 uint64_t Attribute::getValueAsInt() const {
180   if (!pImpl) return 0;
181   assert(isIntAttribute() &&
182          "Expected the attribute to be an integer attribute!");
183   return pImpl->getValueAsInt();
184 }
185 
186 StringRef Attribute::getKindAsString() const {
187   if (!pImpl) return StringRef();
188   assert(isStringAttribute() &&
189          "Invalid attribute type to get the kind as a string!");
190   return pImpl->getKindAsString();
191 }
192 
193 StringRef Attribute::getValueAsString() const {
194   if (!pImpl) return StringRef();
195   assert(isStringAttribute() &&
196          "Invalid attribute type to get the value as a string!");
197   return pImpl->getValueAsString();
198 }
199 
200 bool Attribute::hasAttribute(AttrKind Kind) const {
201   return (pImpl && pImpl->hasAttribute(Kind)) || (!pImpl && Kind == None);
202 }
203 
204 bool Attribute::hasAttribute(StringRef Kind) const {
205   if (!isStringAttribute()) return false;
206   return pImpl && pImpl->hasAttribute(Kind);
207 }
208 
209 unsigned Attribute::getAlignment() const {
210   assert(hasAttribute(Attribute::Alignment) &&
211          "Trying to get alignment from non-alignment attribute!");
212   return pImpl->getValueAsInt();
213 }
214 
215 unsigned Attribute::getStackAlignment() const {
216   assert(hasAttribute(Attribute::StackAlignment) &&
217          "Trying to get alignment from non-alignment attribute!");
218   return pImpl->getValueAsInt();
219 }
220 
221 uint64_t Attribute::getDereferenceableBytes() const {
222   assert(hasAttribute(Attribute::Dereferenceable) &&
223          "Trying to get dereferenceable bytes from "
224          "non-dereferenceable attribute!");
225   return pImpl->getValueAsInt();
226 }
227 
228 uint64_t Attribute::getDereferenceableOrNullBytes() const {
229   assert(hasAttribute(Attribute::DereferenceableOrNull) &&
230          "Trying to get dereferenceable bytes from "
231          "non-dereferenceable attribute!");
232   return pImpl->getValueAsInt();
233 }
234 
235 std::pair<unsigned, Optional<unsigned>> Attribute::getAllocSizeArgs() const {
236   assert(hasAttribute(Attribute::AllocSize) &&
237          "Trying to get allocsize args from non-allocsize attribute");
238   return unpackAllocSizeArgs(pImpl->getValueAsInt());
239 }
240 
241 std::string Attribute::getAsString(bool InAttrGrp) const {
242   if (!pImpl) return "";
243 
244   if (hasAttribute(Attribute::SanitizeAddress))
245     return "sanitize_address";
246   if (hasAttribute(Attribute::AlwaysInline))
247     return "alwaysinline";
248   if (hasAttribute(Attribute::ArgMemOnly))
249     return "argmemonly";
250   if (hasAttribute(Attribute::Builtin))
251     return "builtin";
252   if (hasAttribute(Attribute::ByVal))
253     return "byval";
254   if (hasAttribute(Attribute::Convergent))
255     return "convergent";
256   if (hasAttribute(Attribute::SwiftError))
257     return "swifterror";
258   if (hasAttribute(Attribute::SwiftSelf))
259     return "swiftself";
260   if (hasAttribute(Attribute::InaccessibleMemOnly))
261     return "inaccessiblememonly";
262   if (hasAttribute(Attribute::InaccessibleMemOrArgMemOnly))
263     return "inaccessiblemem_or_argmemonly";
264   if (hasAttribute(Attribute::InAlloca))
265     return "inalloca";
266   if (hasAttribute(Attribute::InlineHint))
267     return "inlinehint";
268   if (hasAttribute(Attribute::InReg))
269     return "inreg";
270   if (hasAttribute(Attribute::JumpTable))
271     return "jumptable";
272   if (hasAttribute(Attribute::MinSize))
273     return "minsize";
274   if (hasAttribute(Attribute::Naked))
275     return "naked";
276   if (hasAttribute(Attribute::Nest))
277     return "nest";
278   if (hasAttribute(Attribute::NoAlias))
279     return "noalias";
280   if (hasAttribute(Attribute::NoBuiltin))
281     return "nobuiltin";
282   if (hasAttribute(Attribute::NoCapture))
283     return "nocapture";
284   if (hasAttribute(Attribute::NoDuplicate))
285     return "noduplicate";
286   if (hasAttribute(Attribute::NoImplicitFloat))
287     return "noimplicitfloat";
288   if (hasAttribute(Attribute::NoInline))
289     return "noinline";
290   if (hasAttribute(Attribute::NonLazyBind))
291     return "nonlazybind";
292   if (hasAttribute(Attribute::NonNull))
293     return "nonnull";
294   if (hasAttribute(Attribute::NoRedZone))
295     return "noredzone";
296   if (hasAttribute(Attribute::NoReturn))
297     return "noreturn";
298   if (hasAttribute(Attribute::NoRecurse))
299     return "norecurse";
300   if (hasAttribute(Attribute::NoUnwind))
301     return "nounwind";
302   if (hasAttribute(Attribute::OptimizeNone))
303     return "optnone";
304   if (hasAttribute(Attribute::OptimizeForSize))
305     return "optsize";
306   if (hasAttribute(Attribute::ReadNone))
307     return "readnone";
308   if (hasAttribute(Attribute::ReadOnly))
309     return "readonly";
310   if (hasAttribute(Attribute::WriteOnly))
311     return "writeonly";
312   if (hasAttribute(Attribute::Returned))
313     return "returned";
314   if (hasAttribute(Attribute::ReturnsTwice))
315     return "returns_twice";
316   if (hasAttribute(Attribute::SExt))
317     return "signext";
318   if (hasAttribute(Attribute::Speculatable))
319     return "speculatable";
320   if (hasAttribute(Attribute::StackProtect))
321     return "ssp";
322   if (hasAttribute(Attribute::StackProtectReq))
323     return "sspreq";
324   if (hasAttribute(Attribute::StackProtectStrong))
325     return "sspstrong";
326   if (hasAttribute(Attribute::SafeStack))
327     return "safestack";
328   if (hasAttribute(Attribute::StructRet))
329     return "sret";
330   if (hasAttribute(Attribute::SanitizeThread))
331     return "sanitize_thread";
332   if (hasAttribute(Attribute::SanitizeMemory))
333     return "sanitize_memory";
334   if (hasAttribute(Attribute::UWTable))
335     return "uwtable";
336   if (hasAttribute(Attribute::ZExt))
337     return "zeroext";
338   if (hasAttribute(Attribute::Cold))
339     return "cold";
340 
341   // FIXME: These should be output like this:
342   //
343   //   align=4
344   //   alignstack=8
345   //
346   if (hasAttribute(Attribute::Alignment)) {
347     std::string Result;
348     Result += "align";
349     Result += (InAttrGrp) ? "=" : " ";
350     Result += utostr(getValueAsInt());
351     return Result;
352   }
353 
354   auto AttrWithBytesToString = [&](const char *Name) {
355     std::string Result;
356     Result += Name;
357     if (InAttrGrp) {
358       Result += "=";
359       Result += utostr(getValueAsInt());
360     } else {
361       Result += "(";
362       Result += utostr(getValueAsInt());
363       Result += ")";
364     }
365     return Result;
366   };
367 
368   if (hasAttribute(Attribute::StackAlignment))
369     return AttrWithBytesToString("alignstack");
370 
371   if (hasAttribute(Attribute::Dereferenceable))
372     return AttrWithBytesToString("dereferenceable");
373 
374   if (hasAttribute(Attribute::DereferenceableOrNull))
375     return AttrWithBytesToString("dereferenceable_or_null");
376 
377   if (hasAttribute(Attribute::AllocSize)) {
378     unsigned ElemSize;
379     Optional<unsigned> NumElems;
380     std::tie(ElemSize, NumElems) = getAllocSizeArgs();
381 
382     std::string Result = "allocsize(";
383     Result += utostr(ElemSize);
384     if (NumElems.hasValue()) {
385       Result += ',';
386       Result += utostr(*NumElems);
387     }
388     Result += ')';
389     return Result;
390   }
391 
392   // Convert target-dependent attributes to strings of the form:
393   //
394   //   "kind"
395   //   "kind" = "value"
396   //
397   if (isStringAttribute()) {
398     std::string Result;
399     Result += (Twine('"') + getKindAsString() + Twine('"')).str();
400 
401     std::string AttrVal = pImpl->getValueAsString();
402     if (AttrVal.empty()) return Result;
403 
404     // Since some attribute strings contain special characters that cannot be
405     // printable, those have to be escaped to make the attribute value printable
406     // as is.  e.g. "\01__gnu_mcount_nc"
407     {
408       raw_string_ostream OS(Result);
409       OS << "=\"";
410       PrintEscapedString(AttrVal, OS);
411       OS << "\"";
412     }
413     return Result;
414   }
415 
416   llvm_unreachable("Unknown attribute");
417 }
418 
419 bool Attribute::operator<(Attribute A) const {
420   if (!pImpl && !A.pImpl) return false;
421   if (!pImpl) return true;
422   if (!A.pImpl) return false;
423   return *pImpl < *A.pImpl;
424 }
425 
426 //===----------------------------------------------------------------------===//
427 // AttributeImpl Definition
428 //===----------------------------------------------------------------------===//
429 
430 // Pin the vtables to this file.
431 AttributeImpl::~AttributeImpl() = default;
432 
433 void EnumAttributeImpl::anchor() {}
434 
435 void IntAttributeImpl::anchor() {}
436 
437 void StringAttributeImpl::anchor() {}
438 
439 bool AttributeImpl::hasAttribute(Attribute::AttrKind A) const {
440   if (isStringAttribute()) return false;
441   return getKindAsEnum() == A;
442 }
443 
444 bool AttributeImpl::hasAttribute(StringRef Kind) const {
445   if (!isStringAttribute()) return false;
446   return getKindAsString() == Kind;
447 }
448 
449 Attribute::AttrKind AttributeImpl::getKindAsEnum() const {
450   assert(isEnumAttribute() || isIntAttribute());
451   return static_cast<const EnumAttributeImpl *>(this)->getEnumKind();
452 }
453 
454 uint64_t AttributeImpl::getValueAsInt() const {
455   assert(isIntAttribute());
456   return static_cast<const IntAttributeImpl *>(this)->getValue();
457 }
458 
459 StringRef AttributeImpl::getKindAsString() const {
460   assert(isStringAttribute());
461   return static_cast<const StringAttributeImpl *>(this)->getStringKind();
462 }
463 
464 StringRef AttributeImpl::getValueAsString() const {
465   assert(isStringAttribute());
466   return static_cast<const StringAttributeImpl *>(this)->getStringValue();
467 }
468 
469 bool AttributeImpl::operator<(const AttributeImpl &AI) const {
470   // This sorts the attributes with Attribute::AttrKinds coming first (sorted
471   // relative to their enum value) and then strings.
472   if (isEnumAttribute()) {
473     if (AI.isEnumAttribute()) return getKindAsEnum() < AI.getKindAsEnum();
474     if (AI.isIntAttribute()) return true;
475     if (AI.isStringAttribute()) return true;
476   }
477 
478   if (isIntAttribute()) {
479     if (AI.isEnumAttribute()) return false;
480     if (AI.isIntAttribute()) {
481       if (getKindAsEnum() == AI.getKindAsEnum())
482         return getValueAsInt() < AI.getValueAsInt();
483       return getKindAsEnum() < AI.getKindAsEnum();
484     }
485     if (AI.isStringAttribute()) return true;
486   }
487 
488   if (AI.isEnumAttribute()) return false;
489   if (AI.isIntAttribute()) return false;
490   if (getKindAsString() == AI.getKindAsString())
491     return getValueAsString() < AI.getValueAsString();
492   return getKindAsString() < AI.getKindAsString();
493 }
494 
495 //===----------------------------------------------------------------------===//
496 // AttributeSet Definition
497 //===----------------------------------------------------------------------===//
498 
499 AttributeSet AttributeSet::get(LLVMContext &C, const AttrBuilder &B) {
500   return AttributeSet(AttributeSetNode::get(C, B));
501 }
502 
503 AttributeSet AttributeSet::get(LLVMContext &C, ArrayRef<Attribute> Attrs) {
504   return AttributeSet(AttributeSetNode::get(C, Attrs));
505 }
506 
507 unsigned AttributeSet::getNumAttributes() const {
508   return SetNode ? SetNode->getNumAttributes() : 0;
509 }
510 
511 bool AttributeSet::hasAttribute(Attribute::AttrKind Kind) const {
512   return SetNode ? SetNode->hasAttribute(Kind) : 0;
513 }
514 
515 bool AttributeSet::hasAttribute(StringRef Kind) const {
516   return SetNode ? SetNode->hasAttribute(Kind) : 0;
517 }
518 
519 Attribute AttributeSet::getAttribute(Attribute::AttrKind Kind) const {
520   return SetNode ? SetNode->getAttribute(Kind) : Attribute();
521 }
522 
523 Attribute AttributeSet::getAttribute(StringRef Kind) const {
524   return SetNode ? SetNode->getAttribute(Kind) : Attribute();
525 }
526 
527 unsigned AttributeSet::getAlignment() const {
528   return SetNode ? SetNode->getAlignment() : 0;
529 }
530 
531 unsigned AttributeSet::getStackAlignment() const {
532   return SetNode ? SetNode->getStackAlignment() : 0;
533 }
534 
535 uint64_t AttributeSet::getDereferenceableBytes() const {
536   return SetNode ? SetNode->getDereferenceableBytes() : 0;
537 }
538 
539 uint64_t AttributeSet::getDereferenceableOrNullBytes() const {
540   return SetNode ? SetNode->getDereferenceableOrNullBytes() : 0;
541 }
542 
543 std::pair<unsigned, Optional<unsigned>> AttributeSet::getAllocSizeArgs() const {
544   return SetNode ? SetNode->getAllocSizeArgs()
545                  : std::pair<unsigned, Optional<unsigned>>(0, 0);
546 }
547 
548 std::string AttributeSet::getAsString(bool InAttrGrp) const {
549   return SetNode ? SetNode->getAsString(InAttrGrp) : "";
550 }
551 
552 AttributeSet::iterator AttributeSet::begin() const {
553   return SetNode ? SetNode->begin() : nullptr;
554 }
555 
556 AttributeSet::iterator AttributeSet::end() const {
557   return SetNode ? SetNode->end() : nullptr;
558 }
559 
560 //===----------------------------------------------------------------------===//
561 // AttributeSetNode Definition
562 //===----------------------------------------------------------------------===//
563 
564 AttributeSetNode::AttributeSetNode(ArrayRef<Attribute> Attrs)
565     : AvailableAttrs(0), NumAttrs(Attrs.size()) {
566   // There's memory after the node where we can store the entries in.
567   std::copy(Attrs.begin(), Attrs.end(), getTrailingObjects<Attribute>());
568 
569   for (Attribute I : *this) {
570     if (!I.isStringAttribute()) {
571       AvailableAttrs |= ((uint64_t)1) << I.getKindAsEnum();
572     }
573   }
574 }
575 
576 AttributeSetNode *AttributeSetNode::get(LLVMContext &C,
577                                         ArrayRef<Attribute> Attrs) {
578   if (Attrs.empty())
579     return nullptr;
580 
581   // Otherwise, build a key to look up the existing attributes.
582   LLVMContextImpl *pImpl = C.pImpl;
583   FoldingSetNodeID ID;
584 
585   SmallVector<Attribute, 8> SortedAttrs(Attrs.begin(), Attrs.end());
586   std::sort(SortedAttrs.begin(), SortedAttrs.end());
587 
588   for (Attribute Attr : SortedAttrs)
589     Attr.Profile(ID);
590 
591   void *InsertPoint;
592   AttributeSetNode *PA =
593     pImpl->AttrsSetNodes.FindNodeOrInsertPos(ID, InsertPoint);
594 
595   // If we didn't find any existing attributes of the same shape then create a
596   // new one and insert it.
597   if (!PA) {
598     // Coallocate entries after the AttributeSetNode itself.
599     void *Mem = ::operator new(totalSizeToAlloc<Attribute>(SortedAttrs.size()));
600     PA = new (Mem) AttributeSetNode(SortedAttrs);
601     pImpl->AttrsSetNodes.InsertNode(PA, InsertPoint);
602   }
603 
604   // Return the AttributeSetNode that we found or created.
605   return PA;
606 }
607 
608 AttributeSetNode *AttributeSetNode::get(LLVMContext &C, const AttrBuilder &B) {
609   // Add target-independent attributes.
610   SmallVector<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     Attribute Attr;
617     switch (Kind) {
618     case Attribute::Alignment:
619       Attr = Attribute::getWithAlignment(C, B.getAlignment());
620       break;
621     case Attribute::StackAlignment:
622       Attr = Attribute::getWithStackAlignment(C, B.getStackAlignment());
623       break;
624     case Attribute::Dereferenceable:
625       Attr = Attribute::getWithDereferenceableBytes(
626           C, B.getDereferenceableBytes());
627       break;
628     case Attribute::DereferenceableOrNull:
629       Attr = Attribute::getWithDereferenceableOrNullBytes(
630           C, B.getDereferenceableOrNullBytes());
631       break;
632     case Attribute::AllocSize: {
633       auto A = B.getAllocSizeArgs();
634       Attr = Attribute::getWithAllocSizeArgs(C, A.first, A.second);
635       break;
636     }
637     default:
638       Attr = Attribute::get(C, Kind);
639     }
640     Attrs.push_back(Attr);
641   }
642 
643   // Add target-dependent (string) attributes.
644   for (const auto &TDA : B.td_attrs())
645     Attrs.emplace_back(Attribute::get(C, TDA.first, TDA.second));
646 
647   return get(C, Attrs);
648 }
649 
650 bool AttributeSetNode::hasAttribute(StringRef Kind) const {
651   for (Attribute I : *this)
652     if (I.hasAttribute(Kind))
653       return true;
654   return false;
655 }
656 
657 Attribute AttributeSetNode::getAttribute(Attribute::AttrKind Kind) const {
658   if (hasAttribute(Kind)) {
659     for (Attribute I : *this)
660       if (I.hasAttribute(Kind))
661         return I;
662   }
663   return Attribute();
664 }
665 
666 Attribute AttributeSetNode::getAttribute(StringRef Kind) const {
667   for (Attribute I : *this)
668     if (I.hasAttribute(Kind))
669       return I;
670   return Attribute();
671 }
672 
673 unsigned AttributeSetNode::getAlignment() const {
674   for (Attribute I : *this)
675     if (I.hasAttribute(Attribute::Alignment))
676       return I.getAlignment();
677   return 0;
678 }
679 
680 unsigned AttributeSetNode::getStackAlignment() const {
681   for (Attribute I : *this)
682     if (I.hasAttribute(Attribute::StackAlignment))
683       return I.getStackAlignment();
684   return 0;
685 }
686 
687 uint64_t AttributeSetNode::getDereferenceableBytes() const {
688   for (Attribute I : *this)
689     if (I.hasAttribute(Attribute::Dereferenceable))
690       return I.getDereferenceableBytes();
691   return 0;
692 }
693 
694 uint64_t AttributeSetNode::getDereferenceableOrNullBytes() const {
695   for (Attribute I : *this)
696     if (I.hasAttribute(Attribute::DereferenceableOrNull))
697       return I.getDereferenceableOrNullBytes();
698   return 0;
699 }
700 
701 std::pair<unsigned, Optional<unsigned>>
702 AttributeSetNode::getAllocSizeArgs() const {
703   for (Attribute I : *this)
704     if (I.hasAttribute(Attribute::AllocSize))
705       return I.getAllocSizeArgs();
706   return std::make_pair(0, 0);
707 }
708 
709 std::string AttributeSetNode::getAsString(bool InAttrGrp) const {
710   std::string Str;
711   for (iterator I = begin(), E = end(); I != E; ++I) {
712     if (I != begin())
713       Str += ' ';
714     Str += I->getAsString(InAttrGrp);
715   }
716   return Str;
717 }
718 
719 //===----------------------------------------------------------------------===//
720 // AttributeListImpl Definition
721 //===----------------------------------------------------------------------===//
722 
723 AttributeListImpl::AttributeListImpl(
724     LLVMContext &C, ArrayRef<std::pair<unsigned, AttributeSet>> Slots)
725     : Context(C), NumSlots(Slots.size()), AvailableFunctionAttrs(0) {
726 #ifndef NDEBUG
727   assert(!Slots.empty() && "pointless AttributeListImpl");
728   if (Slots.size() >= 2) {
729     auto &PrevPair = Slots.front();
730     for (auto &CurPair : Slots.drop_front()) {
731       assert(PrevPair.first <= CurPair.first && "Attribute set not ordered!");
732     }
733   }
734 #endif
735 
736   // There's memory after the node where we can store the entries in.
737   std::copy(Slots.begin(), Slots.end(), getTrailingObjects<IndexAttrPair>());
738 
739   // Initialize AvailableFunctionAttrs summary bitset.
740   static_assert(Attribute::EndAttrKinds <=
741                     sizeof(AvailableFunctionAttrs) * CHAR_BIT,
742                 "Too many attributes");
743   static_assert(AttributeList::FunctionIndex == ~0u,
744                 "FunctionIndex should be biggest possible index");
745   const auto &Last = Slots.back();
746   if (Last.first == AttributeList::FunctionIndex) {
747     AttributeSet Node = Last.second;
748     for (Attribute I : Node) {
749       if (!I.isStringAttribute())
750         AvailableFunctionAttrs |= ((uint64_t)1) << I.getKindAsEnum();
751     }
752   }
753 }
754 
755 void AttributeListImpl::Profile(FoldingSetNodeID &ID) const {
756   Profile(ID, makeArrayRef(getSlotPair(0), getNumSlots()));
757 }
758 
759 void AttributeListImpl::Profile(
760     FoldingSetNodeID &ID, ArrayRef<std::pair<unsigned, AttributeSet>> Nodes) {
761   for (const auto &Node : Nodes) {
762     ID.AddInteger(Node.first);
763     ID.AddPointer(Node.second.SetNode);
764   }
765 }
766 
767 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
768 LLVM_DUMP_METHOD void AttributeListImpl::dump() const {
769   AttributeList(const_cast<AttributeListImpl *>(this)).dump();
770 }
771 #endif
772 
773 //===----------------------------------------------------------------------===//
774 // AttributeList Construction and Mutation Methods
775 //===----------------------------------------------------------------------===//
776 
777 AttributeList AttributeList::getImpl(
778     LLVMContext &C, ArrayRef<std::pair<unsigned, AttributeSet>> Attrs) {
779   assert(!Attrs.empty() && "creating pointless AttributeList");
780 #ifndef NDEBUG
781   unsigned LastIndex = 0;
782   bool IsFirst = true;
783   for (auto &&AttrPair : Attrs) {
784     assert((IsFirst || LastIndex < AttrPair.first) &&
785            "unsorted or duplicate AttributeList indices");
786     assert(AttrPair.second.hasAttributes() && "pointless AttributeList slot");
787     LastIndex = AttrPair.first;
788     IsFirst = false;
789   }
790 #endif
791 
792   LLVMContextImpl *pImpl = C.pImpl;
793   FoldingSetNodeID ID;
794   AttributeListImpl::Profile(ID, Attrs);
795 
796   void *InsertPoint;
797   AttributeListImpl *PA =
798       pImpl->AttrsLists.FindNodeOrInsertPos(ID, InsertPoint);
799 
800   // If we didn't find any existing attributes of the same shape then
801   // create a new one and insert it.
802   if (!PA) {
803     // Coallocate entries after the AttributeListImpl itself.
804     void *Mem = ::operator new(
805         AttributeListImpl::totalSizeToAlloc<IndexAttrPair>(Attrs.size()));
806     PA = new (Mem) AttributeListImpl(C, Attrs);
807     pImpl->AttrsLists.InsertNode(PA, InsertPoint);
808   }
809 
810   // Return the AttributesList that we found or created.
811   return AttributeList(PA);
812 }
813 
814 AttributeList
815 AttributeList::get(LLVMContext &C,
816                    ArrayRef<std::pair<unsigned, Attribute>> Attrs) {
817   // If there are no attributes then return a null AttributesList pointer.
818   if (Attrs.empty())
819     return AttributeList();
820 
821   assert(std::is_sorted(Attrs.begin(), Attrs.end(),
822                         [](const std::pair<unsigned, Attribute> &LHS,
823                            const std::pair<unsigned, Attribute> &RHS) {
824                           return LHS.first < RHS.first;
825                         }) && "Misordered Attributes list!");
826   assert(none_of(Attrs,
827                  [](const std::pair<unsigned, Attribute> &Pair) {
828                    return Pair.second.hasAttribute(Attribute::None);
829                  }) &&
830          "Pointless attribute!");
831 
832   // Create a vector if (unsigned, AttributeSetNode*) pairs from the attributes
833   // list.
834   SmallVector<std::pair<unsigned, AttributeSet>, 8> AttrPairVec;
835   for (ArrayRef<std::pair<unsigned, Attribute>>::iterator I = Attrs.begin(),
836          E = Attrs.end(); I != E; ) {
837     unsigned Index = I->first;
838     SmallVector<Attribute, 4> AttrVec;
839     while (I != E && I->first == Index) {
840       AttrVec.push_back(I->second);
841       ++I;
842     }
843 
844     AttrPairVec.emplace_back(Index, AttributeSet::get(C, AttrVec));
845   }
846 
847   return getImpl(C, AttrPairVec);
848 }
849 
850 AttributeList
851 AttributeList::get(LLVMContext &C,
852                    ArrayRef<std::pair<unsigned, AttributeSet>> Attrs) {
853   // If there are no attributes then return a null AttributesList pointer.
854   if (Attrs.empty())
855     return AttributeList();
856 
857   return getImpl(C, Attrs);
858 }
859 
860 AttributeList AttributeList::get(LLVMContext &C, AttributeSet FnAttrs,
861                                  AttributeSet RetAttrs,
862                                  ArrayRef<AttributeSet> ArgAttrs) {
863   SmallVector<std::pair<unsigned, AttributeSet>, 8> AttrPairs;
864   if (RetAttrs.hasAttributes())
865     AttrPairs.emplace_back(ReturnIndex, RetAttrs);
866   size_t Index = 1;
867   for (AttributeSet AS : ArgAttrs) {
868     if (AS.hasAttributes())
869       AttrPairs.emplace_back(Index, AS);
870     ++Index;
871   }
872   if (FnAttrs.hasAttributes())
873     AttrPairs.emplace_back(FunctionIndex, FnAttrs);
874   if (AttrPairs.empty())
875     return AttributeList();
876   return getImpl(C, AttrPairs);
877 }
878 
879 AttributeList AttributeList::get(LLVMContext &C, unsigned Index,
880                                  const AttrBuilder &B) {
881   if (!B.hasAttributes())
882     return AttributeList();
883   AttributeSet AS = AttributeSet::get(C, B);
884   std::pair<unsigned, AttributeSet> Arr[1] = {{Index, AS}};
885   return getImpl(C, Arr);
886 }
887 
888 AttributeList AttributeList::get(LLVMContext &C, unsigned Index,
889                                  ArrayRef<Attribute::AttrKind> Kinds) {
890   SmallVector<std::pair<unsigned, Attribute>, 8> Attrs;
891   for (Attribute::AttrKind K : Kinds)
892     Attrs.emplace_back(Index, Attribute::get(C, K));
893   return get(C, Attrs);
894 }
895 
896 AttributeList AttributeList::get(LLVMContext &C, unsigned Index,
897                                  ArrayRef<StringRef> Kinds) {
898   SmallVector<std::pair<unsigned, Attribute>, 8> Attrs;
899   for (StringRef K : Kinds)
900     Attrs.emplace_back(Index, Attribute::get(C, K));
901   return get(C, Attrs);
902 }
903 
904 AttributeList AttributeList::get(LLVMContext &C,
905                                  ArrayRef<AttributeList> Attrs) {
906   if (Attrs.empty())
907     return AttributeList();
908   if (Attrs.size() == 1) return Attrs[0];
909 
910   SmallVector<std::pair<unsigned, AttributeSet>, 8> AttrNodeVec;
911   AttributeListImpl *A0 = Attrs[0].pImpl;
912   if (A0)
913     AttrNodeVec.append(A0->getSlotPair(0), A0->getSlotPair(A0->getNumSlots()));
914   // Copy all attributes from Attrs into AttrNodeVec while keeping AttrNodeVec
915   // ordered by index.  Because we know that each list in Attrs is ordered by
916   // index we only need to merge each successive list in rather than doing a
917   // full sort.
918   for (unsigned I = 1, E = Attrs.size(); I != E; ++I) {
919     AttributeListImpl *ALI = Attrs[I].pImpl;
920     if (!ALI) continue;
921     SmallVector<std::pair<unsigned, AttributeSet>, 8>::iterator
922       ANVI = AttrNodeVec.begin(), ANVE;
923     for (const IndexAttrPair *AI = ALI->getSlotPair(0),
924                              *AE = ALI->getSlotPair(ALI->getNumSlots());
925          AI != AE; ++AI) {
926       ANVE = AttrNodeVec.end();
927       while (ANVI != ANVE && ANVI->first <= AI->first)
928         ++ANVI;
929       ANVI = AttrNodeVec.insert(ANVI, *AI) + 1;
930     }
931   }
932 
933   return getImpl(C, AttrNodeVec);
934 }
935 
936 AttributeList AttributeList::addAttribute(LLVMContext &C, unsigned Index,
937                                           Attribute::AttrKind Kind) const {
938   if (hasAttribute(Index, Kind)) return *this;
939   AttrBuilder B;
940   B.addAttribute(Kind);
941   return addAttributes(C, Index, B);
942 }
943 
944 AttributeList AttributeList::addAttribute(LLVMContext &C, unsigned Index,
945                                           StringRef Kind,
946                                           StringRef Value) const {
947   AttrBuilder B;
948   B.addAttribute(Kind, Value);
949   return addAttributes(C, Index, B);
950 }
951 
952 AttributeList AttributeList::addAttribute(LLVMContext &C,
953                                           ArrayRef<unsigned> Indices,
954                                           Attribute A) const {
955   assert(std::is_sorted(Indices.begin(), Indices.end()));
956 
957   unsigned I = 0, E = pImpl ? pImpl->getNumSlots() : 0;
958   SmallVector<IndexAttrPair, 4> AttrVec;
959   for (unsigned Index : Indices) {
960     // Add all attribute slots before the current index.
961     for (; I < E && getSlotIndex(I) < Index; ++I)
962       AttrVec.emplace_back(getSlotIndex(I), pImpl->getSlotAttributes(I));
963 
964     // Add the attribute at this index. If we already have attributes at this
965     // index, merge them into a new set.
966     AttrBuilder B;
967     if (I < E && getSlotIndex(I) == Index) {
968       B.merge(AttrBuilder(pImpl->getSlotAttributes(I)));
969       ++I;
970     }
971     B.addAttribute(A);
972     AttrVec.emplace_back(Index, AttributeSet::get(C, B));
973   }
974 
975   // Add remaining attributes.
976   for (; I < E; ++I)
977     AttrVec.emplace_back(getSlotIndex(I), pImpl->getSlotAttributes(I));
978 
979   return get(C, AttrVec);
980 }
981 
982 AttributeList AttributeList::addAttributes(LLVMContext &C, unsigned Index,
983                                            const AttrBuilder &B) const {
984   if (!B.hasAttributes())
985     return *this;
986 
987   if (!pImpl)
988     return AttributeList::get(C, {{Index, AttributeSet::get(C, B)}});
989 
990 #ifndef NDEBUG
991   // FIXME it is not obvious how this should work for alignment. For now, say
992   // we can't change a known alignment.
993   unsigned OldAlign = getParamAlignment(Index);
994   unsigned NewAlign = B.getAlignment();
995   assert((!OldAlign || !NewAlign || OldAlign == NewAlign) &&
996          "Attempt to change alignment!");
997 #endif
998 
999   SmallVector<IndexAttrPair, 4> AttrVec;
1000   uint64_t NumAttrs = pImpl->getNumSlots();
1001   unsigned I;
1002 
1003   // Add all the attribute slots before the one we need to merge.
1004   for (I = 0; I < NumAttrs; ++I) {
1005     if (getSlotIndex(I) >= Index)
1006       break;
1007     AttrVec.emplace_back(getSlotIndex(I), pImpl->getSlotAttributes(I));
1008   }
1009 
1010   AttrBuilder NewAttrs;
1011   if (I < NumAttrs && getSlotIndex(I) == Index) {
1012     // We need to merge the attribute sets.
1013     NewAttrs.merge(pImpl->getSlotAttributes(I));
1014     ++I;
1015   }
1016   NewAttrs.merge(B);
1017 
1018   // Add the new or merged attribute set at this index.
1019   AttrVec.emplace_back(Index, AttributeSet::get(C, NewAttrs));
1020 
1021   // Add the remaining entries.
1022   for (; I < NumAttrs; ++I)
1023     AttrVec.emplace_back(getSlotIndex(I), pImpl->getSlotAttributes(I));
1024 
1025   return get(C, AttrVec);
1026 }
1027 
1028 AttributeList AttributeList::removeAttribute(LLVMContext &C, unsigned Index,
1029                                              Attribute::AttrKind Kind) const {
1030   if (!hasAttribute(Index, Kind)) return *this;
1031   AttrBuilder B;
1032   B.addAttribute(Kind);
1033   return removeAttributes(C, Index, B);
1034 }
1035 
1036 AttributeList AttributeList::removeAttribute(LLVMContext &C, unsigned Index,
1037                                              StringRef Kind) const {
1038   if (!hasAttribute(Index, Kind)) return *this;
1039   AttrBuilder B;
1040   B.addAttribute(Kind);
1041   return removeAttributes(C, Index, B);
1042 }
1043 
1044 AttributeList AttributeList::removeAttributes(LLVMContext &C, unsigned Index,
1045                                               const AttrBuilder &Attrs) const {
1046   if (!pImpl)
1047     return AttributeList();
1048 
1049   // FIXME it is not obvious how this should work for alignment.
1050   // For now, say we can't pass in alignment, which no current use does.
1051   assert(!Attrs.hasAlignmentAttr() && "Attempt to change alignment!");
1052 
1053   // Add the attribute slots before the one we're trying to add.
1054   SmallVector<IndexAttrPair, 4> AttrSets;
1055   uint64_t NumAttrs = pImpl->getNumSlots();
1056   AttrBuilder B;
1057   uint64_t LastIndex = 0;
1058   for (unsigned I = 0, E = NumAttrs; I != E; ++I) {
1059     if (getSlotIndex(I) >= Index) {
1060       if (getSlotIndex(I) == Index)
1061         B = AttrBuilder(getSlotAttributes(LastIndex++));
1062       break;
1063     }
1064     LastIndex = I + 1;
1065     AttrSets.push_back({getSlotIndex(I), getSlotAttributes(I)});
1066   }
1067 
1068   // Remove the attributes from the existing set and add them.
1069   B.remove(Attrs);
1070   if (B.hasAttributes())
1071     AttrSets.push_back({Index, AttributeSet::get(C, B)});
1072 
1073   // Add the remaining attribute slots.
1074   for (unsigned I = LastIndex, E = NumAttrs; I < E; ++I)
1075     AttrSets.push_back({getSlotIndex(I), getSlotAttributes(I)});
1076 
1077   return get(C, AttrSets);
1078 }
1079 
1080 AttributeList AttributeList::removeAttributes(LLVMContext &C,
1081                                               unsigned WithoutIndex) const {
1082   if (!pImpl)
1083     return AttributeList();
1084 
1085   SmallVector<std::pair<unsigned, AttributeSet>, 4> AttrSet;
1086   for (unsigned I = 0, E = pImpl->getNumSlots(); I != E; ++I) {
1087     unsigned Index = getSlotIndex(I);
1088     if (Index != WithoutIndex)
1089       AttrSet.push_back({Index, pImpl->getSlotAttributes(I)});
1090   }
1091   return get(C, AttrSet);
1092 }
1093 
1094 AttributeList AttributeList::addDereferenceableAttr(LLVMContext &C,
1095                                                     unsigned Index,
1096                                                     uint64_t Bytes) const {
1097   AttrBuilder B;
1098   B.addDereferenceableAttr(Bytes);
1099   return addAttributes(C, Index, B);
1100 }
1101 
1102 AttributeList
1103 AttributeList::addDereferenceableOrNullAttr(LLVMContext &C, unsigned Index,
1104                                             uint64_t Bytes) const {
1105   AttrBuilder B;
1106   B.addDereferenceableOrNullAttr(Bytes);
1107   return addAttributes(C, Index, B);
1108 }
1109 
1110 AttributeList
1111 AttributeList::addAllocSizeAttr(LLVMContext &C, unsigned Index,
1112                                 unsigned ElemSizeArg,
1113                                 const Optional<unsigned> &NumElemsArg) {
1114   AttrBuilder B;
1115   B.addAllocSizeAttr(ElemSizeArg, NumElemsArg);
1116   return addAttributes(C, Index, B);
1117 }
1118 
1119 //===----------------------------------------------------------------------===//
1120 // AttributeList Accessor Methods
1121 //===----------------------------------------------------------------------===//
1122 
1123 LLVMContext &AttributeList::getContext() const { return pImpl->getContext(); }
1124 
1125 AttributeSet AttributeList::getParamAttributes(unsigned ArgNo) const {
1126   return getAttributes(ArgNo + FirstArgIndex);
1127 }
1128 
1129 AttributeSet AttributeList::getRetAttributes() const {
1130   return getAttributes(ReturnIndex);
1131 }
1132 
1133 AttributeSet AttributeList::getFnAttributes() const {
1134   return getAttributes(FunctionIndex);
1135 }
1136 
1137 bool AttributeList::hasAttribute(unsigned Index,
1138                                  Attribute::AttrKind Kind) const {
1139   return getAttributes(Index).hasAttribute(Kind);
1140 }
1141 
1142 bool AttributeList::hasAttribute(unsigned Index, StringRef Kind) const {
1143   return getAttributes(Index).hasAttribute(Kind);
1144 }
1145 
1146 bool AttributeList::hasAttributes(unsigned Index) const {
1147   return getAttributes(Index).hasAttributes();
1148 }
1149 
1150 bool AttributeList::hasFnAttribute(Attribute::AttrKind Kind) const {
1151   return pImpl && pImpl->hasFnAttribute(Kind);
1152 }
1153 
1154 bool AttributeList::hasFnAttribute(StringRef Kind) const {
1155   return hasAttribute(AttributeList::FunctionIndex, Kind);
1156 }
1157 
1158 bool AttributeList::hasParamAttribute(unsigned ArgNo,
1159                                       Attribute::AttrKind Kind) const {
1160   return hasAttribute(ArgNo + 1, Kind);
1161 }
1162 
1163 bool AttributeList::hasAttrSomewhere(Attribute::AttrKind Attr,
1164                                      unsigned *Index) const {
1165   if (!pImpl) return false;
1166 
1167   for (unsigned I = 0, E = pImpl->getNumSlots(); I != E; ++I)
1168     for (AttributeListImpl::iterator II = pImpl->begin(I), IE = pImpl->end(I);
1169          II != IE; ++II)
1170       if (II->hasAttribute(Attr)) {
1171         if (Index) *Index = pImpl->getSlotIndex(I);
1172         return true;
1173       }
1174 
1175   return false;
1176 }
1177 
1178 Attribute AttributeList::getAttribute(unsigned Index,
1179                                       Attribute::AttrKind Kind) const {
1180   return getAttributes(Index).getAttribute(Kind);
1181 }
1182 
1183 Attribute AttributeList::getAttribute(unsigned Index, StringRef Kind) const {
1184   return getAttributes(Index).getAttribute(Kind);
1185 }
1186 
1187 unsigned AttributeList::getRetAlignment() const {
1188   return getAttributes(ReturnIndex).getAlignment();
1189 }
1190 
1191 unsigned AttributeList::getParamAlignment(unsigned ArgNo) const {
1192   return getAttributes(ArgNo + FirstArgIndex).getAlignment();
1193 }
1194 
1195 unsigned AttributeList::getStackAlignment(unsigned Index) const {
1196   return getAttributes(Index).getStackAlignment();
1197 }
1198 
1199 uint64_t AttributeList::getDereferenceableBytes(unsigned Index) const {
1200   return getAttributes(Index).getDereferenceableBytes();
1201 }
1202 
1203 uint64_t AttributeList::getDereferenceableOrNullBytes(unsigned Index) const {
1204   return getAttributes(Index).getDereferenceableOrNullBytes();
1205 }
1206 
1207 std::pair<unsigned, Optional<unsigned>>
1208 AttributeList::getAllocSizeArgs(unsigned Index) const {
1209   return getAttributes(Index).getAllocSizeArgs();
1210 }
1211 
1212 std::string AttributeList::getAsString(unsigned Index, bool InAttrGrp) const {
1213   return getAttributes(Index).getAsString(InAttrGrp);
1214 }
1215 
1216 AttributeSet AttributeList::getAttributes(unsigned Index) const {
1217   if (!pImpl) return AttributeSet();
1218 
1219   // Loop through to find the attribute node we want.
1220   for (unsigned I = 0, E = pImpl->getNumSlots(); I != E; ++I)
1221     if (pImpl->getSlotIndex(I) == Index)
1222       return pImpl->getSlotAttributes(I);
1223 
1224   return AttributeSet();
1225 }
1226 
1227 AttributeList::iterator AttributeList::begin(unsigned Slot) const {
1228   if (!pImpl)
1229     return ArrayRef<Attribute>().begin();
1230   return pImpl->begin(Slot);
1231 }
1232 
1233 AttributeList::iterator AttributeList::end(unsigned Slot) const {
1234   if (!pImpl)
1235     return ArrayRef<Attribute>().end();
1236   return pImpl->end(Slot);
1237 }
1238 
1239 //===----------------------------------------------------------------------===//
1240 // AttributeList Introspection Methods
1241 //===----------------------------------------------------------------------===//
1242 
1243 unsigned AttributeList::getNumSlots() const {
1244   return pImpl ? pImpl->getNumSlots() : 0;
1245 }
1246 
1247 unsigned AttributeList::getSlotIndex(unsigned Slot) const {
1248   assert(pImpl && Slot < pImpl->getNumSlots() &&
1249          "Slot # out of range!");
1250   return pImpl->getSlotIndex(Slot);
1251 }
1252 
1253 AttributeSet AttributeList::getSlotAttributes(unsigned Slot) const {
1254   assert(pImpl && Slot < pImpl->getNumSlots() &&
1255          "Slot # out of range!");
1256   return pImpl->getSlotAttributes(Slot);
1257 }
1258 
1259 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1260 LLVM_DUMP_METHOD void AttributeList::dump() const {
1261   dbgs() << "PAL[\n";
1262 
1263   for (unsigned i = 0, e = getNumSlots(); i < e; ++i) {
1264     uint64_t Index = getSlotIndex(i);
1265     dbgs() << "  { ";
1266     if (Index == ~0U)
1267       dbgs() << "~0U";
1268     else
1269       dbgs() << Index;
1270     dbgs() << " => " << getAsString(Index) << " }\n";
1271   }
1272 
1273   dbgs() << "]\n";
1274 }
1275 #endif
1276 
1277 //===----------------------------------------------------------------------===//
1278 // AttrBuilder Method Implementations
1279 //===----------------------------------------------------------------------===//
1280 
1281 AttrBuilder::AttrBuilder(AttributeList AL, unsigned Index) {
1282   AttributeListImpl *pImpl = AL.pImpl;
1283   if (!pImpl) return;
1284 
1285   for (unsigned I = 0, E = pImpl->getNumSlots(); I != E; ++I) {
1286     if (pImpl->getSlotIndex(I) != Index) continue;
1287 
1288     for (AttributeListImpl::iterator II = pImpl->begin(I), IE = pImpl->end(I);
1289          II != IE; ++II)
1290       addAttribute(*II);
1291 
1292     break;
1293   }
1294 }
1295 
1296 AttrBuilder::AttrBuilder(AttributeSet AS) {
1297   if (AS.hasAttributes()) {
1298     for (const Attribute &A : AS)
1299       addAttribute(A);
1300   }
1301 }
1302 
1303 void AttrBuilder::clear() {
1304   Attrs.reset();
1305   TargetDepAttrs.clear();
1306   Alignment = StackAlignment = DerefBytes = DerefOrNullBytes = 0;
1307   AllocSizeArgs = 0;
1308 }
1309 
1310 AttrBuilder &AttrBuilder::addAttribute(Attribute::AttrKind Val) {
1311   assert((unsigned)Val < Attribute::EndAttrKinds && "Attribute out of range!");
1312   assert(Val != Attribute::Alignment && Val != Attribute::StackAlignment &&
1313          Val != Attribute::Dereferenceable && Val != Attribute::AllocSize &&
1314          "Adding integer attribute without adding a value!");
1315   Attrs[Val] = true;
1316   return *this;
1317 }
1318 
1319 AttrBuilder &AttrBuilder::addAttribute(Attribute Attr) {
1320   if (Attr.isStringAttribute()) {
1321     addAttribute(Attr.getKindAsString(), Attr.getValueAsString());
1322     return *this;
1323   }
1324 
1325   Attribute::AttrKind Kind = Attr.getKindAsEnum();
1326   Attrs[Kind] = true;
1327 
1328   if (Kind == Attribute::Alignment)
1329     Alignment = Attr.getAlignment();
1330   else if (Kind == Attribute::StackAlignment)
1331     StackAlignment = Attr.getStackAlignment();
1332   else if (Kind == Attribute::Dereferenceable)
1333     DerefBytes = Attr.getDereferenceableBytes();
1334   else if (Kind == Attribute::DereferenceableOrNull)
1335     DerefOrNullBytes = Attr.getDereferenceableOrNullBytes();
1336   else if (Kind == Attribute::AllocSize)
1337     AllocSizeArgs = Attr.getValueAsInt();
1338   return *this;
1339 }
1340 
1341 AttrBuilder &AttrBuilder::addAttribute(StringRef A, StringRef V) {
1342   TargetDepAttrs[A] = V;
1343   return *this;
1344 }
1345 
1346 AttrBuilder &AttrBuilder::removeAttribute(Attribute::AttrKind Val) {
1347   assert((unsigned)Val < Attribute::EndAttrKinds && "Attribute out of range!");
1348   Attrs[Val] = false;
1349 
1350   if (Val == Attribute::Alignment)
1351     Alignment = 0;
1352   else if (Val == Attribute::StackAlignment)
1353     StackAlignment = 0;
1354   else if (Val == Attribute::Dereferenceable)
1355     DerefBytes = 0;
1356   else if (Val == Attribute::DereferenceableOrNull)
1357     DerefOrNullBytes = 0;
1358   else if (Val == Attribute::AllocSize)
1359     AllocSizeArgs = 0;
1360 
1361   return *this;
1362 }
1363 
1364 AttrBuilder &AttrBuilder::removeAttributes(AttributeList A, uint64_t Index) {
1365   remove(A.getAttributes(Index));
1366   return *this;
1367 }
1368 
1369 AttrBuilder &AttrBuilder::removeAttribute(StringRef A) {
1370   std::map<std::string, std::string>::iterator I = TargetDepAttrs.find(A);
1371   if (I != TargetDepAttrs.end())
1372     TargetDepAttrs.erase(I);
1373   return *this;
1374 }
1375 
1376 std::pair<unsigned, Optional<unsigned>> AttrBuilder::getAllocSizeArgs() const {
1377   return unpackAllocSizeArgs(AllocSizeArgs);
1378 }
1379 
1380 AttrBuilder &AttrBuilder::addAlignmentAttr(unsigned Align) {
1381   if (Align == 0) return *this;
1382 
1383   assert(isPowerOf2_32(Align) && "Alignment must be a power of two.");
1384   assert(Align <= 0x40000000 && "Alignment too large.");
1385 
1386   Attrs[Attribute::Alignment] = true;
1387   Alignment = Align;
1388   return *this;
1389 }
1390 
1391 AttrBuilder &AttrBuilder::addStackAlignmentAttr(unsigned Align) {
1392   // Default alignment, allow the target to define how to align it.
1393   if (Align == 0) return *this;
1394 
1395   assert(isPowerOf2_32(Align) && "Alignment must be a power of two.");
1396   assert(Align <= 0x100 && "Alignment too large.");
1397 
1398   Attrs[Attribute::StackAlignment] = true;
1399   StackAlignment = Align;
1400   return *this;
1401 }
1402 
1403 AttrBuilder &AttrBuilder::addDereferenceableAttr(uint64_t Bytes) {
1404   if (Bytes == 0) return *this;
1405 
1406   Attrs[Attribute::Dereferenceable] = true;
1407   DerefBytes = Bytes;
1408   return *this;
1409 }
1410 
1411 AttrBuilder &AttrBuilder::addDereferenceableOrNullAttr(uint64_t Bytes) {
1412   if (Bytes == 0)
1413     return *this;
1414 
1415   Attrs[Attribute::DereferenceableOrNull] = true;
1416   DerefOrNullBytes = Bytes;
1417   return *this;
1418 }
1419 
1420 AttrBuilder &AttrBuilder::addAllocSizeAttr(unsigned ElemSize,
1421                                            const Optional<unsigned> &NumElems) {
1422   return addAllocSizeAttrFromRawRepr(packAllocSizeArgs(ElemSize, NumElems));
1423 }
1424 
1425 AttrBuilder &AttrBuilder::addAllocSizeAttrFromRawRepr(uint64_t RawArgs) {
1426   // (0, 0) is our "not present" value, so we need to check for it here.
1427   assert(RawArgs && "Invalid allocsize arguments -- given allocsize(0, 0)");
1428 
1429   Attrs[Attribute::AllocSize] = true;
1430   // Reuse existing machinery to store this as a single 64-bit integer so we can
1431   // save a few bytes over using a pair<unsigned, Optional<unsigned>>.
1432   AllocSizeArgs = RawArgs;
1433   return *this;
1434 }
1435 
1436 AttrBuilder &AttrBuilder::merge(const AttrBuilder &B) {
1437   // FIXME: What if both have alignments, but they don't match?!
1438   if (!Alignment)
1439     Alignment = B.Alignment;
1440 
1441   if (!StackAlignment)
1442     StackAlignment = B.StackAlignment;
1443 
1444   if (!DerefBytes)
1445     DerefBytes = B.DerefBytes;
1446 
1447   if (!DerefOrNullBytes)
1448     DerefOrNullBytes = B.DerefOrNullBytes;
1449 
1450   if (!AllocSizeArgs)
1451     AllocSizeArgs = B.AllocSizeArgs;
1452 
1453   Attrs |= B.Attrs;
1454 
1455   for (auto I : B.td_attrs())
1456     TargetDepAttrs[I.first] = I.second;
1457 
1458   return *this;
1459 }
1460 
1461 AttrBuilder &AttrBuilder::remove(const AttrBuilder &B) {
1462   // FIXME: What if both have alignments, but they don't match?!
1463   if (B.Alignment)
1464     Alignment = 0;
1465 
1466   if (B.StackAlignment)
1467     StackAlignment = 0;
1468 
1469   if (B.DerefBytes)
1470     DerefBytes = 0;
1471 
1472   if (B.DerefOrNullBytes)
1473     DerefOrNullBytes = 0;
1474 
1475   if (B.AllocSizeArgs)
1476     AllocSizeArgs = 0;
1477 
1478   Attrs &= ~B.Attrs;
1479 
1480   for (auto I : B.td_attrs())
1481     TargetDepAttrs.erase(I.first);
1482 
1483   return *this;
1484 }
1485 
1486 bool AttrBuilder::overlaps(const AttrBuilder &B) const {
1487   // First check if any of the target independent attributes overlap.
1488   if ((Attrs & B.Attrs).any())
1489     return true;
1490 
1491   // Then check if any target dependent ones do.
1492   for (const auto &I : td_attrs())
1493     if (B.contains(I.first))
1494       return true;
1495 
1496   return false;
1497 }
1498 
1499 bool AttrBuilder::contains(StringRef A) const {
1500   return TargetDepAttrs.find(A) != TargetDepAttrs.end();
1501 }
1502 
1503 bool AttrBuilder::hasAttributes() const {
1504   return !Attrs.none() || !TargetDepAttrs.empty();
1505 }
1506 
1507 bool AttrBuilder::hasAttributes(AttributeList AL, uint64_t Index) const {
1508   AttributeSet AS = AL.getAttributes(Index);
1509 
1510   for (Attribute Attr : AS) {
1511     if (Attr.isEnumAttribute() || Attr.isIntAttribute()) {
1512       if (contains(Attr.getKindAsEnum()))
1513         return true;
1514     } else {
1515       assert(Attr.isStringAttribute() && "Invalid attribute kind!");
1516       return contains(Attr.getKindAsString());
1517     }
1518   }
1519 
1520   return false;
1521 }
1522 
1523 bool AttrBuilder::hasAlignmentAttr() const {
1524   return Alignment != 0;
1525 }
1526 
1527 bool AttrBuilder::operator==(const AttrBuilder &B) {
1528   if (Attrs != B.Attrs)
1529     return false;
1530 
1531   for (td_const_iterator I = TargetDepAttrs.begin(),
1532          E = TargetDepAttrs.end(); I != E; ++I)
1533     if (B.TargetDepAttrs.find(I->first) == B.TargetDepAttrs.end())
1534       return false;
1535 
1536   return Alignment == B.Alignment && StackAlignment == B.StackAlignment &&
1537          DerefBytes == B.DerefBytes;
1538 }
1539 
1540 //===----------------------------------------------------------------------===//
1541 // AttributeFuncs Function Defintions
1542 //===----------------------------------------------------------------------===//
1543 
1544 /// \brief Which attributes cannot be applied to a type.
1545 AttrBuilder AttributeFuncs::typeIncompatible(Type *Ty) {
1546   AttrBuilder Incompatible;
1547 
1548   if (!Ty->isIntegerTy())
1549     // Attribute that only apply to integers.
1550     Incompatible.addAttribute(Attribute::SExt)
1551       .addAttribute(Attribute::ZExt);
1552 
1553   if (!Ty->isPointerTy())
1554     // Attribute that only apply to pointers.
1555     Incompatible.addAttribute(Attribute::ByVal)
1556       .addAttribute(Attribute::Nest)
1557       .addAttribute(Attribute::NoAlias)
1558       .addAttribute(Attribute::NoCapture)
1559       .addAttribute(Attribute::NonNull)
1560       .addDereferenceableAttr(1) // the int here is ignored
1561       .addDereferenceableOrNullAttr(1) // the int here is ignored
1562       .addAttribute(Attribute::ReadNone)
1563       .addAttribute(Attribute::ReadOnly)
1564       .addAttribute(Attribute::StructRet)
1565       .addAttribute(Attribute::InAlloca);
1566 
1567   return Incompatible;
1568 }
1569 
1570 template<typename AttrClass>
1571 static bool isEqual(const Function &Caller, const Function &Callee) {
1572   return Caller.getFnAttribute(AttrClass::getKind()) ==
1573          Callee.getFnAttribute(AttrClass::getKind());
1574 }
1575 
1576 /// \brief Compute the logical AND of the attributes of the caller and the
1577 /// callee.
1578 ///
1579 /// This function sets the caller's attribute to false if the callee's attribute
1580 /// is false.
1581 template<typename AttrClass>
1582 static void setAND(Function &Caller, const Function &Callee) {
1583   if (AttrClass::isSet(Caller, AttrClass::getKind()) &&
1584       !AttrClass::isSet(Callee, AttrClass::getKind()))
1585     AttrClass::set(Caller, AttrClass::getKind(), false);
1586 }
1587 
1588 /// \brief Compute the logical OR of the attributes of the caller and the
1589 /// callee.
1590 ///
1591 /// This function sets the caller's attribute to true if the callee's attribute
1592 /// is true.
1593 template<typename AttrClass>
1594 static void setOR(Function &Caller, const Function &Callee) {
1595   if (!AttrClass::isSet(Caller, AttrClass::getKind()) &&
1596       AttrClass::isSet(Callee, AttrClass::getKind()))
1597     AttrClass::set(Caller, AttrClass::getKind(), true);
1598 }
1599 
1600 /// \brief If the inlined function had a higher stack protection level than the
1601 /// calling function, then bump up the caller's stack protection level.
1602 static void adjustCallerSSPLevel(Function &Caller, const Function &Callee) {
1603   // If upgrading the SSP attribute, clear out the old SSP Attributes first.
1604   // Having multiple SSP attributes doesn't actually hurt, but it adds useless
1605   // clutter to the IR.
1606   AttrBuilder OldSSPAttr;
1607   OldSSPAttr.addAttribute(Attribute::StackProtect)
1608       .addAttribute(Attribute::StackProtectStrong)
1609       .addAttribute(Attribute::StackProtectReq);
1610 
1611   if (Callee.hasFnAttribute(Attribute::StackProtectReq)) {
1612     Caller.removeAttributes(AttributeList::FunctionIndex, OldSSPAttr);
1613     Caller.addFnAttr(Attribute::StackProtectReq);
1614   } else if (Callee.hasFnAttribute(Attribute::StackProtectStrong) &&
1615              !Caller.hasFnAttribute(Attribute::StackProtectReq)) {
1616     Caller.removeAttributes(AttributeList::FunctionIndex, OldSSPAttr);
1617     Caller.addFnAttr(Attribute::StackProtectStrong);
1618   } else if (Callee.hasFnAttribute(Attribute::StackProtect) &&
1619              !Caller.hasFnAttribute(Attribute::StackProtectReq) &&
1620              !Caller.hasFnAttribute(Attribute::StackProtectStrong))
1621     Caller.addFnAttr(Attribute::StackProtect);
1622 }
1623 
1624 #define GET_ATTR_COMPAT_FUNC
1625 #include "AttributesCompatFunc.inc"
1626 
1627 bool AttributeFuncs::areInlineCompatible(const Function &Caller,
1628                                          const Function &Callee) {
1629   return hasCompatibleFnAttrs(Caller, Callee);
1630 }
1631 
1632 void AttributeFuncs::mergeAttributesForInlining(Function &Caller,
1633                                                 const Function &Callee) {
1634   mergeFnAttrs(Caller, Callee);
1635 }
1636