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