1//===- DebugInfoMetadata.cpp - Implement debug info metadata --------------===// 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// This file implements the debug info Metadata classes. 11// 12//===----------------------------------------------------------------------===// 13 14#include "llvm/IR/DebugInfoMetadata.h" 15#include "LLVMContextImpl.h" 16#include "MetadataImpl.h" 17#include "llvm/ADT/StringSwitch.h" 18#include "llvm/IR/Function.h" 19 20using namespace llvm; 21 22DILocation::DILocation(LLVMContext &C, StorageType Storage, unsigned Line, 23 unsigned Column, ArrayRef<Metadata *> MDs) 24 : MDNode(C, DILocationKind, Storage, MDs) { 25 assert((MDs.size() == 1 || MDs.size() == 2) && 26 "Expected a scope and optional inlined-at"); 27 28 // Set line and column. 29 assert(Column < (1u << 16) && "Expected 16-bit column"); 30 31 SubclassData32 = Line; 32 SubclassData16 = Column; 33} 34 35static void adjustColumn(unsigned &Column) { 36 // Set to unknown on overflow. We only have 16 bits to play with here. 37 if (Column >= (1u << 16)) 38 Column = 0; 39} 40 41DILocation *DILocation::getImpl(LLVMContext &Context, unsigned Line, 42 unsigned Column, Metadata *Scope, 43 Metadata *InlinedAt, StorageType Storage, 44 bool ShouldCreate) { 45 // Fixup column. 46 adjustColumn(Column); 47 48 assert(Scope && "Expected scope"); 49 if (Storage == Uniqued) { 50 if (auto *N = 51 getUniqued(Context.pImpl->DILocations, 52 DILocationInfo::KeyTy(Line, Column, Scope, InlinedAt))) 53 return N; 54 if (!ShouldCreate) 55 return nullptr; 56 } else { 57 assert(ShouldCreate && "Expected non-uniqued nodes to always be created"); 58 } 59 60 SmallVector<Metadata *, 2> Ops; 61 Ops.push_back(Scope); 62 if (InlinedAt) 63 Ops.push_back(InlinedAt); 64 return storeImpl(new (Ops.size()) 65 DILocation(Context, Storage, Line, Column, Ops), 66 Storage, Context.pImpl->DILocations); 67} 68 69unsigned DILocation::computeNewDiscriminator() const { 70 // FIXME: This seems completely wrong. 71 // 72 // 1. If two modules are generated in the same context, then the second 73 // Module will get different discriminators than it would have if it were 74 // generated in its own context. 75 // 2. If this function is called after round-tripping to bitcode instead of 76 // before, it will give a different (and potentially incorrect!) return. 77 // 78 // The discriminator should instead be calculated from local information 79 // where it's actually needed. This logic should be moved to 80 // AddDiscriminators::runOnFunction(), where it doesn't pollute the 81 // LLVMContext. 82 std::pair<const char *, unsigned> Key(getFilename().data(), getLine()); 83 return ++getContext().pImpl->DiscriminatorTable[Key]; 84} 85 86unsigned DINode::getFlag(StringRef Flag) { 87 return StringSwitch<unsigned>(Flag) 88#define HANDLE_DI_FLAG(ID, NAME) .Case("DIFlag" #NAME, Flag##NAME) 89#include "llvm/IR/DebugInfoFlags.def" 90 .Default(0); 91} 92 93const char *DINode::getFlagString(unsigned Flag) { 94 switch (Flag) { 95 default: 96 return ""; 97#define HANDLE_DI_FLAG(ID, NAME) \ 98 case Flag##NAME: \ 99 return "DIFlag" #NAME; 100#include "llvm/IR/DebugInfoFlags.def" 101 } 102} 103 104unsigned DINode::splitFlags(unsigned Flags, 105 SmallVectorImpl<unsigned> &SplitFlags) { 106 // Accessibility flags need to be specially handled, since they're packed 107 // together. 108 if (unsigned A = Flags & FlagAccessibility) { 109 if (A == FlagPrivate) 110 SplitFlags.push_back(FlagPrivate); 111 else if (A == FlagProtected) 112 SplitFlags.push_back(FlagProtected); 113 else 114 SplitFlags.push_back(FlagPublic); 115 Flags &= ~A; 116 } 117 118#define HANDLE_DI_FLAG(ID, NAME) \ 119 if (unsigned Bit = Flags & ID) { \ 120 SplitFlags.push_back(Bit); \ 121 Flags &= ~Bit; \ 122 } 123#include "llvm/IR/DebugInfoFlags.def" 124 125 return Flags; 126} 127 128DIScopeRef DIScope::getScope() const { 129 if (auto *T = dyn_cast<DIType>(this)) 130 return T->getScope(); 131 132 if (auto *SP = dyn_cast<DISubprogram>(this)) 133 return SP->getScope(); 134 135 if (auto *LB = dyn_cast<DILexicalBlockBase>(this)) 136 return DIScopeRef(LB->getScope()); 137 138 if (auto *NS = dyn_cast<DINamespace>(this)) 139 return DIScopeRef(NS->getScope()); 140 141 if (auto *M = dyn_cast<DIModule>(this)) 142 return DIScopeRef(M->getScope()); 143 144 assert((isa<DIFile>(this) || isa<DICompileUnit>(this)) && 145 "Unhandled type of scope."); 146 return nullptr; 147} 148 149StringRef DIScope::getName() const { 150 if (auto *T = dyn_cast<DIType>(this)) 151 return T->getName(); 152 if (auto *SP = dyn_cast<DISubprogram>(this)) 153 return SP->getName(); 154 if (auto *NS = dyn_cast<DINamespace>(this)) 155 return NS->getName(); 156 if (auto *M = dyn_cast<DIModule>(this)) 157 return M->getName(); 158 assert((isa<DILexicalBlockBase>(this) || isa<DIFile>(this) || 159 isa<DICompileUnit>(this)) && 160 "Unhandled type of scope."); 161 return ""; 162} 163 164static StringRef getString(const MDString *S) { 165 if (S) 166 return S->getString(); 167 return StringRef(); 168} 169 170#ifndef NDEBUG 171static bool isCanonical(const MDString *S) { 172 return !S || !S->getString().empty(); 173} 174#endif 175 176GenericDINode *GenericDINode::getImpl(LLVMContext &Context, unsigned Tag, 177 MDString *Header, 178 ArrayRef<Metadata *> DwarfOps, 179 StorageType Storage, bool ShouldCreate) { 180 unsigned Hash = 0; 181 if (Storage == Uniqued) { 182 GenericDINodeInfo::KeyTy Key(Tag, getString(Header), DwarfOps); 183 if (auto *N = getUniqued(Context.pImpl->GenericDINodes, Key)) 184 return N; 185 if (!ShouldCreate) 186 return nullptr; 187 Hash = Key.getHash(); 188 } else { 189 assert(ShouldCreate && "Expected non-uniqued nodes to always be created"); 190 } 191 192 // Use a nullptr for empty headers. 193 assert(isCanonical(Header) && "Expected canonical MDString"); 194 Metadata *PreOps[] = {Header}; 195 return storeImpl(new (DwarfOps.size() + 1) GenericDINode( 196 Context, Storage, Hash, Tag, PreOps, DwarfOps), 197 Storage, Context.pImpl->GenericDINodes); 198} 199 200void GenericDINode::recalculateHash() { 201 setHash(GenericDINodeInfo::KeyTy::calculateHash(this)); 202} 203 204#define UNWRAP_ARGS_IMPL(...) __VA_ARGS__ 205#define UNWRAP_ARGS(ARGS) UNWRAP_ARGS_IMPL ARGS 206#define DEFINE_GETIMPL_LOOKUP(CLASS, ARGS) \ 207 do { \ 208 if (Storage == Uniqued) { \ 209 if (auto *N = getUniqued(Context.pImpl->CLASS##s, \ 210 CLASS##Info::KeyTy(UNWRAP_ARGS(ARGS)))) \ 211 return N; \ 212 if (!ShouldCreate) \ 213 return nullptr; \ 214 } else { \ 215 assert(ShouldCreate && \ 216 "Expected non-uniqued nodes to always be created"); \ 217 } \ 218 } while (false) 219#define DEFINE_GETIMPL_STORE(CLASS, ARGS, OPS) \ 220 return storeImpl(new (ArrayRef<Metadata *>(OPS).size()) \ 221 CLASS(Context, Storage, UNWRAP_ARGS(ARGS), OPS), \ 222 Storage, Context.pImpl->CLASS##s) 223#define DEFINE_GETIMPL_STORE_NO_OPS(CLASS, ARGS) \ 224 return storeImpl(new (0u) CLASS(Context, Storage, UNWRAP_ARGS(ARGS)), \ 225 Storage, Context.pImpl->CLASS##s) 226#define DEFINE_GETIMPL_STORE_NO_CONSTRUCTOR_ARGS(CLASS, OPS) \ 227 return storeImpl(new (ArrayRef<Metadata *>(OPS).size()) \ 228 CLASS(Context, Storage, OPS), \ 229 Storage, Context.pImpl->CLASS##s) 230 231DISubrange *DISubrange::getImpl(LLVMContext &Context, int64_t Count, int64_t Lo, 232 StorageType Storage, bool ShouldCreate) { 233 DEFINE_GETIMPL_LOOKUP(DISubrange, (Count, Lo)); 234 DEFINE_GETIMPL_STORE_NO_OPS(DISubrange, (Count, Lo)); 235} 236 237DIEnumerator *DIEnumerator::getImpl(LLVMContext &Context, int64_t Value, 238 MDString *Name, StorageType Storage, 239 bool ShouldCreate) { 240 assert(isCanonical(Name) && "Expected canonical MDString"); 241 DEFINE_GETIMPL_LOOKUP(DIEnumerator, (Value, getString(Name))); 242 Metadata *Ops[] = {Name}; 243 DEFINE_GETIMPL_STORE(DIEnumerator, (Value), Ops); 244} 245 246DIBasicType *DIBasicType::getImpl(LLVMContext &Context, unsigned Tag, 247 MDString *Name, uint64_t SizeInBits, 248 uint64_t AlignInBits, unsigned Encoding, 249 StorageType Storage, bool ShouldCreate) { 250 assert(isCanonical(Name) && "Expected canonical MDString"); 251 DEFINE_GETIMPL_LOOKUP( 252 DIBasicType, (Tag, getString(Name), SizeInBits, AlignInBits, Encoding)); 253 Metadata *Ops[] = {nullptr, nullptr, Name}; 254 DEFINE_GETIMPL_STORE(DIBasicType, (Tag, SizeInBits, AlignInBits, Encoding), 255 Ops); 256} 257 258DIDerivedType *DIDerivedType::getImpl( 259 LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File, 260 unsigned Line, Metadata *Scope, Metadata *BaseType, uint64_t SizeInBits, 261 uint64_t AlignInBits, uint64_t OffsetInBits, unsigned Flags, 262 Metadata *ExtraData, StorageType Storage, bool ShouldCreate) { 263 assert(isCanonical(Name) && "Expected canonical MDString"); 264 DEFINE_GETIMPL_LOOKUP(DIDerivedType, (Tag, getString(Name), File, Line, Scope, 265 BaseType, SizeInBits, AlignInBits, 266 OffsetInBits, Flags, ExtraData)); 267 Metadata *Ops[] = {File, Scope, Name, BaseType, ExtraData}; 268 DEFINE_GETIMPL_STORE( 269 DIDerivedType, (Tag, Line, SizeInBits, AlignInBits, OffsetInBits, Flags), 270 Ops); 271} 272 273DICompositeType *DICompositeType::getImpl( 274 LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File, 275 unsigned Line, Metadata *Scope, Metadata *BaseType, uint64_t SizeInBits, 276 uint64_t AlignInBits, uint64_t OffsetInBits, unsigned Flags, 277 Metadata *Elements, unsigned RuntimeLang, Metadata *VTableHolder, 278 Metadata *TemplateParams, MDString *Identifier, StorageType Storage, 279 bool ShouldCreate) { 280 assert(isCanonical(Name) && "Expected canonical MDString"); 281 DEFINE_GETIMPL_LOOKUP(DICompositeType, 282 (Tag, getString(Name), File, Line, Scope, BaseType, 283 SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, 284 RuntimeLang, VTableHolder, TemplateParams, 285 getString(Identifier))); 286 Metadata *Ops[] = {File, Scope, Name, BaseType, 287 Elements, VTableHolder, TemplateParams, Identifier}; 288 DEFINE_GETIMPL_STORE(DICompositeType, (Tag, Line, RuntimeLang, SizeInBits, 289 AlignInBits, OffsetInBits, Flags), 290 Ops); 291} 292 293DISubroutineType *DISubroutineType::getImpl(LLVMContext &Context, 294 unsigned Flags, Metadata *TypeArray, 295 StorageType Storage, 296 bool ShouldCreate) { 297 DEFINE_GETIMPL_LOOKUP(DISubroutineType, (Flags, TypeArray)); 298 Metadata *Ops[] = {nullptr, nullptr, nullptr, TypeArray}; 299 DEFINE_GETIMPL_STORE(DISubroutineType, (Flags), Ops); 300} 301 302DIFile *DIFile::getImpl(LLVMContext &Context, MDString *Filename, 303 MDString *Directory, StorageType Storage, 304 bool ShouldCreate) { 305 assert(isCanonical(Filename) && "Expected canonical MDString"); 306 assert(isCanonical(Directory) && "Expected canonical MDString"); 307 DEFINE_GETIMPL_LOOKUP(DIFile, (getString(Filename), getString(Directory))); 308 Metadata *Ops[] = {Filename, Directory}; 309 DEFINE_GETIMPL_STORE_NO_CONSTRUCTOR_ARGS(DIFile, Ops); 310} 311 312DICompileUnit *DICompileUnit::getImpl( 313 LLVMContext &Context, unsigned SourceLanguage, Metadata *File, 314 MDString *Producer, bool IsOptimized, MDString *Flags, 315 unsigned RuntimeVersion, MDString *SplitDebugFilename, 316 unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes, 317 Metadata *Subprograms, Metadata *GlobalVariables, 318 Metadata *ImportedEntities, Metadata *Macros, uint64_t DWOId, 319 StorageType Storage, bool ShouldCreate) { 320 assert(Storage != Uniqued && "Cannot unique DICompileUnit"); 321 assert(isCanonical(Producer) && "Expected canonical MDString"); 322 assert(isCanonical(Flags) && "Expected canonical MDString"); 323 assert(isCanonical(SplitDebugFilename) && "Expected canonical MDString"); 324 325 Metadata *Ops[] = {File, Producer, Flags, SplitDebugFilename, EnumTypes, 326 RetainedTypes, Subprograms, GlobalVariables, 327 ImportedEntities, Macros}; 328 return storeImpl(new (ArrayRef<Metadata *>(Ops).size()) DICompileUnit( 329 Context, Storage, SourceLanguage, IsOptimized, 330 RuntimeVersion, EmissionKind, DWOId, Ops), 331 Storage); 332} 333 334DISubprogram *DILocalScope::getSubprogram() const { 335 if (auto *Block = dyn_cast<DILexicalBlockBase>(this)) 336 return Block->getScope()->getSubprogram(); 337 return const_cast<DISubprogram *>(cast<DISubprogram>(this)); 338} 339 340DISubprogram *DISubprogram::getImpl( 341 LLVMContext &Context, Metadata *Scope, MDString *Name, 342 MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type, 343 bool IsLocalToUnit, bool IsDefinition, unsigned ScopeLine, 344 Metadata *ContainingType, unsigned Virtuality, unsigned VirtualIndex, 345 unsigned Flags, bool IsOptimized, Metadata *TemplateParams, 346 Metadata *Declaration, Metadata *Variables, StorageType Storage, 347 bool ShouldCreate) { 348 assert(isCanonical(Name) && "Expected canonical MDString"); 349 assert(isCanonical(LinkageName) && "Expected canonical MDString"); 350 DEFINE_GETIMPL_LOOKUP(DISubprogram, 351 (Scope, getString(Name), getString(LinkageName), File, 352 Line, Type, IsLocalToUnit, IsDefinition, ScopeLine, 353 ContainingType, Virtuality, VirtualIndex, Flags, 354 IsOptimized, TemplateParams, Declaration, Variables)); 355 Metadata *Ops[] = {File, Scope, Name, Name, 356 LinkageName, Type, ContainingType, TemplateParams, 357 Declaration, Variables}; 358 DEFINE_GETIMPL_STORE(DISubprogram, 359 (Line, ScopeLine, Virtuality, VirtualIndex, Flags, 360 IsLocalToUnit, IsDefinition, IsOptimized), 361 Ops); 362} 363 364bool DISubprogram::describes(const Function *F) const { 365 assert(F && "Invalid function"); 366 if (F->getSubprogram() == this) 367 return true; 368 StringRef Name = getLinkageName(); 369 if (Name.empty()) 370 Name = getName(); 371 return F->getName() == Name; 372} 373 374DILexicalBlock *DILexicalBlock::getImpl(LLVMContext &Context, Metadata *Scope, 375 Metadata *File, unsigned Line, 376 unsigned Column, StorageType Storage, 377 bool ShouldCreate) { 378 // Fixup column. 379 adjustColumn(Column); 380 381 assert(Scope && "Expected scope"); 382 DEFINE_GETIMPL_LOOKUP(DILexicalBlock, (Scope, File, Line, Column)); 383 Metadata *Ops[] = {File, Scope}; 384 DEFINE_GETIMPL_STORE(DILexicalBlock, (Line, Column), Ops); 385} 386 387DILexicalBlockFile *DILexicalBlockFile::getImpl(LLVMContext &Context, 388 Metadata *Scope, Metadata *File, 389 unsigned Discriminator, 390 StorageType Storage, 391 bool ShouldCreate) { 392 assert(Scope && "Expected scope"); 393 DEFINE_GETIMPL_LOOKUP(DILexicalBlockFile, (Scope, File, Discriminator)); 394 Metadata *Ops[] = {File, Scope}; 395 DEFINE_GETIMPL_STORE(DILexicalBlockFile, (Discriminator), Ops); 396} 397 398DINamespace *DINamespace::getImpl(LLVMContext &Context, Metadata *Scope, 399 Metadata *File, MDString *Name, unsigned Line, 400 StorageType Storage, bool ShouldCreate) { 401 assert(isCanonical(Name) && "Expected canonical MDString"); 402 DEFINE_GETIMPL_LOOKUP(DINamespace, (Scope, File, getString(Name), Line)); 403 Metadata *Ops[] = {File, Scope, Name}; 404 DEFINE_GETIMPL_STORE(DINamespace, (Line), Ops); 405} 406 407DIModule *DIModule::getImpl(LLVMContext &Context, Metadata *Scope, 408 MDString *Name, MDString *ConfigurationMacros, 409 MDString *IncludePath, MDString *ISysRoot, 410 StorageType Storage, bool ShouldCreate) { 411 assert(isCanonical(Name) && "Expected canonical MDString"); 412 DEFINE_GETIMPL_LOOKUP(DIModule, 413 (Scope, getString(Name), getString(ConfigurationMacros), 414 getString(IncludePath), getString(ISysRoot))); 415 Metadata *Ops[] = {Scope, Name, ConfigurationMacros, IncludePath, ISysRoot}; 416 DEFINE_GETIMPL_STORE_NO_CONSTRUCTOR_ARGS(DIModule, Ops); 417} 418 419DITemplateTypeParameter *DITemplateTypeParameter::getImpl(LLVMContext &Context, 420 MDString *Name, 421 Metadata *Type, 422 StorageType Storage, 423 bool ShouldCreate) { 424 assert(isCanonical(Name) && "Expected canonical MDString"); 425 DEFINE_GETIMPL_LOOKUP(DITemplateTypeParameter, (getString(Name), Type)); 426 Metadata *Ops[] = {Name, Type}; 427 DEFINE_GETIMPL_STORE_NO_CONSTRUCTOR_ARGS(DITemplateTypeParameter, Ops); 428} 429 430DITemplateValueParameter *DITemplateValueParameter::getImpl( 431 LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *Type, 432 Metadata *Value, StorageType Storage, bool ShouldCreate) { 433 assert(isCanonical(Name) && "Expected canonical MDString"); 434 DEFINE_GETIMPL_LOOKUP(DITemplateValueParameter, 435 (Tag, getString(Name), Type, Value)); 436 Metadata *Ops[] = {Name, Type, Value}; 437 DEFINE_GETIMPL_STORE(DITemplateValueParameter, (Tag), Ops); 438} 439 440DIGlobalVariable * 441DIGlobalVariable::getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name, 442 MDString *LinkageName, Metadata *File, unsigned Line, 443 Metadata *Type, bool IsLocalToUnit, bool IsDefinition, 444 Metadata *Variable, 445 Metadata *StaticDataMemberDeclaration, 446 StorageType Storage, bool ShouldCreate) { 447 assert(isCanonical(Name) && "Expected canonical MDString"); 448 assert(isCanonical(LinkageName) && "Expected canonical MDString"); 449 DEFINE_GETIMPL_LOOKUP(DIGlobalVariable, 450 (Scope, getString(Name), getString(LinkageName), File, 451 Line, Type, IsLocalToUnit, IsDefinition, Variable, 452 StaticDataMemberDeclaration)); 453 Metadata *Ops[] = {Scope, Name, File, Type, 454 Name, LinkageName, Variable, StaticDataMemberDeclaration}; 455 DEFINE_GETIMPL_STORE(DIGlobalVariable, (Line, IsLocalToUnit, IsDefinition), 456 Ops); 457} 458 459DILocalVariable *DILocalVariable::getImpl(LLVMContext &Context, Metadata *Scope, 460 MDString *Name, Metadata *File, 461 unsigned Line, Metadata *Type, 462 unsigned Arg, unsigned Flags, 463 StorageType Storage, 464 bool ShouldCreate) { 465 // 64K ought to be enough for any frontend. 466 assert(Arg <= UINT16_MAX && "Expected argument number to fit in 16-bits"); 467 468 assert(Scope && "Expected scope"); 469 assert(isCanonical(Name) && "Expected canonical MDString"); 470 DEFINE_GETIMPL_LOOKUP(DILocalVariable, 471 (Scope, getString(Name), File, Line, Type, Arg, Flags)); 472 Metadata *Ops[] = {Scope, Name, File, Type}; 473 DEFINE_GETIMPL_STORE(DILocalVariable, (Line, Arg, Flags), Ops); 474} 475 476DIExpression *DIExpression::getImpl(LLVMContext &Context, 477 ArrayRef<uint64_t> Elements, 478 StorageType Storage, bool ShouldCreate) { 479 DEFINE_GETIMPL_LOOKUP(DIExpression, (Elements)); 480 DEFINE_GETIMPL_STORE_NO_OPS(DIExpression, (Elements)); 481} 482 483unsigned DIExpression::ExprOperand::getSize() const { 484 switch (getOp()) { 485 case dwarf::DW_OP_bit_piece: 486 return 3; 487 case dwarf::DW_OP_plus: 488 case dwarf::DW_OP_minus: 489 return 2; 490 default: 491 return 1; 492 } 493} 494 495bool DIExpression::isValid() const { 496 for (auto I = expr_op_begin(), E = expr_op_end(); I != E; ++I) { 497 // Check that there's space for the operand. 498 if (I->get() + I->getSize() > E->get()) 499 return false; 500 501 // Check that the operand is valid. 502 switch (I->getOp()) { 503 default: 504 return false; 505 case dwarf::DW_OP_bit_piece: 506 // Piece expressions must be at the end. 507 return I->get() + I->getSize() == E->get(); 508 case dwarf::DW_OP_plus: 509 case dwarf::DW_OP_minus: 510 case dwarf::DW_OP_deref: 511 break; 512 } 513 } 514 return true; 515} 516 517bool DIExpression::isBitPiece() const { 518 assert(isValid() && "Expected valid expression"); 519 if (unsigned N = getNumElements()) 520 if (N >= 3) 521 return getElement(N - 3) == dwarf::DW_OP_bit_piece; 522 return false; 523} 524 525uint64_t DIExpression::getBitPieceOffset() const { 526 assert(isBitPiece() && "Expected bit piece"); 527 return getElement(getNumElements() - 2); 528} 529 530uint64_t DIExpression::getBitPieceSize() const { 531 assert(isBitPiece() && "Expected bit piece"); 532 return getElement(getNumElements() - 1); 533} 534 535DIObjCProperty *DIObjCProperty::getImpl( 536 LLVMContext &Context, MDString *Name, Metadata *File, unsigned Line, 537 MDString *GetterName, MDString *SetterName, unsigned Attributes, 538 Metadata *Type, StorageType Storage, bool ShouldCreate) { 539 assert(isCanonical(Name) && "Expected canonical MDString"); 540 assert(isCanonical(GetterName) && "Expected canonical MDString"); 541 assert(isCanonical(SetterName) && "Expected canonical MDString"); 542 DEFINE_GETIMPL_LOOKUP(DIObjCProperty, 543 (getString(Name), File, Line, getString(GetterName), 544 getString(SetterName), Attributes, Type)); 545 Metadata *Ops[] = {Name, File, GetterName, SetterName, Type}; 546 DEFINE_GETIMPL_STORE(DIObjCProperty, (Line, Attributes), Ops); 547} 548 549DIImportedEntity *DIImportedEntity::getImpl(LLVMContext &Context, unsigned Tag, 550 Metadata *Scope, Metadata *Entity, 551 unsigned Line, MDString *Name, 552 StorageType Storage, 553 bool ShouldCreate) { 554 assert(isCanonical(Name) && "Expected canonical MDString"); 555 DEFINE_GETIMPL_LOOKUP(DIImportedEntity, 556 (Tag, Scope, Entity, Line, getString(Name))); 557 Metadata *Ops[] = {Scope, Entity, Name}; 558 DEFINE_GETIMPL_STORE(DIImportedEntity, (Tag, Line), Ops); 559} 560 561DIMacro *DIMacro::getImpl(LLVMContext &Context, unsigned MIType, 562 unsigned Line, MDString *Name, MDString *Value, 563 StorageType Storage, bool ShouldCreate) { 564 assert(isCanonical(Name) && "Expected canonical MDString"); 565 DEFINE_GETIMPL_LOOKUP(DIMacro, 566 (MIType, Line, getString(Name), getString(Value))); 567 Metadata *Ops[] = { Name, Value }; 568 DEFINE_GETIMPL_STORE(DIMacro, (MIType, Line), Ops); 569} 570 571DIMacroFile *DIMacroFile::getImpl(LLVMContext &Context, unsigned MIType, 572 unsigned Line, Metadata *File, 573 Metadata *Elements, StorageType Storage, 574 bool ShouldCreate) { 575 DEFINE_GETIMPL_LOOKUP(DIMacroFile, 576 (MIType, Line, File, Elements)); 577 Metadata *Ops[] = { File, Elements }; 578 DEFINE_GETIMPL_STORE(DIMacroFile, (MIType, Line), Ops); 579} 580 581