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