Home | History | Annotate | Download | only in IR
      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 
     20 using namespace llvm;
     21 
     22 DILocation::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 
     35 static 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 
     41 DILocation *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 
     69 unsigned 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 
     86 unsigned 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 
     93 const 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 
    104 unsigned 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 
    128 DIScopeRef 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 
    149 StringRef 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 
    164 static StringRef getString(const MDString *S) {
    165   if (S)
    166     return S->getString();
    167   return StringRef();
    168 }
    169 
    170 #ifndef NDEBUG
    171 static bool isCanonical(const MDString *S) {
    172   return !S || !S->getString().empty();
    173 }
    174 #endif
    175 
    176 GenericDINode *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 
    200 void 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 
    231 DISubrange *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 
    237 DIEnumerator *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 
    246 DIBasicType *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 
    258 DIDerivedType *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 
    273 DICompositeType *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 
    293 DISubroutineType *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 
    302 DIFile *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 
    312 DICompileUnit *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 
    334 DISubprogram *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 
    340 DISubprogram *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 
    364 bool 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 
    374 DILexicalBlock *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 
    387 DILexicalBlockFile *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 
    398 DINamespace *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 
    407 DIModule *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 
    419 DITemplateTypeParameter *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 
    430 DITemplateValueParameter *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 
    440 DIGlobalVariable *
    441 DIGlobalVariable::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 
    459 DILocalVariable *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 
    476 DIExpression *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 
    483 unsigned 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 
    495 bool 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 
    517 bool 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 
    525 uint64_t DIExpression::getBitPieceOffset() const {
    526   assert(isBitPiece() && "Expected bit piece");
    527   return getElement(getNumElements() - 2);
    528 }
    529 
    530 uint64_t DIExpression::getBitPieceSize() const {
    531   assert(isBitPiece() && "Expected bit piece");
    532   return getElement(getNumElements() - 1);
    533 }
    534 
    535 DIObjCProperty *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 
    549 DIImportedEntity *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 
    561 DIMacro *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 
    571 DIMacroFile *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