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