1*9880d681SAndroid Build Coastguard Worker //===--- DIBuilder.cpp - Debug Information Builder ------------------------===//
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 DIBuilder.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DIBuilder.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Constants.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DebugInfo.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/IntrinsicInst.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Dwarf.h"
22*9880d681SAndroid Build Coastguard Worker #include "LLVMContextImpl.h"
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker using namespace llvm;
25*9880d681SAndroid Build Coastguard Worker using namespace llvm::dwarf;
26*9880d681SAndroid Build Coastguard Worker
DIBuilder(Module & m,bool AllowUnresolvedNodes)27*9880d681SAndroid Build Coastguard Worker DIBuilder::DIBuilder(Module &m, bool AllowUnresolvedNodes)
28*9880d681SAndroid Build Coastguard Worker : M(m), VMContext(M.getContext()), CUNode(nullptr),
29*9880d681SAndroid Build Coastguard Worker DeclareFn(nullptr), ValueFn(nullptr),
30*9880d681SAndroid Build Coastguard Worker AllowUnresolvedNodes(AllowUnresolvedNodes) {}
31*9880d681SAndroid Build Coastguard Worker
trackIfUnresolved(MDNode * N)32*9880d681SAndroid Build Coastguard Worker void DIBuilder::trackIfUnresolved(MDNode *N) {
33*9880d681SAndroid Build Coastguard Worker if (!N)
34*9880d681SAndroid Build Coastguard Worker return;
35*9880d681SAndroid Build Coastguard Worker if (N->isResolved())
36*9880d681SAndroid Build Coastguard Worker return;
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker assert(AllowUnresolvedNodes && "Cannot handle unresolved nodes");
39*9880d681SAndroid Build Coastguard Worker UnresolvedNodes.emplace_back(N);
40*9880d681SAndroid Build Coastguard Worker }
41*9880d681SAndroid Build Coastguard Worker
finalize()42*9880d681SAndroid Build Coastguard Worker void DIBuilder::finalize() {
43*9880d681SAndroid Build Coastguard Worker if (!CUNode) {
44*9880d681SAndroid Build Coastguard Worker assert(!AllowUnresolvedNodes &&
45*9880d681SAndroid Build Coastguard Worker "creating type nodes without a CU is not supported");
46*9880d681SAndroid Build Coastguard Worker return;
47*9880d681SAndroid Build Coastguard Worker }
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker CUNode->replaceEnumTypes(MDTuple::get(VMContext, AllEnumTypes));
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker SmallVector<Metadata *, 16> RetainValues;
52*9880d681SAndroid Build Coastguard Worker // Declarations and definitions of the same type may be retained. Some
53*9880d681SAndroid Build Coastguard Worker // clients RAUW these pairs, leaving duplicates in the retained types
54*9880d681SAndroid Build Coastguard Worker // list. Use a set to remove the duplicates while we transform the
55*9880d681SAndroid Build Coastguard Worker // TrackingVHs back into Values.
56*9880d681SAndroid Build Coastguard Worker SmallPtrSet<Metadata *, 16> RetainSet;
57*9880d681SAndroid Build Coastguard Worker for (unsigned I = 0, E = AllRetainTypes.size(); I < E; I++)
58*9880d681SAndroid Build Coastguard Worker if (RetainSet.insert(AllRetainTypes[I]).second)
59*9880d681SAndroid Build Coastguard Worker RetainValues.push_back(AllRetainTypes[I]);
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker if (!RetainValues.empty())
62*9880d681SAndroid Build Coastguard Worker CUNode->replaceRetainedTypes(MDTuple::get(VMContext, RetainValues));
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker DISubprogramArray SPs = MDTuple::get(VMContext, AllSubprograms);
65*9880d681SAndroid Build Coastguard Worker auto resolveVariables = [&](DISubprogram *SP) {
66*9880d681SAndroid Build Coastguard Worker MDTuple *Temp = SP->getVariables().get();
67*9880d681SAndroid Build Coastguard Worker if (!Temp)
68*9880d681SAndroid Build Coastguard Worker return;
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker SmallVector<Metadata *, 4> Variables;
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker auto PV = PreservedVariables.find(SP);
73*9880d681SAndroid Build Coastguard Worker if (PV != PreservedVariables.end())
74*9880d681SAndroid Build Coastguard Worker Variables.append(PV->second.begin(), PV->second.end());
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker DINodeArray AV = getOrCreateArray(Variables);
77*9880d681SAndroid Build Coastguard Worker TempMDTuple(Temp)->replaceAllUsesWith(AV.get());
78*9880d681SAndroid Build Coastguard Worker };
79*9880d681SAndroid Build Coastguard Worker for (auto *SP : SPs)
80*9880d681SAndroid Build Coastguard Worker resolveVariables(SP);
81*9880d681SAndroid Build Coastguard Worker for (auto *N : RetainValues)
82*9880d681SAndroid Build Coastguard Worker if (auto *SP = dyn_cast<DISubprogram>(N))
83*9880d681SAndroid Build Coastguard Worker resolveVariables(SP);
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker if (!AllGVs.empty())
86*9880d681SAndroid Build Coastguard Worker CUNode->replaceGlobalVariables(MDTuple::get(VMContext, AllGVs));
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker if (!AllImportedModules.empty())
89*9880d681SAndroid Build Coastguard Worker CUNode->replaceImportedEntities(MDTuple::get(
90*9880d681SAndroid Build Coastguard Worker VMContext, SmallVector<Metadata *, 16>(AllImportedModules.begin(),
91*9880d681SAndroid Build Coastguard Worker AllImportedModules.end())));
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker // Now that all temp nodes have been replaced or deleted, resolve remaining
94*9880d681SAndroid Build Coastguard Worker // cycles.
95*9880d681SAndroid Build Coastguard Worker for (const auto &N : UnresolvedNodes)
96*9880d681SAndroid Build Coastguard Worker if (N && !N->isResolved())
97*9880d681SAndroid Build Coastguard Worker N->resolveCycles();
98*9880d681SAndroid Build Coastguard Worker UnresolvedNodes.clear();
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker // Can't handle unresolved nodes anymore.
101*9880d681SAndroid Build Coastguard Worker AllowUnresolvedNodes = false;
102*9880d681SAndroid Build Coastguard Worker }
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker /// If N is compile unit return NULL otherwise return N.
getNonCompileUnitScope(DIScope * N)105*9880d681SAndroid Build Coastguard Worker static DIScope *getNonCompileUnitScope(DIScope *N) {
106*9880d681SAndroid Build Coastguard Worker if (!N || isa<DICompileUnit>(N))
107*9880d681SAndroid Build Coastguard Worker return nullptr;
108*9880d681SAndroid Build Coastguard Worker return cast<DIScope>(N);
109*9880d681SAndroid Build Coastguard Worker }
110*9880d681SAndroid Build Coastguard Worker
createCompileUnit(unsigned Lang,StringRef Filename,StringRef Directory,StringRef Producer,bool isOptimized,StringRef Flags,unsigned RunTimeVer,StringRef SplitName,DICompileUnit::DebugEmissionKind Kind,uint64_t DWOId)111*9880d681SAndroid Build Coastguard Worker DICompileUnit *DIBuilder::createCompileUnit(
112*9880d681SAndroid Build Coastguard Worker unsigned Lang, StringRef Filename, StringRef Directory, StringRef Producer,
113*9880d681SAndroid Build Coastguard Worker bool isOptimized, StringRef Flags, unsigned RunTimeVer, StringRef SplitName,
114*9880d681SAndroid Build Coastguard Worker DICompileUnit::DebugEmissionKind Kind, uint64_t DWOId) {
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker assert(((Lang <= dwarf::DW_LANG_Fortran08 && Lang >= dwarf::DW_LANG_C89) ||
117*9880d681SAndroid Build Coastguard Worker (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) &&
118*9880d681SAndroid Build Coastguard Worker "Invalid Language tag");
119*9880d681SAndroid Build Coastguard Worker assert(!Filename.empty() &&
120*9880d681SAndroid Build Coastguard Worker "Unable to create compile unit without filename");
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker assert(!CUNode && "Can only make one compile unit per DIBuilder instance");
123*9880d681SAndroid Build Coastguard Worker CUNode = DICompileUnit::getDistinct(
124*9880d681SAndroid Build Coastguard Worker VMContext, Lang, DIFile::get(VMContext, Filename, Directory), Producer,
125*9880d681SAndroid Build Coastguard Worker isOptimized, Flags, RunTimeVer, SplitName, Kind, nullptr, nullptr,
126*9880d681SAndroid Build Coastguard Worker nullptr, nullptr, nullptr, DWOId);
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker // Create a named metadata so that it is easier to find cu in a module.
129*9880d681SAndroid Build Coastguard Worker NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
130*9880d681SAndroid Build Coastguard Worker NMD->addOperand(CUNode);
131*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(CUNode);
132*9880d681SAndroid Build Coastguard Worker return CUNode;
133*9880d681SAndroid Build Coastguard Worker }
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker static DIImportedEntity *
createImportedModule(LLVMContext & C,dwarf::Tag Tag,DIScope * Context,Metadata * NS,unsigned Line,StringRef Name,SmallVectorImpl<TrackingMDNodeRef> & AllImportedModules)136*9880d681SAndroid Build Coastguard Worker createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope *Context,
137*9880d681SAndroid Build Coastguard Worker Metadata *NS, unsigned Line, StringRef Name,
138*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<TrackingMDNodeRef> &AllImportedModules) {
139*9880d681SAndroid Build Coastguard Worker unsigned EntitiesCount = C.pImpl->DIImportedEntitys.size();
140*9880d681SAndroid Build Coastguard Worker auto *M = DIImportedEntity::get(C, Tag, Context, DINodeRef(NS), Line, Name);
141*9880d681SAndroid Build Coastguard Worker if (EntitiesCount < C.pImpl->DIImportedEntitys.size())
142*9880d681SAndroid Build Coastguard Worker // A new Imported Entity was just added to the context.
143*9880d681SAndroid Build Coastguard Worker // Add it to the Imported Modules list.
144*9880d681SAndroid Build Coastguard Worker AllImportedModules.emplace_back(M);
145*9880d681SAndroid Build Coastguard Worker return M;
146*9880d681SAndroid Build Coastguard Worker }
147*9880d681SAndroid Build Coastguard Worker
createImportedModule(DIScope * Context,DINamespace * NS,unsigned Line)148*9880d681SAndroid Build Coastguard Worker DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context,
149*9880d681SAndroid Build Coastguard Worker DINamespace *NS,
150*9880d681SAndroid Build Coastguard Worker unsigned Line) {
151*9880d681SAndroid Build Coastguard Worker return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
152*9880d681SAndroid Build Coastguard Worker Context, NS, Line, StringRef(), AllImportedModules);
153*9880d681SAndroid Build Coastguard Worker }
154*9880d681SAndroid Build Coastguard Worker
createImportedModule(DIScope * Context,DIImportedEntity * NS,unsigned Line)155*9880d681SAndroid Build Coastguard Worker DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context,
156*9880d681SAndroid Build Coastguard Worker DIImportedEntity *NS,
157*9880d681SAndroid Build Coastguard Worker unsigned Line) {
158*9880d681SAndroid Build Coastguard Worker return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
159*9880d681SAndroid Build Coastguard Worker Context, NS, Line, StringRef(), AllImportedModules);
160*9880d681SAndroid Build Coastguard Worker }
161*9880d681SAndroid Build Coastguard Worker
createImportedModule(DIScope * Context,DIModule * M,unsigned Line)162*9880d681SAndroid Build Coastguard Worker DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context, DIModule *M,
163*9880d681SAndroid Build Coastguard Worker unsigned Line) {
164*9880d681SAndroid Build Coastguard Worker return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
165*9880d681SAndroid Build Coastguard Worker Context, M, Line, StringRef(), AllImportedModules);
166*9880d681SAndroid Build Coastguard Worker }
167*9880d681SAndroid Build Coastguard Worker
createImportedDeclaration(DIScope * Context,DINode * Decl,unsigned Line,StringRef Name)168*9880d681SAndroid Build Coastguard Worker DIImportedEntity *DIBuilder::createImportedDeclaration(DIScope *Context,
169*9880d681SAndroid Build Coastguard Worker DINode *Decl,
170*9880d681SAndroid Build Coastguard Worker unsigned Line,
171*9880d681SAndroid Build Coastguard Worker StringRef Name) {
172*9880d681SAndroid Build Coastguard Worker // Make sure to use the unique identifier based metadata reference for
173*9880d681SAndroid Build Coastguard Worker // types that have one.
174*9880d681SAndroid Build Coastguard Worker return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_declaration,
175*9880d681SAndroid Build Coastguard Worker Context, Decl, Line, Name, AllImportedModules);
176*9880d681SAndroid Build Coastguard Worker }
177*9880d681SAndroid Build Coastguard Worker
createFile(StringRef Filename,StringRef Directory)178*9880d681SAndroid Build Coastguard Worker DIFile *DIBuilder::createFile(StringRef Filename, StringRef Directory) {
179*9880d681SAndroid Build Coastguard Worker return DIFile::get(VMContext, Filename, Directory);
180*9880d681SAndroid Build Coastguard Worker }
181*9880d681SAndroid Build Coastguard Worker
createEnumerator(StringRef Name,int64_t Val)182*9880d681SAndroid Build Coastguard Worker DIEnumerator *DIBuilder::createEnumerator(StringRef Name, int64_t Val) {
183*9880d681SAndroid Build Coastguard Worker assert(!Name.empty() && "Unable to create enumerator without name");
184*9880d681SAndroid Build Coastguard Worker return DIEnumerator::get(VMContext, Val, Name);
185*9880d681SAndroid Build Coastguard Worker }
186*9880d681SAndroid Build Coastguard Worker
createUnspecifiedType(StringRef Name)187*9880d681SAndroid Build Coastguard Worker DIBasicType *DIBuilder::createUnspecifiedType(StringRef Name) {
188*9880d681SAndroid Build Coastguard Worker assert(!Name.empty() && "Unable to create type without name");
189*9880d681SAndroid Build Coastguard Worker return DIBasicType::get(VMContext, dwarf::DW_TAG_unspecified_type, Name);
190*9880d681SAndroid Build Coastguard Worker }
191*9880d681SAndroid Build Coastguard Worker
createNullPtrType()192*9880d681SAndroid Build Coastguard Worker DIBasicType *DIBuilder::createNullPtrType() {
193*9880d681SAndroid Build Coastguard Worker return createUnspecifiedType("decltype(nullptr)");
194*9880d681SAndroid Build Coastguard Worker }
195*9880d681SAndroid Build Coastguard Worker
createBasicType(StringRef Name,uint64_t SizeInBits,uint64_t AlignInBits,unsigned Encoding)196*9880d681SAndroid Build Coastguard Worker DIBasicType *DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
197*9880d681SAndroid Build Coastguard Worker uint64_t AlignInBits,
198*9880d681SAndroid Build Coastguard Worker unsigned Encoding) {
199*9880d681SAndroid Build Coastguard Worker assert(!Name.empty() && "Unable to create type without name");
200*9880d681SAndroid Build Coastguard Worker return DIBasicType::get(VMContext, dwarf::DW_TAG_base_type, Name, SizeInBits,
201*9880d681SAndroid Build Coastguard Worker AlignInBits, Encoding);
202*9880d681SAndroid Build Coastguard Worker }
203*9880d681SAndroid Build Coastguard Worker
createQualifiedType(unsigned Tag,DIType * FromTy)204*9880d681SAndroid Build Coastguard Worker DIDerivedType *DIBuilder::createQualifiedType(unsigned Tag, DIType *FromTy) {
205*9880d681SAndroid Build Coastguard Worker return DIDerivedType::get(VMContext, Tag, "", nullptr, 0, nullptr, FromTy, 0,
206*9880d681SAndroid Build Coastguard Worker 0, 0, 0);
207*9880d681SAndroid Build Coastguard Worker }
208*9880d681SAndroid Build Coastguard Worker
createPointerType(DIType * PointeeTy,uint64_t SizeInBits,uint64_t AlignInBits,StringRef Name)209*9880d681SAndroid Build Coastguard Worker DIDerivedType *DIBuilder::createPointerType(DIType *PointeeTy,
210*9880d681SAndroid Build Coastguard Worker uint64_t SizeInBits,
211*9880d681SAndroid Build Coastguard Worker uint64_t AlignInBits,
212*9880d681SAndroid Build Coastguard Worker StringRef Name) {
213*9880d681SAndroid Build Coastguard Worker // FIXME: Why is there a name here?
214*9880d681SAndroid Build Coastguard Worker return DIDerivedType::get(VMContext, dwarf::DW_TAG_pointer_type, Name,
215*9880d681SAndroid Build Coastguard Worker nullptr, 0, nullptr, PointeeTy, SizeInBits,
216*9880d681SAndroid Build Coastguard Worker AlignInBits, 0, 0);
217*9880d681SAndroid Build Coastguard Worker }
218*9880d681SAndroid Build Coastguard Worker
createMemberPointerType(DIType * PointeeTy,DIType * Base,uint64_t SizeInBits,uint64_t AlignInBits,unsigned Flags)219*9880d681SAndroid Build Coastguard Worker DIDerivedType *DIBuilder::createMemberPointerType(DIType *PointeeTy,
220*9880d681SAndroid Build Coastguard Worker DIType *Base,
221*9880d681SAndroid Build Coastguard Worker uint64_t SizeInBits,
222*9880d681SAndroid Build Coastguard Worker uint64_t AlignInBits,
223*9880d681SAndroid Build Coastguard Worker unsigned Flags) {
224*9880d681SAndroid Build Coastguard Worker return DIDerivedType::get(VMContext, dwarf::DW_TAG_ptr_to_member_type, "",
225*9880d681SAndroid Build Coastguard Worker nullptr, 0, nullptr, PointeeTy, SizeInBits,
226*9880d681SAndroid Build Coastguard Worker AlignInBits, 0, Flags, Base);
227*9880d681SAndroid Build Coastguard Worker }
228*9880d681SAndroid Build Coastguard Worker
createReferenceType(unsigned Tag,DIType * RTy,uint64_t SizeInBits,uint64_t AlignInBits)229*9880d681SAndroid Build Coastguard Worker DIDerivedType *DIBuilder::createReferenceType(unsigned Tag, DIType *RTy,
230*9880d681SAndroid Build Coastguard Worker uint64_t SizeInBits,
231*9880d681SAndroid Build Coastguard Worker uint64_t AlignInBits) {
232*9880d681SAndroid Build Coastguard Worker assert(RTy && "Unable to create reference type");
233*9880d681SAndroid Build Coastguard Worker return DIDerivedType::get(VMContext, Tag, "", nullptr, 0, nullptr, RTy,
234*9880d681SAndroid Build Coastguard Worker SizeInBits, AlignInBits, 0, 0);
235*9880d681SAndroid Build Coastguard Worker }
236*9880d681SAndroid Build Coastguard Worker
createTypedef(DIType * Ty,StringRef Name,DIFile * File,unsigned LineNo,DIScope * Context)237*9880d681SAndroid Build Coastguard Worker DIDerivedType *DIBuilder::createTypedef(DIType *Ty, StringRef Name,
238*9880d681SAndroid Build Coastguard Worker DIFile *File, unsigned LineNo,
239*9880d681SAndroid Build Coastguard Worker DIScope *Context) {
240*9880d681SAndroid Build Coastguard Worker return DIDerivedType::get(VMContext, dwarf::DW_TAG_typedef, Name, File,
241*9880d681SAndroid Build Coastguard Worker LineNo, getNonCompileUnitScope(Context), Ty, 0, 0,
242*9880d681SAndroid Build Coastguard Worker 0, 0);
243*9880d681SAndroid Build Coastguard Worker }
244*9880d681SAndroid Build Coastguard Worker
createFriend(DIType * Ty,DIType * FriendTy)245*9880d681SAndroid Build Coastguard Worker DIDerivedType *DIBuilder::createFriend(DIType *Ty, DIType *FriendTy) {
246*9880d681SAndroid Build Coastguard Worker assert(Ty && "Invalid type!");
247*9880d681SAndroid Build Coastguard Worker assert(FriendTy && "Invalid friend type!");
248*9880d681SAndroid Build Coastguard Worker return DIDerivedType::get(VMContext, dwarf::DW_TAG_friend, "", nullptr, 0, Ty,
249*9880d681SAndroid Build Coastguard Worker FriendTy, 0, 0, 0, 0);
250*9880d681SAndroid Build Coastguard Worker }
251*9880d681SAndroid Build Coastguard Worker
createInheritance(DIType * Ty,DIType * BaseTy,uint64_t BaseOffset,unsigned Flags)252*9880d681SAndroid Build Coastguard Worker DIDerivedType *DIBuilder::createInheritance(DIType *Ty, DIType *BaseTy,
253*9880d681SAndroid Build Coastguard Worker uint64_t BaseOffset,
254*9880d681SAndroid Build Coastguard Worker unsigned Flags) {
255*9880d681SAndroid Build Coastguard Worker assert(Ty && "Unable to create inheritance");
256*9880d681SAndroid Build Coastguard Worker return DIDerivedType::get(VMContext, dwarf::DW_TAG_inheritance, "", nullptr,
257*9880d681SAndroid Build Coastguard Worker 0, Ty, BaseTy, 0, 0, BaseOffset, Flags);
258*9880d681SAndroid Build Coastguard Worker }
259*9880d681SAndroid Build Coastguard Worker
createMemberType(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,uint64_t OffsetInBits,unsigned Flags,DIType * Ty)260*9880d681SAndroid Build Coastguard Worker DIDerivedType *DIBuilder::createMemberType(DIScope *Scope, StringRef Name,
261*9880d681SAndroid Build Coastguard Worker DIFile *File, unsigned LineNumber,
262*9880d681SAndroid Build Coastguard Worker uint64_t SizeInBits,
263*9880d681SAndroid Build Coastguard Worker uint64_t AlignInBits,
264*9880d681SAndroid Build Coastguard Worker uint64_t OffsetInBits,
265*9880d681SAndroid Build Coastguard Worker unsigned Flags, DIType *Ty) {
266*9880d681SAndroid Build Coastguard Worker return DIDerivedType::get(VMContext, dwarf::DW_TAG_member, Name, File,
267*9880d681SAndroid Build Coastguard Worker LineNumber, getNonCompileUnitScope(Scope), Ty,
268*9880d681SAndroid Build Coastguard Worker SizeInBits, AlignInBits, OffsetInBits, Flags);
269*9880d681SAndroid Build Coastguard Worker }
270*9880d681SAndroid Build Coastguard Worker
getConstantOrNull(Constant * C)271*9880d681SAndroid Build Coastguard Worker static ConstantAsMetadata *getConstantOrNull(Constant *C) {
272*9880d681SAndroid Build Coastguard Worker if (C)
273*9880d681SAndroid Build Coastguard Worker return ConstantAsMetadata::get(C);
274*9880d681SAndroid Build Coastguard Worker return nullptr;
275*9880d681SAndroid Build Coastguard Worker }
276*9880d681SAndroid Build Coastguard Worker
createBitFieldMemberType(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,uint64_t OffsetInBits,uint64_t StorageOffsetInBits,unsigned Flags,DIType * Ty)277*9880d681SAndroid Build Coastguard Worker DIDerivedType *DIBuilder::createBitFieldMemberType(
278*9880d681SAndroid Build Coastguard Worker DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
279*9880d681SAndroid Build Coastguard Worker uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits,
280*9880d681SAndroid Build Coastguard Worker uint64_t StorageOffsetInBits, unsigned Flags, DIType *Ty) {
281*9880d681SAndroid Build Coastguard Worker Flags |= DINode::FlagBitField;
282*9880d681SAndroid Build Coastguard Worker return DIDerivedType::get(
283*9880d681SAndroid Build Coastguard Worker VMContext, dwarf::DW_TAG_member, Name, File, LineNumber,
284*9880d681SAndroid Build Coastguard Worker getNonCompileUnitScope(Scope), Ty, SizeInBits, AlignInBits, OffsetInBits,
285*9880d681SAndroid Build Coastguard Worker Flags, ConstantAsMetadata::get(ConstantInt::get(
286*9880d681SAndroid Build Coastguard Worker IntegerType::get(VMContext, 64), StorageOffsetInBits)));
287*9880d681SAndroid Build Coastguard Worker }
288*9880d681SAndroid Build Coastguard Worker
createStaticMemberType(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNumber,DIType * Ty,unsigned Flags,llvm::Constant * Val)289*9880d681SAndroid Build Coastguard Worker DIDerivedType *DIBuilder::createStaticMemberType(DIScope *Scope, StringRef Name,
290*9880d681SAndroid Build Coastguard Worker DIFile *File,
291*9880d681SAndroid Build Coastguard Worker unsigned LineNumber,
292*9880d681SAndroid Build Coastguard Worker DIType *Ty, unsigned Flags,
293*9880d681SAndroid Build Coastguard Worker llvm::Constant *Val) {
294*9880d681SAndroid Build Coastguard Worker Flags |= DINode::FlagStaticMember;
295*9880d681SAndroid Build Coastguard Worker return DIDerivedType::get(VMContext, dwarf::DW_TAG_member, Name, File,
296*9880d681SAndroid Build Coastguard Worker LineNumber, getNonCompileUnitScope(Scope), Ty, 0, 0,
297*9880d681SAndroid Build Coastguard Worker 0, Flags, getConstantOrNull(Val));
298*9880d681SAndroid Build Coastguard Worker }
299*9880d681SAndroid Build Coastguard Worker
createObjCIVar(StringRef Name,DIFile * File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,uint64_t OffsetInBits,unsigned Flags,DIType * Ty,MDNode * PropertyNode)300*9880d681SAndroid Build Coastguard Worker DIDerivedType *DIBuilder::createObjCIVar(StringRef Name, DIFile *File,
301*9880d681SAndroid Build Coastguard Worker unsigned LineNumber,
302*9880d681SAndroid Build Coastguard Worker uint64_t SizeInBits,
303*9880d681SAndroid Build Coastguard Worker uint64_t AlignInBits,
304*9880d681SAndroid Build Coastguard Worker uint64_t OffsetInBits, unsigned Flags,
305*9880d681SAndroid Build Coastguard Worker DIType *Ty, MDNode *PropertyNode) {
306*9880d681SAndroid Build Coastguard Worker return DIDerivedType::get(VMContext, dwarf::DW_TAG_member, Name, File,
307*9880d681SAndroid Build Coastguard Worker LineNumber, getNonCompileUnitScope(File), Ty,
308*9880d681SAndroid Build Coastguard Worker SizeInBits, AlignInBits, OffsetInBits, Flags,
309*9880d681SAndroid Build Coastguard Worker PropertyNode);
310*9880d681SAndroid Build Coastguard Worker }
311*9880d681SAndroid Build Coastguard Worker
312*9880d681SAndroid Build Coastguard Worker DIObjCProperty *
createObjCProperty(StringRef Name,DIFile * File,unsigned LineNumber,StringRef GetterName,StringRef SetterName,unsigned PropertyAttributes,DIType * Ty)313*9880d681SAndroid Build Coastguard Worker DIBuilder::createObjCProperty(StringRef Name, DIFile *File, unsigned LineNumber,
314*9880d681SAndroid Build Coastguard Worker StringRef GetterName, StringRef SetterName,
315*9880d681SAndroid Build Coastguard Worker unsigned PropertyAttributes, DIType *Ty) {
316*9880d681SAndroid Build Coastguard Worker return DIObjCProperty::get(VMContext, Name, File, LineNumber, GetterName,
317*9880d681SAndroid Build Coastguard Worker SetterName, PropertyAttributes, Ty);
318*9880d681SAndroid Build Coastguard Worker }
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Worker DITemplateTypeParameter *
createTemplateTypeParameter(DIScope * Context,StringRef Name,DIType * Ty)321*9880d681SAndroid Build Coastguard Worker DIBuilder::createTemplateTypeParameter(DIScope *Context, StringRef Name,
322*9880d681SAndroid Build Coastguard Worker DIType *Ty) {
323*9880d681SAndroid Build Coastguard Worker assert((!Context || isa<DICompileUnit>(Context)) && "Expected compile unit");
324*9880d681SAndroid Build Coastguard Worker return DITemplateTypeParameter::get(VMContext, Name, Ty);
325*9880d681SAndroid Build Coastguard Worker }
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Worker static DITemplateValueParameter *
createTemplateValueParameterHelper(LLVMContext & VMContext,unsigned Tag,DIScope * Context,StringRef Name,DIType * Ty,Metadata * MD)328*9880d681SAndroid Build Coastguard Worker createTemplateValueParameterHelper(LLVMContext &VMContext, unsigned Tag,
329*9880d681SAndroid Build Coastguard Worker DIScope *Context, StringRef Name, DIType *Ty,
330*9880d681SAndroid Build Coastguard Worker Metadata *MD) {
331*9880d681SAndroid Build Coastguard Worker assert((!Context || isa<DICompileUnit>(Context)) && "Expected compile unit");
332*9880d681SAndroid Build Coastguard Worker return DITemplateValueParameter::get(VMContext, Tag, Name, Ty, MD);
333*9880d681SAndroid Build Coastguard Worker }
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Worker DITemplateValueParameter *
createTemplateValueParameter(DIScope * Context,StringRef Name,DIType * Ty,Constant * Val)336*9880d681SAndroid Build Coastguard Worker DIBuilder::createTemplateValueParameter(DIScope *Context, StringRef Name,
337*9880d681SAndroid Build Coastguard Worker DIType *Ty, Constant *Val) {
338*9880d681SAndroid Build Coastguard Worker return createTemplateValueParameterHelper(
339*9880d681SAndroid Build Coastguard Worker VMContext, dwarf::DW_TAG_template_value_parameter, Context, Name, Ty,
340*9880d681SAndroid Build Coastguard Worker getConstantOrNull(Val));
341*9880d681SAndroid Build Coastguard Worker }
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Worker DITemplateValueParameter *
createTemplateTemplateParameter(DIScope * Context,StringRef Name,DIType * Ty,StringRef Val)344*9880d681SAndroid Build Coastguard Worker DIBuilder::createTemplateTemplateParameter(DIScope *Context, StringRef Name,
345*9880d681SAndroid Build Coastguard Worker DIType *Ty, StringRef Val) {
346*9880d681SAndroid Build Coastguard Worker return createTemplateValueParameterHelper(
347*9880d681SAndroid Build Coastguard Worker VMContext, dwarf::DW_TAG_GNU_template_template_param, Context, Name, Ty,
348*9880d681SAndroid Build Coastguard Worker MDString::get(VMContext, Val));
349*9880d681SAndroid Build Coastguard Worker }
350*9880d681SAndroid Build Coastguard Worker
351*9880d681SAndroid Build Coastguard Worker DITemplateValueParameter *
createTemplateParameterPack(DIScope * Context,StringRef Name,DIType * Ty,DINodeArray Val)352*9880d681SAndroid Build Coastguard Worker DIBuilder::createTemplateParameterPack(DIScope *Context, StringRef Name,
353*9880d681SAndroid Build Coastguard Worker DIType *Ty, DINodeArray Val) {
354*9880d681SAndroid Build Coastguard Worker return createTemplateValueParameterHelper(
355*9880d681SAndroid Build Coastguard Worker VMContext, dwarf::DW_TAG_GNU_template_parameter_pack, Context, Name, Ty,
356*9880d681SAndroid Build Coastguard Worker Val.get());
357*9880d681SAndroid Build Coastguard Worker }
358*9880d681SAndroid Build Coastguard Worker
createClassType(DIScope * Context,StringRef Name,DIFile * File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,uint64_t OffsetInBits,unsigned Flags,DIType * DerivedFrom,DINodeArray Elements,DIType * VTableHolder,MDNode * TemplateParams,StringRef UniqueIdentifier)359*9880d681SAndroid Build Coastguard Worker DICompositeType *DIBuilder::createClassType(
360*9880d681SAndroid Build Coastguard Worker DIScope *Context, StringRef Name, DIFile *File, unsigned LineNumber,
361*9880d681SAndroid Build Coastguard Worker uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits,
362*9880d681SAndroid Build Coastguard Worker unsigned Flags, DIType *DerivedFrom, DINodeArray Elements,
363*9880d681SAndroid Build Coastguard Worker DIType *VTableHolder, MDNode *TemplateParams, StringRef UniqueIdentifier) {
364*9880d681SAndroid Build Coastguard Worker assert((!Context || isa<DIScope>(Context)) &&
365*9880d681SAndroid Build Coastguard Worker "createClassType should be called with a valid Context");
366*9880d681SAndroid Build Coastguard Worker
367*9880d681SAndroid Build Coastguard Worker auto *R = DICompositeType::get(
368*9880d681SAndroid Build Coastguard Worker VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber,
369*9880d681SAndroid Build Coastguard Worker getNonCompileUnitScope(Context), DerivedFrom, SizeInBits, AlignInBits,
370*9880d681SAndroid Build Coastguard Worker OffsetInBits, Flags, Elements, 0, VTableHolder,
371*9880d681SAndroid Build Coastguard Worker cast_or_null<MDTuple>(TemplateParams), UniqueIdentifier);
372*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(R);
373*9880d681SAndroid Build Coastguard Worker return R;
374*9880d681SAndroid Build Coastguard Worker }
375*9880d681SAndroid Build Coastguard Worker
createStructType(DIScope * Context,StringRef Name,DIFile * File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,unsigned Flags,DIType * DerivedFrom,DINodeArray Elements,unsigned RunTimeLang,DIType * VTableHolder,StringRef UniqueIdentifier)376*9880d681SAndroid Build Coastguard Worker DICompositeType *DIBuilder::createStructType(
377*9880d681SAndroid Build Coastguard Worker DIScope *Context, StringRef Name, DIFile *File, unsigned LineNumber,
378*9880d681SAndroid Build Coastguard Worker uint64_t SizeInBits, uint64_t AlignInBits, unsigned Flags,
379*9880d681SAndroid Build Coastguard Worker DIType *DerivedFrom, DINodeArray Elements, unsigned RunTimeLang,
380*9880d681SAndroid Build Coastguard Worker DIType *VTableHolder, StringRef UniqueIdentifier) {
381*9880d681SAndroid Build Coastguard Worker auto *R = DICompositeType::get(
382*9880d681SAndroid Build Coastguard Worker VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber,
383*9880d681SAndroid Build Coastguard Worker getNonCompileUnitScope(Context), DerivedFrom, SizeInBits, AlignInBits, 0,
384*9880d681SAndroid Build Coastguard Worker Flags, Elements, RunTimeLang, VTableHolder, nullptr, UniqueIdentifier);
385*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(R);
386*9880d681SAndroid Build Coastguard Worker return R;
387*9880d681SAndroid Build Coastguard Worker }
388*9880d681SAndroid Build Coastguard Worker
createUnionType(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,unsigned Flags,DINodeArray Elements,unsigned RunTimeLang,StringRef UniqueIdentifier)389*9880d681SAndroid Build Coastguard Worker DICompositeType *DIBuilder::createUnionType(
390*9880d681SAndroid Build Coastguard Worker DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
391*9880d681SAndroid Build Coastguard Worker uint64_t SizeInBits, uint64_t AlignInBits, unsigned Flags,
392*9880d681SAndroid Build Coastguard Worker DINodeArray Elements, unsigned RunTimeLang, StringRef UniqueIdentifier) {
393*9880d681SAndroid Build Coastguard Worker auto *R = DICompositeType::get(
394*9880d681SAndroid Build Coastguard Worker VMContext, dwarf::DW_TAG_union_type, Name, File, LineNumber,
395*9880d681SAndroid Build Coastguard Worker getNonCompileUnitScope(Scope), nullptr, SizeInBits, AlignInBits, 0, Flags,
396*9880d681SAndroid Build Coastguard Worker Elements, RunTimeLang, nullptr, nullptr, UniqueIdentifier);
397*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(R);
398*9880d681SAndroid Build Coastguard Worker return R;
399*9880d681SAndroid Build Coastguard Worker }
400*9880d681SAndroid Build Coastguard Worker
createSubroutineType(DITypeRefArray ParameterTypes,unsigned Flags,unsigned CC)401*9880d681SAndroid Build Coastguard Worker DISubroutineType *DIBuilder::createSubroutineType(DITypeRefArray ParameterTypes,
402*9880d681SAndroid Build Coastguard Worker unsigned Flags, unsigned CC) {
403*9880d681SAndroid Build Coastguard Worker return DISubroutineType::get(VMContext, Flags, CC, ParameterTypes);
404*9880d681SAndroid Build Coastguard Worker }
405*9880d681SAndroid Build Coastguard Worker
createExternalTypeRef(unsigned Tag,DIFile * File,StringRef UniqueIdentifier)406*9880d681SAndroid Build Coastguard Worker DICompositeType *DIBuilder::createExternalTypeRef(unsigned Tag, DIFile *File,
407*9880d681SAndroid Build Coastguard Worker StringRef UniqueIdentifier) {
408*9880d681SAndroid Build Coastguard Worker assert(!UniqueIdentifier.empty() && "external type ref without uid");
409*9880d681SAndroid Build Coastguard Worker return DICompositeType::get(VMContext, Tag, "", nullptr, 0, nullptr, nullptr,
410*9880d681SAndroid Build Coastguard Worker 0, 0, 0, DINode::FlagExternalTypeRef, nullptr, 0,
411*9880d681SAndroid Build Coastguard Worker nullptr, nullptr, UniqueIdentifier);
412*9880d681SAndroid Build Coastguard Worker }
413*9880d681SAndroid Build Coastguard Worker
createEnumerationType(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNumber,uint64_t SizeInBits,uint64_t AlignInBits,DINodeArray Elements,DIType * UnderlyingType,StringRef UniqueIdentifier)414*9880d681SAndroid Build Coastguard Worker DICompositeType *DIBuilder::createEnumerationType(
415*9880d681SAndroid Build Coastguard Worker DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
416*9880d681SAndroid Build Coastguard Worker uint64_t SizeInBits, uint64_t AlignInBits, DINodeArray Elements,
417*9880d681SAndroid Build Coastguard Worker DIType *UnderlyingType, StringRef UniqueIdentifier) {
418*9880d681SAndroid Build Coastguard Worker auto *CTy = DICompositeType::get(
419*9880d681SAndroid Build Coastguard Worker VMContext, dwarf::DW_TAG_enumeration_type, Name, File, LineNumber,
420*9880d681SAndroid Build Coastguard Worker getNonCompileUnitScope(Scope), UnderlyingType, SizeInBits, AlignInBits, 0,
421*9880d681SAndroid Build Coastguard Worker 0, Elements, 0, nullptr, nullptr, UniqueIdentifier);
422*9880d681SAndroid Build Coastguard Worker AllEnumTypes.push_back(CTy);
423*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(CTy);
424*9880d681SAndroid Build Coastguard Worker return CTy;
425*9880d681SAndroid Build Coastguard Worker }
426*9880d681SAndroid Build Coastguard Worker
createArrayType(uint64_t Size,uint64_t AlignInBits,DIType * Ty,DINodeArray Subscripts)427*9880d681SAndroid Build Coastguard Worker DICompositeType *DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
428*9880d681SAndroid Build Coastguard Worker DIType *Ty,
429*9880d681SAndroid Build Coastguard Worker DINodeArray Subscripts) {
430*9880d681SAndroid Build Coastguard Worker auto *R = DICompositeType::get(VMContext, dwarf::DW_TAG_array_type, "",
431*9880d681SAndroid Build Coastguard Worker nullptr, 0, nullptr, Ty, Size, AlignInBits, 0,
432*9880d681SAndroid Build Coastguard Worker 0, Subscripts, 0, nullptr);
433*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(R);
434*9880d681SAndroid Build Coastguard Worker return R;
435*9880d681SAndroid Build Coastguard Worker }
436*9880d681SAndroid Build Coastguard Worker
createVectorType(uint64_t Size,uint64_t AlignInBits,DIType * Ty,DINodeArray Subscripts)437*9880d681SAndroid Build Coastguard Worker DICompositeType *DIBuilder::createVectorType(uint64_t Size,
438*9880d681SAndroid Build Coastguard Worker uint64_t AlignInBits, DIType *Ty,
439*9880d681SAndroid Build Coastguard Worker DINodeArray Subscripts) {
440*9880d681SAndroid Build Coastguard Worker auto *R = DICompositeType::get(VMContext, dwarf::DW_TAG_array_type, "",
441*9880d681SAndroid Build Coastguard Worker nullptr, 0, nullptr, Ty, Size, AlignInBits, 0,
442*9880d681SAndroid Build Coastguard Worker DINode::FlagVector, Subscripts, 0, nullptr);
443*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(R);
444*9880d681SAndroid Build Coastguard Worker return R;
445*9880d681SAndroid Build Coastguard Worker }
446*9880d681SAndroid Build Coastguard Worker
createTypeWithFlags(LLVMContext & Context,DIType * Ty,unsigned FlagsToSet)447*9880d681SAndroid Build Coastguard Worker static DIType *createTypeWithFlags(LLVMContext &Context, DIType *Ty,
448*9880d681SAndroid Build Coastguard Worker unsigned FlagsToSet) {
449*9880d681SAndroid Build Coastguard Worker auto NewTy = Ty->clone();
450*9880d681SAndroid Build Coastguard Worker NewTy->setFlags(NewTy->getFlags() | FlagsToSet);
451*9880d681SAndroid Build Coastguard Worker return MDNode::replaceWithUniqued(std::move(NewTy));
452*9880d681SAndroid Build Coastguard Worker }
453*9880d681SAndroid Build Coastguard Worker
createArtificialType(DIType * Ty)454*9880d681SAndroid Build Coastguard Worker DIType *DIBuilder::createArtificialType(DIType *Ty) {
455*9880d681SAndroid Build Coastguard Worker // FIXME: Restrict this to the nodes where it's valid.
456*9880d681SAndroid Build Coastguard Worker if (Ty->isArtificial())
457*9880d681SAndroid Build Coastguard Worker return Ty;
458*9880d681SAndroid Build Coastguard Worker return createTypeWithFlags(VMContext, Ty, DINode::FlagArtificial);
459*9880d681SAndroid Build Coastguard Worker }
460*9880d681SAndroid Build Coastguard Worker
createObjectPointerType(DIType * Ty)461*9880d681SAndroid Build Coastguard Worker DIType *DIBuilder::createObjectPointerType(DIType *Ty) {
462*9880d681SAndroid Build Coastguard Worker // FIXME: Restrict this to the nodes where it's valid.
463*9880d681SAndroid Build Coastguard Worker if (Ty->isObjectPointer())
464*9880d681SAndroid Build Coastguard Worker return Ty;
465*9880d681SAndroid Build Coastguard Worker unsigned Flags = DINode::FlagObjectPointer | DINode::FlagArtificial;
466*9880d681SAndroid Build Coastguard Worker return createTypeWithFlags(VMContext, Ty, Flags);
467*9880d681SAndroid Build Coastguard Worker }
468*9880d681SAndroid Build Coastguard Worker
retainType(DIScope * T)469*9880d681SAndroid Build Coastguard Worker void DIBuilder::retainType(DIScope *T) {
470*9880d681SAndroid Build Coastguard Worker assert(T && "Expected non-null type");
471*9880d681SAndroid Build Coastguard Worker assert((isa<DIType>(T) || (isa<DISubprogram>(T) &&
472*9880d681SAndroid Build Coastguard Worker cast<DISubprogram>(T)->isDefinition() == false)) &&
473*9880d681SAndroid Build Coastguard Worker "Expected type or subprogram declaration");
474*9880d681SAndroid Build Coastguard Worker AllRetainTypes.emplace_back(T);
475*9880d681SAndroid Build Coastguard Worker }
476*9880d681SAndroid Build Coastguard Worker
createUnspecifiedParameter()477*9880d681SAndroid Build Coastguard Worker DIBasicType *DIBuilder::createUnspecifiedParameter() { return nullptr; }
478*9880d681SAndroid Build Coastguard Worker
479*9880d681SAndroid Build Coastguard Worker DICompositeType *
createForwardDecl(unsigned Tag,StringRef Name,DIScope * Scope,DIFile * F,unsigned Line,unsigned RuntimeLang,uint64_t SizeInBits,uint64_t AlignInBits,StringRef UniqueIdentifier)480*9880d681SAndroid Build Coastguard Worker DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, DIScope *Scope,
481*9880d681SAndroid Build Coastguard Worker DIFile *F, unsigned Line, unsigned RuntimeLang,
482*9880d681SAndroid Build Coastguard Worker uint64_t SizeInBits, uint64_t AlignInBits,
483*9880d681SAndroid Build Coastguard Worker StringRef UniqueIdentifier) {
484*9880d681SAndroid Build Coastguard Worker // FIXME: Define in terms of createReplaceableForwardDecl() by calling
485*9880d681SAndroid Build Coastguard Worker // replaceWithUniqued().
486*9880d681SAndroid Build Coastguard Worker auto *RetTy = DICompositeType::get(
487*9880d681SAndroid Build Coastguard Worker VMContext, Tag, Name, F, Line, getNonCompileUnitScope(Scope), nullptr,
488*9880d681SAndroid Build Coastguard Worker SizeInBits, AlignInBits, 0, DINode::FlagFwdDecl, nullptr, RuntimeLang,
489*9880d681SAndroid Build Coastguard Worker nullptr, nullptr, UniqueIdentifier);
490*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(RetTy);
491*9880d681SAndroid Build Coastguard Worker return RetTy;
492*9880d681SAndroid Build Coastguard Worker }
493*9880d681SAndroid Build Coastguard Worker
createReplaceableCompositeType(unsigned Tag,StringRef Name,DIScope * Scope,DIFile * F,unsigned Line,unsigned RuntimeLang,uint64_t SizeInBits,uint64_t AlignInBits,unsigned Flags,StringRef UniqueIdentifier)494*9880d681SAndroid Build Coastguard Worker DICompositeType *DIBuilder::createReplaceableCompositeType(
495*9880d681SAndroid Build Coastguard Worker unsigned Tag, StringRef Name, DIScope *Scope, DIFile *F, unsigned Line,
496*9880d681SAndroid Build Coastguard Worker unsigned RuntimeLang, uint64_t SizeInBits, uint64_t AlignInBits,
497*9880d681SAndroid Build Coastguard Worker unsigned Flags, StringRef UniqueIdentifier) {
498*9880d681SAndroid Build Coastguard Worker auto *RetTy =
499*9880d681SAndroid Build Coastguard Worker DICompositeType::getTemporary(
500*9880d681SAndroid Build Coastguard Worker VMContext, Tag, Name, F, Line, getNonCompileUnitScope(Scope), nullptr,
501*9880d681SAndroid Build Coastguard Worker SizeInBits, AlignInBits, 0, Flags, nullptr, RuntimeLang, nullptr,
502*9880d681SAndroid Build Coastguard Worker nullptr, UniqueIdentifier)
503*9880d681SAndroid Build Coastguard Worker .release();
504*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(RetTy);
505*9880d681SAndroid Build Coastguard Worker return RetTy;
506*9880d681SAndroid Build Coastguard Worker }
507*9880d681SAndroid Build Coastguard Worker
getOrCreateArray(ArrayRef<Metadata * > Elements)508*9880d681SAndroid Build Coastguard Worker DINodeArray DIBuilder::getOrCreateArray(ArrayRef<Metadata *> Elements) {
509*9880d681SAndroid Build Coastguard Worker return MDTuple::get(VMContext, Elements);
510*9880d681SAndroid Build Coastguard Worker }
511*9880d681SAndroid Build Coastguard Worker
getOrCreateTypeArray(ArrayRef<Metadata * > Elements)512*9880d681SAndroid Build Coastguard Worker DITypeRefArray DIBuilder::getOrCreateTypeArray(ArrayRef<Metadata *> Elements) {
513*9880d681SAndroid Build Coastguard Worker SmallVector<llvm::Metadata *, 16> Elts;
514*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
515*9880d681SAndroid Build Coastguard Worker if (Elements[i] && isa<MDNode>(Elements[i]))
516*9880d681SAndroid Build Coastguard Worker Elts.push_back(cast<DIType>(Elements[i]));
517*9880d681SAndroid Build Coastguard Worker else
518*9880d681SAndroid Build Coastguard Worker Elts.push_back(Elements[i]);
519*9880d681SAndroid Build Coastguard Worker }
520*9880d681SAndroid Build Coastguard Worker return DITypeRefArray(MDNode::get(VMContext, Elts));
521*9880d681SAndroid Build Coastguard Worker }
522*9880d681SAndroid Build Coastguard Worker
getOrCreateSubrange(int64_t Lo,int64_t Count)523*9880d681SAndroid Build Coastguard Worker DISubrange *DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
524*9880d681SAndroid Build Coastguard Worker return DISubrange::get(VMContext, Count, Lo);
525*9880d681SAndroid Build Coastguard Worker }
526*9880d681SAndroid Build Coastguard Worker
checkGlobalVariableScope(DIScope * Context)527*9880d681SAndroid Build Coastguard Worker static void checkGlobalVariableScope(DIScope *Context) {
528*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
529*9880d681SAndroid Build Coastguard Worker if (auto *CT =
530*9880d681SAndroid Build Coastguard Worker dyn_cast_or_null<DICompositeType>(getNonCompileUnitScope(Context)))
531*9880d681SAndroid Build Coastguard Worker assert(CT->getIdentifier().empty() &&
532*9880d681SAndroid Build Coastguard Worker "Context of a global variable should not be a type with identifier");
533*9880d681SAndroid Build Coastguard Worker #endif
534*9880d681SAndroid Build Coastguard Worker }
535*9880d681SAndroid Build Coastguard Worker
createGlobalVariable(DIScope * Context,StringRef Name,StringRef LinkageName,DIFile * F,unsigned LineNumber,DIType * Ty,bool isLocalToUnit,Constant * Val,MDNode * Decl)536*9880d681SAndroid Build Coastguard Worker DIGlobalVariable *DIBuilder::createGlobalVariable(
537*9880d681SAndroid Build Coastguard Worker DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F,
538*9880d681SAndroid Build Coastguard Worker unsigned LineNumber, DIType *Ty, bool isLocalToUnit, Constant *Val,
539*9880d681SAndroid Build Coastguard Worker MDNode *Decl) {
540*9880d681SAndroid Build Coastguard Worker checkGlobalVariableScope(Context);
541*9880d681SAndroid Build Coastguard Worker
542*9880d681SAndroid Build Coastguard Worker auto *N = DIGlobalVariable::getDistinct(
543*9880d681SAndroid Build Coastguard Worker VMContext, cast_or_null<DIScope>(Context), Name, LinkageName, F,
544*9880d681SAndroid Build Coastguard Worker LineNumber, Ty, isLocalToUnit, true, Val,
545*9880d681SAndroid Build Coastguard Worker cast_or_null<DIDerivedType>(Decl));
546*9880d681SAndroid Build Coastguard Worker AllGVs.push_back(N);
547*9880d681SAndroid Build Coastguard Worker return N;
548*9880d681SAndroid Build Coastguard Worker }
549*9880d681SAndroid Build Coastguard Worker
createTempGlobalVariableFwdDecl(DIScope * Context,StringRef Name,StringRef LinkageName,DIFile * F,unsigned LineNumber,DIType * Ty,bool isLocalToUnit,Constant * Val,MDNode * Decl)550*9880d681SAndroid Build Coastguard Worker DIGlobalVariable *DIBuilder::createTempGlobalVariableFwdDecl(
551*9880d681SAndroid Build Coastguard Worker DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F,
552*9880d681SAndroid Build Coastguard Worker unsigned LineNumber, DIType *Ty, bool isLocalToUnit, Constant *Val,
553*9880d681SAndroid Build Coastguard Worker MDNode *Decl) {
554*9880d681SAndroid Build Coastguard Worker checkGlobalVariableScope(Context);
555*9880d681SAndroid Build Coastguard Worker
556*9880d681SAndroid Build Coastguard Worker return DIGlobalVariable::getTemporary(
557*9880d681SAndroid Build Coastguard Worker VMContext, cast_or_null<DIScope>(Context), Name, LinkageName, F,
558*9880d681SAndroid Build Coastguard Worker LineNumber, Ty, isLocalToUnit, false, Val,
559*9880d681SAndroid Build Coastguard Worker cast_or_null<DIDerivedType>(Decl))
560*9880d681SAndroid Build Coastguard Worker .release();
561*9880d681SAndroid Build Coastguard Worker }
562*9880d681SAndroid Build Coastguard Worker
createLocalVariable(LLVMContext & VMContext,DenseMap<MDNode *,SmallVector<TrackingMDNodeRef,1>> & PreservedVariables,DIScope * Scope,StringRef Name,unsigned ArgNo,DIFile * File,unsigned LineNo,DIType * Ty,bool AlwaysPreserve,unsigned Flags)563*9880d681SAndroid Build Coastguard Worker static DILocalVariable *createLocalVariable(
564*9880d681SAndroid Build Coastguard Worker LLVMContext &VMContext,
565*9880d681SAndroid Build Coastguard Worker DenseMap<MDNode *, SmallVector<TrackingMDNodeRef, 1>> &PreservedVariables,
566*9880d681SAndroid Build Coastguard Worker DIScope *Scope, StringRef Name, unsigned ArgNo, DIFile *File,
567*9880d681SAndroid Build Coastguard Worker unsigned LineNo, DIType *Ty, bool AlwaysPreserve, unsigned Flags) {
568*9880d681SAndroid Build Coastguard Worker // FIXME: Why getNonCompileUnitScope()?
569*9880d681SAndroid Build Coastguard Worker // FIXME: Why is "!Context" okay here?
570*9880d681SAndroid Build Coastguard Worker // FIXME: Why doesn't this check for a subprogram or lexical block (AFAICT
571*9880d681SAndroid Build Coastguard Worker // the only valid scopes)?
572*9880d681SAndroid Build Coastguard Worker DIScope *Context = getNonCompileUnitScope(Scope);
573*9880d681SAndroid Build Coastguard Worker
574*9880d681SAndroid Build Coastguard Worker auto *Node =
575*9880d681SAndroid Build Coastguard Worker DILocalVariable::get(VMContext, cast_or_null<DILocalScope>(Context), Name,
576*9880d681SAndroid Build Coastguard Worker File, LineNo, Ty, ArgNo, Flags);
577*9880d681SAndroid Build Coastguard Worker if (AlwaysPreserve) {
578*9880d681SAndroid Build Coastguard Worker // The optimizer may remove local variables. If there is an interest
579*9880d681SAndroid Build Coastguard Worker // to preserve variable info in such situation then stash it in a
580*9880d681SAndroid Build Coastguard Worker // named mdnode.
581*9880d681SAndroid Build Coastguard Worker DISubprogram *Fn = getDISubprogram(Scope);
582*9880d681SAndroid Build Coastguard Worker assert(Fn && "Missing subprogram for local variable");
583*9880d681SAndroid Build Coastguard Worker PreservedVariables[Fn].emplace_back(Node);
584*9880d681SAndroid Build Coastguard Worker }
585*9880d681SAndroid Build Coastguard Worker return Node;
586*9880d681SAndroid Build Coastguard Worker }
587*9880d681SAndroid Build Coastguard Worker
createAutoVariable(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNo,DIType * Ty,bool AlwaysPreserve,unsigned Flags)588*9880d681SAndroid Build Coastguard Worker DILocalVariable *DIBuilder::createAutoVariable(DIScope *Scope, StringRef Name,
589*9880d681SAndroid Build Coastguard Worker DIFile *File, unsigned LineNo,
590*9880d681SAndroid Build Coastguard Worker DIType *Ty, bool AlwaysPreserve,
591*9880d681SAndroid Build Coastguard Worker unsigned Flags) {
592*9880d681SAndroid Build Coastguard Worker return createLocalVariable(VMContext, PreservedVariables, Scope, Name,
593*9880d681SAndroid Build Coastguard Worker /* ArgNo */ 0, File, LineNo, Ty, AlwaysPreserve,
594*9880d681SAndroid Build Coastguard Worker Flags);
595*9880d681SAndroid Build Coastguard Worker }
596*9880d681SAndroid Build Coastguard Worker
createParameterVariable(DIScope * Scope,StringRef Name,unsigned ArgNo,DIFile * File,unsigned LineNo,DIType * Ty,bool AlwaysPreserve,unsigned Flags)597*9880d681SAndroid Build Coastguard Worker DILocalVariable *DIBuilder::createParameterVariable(
598*9880d681SAndroid Build Coastguard Worker DIScope *Scope, StringRef Name, unsigned ArgNo, DIFile *File,
599*9880d681SAndroid Build Coastguard Worker unsigned LineNo, DIType *Ty, bool AlwaysPreserve, unsigned Flags) {
600*9880d681SAndroid Build Coastguard Worker assert(ArgNo && "Expected non-zero argument number for parameter");
601*9880d681SAndroid Build Coastguard Worker return createLocalVariable(VMContext, PreservedVariables, Scope, Name, ArgNo,
602*9880d681SAndroid Build Coastguard Worker File, LineNo, Ty, AlwaysPreserve, Flags);
603*9880d681SAndroid Build Coastguard Worker }
604*9880d681SAndroid Build Coastguard Worker
createExpression(ArrayRef<uint64_t> Addr)605*9880d681SAndroid Build Coastguard Worker DIExpression *DIBuilder::createExpression(ArrayRef<uint64_t> Addr) {
606*9880d681SAndroid Build Coastguard Worker return DIExpression::get(VMContext, Addr);
607*9880d681SAndroid Build Coastguard Worker }
608*9880d681SAndroid Build Coastguard Worker
createExpression(ArrayRef<int64_t> Signed)609*9880d681SAndroid Build Coastguard Worker DIExpression *DIBuilder::createExpression(ArrayRef<int64_t> Signed) {
610*9880d681SAndroid Build Coastguard Worker // TODO: Remove the callers of this signed version and delete.
611*9880d681SAndroid Build Coastguard Worker SmallVector<uint64_t, 8> Addr(Signed.begin(), Signed.end());
612*9880d681SAndroid Build Coastguard Worker return createExpression(Addr);
613*9880d681SAndroid Build Coastguard Worker }
614*9880d681SAndroid Build Coastguard Worker
createBitPieceExpression(unsigned OffsetInBytes,unsigned SizeInBytes)615*9880d681SAndroid Build Coastguard Worker DIExpression *DIBuilder::createBitPieceExpression(unsigned OffsetInBytes,
616*9880d681SAndroid Build Coastguard Worker unsigned SizeInBytes) {
617*9880d681SAndroid Build Coastguard Worker uint64_t Addr[] = {dwarf::DW_OP_bit_piece, OffsetInBytes, SizeInBytes};
618*9880d681SAndroid Build Coastguard Worker return DIExpression::get(VMContext, Addr);
619*9880d681SAndroid Build Coastguard Worker }
620*9880d681SAndroid Build Coastguard Worker
621*9880d681SAndroid Build Coastguard Worker template <class... Ts>
getSubprogram(bool IsDistinct,Ts &&...Args)622*9880d681SAndroid Build Coastguard Worker static DISubprogram *getSubprogram(bool IsDistinct, Ts &&... Args) {
623*9880d681SAndroid Build Coastguard Worker if (IsDistinct)
624*9880d681SAndroid Build Coastguard Worker return DISubprogram::getDistinct(std::forward<Ts>(Args)...);
625*9880d681SAndroid Build Coastguard Worker return DISubprogram::get(std::forward<Ts>(Args)...);
626*9880d681SAndroid Build Coastguard Worker }
627*9880d681SAndroid Build Coastguard Worker
createFunction(DIScope * Context,StringRef Name,StringRef LinkageName,DIFile * File,unsigned LineNo,DISubroutineType * Ty,bool isLocalToUnit,bool isDefinition,unsigned ScopeLine,unsigned Flags,bool isOptimized,DITemplateParameterArray TParams,DISubprogram * Decl)628*9880d681SAndroid Build Coastguard Worker DISubprogram *DIBuilder::createFunction(
629*9880d681SAndroid Build Coastguard Worker DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *File,
630*9880d681SAndroid Build Coastguard Worker unsigned LineNo, DISubroutineType *Ty, bool isLocalToUnit,
631*9880d681SAndroid Build Coastguard Worker bool isDefinition, unsigned ScopeLine, unsigned Flags, bool isOptimized,
632*9880d681SAndroid Build Coastguard Worker DITemplateParameterArray TParams, DISubprogram *Decl) {
633*9880d681SAndroid Build Coastguard Worker auto *Node = getSubprogram(
634*9880d681SAndroid Build Coastguard Worker /* IsDistinct = */ isDefinition, VMContext,
635*9880d681SAndroid Build Coastguard Worker getNonCompileUnitScope(Context), Name, LinkageName, File, LineNo, Ty,
636*9880d681SAndroid Build Coastguard Worker isLocalToUnit, isDefinition, ScopeLine, nullptr, 0, 0, 0, Flags,
637*9880d681SAndroid Build Coastguard Worker isOptimized, isDefinition ? CUNode : nullptr, TParams, Decl,
638*9880d681SAndroid Build Coastguard Worker MDTuple::getTemporary(VMContext, None).release());
639*9880d681SAndroid Build Coastguard Worker
640*9880d681SAndroid Build Coastguard Worker if (isDefinition)
641*9880d681SAndroid Build Coastguard Worker AllSubprograms.push_back(Node);
642*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(Node);
643*9880d681SAndroid Build Coastguard Worker return Node;
644*9880d681SAndroid Build Coastguard Worker }
645*9880d681SAndroid Build Coastguard Worker
createTempFunctionFwdDecl(DIScope * Context,StringRef Name,StringRef LinkageName,DIFile * File,unsigned LineNo,DISubroutineType * Ty,bool isLocalToUnit,bool isDefinition,unsigned ScopeLine,unsigned Flags,bool isOptimized,DITemplateParameterArray TParams,DISubprogram * Decl)646*9880d681SAndroid Build Coastguard Worker DISubprogram *DIBuilder::createTempFunctionFwdDecl(
647*9880d681SAndroid Build Coastguard Worker DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *File,
648*9880d681SAndroid Build Coastguard Worker unsigned LineNo, DISubroutineType *Ty, bool isLocalToUnit,
649*9880d681SAndroid Build Coastguard Worker bool isDefinition, unsigned ScopeLine, unsigned Flags, bool isOptimized,
650*9880d681SAndroid Build Coastguard Worker DITemplateParameterArray TParams, DISubprogram *Decl) {
651*9880d681SAndroid Build Coastguard Worker return DISubprogram::getTemporary(
652*9880d681SAndroid Build Coastguard Worker VMContext, getNonCompileUnitScope(Context), Name, LinkageName,
653*9880d681SAndroid Build Coastguard Worker File, LineNo, Ty, isLocalToUnit, isDefinition, ScopeLine, nullptr,
654*9880d681SAndroid Build Coastguard Worker 0, 0, 0, Flags, isOptimized, isDefinition ? CUNode : nullptr,
655*9880d681SAndroid Build Coastguard Worker TParams, Decl, nullptr)
656*9880d681SAndroid Build Coastguard Worker .release();
657*9880d681SAndroid Build Coastguard Worker }
658*9880d681SAndroid Build Coastguard Worker
659*9880d681SAndroid Build Coastguard Worker DISubprogram *
createMethod(DIScope * Context,StringRef Name,StringRef LinkageName,DIFile * F,unsigned LineNo,DISubroutineType * Ty,bool isLocalToUnit,bool isDefinition,unsigned VK,unsigned VIndex,int ThisAdjustment,DIType * VTableHolder,unsigned Flags,bool isOptimized,DITemplateParameterArray TParams)660*9880d681SAndroid Build Coastguard Worker DIBuilder::createMethod(DIScope *Context, StringRef Name, StringRef LinkageName,
661*9880d681SAndroid Build Coastguard Worker DIFile *F, unsigned LineNo, DISubroutineType *Ty,
662*9880d681SAndroid Build Coastguard Worker bool isLocalToUnit, bool isDefinition, unsigned VK,
663*9880d681SAndroid Build Coastguard Worker unsigned VIndex, int ThisAdjustment,
664*9880d681SAndroid Build Coastguard Worker DIType *VTableHolder, unsigned Flags, bool isOptimized,
665*9880d681SAndroid Build Coastguard Worker DITemplateParameterArray TParams) {
666*9880d681SAndroid Build Coastguard Worker assert(getNonCompileUnitScope(Context) &&
667*9880d681SAndroid Build Coastguard Worker "Methods should have both a Context and a context that isn't "
668*9880d681SAndroid Build Coastguard Worker "the compile unit.");
669*9880d681SAndroid Build Coastguard Worker // FIXME: Do we want to use different scope/lines?
670*9880d681SAndroid Build Coastguard Worker auto *SP = getSubprogram(
671*9880d681SAndroid Build Coastguard Worker /* IsDistinct = */ isDefinition, VMContext, cast<DIScope>(Context), Name,
672*9880d681SAndroid Build Coastguard Worker LinkageName, F, LineNo, Ty, isLocalToUnit, isDefinition, LineNo,
673*9880d681SAndroid Build Coastguard Worker VTableHolder, VK, VIndex, ThisAdjustment, Flags, isOptimized,
674*9880d681SAndroid Build Coastguard Worker isDefinition ? CUNode : nullptr, TParams, nullptr, nullptr);
675*9880d681SAndroid Build Coastguard Worker
676*9880d681SAndroid Build Coastguard Worker if (isDefinition)
677*9880d681SAndroid Build Coastguard Worker AllSubprograms.push_back(SP);
678*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(SP);
679*9880d681SAndroid Build Coastguard Worker return SP;
680*9880d681SAndroid Build Coastguard Worker }
681*9880d681SAndroid Build Coastguard Worker
createNameSpace(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNo)682*9880d681SAndroid Build Coastguard Worker DINamespace *DIBuilder::createNameSpace(DIScope *Scope, StringRef Name,
683*9880d681SAndroid Build Coastguard Worker DIFile *File, unsigned LineNo) {
684*9880d681SAndroid Build Coastguard Worker return DINamespace::get(VMContext, getNonCompileUnitScope(Scope), File, Name,
685*9880d681SAndroid Build Coastguard Worker LineNo);
686*9880d681SAndroid Build Coastguard Worker }
687*9880d681SAndroid Build Coastguard Worker
createModule(DIScope * Scope,StringRef Name,StringRef ConfigurationMacros,StringRef IncludePath,StringRef ISysRoot)688*9880d681SAndroid Build Coastguard Worker DIModule *DIBuilder::createModule(DIScope *Scope, StringRef Name,
689*9880d681SAndroid Build Coastguard Worker StringRef ConfigurationMacros,
690*9880d681SAndroid Build Coastguard Worker StringRef IncludePath,
691*9880d681SAndroid Build Coastguard Worker StringRef ISysRoot) {
692*9880d681SAndroid Build Coastguard Worker return DIModule::get(VMContext, getNonCompileUnitScope(Scope), Name,
693*9880d681SAndroid Build Coastguard Worker ConfigurationMacros, IncludePath, ISysRoot);
694*9880d681SAndroid Build Coastguard Worker }
695*9880d681SAndroid Build Coastguard Worker
createLexicalBlockFile(DIScope * Scope,DIFile * File,unsigned Discriminator)696*9880d681SAndroid Build Coastguard Worker DILexicalBlockFile *DIBuilder::createLexicalBlockFile(DIScope *Scope,
697*9880d681SAndroid Build Coastguard Worker DIFile *File,
698*9880d681SAndroid Build Coastguard Worker unsigned Discriminator) {
699*9880d681SAndroid Build Coastguard Worker return DILexicalBlockFile::get(VMContext, Scope, File, Discriminator);
700*9880d681SAndroid Build Coastguard Worker }
701*9880d681SAndroid Build Coastguard Worker
createLexicalBlock(DIScope * Scope,DIFile * File,unsigned Line,unsigned Col)702*9880d681SAndroid Build Coastguard Worker DILexicalBlock *DIBuilder::createLexicalBlock(DIScope *Scope, DIFile *File,
703*9880d681SAndroid Build Coastguard Worker unsigned Line, unsigned Col) {
704*9880d681SAndroid Build Coastguard Worker // Make these distinct, to avoid merging two lexical blocks on the same
705*9880d681SAndroid Build Coastguard Worker // file/line/column.
706*9880d681SAndroid Build Coastguard Worker return DILexicalBlock::getDistinct(VMContext, getNonCompileUnitScope(Scope),
707*9880d681SAndroid Build Coastguard Worker File, Line, Col);
708*9880d681SAndroid Build Coastguard Worker }
709*9880d681SAndroid Build Coastguard Worker
getDbgIntrinsicValueImpl(LLVMContext & VMContext,Value * V)710*9880d681SAndroid Build Coastguard Worker static Value *getDbgIntrinsicValueImpl(LLVMContext &VMContext, Value *V) {
711*9880d681SAndroid Build Coastguard Worker assert(V && "no value passed to dbg intrinsic");
712*9880d681SAndroid Build Coastguard Worker return MetadataAsValue::get(VMContext, ValueAsMetadata::get(V));
713*9880d681SAndroid Build Coastguard Worker }
714*9880d681SAndroid Build Coastguard Worker
withDebugLoc(Instruction * I,const DILocation * DL)715*9880d681SAndroid Build Coastguard Worker static Instruction *withDebugLoc(Instruction *I, const DILocation *DL) {
716*9880d681SAndroid Build Coastguard Worker I->setDebugLoc(const_cast<DILocation *>(DL));
717*9880d681SAndroid Build Coastguard Worker return I;
718*9880d681SAndroid Build Coastguard Worker }
719*9880d681SAndroid Build Coastguard Worker
insertDeclare(Value * Storage,DILocalVariable * VarInfo,DIExpression * Expr,const DILocation * DL,Instruction * InsertBefore)720*9880d681SAndroid Build Coastguard Worker Instruction *DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo,
721*9880d681SAndroid Build Coastguard Worker DIExpression *Expr, const DILocation *DL,
722*9880d681SAndroid Build Coastguard Worker Instruction *InsertBefore) {
723*9880d681SAndroid Build Coastguard Worker assert(VarInfo && "empty or invalid DILocalVariable* passed to dbg.declare");
724*9880d681SAndroid Build Coastguard Worker assert(DL && "Expected debug loc");
725*9880d681SAndroid Build Coastguard Worker assert(DL->getScope()->getSubprogram() ==
726*9880d681SAndroid Build Coastguard Worker VarInfo->getScope()->getSubprogram() &&
727*9880d681SAndroid Build Coastguard Worker "Expected matching subprograms");
728*9880d681SAndroid Build Coastguard Worker if (!DeclareFn)
729*9880d681SAndroid Build Coastguard Worker DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
730*9880d681SAndroid Build Coastguard Worker
731*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(VarInfo);
732*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(Expr);
733*9880d681SAndroid Build Coastguard Worker Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
734*9880d681SAndroid Build Coastguard Worker MetadataAsValue::get(VMContext, VarInfo),
735*9880d681SAndroid Build Coastguard Worker MetadataAsValue::get(VMContext, Expr)};
736*9880d681SAndroid Build Coastguard Worker return withDebugLoc(CallInst::Create(DeclareFn, Args, "", InsertBefore), DL);
737*9880d681SAndroid Build Coastguard Worker }
738*9880d681SAndroid Build Coastguard Worker
insertDeclare(Value * Storage,DILocalVariable * VarInfo,DIExpression * Expr,const DILocation * DL,BasicBlock * InsertAtEnd)739*9880d681SAndroid Build Coastguard Worker Instruction *DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo,
740*9880d681SAndroid Build Coastguard Worker DIExpression *Expr, const DILocation *DL,
741*9880d681SAndroid Build Coastguard Worker BasicBlock *InsertAtEnd) {
742*9880d681SAndroid Build Coastguard Worker assert(VarInfo && "empty or invalid DILocalVariable* passed to dbg.declare");
743*9880d681SAndroid Build Coastguard Worker assert(DL && "Expected debug loc");
744*9880d681SAndroid Build Coastguard Worker assert(DL->getScope()->getSubprogram() ==
745*9880d681SAndroid Build Coastguard Worker VarInfo->getScope()->getSubprogram() &&
746*9880d681SAndroid Build Coastguard Worker "Expected matching subprograms");
747*9880d681SAndroid Build Coastguard Worker if (!DeclareFn)
748*9880d681SAndroid Build Coastguard Worker DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
749*9880d681SAndroid Build Coastguard Worker
750*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(VarInfo);
751*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(Expr);
752*9880d681SAndroid Build Coastguard Worker Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
753*9880d681SAndroid Build Coastguard Worker MetadataAsValue::get(VMContext, VarInfo),
754*9880d681SAndroid Build Coastguard Worker MetadataAsValue::get(VMContext, Expr)};
755*9880d681SAndroid Build Coastguard Worker
756*9880d681SAndroid Build Coastguard Worker // If this block already has a terminator then insert this intrinsic
757*9880d681SAndroid Build Coastguard Worker // before the terminator.
758*9880d681SAndroid Build Coastguard Worker if (TerminatorInst *T = InsertAtEnd->getTerminator())
759*9880d681SAndroid Build Coastguard Worker return withDebugLoc(CallInst::Create(DeclareFn, Args, "", T), DL);
760*9880d681SAndroid Build Coastguard Worker return withDebugLoc(CallInst::Create(DeclareFn, Args, "", InsertAtEnd), DL);
761*9880d681SAndroid Build Coastguard Worker }
762*9880d681SAndroid Build Coastguard Worker
insertDbgValueIntrinsic(Value * V,uint64_t Offset,DILocalVariable * VarInfo,DIExpression * Expr,const DILocation * DL,Instruction * InsertBefore)763*9880d681SAndroid Build Coastguard Worker Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
764*9880d681SAndroid Build Coastguard Worker DILocalVariable *VarInfo,
765*9880d681SAndroid Build Coastguard Worker DIExpression *Expr,
766*9880d681SAndroid Build Coastguard Worker const DILocation *DL,
767*9880d681SAndroid Build Coastguard Worker Instruction *InsertBefore) {
768*9880d681SAndroid Build Coastguard Worker assert(V && "no value passed to dbg.value");
769*9880d681SAndroid Build Coastguard Worker assert(VarInfo && "empty or invalid DILocalVariable* passed to dbg.value");
770*9880d681SAndroid Build Coastguard Worker assert(DL && "Expected debug loc");
771*9880d681SAndroid Build Coastguard Worker assert(DL->getScope()->getSubprogram() ==
772*9880d681SAndroid Build Coastguard Worker VarInfo->getScope()->getSubprogram() &&
773*9880d681SAndroid Build Coastguard Worker "Expected matching subprograms");
774*9880d681SAndroid Build Coastguard Worker if (!ValueFn)
775*9880d681SAndroid Build Coastguard Worker ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
776*9880d681SAndroid Build Coastguard Worker
777*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(VarInfo);
778*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(Expr);
779*9880d681SAndroid Build Coastguard Worker Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
780*9880d681SAndroid Build Coastguard Worker ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
781*9880d681SAndroid Build Coastguard Worker MetadataAsValue::get(VMContext, VarInfo),
782*9880d681SAndroid Build Coastguard Worker MetadataAsValue::get(VMContext, Expr)};
783*9880d681SAndroid Build Coastguard Worker return withDebugLoc(CallInst::Create(ValueFn, Args, "", InsertBefore), DL);
784*9880d681SAndroid Build Coastguard Worker }
785*9880d681SAndroid Build Coastguard Worker
insertDbgValueIntrinsic(Value * V,uint64_t Offset,DILocalVariable * VarInfo,DIExpression * Expr,const DILocation * DL,BasicBlock * InsertAtEnd)786*9880d681SAndroid Build Coastguard Worker Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, uint64_t Offset,
787*9880d681SAndroid Build Coastguard Worker DILocalVariable *VarInfo,
788*9880d681SAndroid Build Coastguard Worker DIExpression *Expr,
789*9880d681SAndroid Build Coastguard Worker const DILocation *DL,
790*9880d681SAndroid Build Coastguard Worker BasicBlock *InsertAtEnd) {
791*9880d681SAndroid Build Coastguard Worker assert(V && "no value passed to dbg.value");
792*9880d681SAndroid Build Coastguard Worker assert(VarInfo && "empty or invalid DILocalVariable* passed to dbg.value");
793*9880d681SAndroid Build Coastguard Worker assert(DL && "Expected debug loc");
794*9880d681SAndroid Build Coastguard Worker assert(DL->getScope()->getSubprogram() ==
795*9880d681SAndroid Build Coastguard Worker VarInfo->getScope()->getSubprogram() &&
796*9880d681SAndroid Build Coastguard Worker "Expected matching subprograms");
797*9880d681SAndroid Build Coastguard Worker if (!ValueFn)
798*9880d681SAndroid Build Coastguard Worker ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
799*9880d681SAndroid Build Coastguard Worker
800*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(VarInfo);
801*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(Expr);
802*9880d681SAndroid Build Coastguard Worker Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
803*9880d681SAndroid Build Coastguard Worker ConstantInt::get(Type::getInt64Ty(VMContext), Offset),
804*9880d681SAndroid Build Coastguard Worker MetadataAsValue::get(VMContext, VarInfo),
805*9880d681SAndroid Build Coastguard Worker MetadataAsValue::get(VMContext, Expr)};
806*9880d681SAndroid Build Coastguard Worker
807*9880d681SAndroid Build Coastguard Worker return withDebugLoc(CallInst::Create(ValueFn, Args, "", InsertAtEnd), DL);
808*9880d681SAndroid Build Coastguard Worker }
809*9880d681SAndroid Build Coastguard Worker
replaceVTableHolder(DICompositeType * & T,DICompositeType * VTableHolder)810*9880d681SAndroid Build Coastguard Worker void DIBuilder::replaceVTableHolder(DICompositeType *&T,
811*9880d681SAndroid Build Coastguard Worker DICompositeType *VTableHolder) {
812*9880d681SAndroid Build Coastguard Worker {
813*9880d681SAndroid Build Coastguard Worker TypedTrackingMDRef<DICompositeType> N(T);
814*9880d681SAndroid Build Coastguard Worker N->replaceVTableHolder(VTableHolder);
815*9880d681SAndroid Build Coastguard Worker T = N.get();
816*9880d681SAndroid Build Coastguard Worker }
817*9880d681SAndroid Build Coastguard Worker
818*9880d681SAndroid Build Coastguard Worker // If this didn't create a self-reference, just return.
819*9880d681SAndroid Build Coastguard Worker if (T != VTableHolder)
820*9880d681SAndroid Build Coastguard Worker return;
821*9880d681SAndroid Build Coastguard Worker
822*9880d681SAndroid Build Coastguard Worker // Look for unresolved operands. T will drop RAUW support, orphaning any
823*9880d681SAndroid Build Coastguard Worker // cycles underneath it.
824*9880d681SAndroid Build Coastguard Worker if (T->isResolved())
825*9880d681SAndroid Build Coastguard Worker for (const MDOperand &O : T->operands())
826*9880d681SAndroid Build Coastguard Worker if (auto *N = dyn_cast_or_null<MDNode>(O))
827*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(N);
828*9880d681SAndroid Build Coastguard Worker }
829*9880d681SAndroid Build Coastguard Worker
replaceArrays(DICompositeType * & T,DINodeArray Elements,DINodeArray TParams)830*9880d681SAndroid Build Coastguard Worker void DIBuilder::replaceArrays(DICompositeType *&T, DINodeArray Elements,
831*9880d681SAndroid Build Coastguard Worker DINodeArray TParams) {
832*9880d681SAndroid Build Coastguard Worker {
833*9880d681SAndroid Build Coastguard Worker TypedTrackingMDRef<DICompositeType> N(T);
834*9880d681SAndroid Build Coastguard Worker if (Elements)
835*9880d681SAndroid Build Coastguard Worker N->replaceElements(Elements);
836*9880d681SAndroid Build Coastguard Worker if (TParams)
837*9880d681SAndroid Build Coastguard Worker N->replaceTemplateParams(DITemplateParameterArray(TParams));
838*9880d681SAndroid Build Coastguard Worker T = N.get();
839*9880d681SAndroid Build Coastguard Worker }
840*9880d681SAndroid Build Coastguard Worker
841*9880d681SAndroid Build Coastguard Worker // If T isn't resolved, there's no problem.
842*9880d681SAndroid Build Coastguard Worker if (!T->isResolved())
843*9880d681SAndroid Build Coastguard Worker return;
844*9880d681SAndroid Build Coastguard Worker
845*9880d681SAndroid Build Coastguard Worker // If T is resolved, it may be due to a self-reference cycle. Track the
846*9880d681SAndroid Build Coastguard Worker // arrays explicitly if they're unresolved, or else the cycles will be
847*9880d681SAndroid Build Coastguard Worker // orphaned.
848*9880d681SAndroid Build Coastguard Worker if (Elements)
849*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(Elements.get());
850*9880d681SAndroid Build Coastguard Worker if (TParams)
851*9880d681SAndroid Build Coastguard Worker trackIfUnresolved(TParams.get());
852*9880d681SAndroid Build Coastguard Worker }
853