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