109467b48Spatrick //===- DebugInfoMetadata.cpp - Implement debug info metadata --------------===//
209467b48Spatrick //
309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609467b48Spatrick //
709467b48Spatrick //===----------------------------------------------------------------------===//
809467b48Spatrick //
909467b48Spatrick // This file implements the debug info Metadata classes.
1009467b48Spatrick //
1109467b48Spatrick //===----------------------------------------------------------------------===//
1209467b48Spatrick 
1309467b48Spatrick #include "llvm/IR/DebugInfoMetadata.h"
1409467b48Spatrick #include "LLVMContextImpl.h"
1509467b48Spatrick #include "MetadataImpl.h"
1609467b48Spatrick #include "llvm/ADT/SmallSet.h"
1709467b48Spatrick #include "llvm/ADT/StringSwitch.h"
18*d415bd75Srobert #include "llvm/BinaryFormat/Dwarf.h"
1909467b48Spatrick #include "llvm/IR/Function.h"
20*d415bd75Srobert #include "llvm/IR/IntrinsicInst.h"
21*d415bd75Srobert #include "llvm/IR/Type.h"
22*d415bd75Srobert #include "llvm/IR/Value.h"
2309467b48Spatrick 
2409467b48Spatrick #include <numeric>
25*d415bd75Srobert #include <optional>
2609467b48Spatrick 
2709467b48Spatrick using namespace llvm;
2809467b48Spatrick 
2973471bf0Spatrick namespace llvm {
3073471bf0Spatrick // Use FS-AFDO discriminator.
3173471bf0Spatrick cl::opt<bool> EnableFSDiscriminator(
32*d415bd75Srobert     "enable-fs-discriminator", cl::Hidden,
3373471bf0Spatrick     cl::desc("Enable adding flow sensitive discriminators"));
3473471bf0Spatrick } // namespace llvm
3573471bf0Spatrick 
3609467b48Spatrick const DIExpression::FragmentInfo DebugVariable::DefaultFragment = {
3709467b48Spatrick     std::numeric_limits<uint64_t>::max(), std::numeric_limits<uint64_t>::min()};
3809467b48Spatrick 
DebugVariable(const DbgVariableIntrinsic * DII)39*d415bd75Srobert DebugVariable::DebugVariable(const DbgVariableIntrinsic *DII)
40*d415bd75Srobert     : Variable(DII->getVariable()),
41*d415bd75Srobert       Fragment(DII->getExpression()->getFragmentInfo()),
42*d415bd75Srobert       InlinedAt(DII->getDebugLoc().getInlinedAt()) {}
43*d415bd75Srobert 
DILocation(LLVMContext & C,StorageType Storage,unsigned Line,unsigned Column,ArrayRef<Metadata * > MDs,bool ImplicitCode)4409467b48Spatrick DILocation::DILocation(LLVMContext &C, StorageType Storage, unsigned Line,
4509467b48Spatrick                        unsigned Column, ArrayRef<Metadata *> MDs,
4609467b48Spatrick                        bool ImplicitCode)
4709467b48Spatrick     : MDNode(C, DILocationKind, Storage, MDs) {
4809467b48Spatrick   assert((MDs.size() == 1 || MDs.size() == 2) &&
4909467b48Spatrick          "Expected a scope and optional inlined-at");
5009467b48Spatrick 
5109467b48Spatrick   // Set line and column.
5209467b48Spatrick   assert(Column < (1u << 16) && "Expected 16-bit column");
5309467b48Spatrick 
5409467b48Spatrick   SubclassData32 = Line;
5509467b48Spatrick   SubclassData16 = Column;
5609467b48Spatrick 
5709467b48Spatrick   setImplicitCode(ImplicitCode);
5809467b48Spatrick }
5909467b48Spatrick 
adjustColumn(unsigned & Column)6009467b48Spatrick static void adjustColumn(unsigned &Column) {
6109467b48Spatrick   // Set to unknown on overflow.  We only have 16 bits to play with here.
6209467b48Spatrick   if (Column >= (1u << 16))
6309467b48Spatrick     Column = 0;
6409467b48Spatrick }
6509467b48Spatrick 
getImpl(LLVMContext & Context,unsigned Line,unsigned Column,Metadata * Scope,Metadata * InlinedAt,bool ImplicitCode,StorageType Storage,bool ShouldCreate)6609467b48Spatrick DILocation *DILocation::getImpl(LLVMContext &Context, unsigned Line,
6709467b48Spatrick                                 unsigned Column, Metadata *Scope,
6809467b48Spatrick                                 Metadata *InlinedAt, bool ImplicitCode,
6909467b48Spatrick                                 StorageType Storage, bool ShouldCreate) {
7009467b48Spatrick   // Fixup column.
7109467b48Spatrick   adjustColumn(Column);
7209467b48Spatrick 
7309467b48Spatrick   if (Storage == Uniqued) {
7409467b48Spatrick     if (auto *N = getUniqued(Context.pImpl->DILocations,
7509467b48Spatrick                              DILocationInfo::KeyTy(Line, Column, Scope,
7609467b48Spatrick                                                    InlinedAt, ImplicitCode)))
7709467b48Spatrick       return N;
7809467b48Spatrick     if (!ShouldCreate)
7909467b48Spatrick       return nullptr;
8009467b48Spatrick   } else {
8109467b48Spatrick     assert(ShouldCreate && "Expected non-uniqued nodes to always be created");
8209467b48Spatrick   }
8309467b48Spatrick 
8409467b48Spatrick   SmallVector<Metadata *, 2> Ops;
8509467b48Spatrick   Ops.push_back(Scope);
8609467b48Spatrick   if (InlinedAt)
8709467b48Spatrick     Ops.push_back(InlinedAt);
88*d415bd75Srobert   return storeImpl(new (Ops.size(), Storage) DILocation(
89*d415bd75Srobert                        Context, Storage, Line, Column, Ops, ImplicitCode),
9009467b48Spatrick                    Storage, Context.pImpl->DILocations);
9109467b48Spatrick }
9209467b48Spatrick 
93*d415bd75Srobert const DILocation *
getMergedLocations(ArrayRef<const DILocation * > Locs)94*d415bd75Srobert DILocation::getMergedLocations(ArrayRef<const DILocation *> Locs) {
95097a140dSpatrick   if (Locs.empty())
96097a140dSpatrick     return nullptr;
97097a140dSpatrick   if (Locs.size() == 1)
98097a140dSpatrick     return Locs[0];
99097a140dSpatrick   auto *Merged = Locs[0];
10073471bf0Spatrick   for (const DILocation *L : llvm::drop_begin(Locs)) {
10173471bf0Spatrick     Merged = getMergedLocation(Merged, L);
102097a140dSpatrick     if (Merged == nullptr)
103097a140dSpatrick       break;
104097a140dSpatrick   }
105097a140dSpatrick   return Merged;
106097a140dSpatrick }
107097a140dSpatrick 
getMergedLocation(const DILocation * LocA,const DILocation * LocB)10809467b48Spatrick const DILocation *DILocation::getMergedLocation(const DILocation *LocA,
10909467b48Spatrick                                                 const DILocation *LocB) {
11009467b48Spatrick   if (!LocA || !LocB)
11109467b48Spatrick     return nullptr;
11209467b48Spatrick 
11309467b48Spatrick   if (LocA == LocB)
11409467b48Spatrick     return LocA;
11509467b48Spatrick 
116*d415bd75Srobert   LLVMContext &C = LocA->getContext();
117*d415bd75Srobert   SmallDenseMap<std::pair<DILocalScope *, DILocation *>,
118*d415bd75Srobert                 std::pair<unsigned, unsigned>, 4>
119*d415bd75Srobert       Locations;
120*d415bd75Srobert 
12109467b48Spatrick   DIScope *S = LocA->getScope();
12209467b48Spatrick   DILocation *L = LocA->getInlinedAt();
123*d415bd75Srobert   unsigned Line = LocA->getLine();
124*d415bd75Srobert   unsigned Col = LocA->getColumn();
125*d415bd75Srobert 
126*d415bd75Srobert   // Walk from the current source locaiton until the file scope;
127*d415bd75Srobert   // then, do the same for the inlined-at locations.
128*d415bd75Srobert   auto AdvanceToParentLoc = [&S, &L, &Line, &Col]() {
12909467b48Spatrick     S = S->getScope();
13009467b48Spatrick     if (!S && L) {
131*d415bd75Srobert       Line = L->getLine();
132*d415bd75Srobert       Col = L->getColumn();
13309467b48Spatrick       S = L->getScope();
13409467b48Spatrick       L = L->getInlinedAt();
13509467b48Spatrick     }
136*d415bd75Srobert   };
137*d415bd75Srobert 
138*d415bd75Srobert   while (S) {
139*d415bd75Srobert     if (auto *LS = dyn_cast<DILocalScope>(S))
140*d415bd75Srobert       Locations.try_emplace(std::make_pair(LS, L), std::make_pair(Line, Col));
141*d415bd75Srobert     AdvanceToParentLoc();
14209467b48Spatrick   }
143*d415bd75Srobert 
144*d415bd75Srobert   // Walk the source locations of LocB until a match with LocA is found.
14509467b48Spatrick   S = LocB->getScope();
14609467b48Spatrick   L = LocB->getInlinedAt();
147*d415bd75Srobert   Line = LocB->getLine();
148*d415bd75Srobert   Col = LocB->getColumn();
14909467b48Spatrick   while (S) {
150*d415bd75Srobert     if (auto *LS = dyn_cast<DILocalScope>(S)) {
151*d415bd75Srobert       auto MatchLoc = Locations.find(std::make_pair(LS, L));
152*d415bd75Srobert       if (MatchLoc != Locations.end()) {
153*d415bd75Srobert         // If the lines match, keep the line, but set the column to '0'
154*d415bd75Srobert         // If the lines don't match, pick a "line 0" location but keep
155*d415bd75Srobert         // the current scope and inlined-at.
156*d415bd75Srobert         bool SameLine = Line == MatchLoc->second.first;
157*d415bd75Srobert         bool SameCol = Col == MatchLoc->second.second;
158*d415bd75Srobert         Line = SameLine ? Line : 0;
159*d415bd75Srobert         Col = SameLine && SameCol ? Col : 0;
16009467b48Spatrick         break;
16109467b48Spatrick       }
16209467b48Spatrick     }
163*d415bd75Srobert     AdvanceToParentLoc();
164*d415bd75Srobert   }
16509467b48Spatrick 
166*d415bd75Srobert   if (!S) {
167*d415bd75Srobert     // If the two locations are irreconsilable, pick any scope,
168*d415bd75Srobert     // and return a "line 0" location.
169*d415bd75Srobert     Line = Col = 0;
17009467b48Spatrick     S = LocA->getScope();
17109467b48Spatrick   }
17209467b48Spatrick 
173*d415bd75Srobert   return DILocation::get(C, Line, Col, S, L);
174*d415bd75Srobert }
175*d415bd75Srobert 
176*d415bd75Srobert std::optional<unsigned>
encodeDiscriminator(unsigned BD,unsigned DF,unsigned CI)177*d415bd75Srobert DILocation::encodeDiscriminator(unsigned BD, unsigned DF, unsigned CI) {
17873471bf0Spatrick   std::array<unsigned, 3> Components = {BD, DF, CI};
17909467b48Spatrick   uint64_t RemainingWork = 0U;
18009467b48Spatrick   // We use RemainingWork to figure out if we have no remaining components to
18109467b48Spatrick   // encode. For example: if BD != 0 but DF == 0 && CI == 0, we don't need to
18209467b48Spatrick   // encode anything for the latter 2.
18309467b48Spatrick   // Since any of the input components is at most 32 bits, their sum will be
18409467b48Spatrick   // less than 34 bits, and thus RemainingWork won't overflow.
185*d415bd75Srobert   RemainingWork =
186*d415bd75Srobert       std::accumulate(Components.begin(), Components.end(), RemainingWork);
18709467b48Spatrick 
18809467b48Spatrick   int I = 0;
18909467b48Spatrick   unsigned Ret = 0;
19009467b48Spatrick   unsigned NextBitInsertionIndex = 0;
19109467b48Spatrick   while (RemainingWork > 0) {
19209467b48Spatrick     unsigned C = Components[I++];
19309467b48Spatrick     RemainingWork -= C;
19409467b48Spatrick     unsigned EC = encodeComponent(C);
19509467b48Spatrick     Ret |= (EC << NextBitInsertionIndex);
19609467b48Spatrick     NextBitInsertionIndex += encodingBits(C);
19709467b48Spatrick   }
19809467b48Spatrick 
19909467b48Spatrick   // Encoding may be unsuccessful because of overflow. We determine success by
20009467b48Spatrick   // checking equivalence of components before & after encoding. Alternatively,
20109467b48Spatrick   // we could determine Success during encoding, but the current alternative is
20209467b48Spatrick   // simpler.
20309467b48Spatrick   unsigned TBD, TDF, TCI = 0;
20409467b48Spatrick   decodeDiscriminator(Ret, TBD, TDF, TCI);
20509467b48Spatrick   if (TBD == BD && TDF == DF && TCI == CI)
20609467b48Spatrick     return Ret;
207*d415bd75Srobert   return std::nullopt;
20809467b48Spatrick }
20909467b48Spatrick 
decodeDiscriminator(unsigned D,unsigned & BD,unsigned & DF,unsigned & CI)21009467b48Spatrick void DILocation::decodeDiscriminator(unsigned D, unsigned &BD, unsigned &DF,
21109467b48Spatrick                                      unsigned &CI) {
21209467b48Spatrick   BD = getUnsignedFromPrefixEncoding(D);
21309467b48Spatrick   DF = getUnsignedFromPrefixEncoding(getNextComponentInDiscriminator(D));
21409467b48Spatrick   CI = getUnsignedFromPrefixEncoding(
21509467b48Spatrick       getNextComponentInDiscriminator(getNextComponentInDiscriminator(D)));
21609467b48Spatrick }
getTag() const217*d415bd75Srobert dwarf::Tag DINode::getTag() const { return (dwarf::Tag)SubclassData16; }
21809467b48Spatrick 
getFlag(StringRef Flag)21909467b48Spatrick DINode::DIFlags DINode::getFlag(StringRef Flag) {
22009467b48Spatrick   return StringSwitch<DIFlags>(Flag)
22109467b48Spatrick #define HANDLE_DI_FLAG(ID, NAME) .Case("DIFlag" #NAME, Flag##NAME)
22209467b48Spatrick #include "llvm/IR/DebugInfoFlags.def"
22309467b48Spatrick       .Default(DINode::FlagZero);
22409467b48Spatrick }
22509467b48Spatrick 
getFlagString(DIFlags Flag)22609467b48Spatrick StringRef DINode::getFlagString(DIFlags Flag) {
22709467b48Spatrick   switch (Flag) {
22809467b48Spatrick #define HANDLE_DI_FLAG(ID, NAME)                                               \
22909467b48Spatrick   case Flag##NAME:                                                             \
23009467b48Spatrick     return "DIFlag" #NAME;
23109467b48Spatrick #include "llvm/IR/DebugInfoFlags.def"
23209467b48Spatrick   }
23309467b48Spatrick   return "";
23409467b48Spatrick }
23509467b48Spatrick 
splitFlags(DIFlags Flags,SmallVectorImpl<DIFlags> & SplitFlags)23609467b48Spatrick DINode::DIFlags DINode::splitFlags(DIFlags Flags,
23709467b48Spatrick                                    SmallVectorImpl<DIFlags> &SplitFlags) {
23809467b48Spatrick   // Flags that are packed together need to be specially handled, so
23909467b48Spatrick   // that, for example, we emit "DIFlagPublic" and not
24009467b48Spatrick   // "DIFlagPrivate | DIFlagProtected".
24109467b48Spatrick   if (DIFlags A = Flags & FlagAccessibility) {
24209467b48Spatrick     if (A == FlagPrivate)
24309467b48Spatrick       SplitFlags.push_back(FlagPrivate);
24409467b48Spatrick     else if (A == FlagProtected)
24509467b48Spatrick       SplitFlags.push_back(FlagProtected);
24609467b48Spatrick     else
24709467b48Spatrick       SplitFlags.push_back(FlagPublic);
24809467b48Spatrick     Flags &= ~A;
24909467b48Spatrick   }
25009467b48Spatrick   if (DIFlags R = Flags & FlagPtrToMemberRep) {
25109467b48Spatrick     if (R == FlagSingleInheritance)
25209467b48Spatrick       SplitFlags.push_back(FlagSingleInheritance);
25309467b48Spatrick     else if (R == FlagMultipleInheritance)
25409467b48Spatrick       SplitFlags.push_back(FlagMultipleInheritance);
25509467b48Spatrick     else
25609467b48Spatrick       SplitFlags.push_back(FlagVirtualInheritance);
25709467b48Spatrick     Flags &= ~R;
25809467b48Spatrick   }
25909467b48Spatrick   if ((Flags & FlagIndirectVirtualBase) == FlagIndirectVirtualBase) {
26009467b48Spatrick     Flags &= ~FlagIndirectVirtualBase;
26109467b48Spatrick     SplitFlags.push_back(FlagIndirectVirtualBase);
26209467b48Spatrick   }
26309467b48Spatrick 
26409467b48Spatrick #define HANDLE_DI_FLAG(ID, NAME)                                               \
26509467b48Spatrick   if (DIFlags Bit = Flags & Flag##NAME) {                                      \
26609467b48Spatrick     SplitFlags.push_back(Bit);                                                 \
26709467b48Spatrick     Flags &= ~Bit;                                                             \
26809467b48Spatrick   }
26909467b48Spatrick #include "llvm/IR/DebugInfoFlags.def"
27009467b48Spatrick   return Flags;
27109467b48Spatrick }
27209467b48Spatrick 
getScope() const27309467b48Spatrick DIScope *DIScope::getScope() const {
27409467b48Spatrick   if (auto *T = dyn_cast<DIType>(this))
27509467b48Spatrick     return T->getScope();
27609467b48Spatrick 
27709467b48Spatrick   if (auto *SP = dyn_cast<DISubprogram>(this))
27809467b48Spatrick     return SP->getScope();
27909467b48Spatrick 
28009467b48Spatrick   if (auto *LB = dyn_cast<DILexicalBlockBase>(this))
28109467b48Spatrick     return LB->getScope();
28209467b48Spatrick 
28309467b48Spatrick   if (auto *NS = dyn_cast<DINamespace>(this))
28409467b48Spatrick     return NS->getScope();
28509467b48Spatrick 
28609467b48Spatrick   if (auto *CB = dyn_cast<DICommonBlock>(this))
28709467b48Spatrick     return CB->getScope();
28809467b48Spatrick 
28909467b48Spatrick   if (auto *M = dyn_cast<DIModule>(this))
29009467b48Spatrick     return M->getScope();
29109467b48Spatrick 
29209467b48Spatrick   assert((isa<DIFile>(this) || isa<DICompileUnit>(this)) &&
29309467b48Spatrick          "Unhandled type of scope.");
29409467b48Spatrick   return nullptr;
29509467b48Spatrick }
29609467b48Spatrick 
getName() const29709467b48Spatrick StringRef DIScope::getName() const {
29809467b48Spatrick   if (auto *T = dyn_cast<DIType>(this))
29909467b48Spatrick     return T->getName();
30009467b48Spatrick   if (auto *SP = dyn_cast<DISubprogram>(this))
30109467b48Spatrick     return SP->getName();
30209467b48Spatrick   if (auto *NS = dyn_cast<DINamespace>(this))
30309467b48Spatrick     return NS->getName();
30409467b48Spatrick   if (auto *CB = dyn_cast<DICommonBlock>(this))
30509467b48Spatrick     return CB->getName();
30609467b48Spatrick   if (auto *M = dyn_cast<DIModule>(this))
30709467b48Spatrick     return M->getName();
30809467b48Spatrick   assert((isa<DILexicalBlockBase>(this) || isa<DIFile>(this) ||
30909467b48Spatrick           isa<DICompileUnit>(this)) &&
31009467b48Spatrick          "Unhandled type of scope.");
31109467b48Spatrick   return "";
31209467b48Spatrick }
31309467b48Spatrick 
31409467b48Spatrick #ifndef NDEBUG
isCanonical(const MDString * S)31509467b48Spatrick static bool isCanonical(const MDString *S) {
31609467b48Spatrick   return !S || !S->getString().empty();
31709467b48Spatrick }
31809467b48Spatrick #endif
31909467b48Spatrick 
getTag() const320*d415bd75Srobert dwarf::Tag GenericDINode::getTag() const { return (dwarf::Tag)SubclassData16; }
getImpl(LLVMContext & Context,unsigned Tag,MDString * Header,ArrayRef<Metadata * > DwarfOps,StorageType Storage,bool ShouldCreate)32109467b48Spatrick GenericDINode *GenericDINode::getImpl(LLVMContext &Context, unsigned Tag,
32209467b48Spatrick                                       MDString *Header,
32309467b48Spatrick                                       ArrayRef<Metadata *> DwarfOps,
32409467b48Spatrick                                       StorageType Storage, bool ShouldCreate) {
32509467b48Spatrick   unsigned Hash = 0;
32609467b48Spatrick   if (Storage == Uniqued) {
32709467b48Spatrick     GenericDINodeInfo::KeyTy Key(Tag, Header, DwarfOps);
32809467b48Spatrick     if (auto *N = getUniqued(Context.pImpl->GenericDINodes, Key))
32909467b48Spatrick       return N;
33009467b48Spatrick     if (!ShouldCreate)
33109467b48Spatrick       return nullptr;
33209467b48Spatrick     Hash = Key.getHash();
33309467b48Spatrick   } else {
33409467b48Spatrick     assert(ShouldCreate && "Expected non-uniqued nodes to always be created");
33509467b48Spatrick   }
33609467b48Spatrick 
33709467b48Spatrick   // Use a nullptr for empty headers.
33809467b48Spatrick   assert(isCanonical(Header) && "Expected canonical MDString");
33909467b48Spatrick   Metadata *PreOps[] = {Header};
340*d415bd75Srobert   return storeImpl(new (DwarfOps.size() + 1, Storage) GenericDINode(
34109467b48Spatrick                        Context, Storage, Hash, Tag, PreOps, DwarfOps),
34209467b48Spatrick                    Storage, Context.pImpl->GenericDINodes);
34309467b48Spatrick }
34409467b48Spatrick 
recalculateHash()34509467b48Spatrick void GenericDINode::recalculateHash() {
34609467b48Spatrick   setHash(GenericDINodeInfo::KeyTy::calculateHash(this));
34709467b48Spatrick }
34809467b48Spatrick 
34909467b48Spatrick #define UNWRAP_ARGS_IMPL(...) __VA_ARGS__
35009467b48Spatrick #define UNWRAP_ARGS(ARGS) UNWRAP_ARGS_IMPL ARGS
35109467b48Spatrick #define DEFINE_GETIMPL_LOOKUP(CLASS, ARGS)                                     \
35209467b48Spatrick   do {                                                                         \
35309467b48Spatrick     if (Storage == Uniqued) {                                                  \
35409467b48Spatrick       if (auto *N = getUniqued(Context.pImpl->CLASS##s,                        \
35509467b48Spatrick                                CLASS##Info::KeyTy(UNWRAP_ARGS(ARGS))))         \
35609467b48Spatrick         return N;                                                              \
35709467b48Spatrick       if (!ShouldCreate)                                                       \
35809467b48Spatrick         return nullptr;                                                        \
35909467b48Spatrick     } else {                                                                   \
36009467b48Spatrick       assert(ShouldCreate &&                                                   \
36109467b48Spatrick              "Expected non-uniqued nodes to always be created");               \
36209467b48Spatrick     }                                                                          \
36309467b48Spatrick   } while (false)
36409467b48Spatrick #define DEFINE_GETIMPL_STORE(CLASS, ARGS, OPS)                                 \
365*d415bd75Srobert   return storeImpl(new (std::size(OPS), Storage)                               \
36609467b48Spatrick                        CLASS(Context, Storage, UNWRAP_ARGS(ARGS), OPS),        \
36709467b48Spatrick                    Storage, Context.pImpl->CLASS##s)
36809467b48Spatrick #define DEFINE_GETIMPL_STORE_NO_OPS(CLASS, ARGS)                               \
369*d415bd75Srobert   return storeImpl(new (0u, Storage)                                           \
370*d415bd75Srobert                        CLASS(Context, Storage, UNWRAP_ARGS(ARGS)),             \
37109467b48Spatrick                    Storage, Context.pImpl->CLASS##s)
37209467b48Spatrick #define DEFINE_GETIMPL_STORE_NO_CONSTRUCTOR_ARGS(CLASS, OPS)                   \
373*d415bd75Srobert   return storeImpl(new (std::size(OPS), Storage) CLASS(Context, Storage, OPS), \
37409467b48Spatrick                    Storage, Context.pImpl->CLASS##s)
37509467b48Spatrick #define DEFINE_GETIMPL_STORE_N(CLASS, ARGS, OPS, NUM_OPS)                      \
376*d415bd75Srobert   return storeImpl(new (NUM_OPS, Storage)                                      \
37709467b48Spatrick                        CLASS(Context, Storage, UNWRAP_ARGS(ARGS), OPS),        \
37809467b48Spatrick                    Storage, Context.pImpl->CLASS##s)
37909467b48Spatrick 
DISubrange(LLVMContext & C,StorageType Storage,ArrayRef<Metadata * > Ops)380*d415bd75Srobert DISubrange::DISubrange(LLVMContext &C, StorageType Storage,
381*d415bd75Srobert                        ArrayRef<Metadata *> Ops)
382*d415bd75Srobert     : DINode(C, DISubrangeKind, Storage, dwarf::DW_TAG_subrange_type, Ops) {}
getImpl(LLVMContext & Context,int64_t Count,int64_t Lo,StorageType Storage,bool ShouldCreate)38309467b48Spatrick DISubrange *DISubrange::getImpl(LLVMContext &Context, int64_t Count, int64_t Lo,
38409467b48Spatrick                                 StorageType Storage, bool ShouldCreate) {
38509467b48Spatrick   auto *CountNode = ConstantAsMetadata::get(
38609467b48Spatrick       ConstantInt::getSigned(Type::getInt64Ty(Context), Count));
387097a140dSpatrick   auto *LB = ConstantAsMetadata::get(
388097a140dSpatrick       ConstantInt::getSigned(Type::getInt64Ty(Context), Lo));
389097a140dSpatrick   return getImpl(Context, CountNode, LB, nullptr, nullptr, Storage,
390097a140dSpatrick                  ShouldCreate);
39109467b48Spatrick }
39209467b48Spatrick 
getImpl(LLVMContext & Context,Metadata * CountNode,int64_t Lo,StorageType Storage,bool ShouldCreate)39309467b48Spatrick DISubrange *DISubrange::getImpl(LLVMContext &Context, Metadata *CountNode,
39409467b48Spatrick                                 int64_t Lo, StorageType Storage,
39509467b48Spatrick                                 bool ShouldCreate) {
396097a140dSpatrick   auto *LB = ConstantAsMetadata::get(
397097a140dSpatrick       ConstantInt::getSigned(Type::getInt64Ty(Context), Lo));
398097a140dSpatrick   return getImpl(Context, CountNode, LB, nullptr, nullptr, Storage,
399097a140dSpatrick                  ShouldCreate);
40009467b48Spatrick }
40109467b48Spatrick 
getImpl(LLVMContext & Context,Metadata * CountNode,Metadata * LB,Metadata * UB,Metadata * Stride,StorageType Storage,bool ShouldCreate)402097a140dSpatrick DISubrange *DISubrange::getImpl(LLVMContext &Context, Metadata *CountNode,
403097a140dSpatrick                                 Metadata *LB, Metadata *UB, Metadata *Stride,
404097a140dSpatrick                                 StorageType Storage, bool ShouldCreate) {
405097a140dSpatrick   DEFINE_GETIMPL_LOOKUP(DISubrange, (CountNode, LB, UB, Stride));
406097a140dSpatrick   Metadata *Ops[] = {CountNode, LB, UB, Stride};
407097a140dSpatrick   DEFINE_GETIMPL_STORE_NO_CONSTRUCTOR_ARGS(DISubrange, Ops);
408097a140dSpatrick }
409097a140dSpatrick 
getCount() const41073471bf0Spatrick DISubrange::BoundType DISubrange::getCount() const {
41173471bf0Spatrick   Metadata *CB = getRawCountNode();
41273471bf0Spatrick   if (!CB)
41373471bf0Spatrick     return BoundType();
414097a140dSpatrick 
41573471bf0Spatrick   assert((isa<ConstantAsMetadata>(CB) || isa<DIVariable>(CB) ||
41673471bf0Spatrick           isa<DIExpression>(CB)) &&
41773471bf0Spatrick          "Count must be signed constant or DIVariable or DIExpression");
418097a140dSpatrick 
41973471bf0Spatrick   if (auto *MD = dyn_cast<ConstantAsMetadata>(CB))
42073471bf0Spatrick     return BoundType(cast<ConstantInt>(MD->getValue()));
421097a140dSpatrick 
42273471bf0Spatrick   if (auto *MD = dyn_cast<DIVariable>(CB))
42373471bf0Spatrick     return BoundType(MD);
42473471bf0Spatrick 
42573471bf0Spatrick   if (auto *MD = dyn_cast<DIExpression>(CB))
42673471bf0Spatrick     return BoundType(MD);
42773471bf0Spatrick 
42873471bf0Spatrick   return BoundType();
429097a140dSpatrick }
430097a140dSpatrick 
getLowerBound() const431097a140dSpatrick DISubrange::BoundType DISubrange::getLowerBound() const {
432097a140dSpatrick   Metadata *LB = getRawLowerBound();
433097a140dSpatrick   if (!LB)
434097a140dSpatrick     return BoundType();
435097a140dSpatrick 
436097a140dSpatrick   assert((isa<ConstantAsMetadata>(LB) || isa<DIVariable>(LB) ||
437097a140dSpatrick           isa<DIExpression>(LB)) &&
438097a140dSpatrick          "LowerBound must be signed constant or DIVariable or DIExpression");
439097a140dSpatrick 
440097a140dSpatrick   if (auto *MD = dyn_cast<ConstantAsMetadata>(LB))
441097a140dSpatrick     return BoundType(cast<ConstantInt>(MD->getValue()));
442097a140dSpatrick 
443097a140dSpatrick   if (auto *MD = dyn_cast<DIVariable>(LB))
444097a140dSpatrick     return BoundType(MD);
445097a140dSpatrick 
446097a140dSpatrick   if (auto *MD = dyn_cast<DIExpression>(LB))
447097a140dSpatrick     return BoundType(MD);
448097a140dSpatrick 
449097a140dSpatrick   return BoundType();
450097a140dSpatrick }
451097a140dSpatrick 
getUpperBound() const452097a140dSpatrick DISubrange::BoundType DISubrange::getUpperBound() const {
453097a140dSpatrick   Metadata *UB = getRawUpperBound();
454097a140dSpatrick   if (!UB)
455097a140dSpatrick     return BoundType();
456097a140dSpatrick 
457097a140dSpatrick   assert((isa<ConstantAsMetadata>(UB) || isa<DIVariable>(UB) ||
458097a140dSpatrick           isa<DIExpression>(UB)) &&
459097a140dSpatrick          "UpperBound must be signed constant or DIVariable or DIExpression");
460097a140dSpatrick 
461097a140dSpatrick   if (auto *MD = dyn_cast<ConstantAsMetadata>(UB))
462097a140dSpatrick     return BoundType(cast<ConstantInt>(MD->getValue()));
463097a140dSpatrick 
464097a140dSpatrick   if (auto *MD = dyn_cast<DIVariable>(UB))
465097a140dSpatrick     return BoundType(MD);
466097a140dSpatrick 
467097a140dSpatrick   if (auto *MD = dyn_cast<DIExpression>(UB))
468097a140dSpatrick     return BoundType(MD);
469097a140dSpatrick 
470097a140dSpatrick   return BoundType();
471097a140dSpatrick }
472097a140dSpatrick 
getStride() const473097a140dSpatrick DISubrange::BoundType DISubrange::getStride() const {
474097a140dSpatrick   Metadata *ST = getRawStride();
475097a140dSpatrick   if (!ST)
476097a140dSpatrick     return BoundType();
477097a140dSpatrick 
478097a140dSpatrick   assert((isa<ConstantAsMetadata>(ST) || isa<DIVariable>(ST) ||
479097a140dSpatrick           isa<DIExpression>(ST)) &&
480097a140dSpatrick          "Stride must be signed constant or DIVariable or DIExpression");
481097a140dSpatrick 
482097a140dSpatrick   if (auto *MD = dyn_cast<ConstantAsMetadata>(ST))
483097a140dSpatrick     return BoundType(cast<ConstantInt>(MD->getValue()));
484097a140dSpatrick 
485097a140dSpatrick   if (auto *MD = dyn_cast<DIVariable>(ST))
486097a140dSpatrick     return BoundType(MD);
487097a140dSpatrick 
488097a140dSpatrick   if (auto *MD = dyn_cast<DIExpression>(ST))
489097a140dSpatrick     return BoundType(MD);
490097a140dSpatrick 
491097a140dSpatrick   return BoundType();
492097a140dSpatrick }
DIGenericSubrange(LLVMContext & C,StorageType Storage,ArrayRef<Metadata * > Ops)493*d415bd75Srobert DIGenericSubrange::DIGenericSubrange(LLVMContext &C, StorageType Storage,
494*d415bd75Srobert                                      ArrayRef<Metadata *> Ops)
495*d415bd75Srobert     : DINode(C, DIGenericSubrangeKind, Storage, dwarf::DW_TAG_generic_subrange,
496*d415bd75Srobert              Ops) {}
497097a140dSpatrick 
getImpl(LLVMContext & Context,Metadata * CountNode,Metadata * LB,Metadata * UB,Metadata * Stride,StorageType Storage,bool ShouldCreate)49873471bf0Spatrick DIGenericSubrange *DIGenericSubrange::getImpl(LLVMContext &Context,
49973471bf0Spatrick                                               Metadata *CountNode, Metadata *LB,
50073471bf0Spatrick                                               Metadata *UB, Metadata *Stride,
50173471bf0Spatrick                                               StorageType Storage,
50273471bf0Spatrick                                               bool ShouldCreate) {
50373471bf0Spatrick   DEFINE_GETIMPL_LOOKUP(DIGenericSubrange, (CountNode, LB, UB, Stride));
50473471bf0Spatrick   Metadata *Ops[] = {CountNode, LB, UB, Stride};
50573471bf0Spatrick   DEFINE_GETIMPL_STORE_NO_CONSTRUCTOR_ARGS(DIGenericSubrange, Ops);
50673471bf0Spatrick }
50773471bf0Spatrick 
getCount() const50873471bf0Spatrick DIGenericSubrange::BoundType DIGenericSubrange::getCount() const {
50973471bf0Spatrick   Metadata *CB = getRawCountNode();
51073471bf0Spatrick   if (!CB)
51173471bf0Spatrick     return BoundType();
51273471bf0Spatrick 
51373471bf0Spatrick   assert((isa<DIVariable>(CB) || isa<DIExpression>(CB)) &&
51473471bf0Spatrick          "Count must be signed constant or DIVariable or DIExpression");
51573471bf0Spatrick 
51673471bf0Spatrick   if (auto *MD = dyn_cast<DIVariable>(CB))
51773471bf0Spatrick     return BoundType(MD);
51873471bf0Spatrick 
51973471bf0Spatrick   if (auto *MD = dyn_cast<DIExpression>(CB))
52073471bf0Spatrick     return BoundType(MD);
52173471bf0Spatrick 
52273471bf0Spatrick   return BoundType();
52373471bf0Spatrick }
52473471bf0Spatrick 
getLowerBound() const52573471bf0Spatrick DIGenericSubrange::BoundType DIGenericSubrange::getLowerBound() const {
52673471bf0Spatrick   Metadata *LB = getRawLowerBound();
52773471bf0Spatrick   if (!LB)
52873471bf0Spatrick     return BoundType();
52973471bf0Spatrick 
53073471bf0Spatrick   assert((isa<DIVariable>(LB) || isa<DIExpression>(LB)) &&
53173471bf0Spatrick          "LowerBound must be signed constant or DIVariable or DIExpression");
53273471bf0Spatrick 
53373471bf0Spatrick   if (auto *MD = dyn_cast<DIVariable>(LB))
53473471bf0Spatrick     return BoundType(MD);
53573471bf0Spatrick 
53673471bf0Spatrick   if (auto *MD = dyn_cast<DIExpression>(LB))
53773471bf0Spatrick     return BoundType(MD);
53873471bf0Spatrick 
53973471bf0Spatrick   return BoundType();
54073471bf0Spatrick }
54173471bf0Spatrick 
getUpperBound() const54273471bf0Spatrick DIGenericSubrange::BoundType DIGenericSubrange::getUpperBound() const {
54373471bf0Spatrick   Metadata *UB = getRawUpperBound();
54473471bf0Spatrick   if (!UB)
54573471bf0Spatrick     return BoundType();
54673471bf0Spatrick 
54773471bf0Spatrick   assert((isa<DIVariable>(UB) || isa<DIExpression>(UB)) &&
54873471bf0Spatrick          "UpperBound must be signed constant or DIVariable or DIExpression");
54973471bf0Spatrick 
55073471bf0Spatrick   if (auto *MD = dyn_cast<DIVariable>(UB))
55173471bf0Spatrick     return BoundType(MD);
55273471bf0Spatrick 
55373471bf0Spatrick   if (auto *MD = dyn_cast<DIExpression>(UB))
55473471bf0Spatrick     return BoundType(MD);
55573471bf0Spatrick 
55673471bf0Spatrick   return BoundType();
55773471bf0Spatrick }
55873471bf0Spatrick 
getStride() const55973471bf0Spatrick DIGenericSubrange::BoundType DIGenericSubrange::getStride() const {
56073471bf0Spatrick   Metadata *ST = getRawStride();
56173471bf0Spatrick   if (!ST)
56273471bf0Spatrick     return BoundType();
56373471bf0Spatrick 
56473471bf0Spatrick   assert((isa<DIVariable>(ST) || isa<DIExpression>(ST)) &&
56573471bf0Spatrick          "Stride must be signed constant or DIVariable or DIExpression");
56673471bf0Spatrick 
56773471bf0Spatrick   if (auto *MD = dyn_cast<DIVariable>(ST))
56873471bf0Spatrick     return BoundType(MD);
56973471bf0Spatrick 
57073471bf0Spatrick   if (auto *MD = dyn_cast<DIExpression>(ST))
57173471bf0Spatrick     return BoundType(MD);
57273471bf0Spatrick 
57373471bf0Spatrick   return BoundType();
57473471bf0Spatrick }
57573471bf0Spatrick 
DIEnumerator(LLVMContext & C,StorageType Storage,const APInt & Value,bool IsUnsigned,ArrayRef<Metadata * > Ops)576*d415bd75Srobert DIEnumerator::DIEnumerator(LLVMContext &C, StorageType Storage,
577*d415bd75Srobert                            const APInt &Value, bool IsUnsigned,
578*d415bd75Srobert                            ArrayRef<Metadata *> Ops)
579*d415bd75Srobert     : DINode(C, DIEnumeratorKind, Storage, dwarf::DW_TAG_enumerator, Ops),
580*d415bd75Srobert       Value(Value) {
581*d415bd75Srobert   SubclassData32 = IsUnsigned;
582*d415bd75Srobert }
getImpl(LLVMContext & Context,const APInt & Value,bool IsUnsigned,MDString * Name,StorageType Storage,bool ShouldCreate)583097a140dSpatrick DIEnumerator *DIEnumerator::getImpl(LLVMContext &Context, const APInt &Value,
58409467b48Spatrick                                     bool IsUnsigned, MDString *Name,
58509467b48Spatrick                                     StorageType Storage, bool ShouldCreate) {
58609467b48Spatrick   assert(isCanonical(Name) && "Expected canonical MDString");
58709467b48Spatrick   DEFINE_GETIMPL_LOOKUP(DIEnumerator, (Value, IsUnsigned, Name));
58809467b48Spatrick   Metadata *Ops[] = {Name};
58909467b48Spatrick   DEFINE_GETIMPL_STORE(DIEnumerator, (Value, IsUnsigned), Ops);
59009467b48Spatrick }
59109467b48Spatrick 
getImpl(LLVMContext & Context,unsigned Tag,MDString * Name,uint64_t SizeInBits,uint32_t AlignInBits,unsigned Encoding,DIFlags Flags,StorageType Storage,bool ShouldCreate)59209467b48Spatrick DIBasicType *DIBasicType::getImpl(LLVMContext &Context, unsigned Tag,
59309467b48Spatrick                                   MDString *Name, uint64_t SizeInBits,
59409467b48Spatrick                                   uint32_t AlignInBits, unsigned Encoding,
59509467b48Spatrick                                   DIFlags Flags, StorageType Storage,
59609467b48Spatrick                                   bool ShouldCreate) {
59709467b48Spatrick   assert(isCanonical(Name) && "Expected canonical MDString");
59809467b48Spatrick   DEFINE_GETIMPL_LOOKUP(DIBasicType,
59909467b48Spatrick                         (Tag, Name, SizeInBits, AlignInBits, Encoding, Flags));
60009467b48Spatrick   Metadata *Ops[] = {nullptr, nullptr, Name};
601*d415bd75Srobert   DEFINE_GETIMPL_STORE(DIBasicType,
602*d415bd75Srobert                        (Tag, SizeInBits, AlignInBits, Encoding, Flags), Ops);
60309467b48Spatrick }
60409467b48Spatrick 
getSignedness() const605*d415bd75Srobert std::optional<DIBasicType::Signedness> DIBasicType::getSignedness() const {
60609467b48Spatrick   switch (getEncoding()) {
60709467b48Spatrick   case dwarf::DW_ATE_signed:
60809467b48Spatrick   case dwarf::DW_ATE_signed_char:
60909467b48Spatrick     return Signedness::Signed;
61009467b48Spatrick   case dwarf::DW_ATE_unsigned:
61109467b48Spatrick   case dwarf::DW_ATE_unsigned_char:
61209467b48Spatrick     return Signedness::Unsigned;
61309467b48Spatrick   default:
614*d415bd75Srobert     return std::nullopt;
61509467b48Spatrick   }
61609467b48Spatrick }
61709467b48Spatrick 
getImpl(LLVMContext & Context,unsigned Tag,MDString * Name,Metadata * StringLength,Metadata * StringLengthExp,Metadata * StringLocationExp,uint64_t SizeInBits,uint32_t AlignInBits,unsigned Encoding,StorageType Storage,bool ShouldCreate)61873471bf0Spatrick DIStringType *DIStringType::getImpl(LLVMContext &Context, unsigned Tag,
61973471bf0Spatrick                                     MDString *Name, Metadata *StringLength,
62073471bf0Spatrick                                     Metadata *StringLengthExp,
621*d415bd75Srobert                                     Metadata *StringLocationExp,
62273471bf0Spatrick                                     uint64_t SizeInBits, uint32_t AlignInBits,
62373471bf0Spatrick                                     unsigned Encoding, StorageType Storage,
62473471bf0Spatrick                                     bool ShouldCreate) {
62573471bf0Spatrick   assert(isCanonical(Name) && "Expected canonical MDString");
626*d415bd75Srobert   DEFINE_GETIMPL_LOOKUP(DIStringType,
627*d415bd75Srobert                         (Tag, Name, StringLength, StringLengthExp,
628*d415bd75Srobert                          StringLocationExp, SizeInBits, AlignInBits, Encoding));
629*d415bd75Srobert   Metadata *Ops[] = {nullptr,      nullptr,         Name,
630*d415bd75Srobert                      StringLength, StringLengthExp, StringLocationExp};
63173471bf0Spatrick   DEFINE_GETIMPL_STORE(DIStringType, (Tag, SizeInBits, AlignInBits, Encoding),
63273471bf0Spatrick                        Ops);
63373471bf0Spatrick }
getClassType() const634*d415bd75Srobert DIType *DIDerivedType::getClassType() const {
635*d415bd75Srobert   assert(getTag() == dwarf::DW_TAG_ptr_to_member_type);
636*d415bd75Srobert   return cast_or_null<DIType>(getExtraData());
637*d415bd75Srobert }
getVBPtrOffset() const638*d415bd75Srobert uint32_t DIDerivedType::getVBPtrOffset() const {
639*d415bd75Srobert   assert(getTag() == dwarf::DW_TAG_inheritance);
640*d415bd75Srobert   if (auto *CM = cast_or_null<ConstantAsMetadata>(getExtraData()))
641*d415bd75Srobert     if (auto *CI = dyn_cast_or_null<ConstantInt>(CM->getValue()))
642*d415bd75Srobert       return static_cast<uint32_t>(CI->getZExtValue());
643*d415bd75Srobert   return 0;
644*d415bd75Srobert }
getStorageOffsetInBits() const645*d415bd75Srobert Constant *DIDerivedType::getStorageOffsetInBits() const {
646*d415bd75Srobert   assert(getTag() == dwarf::DW_TAG_member && isBitField());
647*d415bd75Srobert   if (auto *C = cast_or_null<ConstantAsMetadata>(getExtraData()))
648*d415bd75Srobert     return C->getValue();
649*d415bd75Srobert   return nullptr;
650*d415bd75Srobert }
65173471bf0Spatrick 
getConstant() const652*d415bd75Srobert Constant *DIDerivedType::getConstant() const {
653*d415bd75Srobert   assert(getTag() == dwarf::DW_TAG_member && isStaticMember());
654*d415bd75Srobert   if (auto *C = cast_or_null<ConstantAsMetadata>(getExtraData()))
655*d415bd75Srobert     return C->getValue();
656*d415bd75Srobert   return nullptr;
657*d415bd75Srobert }
getDiscriminantValue() const658*d415bd75Srobert Constant *DIDerivedType::getDiscriminantValue() const {
659*d415bd75Srobert   assert(getTag() == dwarf::DW_TAG_member && !isStaticMember());
660*d415bd75Srobert   if (auto *C = cast_or_null<ConstantAsMetadata>(getExtraData()))
661*d415bd75Srobert     return C->getValue();
662*d415bd75Srobert   return nullptr;
663*d415bd75Srobert }
664*d415bd75Srobert 
665*d415bd75Srobert DIDerivedType *
getImpl(LLVMContext & Context,unsigned Tag,MDString * Name,Metadata * File,unsigned Line,Metadata * Scope,Metadata * BaseType,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,std::optional<unsigned> DWARFAddressSpace,DIFlags Flags,Metadata * ExtraData,Metadata * Annotations,StorageType Storage,bool ShouldCreate)666*d415bd75Srobert DIDerivedType::getImpl(LLVMContext &Context, unsigned Tag, MDString *Name,
667*d415bd75Srobert                        Metadata *File, unsigned Line, Metadata *Scope,
668*d415bd75Srobert                        Metadata *BaseType, uint64_t SizeInBits,
66909467b48Spatrick                        uint32_t AlignInBits, uint64_t OffsetInBits,
670*d415bd75Srobert                        std::optional<unsigned> DWARFAddressSpace, DIFlags Flags,
671*d415bd75Srobert                        Metadata *ExtraData, Metadata *Annotations,
67209467b48Spatrick                        StorageType Storage, bool ShouldCreate) {
67309467b48Spatrick   assert(isCanonical(Name) && "Expected canonical MDString");
67409467b48Spatrick   DEFINE_GETIMPL_LOOKUP(DIDerivedType,
67509467b48Spatrick                         (Tag, Name, File, Line, Scope, BaseType, SizeInBits,
67609467b48Spatrick                          AlignInBits, OffsetInBits, DWARFAddressSpace, Flags,
677*d415bd75Srobert                          ExtraData, Annotations));
678*d415bd75Srobert   Metadata *Ops[] = {File, Scope, Name, BaseType, ExtraData, Annotations};
679*d415bd75Srobert   DEFINE_GETIMPL_STORE(DIDerivedType,
680*d415bd75Srobert                        (Tag, Line, SizeInBits, AlignInBits, OffsetInBits,
681*d415bd75Srobert                         DWARFAddressSpace, Flags),
682*d415bd75Srobert                        Ops);
68309467b48Spatrick }
68409467b48Spatrick 
getImpl(LLVMContext & Context,unsigned Tag,MDString * Name,Metadata * File,unsigned Line,Metadata * Scope,Metadata * BaseType,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,DIFlags Flags,Metadata * Elements,unsigned RuntimeLang,Metadata * VTableHolder,Metadata * TemplateParams,MDString * Identifier,Metadata * Discriminator,Metadata * DataLocation,Metadata * Associated,Metadata * Allocated,Metadata * Rank,Metadata * Annotations,StorageType Storage,bool ShouldCreate)68509467b48Spatrick DICompositeType *DICompositeType::getImpl(
68609467b48Spatrick     LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
68709467b48Spatrick     unsigned Line, Metadata *Scope, Metadata *BaseType, uint64_t SizeInBits,
68809467b48Spatrick     uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags,
68909467b48Spatrick     Metadata *Elements, unsigned RuntimeLang, Metadata *VTableHolder,
69009467b48Spatrick     Metadata *TemplateParams, MDString *Identifier, Metadata *Discriminator,
69173471bf0Spatrick     Metadata *DataLocation, Metadata *Associated, Metadata *Allocated,
692*d415bd75Srobert     Metadata *Rank, Metadata *Annotations, StorageType Storage,
693*d415bd75Srobert     bool ShouldCreate) {
69409467b48Spatrick   assert(isCanonical(Name) && "Expected canonical MDString");
69509467b48Spatrick 
69609467b48Spatrick   // Keep this in sync with buildODRType.
697*d415bd75Srobert   DEFINE_GETIMPL_LOOKUP(DICompositeType,
698*d415bd75Srobert                         (Tag, Name, File, Line, Scope, BaseType, SizeInBits,
699*d415bd75Srobert                          AlignInBits, OffsetInBits, Flags, Elements,
700*d415bd75Srobert                          RuntimeLang, VTableHolder, TemplateParams, Identifier,
701*d415bd75Srobert                          Discriminator, DataLocation, Associated, Allocated,
702*d415bd75Srobert                          Rank, Annotations));
70309467b48Spatrick   Metadata *Ops[] = {File,          Scope,        Name,           BaseType,
70409467b48Spatrick                      Elements,      VTableHolder, TemplateParams, Identifier,
70573471bf0Spatrick                      Discriminator, DataLocation, Associated,     Allocated,
706*d415bd75Srobert                      Rank,          Annotations};
707*d415bd75Srobert   DEFINE_GETIMPL_STORE(
708*d415bd75Srobert       DICompositeType,
709*d415bd75Srobert       (Tag, Line, RuntimeLang, SizeInBits, AlignInBits, OffsetInBits, Flags),
71009467b48Spatrick       Ops);
71109467b48Spatrick }
71209467b48Spatrick 
buildODRType(LLVMContext & Context,MDString & Identifier,unsigned Tag,MDString * Name,Metadata * File,unsigned Line,Metadata * Scope,Metadata * BaseType,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,DIFlags Flags,Metadata * Elements,unsigned RuntimeLang,Metadata * VTableHolder,Metadata * TemplateParams,Metadata * Discriminator,Metadata * DataLocation,Metadata * Associated,Metadata * Allocated,Metadata * Rank,Metadata * Annotations)71309467b48Spatrick DICompositeType *DICompositeType::buildODRType(
71409467b48Spatrick     LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name,
71509467b48Spatrick     Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType,
71609467b48Spatrick     uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
71709467b48Spatrick     DIFlags Flags, Metadata *Elements, unsigned RuntimeLang,
718097a140dSpatrick     Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator,
71973471bf0Spatrick     Metadata *DataLocation, Metadata *Associated, Metadata *Allocated,
720*d415bd75Srobert     Metadata *Rank, Metadata *Annotations) {
72109467b48Spatrick   assert(!Identifier.getString().empty() && "Expected valid identifier");
72209467b48Spatrick   if (!Context.isODRUniquingDebugTypes())
72309467b48Spatrick     return nullptr;
72409467b48Spatrick   auto *&CT = (*Context.pImpl->DITypeMap)[&Identifier];
72509467b48Spatrick   if (!CT)
72609467b48Spatrick     return CT = DICompositeType::getDistinct(
72709467b48Spatrick                Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits,
72809467b48Spatrick                AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
729097a140dSpatrick                VTableHolder, TemplateParams, &Identifier, Discriminator,
730*d415bd75Srobert                DataLocation, Associated, Allocated, Rank, Annotations);
731*d415bd75Srobert 
732*d415bd75Srobert   if (CT->getTag() != Tag)
733*d415bd75Srobert     return nullptr;
73409467b48Spatrick 
73509467b48Spatrick   // Only mutate CT if it's a forward declaration and the new operands aren't.
73609467b48Spatrick   assert(CT->getRawIdentifier() == &Identifier && "Wrong ODR identifier?");
73709467b48Spatrick   if (!CT->isForwardDecl() || (Flags & DINode::FlagFwdDecl))
73809467b48Spatrick     return CT;
73909467b48Spatrick 
74009467b48Spatrick   // Mutate CT in place.  Keep this in sync with getImpl.
74109467b48Spatrick   CT->mutate(Tag, Line, RuntimeLang, SizeInBits, AlignInBits, OffsetInBits,
74209467b48Spatrick              Flags);
74309467b48Spatrick   Metadata *Ops[] = {File,          Scope,        Name,           BaseType,
74409467b48Spatrick                      Elements,      VTableHolder, TemplateParams, &Identifier,
74573471bf0Spatrick                      Discriminator, DataLocation, Associated,     Allocated,
746*d415bd75Srobert                      Rank,          Annotations};
74709467b48Spatrick   assert((std::end(Ops) - std::begin(Ops)) == (int)CT->getNumOperands() &&
74809467b48Spatrick          "Mismatched number of operands");
74909467b48Spatrick   for (unsigned I = 0, E = CT->getNumOperands(); I != E; ++I)
75009467b48Spatrick     if (Ops[I] != CT->getOperand(I))
75109467b48Spatrick       CT->setOperand(I, Ops[I]);
75209467b48Spatrick   return CT;
75309467b48Spatrick }
75409467b48Spatrick 
getODRType(LLVMContext & Context,MDString & Identifier,unsigned Tag,MDString * Name,Metadata * File,unsigned Line,Metadata * Scope,Metadata * BaseType,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,DIFlags Flags,Metadata * Elements,unsigned RuntimeLang,Metadata * VTableHolder,Metadata * TemplateParams,Metadata * Discriminator,Metadata * DataLocation,Metadata * Associated,Metadata * Allocated,Metadata * Rank,Metadata * Annotations)75509467b48Spatrick DICompositeType *DICompositeType::getODRType(
75609467b48Spatrick     LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name,
75709467b48Spatrick     Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType,
75809467b48Spatrick     uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
75909467b48Spatrick     DIFlags Flags, Metadata *Elements, unsigned RuntimeLang,
760097a140dSpatrick     Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator,
76173471bf0Spatrick     Metadata *DataLocation, Metadata *Associated, Metadata *Allocated,
762*d415bd75Srobert     Metadata *Rank, Metadata *Annotations) {
76309467b48Spatrick   assert(!Identifier.getString().empty() && "Expected valid identifier");
76409467b48Spatrick   if (!Context.isODRUniquingDebugTypes())
76509467b48Spatrick     return nullptr;
76609467b48Spatrick   auto *&CT = (*Context.pImpl->DITypeMap)[&Identifier];
767*d415bd75Srobert   if (!CT) {
76809467b48Spatrick     CT = DICompositeType::getDistinct(
76909467b48Spatrick         Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits,
77009467b48Spatrick         AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, VTableHolder,
77173471bf0Spatrick         TemplateParams, &Identifier, Discriminator, DataLocation, Associated,
772*d415bd75Srobert         Allocated, Rank, Annotations);
773*d415bd75Srobert   } else {
774*d415bd75Srobert     if (CT->getTag() != Tag)
775*d415bd75Srobert       return nullptr;
776*d415bd75Srobert   }
77709467b48Spatrick   return CT;
77809467b48Spatrick }
77909467b48Spatrick 
getODRTypeIfExists(LLVMContext & Context,MDString & Identifier)78009467b48Spatrick DICompositeType *DICompositeType::getODRTypeIfExists(LLVMContext &Context,
78109467b48Spatrick                                                      MDString &Identifier) {
78209467b48Spatrick   assert(!Identifier.getString().empty() && "Expected valid identifier");
78309467b48Spatrick   if (!Context.isODRUniquingDebugTypes())
78409467b48Spatrick     return nullptr;
78509467b48Spatrick   return Context.pImpl->DITypeMap->lookup(&Identifier);
78609467b48Spatrick }
DISubroutineType(LLVMContext & C,StorageType Storage,DIFlags Flags,uint8_t CC,ArrayRef<Metadata * > Ops)787*d415bd75Srobert DISubroutineType::DISubroutineType(LLVMContext &C, StorageType Storage,
788*d415bd75Srobert                                    DIFlags Flags, uint8_t CC,
789*d415bd75Srobert                                    ArrayRef<Metadata *> Ops)
790*d415bd75Srobert     : DIType(C, DISubroutineTypeKind, Storage, dwarf::DW_TAG_subroutine_type, 0,
791*d415bd75Srobert              0, 0, 0, Flags, Ops),
792*d415bd75Srobert       CC(CC) {}
79309467b48Spatrick 
getImpl(LLVMContext & Context,DIFlags Flags,uint8_t CC,Metadata * TypeArray,StorageType Storage,bool ShouldCreate)79409467b48Spatrick DISubroutineType *DISubroutineType::getImpl(LLVMContext &Context, DIFlags Flags,
79509467b48Spatrick                                             uint8_t CC, Metadata *TypeArray,
79609467b48Spatrick                                             StorageType Storage,
79709467b48Spatrick                                             bool ShouldCreate) {
79809467b48Spatrick   DEFINE_GETIMPL_LOOKUP(DISubroutineType, (Flags, CC, TypeArray));
79909467b48Spatrick   Metadata *Ops[] = {nullptr, nullptr, nullptr, TypeArray};
80009467b48Spatrick   DEFINE_GETIMPL_STORE(DISubroutineType, (Flags, CC), Ops);
80109467b48Spatrick }
80209467b48Spatrick 
DIFile(LLVMContext & C,StorageType Storage,std::optional<ChecksumInfo<MDString * >> CS,MDString * Src,ArrayRef<Metadata * > Ops)803*d415bd75Srobert DIFile::DIFile(LLVMContext &C, StorageType Storage,
804*d415bd75Srobert                std::optional<ChecksumInfo<MDString *>> CS, MDString *Src,
805*d415bd75Srobert                ArrayRef<Metadata *> Ops)
806*d415bd75Srobert     : DIScope(C, DIFileKind, Storage, dwarf::DW_TAG_file_type, Ops),
807*d415bd75Srobert       Checksum(CS), Source(Src) {}
808*d415bd75Srobert 
80909467b48Spatrick // FIXME: Implement this string-enum correspondence with a .def file and macros,
81009467b48Spatrick // so that the association is explicit rather than implied.
81109467b48Spatrick static const char *ChecksumKindName[DIFile::CSK_Last] = {
81209467b48Spatrick     "CSK_MD5",
813097a140dSpatrick     "CSK_SHA1",
814097a140dSpatrick     "CSK_SHA256",
81509467b48Spatrick };
81609467b48Spatrick 
getChecksumKindAsString(ChecksumKind CSKind)81709467b48Spatrick StringRef DIFile::getChecksumKindAsString(ChecksumKind CSKind) {
81809467b48Spatrick   assert(CSKind <= DIFile::CSK_Last && "Invalid checksum kind");
81909467b48Spatrick   // The first space was originally the CSK_None variant, which is now
82009467b48Spatrick   // obsolete, but the space is still reserved in ChecksumKind, so we account
82109467b48Spatrick   // for it here.
82209467b48Spatrick   return ChecksumKindName[CSKind - 1];
82309467b48Spatrick }
82409467b48Spatrick 
825*d415bd75Srobert std::optional<DIFile::ChecksumKind>
getChecksumKind(StringRef CSKindStr)826*d415bd75Srobert DIFile::getChecksumKind(StringRef CSKindStr) {
827*d415bd75Srobert   return StringSwitch<std::optional<DIFile::ChecksumKind>>(CSKindStr)
82809467b48Spatrick       .Case("CSK_MD5", DIFile::CSK_MD5)
82909467b48Spatrick       .Case("CSK_SHA1", DIFile::CSK_SHA1)
830097a140dSpatrick       .Case("CSK_SHA256", DIFile::CSK_SHA256)
831*d415bd75Srobert       .Default(std::nullopt);
83209467b48Spatrick }
83309467b48Spatrick 
getImpl(LLVMContext & Context,MDString * Filename,MDString * Directory,std::optional<DIFile::ChecksumInfo<MDString * >> CS,MDString * Source,StorageType Storage,bool ShouldCreate)83409467b48Spatrick DIFile *DIFile::getImpl(LLVMContext &Context, MDString *Filename,
83509467b48Spatrick                         MDString *Directory,
836*d415bd75Srobert                         std::optional<DIFile::ChecksumInfo<MDString *>> CS,
837*d415bd75Srobert                         MDString *Source, StorageType Storage,
83809467b48Spatrick                         bool ShouldCreate) {
83909467b48Spatrick   assert(isCanonical(Filename) && "Expected canonical MDString");
84009467b48Spatrick   assert(isCanonical(Directory) && "Expected canonical MDString");
84109467b48Spatrick   assert((!CS || isCanonical(CS->Value)) && "Expected canonical MDString");
842*d415bd75Srobert   // We do *NOT* expect Source to be a canonical MDString because nullptr
843*d415bd75Srobert   // means none, so we need something to represent the empty file.
84409467b48Spatrick   DEFINE_GETIMPL_LOOKUP(DIFile, (Filename, Directory, CS, Source));
845*d415bd75Srobert   Metadata *Ops[] = {Filename, Directory, CS ? CS->Value : nullptr, Source};
84609467b48Spatrick   DEFINE_GETIMPL_STORE(DIFile, (CS, Source), Ops);
84709467b48Spatrick }
DICompileUnit(LLVMContext & C,StorageType Storage,unsigned SourceLanguage,bool IsOptimized,unsigned RuntimeVersion,unsigned EmissionKind,uint64_t DWOId,bool SplitDebugInlining,bool DebugInfoForProfiling,unsigned NameTableKind,bool RangesBaseAddress,ArrayRef<Metadata * > Ops)848*d415bd75Srobert DICompileUnit::DICompileUnit(LLVMContext &C, StorageType Storage,
849*d415bd75Srobert                              unsigned SourceLanguage, bool IsOptimized,
850*d415bd75Srobert                              unsigned RuntimeVersion, unsigned EmissionKind,
851*d415bd75Srobert                              uint64_t DWOId, bool SplitDebugInlining,
852*d415bd75Srobert                              bool DebugInfoForProfiling, unsigned NameTableKind,
853*d415bd75Srobert                              bool RangesBaseAddress, ArrayRef<Metadata *> Ops)
854*d415bd75Srobert     : DIScope(C, DICompileUnitKind, Storage, dwarf::DW_TAG_compile_unit, Ops),
855*d415bd75Srobert       SourceLanguage(SourceLanguage), IsOptimized(IsOptimized),
856*d415bd75Srobert       RuntimeVersion(RuntimeVersion), EmissionKind(EmissionKind), DWOId(DWOId),
857*d415bd75Srobert       SplitDebugInlining(SplitDebugInlining),
858*d415bd75Srobert       DebugInfoForProfiling(DebugInfoForProfiling),
859*d415bd75Srobert       NameTableKind(NameTableKind), RangesBaseAddress(RangesBaseAddress) {
860*d415bd75Srobert   assert(Storage != Uniqued);
861*d415bd75Srobert }
86209467b48Spatrick 
getImpl(LLVMContext & Context,unsigned SourceLanguage,Metadata * File,MDString * Producer,bool IsOptimized,MDString * Flags,unsigned RuntimeVersion,MDString * SplitDebugFilename,unsigned EmissionKind,Metadata * EnumTypes,Metadata * RetainedTypes,Metadata * GlobalVariables,Metadata * ImportedEntities,Metadata * Macros,uint64_t DWOId,bool SplitDebugInlining,bool DebugInfoForProfiling,unsigned NameTableKind,bool RangesBaseAddress,MDString * SysRoot,MDString * SDK,StorageType Storage,bool ShouldCreate)86309467b48Spatrick DICompileUnit *DICompileUnit::getImpl(
86409467b48Spatrick     LLVMContext &Context, unsigned SourceLanguage, Metadata *File,
86509467b48Spatrick     MDString *Producer, bool IsOptimized, MDString *Flags,
86609467b48Spatrick     unsigned RuntimeVersion, MDString *SplitDebugFilename,
86709467b48Spatrick     unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes,
86809467b48Spatrick     Metadata *GlobalVariables, Metadata *ImportedEntities, Metadata *Macros,
86909467b48Spatrick     uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling,
870097a140dSpatrick     unsigned NameTableKind, bool RangesBaseAddress, MDString *SysRoot,
871097a140dSpatrick     MDString *SDK, StorageType Storage, bool ShouldCreate) {
87209467b48Spatrick   assert(Storage != Uniqued && "Cannot unique DICompileUnit");
87309467b48Spatrick   assert(isCanonical(Producer) && "Expected canonical MDString");
87409467b48Spatrick   assert(isCanonical(Flags) && "Expected canonical MDString");
87509467b48Spatrick   assert(isCanonical(SplitDebugFilename) && "Expected canonical MDString");
87609467b48Spatrick 
877097a140dSpatrick   Metadata *Ops[] = {File,
878097a140dSpatrick                      Producer,
879097a140dSpatrick                      Flags,
880097a140dSpatrick                      SplitDebugFilename,
881097a140dSpatrick                      EnumTypes,
882097a140dSpatrick                      RetainedTypes,
883097a140dSpatrick                      GlobalVariables,
884097a140dSpatrick                      ImportedEntities,
885097a140dSpatrick                      Macros,
886097a140dSpatrick                      SysRoot,
887097a140dSpatrick                      SDK};
888*d415bd75Srobert   return storeImpl(new (std::size(Ops), Storage) DICompileUnit(
88909467b48Spatrick                        Context, Storage, SourceLanguage, IsOptimized,
89009467b48Spatrick                        RuntimeVersion, EmissionKind, DWOId, SplitDebugInlining,
89109467b48Spatrick                        DebugInfoForProfiling, NameTableKind, RangesBaseAddress,
89209467b48Spatrick                        Ops),
89309467b48Spatrick                    Storage);
89409467b48Spatrick }
89509467b48Spatrick 
896*d415bd75Srobert std::optional<DICompileUnit::DebugEmissionKind>
getEmissionKind(StringRef Str)89709467b48Spatrick DICompileUnit::getEmissionKind(StringRef Str) {
898*d415bd75Srobert   return StringSwitch<std::optional<DebugEmissionKind>>(Str)
89909467b48Spatrick       .Case("NoDebug", NoDebug)
90009467b48Spatrick       .Case("FullDebug", FullDebug)
90109467b48Spatrick       .Case("LineTablesOnly", LineTablesOnly)
90209467b48Spatrick       .Case("DebugDirectivesOnly", DebugDirectivesOnly)
903*d415bd75Srobert       .Default(std::nullopt);
90409467b48Spatrick }
90509467b48Spatrick 
906*d415bd75Srobert std::optional<DICompileUnit::DebugNameTableKind>
getNameTableKind(StringRef Str)90709467b48Spatrick DICompileUnit::getNameTableKind(StringRef Str) {
908*d415bd75Srobert   return StringSwitch<std::optional<DebugNameTableKind>>(Str)
90909467b48Spatrick       .Case("Default", DebugNameTableKind::Default)
91009467b48Spatrick       .Case("GNU", DebugNameTableKind::GNU)
91109467b48Spatrick       .Case("None", DebugNameTableKind::None)
912*d415bd75Srobert       .Default(std::nullopt);
91309467b48Spatrick }
91409467b48Spatrick 
emissionKindString(DebugEmissionKind EK)91509467b48Spatrick const char *DICompileUnit::emissionKindString(DebugEmissionKind EK) {
91609467b48Spatrick   switch (EK) {
917*d415bd75Srobert   case NoDebug:
918*d415bd75Srobert     return "NoDebug";
919*d415bd75Srobert   case FullDebug:
920*d415bd75Srobert     return "FullDebug";
921*d415bd75Srobert   case LineTablesOnly:
922*d415bd75Srobert     return "LineTablesOnly";
923*d415bd75Srobert   case DebugDirectivesOnly:
924*d415bd75Srobert     return "DebugDirectivesOnly";
92509467b48Spatrick   }
92609467b48Spatrick   return nullptr;
92709467b48Spatrick }
92809467b48Spatrick 
nameTableKindString(DebugNameTableKind NTK)92909467b48Spatrick const char *DICompileUnit::nameTableKindString(DebugNameTableKind NTK) {
93009467b48Spatrick   switch (NTK) {
93109467b48Spatrick   case DebugNameTableKind::Default:
93209467b48Spatrick     return nullptr;
93309467b48Spatrick   case DebugNameTableKind::GNU:
93409467b48Spatrick     return "GNU";
93509467b48Spatrick   case DebugNameTableKind::None:
93609467b48Spatrick     return "None";
93709467b48Spatrick   }
93809467b48Spatrick   return nullptr;
93909467b48Spatrick }
DISubprogram(LLVMContext & C,StorageType Storage,unsigned Line,unsigned ScopeLine,unsigned VirtualIndex,int ThisAdjustment,DIFlags Flags,DISPFlags SPFlags,ArrayRef<Metadata * > Ops)940*d415bd75Srobert DISubprogram::DISubprogram(LLVMContext &C, StorageType Storage, unsigned Line,
941*d415bd75Srobert                            unsigned ScopeLine, unsigned VirtualIndex,
942*d415bd75Srobert                            int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags,
943*d415bd75Srobert                            ArrayRef<Metadata *> Ops)
944*d415bd75Srobert     : DILocalScope(C, DISubprogramKind, Storage, dwarf::DW_TAG_subprogram, Ops),
945*d415bd75Srobert       Line(Line), ScopeLine(ScopeLine), VirtualIndex(VirtualIndex),
946*d415bd75Srobert       ThisAdjustment(ThisAdjustment), Flags(Flags), SPFlags(SPFlags) {
947*d415bd75Srobert   static_assert(dwarf::DW_VIRTUALITY_max < 4, "Virtuality out of range");
948*d415bd75Srobert }
949*d415bd75Srobert DISubprogram::DISPFlags
toSPFlags(bool IsLocalToUnit,bool IsDefinition,bool IsOptimized,unsigned Virtuality,bool IsMainSubprogram)950*d415bd75Srobert DISubprogram::toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized,
951*d415bd75Srobert                         unsigned Virtuality, bool IsMainSubprogram) {
952*d415bd75Srobert   // We're assuming virtuality is the low-order field.
953*d415bd75Srobert   static_assert(int(SPFlagVirtual) == int(dwarf::DW_VIRTUALITY_virtual) &&
954*d415bd75Srobert                     int(SPFlagPureVirtual) ==
955*d415bd75Srobert                         int(dwarf::DW_VIRTUALITY_pure_virtual),
956*d415bd75Srobert                 "Virtuality constant mismatch");
957*d415bd75Srobert   return static_cast<DISPFlags>(
958*d415bd75Srobert       (Virtuality & SPFlagVirtuality) |
959*d415bd75Srobert       (IsLocalToUnit ? SPFlagLocalToUnit : SPFlagZero) |
960*d415bd75Srobert       (IsDefinition ? SPFlagDefinition : SPFlagZero) |
961*d415bd75Srobert       (IsOptimized ? SPFlagOptimized : SPFlagZero) |
962*d415bd75Srobert       (IsMainSubprogram ? SPFlagMainSubprogram : SPFlagZero));
963*d415bd75Srobert }
96409467b48Spatrick 
getSubprogram() const96509467b48Spatrick DISubprogram *DILocalScope::getSubprogram() const {
96609467b48Spatrick   if (auto *Block = dyn_cast<DILexicalBlockBase>(this))
96709467b48Spatrick     return Block->getScope()->getSubprogram();
96809467b48Spatrick   return const_cast<DISubprogram *>(cast<DISubprogram>(this));
96909467b48Spatrick }
97009467b48Spatrick 
getNonLexicalBlockFileScope() const97109467b48Spatrick DILocalScope *DILocalScope::getNonLexicalBlockFileScope() const {
97209467b48Spatrick   if (auto *File = dyn_cast<DILexicalBlockFile>(this))
97309467b48Spatrick     return File->getScope()->getNonLexicalBlockFileScope();
97409467b48Spatrick   return const_cast<DILocalScope *>(this);
97509467b48Spatrick }
97609467b48Spatrick 
cloneScopeForSubprogram(DILocalScope & RootScope,DISubprogram & NewSP,LLVMContext & Ctx,DenseMap<const MDNode *,MDNode * > & Cache)977*d415bd75Srobert DILocalScope *DILocalScope::cloneScopeForSubprogram(
978*d415bd75Srobert     DILocalScope &RootScope, DISubprogram &NewSP, LLVMContext &Ctx,
979*d415bd75Srobert     DenseMap<const MDNode *, MDNode *> &Cache) {
980*d415bd75Srobert   SmallVector<DIScope *> ScopeChain;
981*d415bd75Srobert   DIScope *CachedResult = nullptr;
982*d415bd75Srobert 
983*d415bd75Srobert   for (DIScope *Scope = &RootScope; !isa<DISubprogram>(Scope);
984*d415bd75Srobert        Scope = Scope->getScope()) {
985*d415bd75Srobert     if (auto It = Cache.find(Scope); It != Cache.end()) {
986*d415bd75Srobert       CachedResult = cast<DIScope>(It->second);
987*d415bd75Srobert       break;
988*d415bd75Srobert     }
989*d415bd75Srobert     ScopeChain.push_back(Scope);
990*d415bd75Srobert   }
991*d415bd75Srobert 
992*d415bd75Srobert   // Recreate the scope chain, bottom-up, starting at the new subprogram (or a
993*d415bd75Srobert   // cached result).
994*d415bd75Srobert   DIScope *UpdatedScope = CachedResult ? CachedResult : &NewSP;
995*d415bd75Srobert   for (DIScope *ScopeToUpdate : reverse(ScopeChain)) {
996*d415bd75Srobert     TempMDNode ClonedScope = ScopeToUpdate->clone();
997*d415bd75Srobert     cast<DILexicalBlockBase>(*ClonedScope).replaceScope(UpdatedScope);
998*d415bd75Srobert     UpdatedScope =
999*d415bd75Srobert         cast<DIScope>(MDNode::replaceWithUniqued(std::move(ClonedScope)));
1000*d415bd75Srobert     Cache[ScopeToUpdate] = UpdatedScope;
1001*d415bd75Srobert   }
1002*d415bd75Srobert 
1003*d415bd75Srobert   return cast<DILocalScope>(UpdatedScope);
1004*d415bd75Srobert }
1005*d415bd75Srobert 
getFlag(StringRef Flag)100609467b48Spatrick DISubprogram::DISPFlags DISubprogram::getFlag(StringRef Flag) {
100709467b48Spatrick   return StringSwitch<DISPFlags>(Flag)
100809467b48Spatrick #define HANDLE_DISP_FLAG(ID, NAME) .Case("DISPFlag" #NAME, SPFlag##NAME)
100909467b48Spatrick #include "llvm/IR/DebugInfoFlags.def"
101009467b48Spatrick       .Default(SPFlagZero);
101109467b48Spatrick }
101209467b48Spatrick 
getFlagString(DISPFlags Flag)101309467b48Spatrick StringRef DISubprogram::getFlagString(DISPFlags Flag) {
101409467b48Spatrick   switch (Flag) {
101509467b48Spatrick   // Appease a warning.
101609467b48Spatrick   case SPFlagVirtuality:
101709467b48Spatrick     return "";
101809467b48Spatrick #define HANDLE_DISP_FLAG(ID, NAME)                                             \
101909467b48Spatrick   case SPFlag##NAME:                                                           \
102009467b48Spatrick     return "DISPFlag" #NAME;
102109467b48Spatrick #include "llvm/IR/DebugInfoFlags.def"
102209467b48Spatrick   }
102309467b48Spatrick   return "";
102409467b48Spatrick }
102509467b48Spatrick 
102609467b48Spatrick DISubprogram::DISPFlags
splitFlags(DISPFlags Flags,SmallVectorImpl<DISPFlags> & SplitFlags)102709467b48Spatrick DISubprogram::splitFlags(DISPFlags Flags,
102809467b48Spatrick                          SmallVectorImpl<DISPFlags> &SplitFlags) {
102909467b48Spatrick   // Multi-bit fields can require special handling. In our case, however, the
103009467b48Spatrick   // only multi-bit field is virtuality, and all its values happen to be
103109467b48Spatrick   // single-bit values, so the right behavior just falls out.
103209467b48Spatrick #define HANDLE_DISP_FLAG(ID, NAME)                                             \
103309467b48Spatrick   if (DISPFlags Bit = Flags & SPFlag##NAME) {                                  \
103409467b48Spatrick     SplitFlags.push_back(Bit);                                                 \
103509467b48Spatrick     Flags &= ~Bit;                                                             \
103609467b48Spatrick   }
103709467b48Spatrick #include "llvm/IR/DebugInfoFlags.def"
103809467b48Spatrick   return Flags;
103909467b48Spatrick }
104009467b48Spatrick 
getImpl(LLVMContext & Context,Metadata * Scope,MDString * Name,MDString * LinkageName,Metadata * File,unsigned Line,Metadata * Type,unsigned ScopeLine,Metadata * ContainingType,unsigned VirtualIndex,int ThisAdjustment,DIFlags Flags,DISPFlags SPFlags,Metadata * Unit,Metadata * TemplateParams,Metadata * Declaration,Metadata * RetainedNodes,Metadata * ThrownTypes,Metadata * Annotations,MDString * TargetFuncName,StorageType Storage,bool ShouldCreate)104109467b48Spatrick DISubprogram *DISubprogram::getImpl(
104209467b48Spatrick     LLVMContext &Context, Metadata *Scope, MDString *Name,
104309467b48Spatrick     MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type,
104409467b48Spatrick     unsigned ScopeLine, Metadata *ContainingType, unsigned VirtualIndex,
104509467b48Spatrick     int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
104609467b48Spatrick     Metadata *TemplateParams, Metadata *Declaration, Metadata *RetainedNodes,
1047*d415bd75Srobert     Metadata *ThrownTypes, Metadata *Annotations, MDString *TargetFuncName,
1048*d415bd75Srobert     StorageType Storage, bool ShouldCreate) {
104909467b48Spatrick   assert(isCanonical(Name) && "Expected canonical MDString");
105009467b48Spatrick   assert(isCanonical(LinkageName) && "Expected canonical MDString");
1051*d415bd75Srobert   assert(isCanonical(TargetFuncName) && "Expected canonical MDString");
105209467b48Spatrick   DEFINE_GETIMPL_LOOKUP(DISubprogram,
105309467b48Spatrick                         (Scope, Name, LinkageName, File, Line, Type, ScopeLine,
105409467b48Spatrick                          ContainingType, VirtualIndex, ThisAdjustment, Flags,
105509467b48Spatrick                          SPFlags, Unit, TemplateParams, Declaration,
1056*d415bd75Srobert                          RetainedNodes, ThrownTypes, Annotations,
1057*d415bd75Srobert                          TargetFuncName));
1058*d415bd75Srobert   SmallVector<Metadata *, 13> Ops = {
1059*d415bd75Srobert       File,           Scope,          Name,        LinkageName,
1060*d415bd75Srobert       Type,           Unit,           Declaration, RetainedNodes,
1061*d415bd75Srobert       ContainingType, TemplateParams, ThrownTypes, Annotations,
1062*d415bd75Srobert       TargetFuncName};
1063*d415bd75Srobert   if (!TargetFuncName) {
1064*d415bd75Srobert     Ops.pop_back();
1065*d415bd75Srobert     if (!Annotations) {
1066*d415bd75Srobert       Ops.pop_back();
106709467b48Spatrick       if (!ThrownTypes) {
106809467b48Spatrick         Ops.pop_back();
106909467b48Spatrick         if (!TemplateParams) {
107009467b48Spatrick           Ops.pop_back();
107109467b48Spatrick           if (!ContainingType)
107209467b48Spatrick             Ops.pop_back();
107309467b48Spatrick         }
107409467b48Spatrick       }
1075*d415bd75Srobert     }
1076*d415bd75Srobert   }
107709467b48Spatrick   DEFINE_GETIMPL_STORE_N(
107809467b48Spatrick       DISubprogram,
107909467b48Spatrick       (Line, ScopeLine, VirtualIndex, ThisAdjustment, Flags, SPFlags), Ops,
108009467b48Spatrick       Ops.size());
108109467b48Spatrick }
108209467b48Spatrick 
describes(const Function * F) const108309467b48Spatrick bool DISubprogram::describes(const Function *F) const {
108409467b48Spatrick   assert(F && "Invalid function");
1085097a140dSpatrick   return F->getSubprogram() == this;
108609467b48Spatrick }
DILexicalBlockBase(LLVMContext & C,unsigned ID,StorageType Storage,ArrayRef<Metadata * > Ops)1087*d415bd75Srobert DILexicalBlockBase::DILexicalBlockBase(LLVMContext &C, unsigned ID,
1088*d415bd75Srobert                                        StorageType Storage,
1089*d415bd75Srobert                                        ArrayRef<Metadata *> Ops)
1090*d415bd75Srobert     : DILocalScope(C, ID, Storage, dwarf::DW_TAG_lexical_block, Ops) {}
109109467b48Spatrick 
getImpl(LLVMContext & Context,Metadata * Scope,Metadata * File,unsigned Line,unsigned Column,StorageType Storage,bool ShouldCreate)109209467b48Spatrick DILexicalBlock *DILexicalBlock::getImpl(LLVMContext &Context, Metadata *Scope,
109309467b48Spatrick                                         Metadata *File, unsigned Line,
109409467b48Spatrick                                         unsigned Column, StorageType Storage,
109509467b48Spatrick                                         bool ShouldCreate) {
109609467b48Spatrick   // Fixup column.
109709467b48Spatrick   adjustColumn(Column);
109809467b48Spatrick 
109909467b48Spatrick   assert(Scope && "Expected scope");
110009467b48Spatrick   DEFINE_GETIMPL_LOOKUP(DILexicalBlock, (Scope, File, Line, Column));
110109467b48Spatrick   Metadata *Ops[] = {File, Scope};
110209467b48Spatrick   DEFINE_GETIMPL_STORE(DILexicalBlock, (Line, Column), Ops);
110309467b48Spatrick }
110409467b48Spatrick 
getImpl(LLVMContext & Context,Metadata * Scope,Metadata * File,unsigned Discriminator,StorageType Storage,bool ShouldCreate)110509467b48Spatrick DILexicalBlockFile *DILexicalBlockFile::getImpl(LLVMContext &Context,
110609467b48Spatrick                                                 Metadata *Scope, Metadata *File,
110709467b48Spatrick                                                 unsigned Discriminator,
110809467b48Spatrick                                                 StorageType Storage,
110909467b48Spatrick                                                 bool ShouldCreate) {
111009467b48Spatrick   assert(Scope && "Expected scope");
111109467b48Spatrick   DEFINE_GETIMPL_LOOKUP(DILexicalBlockFile, (Scope, File, Discriminator));
111209467b48Spatrick   Metadata *Ops[] = {File, Scope};
111309467b48Spatrick   DEFINE_GETIMPL_STORE(DILexicalBlockFile, (Discriminator), Ops);
111409467b48Spatrick }
111509467b48Spatrick 
DINamespace(LLVMContext & Context,StorageType Storage,bool ExportSymbols,ArrayRef<Metadata * > Ops)1116*d415bd75Srobert DINamespace::DINamespace(LLVMContext &Context, StorageType Storage,
1117*d415bd75Srobert                          bool ExportSymbols, ArrayRef<Metadata *> Ops)
1118*d415bd75Srobert     : DIScope(Context, DINamespaceKind, Storage, dwarf::DW_TAG_namespace, Ops),
1119*d415bd75Srobert       ExportSymbols(ExportSymbols) {}
getImpl(LLVMContext & Context,Metadata * Scope,MDString * Name,bool ExportSymbols,StorageType Storage,bool ShouldCreate)112009467b48Spatrick DINamespace *DINamespace::getImpl(LLVMContext &Context, Metadata *Scope,
112109467b48Spatrick                                   MDString *Name, bool ExportSymbols,
112209467b48Spatrick                                   StorageType Storage, bool ShouldCreate) {
112309467b48Spatrick   assert(isCanonical(Name) && "Expected canonical MDString");
112409467b48Spatrick   DEFINE_GETIMPL_LOOKUP(DINamespace, (Scope, Name, ExportSymbols));
112509467b48Spatrick   // The nullptr is for DIScope's File operand. This should be refactored.
112609467b48Spatrick   Metadata *Ops[] = {nullptr, Scope, Name};
112709467b48Spatrick   DEFINE_GETIMPL_STORE(DINamespace, (ExportSymbols), Ops);
112809467b48Spatrick }
112909467b48Spatrick 
DICommonBlock(LLVMContext & Context,StorageType Storage,unsigned LineNo,ArrayRef<Metadata * > Ops)1130*d415bd75Srobert DICommonBlock::DICommonBlock(LLVMContext &Context, StorageType Storage,
1131*d415bd75Srobert                              unsigned LineNo, ArrayRef<Metadata *> Ops)
1132*d415bd75Srobert     : DIScope(Context, DICommonBlockKind, Storage, dwarf::DW_TAG_common_block,
1133*d415bd75Srobert               Ops),
1134*d415bd75Srobert       LineNo(LineNo) {}
getImpl(LLVMContext & Context,Metadata * Scope,Metadata * Decl,MDString * Name,Metadata * File,unsigned LineNo,StorageType Storage,bool ShouldCreate)113509467b48Spatrick DICommonBlock *DICommonBlock::getImpl(LLVMContext &Context, Metadata *Scope,
113609467b48Spatrick                                       Metadata *Decl, MDString *Name,
113709467b48Spatrick                                       Metadata *File, unsigned LineNo,
113809467b48Spatrick                                       StorageType Storage, bool ShouldCreate) {
113909467b48Spatrick   assert(isCanonical(Name) && "Expected canonical MDString");
114009467b48Spatrick   DEFINE_GETIMPL_LOOKUP(DICommonBlock, (Scope, Decl, Name, File, LineNo));
114109467b48Spatrick   // The nullptr is for DIScope's File operand. This should be refactored.
114209467b48Spatrick   Metadata *Ops[] = {Scope, Decl, Name, File};
114309467b48Spatrick   DEFINE_GETIMPL_STORE(DICommonBlock, (LineNo), Ops);
114409467b48Spatrick }
114509467b48Spatrick 
DIModule(LLVMContext & Context,StorageType Storage,unsigned LineNo,bool IsDecl,ArrayRef<Metadata * > Ops)1146*d415bd75Srobert DIModule::DIModule(LLVMContext &Context, StorageType Storage, unsigned LineNo,
1147*d415bd75Srobert                    bool IsDecl, ArrayRef<Metadata *> Ops)
1148*d415bd75Srobert     : DIScope(Context, DIModuleKind, Storage, dwarf::DW_TAG_module, Ops),
1149*d415bd75Srobert       LineNo(LineNo), IsDecl(IsDecl) {}
getImpl(LLVMContext & Context,Metadata * File,Metadata * Scope,MDString * Name,MDString * ConfigurationMacros,MDString * IncludePath,MDString * APINotesFile,unsigned LineNo,bool IsDecl,StorageType Storage,bool ShouldCreate)1150097a140dSpatrick DIModule *DIModule::getImpl(LLVMContext &Context, Metadata *File,
1151097a140dSpatrick                             Metadata *Scope, MDString *Name,
1152097a140dSpatrick                             MDString *ConfigurationMacros,
1153097a140dSpatrick                             MDString *IncludePath, MDString *APINotesFile,
115473471bf0Spatrick                             unsigned LineNo, bool IsDecl, StorageType Storage,
115509467b48Spatrick                             bool ShouldCreate) {
115609467b48Spatrick   assert(isCanonical(Name) && "Expected canonical MDString");
1157097a140dSpatrick   DEFINE_GETIMPL_LOOKUP(DIModule, (File, Scope, Name, ConfigurationMacros,
115873471bf0Spatrick                                    IncludePath, APINotesFile, LineNo, IsDecl));
1159097a140dSpatrick   Metadata *Ops[] = {File,        Scope,       Name, ConfigurationMacros,
1160097a140dSpatrick                      IncludePath, APINotesFile};
116173471bf0Spatrick   DEFINE_GETIMPL_STORE(DIModule, (LineNo, IsDecl), Ops);
1162097a140dSpatrick }
DITemplateTypeParameter(LLVMContext & Context,StorageType Storage,bool IsDefault,ArrayRef<Metadata * > Ops)1163*d415bd75Srobert DITemplateTypeParameter::DITemplateTypeParameter(LLVMContext &Context,
1164*d415bd75Srobert                                                  StorageType Storage,
1165*d415bd75Srobert                                                  bool IsDefault,
1166*d415bd75Srobert                                                  ArrayRef<Metadata *> Ops)
1167*d415bd75Srobert     : DITemplateParameter(Context, DITemplateTypeParameterKind, Storage,
1168*d415bd75Srobert                           dwarf::DW_TAG_template_type_parameter, IsDefault,
1169*d415bd75Srobert                           Ops) {}
1170097a140dSpatrick 
1171097a140dSpatrick DITemplateTypeParameter *
getImpl(LLVMContext & Context,MDString * Name,Metadata * Type,bool isDefault,StorageType Storage,bool ShouldCreate)1172097a140dSpatrick DITemplateTypeParameter::getImpl(LLVMContext &Context, MDString *Name,
1173097a140dSpatrick                                  Metadata *Type, bool isDefault,
1174097a140dSpatrick                                  StorageType Storage, bool ShouldCreate) {
1175097a140dSpatrick   assert(isCanonical(Name) && "Expected canonical MDString");
1176097a140dSpatrick   DEFINE_GETIMPL_LOOKUP(DITemplateTypeParameter, (Name, Type, isDefault));
117709467b48Spatrick   Metadata *Ops[] = {Name, Type};
1178097a140dSpatrick   DEFINE_GETIMPL_STORE(DITemplateTypeParameter, (isDefault), Ops);
117909467b48Spatrick }
118009467b48Spatrick 
getImpl(LLVMContext & Context,unsigned Tag,MDString * Name,Metadata * Type,bool isDefault,Metadata * Value,StorageType Storage,bool ShouldCreate)118109467b48Spatrick DITemplateValueParameter *DITemplateValueParameter::getImpl(
118209467b48Spatrick     LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *Type,
1183097a140dSpatrick     bool isDefault, Metadata *Value, StorageType Storage, bool ShouldCreate) {
118409467b48Spatrick   assert(isCanonical(Name) && "Expected canonical MDString");
1185097a140dSpatrick   DEFINE_GETIMPL_LOOKUP(DITemplateValueParameter,
1186097a140dSpatrick                         (Tag, Name, Type, isDefault, Value));
118709467b48Spatrick   Metadata *Ops[] = {Name, Type, Value};
1188097a140dSpatrick   DEFINE_GETIMPL_STORE(DITemplateValueParameter, (Tag, isDefault), Ops);
118909467b48Spatrick }
119009467b48Spatrick 
119109467b48Spatrick DIGlobalVariable *
getImpl(LLVMContext & Context,Metadata * Scope,MDString * Name,MDString * LinkageName,Metadata * File,unsigned Line,Metadata * Type,bool IsLocalToUnit,bool IsDefinition,Metadata * StaticDataMemberDeclaration,Metadata * TemplateParams,uint32_t AlignInBits,Metadata * Annotations,StorageType Storage,bool ShouldCreate)119209467b48Spatrick DIGlobalVariable::getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
119309467b48Spatrick                           MDString *LinkageName, Metadata *File, unsigned Line,
119409467b48Spatrick                           Metadata *Type, bool IsLocalToUnit, bool IsDefinition,
119509467b48Spatrick                           Metadata *StaticDataMemberDeclaration,
119609467b48Spatrick                           Metadata *TemplateParams, uint32_t AlignInBits,
1197*d415bd75Srobert                           Metadata *Annotations, StorageType Storage,
1198*d415bd75Srobert                           bool ShouldCreate) {
119909467b48Spatrick   assert(isCanonical(Name) && "Expected canonical MDString");
120009467b48Spatrick   assert(isCanonical(LinkageName) && "Expected canonical MDString");
1201*d415bd75Srobert   DEFINE_GETIMPL_LOOKUP(
1202*d415bd75Srobert       DIGlobalVariable,
1203*d415bd75Srobert       (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, IsDefinition,
1204*d415bd75Srobert        StaticDataMemberDeclaration, TemplateParams, AlignInBits, Annotations));
120509467b48Spatrick   Metadata *Ops[] = {Scope,
120609467b48Spatrick                      Name,
120709467b48Spatrick                      File,
120809467b48Spatrick                      Type,
120909467b48Spatrick                      Name,
121009467b48Spatrick                      LinkageName,
121109467b48Spatrick                      StaticDataMemberDeclaration,
1212*d415bd75Srobert                      TemplateParams,
1213*d415bd75Srobert                      Annotations};
121409467b48Spatrick   DEFINE_GETIMPL_STORE(DIGlobalVariable,
121509467b48Spatrick                        (Line, IsLocalToUnit, IsDefinition, AlignInBits), Ops);
121609467b48Spatrick }
121709467b48Spatrick 
1218*d415bd75Srobert DILocalVariable *
getImpl(LLVMContext & Context,Metadata * Scope,MDString * Name,Metadata * File,unsigned Line,Metadata * Type,unsigned Arg,DIFlags Flags,uint32_t AlignInBits,Metadata * Annotations,StorageType Storage,bool ShouldCreate)1219*d415bd75Srobert DILocalVariable::getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
1220*d415bd75Srobert                          Metadata *File, unsigned Line, Metadata *Type,
1221*d415bd75Srobert                          unsigned Arg, DIFlags Flags, uint32_t AlignInBits,
1222*d415bd75Srobert                          Metadata *Annotations, StorageType Storage,
122309467b48Spatrick                          bool ShouldCreate) {
122409467b48Spatrick   // 64K ought to be enough for any frontend.
122509467b48Spatrick   assert(Arg <= UINT16_MAX && "Expected argument number to fit in 16-bits");
122609467b48Spatrick 
122709467b48Spatrick   assert(Scope && "Expected scope");
122809467b48Spatrick   assert(isCanonical(Name) && "Expected canonical MDString");
1229*d415bd75Srobert   DEFINE_GETIMPL_LOOKUP(DILocalVariable, (Scope, Name, File, Line, Type, Arg,
1230*d415bd75Srobert                                           Flags, AlignInBits, Annotations));
1231*d415bd75Srobert   Metadata *Ops[] = {Scope, Name, File, Type, Annotations};
123209467b48Spatrick   DEFINE_GETIMPL_STORE(DILocalVariable, (Line, Arg, Flags, AlignInBits), Ops);
123309467b48Spatrick }
123409467b48Spatrick 
DIVariable(LLVMContext & C,unsigned ID,StorageType Storage,signed Line,ArrayRef<Metadata * > Ops,uint32_t AlignInBits)1235*d415bd75Srobert DIVariable::DIVariable(LLVMContext &C, unsigned ID, StorageType Storage,
1236*d415bd75Srobert                        signed Line, ArrayRef<Metadata *> Ops,
1237*d415bd75Srobert                        uint32_t AlignInBits)
1238*d415bd75Srobert     : DINode(C, ID, Storage, dwarf::DW_TAG_variable, Ops), Line(Line),
1239*d415bd75Srobert       AlignInBits(AlignInBits) {}
getSizeInBits() const1240*d415bd75Srobert std::optional<uint64_t> DIVariable::getSizeInBits() const {
124109467b48Spatrick   // This is used by the Verifier so be mindful of broken types.
124209467b48Spatrick   const Metadata *RawType = getRawType();
124309467b48Spatrick   while (RawType) {
124409467b48Spatrick     // Try to get the size directly.
124509467b48Spatrick     if (auto *T = dyn_cast<DIType>(RawType))
124609467b48Spatrick       if (uint64_t Size = T->getSizeInBits())
124709467b48Spatrick         return Size;
124809467b48Spatrick 
124909467b48Spatrick     if (auto *DT = dyn_cast<DIDerivedType>(RawType)) {
125009467b48Spatrick       // Look at the base type.
125109467b48Spatrick       RawType = DT->getRawBaseType();
125209467b48Spatrick       continue;
125309467b48Spatrick     }
125409467b48Spatrick 
125509467b48Spatrick     // Missing type or size.
125609467b48Spatrick     break;
125709467b48Spatrick   }
125809467b48Spatrick 
125909467b48Spatrick   // Fail gracefully.
1260*d415bd75Srobert   return std::nullopt;
126109467b48Spatrick }
126209467b48Spatrick 
DILabel(LLVMContext & C,StorageType Storage,unsigned Line,ArrayRef<Metadata * > Ops)1263*d415bd75Srobert DILabel::DILabel(LLVMContext &C, StorageType Storage, unsigned Line,
1264*d415bd75Srobert                  ArrayRef<Metadata *> Ops)
1265*d415bd75Srobert     : DINode(C, DILabelKind, Storage, dwarf::DW_TAG_label, Ops), Line(Line) {}
getImpl(LLVMContext & Context,Metadata * Scope,MDString * Name,Metadata * File,unsigned Line,StorageType Storage,bool ShouldCreate)1266*d415bd75Srobert DILabel *DILabel::getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
1267*d415bd75Srobert                           Metadata *File, unsigned Line, StorageType Storage,
126809467b48Spatrick                           bool ShouldCreate) {
126909467b48Spatrick   assert(Scope && "Expected scope");
127009467b48Spatrick   assert(isCanonical(Name) && "Expected canonical MDString");
1271*d415bd75Srobert   DEFINE_GETIMPL_LOOKUP(DILabel, (Scope, Name, File, Line));
127209467b48Spatrick   Metadata *Ops[] = {Scope, Name, File};
127309467b48Spatrick   DEFINE_GETIMPL_STORE(DILabel, (Line), Ops);
127409467b48Spatrick }
127509467b48Spatrick 
getImpl(LLVMContext & Context,ArrayRef<uint64_t> Elements,StorageType Storage,bool ShouldCreate)127609467b48Spatrick DIExpression *DIExpression::getImpl(LLVMContext &Context,
127709467b48Spatrick                                     ArrayRef<uint64_t> Elements,
127809467b48Spatrick                                     StorageType Storage, bool ShouldCreate) {
127909467b48Spatrick   DEFINE_GETIMPL_LOOKUP(DIExpression, (Elements));
128009467b48Spatrick   DEFINE_GETIMPL_STORE_NO_OPS(DIExpression, (Elements));
128109467b48Spatrick }
isEntryValue() const1282*d415bd75Srobert bool DIExpression::isEntryValue() const {
1283*d415bd75Srobert   return getNumElements() > 0 && getElement(0) == dwarf::DW_OP_LLVM_entry_value;
1284*d415bd75Srobert }
startsWithDeref() const1285*d415bd75Srobert bool DIExpression::startsWithDeref() const {
1286*d415bd75Srobert   return getNumElements() > 0 && getElement(0) == dwarf::DW_OP_deref;
1287*d415bd75Srobert }
1288*d415bd75Srobert 
getImpl(LLVMContext & Context,StorageType Storage,bool ShouldCreate)1289*d415bd75Srobert DIAssignID *DIAssignID::getImpl(LLVMContext &Context, StorageType Storage,
1290*d415bd75Srobert                                 bool ShouldCreate) {
1291*d415bd75Srobert   // Uniqued DIAssignID are not supported as the instance address *is* the ID.
1292*d415bd75Srobert   assert(Storage != StorageType::Uniqued && "uniqued DIAssignID unsupported");
1293*d415bd75Srobert   return storeImpl(new (0u, Storage) DIAssignID(Context, Storage), Storage);
1294*d415bd75Srobert }
129509467b48Spatrick 
getSize() const129609467b48Spatrick unsigned DIExpression::ExprOperand::getSize() const {
129709467b48Spatrick   uint64_t Op = getOp();
129809467b48Spatrick 
129909467b48Spatrick   if (Op >= dwarf::DW_OP_breg0 && Op <= dwarf::DW_OP_breg31)
130009467b48Spatrick     return 2;
130109467b48Spatrick 
130209467b48Spatrick   switch (Op) {
130309467b48Spatrick   case dwarf::DW_OP_LLVM_convert:
130409467b48Spatrick   case dwarf::DW_OP_LLVM_fragment:
130509467b48Spatrick   case dwarf::DW_OP_bregx:
130609467b48Spatrick     return 3;
130709467b48Spatrick   case dwarf::DW_OP_constu:
130809467b48Spatrick   case dwarf::DW_OP_consts:
130909467b48Spatrick   case dwarf::DW_OP_deref_size:
131009467b48Spatrick   case dwarf::DW_OP_plus_uconst:
131109467b48Spatrick   case dwarf::DW_OP_LLVM_tag_offset:
131209467b48Spatrick   case dwarf::DW_OP_LLVM_entry_value:
131373471bf0Spatrick   case dwarf::DW_OP_LLVM_arg:
131409467b48Spatrick   case dwarf::DW_OP_regx:
131509467b48Spatrick     return 2;
131609467b48Spatrick   default:
131709467b48Spatrick     return 1;
131809467b48Spatrick   }
131909467b48Spatrick }
132009467b48Spatrick 
isValid() const132109467b48Spatrick bool DIExpression::isValid() const {
132209467b48Spatrick   for (auto I = expr_op_begin(), E = expr_op_end(); I != E; ++I) {
132309467b48Spatrick     // Check that there's space for the operand.
132409467b48Spatrick     if (I->get() + I->getSize() > E->get())
132509467b48Spatrick       return false;
132609467b48Spatrick 
132709467b48Spatrick     uint64_t Op = I->getOp();
132809467b48Spatrick     if ((Op >= dwarf::DW_OP_reg0 && Op <= dwarf::DW_OP_reg31) ||
132909467b48Spatrick         (Op >= dwarf::DW_OP_breg0 && Op <= dwarf::DW_OP_breg31))
133009467b48Spatrick       return true;
133109467b48Spatrick 
133209467b48Spatrick     // Check that the operand is valid.
133309467b48Spatrick     switch (Op) {
133409467b48Spatrick     default:
133509467b48Spatrick       return false;
133609467b48Spatrick     case dwarf::DW_OP_LLVM_fragment:
133709467b48Spatrick       // A fragment operator must appear at the end.
133809467b48Spatrick       return I->get() + I->getSize() == E->get();
133909467b48Spatrick     case dwarf::DW_OP_stack_value: {
134009467b48Spatrick       // Must be the last one or followed by a DW_OP_LLVM_fragment.
134109467b48Spatrick       if (I->get() + I->getSize() == E->get())
134209467b48Spatrick         break;
134309467b48Spatrick       auto J = I;
134409467b48Spatrick       if ((++J)->getOp() != dwarf::DW_OP_LLVM_fragment)
134509467b48Spatrick         return false;
134609467b48Spatrick       break;
134709467b48Spatrick     }
134809467b48Spatrick     case dwarf::DW_OP_swap: {
134909467b48Spatrick       // Must be more than one implicit element on the stack.
135009467b48Spatrick 
135109467b48Spatrick       // FIXME: A better way to implement this would be to add a local variable
135209467b48Spatrick       // that keeps track of the stack depth and introduce something like a
135309467b48Spatrick       // DW_LLVM_OP_implicit_location as a placeholder for the location this
135409467b48Spatrick       // DIExpression is attached to, or else pass the number of implicit stack
135509467b48Spatrick       // elements into isValid.
135609467b48Spatrick       if (getNumElements() == 1)
135709467b48Spatrick         return false;
135809467b48Spatrick       break;
135909467b48Spatrick     }
136009467b48Spatrick     case dwarf::DW_OP_LLVM_entry_value: {
1361*d415bd75Srobert       // An entry value operator must appear at the beginning or immediately
1362*d415bd75Srobert       // following `DW_OP_LLVM_arg 0`, and the number of operations it cover can
1363*d415bd75Srobert       // currently only be 1, because we support only entry values of a simple
1364*d415bd75Srobert       // register location. One reason for this is that we currently can't
1365*d415bd75Srobert       // calculate the size of the resulting DWARF block for other expressions.
1366*d415bd75Srobert       auto FirstOp = expr_op_begin();
1367*d415bd75Srobert       if (FirstOp->getOp() == dwarf::DW_OP_LLVM_arg && FirstOp->getArg(0) == 0)
1368*d415bd75Srobert         ++FirstOp;
1369*d415bd75Srobert       return I->get() == FirstOp->get() && I->getArg(0) == 1;
137009467b48Spatrick     }
137173471bf0Spatrick     case dwarf::DW_OP_LLVM_implicit_pointer:
137209467b48Spatrick     case dwarf::DW_OP_LLVM_convert:
137373471bf0Spatrick     case dwarf::DW_OP_LLVM_arg:
137409467b48Spatrick     case dwarf::DW_OP_LLVM_tag_offset:
137509467b48Spatrick     case dwarf::DW_OP_constu:
137609467b48Spatrick     case dwarf::DW_OP_plus_uconst:
137709467b48Spatrick     case dwarf::DW_OP_plus:
137809467b48Spatrick     case dwarf::DW_OP_minus:
137909467b48Spatrick     case dwarf::DW_OP_mul:
138009467b48Spatrick     case dwarf::DW_OP_div:
138109467b48Spatrick     case dwarf::DW_OP_mod:
138209467b48Spatrick     case dwarf::DW_OP_or:
138309467b48Spatrick     case dwarf::DW_OP_and:
138409467b48Spatrick     case dwarf::DW_OP_xor:
138509467b48Spatrick     case dwarf::DW_OP_shl:
138609467b48Spatrick     case dwarf::DW_OP_shr:
138709467b48Spatrick     case dwarf::DW_OP_shra:
138809467b48Spatrick     case dwarf::DW_OP_deref:
138909467b48Spatrick     case dwarf::DW_OP_deref_size:
139009467b48Spatrick     case dwarf::DW_OP_xderef:
139109467b48Spatrick     case dwarf::DW_OP_lit0:
139209467b48Spatrick     case dwarf::DW_OP_not:
139309467b48Spatrick     case dwarf::DW_OP_dup:
139409467b48Spatrick     case dwarf::DW_OP_regx:
139509467b48Spatrick     case dwarf::DW_OP_bregx:
1396097a140dSpatrick     case dwarf::DW_OP_push_object_address:
139773471bf0Spatrick     case dwarf::DW_OP_over:
139873471bf0Spatrick     case dwarf::DW_OP_consts:
139909467b48Spatrick       break;
140009467b48Spatrick     }
140109467b48Spatrick   }
140209467b48Spatrick   return true;
140309467b48Spatrick }
140409467b48Spatrick 
isImplicit() const140509467b48Spatrick bool DIExpression::isImplicit() const {
140609467b48Spatrick   if (!isValid())
140709467b48Spatrick     return false;
140809467b48Spatrick 
140909467b48Spatrick   if (getNumElements() == 0)
141009467b48Spatrick     return false;
141109467b48Spatrick 
141209467b48Spatrick   for (const auto &It : expr_ops()) {
141309467b48Spatrick     switch (It.getOp()) {
141409467b48Spatrick     default:
141509467b48Spatrick       break;
141609467b48Spatrick     case dwarf::DW_OP_stack_value:
141709467b48Spatrick     case dwarf::DW_OP_LLVM_tag_offset:
141809467b48Spatrick       return true;
141909467b48Spatrick     }
142009467b48Spatrick   }
142109467b48Spatrick 
142209467b48Spatrick   return false;
142309467b48Spatrick }
142409467b48Spatrick 
isComplex() const142509467b48Spatrick bool DIExpression::isComplex() const {
142609467b48Spatrick   if (!isValid())
142709467b48Spatrick     return false;
142809467b48Spatrick 
142909467b48Spatrick   if (getNumElements() == 0)
143009467b48Spatrick     return false;
143109467b48Spatrick 
143209467b48Spatrick   // If there are any elements other than fragment or tag_offset, then some
143309467b48Spatrick   // kind of complex computation occurs.
143409467b48Spatrick   for (const auto &It : expr_ops()) {
143509467b48Spatrick     switch (It.getOp()) {
143609467b48Spatrick     case dwarf::DW_OP_LLVM_tag_offset:
143709467b48Spatrick     case dwarf::DW_OP_LLVM_fragment:
1438*d415bd75Srobert     case dwarf::DW_OP_LLVM_arg:
143909467b48Spatrick       continue;
1440*d415bd75Srobert     default:
1441*d415bd75Srobert       return true;
144209467b48Spatrick     }
144309467b48Spatrick   }
144409467b48Spatrick 
144509467b48Spatrick   return false;
144609467b48Spatrick }
144709467b48Spatrick 
isSingleLocationExpression() const1448*d415bd75Srobert bool DIExpression::isSingleLocationExpression() const {
1449*d415bd75Srobert   if (!isValid())
1450*d415bd75Srobert     return false;
1451*d415bd75Srobert 
1452*d415bd75Srobert   if (getNumElements() == 0)
1453*d415bd75Srobert     return true;
1454*d415bd75Srobert 
1455*d415bd75Srobert   auto ExprOpBegin = expr_ops().begin();
1456*d415bd75Srobert   auto ExprOpEnd = expr_ops().end();
1457*d415bd75Srobert   if (ExprOpBegin->getOp() == dwarf::DW_OP_LLVM_arg)
1458*d415bd75Srobert     ++ExprOpBegin;
1459*d415bd75Srobert 
1460*d415bd75Srobert   return !std::any_of(ExprOpBegin, ExprOpEnd, [](auto Op) {
1461*d415bd75Srobert     return Op.getOp() == dwarf::DW_OP_LLVM_arg;
1462*d415bd75Srobert   });
1463*d415bd75Srobert }
1464*d415bd75Srobert 
1465*d415bd75Srobert const DIExpression *
convertToUndefExpression(const DIExpression * Expr)1466*d415bd75Srobert DIExpression::convertToUndefExpression(const DIExpression *Expr) {
1467*d415bd75Srobert   SmallVector<uint64_t, 3> UndefOps;
1468*d415bd75Srobert   if (auto FragmentInfo = Expr->getFragmentInfo()) {
1469*d415bd75Srobert     UndefOps.append({dwarf::DW_OP_LLVM_fragment, FragmentInfo->OffsetInBits,
1470*d415bd75Srobert                      FragmentInfo->SizeInBits});
1471*d415bd75Srobert   }
1472*d415bd75Srobert   return DIExpression::get(Expr->getContext(), UndefOps);
1473*d415bd75Srobert }
1474*d415bd75Srobert 
1475*d415bd75Srobert const DIExpression *
convertToVariadicExpression(const DIExpression * Expr)1476*d415bd75Srobert DIExpression::convertToVariadicExpression(const DIExpression *Expr) {
1477*d415bd75Srobert   if (any_of(Expr->expr_ops(), [](auto ExprOp) {
1478*d415bd75Srobert         return ExprOp.getOp() == dwarf::DW_OP_LLVM_arg;
1479*d415bd75Srobert       }))
1480*d415bd75Srobert     return Expr;
1481*d415bd75Srobert   SmallVector<uint64_t> NewOps;
1482*d415bd75Srobert   NewOps.reserve(Expr->getNumElements() + 2);
1483*d415bd75Srobert   NewOps.append({dwarf::DW_OP_LLVM_arg, 0});
1484*d415bd75Srobert   NewOps.append(Expr->elements_begin(), Expr->elements_end());
1485*d415bd75Srobert   return DIExpression::get(Expr->getContext(), NewOps);
1486*d415bd75Srobert }
1487*d415bd75Srobert 
1488*d415bd75Srobert std::optional<const DIExpression *>
convertToNonVariadicExpression(const DIExpression * Expr)1489*d415bd75Srobert DIExpression::convertToNonVariadicExpression(const DIExpression *Expr) {
1490*d415bd75Srobert   // Check for `isValid` covered by `isSingleLocationExpression`.
1491*d415bd75Srobert   if (!Expr->isSingleLocationExpression())
1492*d415bd75Srobert     return std::nullopt;
1493*d415bd75Srobert 
1494*d415bd75Srobert   // An empty expression is already non-variadic.
1495*d415bd75Srobert   if (!Expr->getNumElements())
1496*d415bd75Srobert     return Expr;
1497*d415bd75Srobert 
1498*d415bd75Srobert   auto ElementsBegin = Expr->elements_begin();
1499*d415bd75Srobert   // If Expr does not have a leading DW_OP_LLVM_arg then we don't need to do
1500*d415bd75Srobert   // anything.
1501*d415bd75Srobert   if (*ElementsBegin != dwarf::DW_OP_LLVM_arg)
1502*d415bd75Srobert     return Expr;
1503*d415bd75Srobert 
1504*d415bd75Srobert   SmallVector<uint64_t> NonVariadicOps(
1505*d415bd75Srobert       make_range(ElementsBegin + 2, Expr->elements_end()));
1506*d415bd75Srobert   return DIExpression::get(Expr->getContext(), NonVariadicOps);
1507*d415bd75Srobert }
1508*d415bd75Srobert 
canonicalizeExpressionOps(SmallVectorImpl<uint64_t> & Ops,const DIExpression * Expr,bool IsIndirect)1509*d415bd75Srobert void DIExpression::canonicalizeExpressionOps(SmallVectorImpl<uint64_t> &Ops,
1510*d415bd75Srobert                                              const DIExpression *Expr,
1511*d415bd75Srobert                                              bool IsIndirect) {
1512*d415bd75Srobert   // If Expr is not already variadic, insert the implied `DW_OP_LLVM_arg 0`
1513*d415bd75Srobert   // to the existing expression ops.
1514*d415bd75Srobert   if (none_of(Expr->expr_ops(), [](auto ExprOp) {
1515*d415bd75Srobert         return ExprOp.getOp() == dwarf::DW_OP_LLVM_arg;
1516*d415bd75Srobert       }))
1517*d415bd75Srobert     Ops.append({dwarf::DW_OP_LLVM_arg, 0});
1518*d415bd75Srobert   // If Expr is not indirect, we only need to insert the expression elements and
1519*d415bd75Srobert   // we're done.
1520*d415bd75Srobert   if (!IsIndirect) {
1521*d415bd75Srobert     Ops.append(Expr->elements_begin(), Expr->elements_end());
1522*d415bd75Srobert     return;
1523*d415bd75Srobert   }
1524*d415bd75Srobert   // If Expr is indirect, insert the implied DW_OP_deref at the end of the
1525*d415bd75Srobert   // expression but before DW_OP_{stack_value, LLVM_fragment} if they are
1526*d415bd75Srobert   // present.
1527*d415bd75Srobert   for (auto Op : Expr->expr_ops()) {
1528*d415bd75Srobert     if (Op.getOp() == dwarf::DW_OP_stack_value ||
1529*d415bd75Srobert         Op.getOp() == dwarf::DW_OP_LLVM_fragment) {
1530*d415bd75Srobert       Ops.push_back(dwarf::DW_OP_deref);
1531*d415bd75Srobert       IsIndirect = false;
1532*d415bd75Srobert     }
1533*d415bd75Srobert     Op.appendToVector(Ops);
1534*d415bd75Srobert   }
1535*d415bd75Srobert   if (IsIndirect)
1536*d415bd75Srobert     Ops.push_back(dwarf::DW_OP_deref);
1537*d415bd75Srobert }
1538*d415bd75Srobert 
isEqualExpression(const DIExpression * FirstExpr,bool FirstIndirect,const DIExpression * SecondExpr,bool SecondIndirect)1539*d415bd75Srobert bool DIExpression::isEqualExpression(const DIExpression *FirstExpr,
1540*d415bd75Srobert                                      bool FirstIndirect,
1541*d415bd75Srobert                                      const DIExpression *SecondExpr,
1542*d415bd75Srobert                                      bool SecondIndirect) {
1543*d415bd75Srobert   SmallVector<uint64_t> FirstOps;
1544*d415bd75Srobert   DIExpression::canonicalizeExpressionOps(FirstOps, FirstExpr, FirstIndirect);
1545*d415bd75Srobert   SmallVector<uint64_t> SecondOps;
1546*d415bd75Srobert   DIExpression::canonicalizeExpressionOps(SecondOps, SecondExpr,
1547*d415bd75Srobert                                           SecondIndirect);
1548*d415bd75Srobert   return FirstOps == SecondOps;
1549*d415bd75Srobert }
1550*d415bd75Srobert 
1551*d415bd75Srobert std::optional<DIExpression::FragmentInfo>
getFragmentInfo(expr_op_iterator Start,expr_op_iterator End)155209467b48Spatrick DIExpression::getFragmentInfo(expr_op_iterator Start, expr_op_iterator End) {
155309467b48Spatrick   for (auto I = Start; I != End; ++I)
155409467b48Spatrick     if (I->getOp() == dwarf::DW_OP_LLVM_fragment) {
155509467b48Spatrick       DIExpression::FragmentInfo Info = {I->getArg(1), I->getArg(0)};
155609467b48Spatrick       return Info;
155709467b48Spatrick     }
1558*d415bd75Srobert   return std::nullopt;
155909467b48Spatrick }
156009467b48Spatrick 
appendOffset(SmallVectorImpl<uint64_t> & Ops,int64_t Offset)156109467b48Spatrick void DIExpression::appendOffset(SmallVectorImpl<uint64_t> &Ops,
156209467b48Spatrick                                 int64_t Offset) {
156309467b48Spatrick   if (Offset > 0) {
156409467b48Spatrick     Ops.push_back(dwarf::DW_OP_plus_uconst);
156509467b48Spatrick     Ops.push_back(Offset);
156609467b48Spatrick   } else if (Offset < 0) {
156709467b48Spatrick     Ops.push_back(dwarf::DW_OP_constu);
1568*d415bd75Srobert     // Avoid UB when encountering LLONG_MIN, because in 2's complement
1569*d415bd75Srobert     // abs(LLONG_MIN) is LLONG_MAX+1.
1570*d415bd75Srobert     uint64_t AbsMinusOne = -(Offset+1);
1571*d415bd75Srobert     Ops.push_back(AbsMinusOne + 1);
157209467b48Spatrick     Ops.push_back(dwarf::DW_OP_minus);
157309467b48Spatrick   }
157409467b48Spatrick }
157509467b48Spatrick 
extractIfOffset(int64_t & Offset) const157609467b48Spatrick bool DIExpression::extractIfOffset(int64_t &Offset) const {
157709467b48Spatrick   if (getNumElements() == 0) {
157809467b48Spatrick     Offset = 0;
157909467b48Spatrick     return true;
158009467b48Spatrick   }
158109467b48Spatrick 
158209467b48Spatrick   if (getNumElements() == 2 && Elements[0] == dwarf::DW_OP_plus_uconst) {
158309467b48Spatrick     Offset = Elements[1];
158409467b48Spatrick     return true;
158509467b48Spatrick   }
158609467b48Spatrick 
158709467b48Spatrick   if (getNumElements() == 3 && Elements[0] == dwarf::DW_OP_constu) {
158809467b48Spatrick     if (Elements[2] == dwarf::DW_OP_plus) {
158909467b48Spatrick       Offset = Elements[1];
159009467b48Spatrick       return true;
159109467b48Spatrick     }
159209467b48Spatrick     if (Elements[2] == dwarf::DW_OP_minus) {
159309467b48Spatrick       Offset = -Elements[1];
159409467b48Spatrick       return true;
159509467b48Spatrick     }
159609467b48Spatrick   }
159709467b48Spatrick 
159809467b48Spatrick   return false;
159909467b48Spatrick }
160009467b48Spatrick 
hasAllLocationOps(unsigned N) const160173471bf0Spatrick bool DIExpression::hasAllLocationOps(unsigned N) const {
160273471bf0Spatrick   SmallDenseSet<uint64_t, 4> SeenOps;
160373471bf0Spatrick   for (auto ExprOp : expr_ops())
160473471bf0Spatrick     if (ExprOp.getOp() == dwarf::DW_OP_LLVM_arg)
160573471bf0Spatrick       SeenOps.insert(ExprOp.getArg(0));
160673471bf0Spatrick   for (uint64_t Idx = 0; Idx < N; ++Idx)
160773471bf0Spatrick     if (!is_contained(SeenOps, Idx))
160873471bf0Spatrick       return false;
160973471bf0Spatrick   return true;
161073471bf0Spatrick }
161173471bf0Spatrick 
extractAddressClass(const DIExpression * Expr,unsigned & AddrClass)161209467b48Spatrick const DIExpression *DIExpression::extractAddressClass(const DIExpression *Expr,
161309467b48Spatrick                                                       unsigned &AddrClass) {
161409467b48Spatrick   // FIXME: This seems fragile. Nothing that verifies that these elements
161509467b48Spatrick   // actually map to ops and not operands.
161609467b48Spatrick   const unsigned PatternSize = 4;
161709467b48Spatrick   if (Expr->Elements.size() >= PatternSize &&
161809467b48Spatrick       Expr->Elements[PatternSize - 4] == dwarf::DW_OP_constu &&
161909467b48Spatrick       Expr->Elements[PatternSize - 2] == dwarf::DW_OP_swap &&
162009467b48Spatrick       Expr->Elements[PatternSize - 1] == dwarf::DW_OP_xderef) {
162109467b48Spatrick     AddrClass = Expr->Elements[PatternSize - 3];
162209467b48Spatrick 
162309467b48Spatrick     if (Expr->Elements.size() == PatternSize)
162409467b48Spatrick       return nullptr;
162509467b48Spatrick     return DIExpression::get(Expr->getContext(),
1626*d415bd75Srobert                              ArrayRef(&*Expr->Elements.begin(),
162709467b48Spatrick                                       Expr->Elements.size() - PatternSize));
162809467b48Spatrick   }
162909467b48Spatrick   return Expr;
163009467b48Spatrick }
163109467b48Spatrick 
prepend(const DIExpression * Expr,uint8_t Flags,int64_t Offset)163209467b48Spatrick DIExpression *DIExpression::prepend(const DIExpression *Expr, uint8_t Flags,
163309467b48Spatrick                                     int64_t Offset) {
163409467b48Spatrick   SmallVector<uint64_t, 8> Ops;
163509467b48Spatrick   if (Flags & DIExpression::DerefBefore)
163609467b48Spatrick     Ops.push_back(dwarf::DW_OP_deref);
163709467b48Spatrick 
163809467b48Spatrick   appendOffset(Ops, Offset);
163909467b48Spatrick   if (Flags & DIExpression::DerefAfter)
164009467b48Spatrick     Ops.push_back(dwarf::DW_OP_deref);
164109467b48Spatrick 
164209467b48Spatrick   bool StackValue = Flags & DIExpression::StackValue;
164309467b48Spatrick   bool EntryValue = Flags & DIExpression::EntryValue;
164409467b48Spatrick 
164509467b48Spatrick   return prependOpcodes(Expr, Ops, StackValue, EntryValue);
164609467b48Spatrick }
164709467b48Spatrick 
appendOpsToArg(const DIExpression * Expr,ArrayRef<uint64_t> Ops,unsigned ArgNo,bool StackValue)164873471bf0Spatrick DIExpression *DIExpression::appendOpsToArg(const DIExpression *Expr,
164973471bf0Spatrick                                            ArrayRef<uint64_t> Ops,
165073471bf0Spatrick                                            unsigned ArgNo, bool StackValue) {
165173471bf0Spatrick   assert(Expr && "Can't add ops to this expression");
165273471bf0Spatrick 
165373471bf0Spatrick   // Handle non-variadic intrinsics by prepending the opcodes.
165473471bf0Spatrick   if (!any_of(Expr->expr_ops(),
165573471bf0Spatrick               [](auto Op) { return Op.getOp() == dwarf::DW_OP_LLVM_arg; })) {
165673471bf0Spatrick     assert(ArgNo == 0 &&
165773471bf0Spatrick            "Location Index must be 0 for a non-variadic expression.");
165873471bf0Spatrick     SmallVector<uint64_t, 8> NewOps(Ops.begin(), Ops.end());
165973471bf0Spatrick     return DIExpression::prependOpcodes(Expr, NewOps, StackValue);
166073471bf0Spatrick   }
166173471bf0Spatrick 
166273471bf0Spatrick   SmallVector<uint64_t, 8> NewOps;
166373471bf0Spatrick   for (auto Op : Expr->expr_ops()) {
1664*d415bd75Srobert     // A DW_OP_stack_value comes at the end, but before a DW_OP_LLVM_fragment.
1665*d415bd75Srobert     if (StackValue) {
1666*d415bd75Srobert       if (Op.getOp() == dwarf::DW_OP_stack_value)
1667*d415bd75Srobert         StackValue = false;
1668*d415bd75Srobert       else if (Op.getOp() == dwarf::DW_OP_LLVM_fragment) {
1669*d415bd75Srobert         NewOps.push_back(dwarf::DW_OP_stack_value);
1670*d415bd75Srobert         StackValue = false;
1671*d415bd75Srobert       }
1672*d415bd75Srobert     }
167373471bf0Spatrick     Op.appendToVector(NewOps);
167473471bf0Spatrick     if (Op.getOp() == dwarf::DW_OP_LLVM_arg && Op.getArg(0) == ArgNo)
167573471bf0Spatrick       NewOps.insert(NewOps.end(), Ops.begin(), Ops.end());
167673471bf0Spatrick   }
1677*d415bd75Srobert   if (StackValue)
1678*d415bd75Srobert     NewOps.push_back(dwarf::DW_OP_stack_value);
167973471bf0Spatrick 
168073471bf0Spatrick   return DIExpression::get(Expr->getContext(), NewOps);
168173471bf0Spatrick }
168273471bf0Spatrick 
replaceArg(const DIExpression * Expr,uint64_t OldArg,uint64_t NewArg)168373471bf0Spatrick DIExpression *DIExpression::replaceArg(const DIExpression *Expr,
168473471bf0Spatrick                                        uint64_t OldArg, uint64_t NewArg) {
168573471bf0Spatrick   assert(Expr && "Can't replace args in this expression");
168673471bf0Spatrick 
168773471bf0Spatrick   SmallVector<uint64_t, 8> NewOps;
168873471bf0Spatrick 
168973471bf0Spatrick   for (auto Op : Expr->expr_ops()) {
169073471bf0Spatrick     if (Op.getOp() != dwarf::DW_OP_LLVM_arg || Op.getArg(0) < OldArg) {
169173471bf0Spatrick       Op.appendToVector(NewOps);
169273471bf0Spatrick       continue;
169373471bf0Spatrick     }
169473471bf0Spatrick     NewOps.push_back(dwarf::DW_OP_LLVM_arg);
169573471bf0Spatrick     uint64_t Arg = Op.getArg(0) == OldArg ? NewArg : Op.getArg(0);
169673471bf0Spatrick     // OldArg has been deleted from the Op list, so decrement all indices
169773471bf0Spatrick     // greater than it.
169873471bf0Spatrick     if (Arg > OldArg)
169973471bf0Spatrick       --Arg;
170073471bf0Spatrick     NewOps.push_back(Arg);
170173471bf0Spatrick   }
170273471bf0Spatrick   return DIExpression::get(Expr->getContext(), NewOps);
170373471bf0Spatrick }
170473471bf0Spatrick 
prependOpcodes(const DIExpression * Expr,SmallVectorImpl<uint64_t> & Ops,bool StackValue,bool EntryValue)170509467b48Spatrick DIExpression *DIExpression::prependOpcodes(const DIExpression *Expr,
170609467b48Spatrick                                            SmallVectorImpl<uint64_t> &Ops,
1707*d415bd75Srobert                                            bool StackValue, bool EntryValue) {
170809467b48Spatrick   assert(Expr && "Can't prepend ops to this expression");
170909467b48Spatrick 
171009467b48Spatrick   if (EntryValue) {
171109467b48Spatrick     Ops.push_back(dwarf::DW_OP_LLVM_entry_value);
171273471bf0Spatrick     // Use a block size of 1 for the target register operand.  The
171373471bf0Spatrick     // DWARF backend currently cannot emit entry values with a block
171473471bf0Spatrick     // size > 1.
171573471bf0Spatrick     Ops.push_back(1);
171609467b48Spatrick   }
171709467b48Spatrick 
171809467b48Spatrick   // If there are no ops to prepend, do not even add the DW_OP_stack_value.
171909467b48Spatrick   if (Ops.empty())
172009467b48Spatrick     StackValue = false;
172109467b48Spatrick   for (auto Op : Expr->expr_ops()) {
172209467b48Spatrick     // A DW_OP_stack_value comes at the end, but before a DW_OP_LLVM_fragment.
172309467b48Spatrick     if (StackValue) {
172409467b48Spatrick       if (Op.getOp() == dwarf::DW_OP_stack_value)
172509467b48Spatrick         StackValue = false;
172609467b48Spatrick       else if (Op.getOp() == dwarf::DW_OP_LLVM_fragment) {
172709467b48Spatrick         Ops.push_back(dwarf::DW_OP_stack_value);
172809467b48Spatrick         StackValue = false;
172909467b48Spatrick       }
173009467b48Spatrick     }
173109467b48Spatrick     Op.appendToVector(Ops);
173209467b48Spatrick   }
173309467b48Spatrick   if (StackValue)
173409467b48Spatrick     Ops.push_back(dwarf::DW_OP_stack_value);
173509467b48Spatrick   return DIExpression::get(Expr->getContext(), Ops);
173609467b48Spatrick }
173709467b48Spatrick 
append(const DIExpression * Expr,ArrayRef<uint64_t> Ops)173809467b48Spatrick DIExpression *DIExpression::append(const DIExpression *Expr,
173909467b48Spatrick                                    ArrayRef<uint64_t> Ops) {
174009467b48Spatrick   assert(Expr && !Ops.empty() && "Can't append ops to this expression");
174109467b48Spatrick 
174209467b48Spatrick   // Copy Expr's current op list.
174309467b48Spatrick   SmallVector<uint64_t, 16> NewOps;
174409467b48Spatrick   for (auto Op : Expr->expr_ops()) {
174509467b48Spatrick     // Append new opcodes before DW_OP_{stack_value, LLVM_fragment}.
174609467b48Spatrick     if (Op.getOp() == dwarf::DW_OP_stack_value ||
174709467b48Spatrick         Op.getOp() == dwarf::DW_OP_LLVM_fragment) {
174809467b48Spatrick       NewOps.append(Ops.begin(), Ops.end());
174909467b48Spatrick 
175009467b48Spatrick       // Ensure that the new opcodes are only appended once.
1751*d415bd75Srobert       Ops = std::nullopt;
175209467b48Spatrick     }
175309467b48Spatrick     Op.appendToVector(NewOps);
175409467b48Spatrick   }
175509467b48Spatrick 
175609467b48Spatrick   NewOps.append(Ops.begin(), Ops.end());
1757097a140dSpatrick   auto *result = DIExpression::get(Expr->getContext(), NewOps);
1758097a140dSpatrick   assert(result->isValid() && "concatenated expression is not valid");
1759097a140dSpatrick   return result;
176009467b48Spatrick }
176109467b48Spatrick 
appendToStack(const DIExpression * Expr,ArrayRef<uint64_t> Ops)176209467b48Spatrick DIExpression *DIExpression::appendToStack(const DIExpression *Expr,
176309467b48Spatrick                                           ArrayRef<uint64_t> Ops) {
176409467b48Spatrick   assert(Expr && !Ops.empty() && "Can't append ops to this expression");
176509467b48Spatrick   assert(none_of(Ops,
176609467b48Spatrick                  [](uint64_t Op) {
176709467b48Spatrick                    return Op == dwarf::DW_OP_stack_value ||
176809467b48Spatrick                           Op == dwarf::DW_OP_LLVM_fragment;
176909467b48Spatrick                  }) &&
177009467b48Spatrick          "Can't append this op");
177109467b48Spatrick 
177209467b48Spatrick   // Append a DW_OP_deref after Expr's current op list if it's non-empty and
177309467b48Spatrick   // has no DW_OP_stack_value.
177409467b48Spatrick   //
177509467b48Spatrick   // Match .* DW_OP_stack_value (DW_OP_LLVM_fragment A B)?.
1776*d415bd75Srobert   std::optional<FragmentInfo> FI = Expr->getFragmentInfo();
1777*d415bd75Srobert   unsigned DropUntilStackValue = FI ? 3 : 0;
177809467b48Spatrick   ArrayRef<uint64_t> ExprOpsBeforeFragment =
177909467b48Spatrick       Expr->getElements().drop_back(DropUntilStackValue);
178009467b48Spatrick   bool NeedsDeref = (Expr->getNumElements() > DropUntilStackValue) &&
178109467b48Spatrick                     (ExprOpsBeforeFragment.back() != dwarf::DW_OP_stack_value);
178209467b48Spatrick   bool NeedsStackValue = NeedsDeref || ExprOpsBeforeFragment.empty();
178309467b48Spatrick 
178409467b48Spatrick   // Append a DW_OP_deref after Expr's current op list if needed, then append
178509467b48Spatrick   // the new ops, and finally ensure that a single DW_OP_stack_value is present.
178609467b48Spatrick   SmallVector<uint64_t, 16> NewOps;
178709467b48Spatrick   if (NeedsDeref)
178809467b48Spatrick     NewOps.push_back(dwarf::DW_OP_deref);
178909467b48Spatrick   NewOps.append(Ops.begin(), Ops.end());
179009467b48Spatrick   if (NeedsStackValue)
179109467b48Spatrick     NewOps.push_back(dwarf::DW_OP_stack_value);
179209467b48Spatrick   return DIExpression::append(Expr, NewOps);
179309467b48Spatrick }
179409467b48Spatrick 
createFragmentExpression(const DIExpression * Expr,unsigned OffsetInBits,unsigned SizeInBits)1795*d415bd75Srobert std::optional<DIExpression *> DIExpression::createFragmentExpression(
179609467b48Spatrick     const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits) {
179709467b48Spatrick   SmallVector<uint64_t, 8> Ops;
1798*d415bd75Srobert   // Track whether it's safe to split the value at the top of the DWARF stack,
1799*d415bd75Srobert   // assuming that it'll be used as an implicit location value.
1800*d415bd75Srobert   bool CanSplitValue = true;
180109467b48Spatrick   // Copy over the expression, but leave off any trailing DW_OP_LLVM_fragment.
180209467b48Spatrick   if (Expr) {
180309467b48Spatrick     for (auto Op : Expr->expr_ops()) {
180409467b48Spatrick       switch (Op.getOp()) {
1805*d415bd75Srobert       default:
1806*d415bd75Srobert         break;
180709467b48Spatrick       case dwarf::DW_OP_shr:
180809467b48Spatrick       case dwarf::DW_OP_shra:
180909467b48Spatrick       case dwarf::DW_OP_shl:
181009467b48Spatrick       case dwarf::DW_OP_plus:
181109467b48Spatrick       case dwarf::DW_OP_plus_uconst:
181209467b48Spatrick       case dwarf::DW_OP_minus:
181309467b48Spatrick         // We can't safely split arithmetic or shift operations into multiple
181409467b48Spatrick         // fragments because we can't express carry-over between fragments.
181509467b48Spatrick         //
181609467b48Spatrick         // FIXME: We *could* preserve the lowest fragment of a constant offset
181709467b48Spatrick         // operation if the offset fits into SizeInBits.
1818*d415bd75Srobert         CanSplitValue = false;
1819*d415bd75Srobert         break;
1820*d415bd75Srobert       case dwarf::DW_OP_deref:
1821*d415bd75Srobert       case dwarf::DW_OP_deref_size:
1822*d415bd75Srobert       case dwarf::DW_OP_deref_type:
1823*d415bd75Srobert       case dwarf::DW_OP_xderef:
1824*d415bd75Srobert       case dwarf::DW_OP_xderef_size:
1825*d415bd75Srobert       case dwarf::DW_OP_xderef_type:
1826*d415bd75Srobert         // Preceeding arithmetic operations have been applied to compute an
1827*d415bd75Srobert         // address. It's okay to split the value loaded from that address.
1828*d415bd75Srobert         CanSplitValue = true;
1829*d415bd75Srobert         break;
1830*d415bd75Srobert       case dwarf::DW_OP_stack_value:
1831*d415bd75Srobert         // Bail if this expression computes a value that cannot be split.
1832*d415bd75Srobert         if (!CanSplitValue)
1833*d415bd75Srobert           return std::nullopt;
1834*d415bd75Srobert         break;
183509467b48Spatrick       case dwarf::DW_OP_LLVM_fragment: {
183609467b48Spatrick         // Make the new offset point into the existing fragment.
183709467b48Spatrick         uint64_t FragmentOffsetInBits = Op.getArg(0);
183809467b48Spatrick         uint64_t FragmentSizeInBits = Op.getArg(1);
183909467b48Spatrick         (void)FragmentSizeInBits;
184009467b48Spatrick         assert((OffsetInBits + SizeInBits <= FragmentSizeInBits) &&
184109467b48Spatrick                "new fragment outside of original fragment");
184209467b48Spatrick         OffsetInBits += FragmentOffsetInBits;
184309467b48Spatrick         continue;
184409467b48Spatrick       }
184509467b48Spatrick       }
184609467b48Spatrick       Op.appendToVector(Ops);
184709467b48Spatrick     }
184809467b48Spatrick   }
1849*d415bd75Srobert   assert((!Expr->isImplicit() || CanSplitValue) && "Expr can't be split");
185009467b48Spatrick   assert(Expr && "Unknown DIExpression");
185109467b48Spatrick   Ops.push_back(dwarf::DW_OP_LLVM_fragment);
185209467b48Spatrick   Ops.push_back(OffsetInBits);
185309467b48Spatrick   Ops.push_back(SizeInBits);
185409467b48Spatrick   return DIExpression::get(Expr->getContext(), Ops);
185509467b48Spatrick }
185609467b48Spatrick 
1857*d415bd75Srobert std::pair<DIExpression *, const ConstantInt *>
constantFold(const ConstantInt * CI)1858*d415bd75Srobert DIExpression::constantFold(const ConstantInt *CI) {
1859*d415bd75Srobert   // Copy the APInt so we can modify it.
1860*d415bd75Srobert   APInt NewInt = CI->getValue();
1861*d415bd75Srobert   SmallVector<uint64_t, 8> Ops;
1862*d415bd75Srobert 
1863*d415bd75Srobert   // Fold operators only at the beginning of the expression.
1864*d415bd75Srobert   bool First = true;
1865*d415bd75Srobert   bool Changed = false;
1866*d415bd75Srobert   for (auto Op : expr_ops()) {
1867*d415bd75Srobert     switch (Op.getOp()) {
1868*d415bd75Srobert     default:
1869*d415bd75Srobert       // We fold only the leading part of the expression; if we get to a part
1870*d415bd75Srobert       // that we're going to copy unchanged, and haven't done any folding,
1871*d415bd75Srobert       // then the entire expression is unchanged and we can return early.
1872*d415bd75Srobert       if (!Changed)
1873*d415bd75Srobert         return {this, CI};
1874*d415bd75Srobert       First = false;
1875*d415bd75Srobert       break;
1876*d415bd75Srobert     case dwarf::DW_OP_LLVM_convert:
1877*d415bd75Srobert       if (!First)
1878*d415bd75Srobert         break;
1879*d415bd75Srobert       Changed = true;
1880*d415bd75Srobert       if (Op.getArg(1) == dwarf::DW_ATE_signed)
1881*d415bd75Srobert         NewInt = NewInt.sextOrTrunc(Op.getArg(0));
1882*d415bd75Srobert       else {
1883*d415bd75Srobert         assert(Op.getArg(1) == dwarf::DW_ATE_unsigned && "Unexpected operand");
1884*d415bd75Srobert         NewInt = NewInt.zextOrTrunc(Op.getArg(0));
1885*d415bd75Srobert       }
1886*d415bd75Srobert       continue;
1887*d415bd75Srobert     }
1888*d415bd75Srobert     Op.appendToVector(Ops);
1889*d415bd75Srobert   }
1890*d415bd75Srobert   if (!Changed)
1891*d415bd75Srobert     return {this, CI};
1892*d415bd75Srobert   return {DIExpression::get(getContext(), Ops),
1893*d415bd75Srobert           ConstantInt::get(getContext(), NewInt)};
1894*d415bd75Srobert }
1895*d415bd75Srobert 
getNumLocationOperands() const189673471bf0Spatrick uint64_t DIExpression::getNumLocationOperands() const {
189773471bf0Spatrick   uint64_t Result = 0;
189873471bf0Spatrick   for (auto ExprOp : expr_ops())
189973471bf0Spatrick     if (ExprOp.getOp() == dwarf::DW_OP_LLVM_arg)
190073471bf0Spatrick       Result = std::max(Result, ExprOp.getArg(0) + 1);
190173471bf0Spatrick   assert(hasAllLocationOps(Result) &&
190273471bf0Spatrick          "Expression is missing one or more location operands.");
190373471bf0Spatrick   return Result;
190473471bf0Spatrick }
190573471bf0Spatrick 
1906*d415bd75Srobert std::optional<DIExpression::SignedOrUnsignedConstant>
isConstant() const190773471bf0Spatrick DIExpression::isConstant() const {
190873471bf0Spatrick 
190973471bf0Spatrick   // Recognize signed and unsigned constants.
191073471bf0Spatrick   // An signed constants can be represented as DW_OP_consts C DW_OP_stack_value
191173471bf0Spatrick   // (DW_OP_LLVM_fragment of Len).
191273471bf0Spatrick   // An unsigned constant can be represented as
191373471bf0Spatrick   // DW_OP_constu C DW_OP_stack_value (DW_OP_LLVM_fragment of Len).
191473471bf0Spatrick 
191573471bf0Spatrick   if ((getNumElements() != 2 && getNumElements() != 3 &&
191673471bf0Spatrick        getNumElements() != 6) ||
191773471bf0Spatrick       (getElement(0) != dwarf::DW_OP_consts &&
191873471bf0Spatrick        getElement(0) != dwarf::DW_OP_constu))
1919*d415bd75Srobert     return std::nullopt;
192073471bf0Spatrick 
192173471bf0Spatrick   if (getNumElements() == 2 && getElement(0) == dwarf::DW_OP_consts)
192273471bf0Spatrick     return SignedOrUnsignedConstant::SignedConstant;
192373471bf0Spatrick 
192473471bf0Spatrick   if ((getNumElements() == 3 && getElement(2) != dwarf::DW_OP_stack_value) ||
192573471bf0Spatrick       (getNumElements() == 6 && (getElement(2) != dwarf::DW_OP_stack_value ||
192673471bf0Spatrick                                  getElement(3) != dwarf::DW_OP_LLVM_fragment)))
1927*d415bd75Srobert     return std::nullopt;
192873471bf0Spatrick   return getElement(0) == dwarf::DW_OP_constu
192973471bf0Spatrick              ? SignedOrUnsignedConstant::UnsignedConstant
193073471bf0Spatrick              : SignedOrUnsignedConstant::SignedConstant;
193109467b48Spatrick }
193209467b48Spatrick 
getExtOps(unsigned FromSize,unsigned ToSize,bool Signed)193309467b48Spatrick DIExpression::ExtOps DIExpression::getExtOps(unsigned FromSize, unsigned ToSize,
193409467b48Spatrick                                              bool Signed) {
193509467b48Spatrick   dwarf::TypeKind TK = Signed ? dwarf::DW_ATE_signed : dwarf::DW_ATE_unsigned;
193609467b48Spatrick   DIExpression::ExtOps Ops{{dwarf::DW_OP_LLVM_convert, FromSize, TK,
193709467b48Spatrick                             dwarf::DW_OP_LLVM_convert, ToSize, TK}};
193809467b48Spatrick   return Ops;
193909467b48Spatrick }
194009467b48Spatrick 
appendExt(const DIExpression * Expr,unsigned FromSize,unsigned ToSize,bool Signed)194109467b48Spatrick DIExpression *DIExpression::appendExt(const DIExpression *Expr,
194209467b48Spatrick                                       unsigned FromSize, unsigned ToSize,
194309467b48Spatrick                                       bool Signed) {
194409467b48Spatrick   return appendToStack(Expr, getExtOps(FromSize, ToSize, Signed));
194509467b48Spatrick }
194609467b48Spatrick 
194709467b48Spatrick DIGlobalVariableExpression *
getImpl(LLVMContext & Context,Metadata * Variable,Metadata * Expression,StorageType Storage,bool ShouldCreate)194809467b48Spatrick DIGlobalVariableExpression::getImpl(LLVMContext &Context, Metadata *Variable,
194909467b48Spatrick                                     Metadata *Expression, StorageType Storage,
195009467b48Spatrick                                     bool ShouldCreate) {
195109467b48Spatrick   DEFINE_GETIMPL_LOOKUP(DIGlobalVariableExpression, (Variable, Expression));
195209467b48Spatrick   Metadata *Ops[] = {Variable, Expression};
195309467b48Spatrick   DEFINE_GETIMPL_STORE_NO_CONSTRUCTOR_ARGS(DIGlobalVariableExpression, Ops);
195409467b48Spatrick }
DIObjCProperty(LLVMContext & C,StorageType Storage,unsigned Line,unsigned Attributes,ArrayRef<Metadata * > Ops)1955*d415bd75Srobert DIObjCProperty::DIObjCProperty(LLVMContext &C, StorageType Storage,
1956*d415bd75Srobert                                unsigned Line, unsigned Attributes,
1957*d415bd75Srobert                                ArrayRef<Metadata *> Ops)
1958*d415bd75Srobert     : DINode(C, DIObjCPropertyKind, Storage, dwarf::DW_TAG_APPLE_property, Ops),
1959*d415bd75Srobert       Line(Line), Attributes(Attributes) {}
196009467b48Spatrick 
getImpl(LLVMContext & Context,MDString * Name,Metadata * File,unsigned Line,MDString * GetterName,MDString * SetterName,unsigned Attributes,Metadata * Type,StorageType Storage,bool ShouldCreate)196109467b48Spatrick DIObjCProperty *DIObjCProperty::getImpl(
196209467b48Spatrick     LLVMContext &Context, MDString *Name, Metadata *File, unsigned Line,
196309467b48Spatrick     MDString *GetterName, MDString *SetterName, unsigned Attributes,
196409467b48Spatrick     Metadata *Type, StorageType Storage, bool ShouldCreate) {
196509467b48Spatrick   assert(isCanonical(Name) && "Expected canonical MDString");
196609467b48Spatrick   assert(isCanonical(GetterName) && "Expected canonical MDString");
196709467b48Spatrick   assert(isCanonical(SetterName) && "Expected canonical MDString");
196809467b48Spatrick   DEFINE_GETIMPL_LOOKUP(DIObjCProperty, (Name, File, Line, GetterName,
196909467b48Spatrick                                          SetterName, Attributes, Type));
197009467b48Spatrick   Metadata *Ops[] = {Name, File, GetterName, SetterName, Type};
197109467b48Spatrick   DEFINE_GETIMPL_STORE(DIObjCProperty, (Line, Attributes), Ops);
197209467b48Spatrick }
197309467b48Spatrick 
getImpl(LLVMContext & Context,unsigned Tag,Metadata * Scope,Metadata * Entity,Metadata * File,unsigned Line,MDString * Name,Metadata * Elements,StorageType Storage,bool ShouldCreate)197409467b48Spatrick DIImportedEntity *DIImportedEntity::getImpl(LLVMContext &Context, unsigned Tag,
197509467b48Spatrick                                             Metadata *Scope, Metadata *Entity,
197609467b48Spatrick                                             Metadata *File, unsigned Line,
1977*d415bd75Srobert                                             MDString *Name, Metadata *Elements,
1978*d415bd75Srobert                                             StorageType Storage,
197909467b48Spatrick                                             bool ShouldCreate) {
198009467b48Spatrick   assert(isCanonical(Name) && "Expected canonical MDString");
198109467b48Spatrick   DEFINE_GETIMPL_LOOKUP(DIImportedEntity,
1982*d415bd75Srobert                         (Tag, Scope, Entity, File, Line, Name, Elements));
1983*d415bd75Srobert   Metadata *Ops[] = {Scope, Entity, Name, File, Elements};
198409467b48Spatrick   DEFINE_GETIMPL_STORE(DIImportedEntity, (Tag, Line), Ops);
198509467b48Spatrick }
198609467b48Spatrick 
getImpl(LLVMContext & Context,unsigned MIType,unsigned Line,MDString * Name,MDString * Value,StorageType Storage,bool ShouldCreate)1987*d415bd75Srobert DIMacro *DIMacro::getImpl(LLVMContext &Context, unsigned MIType, unsigned Line,
1988*d415bd75Srobert                           MDString *Name, MDString *Value, StorageType Storage,
1989*d415bd75Srobert                           bool ShouldCreate) {
199009467b48Spatrick   assert(isCanonical(Name) && "Expected canonical MDString");
199109467b48Spatrick   DEFINE_GETIMPL_LOOKUP(DIMacro, (MIType, Line, Name, Value));
199209467b48Spatrick   Metadata *Ops[] = {Name, Value};
199309467b48Spatrick   DEFINE_GETIMPL_STORE(DIMacro, (MIType, Line), Ops);
199409467b48Spatrick }
199509467b48Spatrick 
getImpl(LLVMContext & Context,unsigned MIType,unsigned Line,Metadata * File,Metadata * Elements,StorageType Storage,bool ShouldCreate)199609467b48Spatrick DIMacroFile *DIMacroFile::getImpl(LLVMContext &Context, unsigned MIType,
199709467b48Spatrick                                   unsigned Line, Metadata *File,
199809467b48Spatrick                                   Metadata *Elements, StorageType Storage,
199909467b48Spatrick                                   bool ShouldCreate) {
2000*d415bd75Srobert   DEFINE_GETIMPL_LOOKUP(DIMacroFile, (MIType, Line, File, Elements));
200109467b48Spatrick   Metadata *Ops[] = {File, Elements};
200209467b48Spatrick   DEFINE_GETIMPL_STORE(DIMacroFile, (MIType, Line), Ops);
200309467b48Spatrick }
200473471bf0Spatrick 
getImpl(LLVMContext & Context,ArrayRef<ValueAsMetadata * > Args,StorageType Storage,bool ShouldCreate)200573471bf0Spatrick DIArgList *DIArgList::getImpl(LLVMContext &Context,
200673471bf0Spatrick                               ArrayRef<ValueAsMetadata *> Args,
200773471bf0Spatrick                               StorageType Storage, bool ShouldCreate) {
200873471bf0Spatrick   DEFINE_GETIMPL_LOOKUP(DIArgList, (Args));
200973471bf0Spatrick   DEFINE_GETIMPL_STORE_NO_OPS(DIArgList, (Args));
201073471bf0Spatrick }
201173471bf0Spatrick 
handleChangedOperand(void * Ref,Metadata * New)201273471bf0Spatrick void DIArgList::handleChangedOperand(void *Ref, Metadata *New) {
201373471bf0Spatrick   ValueAsMetadata **OldVMPtr = static_cast<ValueAsMetadata **>(Ref);
201473471bf0Spatrick   assert((!New || isa<ValueAsMetadata>(New)) &&
201573471bf0Spatrick          "DIArgList must be passed a ValueAsMetadata");
201673471bf0Spatrick   untrack();
2017*d415bd75Srobert   bool Uniq = isUniqued();
2018*d415bd75Srobert   if (Uniq) {
2019*d415bd75Srobert     // We need to update the uniqueness once the Args are updated since they
2020*d415bd75Srobert     // form the key to the DIArgLists store.
2021*d415bd75Srobert     eraseFromStore();
2022*d415bd75Srobert   }
202373471bf0Spatrick   ValueAsMetadata *NewVM = cast_or_null<ValueAsMetadata>(New);
202473471bf0Spatrick   for (ValueAsMetadata *&VM : Args) {
202573471bf0Spatrick     if (&VM == OldVMPtr) {
202673471bf0Spatrick       if (NewVM)
202773471bf0Spatrick         VM = NewVM;
202873471bf0Spatrick       else
202973471bf0Spatrick         VM = ValueAsMetadata::get(UndefValue::get(VM->getValue()->getType()));
203073471bf0Spatrick     }
203173471bf0Spatrick   }
2032*d415bd75Srobert   if (Uniq) {
2033*d415bd75Srobert     if (uniquify() != this)
2034*d415bd75Srobert       storeDistinctInContext();
2035*d415bd75Srobert   }
203673471bf0Spatrick   track();
203773471bf0Spatrick }
track()203873471bf0Spatrick void DIArgList::track() {
203973471bf0Spatrick   for (ValueAsMetadata *&VAM : Args)
204073471bf0Spatrick     if (VAM)
204173471bf0Spatrick       MetadataTracking::track(&VAM, *VAM, *this);
204273471bf0Spatrick }
untrack()204373471bf0Spatrick void DIArgList::untrack() {
204473471bf0Spatrick   for (ValueAsMetadata *&VAM : Args)
204573471bf0Spatrick     if (VAM)
204673471bf0Spatrick       MetadataTracking::untrack(&VAM, *VAM);
204773471bf0Spatrick }
dropAllReferences()204873471bf0Spatrick void DIArgList::dropAllReferences() {
204973471bf0Spatrick   untrack();
205073471bf0Spatrick   Args.clear();
205173471bf0Spatrick   MDNode::dropAllReferences();
205273471bf0Spatrick }
2053