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