1ef860a24SChandler Carruth //===--- DIBuilder.cpp - Debug Information Builder ------------------------===//
2ef860a24SChandler Carruth //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ef860a24SChandler Carruth //
7ef860a24SChandler Carruth //===----------------------------------------------------------------------===//
8ef860a24SChandler Carruth //
9ef860a24SChandler Carruth // This file implements the DIBuilder.
10ef860a24SChandler Carruth //
11ef860a24SChandler Carruth //===----------------------------------------------------------------------===//
12ef860a24SChandler Carruth 
1312664a0bSChandler Carruth #include "llvm/IR/DIBuilder.h"
146bda14b3SChandler Carruth #include "LLVMContextImpl.h"
1516c7bdafSScott Linder #include "llvm/ADT/Optional.h"
16264b5d9eSZachary Turner #include "llvm/BinaryFormat/Dwarf.h"
179fb823bbSChandler Carruth #include "llvm/IR/Constants.h"
189a4c9e59SChandler Carruth #include "llvm/IR/DebugInfo.h"
194c1a1d3cSReid Kleckner #include "llvm/IR/IRBuilder.h"
209fb823bbSChandler Carruth #include "llvm/IR/Module.h"
214c1a1d3cSReid Kleckner #include "llvm/Support/CommandLine.h"
22ef860a24SChandler Carruth 
23ef860a24SChandler Carruth using namespace llvm;
24ef860a24SChandler Carruth using namespace llvm::dwarf;
25ef860a24SChandler Carruth 
26dc5f805dSBenjamin Kramer static cl::opt<bool>
270fe506bcSReid Kleckner     UseDbgAddr("use-dbg-addr",
280fe506bcSReid Kleckner                llvm::cl::desc("Use llvm.dbg.addr for all local variables"),
298065f0b9SZachary Turner                cl::init(false), cl::Hidden);
300fe506bcSReid Kleckner 
DIBuilder(Module & m,bool AllowUnresolvedNodes,DICompileUnit * CU)31a499c3c2SJessica Paquette DIBuilder::DIBuilder(Module &m, bool AllowUnresolvedNodes, DICompileUnit *CU)
32665b4138SLuís Ferreira     : M(m), VMContext(M.getContext()), CUNode(CU), DeclareFn(nullptr),
337ed95d15SMichael Gottesman       ValueFn(nullptr), LabelFn(nullptr), AddrFn(nullptr),
340150645bSEllis Hoag       AllowUnresolvedNodes(AllowUnresolvedNodes) {
350150645bSEllis Hoag   if (CUNode) {
360150645bSEllis Hoag     if (const auto &ETs = CUNode->getEnumTypes())
370150645bSEllis Hoag       AllEnumTypes.assign(ETs.begin(), ETs.end());
380150645bSEllis Hoag     if (const auto &RTs = CUNode->getRetainedTypes())
390150645bSEllis Hoag       AllRetainTypes.assign(RTs.begin(), RTs.end());
400150645bSEllis Hoag     if (const auto &GVs = CUNode->getGlobalVariables())
410150645bSEllis Hoag       AllGVs.assign(GVs.begin(), GVs.end());
420150645bSEllis Hoag     if (const auto &IMs = CUNode->getImportedEntities())
430150645bSEllis Hoag       AllImportedModules.assign(IMs.begin(), IMs.end());
440150645bSEllis Hoag     if (const auto &MNs = CUNode->getMacros())
450150645bSEllis Hoag       AllMacrosPerParent.insert({nullptr, {MNs.begin(), MNs.end()}});
460150645bSEllis Hoag   }
470150645bSEllis Hoag }
485bf8fef5SDuncan P. N. Exon Smith 
trackIfUnresolved(MDNode * N)495bf8fef5SDuncan P. N. Exon Smith void DIBuilder::trackIfUnresolved(MDNode *N) {
509b1c6d34SDuncan P. N. Exon Smith   if (!N)
515bf8fef5SDuncan P. N. Exon Smith     return;
529b1c6d34SDuncan P. N. Exon Smith   if (N->isResolved())
539b1c6d34SDuncan P. N. Exon Smith     return;
549b1c6d34SDuncan P. N. Exon Smith 
559b1c6d34SDuncan P. N. Exon Smith   assert(AllowUnresolvedNodes && "Cannot handle unresolved nodes");
565bf8fef5SDuncan P. N. Exon Smith   UnresolvedNodes.emplace_back(N);
575bf8fef5SDuncan P. N. Exon Smith }
58ef860a24SChandler Carruth 
finalizeSubprogram(DISubprogram * SP)593cdd4935SKeno Fischer void DIBuilder::finalizeSubprogram(DISubprogram *SP) {
602c864551SShiva Chen   MDTuple *Temp = SP->getRetainedNodes().get();
613cdd4935SKeno Fischer   if (!Temp || !Temp->isTemporary())
623cdd4935SKeno Fischer     return;
633cdd4935SKeno Fischer 
642c864551SShiva Chen   SmallVector<Metadata *, 16> RetainedNodes;
653cdd4935SKeno Fischer 
663cdd4935SKeno Fischer   auto PV = PreservedVariables.find(SP);
673cdd4935SKeno Fischer   if (PV != PreservedVariables.end())
682c864551SShiva Chen     RetainedNodes.append(PV->second.begin(), PV->second.end());
693cdd4935SKeno Fischer 
702c864551SShiva Chen   auto PL = PreservedLabels.find(SP);
712c864551SShiva Chen   if (PL != PreservedLabels.end())
722c864551SShiva Chen     RetainedNodes.append(PL->second.begin(), PL->second.end());
732c864551SShiva Chen 
742c864551SShiva Chen   DINodeArray Node = getOrCreateArray(RetainedNodes);
752c864551SShiva Chen 
762c864551SShiva Chen   TempMDTuple(Temp)->replaceAllUsesWith(Node.get());
773cdd4935SKeno Fischer }
783cdd4935SKeno Fischer 
finalize()79ef860a24SChandler Carruth void DIBuilder::finalize() {
800e224a64SAdrian Prantl   if (!CUNode) {
810e224a64SAdrian Prantl     assert(!AllowUnresolvedNodes &&
820e224a64SAdrian Prantl            "creating type nodes without a CU is not supported");
830e224a64SAdrian Prantl     return;
840e224a64SAdrian Prantl   }
850e224a64SAdrian Prantl 
8647b239ebSEllis Hoag   if (!AllEnumTypes.empty())
8718c073adSAdrian Prantl     CUNode->replaceEnumTypes(MDTuple::get(VMContext, AllEnumTypes));
88ef860a24SChandler Carruth 
895bf8fef5SDuncan P. N. Exon Smith   SmallVector<Metadata *, 16> RetainValues;
900b410407SManman Ren   // Declarations and definitions of the same type may be retained. Some
910b410407SManman Ren   // clients RAUW these pairs, leaving duplicates in the retained types
920b410407SManman Ren   // list. Use a set to remove the duplicates while we transform the
930b410407SManman Ren   // TrackingVHs back into Values.
945bf8fef5SDuncan P. N. Exon Smith   SmallPtrSet<Metadata *, 16> RetainSet;
950b410407SManman Ren   for (unsigned I = 0, E = AllRetainTypes.size(); I < E; I++)
9670573dcdSDavid Blaikie     if (RetainSet.insert(AllRetainTypes[I]).second)
970b410407SManman Ren       RetainValues.push_back(AllRetainTypes[I]);
984276d4a8SAdrian Prantl 
994276d4a8SAdrian Prantl   if (!RetainValues.empty())
10018c073adSAdrian Prantl     CUNode->replaceRetainedTypes(MDTuple::get(VMContext, RetainValues));
101ef860a24SChandler Carruth 
102a9308c49SDuncan P. N. Exon Smith   DISubprogramArray SPs = MDTuple::get(VMContext, AllSubprograms);
10375819aedSAdrian Prantl   for (auto *SP : SPs)
1043cdd4935SKeno Fischer     finalizeSubprogram(SP);
10575819aedSAdrian Prantl   for (auto *N : RetainValues)
10675819aedSAdrian Prantl     if (auto *SP = dyn_cast<DISubprogram>(N))
1073cdd4935SKeno Fischer       finalizeSubprogram(SP);
108ef860a24SChandler Carruth 
1094276d4a8SAdrian Prantl   if (!AllGVs.empty())
11018c073adSAdrian Prantl     CUNode->replaceGlobalVariables(MDTuple::get(VMContext, AllGVs));
111f55abeafSDavid Blaikie 
1124276d4a8SAdrian Prantl   if (!AllImportedModules.empty())
11318c073adSAdrian Prantl     CUNode->replaceImportedEntities(MDTuple::get(
11402083539SDuncan P. N. Exon Smith         VMContext, SmallVector<Metadata *, 16>(AllImportedModules.begin(),
11502083539SDuncan P. N. Exon Smith                                                AllImportedModules.end())));
1165bf8fef5SDuncan P. N. Exon Smith 
11796075718SAmjad Aboud   for (const auto &I : AllMacrosPerParent) {
11896075718SAmjad Aboud     // DIMacroNode's with nullptr parent are DICompileUnit direct children.
11996075718SAmjad Aboud     if (!I.first) {
12096075718SAmjad Aboud       CUNode->replaceMacros(MDTuple::get(VMContext, I.second.getArrayRef()));
12196075718SAmjad Aboud       continue;
12296075718SAmjad Aboud     }
12396075718SAmjad Aboud     // Otherwise, it must be a temporary DIMacroFile that need to be resolved.
12496075718SAmjad Aboud     auto *TMF = cast<DIMacroFile>(I.first);
12596075718SAmjad Aboud     auto *MF = DIMacroFile::get(VMContext, dwarf::DW_MACINFO_start_file,
12696075718SAmjad Aboud                                 TMF->getLine(), TMF->getFile(),
12796075718SAmjad Aboud                                 getOrCreateMacroArray(I.second.getArrayRef()));
12896075718SAmjad Aboud     replaceTemporary(llvm::TempDIMacroNode(TMF), MF);
12996075718SAmjad Aboud   }
13096075718SAmjad Aboud 
1315bf8fef5SDuncan P. N. Exon Smith   // Now that all temp nodes have been replaced or deleted, resolve remaining
1325bf8fef5SDuncan P. N. Exon Smith   // cycles.
1335bf8fef5SDuncan P. N. Exon Smith   for (const auto &N : UnresolvedNodes)
1342bc00f4aSDuncan P. N. Exon Smith     if (N && !N->isResolved())
1352bc00f4aSDuncan P. N. Exon Smith       N->resolveCycles();
1365bf8fef5SDuncan P. N. Exon Smith   UnresolvedNodes.clear();
1375bf8fef5SDuncan P. N. Exon Smith 
1385bf8fef5SDuncan P. N. Exon Smith   // Can't handle unresolved nodes anymore.
1395bf8fef5SDuncan P. N. Exon Smith   AllowUnresolvedNodes = false;
140ef860a24SChandler Carruth }
141ef860a24SChandler Carruth 
142379e3757SDuncan P. N. Exon Smith /// If N is compile unit return NULL otherwise return N.
getNonCompileUnitScope(DIScope * N)143a9308c49SDuncan P. N. Exon Smith static DIScope *getNonCompileUnitScope(DIScope *N) {
144a9308c49SDuncan P. N. Exon Smith   if (!N || isa<DICompileUnit>(N))
145c620761cSCraig Topper     return nullptr;
146a9308c49SDuncan P. N. Exon Smith   return cast<DIScope>(N);
147ef860a24SChandler Carruth }
148ef860a24SChandler Carruth 
createCompileUnit(unsigned Lang,DIFile * File,StringRef Producer,bool isOptimized,StringRef Flags,unsigned RunTimeVer,StringRef SplitName,DICompileUnit::DebugEmissionKind Kind,uint64_t DWOId,bool SplitDebugInlining,bool DebugInfoForProfiling,DICompileUnit::DebugNameTableKind NameTableKind,bool RangesBaseAddress,StringRef SysRoot,StringRef SDK)149a9308c49SDuncan P. N. Exon Smith DICompileUnit *DIBuilder::createCompileUnit(
15043c8b6b7SAmjad Aboud     unsigned Lang, DIFile *File, StringRef Producer, bool isOptimized,
15143c8b6b7SAmjad Aboud     StringRef Flags, unsigned RunTimeVer, StringRef SplitName,
152a01f2953SDavid Blaikie     DICompileUnit::DebugEmissionKind Kind, uint64_t DWOId,
15366cf14d0SDavid Blaikie     bool SplitDebugInlining, bool DebugInfoForProfiling,
1547b30370eSAdrian Prantl     DICompileUnit::DebugNameTableKind NameTableKind, bool RangesBaseAddress,
155e4e7e447SAdrian Prantl     StringRef SysRoot, StringRef SDK) {
15675d49db1SEric Christopher 
1577e575ed1SBruce Mitchener   assert(((Lang <= dwarf::DW_LANG_Fortran08 && Lang >= dwarf::DW_LANG_C89) ||
158ef860a24SChandler Carruth           (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) &&
159ef860a24SChandler Carruth          "Invalid Language tag");
160ef860a24SChandler Carruth 
16118c073adSAdrian Prantl   assert(!CUNode && "Can only make one compile unit per DIBuilder instance");
16218c073adSAdrian Prantl   CUNode = DICompileUnit::getDistinct(
16343c8b6b7SAmjad Aboud       VMContext, Lang, File, Producer, isOptimized, Flags, RunTimeVer,
16443c8b6b7SAmjad Aboud       SplitName, Kind, nullptr, nullptr, nullptr, nullptr, nullptr, DWOId,
165bb279116SDavid Blaikie       SplitDebugInlining, DebugInfoForProfiling, NameTableKind,
166e4e7e447SAdrian Prantl       RangesBaseAddress, SysRoot, SDK);
167ef860a24SChandler Carruth 
168ef860a24SChandler Carruth   // Create a named metadata so that it is easier to find cu in a module.
169ef860a24SChandler Carruth   NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
17003b3e111SEric Christopher   NMD->addOperand(CUNode);
1715bf8fef5SDuncan P. N. Exon Smith   trackIfUnresolved(CUNode);
1729d1cf4c1SDuncan P. N. Exon Smith   return CUNode;
173ef860a24SChandler Carruth }
174ef860a24SChandler Carruth 
175a9308c49SDuncan P. N. Exon Smith static DIImportedEntity *
createImportedModule(LLVMContext & C,dwarf::Tag Tag,DIScope * Context,Metadata * NS,DIFile * File,unsigned Line,StringRef Name,DINodeArray Elements,SmallVectorImpl<TrackingMDNodeRef> & AllImportedModules)176a9308c49SDuncan P. N. Exon Smith createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope *Context,
177d63bfd21SAdrian Prantl                      Metadata *NS, DIFile *File, unsigned Line, StringRef Name,
178a5b72abcSAlok Kumar Sharma                      DINodeArray Elements,
1795bf8fef5SDuncan P. N. Exon Smith                      SmallVectorImpl<TrackingMDNodeRef> &AllImportedModules) {
180d63bfd21SAdrian Prantl   if (Line)
181d63bfd21SAdrian Prantl     assert(File && "Source location has line number but no file");
18262f6f5ccSAmjad Aboud   unsigned EntitiesCount = C.pImpl->DIImportedEntitys.size();
183da82ce99SFangrui Song   auto *M = DIImportedEntity::get(C, Tag, Context, cast_or_null<DINode>(NS),
184a5b72abcSAlok Kumar Sharma                                   File, Line, Name, Elements);
18562f6f5ccSAmjad Aboud   if (EntitiesCount < C.pImpl->DIImportedEntitys.size())
18662f6f5ccSAmjad Aboud     // A new Imported Entity was just added to the context.
18762f6f5ccSAmjad Aboud     // Add it to the Imported Modules list.
188de8e4273SDuncan P. N. Exon Smith     AllImportedModules.emplace_back(M);
1891fd4365fSDavid Blaikie   return M;
1901fd4365fSDavid Blaikie }
1911fd4365fSDavid Blaikie 
createImportedModule(DIScope * Context,DINamespace * NS,DIFile * File,unsigned Line,DINodeArray Elements)192a9308c49SDuncan P. N. Exon Smith DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context,
193d63bfd21SAdrian Prantl                                                   DINamespace *NS, DIFile *File,
194a5b72abcSAlok Kumar Sharma                                                   unsigned Line,
195a5b72abcSAlok Kumar Sharma                                                   DINodeArray Elements) {
1962a40c14dSDavid Blaikie   return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
197a5b72abcSAlok Kumar Sharma                                 Context, NS, File, Line, StringRef(), Elements,
198d63bfd21SAdrian Prantl                                 AllImportedModules);
199e63d5d16SDavid Blaikie }
200e63d5d16SDavid Blaikie 
createImportedModule(DIScope * Context,DIImportedEntity * NS,DIFile * File,unsigned Line,DINodeArray Elements)201a9308c49SDuncan P. N. Exon Smith DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context,
202a9308c49SDuncan P. N. Exon Smith                                                   DIImportedEntity *NS,
203a5b72abcSAlok Kumar Sharma                                                   DIFile *File, unsigned Line,
204a5b72abcSAlok Kumar Sharma                                                   DINodeArray Elements) {
2052a40c14dSDavid Blaikie   return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
206a5b72abcSAlok Kumar Sharma                                 Context, NS, File, Line, StringRef(), Elements,
207d63bfd21SAdrian Prantl                                 AllImportedModules);
208e63d5d16SDavid Blaikie }
209e63d5d16SDavid Blaikie 
createImportedModule(DIScope * Context,DIModule * M,DIFile * File,unsigned Line,DINodeArray Elements)210ab1243feSAdrian Prantl DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context, DIModule *M,
211a5b72abcSAlok Kumar Sharma                                                   DIFile *File, unsigned Line,
212a5b72abcSAlok Kumar Sharma                                                   DINodeArray Elements) {
213ab1243feSAdrian Prantl   return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module,
214a5b72abcSAlok Kumar Sharma                                 Context, M, File, Line, StringRef(), Elements,
215d63bfd21SAdrian Prantl                                 AllImportedModules);
216ab1243feSAdrian Prantl }
217ab1243feSAdrian Prantl 
218a5b72abcSAlok Kumar Sharma DIImportedEntity *
createImportedDeclaration(DIScope * Context,DINode * Decl,DIFile * File,unsigned Line,StringRef Name,DINodeArray Elements)219a5b72abcSAlok Kumar Sharma DIBuilder::createImportedDeclaration(DIScope *Context, DINode *Decl,
220a5b72abcSAlok Kumar Sharma                                      DIFile *File, unsigned Line,
221a5b72abcSAlok Kumar Sharma                                      StringRef Name, DINodeArray Elements) {
2224aa51ae6SFrederic Riss   // Make sure to use the unique identifier based metadata reference for
2234aa51ae6SFrederic Riss   // types that have one.
22402083539SDuncan P. N. Exon Smith   return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_declaration,
225a5b72abcSAlok Kumar Sharma                                 Context, Decl, File, Line, Name, Elements,
226d63bfd21SAdrian Prantl                                 AllImportedModules);
2272a40c14dSDavid Blaikie }
2282a40c14dSDavid Blaikie 
createFile(StringRef Filename,StringRef Directory,Optional<DIFile::ChecksumInfo<StringRef>> CS,Optional<StringRef> Source)2297faeecc8SAmjad Aboud DIFile *DIBuilder::createFile(StringRef Filename, StringRef Directory,
23016c7bdafSScott Linder                               Optional<DIFile::ChecksumInfo<StringRef>> CS,
23116c7bdafSScott Linder                               Optional<StringRef> Source) {
23216c7bdafSScott Linder   return DIFile::get(VMContext, Filename, Directory, CS, Source);
233ef860a24SChandler Carruth }
234ef860a24SChandler Carruth 
createMacro(DIMacroFile * Parent,unsigned LineNumber,unsigned MacroType,StringRef Name,StringRef Value)23596075718SAmjad Aboud DIMacro *DIBuilder::createMacro(DIMacroFile *Parent, unsigned LineNumber,
23696075718SAmjad Aboud                                 unsigned MacroType, StringRef Name,
23796075718SAmjad Aboud                                 StringRef Value) {
23896075718SAmjad Aboud   assert(!Name.empty() && "Unable to create macro without name");
23996075718SAmjad Aboud   assert((MacroType == dwarf::DW_MACINFO_undef ||
24096075718SAmjad Aboud           MacroType == dwarf::DW_MACINFO_define) &&
24196075718SAmjad Aboud          "Unexpected macro type");
24296075718SAmjad Aboud   auto *M = DIMacro::get(VMContext, MacroType, LineNumber, Name, Value);
24396075718SAmjad Aboud   AllMacrosPerParent[Parent].insert(M);
24496075718SAmjad Aboud   return M;
24596075718SAmjad Aboud }
24696075718SAmjad Aboud 
createTempMacroFile(DIMacroFile * Parent,unsigned LineNumber,DIFile * File)24796075718SAmjad Aboud DIMacroFile *DIBuilder::createTempMacroFile(DIMacroFile *Parent,
24896075718SAmjad Aboud                                             unsigned LineNumber, DIFile *File) {
24996075718SAmjad Aboud   auto *MF = DIMacroFile::getTemporary(VMContext, dwarf::DW_MACINFO_start_file,
25096075718SAmjad Aboud                                        LineNumber, File, DIMacroNodeArray())
25196075718SAmjad Aboud                  .release();
25296075718SAmjad Aboud   AllMacrosPerParent[Parent].insert(MF);
25396075718SAmjad Aboud   // Add the new temporary DIMacroFile to the macro per parent map as a parent.
25496075718SAmjad Aboud   // This is needed to assure DIMacroFile with no children to have an entry in
25596075718SAmjad Aboud   // the map. Otherwise, it will not be resolved in DIBuilder::finalize().
25696075718SAmjad Aboud   AllMacrosPerParent.insert({MF, {}});
25796075718SAmjad Aboud   return MF;
25896075718SAmjad Aboud }
25996075718SAmjad Aboud 
createEnumerator(StringRef Name,uint64_t Val,bool IsUnsigned)260f84c70a3SMatheus Izvekov DIEnumerator *DIBuilder::createEnumerator(StringRef Name, uint64_t Val,
26108dc66efSMomchil Velikov                                           bool IsUnsigned) {
262ef860a24SChandler Carruth   assert(!Name.empty() && "Unable to create enumerator without name");
263aad3d578SLemonBoy   return DIEnumerator::get(VMContext, APInt(64, Val, !IsUnsigned), IsUnsigned,
264aad3d578SLemonBoy                            Name);
265ef860a24SChandler Carruth }
266ef860a24SChandler Carruth 
createEnumerator(StringRef Name,const APSInt & Value)267ee267b1cSSimon Pilgrim DIEnumerator *DIBuilder::createEnumerator(StringRef Name, const APSInt &Value) {
26832304932SReid Kleckner   assert(!Name.empty() && "Unable to create enumerator without name");
26932304932SReid Kleckner   return DIEnumerator::get(VMContext, APInt(Value), Value.isUnsigned(), Name);
27032304932SReid Kleckner }
27132304932SReid Kleckner 
createUnspecifiedType(StringRef Name)272a9308c49SDuncan P. N. Exon Smith DIBasicType *DIBuilder::createUnspecifiedType(StringRef Name) {
273ef860a24SChandler Carruth   assert(!Name.empty() && "Unable to create type without name");
274a9308c49SDuncan P. N. Exon Smith   return DIBasicType::get(VMContext, dwarf::DW_TAG_unspecified_type, Name);
275ef860a24SChandler Carruth }
276ef860a24SChandler Carruth 
createNullPtrType()277a9308c49SDuncan P. N. Exon Smith DIBasicType *DIBuilder::createNullPtrType() {
278a4a47cb9SPeter Collingbourne   return createUnspecifiedType("decltype(nullptr)");
279a4a47cb9SPeter Collingbourne }
280a4a47cb9SPeter Collingbourne 
createBasicType(StringRef Name,uint64_t SizeInBits,unsigned Encoding,DINode::DIFlags Flags)281a9308c49SDuncan P. N. Exon Smith DIBasicType *DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
28255f42629SAdrian Prantl                                         unsigned Encoding,
28355f42629SAdrian Prantl                                         DINode::DIFlags Flags) {
284ef860a24SChandler Carruth   assert(!Name.empty() && "Unable to create type without name");
285a9308c49SDuncan P. N. Exon Smith   return DIBasicType::get(VMContext, dwarf::DW_TAG_base_type, Name, SizeInBits,
28655f42629SAdrian Prantl                           0, Encoding, Flags);
287ef860a24SChandler Carruth }
288ef860a24SChandler Carruth 
createStringType(StringRef Name,uint64_t SizeInBits)289f91d18eaSSourabh Singh Tomar DIStringType *DIBuilder::createStringType(StringRef Name, uint64_t SizeInBits) {
290f91d18eaSSourabh Singh Tomar   assert(!Name.empty() && "Unable to create type without name");
291f91d18eaSSourabh Singh Tomar   return DIStringType::get(VMContext, dwarf::DW_TAG_string_type, Name,
292f91d18eaSSourabh Singh Tomar                            SizeInBits, 0);
293f91d18eaSSourabh Singh Tomar }
294f91d18eaSSourabh Singh Tomar 
createStringType(StringRef Name,DIVariable * StringLength,DIExpression * StrLocationExp)29570fdbf35SYASHASVI KHATAVKAR DIStringType *DIBuilder::createStringType(StringRef Name,
29670fdbf35SYASHASVI KHATAVKAR                                           DIVariable *StringLength,
29770fdbf35SYASHASVI KHATAVKAR                                           DIExpression *StrLocationExp) {
29870fdbf35SYASHASVI KHATAVKAR   assert(!Name.empty() && "Unable to create type without name");
29970fdbf35SYASHASVI KHATAVKAR   return DIStringType::get(VMContext, dwarf::DW_TAG_string_type, Name,
30070fdbf35SYASHASVI KHATAVKAR                            StringLength, nullptr, StrLocationExp, 0, 0, 0);
30170fdbf35SYASHASVI KHATAVKAR }
30270fdbf35SYASHASVI KHATAVKAR 
createStringType(StringRef Name,DIExpression * StringLengthExp,DIExpression * StrLocationExp)30370fdbf35SYASHASVI KHATAVKAR DIStringType *DIBuilder::createStringType(StringRef Name,
30470fdbf35SYASHASVI KHATAVKAR                                           DIExpression *StringLengthExp,
30570fdbf35SYASHASVI KHATAVKAR                                           DIExpression *StrLocationExp) {
30670fdbf35SYASHASVI KHATAVKAR   assert(!Name.empty() && "Unable to create type without name");
30770fdbf35SYASHASVI KHATAVKAR   return DIStringType::get(VMContext, dwarf::DW_TAG_string_type, Name, nullptr,
30870fdbf35SYASHASVI KHATAVKAR                            StringLengthExp, StrLocationExp, 0, 0, 0);
30970fdbf35SYASHASVI KHATAVKAR }
31070fdbf35SYASHASVI KHATAVKAR 
createQualifiedType(unsigned Tag,DIType * FromTy)311a9308c49SDuncan P. N. Exon Smith DIDerivedType *DIBuilder::createQualifiedType(unsigned Tag, DIType *FromTy) {
312a59d3e5aSDuncan P. N. Exon Smith   return DIDerivedType::get(VMContext, Tag, "", nullptr, 0, nullptr, FromTy, 0,
313d5561e0aSKonstantin Zhuravlyov                             0, 0, None, DINode::FlagZero);
314ef860a24SChandler Carruth }
315ef860a24SChandler Carruth 
3163466e007SYonghong Song DIDerivedType *
createPointerType(DIType * PointeeTy,uint64_t SizeInBits,uint32_t AlignInBits,Optional<unsigned> DWARFAddressSpace,StringRef Name,DINodeArray Annotations)3173466e007SYonghong Song DIBuilder::createPointerType(DIType *PointeeTy, uint64_t SizeInBits,
318197aa319SVictor Leschuk                              uint32_t AlignInBits,
319d5561e0aSKonstantin Zhuravlyov                              Optional<unsigned> DWARFAddressSpace,
3203466e007SYonghong Song                              StringRef Name, DINodeArray Annotations) {
321e274180fSDuncan P. N. Exon Smith   // FIXME: Why is there a name here?
322a9308c49SDuncan P. N. Exon Smith   return DIDerivedType::get(VMContext, dwarf::DW_TAG_pointer_type, Name,
323a59d3e5aSDuncan P. N. Exon Smith                             nullptr, 0, nullptr, PointeeTy, SizeInBits,
3243466e007SYonghong Song                             AlignInBits, 0, DWARFAddressSpace, DINode::FlagZero,
3253466e007SYonghong Song                             nullptr, Annotations);
326ef860a24SChandler Carruth }
327ef860a24SChandler Carruth 
createMemberPointerType(DIType * PointeeTy,DIType * Base,uint64_t SizeInBits,uint32_t AlignInBits,DINode::DIFlags Flags)328a9308c49SDuncan P. N. Exon Smith DIDerivedType *DIBuilder::createMemberPointerType(DIType *PointeeTy,
329a9308c49SDuncan P. N. Exon Smith                                                   DIType *Base,
33002083539SDuncan P. N. Exon Smith                                                   uint64_t SizeInBits,
331197aa319SVictor Leschuk                                                   uint32_t AlignInBits,
3325fcc4185SLeny Kholodov                                                   DINode::DIFlags Flags) {
333a9308c49SDuncan P. N. Exon Smith   return DIDerivedType::get(VMContext, dwarf::DW_TAG_ptr_to_member_type, "",
334a59d3e5aSDuncan P. N. Exon Smith                             nullptr, 0, nullptr, PointeeTy, SizeInBits,
335d5561e0aSKonstantin Zhuravlyov                             AlignInBits, 0, None, Flags, Base);
3365d3249b5SDavid Blaikie }
3375d3249b5SDavid Blaikie 
338665b4138SLuís Ferreira DIDerivedType *
createReferenceType(unsigned Tag,DIType * RTy,uint64_t SizeInBits,uint32_t AlignInBits,Optional<unsigned> DWARFAddressSpace)339665b4138SLuís Ferreira DIBuilder::createReferenceType(unsigned Tag, DIType *RTy, uint64_t SizeInBits,
340d5561e0aSKonstantin Zhuravlyov                                uint32_t AlignInBits,
341d5561e0aSKonstantin Zhuravlyov                                Optional<unsigned> DWARFAddressSpace) {
3429d1cf4c1SDuncan P. N. Exon Smith   assert(RTy && "Unable to create reference type");
343a59d3e5aSDuncan P. N. Exon Smith   return DIDerivedType::get(VMContext, Tag, "", nullptr, 0, nullptr, RTy,
344d5561e0aSKonstantin Zhuravlyov                             SizeInBits, AlignInBits, 0, DWARFAddressSpace,
345d5561e0aSKonstantin Zhuravlyov                             DINode::FlagZero);
346ef860a24SChandler Carruth }
347ef860a24SChandler Carruth 
createTypedef(DIType * Ty,StringRef Name,DIFile * File,unsigned LineNo,DIScope * Context,uint32_t AlignInBits,DINodeArray Annotations)348a9308c49SDuncan P. N. Exon Smith DIDerivedType *DIBuilder::createTypedef(DIType *Ty, StringRef Name,
349a9308c49SDuncan P. N. Exon Smith                                         DIFile *File, unsigned LineNo,
350665b4138SLuís Ferreira                                         DIScope *Context, uint32_t AlignInBits,
351f6811cecSYonghong Song                                         DINodeArray Annotations) {
352a9308c49SDuncan P. N. Exon Smith   return DIDerivedType::get(VMContext, dwarf::DW_TAG_typedef, Name, File,
353f1e3988aSSourabh Singh Tomar                             LineNo, getNonCompileUnitScope(Context), Ty, 0,
354f6811cecSYonghong Song                             AlignInBits, 0, None, DINode::FlagZero, nullptr,
355f6811cecSYonghong Song                             Annotations);
356ef860a24SChandler Carruth }
357ef860a24SChandler Carruth 
createFriend(DIType * Ty,DIType * FriendTy)358a9308c49SDuncan P. N. Exon Smith DIDerivedType *DIBuilder::createFriend(DIType *Ty, DIType *FriendTy) {
3599d1cf4c1SDuncan P. N. Exon Smith   assert(Ty && "Invalid type!");
3609d1cf4c1SDuncan P. N. Exon Smith   assert(FriendTy && "Invalid friend type!");
361a59d3e5aSDuncan P. N. Exon Smith   return DIDerivedType::get(VMContext, dwarf::DW_TAG_friend, "", nullptr, 0, Ty,
362d5561e0aSKonstantin Zhuravlyov                             FriendTy, 0, 0, 0, None, DINode::FlagZero);
363ef860a24SChandler Carruth }
364ef860a24SChandler Carruth 
createInheritance(DIType * Ty,DIType * BaseTy,uint64_t BaseOffset,uint32_t VBPtrOffset,DINode::DIFlags Flags)365a9308c49SDuncan P. N. Exon Smith DIDerivedType *DIBuilder::createInheritance(DIType *Ty, DIType *BaseTy,
36698f9c236SEric Christopher                                             uint64_t BaseOffset,
3673db2b108SBrock Wyma                                             uint32_t VBPtrOffset,
3685fcc4185SLeny Kholodov                                             DINode::DIFlags Flags) {
3699d1cf4c1SDuncan P. N. Exon Smith   assert(Ty && "Unable to create inheritance");
3703db2b108SBrock Wyma   Metadata *ExtraData = ConstantAsMetadata::get(
3713db2b108SBrock Wyma       ConstantInt::get(IntegerType::get(VMContext, 32), VBPtrOffset));
372a9308c49SDuncan P. N. Exon Smith   return DIDerivedType::get(VMContext, dwarf::DW_TAG_inheritance, "", nullptr,
373665b4138SLuís Ferreira                             0, Ty, BaseTy, 0, 0, BaseOffset, None, Flags,
374665b4138SLuís Ferreira                             ExtraData);
375ef860a24SChandler Carruth }
376ef860a24SChandler Carruth 
createMemberType(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNumber,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,DINode::DIFlags Flags,DIType * Ty,DINodeArray Annotations)377430e2238SYonghong Song DIDerivedType *DIBuilder::createMemberType(
378430e2238SYonghong Song     DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
379430e2238SYonghong Song     uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
380430e2238SYonghong Song     DINode::DIFlags Flags, DIType *Ty, DINodeArray Annotations) {
381a59d3e5aSDuncan P. N. Exon Smith   return DIDerivedType::get(VMContext, dwarf::DW_TAG_member, Name, File,
382a59d3e5aSDuncan P. N. Exon Smith                             LineNumber, getNonCompileUnitScope(Scope), Ty,
383430e2238SYonghong Song                             SizeInBits, AlignInBits, OffsetInBits, None, Flags,
384430e2238SYonghong Song                             nullptr, Annotations);
385ef860a24SChandler Carruth }
386ef860a24SChandler Carruth 
getConstantOrNull(Constant * C)3873cd2cabfSDuncan P. N. Exon Smith static ConstantAsMetadata *getConstantOrNull(Constant *C) {
3885bf8fef5SDuncan P. N. Exon Smith   if (C)
3895bf8fef5SDuncan P. N. Exon Smith     return ConstantAsMetadata::get(C);
3905bf8fef5SDuncan P. N. Exon Smith   return nullptr;
3915bf8fef5SDuncan P. N. Exon Smith }
3925bf8fef5SDuncan P. N. Exon Smith 
createVariantMemberType(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNumber,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,Constant * Discriminant,DINode::DIFlags Flags,DIType * Ty)3939a454529SAdrian Prantl DIDerivedType *DIBuilder::createVariantMemberType(
3949a454529SAdrian Prantl     DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
3959a454529SAdrian Prantl     uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
3969a454529SAdrian Prantl     Constant *Discriminant, DINode::DIFlags Flags, DIType *Ty) {
3978c59921cSAdrian Prantl   return DIDerivedType::get(VMContext, dwarf::DW_TAG_member, Name, File,
3988c59921cSAdrian Prantl                             LineNumber, getNonCompileUnitScope(Scope), Ty,
3998c59921cSAdrian Prantl                             SizeInBits, AlignInBits, OffsetInBits, None, Flags,
4008c59921cSAdrian Prantl                             getConstantOrNull(Discriminant));
4018c59921cSAdrian Prantl }
4028c59921cSAdrian Prantl 
createBitFieldMemberType(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNumber,uint64_t SizeInBits,uint64_t OffsetInBits,uint64_t StorageOffsetInBits,DINode::DIFlags Flags,DIType * Ty,DINodeArray Annotations)4039319cbc0SDavid Majnemer DIDerivedType *DIBuilder::createBitFieldMemberType(
4049319cbc0SDavid Majnemer     DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
4052ede126bSVictor Leschuk     uint64_t SizeInBits, uint64_t OffsetInBits, uint64_t StorageOffsetInBits,
406430e2238SYonghong Song     DINode::DIFlags Flags, DIType *Ty, DINodeArray Annotations) {
4079319cbc0SDavid Majnemer   Flags |= DINode::FlagBitField;
4089319cbc0SDavid Majnemer   return DIDerivedType::get(
4099319cbc0SDavid Majnemer       VMContext, dwarf::DW_TAG_member, Name, File, LineNumber,
410665b4138SLuís Ferreira       getNonCompileUnitScope(Scope), Ty, SizeInBits, /*AlignInBits=*/0,
411d5561e0aSKonstantin Zhuravlyov       OffsetInBits, None, Flags,
4122ede126bSVictor Leschuk       ConstantAsMetadata::get(ConstantInt::get(IntegerType::get(VMContext, 64),
413430e2238SYonghong Song                                                StorageOffsetInBits)),
414430e2238SYonghong Song       Annotations);
4159319cbc0SDavid Majnemer }
4169319cbc0SDavid Majnemer 
41740c6235bSLeny Kholodov DIDerivedType *
createStaticMemberType(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNumber,DIType * Ty,DINode::DIFlags Flags,llvm::Constant * Val,uint32_t AlignInBits)41840c6235bSLeny Kholodov DIBuilder::createStaticMemberType(DIScope *Scope, StringRef Name, DIFile *File,
41940c6235bSLeny Kholodov                                   unsigned LineNumber, DIType *Ty,
4202ede126bSVictor Leschuk                                   DINode::DIFlags Flags, llvm::Constant *Val,
4212ede126bSVictor Leschuk                                   uint32_t AlignInBits) {
422a9308c49SDuncan P. N. Exon Smith   Flags |= DINode::FlagStaticMember;
423a59d3e5aSDuncan P. N. Exon Smith   return DIDerivedType::get(VMContext, dwarf::DW_TAG_member, Name, File,
4242ede126bSVictor Leschuk                             LineNumber, getNonCompileUnitScope(Scope), Ty, 0,
425d5561e0aSKonstantin Zhuravlyov                             AlignInBits, 0, None, Flags,
426d5561e0aSKonstantin Zhuravlyov                             getConstantOrNull(Val));
4274d23a4aeSEric Christopher }
4284d23a4aeSEric Christopher 
42940c6235bSLeny Kholodov DIDerivedType *
createObjCIVar(StringRef Name,DIFile * File,unsigned LineNumber,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,DINode::DIFlags Flags,DIType * Ty,MDNode * PropertyNode)43040c6235bSLeny Kholodov DIBuilder::createObjCIVar(StringRef Name, DIFile *File, unsigned LineNumber,
431197aa319SVictor Leschuk                           uint64_t SizeInBits, uint32_t AlignInBits,
4325fcc4185SLeny Kholodov                           uint64_t OffsetInBits, DINode::DIFlags Flags,
433a9308c49SDuncan P. N. Exon Smith                           DIType *Ty, MDNode *PropertyNode) {
434a59d3e5aSDuncan P. N. Exon Smith   return DIDerivedType::get(VMContext, dwarf::DW_TAG_member, Name, File,
435a59d3e5aSDuncan P. N. Exon Smith                             LineNumber, getNonCompileUnitScope(File), Ty,
436d5561e0aSKonstantin Zhuravlyov                             SizeInBits, AlignInBits, OffsetInBits, None, Flags,
437a59d3e5aSDuncan P. N. Exon Smith                             PropertyNode);
438ef860a24SChandler Carruth }
439ef860a24SChandler Carruth 
440a9308c49SDuncan P. N. Exon Smith DIObjCProperty *
createObjCProperty(StringRef Name,DIFile * File,unsigned LineNumber,StringRef GetterName,StringRef SetterName,unsigned PropertyAttributes,DIType * Ty)441a9308c49SDuncan P. N. Exon Smith DIBuilder::createObjCProperty(StringRef Name, DIFile *File, unsigned LineNumber,
44298f9c236SEric Christopher                               StringRef GetterName, StringRef SetterName,
443a9308c49SDuncan P. N. Exon Smith                               unsigned PropertyAttributes, DIType *Ty) {
444a9308c49SDuncan P. N. Exon Smith   return DIObjCProperty::get(VMContext, Name, File, LineNumber, GetterName,
445a59d3e5aSDuncan P. N. Exon Smith                              SetterName, PropertyAttributes, Ty);
446ef860a24SChandler Carruth }
447ef860a24SChandler Carruth 
448a9308c49SDuncan P. N. Exon Smith DITemplateTypeParameter *
createTemplateTypeParameter(DIScope * Context,StringRef Name,DIType * Ty,bool isDefault)449a9308c49SDuncan P. N. Exon Smith DIBuilder::createTemplateTypeParameter(DIScope *Context, StringRef Name,
4507a42babeSAwanish Pandey                                        DIType *Ty, bool isDefault) {
451a9308c49SDuncan P. N. Exon Smith   assert((!Context || isa<DICompileUnit>(Context)) && "Expected compile unit");
4527a42babeSAwanish Pandey   return DITemplateTypeParameter::get(VMContext, Name, Ty, isDefault);
453ef860a24SChandler Carruth }
454ef860a24SChandler Carruth 
455a9308c49SDuncan P. N. Exon Smith static DITemplateValueParameter *
createTemplateValueParameterHelper(LLVMContext & VMContext,unsigned Tag,DIScope * Context,StringRef Name,DIType * Ty,bool IsDefault,Metadata * MD)456b4aa16f2SDuncan P. N. Exon Smith createTemplateValueParameterHelper(LLVMContext &VMContext, unsigned Tag,
457a9308c49SDuncan P. N. Exon Smith                                    DIScope *Context, StringRef Name, DIType *Ty,
4587a42babeSAwanish Pandey                                    bool IsDefault, Metadata *MD) {
459a9308c49SDuncan P. N. Exon Smith   assert((!Context || isa<DICompileUnit>(Context)) && "Expected compile unit");
4607a42babeSAwanish Pandey   return DITemplateValueParameter::get(VMContext, Tag, Name, Ty, IsDefault, MD);
461ef860a24SChandler Carruth }
462ef860a24SChandler Carruth 
463a9308c49SDuncan P. N. Exon Smith DITemplateValueParameter *
createTemplateValueParameter(DIScope * Context,StringRef Name,DIType * Ty,bool isDefault,Constant * Val)464a9308c49SDuncan P. N. Exon Smith DIBuilder::createTemplateValueParameter(DIScope *Context, StringRef Name,
4657a42babeSAwanish Pandey                                         DIType *Ty, bool isDefault,
4667a42babeSAwanish Pandey                                         Constant *Val) {
467774951fcSDuncan P. N. Exon Smith   return createTemplateValueParameterHelper(
4685bf8fef5SDuncan P. N. Exon Smith       VMContext, dwarf::DW_TAG_template_value_parameter, Context, Name, Ty,
4697a42babeSAwanish Pandey       isDefault, getConstantOrNull(Val));
4702b380232SDavid Blaikie }
4712b380232SDavid Blaikie 
472a9308c49SDuncan P. N. Exon Smith DITemplateValueParameter *
createTemplateTemplateParameter(DIScope * Context,StringRef Name,DIType * Ty,StringRef Val)473a9308c49SDuncan P. N. Exon Smith DIBuilder::createTemplateTemplateParameter(DIScope *Context, StringRef Name,
474a9308c49SDuncan P. N. Exon Smith                                            DIType *Ty, StringRef Val) {
475774951fcSDuncan P. N. Exon Smith   return createTemplateValueParameterHelper(
476774951fcSDuncan P. N. Exon Smith       VMContext, dwarf::DW_TAG_GNU_template_template_param, Context, Name, Ty,
4777a42babeSAwanish Pandey       false, MDString::get(VMContext, Val));
4782b380232SDavid Blaikie }
4792b380232SDavid Blaikie 
480a9308c49SDuncan P. N. Exon Smith DITemplateValueParameter *
createTemplateParameterPack(DIScope * Context,StringRef Name,DIType * Ty,DINodeArray Val)481a9308c49SDuncan P. N. Exon Smith DIBuilder::createTemplateParameterPack(DIScope *Context, StringRef Name,
482a9308c49SDuncan P. N. Exon Smith                                        DIType *Ty, DINodeArray Val) {
483774951fcSDuncan P. N. Exon Smith   return createTemplateValueParameterHelper(
484774951fcSDuncan P. N. Exon Smith       VMContext, dwarf::DW_TAG_GNU_template_parameter_pack, Context, Name, Ty,
4857a42babeSAwanish Pandey       false, Val.get());
4862b380232SDavid Blaikie }
4872b380232SDavid Blaikie 
createClassType(DIScope * Context,StringRef Name,DIFile * File,unsigned LineNumber,uint64_t SizeInBits,uint32_t AlignInBits,uint64_t OffsetInBits,DINode::DIFlags Flags,DIType * DerivedFrom,DINodeArray Elements,DIType * VTableHolder,MDNode * TemplateParams,StringRef UniqueIdentifier)488a9308c49SDuncan P. N. Exon Smith DICompositeType *DIBuilder::createClassType(
489a9308c49SDuncan P. N. Exon Smith     DIScope *Context, StringRef Name, DIFile *File, unsigned LineNumber,
490197aa319SVictor Leschuk     uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
4915fcc4185SLeny Kholodov     DINode::DIFlags Flags, DIType *DerivedFrom, DINodeArray Elements,
492a9308c49SDuncan P. N. Exon Smith     DIType *VTableHolder, MDNode *TemplateParams, StringRef UniqueIdentifier) {
493a9308c49SDuncan P. N. Exon Smith   assert((!Context || isa<DIScope>(Context)) &&
494085abe38SDavid Blaikie          "createClassType should be called with a valid Context");
49502083539SDuncan P. N. Exon Smith 
496a9308c49SDuncan P. N. Exon Smith   auto *R = DICompositeType::get(
497e274180fSDuncan P. N. Exon Smith       VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber,
498a59d3e5aSDuncan P. N. Exon Smith       getNonCompileUnitScope(Context), DerivedFrom, SizeInBits, AlignInBits,
499a59d3e5aSDuncan P. N. Exon Smith       OffsetInBits, Flags, Elements, 0, VTableHolder,
5003ec5fa6aSDuncan P. N. Exon Smith       cast_or_null<MDTuple>(TemplateParams), UniqueIdentifier);
501ea7f1c2dSAdrian Prantl   trackIfUnresolved(R);
502085abe38SDavid Blaikie   return R;
503ef860a24SChandler Carruth }
504ef860a24SChandler Carruth 
createStructType(DIScope * Context,StringRef Name,DIFile * File,unsigned LineNumber,uint64_t SizeInBits,uint32_t AlignInBits,DINode::DIFlags Flags,DIType * DerivedFrom,DINodeArray Elements,unsigned RunTimeLang,DIType * VTableHolder,StringRef UniqueIdentifier)505a9308c49SDuncan P. N. Exon Smith DICompositeType *DIBuilder::createStructType(
506a9308c49SDuncan P. N. Exon Smith     DIScope *Context, StringRef Name, DIFile *File, unsigned LineNumber,
507197aa319SVictor Leschuk     uint64_t SizeInBits, uint32_t AlignInBits, DINode::DIFlags Flags,
508a9308c49SDuncan P. N. Exon Smith     DIType *DerivedFrom, DINodeArray Elements, unsigned RunTimeLang,
509a9308c49SDuncan P. N. Exon Smith     DIType *VTableHolder, StringRef UniqueIdentifier) {
510a9308c49SDuncan P. N. Exon Smith   auto *R = DICompositeType::get(
511e274180fSDuncan P. N. Exon Smith       VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber,
512a59d3e5aSDuncan P. N. Exon Smith       getNonCompileUnitScope(Context), DerivedFrom, SizeInBits, AlignInBits, 0,
513a59d3e5aSDuncan P. N. Exon Smith       Flags, Elements, RunTimeLang, VTableHolder, nullptr, UniqueIdentifier);
514ea7f1c2dSAdrian Prantl   trackIfUnresolved(R);
515085abe38SDavid Blaikie   return R;
516ef860a24SChandler Carruth }
517ef860a24SChandler Carruth 
createUnionType(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNumber,uint64_t SizeInBits,uint32_t AlignInBits,DINode::DIFlags Flags,DINodeArray Elements,unsigned RunTimeLang,StringRef UniqueIdentifier)518a9308c49SDuncan P. N. Exon Smith DICompositeType *DIBuilder::createUnionType(
519a9308c49SDuncan P. N. Exon Smith     DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
520197aa319SVictor Leschuk     uint64_t SizeInBits, uint32_t AlignInBits, DINode::DIFlags Flags,
521a9308c49SDuncan P. N. Exon Smith     DINodeArray Elements, unsigned RunTimeLang, StringRef UniqueIdentifier) {
522a9308c49SDuncan P. N. Exon Smith   auto *R = DICompositeType::get(
523e274180fSDuncan P. N. Exon Smith       VMContext, dwarf::DW_TAG_union_type, Name, File, LineNumber,
524a59d3e5aSDuncan P. N. Exon Smith       getNonCompileUnitScope(Scope), nullptr, SizeInBits, AlignInBits, 0, Flags,
525a59d3e5aSDuncan P. N. Exon Smith       Elements, RunTimeLang, nullptr, nullptr, UniqueIdentifier);
526ea7f1c2dSAdrian Prantl   trackIfUnresolved(R);
5270b410407SManman Ren   return R;
528ef860a24SChandler Carruth }
529ef860a24SChandler Carruth 
530665b4138SLuís Ferreira DICompositeType *
createVariantPart(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNumber,uint64_t SizeInBits,uint32_t AlignInBits,DINode::DIFlags Flags,DIDerivedType * Discriminator,DINodeArray Elements,StringRef UniqueIdentifier)531665b4138SLuís Ferreira DIBuilder::createVariantPart(DIScope *Scope, StringRef Name, DIFile *File,
532665b4138SLuís Ferreira                              unsigned LineNumber, uint64_t SizeInBits,
533665b4138SLuís Ferreira                              uint32_t AlignInBits, DINode::DIFlags Flags,
534665b4138SLuís Ferreira                              DIDerivedType *Discriminator, DINodeArray Elements,
535665b4138SLuís Ferreira                              StringRef UniqueIdentifier) {
5368c59921cSAdrian Prantl   auto *R = DICompositeType::get(
5378c59921cSAdrian Prantl       VMContext, dwarf::DW_TAG_variant_part, Name, File, LineNumber,
5388c59921cSAdrian Prantl       getNonCompileUnitScope(Scope), nullptr, SizeInBits, AlignInBits, 0, Flags,
5398c59921cSAdrian Prantl       Elements, 0, nullptr, nullptr, UniqueIdentifier, Discriminator);
5408c59921cSAdrian Prantl   trackIfUnresolved(R);
5418c59921cSAdrian Prantl   return R;
5428c59921cSAdrian Prantl }
5438c59921cSAdrian Prantl 
createSubroutineType(DITypeRefArray ParameterTypes,DINode::DIFlags Flags,unsigned CC)544bdafb3cdSEric Christopher DISubroutineType *DIBuilder::createSubroutineType(DITypeRefArray ParameterTypes,
54540c6235bSLeny Kholodov                                                   DINode::DIFlags Flags,
54640c6235bSLeny Kholodov                                                   unsigned CC) {
547de3d8b50SReid Kleckner   return DISubroutineType::get(VMContext, Flags, CC, ParameterTypes);
548ef860a24SChandler Carruth }
549ef860a24SChandler Carruth 
createEnumerationType(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNumber,uint64_t SizeInBits,uint32_t AlignInBits,DINodeArray Elements,DIType * UnderlyingType,StringRef UniqueIdentifier,bool IsScoped)550a9308c49SDuncan P. N. Exon Smith DICompositeType *DIBuilder::createEnumerationType(
551a9308c49SDuncan P. N. Exon Smith     DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
552197aa319SVictor Leschuk     uint64_t SizeInBits, uint32_t AlignInBits, DINodeArray Elements,
5537402fd9aSPaul Robinson     DIType *UnderlyingType, StringRef UniqueIdentifier, bool IsScoped) {
554a9308c49SDuncan P. N. Exon Smith   auto *CTy = DICompositeType::get(
555e274180fSDuncan P. N. Exon Smith       VMContext, dwarf::DW_TAG_enumeration_type, Name, File, LineNumber,
556a59d3e5aSDuncan P. N. Exon Smith       getNonCompileUnitScope(Scope), UnderlyingType, SizeInBits, AlignInBits, 0,
5577402fd9aSPaul Robinson       IsScoped ? DINode::FlagEnumClass : DINode::FlagZero, Elements, 0, nullptr,
55808dc66efSMomchil Velikov       nullptr, UniqueIdentifier);
5594f6bf27aSDavid Blaikie   AllEnumTypes.push_back(CTy);
560ea7f1c2dSAdrian Prantl   trackIfUnresolved(CTy);
5614f6bf27aSDavid Blaikie   return CTy;
562ef860a24SChandler Carruth }
563ef860a24SChandler Carruth 
createSetType(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNo,uint64_t SizeInBits,uint32_t AlignInBits,DIType * Ty)5648573c28aSAdrian Prantl DIDerivedType *DIBuilder::createSetType(DIScope *Scope, StringRef Name,
5658573c28aSAdrian Prantl                                         DIFile *File, unsigned LineNo,
5668573c28aSAdrian Prantl                                         uint64_t SizeInBits,
5678573c28aSAdrian Prantl                                         uint32_t AlignInBits, DIType *Ty) {
5688573c28aSAdrian Prantl   auto *R =
5698573c28aSAdrian Prantl       DIDerivedType::get(VMContext, dwarf::DW_TAG_set_type, Name, File, LineNo,
5708573c28aSAdrian Prantl                          getNonCompileUnitScope(Scope), Ty, SizeInBits,
5718573c28aSAdrian Prantl                          AlignInBits, 0, None, DINode::FlagZero);
5728573c28aSAdrian Prantl   trackIfUnresolved(R);
5738573c28aSAdrian Prantl   return R;
5748573c28aSAdrian Prantl }
5758573c28aSAdrian Prantl 
576665b4138SLuís Ferreira DICompositeType *
createArrayType(uint64_t Size,uint32_t AlignInBits,DIType * Ty,DINodeArray Subscripts,PointerUnion<DIExpression *,DIVariable * > DL,PointerUnion<DIExpression *,DIVariable * > AS,PointerUnion<DIExpression *,DIVariable * > AL,PointerUnion<DIExpression *,DIVariable * > RK)577665b4138SLuís Ferreira DIBuilder::createArrayType(uint64_t Size, uint32_t AlignInBits, DIType *Ty,
578665b4138SLuís Ferreira                            DINodeArray Subscripts,
5790b2b50a5SAdrian Prantl                            PointerUnion<DIExpression *, DIVariable *> DL,
5800b2b50a5SAdrian Prantl                            PointerUnion<DIExpression *, DIVariable *> AS,
5810b2b50a5SAdrian Prantl                            PointerUnion<DIExpression *, DIVariable *> AL,
5820b2b50a5SAdrian Prantl                            PointerUnion<DIExpression *, DIVariable *> RK) {
5830b2b50a5SAdrian Prantl   auto *R = DICompositeType::get(
584665b4138SLuís Ferreira       VMContext, dwarf::DW_TAG_array_type, "", nullptr, 0, nullptr, Ty, Size,
585665b4138SLuís Ferreira       AlignInBits, 0, DINode::FlagZero, Subscripts, 0, nullptr, nullptr, "",
586665b4138SLuís Ferreira       nullptr,
5870b2b50a5SAdrian Prantl       DL.is<DIExpression *>() ? (Metadata *)DL.get<DIExpression *>()
5880b2b50a5SAdrian Prantl                               : (Metadata *)DL.get<DIVariable *>(),
5890b2b50a5SAdrian Prantl       AS.is<DIExpression *>() ? (Metadata *)AS.get<DIExpression *>()
5900b2b50a5SAdrian Prantl                               : (Metadata *)AS.get<DIVariable *>(),
5910b2b50a5SAdrian Prantl       AL.is<DIExpression *>() ? (Metadata *)AL.get<DIExpression *>()
5920b2b50a5SAdrian Prantl                               : (Metadata *)AL.get<DIVariable *>(),
5930b2b50a5SAdrian Prantl       RK.is<DIExpression *>() ? (Metadata *)RK.get<DIExpression *>()
5940b2b50a5SAdrian Prantl                               : (Metadata *)RK.get<DIVariable *>());
595ea7f1c2dSAdrian Prantl   trackIfUnresolved(R);
596ea7f1c2dSAdrian Prantl   return R;
597ef860a24SChandler Carruth }
598ef860a24SChandler Carruth 
createVectorType(uint64_t Size,uint32_t AlignInBits,DIType * Ty,DINodeArray Subscripts)599a9308c49SDuncan P. N. Exon Smith DICompositeType *DIBuilder::createVectorType(uint64_t Size,
600197aa319SVictor Leschuk                                              uint32_t AlignInBits, DIType *Ty,
601a9308c49SDuncan P. N. Exon Smith                                              DINodeArray Subscripts) {
602a59d3e5aSDuncan P. N. Exon Smith   auto *R = DICompositeType::get(VMContext, dwarf::DW_TAG_array_type, "",
603a59d3e5aSDuncan P. N. Exon Smith                                  nullptr, 0, nullptr, Ty, Size, AlignInBits, 0,
604a9308c49SDuncan P. N. Exon Smith                                  DINode::FlagVector, Subscripts, 0, nullptr);
605ea7f1c2dSAdrian Prantl   trackIfUnresolved(R);
606ea7f1c2dSAdrian Prantl   return R;
607ef860a24SChandler Carruth }
608ef860a24SChandler Carruth 
createArtificialSubprogram(DISubprogram * SP)609cf88ffaaSRoman Tereshin DISubprogram *DIBuilder::createArtificialSubprogram(DISubprogram *SP) {
610cf88ffaaSRoman Tereshin   auto NewSP = SP->cloneWithFlags(SP->getFlags() | DINode::FlagArtificial);
611cf88ffaaSRoman Tereshin   return MDNode::replaceWithDistinct(std::move(NewSP));
612cf88ffaaSRoman Tereshin }
613cf88ffaaSRoman Tereshin 
createTypeWithFlags(const DIType * Ty,DINode::DIFlags FlagsToSet)614cf88ffaaSRoman Tereshin static DIType *createTypeWithFlags(const DIType *Ty,
6155fcc4185SLeny Kholodov                                    DINode::DIFlags FlagsToSet) {
616cf88ffaaSRoman Tereshin   auto NewTy = Ty->cloneWithFlags(Ty->getFlags() | FlagsToSet);
617e274180fSDuncan P. N. Exon Smith   return MDNode::replaceWithUniqued(std::move(NewTy));
618176b691dSDuncan P. N. Exon Smith }
619786cd049SDuncan P. N. Exon Smith 
createArtificialType(DIType * Ty)620a9308c49SDuncan P. N. Exon Smith DIType *DIBuilder::createArtificialType(DIType *Ty) {
621e274180fSDuncan P. N. Exon Smith   // FIXME: Restrict this to the nodes where it's valid.
622b1055640SDuncan P. N. Exon Smith   if (Ty->isArtificial())
623176b691dSDuncan P. N. Exon Smith     return Ty;
624cf88ffaaSRoman Tereshin   return createTypeWithFlags(Ty, DINode::FlagArtificial);
625ef860a24SChandler Carruth }
626ef860a24SChandler Carruth 
createObjectPointerType(DIType * Ty)627a9308c49SDuncan P. N. Exon Smith DIType *DIBuilder::createObjectPointerType(DIType *Ty) {
628e274180fSDuncan P. N. Exon Smith   // FIXME: Restrict this to the nodes where it's valid.
629b1055640SDuncan P. N. Exon Smith   if (Ty->isObjectPointer())
630ef860a24SChandler Carruth     return Ty;
6315fcc4185SLeny Kholodov   DINode::DIFlags Flags = DINode::FlagObjectPointer | DINode::FlagArtificial;
632cf88ffaaSRoman Tereshin   return createTypeWithFlags(Ty, Flags);
633ef860a24SChandler Carruth }
634ef860a24SChandler Carruth 
retainType(DIScope * T)63575819aedSAdrian Prantl void DIBuilder::retainType(DIScope *T) {
636b1055640SDuncan P. N. Exon Smith   assert(T && "Expected non-null type");
63775819aedSAdrian Prantl   assert((isa<DIType>(T) || (isa<DISubprogram>(T) &&
63875819aedSAdrian Prantl                              cast<DISubprogram>(T)->isDefinition() == false)) &&
63975819aedSAdrian Prantl          "Expected type or subprogram declaration");
640d9ccfb9eSDuncan P. N. Exon Smith   AllRetainTypes.emplace_back(T);
641d9ccfb9eSDuncan P. N. Exon Smith }
642ef860a24SChandler Carruth 
createUnspecifiedParameter()643a9308c49SDuncan P. N. Exon Smith DIBasicType *DIBuilder::createUnspecifiedParameter() { return nullptr; }
644ef860a24SChandler Carruth 
645a9308c49SDuncan P. N. Exon Smith DICompositeType *
createForwardDecl(unsigned Tag,StringRef Name,DIScope * Scope,DIFile * F,unsigned Line,unsigned RuntimeLang,uint64_t SizeInBits,uint32_t AlignInBits,StringRef UniqueIdentifier)646a9308c49SDuncan P. N. Exon Smith DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, DIScope *Scope,
647a9308c49SDuncan P. N. Exon Smith                              DIFile *F, unsigned Line, unsigned RuntimeLang,
648197aa319SVictor Leschuk                              uint64_t SizeInBits, uint32_t AlignInBits,
649547467b8SManman Ren                              StringRef UniqueIdentifier) {
650e274180fSDuncan P. N. Exon Smith   // FIXME: Define in terms of createReplaceableForwardDecl() by calling
651e274180fSDuncan P. N. Exon Smith   // replaceWithUniqued().
652a9308c49SDuncan P. N. Exon Smith   auto *RetTy = DICompositeType::get(
653a59d3e5aSDuncan P. N. Exon Smith       VMContext, Tag, Name, F, Line, getNonCompileUnitScope(Scope), nullptr,
654a59d3e5aSDuncan P. N. Exon Smith       SizeInBits, AlignInBits, 0, DINode::FlagFwdDecl, nullptr, RuntimeLang,
655a59d3e5aSDuncan P. N. Exon Smith       nullptr, nullptr, UniqueIdentifier);
656ea7f1c2dSAdrian Prantl   trackIfUnresolved(RetTy);
657d3f094a3SDavid Blaikie   return RetTy;
658d3f094a3SDavid Blaikie }
659d3f094a3SDavid Blaikie 
createReplaceableCompositeType(unsigned Tag,StringRef Name,DIScope * Scope,DIFile * F,unsigned Line,unsigned RuntimeLang,uint64_t SizeInBits,uint32_t AlignInBits,DINode::DIFlags Flags,StringRef UniqueIdentifier,DINodeArray Annotations)660a9308c49SDuncan P. N. Exon Smith DICompositeType *DIBuilder::createReplaceableCompositeType(
661a9308c49SDuncan P. N. Exon Smith     unsigned Tag, StringRef Name, DIScope *Scope, DIFile *F, unsigned Line,
662197aa319SVictor Leschuk     unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits,
6630b32dca1SYonghong Song     DINode::DIFlags Flags, StringRef UniqueIdentifier,
6640b32dca1SYonghong Song     DINodeArray Annotations) {
665a59d3e5aSDuncan P. N. Exon Smith   auto *RetTy =
666a59d3e5aSDuncan P. N. Exon Smith       DICompositeType::getTemporary(
667a59d3e5aSDuncan P. N. Exon Smith           VMContext, Tag, Name, F, Line, getNonCompileUnitScope(Scope), nullptr,
668a59d3e5aSDuncan P. N. Exon Smith           SizeInBits, AlignInBits, 0, Flags, nullptr, RuntimeLang, nullptr,
669665b4138SLuís Ferreira           nullptr, UniqueIdentifier, nullptr, nullptr, nullptr, nullptr,
670665b4138SLuís Ferreira           nullptr, Annotations)
671a9308c49SDuncan P. N. Exon Smith           .release();
672ea7f1c2dSAdrian Prantl   trackIfUnresolved(RetTy);
673d0e67aa1SManman Ren   return RetTy;
674ef860a24SChandler Carruth }
675ef860a24SChandler Carruth 
getOrCreateArray(ArrayRef<Metadata * > Elements)676a9308c49SDuncan P. N. Exon Smith DINodeArray DIBuilder::getOrCreateArray(ArrayRef<Metadata *> Elements) {
67702083539SDuncan P. N. Exon Smith   return MDTuple::get(VMContext, Elements);
678ef860a24SChandler Carruth }
679ef860a24SChandler Carruth 
68096075718SAmjad Aboud DIMacroNodeArray
getOrCreateMacroArray(ArrayRef<Metadata * > Elements)68196075718SAmjad Aboud DIBuilder::getOrCreateMacroArray(ArrayRef<Metadata *> Elements) {
68296075718SAmjad Aboud   return MDTuple::get(VMContext, Elements);
68396075718SAmjad Aboud }
68496075718SAmjad Aboud 
getOrCreateTypeArray(ArrayRef<Metadata * > Elements)685a9308c49SDuncan P. N. Exon Smith DITypeRefArray DIBuilder::getOrCreateTypeArray(ArrayRef<Metadata *> Elements) {
6865bf8fef5SDuncan P. N. Exon Smith   SmallVector<llvm::Metadata *, 16> Elts;
687c23ebf17SKazu Hirata   for (Metadata *E : Elements) {
688c23ebf17SKazu Hirata     if (isa_and_nonnull<MDNode>(E))
689c23ebf17SKazu Hirata       Elts.push_back(cast<DIType>(E));
6901a125c95SManman Ren     else
691c23ebf17SKazu Hirata       Elts.push_back(E);
6921a125c95SManman Ren   }
693a9308c49SDuncan P. N. Exon Smith   return DITypeRefArray(MDNode::get(VMContext, Elts));
6941a125c95SManman Ren }
6951a125c95SManman Ren 
getOrCreateSubrange(int64_t Lo,int64_t Count)696a9308c49SDuncan P. N. Exon Smith DISubrange *DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) {
697d20bf5a7SAlok Kumar Sharma   auto *LB = ConstantAsMetadata::get(
698d20bf5a7SAlok Kumar Sharma       ConstantInt::getSigned(Type::getInt64Ty(VMContext), Lo));
699d20bf5a7SAlok Kumar Sharma   auto *CountNode = ConstantAsMetadata::get(
700d20bf5a7SAlok Kumar Sharma       ConstantInt::getSigned(Type::getInt64Ty(VMContext), Count));
701d20bf5a7SAlok Kumar Sharma   return DISubrange::get(VMContext, CountNode, LB, nullptr, nullptr);
702ef860a24SChandler Carruth }
703ef860a24SChandler Carruth 
getOrCreateSubrange(int64_t Lo,Metadata * CountNode)704fdf40917SSander de Smalen DISubrange *DIBuilder::getOrCreateSubrange(int64_t Lo, Metadata *CountNode) {
705d20bf5a7SAlok Kumar Sharma   auto *LB = ConstantAsMetadata::get(
706d20bf5a7SAlok Kumar Sharma       ConstantInt::getSigned(Type::getInt64Ty(VMContext), Lo));
707d20bf5a7SAlok Kumar Sharma   return DISubrange::get(VMContext, CountNode, LB, nullptr, nullptr);
708d20bf5a7SAlok Kumar Sharma }
709d20bf5a7SAlok Kumar Sharma 
getOrCreateSubrange(Metadata * CountNode,Metadata * LB,Metadata * UB,Metadata * Stride)710d20bf5a7SAlok Kumar Sharma DISubrange *DIBuilder::getOrCreateSubrange(Metadata *CountNode, Metadata *LB,
711d20bf5a7SAlok Kumar Sharma                                            Metadata *UB, Metadata *Stride) {
712d20bf5a7SAlok Kumar Sharma   return DISubrange::get(VMContext, CountNode, LB, UB, Stride);
713fdf40917SSander de Smalen }
714fdf40917SSander de Smalen 
getOrCreateGenericSubrange(DIGenericSubrange::BoundType CountNode,DIGenericSubrange::BoundType LB,DIGenericSubrange::BoundType UB,DIGenericSubrange::BoundType Stride)715a6dd01afSAlok Kumar Sharma DIGenericSubrange *DIBuilder::getOrCreateGenericSubrange(
716a6dd01afSAlok Kumar Sharma     DIGenericSubrange::BoundType CountNode, DIGenericSubrange::BoundType LB,
717a6dd01afSAlok Kumar Sharma     DIGenericSubrange::BoundType UB, DIGenericSubrange::BoundType Stride) {
718a6dd01afSAlok Kumar Sharma   auto ConvToMetadata = [&](DIGenericSubrange::BoundType Bound) -> Metadata * {
719a6dd01afSAlok Kumar Sharma     return Bound.is<DIExpression *>() ? (Metadata *)Bound.get<DIExpression *>()
720a6dd01afSAlok Kumar Sharma                                       : (Metadata *)Bound.get<DIVariable *>();
721a6dd01afSAlok Kumar Sharma   };
722a6dd01afSAlok Kumar Sharma   return DIGenericSubrange::get(VMContext, ConvToMetadata(CountNode),
723a6dd01afSAlok Kumar Sharma                                 ConvToMetadata(LB), ConvToMetadata(UB),
724a6dd01afSAlok Kumar Sharma                                 ConvToMetadata(Stride));
725a6dd01afSAlok Kumar Sharma }
726a6dd01afSAlok Kumar Sharma 
checkGlobalVariableScope(DIScope * Context)727a9308c49SDuncan P. N. Exon Smith static void checkGlobalVariableScope(DIScope *Context) {
728430220f0SDuncan P. N. Exon Smith #ifndef NDEBUG
729b1055640SDuncan P. N. Exon Smith   if (auto *CT =
730a9308c49SDuncan P. N. Exon Smith           dyn_cast_or_null<DICompositeType>(getNonCompileUnitScope(Context)))
731b1055640SDuncan P. N. Exon Smith     assert(CT->getIdentifier().empty() &&
732bfd2b829SManman Ren            "Context of a global variable should not be a type with identifier");
733430220f0SDuncan P. N. Exon Smith #endif
734bfd2b829SManman Ren }
7355e6bc9e1SFrederic Riss 
createGlobalVariableExpression(DIScope * Context,StringRef Name,StringRef LinkageName,DIFile * F,unsigned LineNumber,DIType * Ty,bool IsLocalToUnit,bool isDefined,DIExpression * Expr,MDNode * Decl,MDTuple * TemplateParams,uint32_t AlignInBits,DINodeArray Annotations)736bceaaa96SAdrian Prantl DIGlobalVariableExpression *DIBuilder::createGlobalVariableExpression(
737a9308c49SDuncan P. N. Exon Smith     DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F,
738665b4138SLuís Ferreira     unsigned LineNumber, DIType *Ty, bool IsLocalToUnit, bool isDefined,
739665b4138SLuís Ferreira     DIExpression *Expr, MDNode *Decl, MDTuple *TemplateParams,
740665b4138SLuís Ferreira     uint32_t AlignInBits, DINodeArray Annotations) {
741e274180fSDuncan P. N. Exon Smith   checkGlobalVariableScope(Context);
742e274180fSDuncan P. N. Exon Smith 
743bceaaa96SAdrian Prantl   auto *GV = DIGlobalVariable::getDistinct(
744c5225dfbSDuncan P. N. Exon Smith       VMContext, cast_or_null<DIScope>(Context), Name, LinkageName, F,
745665b4138SLuís Ferreira       LineNumber, Ty, IsLocalToUnit, isDefined,
746665b4138SLuís Ferreira       cast_or_null<DIDerivedType>(Decl), TemplateParams, AlignInBits,
747665b4138SLuís Ferreira       Annotations);
74805782218SAdrian Prantl   if (!Expr)
74905782218SAdrian Prantl     Expr = createExpression();
750bceaaa96SAdrian Prantl   auto *N = DIGlobalVariableExpression::get(VMContext, GV, Expr);
751e274180fSDuncan P. N. Exon Smith   AllGVs.push_back(N);
752e274180fSDuncan P. N. Exon Smith   return N;
7535e6bc9e1SFrederic Riss }
7545e6bc9e1SFrederic Riss 
createTempGlobalVariableFwdDecl(DIScope * Context,StringRef Name,StringRef LinkageName,DIFile * F,unsigned LineNumber,DIType * Ty,bool IsLocalToUnit,MDNode * Decl,MDTuple * TemplateParams,uint32_t AlignInBits)755a9308c49SDuncan P. N. Exon Smith DIGlobalVariable *DIBuilder::createTempGlobalVariableFwdDecl(
756a9308c49SDuncan P. N. Exon Smith     DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F,
7573654ed21SSimon Pilgrim     unsigned LineNumber, DIType *Ty, bool IsLocalToUnit, MDNode *Decl,
7583654ed21SSimon Pilgrim     MDTuple *TemplateParams, uint32_t AlignInBits) {
759e274180fSDuncan P. N. Exon Smith   checkGlobalVariableScope(Context);
760e274180fSDuncan P. N. Exon Smith 
761a9308c49SDuncan P. N. Exon Smith   return DIGlobalVariable::getTemporary(
762a9308c49SDuncan P. N. Exon Smith              VMContext, cast_or_null<DIScope>(Context), Name, LinkageName, F,
7633654ed21SSimon Pilgrim              LineNumber, Ty, IsLocalToUnit, false,
76430c28848SYonghong Song              cast_or_null<DIDerivedType>(Decl), TemplateParams, AlignInBits,
76530c28848SYonghong Song              nullptr)
766b273d06bSDuncan P. N. Exon Smith       .release();
767ef860a24SChandler Carruth }
768ef860a24SChandler Carruth 
createLocalVariable(LLVMContext & VMContext,DenseMap<MDNode *,SmallVector<TrackingMDNodeRef,1>> & PreservedVariables,DIScope * Scope,StringRef Name,unsigned ArgNo,DIFile * File,unsigned LineNo,DIType * Ty,bool AlwaysPreserve,DINode::DIFlags Flags,uint32_t AlignInBits,DINodeArray Annotations=nullptr)7691e40dc42SDuncan P. N. Exon Smith static DILocalVariable *createLocalVariable(
7701e40dc42SDuncan P. N. Exon Smith     LLVMContext &VMContext,
7713c406c2dSDuncan P. N. Exon Smith     DenseMap<MDNode *, SmallVector<TrackingMDNodeRef, 1>> &PreservedVariables,
7721e40dc42SDuncan P. N. Exon Smith     DIScope *Scope, StringRef Name, unsigned ArgNo, DIFile *File,
7732ede126bSVictor Leschuk     unsigned LineNo, DIType *Ty, bool AlwaysPreserve, DINode::DIFlags Flags,
7741bebc31cSYonghong Song     uint32_t AlignInBits, DINodeArray Annotations = nullptr) {
775e274180fSDuncan P. N. Exon Smith   // FIXME: Why getNonCompileUnitScope()?
776e274180fSDuncan P. N. Exon Smith   // FIXME: Why is "!Context" okay here?
77712d52849SAdrian Prantl   // FIXME: Why doesn't this check for a subprogram or lexical block (AFAICT
778e274180fSDuncan P. N. Exon Smith   // the only valid scopes)?
779a9308c49SDuncan P. N. Exon Smith   DIScope *Context = getNonCompileUnitScope(Scope);
780e274180fSDuncan P. N. Exon Smith 
781665b4138SLuís Ferreira   auto *Node = DILocalVariable::get(
782665b4138SLuís Ferreira       VMContext, cast_or_null<DILocalScope>(Context), Name, File, LineNo, Ty,
783665b4138SLuís Ferreira       ArgNo, Flags, AlignInBits, Annotations);
784ef860a24SChandler Carruth   if (AlwaysPreserve) {
78512d52849SAdrian Prantl     // The optimizer may remove local variables. If there is an interest
786ef860a24SChandler Carruth     // to preserve variable info in such situation then stash it in a
787ef860a24SChandler Carruth     // named mdnode.
788a9308c49SDuncan P. N. Exon Smith     DISubprogram *Fn = getDISubprogram(Scope);
7893bfffde2SDuncan P. N. Exon Smith     assert(Fn && "Missing subprogram for local variable");
7905bf8fef5SDuncan P. N. Exon Smith     PreservedVariables[Fn].emplace_back(Node);
791ef860a24SChandler Carruth   }
792e274180fSDuncan P. N. Exon Smith   return Node;
793ef860a24SChandler Carruth }
794ef860a24SChandler Carruth 
createAutoVariable(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNo,DIType * Ty,bool AlwaysPreserve,DINode::DIFlags Flags,uint32_t AlignInBits)7951e40dc42SDuncan P. N. Exon Smith DILocalVariable *DIBuilder::createAutoVariable(DIScope *Scope, StringRef Name,
7961e40dc42SDuncan P. N. Exon Smith                                                DIFile *File, unsigned LineNo,
7971e40dc42SDuncan P. N. Exon Smith                                                DIType *Ty, bool AlwaysPreserve,
7982ede126bSVictor Leschuk                                                DINode::DIFlags Flags,
7992ede126bSVictor Leschuk                                                uint32_t AlignInBits) {
8001e40dc42SDuncan P. N. Exon Smith   return createLocalVariable(VMContext, PreservedVariables, Scope, Name,
8011e40dc42SDuncan P. N. Exon Smith                              /* ArgNo */ 0, File, LineNo, Ty, AlwaysPreserve,
8022ede126bSVictor Leschuk                              Flags, AlignInBits);
8031e40dc42SDuncan P. N. Exon Smith }
8041e40dc42SDuncan P. N. Exon Smith 
createParameterVariable(DIScope * Scope,StringRef Name,unsigned ArgNo,DIFile * File,unsigned LineNo,DIType * Ty,bool AlwaysPreserve,DINode::DIFlags Flags,DINodeArray Annotations)8051e40dc42SDuncan P. N. Exon Smith DILocalVariable *DIBuilder::createParameterVariable(
8061e40dc42SDuncan P. N. Exon Smith     DIScope *Scope, StringRef Name, unsigned ArgNo, DIFile *File,
8071bebc31cSYonghong Song     unsigned LineNo, DIType *Ty, bool AlwaysPreserve, DINode::DIFlags Flags,
8081bebc31cSYonghong Song     DINodeArray Annotations) {
8091e40dc42SDuncan P. N. Exon Smith   assert(ArgNo && "Expected non-zero argument number for parameter");
8101e40dc42SDuncan P. N. Exon Smith   return createLocalVariable(VMContext, PreservedVariables, Scope, Name, ArgNo,
8112ede126bSVictor Leschuk                              File, LineNo, Ty, AlwaysPreserve, Flags,
812665b4138SLuís Ferreira                              /*AlignInBits=*/0, Annotations);
8131e40dc42SDuncan P. N. Exon Smith }
8141e40dc42SDuncan P. N. Exon Smith 
createLabel(DIScope * Scope,StringRef Name,DIFile * File,unsigned LineNo,bool AlwaysPreserve)815665b4138SLuís Ferreira DILabel *DIBuilder::createLabel(DIScope *Scope, StringRef Name, DIFile *File,
8162c864551SShiva Chen                                 unsigned LineNo, bool AlwaysPreserve) {
8172c864551SShiva Chen   DIScope *Context = getNonCompileUnitScope(Scope);
8182c864551SShiva Chen 
819665b4138SLuís Ferreira   auto *Node = DILabel::get(VMContext, cast_or_null<DILocalScope>(Context),
820665b4138SLuís Ferreira                             Name, File, LineNo);
8212c864551SShiva Chen 
8222c864551SShiva Chen   if (AlwaysPreserve) {
8232c864551SShiva Chen     /// The optimizer may remove labels. If there is an interest
8242c864551SShiva Chen     /// to preserve label info in such situation then append it to
8252c864551SShiva Chen     /// the list of retained nodes of the DISubprogram.
8262c864551SShiva Chen     DISubprogram *Fn = getDISubprogram(Scope);
8272c864551SShiva Chen     assert(Fn && "Missing subprogram for label");
8282c864551SShiva Chen     PreservedLabels[Fn].emplace_back(Node);
8292c864551SShiva Chen   }
8302c864551SShiva Chen   return Node;
8312c864551SShiva Chen }
8322c864551SShiva Chen 
createExpression(ArrayRef<uint64_t> Addr)833a9308c49SDuncan P. N. Exon Smith DIExpression *DIBuilder::createExpression(ArrayRef<uint64_t> Addr) {
834a9308c49SDuncan P. N. Exon Smith   return DIExpression::get(VMContext, Addr);
835ef860a24SChandler Carruth }
836ef860a24SChandler Carruth 
837b2df6472SDuncan P. N. Exon Smith template <class... Ts>
getSubprogram(bool IsDistinct,Ts &&...Args)838b2df6472SDuncan P. N. Exon Smith static DISubprogram *getSubprogram(bool IsDistinct, Ts &&...Args) {
839b2df6472SDuncan P. N. Exon Smith   if (IsDistinct)
840b2df6472SDuncan P. N. Exon Smith     return DISubprogram::getDistinct(std::forward<Ts>(Args)...);
841b2df6472SDuncan P. N. Exon Smith   return DISubprogram::get(std::forward<Ts>(Args)...);
842b2df6472SDuncan P. N. Exon Smith }
843b2df6472SDuncan P. N. Exon Smith 
createFunction(DIScope * Context,StringRef Name,StringRef LinkageName,DIFile * File,unsigned LineNo,DISubroutineType * Ty,unsigned ScopeLine,DINode::DIFlags Flags,DISubprogram::DISPFlags SPFlags,DITemplateParameterArray TParams,DISubprogram * Decl,DITypeArray ThrownTypes,DINodeArray Annotations,StringRef TargetFuncName)844d4bff303SPeter Collingbourne DISubprogram *DIBuilder::createFunction(
845d4bff303SPeter Collingbourne     DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *File,
846cda54210SPaul Robinson     unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine,
847cda54210SPaul Robinson     DINode::DIFlags Flags, DISubprogram::DISPFlags SPFlags,
848cda54210SPaul Robinson     DITemplateParameterArray TParams, DISubprogram *Decl,
849*eab6e94fSChih-Ping Chen     DITypeArray ThrownTypes, DINodeArray Annotations,
850*eab6e94fSChih-Ping Chen     StringRef TargetFuncName) {
851cda54210SPaul Robinson   bool IsDefinition = SPFlags & DISubprogram::SPFlagDefinition;
85275819aedSAdrian Prantl   auto *Node = getSubprogram(
853cda54210SPaul Robinson       /*IsDistinct=*/IsDefinition, VMContext, getNonCompileUnitScope(Context),
854cda54210SPaul Robinson       Name, LinkageName, File, LineNo, Ty, ScopeLine, nullptr, 0, 0, Flags,
855cda54210SPaul Robinson       SPFlags, IsDefinition ? CUNode : nullptr, TParams, Decl,
856d383df32SYonghong Song       MDTuple::getTemporary(VMContext, None).release(), ThrownTypes,
857*eab6e94fSChih-Ping Chen       Annotations, TargetFuncName);
858e274180fSDuncan P. N. Exon Smith 
859cda54210SPaul Robinson   if (IsDefinition)
8605e6bc9e1SFrederic Riss     AllSubprograms.push_back(Node);
861ea7f1c2dSAdrian Prantl   trackIfUnresolved(Node);
8625e6bc9e1SFrederic Riss   return Node;
8635e6bc9e1SFrederic Riss }
8645e6bc9e1SFrederic Riss 
createTempFunctionFwdDecl(DIScope * Context,StringRef Name,StringRef LinkageName,DIFile * File,unsigned LineNo,DISubroutineType * Ty,unsigned ScopeLine,DINode::DIFlags Flags,DISubprogram::DISPFlags SPFlags,DITemplateParameterArray TParams,DISubprogram * Decl,DITypeArray ThrownTypes)865a9308c49SDuncan P. N. Exon Smith DISubprogram *DIBuilder::createTempFunctionFwdDecl(
866a9308c49SDuncan P. N. Exon Smith     DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *File,
867cda54210SPaul Robinson     unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine,
868cda54210SPaul Robinson     DINode::DIFlags Flags, DISubprogram::DISPFlags SPFlags,
869cda54210SPaul Robinson     DITemplateParameterArray TParams, DISubprogram *Decl,
8701d12b885SAdrian Prantl     DITypeArray ThrownTypes) {
871cda54210SPaul Robinson   bool IsDefinition = SPFlags & DISubprogram::SPFlagDefinition;
872cda54210SPaul Robinson   return DISubprogram::getTemporary(VMContext, getNonCompileUnitScope(Context),
873cda54210SPaul Robinson                                     Name, LinkageName, File, LineNo, Ty,
874cda54210SPaul Robinson                                     ScopeLine, nullptr, 0, 0, Flags, SPFlags,
875cda54210SPaul Robinson                                     IsDefinition ? CUNode : nullptr, TParams,
876cda54210SPaul Robinson                                     Decl, nullptr, ThrownTypes)
877a9308c49SDuncan P. N. Exon Smith       .release();
8785e6bc9e1SFrederic Riss }
8795e6bc9e1SFrederic Riss 
createMethod(DIScope * Context,StringRef Name,StringRef LinkageName,DIFile * F,unsigned LineNo,DISubroutineType * Ty,unsigned VIndex,int ThisAdjustment,DIType * VTableHolder,DINode::DIFlags Flags,DISubprogram::DISPFlags SPFlags,DITemplateParameterArray TParams,DITypeArray ThrownTypes)8801d12b885SAdrian Prantl DISubprogram *DIBuilder::createMethod(
8811d12b885SAdrian Prantl     DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F,
882cda54210SPaul Robinson     unsigned LineNo, DISubroutineType *Ty, unsigned VIndex, int ThisAdjustment,
883cda54210SPaul Robinson     DIType *VTableHolder, DINode::DIFlags Flags,
884cda54210SPaul Robinson     DISubprogram::DISPFlags SPFlags, DITemplateParameterArray TParams,
885cda54210SPaul Robinson     DITypeArray ThrownTypes) {
8865cb56322SEric Christopher   assert(getNonCompileUnitScope(Context) &&
8875cb56322SEric Christopher          "Methods should have both a Context and a context that isn't "
8885cb56322SEric Christopher          "the compile unit.");
889ef860a24SChandler Carruth   // FIXME: Do we want to use different scope/lines?
890cda54210SPaul Robinson   bool IsDefinition = SPFlags & DISubprogram::SPFlagDefinition;
891d4bff303SPeter Collingbourne   auto *SP = getSubprogram(
892cda54210SPaul Robinson       /*IsDistinct=*/IsDefinition, VMContext, cast<DIScope>(Context), Name,
893cda54210SPaul Robinson       LinkageName, F, LineNo, Ty, LineNo, VTableHolder, VIndex, ThisAdjustment,
894cda54210SPaul Robinson       Flags, SPFlags, IsDefinition ? CUNode : nullptr, TParams, nullptr,
895cda54210SPaul Robinson       nullptr, ThrownTypes);
896e274180fSDuncan P. N. Exon Smith 
897cda54210SPaul Robinson   if (IsDefinition)
8989d1cf4c1SDuncan P. N. Exon Smith     AllSubprograms.push_back(SP);
8999d1cf4c1SDuncan P. N. Exon Smith   trackIfUnresolved(SP);
9009d1cf4c1SDuncan P. N. Exon Smith   return SP;
901ef860a24SChandler Carruth }
902ef860a24SChandler Carruth 
createCommonBlock(DIScope * Scope,DIGlobalVariable * Decl,StringRef Name,DIFile * File,unsigned LineNo)903665b4138SLuís Ferreira DICommonBlock *DIBuilder::createCommonBlock(DIScope *Scope,
904665b4138SLuís Ferreira                                             DIGlobalVariable *Decl,
905665b4138SLuís Ferreira                                             StringRef Name, DIFile *File,
9066ed5706aSAdrian Prantl                                             unsigned LineNo) {
907665b4138SLuís Ferreira   return DICommonBlock::get(VMContext, Scope, Decl, Name, File, LineNo);
9086ed5706aSAdrian Prantl }
9096ed5706aSAdrian Prantl 
createNameSpace(DIScope * Scope,StringRef Name,bool ExportSymbols)910a9308c49SDuncan P. N. Exon Smith DINamespace *DIBuilder::createNameSpace(DIScope *Scope, StringRef Name,
911dbfda636SAdrian Prantl                                         bool ExportSymbols) {
912fed4f399SAdrian Prantl 
913fed4f399SAdrian Prantl   // It is okay to *not* make anonymous top-level namespaces distinct, because
914fed4f399SAdrian Prantl   // all nodes that have an anonymous namespace as their parent scope are
915fed4f399SAdrian Prantl   // guaranteed to be unique and/or are linked to their containing
916fed4f399SAdrian Prantl   // DICompileUnit. This decision is an explicit tradeoff of link time versus
917fed4f399SAdrian Prantl   // memory usage versus code simplicity and may get revisited in the future.
918fed4f399SAdrian Prantl   return DINamespace::get(VMContext, getNonCompileUnitScope(Scope), Name,
919fed4f399SAdrian Prantl                           ExportSymbols);
920ef860a24SChandler Carruth }
921ef860a24SChandler Carruth 
createModule(DIScope * Scope,StringRef Name,StringRef ConfigurationMacros,StringRef IncludePath,StringRef APINotesFile,DIFile * File,unsigned LineNo,bool IsDecl)922ab1243feSAdrian Prantl DIModule *DIBuilder::createModule(DIScope *Scope, StringRef Name,
923ab1243feSAdrian Prantl                                   StringRef ConfigurationMacros,
924e59744fdSSourabh Singh Tomar                                   StringRef IncludePath, StringRef APINotesFile,
9255f75dcf5SChih-Ping Chen                                   DIFile *File, unsigned LineNo, bool IsDecl) {
926e59744fdSSourabh Singh Tomar   return DIModule::get(VMContext, File, getNonCompileUnitScope(Scope), Name,
9275f75dcf5SChih-Ping Chen                        ConfigurationMacros, IncludePath, APINotesFile, LineNo,
9285f75dcf5SChih-Ping Chen                        IsDecl);
929ab1243feSAdrian Prantl }
930ab1243feSAdrian Prantl 
createLexicalBlockFile(DIScope * Scope,DIFile * File,unsigned Discriminator)931a9308c49SDuncan P. N. Exon Smith DILexicalBlockFile *DIBuilder::createLexicalBlockFile(DIScope *Scope,
932a9308c49SDuncan P. N. Exon Smith                                                       DIFile *File,
9332f3f76fdSDavid Blaikie                                                       unsigned Discriminator) {
934a9308c49SDuncan P. N. Exon Smith   return DILexicalBlockFile::get(VMContext, Scope, File, Discriminator);
935ef860a24SChandler Carruth }
936ef860a24SChandler Carruth 
createLexicalBlock(DIScope * Scope,DIFile * File,unsigned Line,unsigned Col)937a9308c49SDuncan P. N. Exon Smith DILexicalBlock *DIBuilder::createLexicalBlock(DIScope *Scope, DIFile *File,
9382f3f76fdSDavid Blaikie                                               unsigned Line, unsigned Col) {
939e274180fSDuncan P. N. Exon Smith   // Make these distinct, to avoid merging two lexical blocks on the same
940e274180fSDuncan P. N. Exon Smith   // file/line/column.
941a9308c49SDuncan P. N. Exon Smith   return DILexicalBlock::getDistinct(VMContext, getNonCompileUnitScope(Scope),
94235ef22cfSDuncan P. N. Exon Smith                                      File, Line, Col);
943ef860a24SChandler Carruth }
944ef860a24SChandler Carruth 
insertDeclare(Value * Storage,DILocalVariable * VarInfo,DIExpression * Expr,const DILocation * DL,Instruction * InsertBefore)945bc669474SReid Kleckner Instruction *DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo,
946bc669474SReid Kleckner                                       DIExpression *Expr, const DILocation *DL,
947bc669474SReid Kleckner                                       Instruction *InsertBefore) {
948bc669474SReid Kleckner   return insertDeclare(Storage, VarInfo, Expr, DL, InsertBefore->getParent(),
949bc669474SReid Kleckner                        InsertBefore);
950bc669474SReid Kleckner }
951bc669474SReid Kleckner 
insertDeclare(Value * Storage,DILocalVariable * VarInfo,DIExpression * Expr,const DILocation * DL,BasicBlock * InsertAtEnd)952bc669474SReid Kleckner Instruction *DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo,
953bc669474SReid Kleckner                                       DIExpression *Expr, const DILocation *DL,
954bc669474SReid Kleckner                                       BasicBlock *InsertAtEnd) {
955bc669474SReid Kleckner   // If this block already has a terminator then insert this intrinsic before
956bc669474SReid Kleckner   // the terminator. Otherwise, put it at the end of the block.
957bc669474SReid Kleckner   Instruction *InsertBefore = InsertAtEnd->getTerminator();
958bc669474SReid Kleckner   return insertDeclare(Storage, VarInfo, Expr, DL, InsertAtEnd, InsertBefore);
959bc669474SReid Kleckner }
960bc669474SReid Kleckner 
insertLabel(DILabel * LabelInfo,const DILocation * DL,Instruction * InsertBefore)9612c864551SShiva Chen Instruction *DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL,
9622c864551SShiva Chen                                     Instruction *InsertBefore) {
963665b4138SLuís Ferreira   return insertLabel(LabelInfo, DL,
964665b4138SLuís Ferreira                      InsertBefore ? InsertBefore->getParent() : nullptr,
9652c864551SShiva Chen                      InsertBefore);
9662c864551SShiva Chen }
9672c864551SShiva Chen 
insertLabel(DILabel * LabelInfo,const DILocation * DL,BasicBlock * InsertAtEnd)9682c864551SShiva Chen Instruction *DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL,
9692c864551SShiva Chen                                     BasicBlock *InsertAtEnd) {
9702c864551SShiva Chen   return insertLabel(LabelInfo, DL, InsertAtEnd, nullptr);
9712c864551SShiva Chen }
9722c864551SShiva Chen 
insertDbgValueIntrinsic(Value * V,DILocalVariable * VarInfo,DIExpression * Expr,const DILocation * DL,Instruction * InsertBefore)973bc669474SReid Kleckner Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V,
974bc669474SReid Kleckner                                                 DILocalVariable *VarInfo,
975bc669474SReid Kleckner                                                 DIExpression *Expr,
976bc669474SReid Kleckner                                                 const DILocation *DL,
977bc669474SReid Kleckner                                                 Instruction *InsertBefore) {
978bc669474SReid Kleckner   return insertDbgValueIntrinsic(
979bc669474SReid Kleckner       V, VarInfo, Expr, DL, InsertBefore ? InsertBefore->getParent() : nullptr,
980bc669474SReid Kleckner       InsertBefore);
981bc669474SReid Kleckner }
982bc669474SReid Kleckner 
insertDbgValueIntrinsic(Value * V,DILocalVariable * VarInfo,DIExpression * Expr,const DILocation * DL,BasicBlock * InsertAtEnd)983bc669474SReid Kleckner Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V,
984bc669474SReid Kleckner                                                 DILocalVariable *VarInfo,
985bc669474SReid Kleckner                                                 DIExpression *Expr,
986bc669474SReid Kleckner                                                 const DILocation *DL,
987bc669474SReid Kleckner                                                 BasicBlock *InsertAtEnd) {
988bc669474SReid Kleckner   return insertDbgValueIntrinsic(V, VarInfo, Expr, DL, InsertAtEnd, nullptr);
989bc669474SReid Kleckner }
990bc669474SReid Kleckner 
insertDbgAddrIntrinsic(Value * V,DILocalVariable * VarInfo,DIExpression * Expr,const DILocation * DL,Instruction * InsertBefore)9917ed95d15SMichael Gottesman Instruction *DIBuilder::insertDbgAddrIntrinsic(Value *V,
9927ed95d15SMichael Gottesman                                                DILocalVariable *VarInfo,
9937ed95d15SMichael Gottesman                                                DIExpression *Expr,
9947ed95d15SMichael Gottesman                                                const DILocation *DL,
9957ed95d15SMichael Gottesman                                                Instruction *InsertBefore) {
9967ed95d15SMichael Gottesman   return insertDbgAddrIntrinsic(
9977ed95d15SMichael Gottesman       V, VarInfo, Expr, DL, InsertBefore ? InsertBefore->getParent() : nullptr,
9987ed95d15SMichael Gottesman       InsertBefore);
9997ed95d15SMichael Gottesman }
10007ed95d15SMichael Gottesman 
insertDbgAddrIntrinsic(Value * V,DILocalVariable * VarInfo,DIExpression * Expr,const DILocation * DL,BasicBlock * InsertAtEnd)10017ed95d15SMichael Gottesman Instruction *DIBuilder::insertDbgAddrIntrinsic(Value *V,
10027ed95d15SMichael Gottesman                                                DILocalVariable *VarInfo,
10037ed95d15SMichael Gottesman                                                DIExpression *Expr,
10047ed95d15SMichael Gottesman                                                const DILocation *DL,
10057ed95d15SMichael Gottesman                                                BasicBlock *InsertAtEnd) {
10067ed95d15SMichael Gottesman   return insertDbgAddrIntrinsic(V, VarInfo, Expr, DL, InsertAtEnd, nullptr);
10077ed95d15SMichael Gottesman }
10087ed95d15SMichael Gottesman 
100980397d2dSNikita Popov /// Initialize IRBuilder for inserting dbg.declare and dbg.value intrinsics.
101080397d2dSNikita Popov /// This abstracts over the various ways to specify an insert position.
initIRBuilder(IRBuilder<> & Builder,const DILocation * DL,BasicBlock * InsertBB,Instruction * InsertBefore)101180397d2dSNikita Popov static void initIRBuilder(IRBuilder<> &Builder, const DILocation *DL,
101280397d2dSNikita Popov                           BasicBlock *InsertBB, Instruction *InsertBefore) {
1013bc669474SReid Kleckner   if (InsertBefore)
101480397d2dSNikita Popov     Builder.SetInsertPoint(InsertBefore);
1015bc669474SReid Kleckner   else if (InsertBB)
101680397d2dSNikita Popov     Builder.SetInsertPoint(InsertBB);
101780397d2dSNikita Popov   Builder.SetCurrentDebugLocation(DL);
1018bc669474SReid Kleckner }
1019bc669474SReid Kleckner 
getDbgIntrinsicValueImpl(LLVMContext & VMContext,Value * V)10205bf8fef5SDuncan P. N. Exon Smith static Value *getDbgIntrinsicValueImpl(LLVMContext &VMContext, Value *V) {
10215bf8fef5SDuncan P. N. Exon Smith   assert(V && "no value passed to dbg intrinsic");
10225bf8fef5SDuncan P. N. Exon Smith   return MetadataAsValue::get(VMContext, ValueAsMetadata::get(V));
10235bf8fef5SDuncan P. N. Exon Smith }
10245bf8fef5SDuncan P. N. Exon Smith 
getDeclareIntrin(Module & M)10250fe506bcSReid Kleckner static Function *getDeclareIntrin(Module &M) {
10260fe506bcSReid Kleckner   return Intrinsic::getDeclaration(&M, UseDbgAddr ? Intrinsic::dbg_addr
10270fe506bcSReid Kleckner                                                   : Intrinsic::dbg_declare);
10280fe506bcSReid Kleckner }
10290fe506bcSReid Kleckner 
insertDbgValueIntrinsic(llvm::Value * Val,DILocalVariable * VarInfo,DIExpression * Expr,const DILocation * DL,BasicBlock * InsertBB,Instruction * InsertBefore)103024bc072eSAdrian Prantl Instruction *DIBuilder::insertDbgValueIntrinsic(
103124bc072eSAdrian Prantl     llvm::Value *Val, DILocalVariable *VarInfo, DIExpression *Expr,
103224bc072eSAdrian Prantl     const DILocation *DL, BasicBlock *InsertBB, Instruction *InsertBefore) {
103324bc072eSAdrian Prantl   if (!ValueFn)
103424bc072eSAdrian Prantl     ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
103524bc072eSAdrian Prantl   return insertDbgIntrinsic(ValueFn, Val, VarInfo, Expr, DL, InsertBB,
103624bc072eSAdrian Prantl                             InsertBefore);
103724bc072eSAdrian Prantl }
103824bc072eSAdrian Prantl 
insertDbgAddrIntrinsic(llvm::Value * Val,DILocalVariable * VarInfo,DIExpression * Expr,const DILocation * DL,BasicBlock * InsertBB,Instruction * InsertBefore)103924bc072eSAdrian Prantl Instruction *DIBuilder::insertDbgAddrIntrinsic(
104024bc072eSAdrian Prantl     llvm::Value *Val, DILocalVariable *VarInfo, DIExpression *Expr,
104124bc072eSAdrian Prantl     const DILocation *DL, BasicBlock *InsertBB, Instruction *InsertBefore) {
104224bc072eSAdrian Prantl   if (!AddrFn)
104324bc072eSAdrian Prantl     AddrFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_addr);
104424bc072eSAdrian Prantl   return insertDbgIntrinsic(AddrFn, Val, VarInfo, Expr, DL, InsertBB,
104524bc072eSAdrian Prantl                             InsertBefore);
104624bc072eSAdrian Prantl }
104724bc072eSAdrian Prantl 
insertDeclare(Value * Storage,DILocalVariable * VarInfo,DIExpression * Expr,const DILocation * DL,BasicBlock * InsertBB,Instruction * InsertBefore)1048a9308c49SDuncan P. N. Exon Smith Instruction *DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo,
1049a9308c49SDuncan P. N. Exon Smith                                       DIExpression *Expr, const DILocation *DL,
1050665b4138SLuís Ferreira                                       BasicBlock *InsertBB,
1051665b4138SLuís Ferreira                                       Instruction *InsertBefore) {
1052a9308c49SDuncan P. N. Exon Smith   assert(VarInfo && "empty or invalid DILocalVariable* passed to dbg.declare");
1053cd1aecfeSDuncan P. N. Exon Smith   assert(DL && "Expected debug loc");
1054cd1aecfeSDuncan P. N. Exon Smith   assert(DL->getScope()->getSubprogram() ==
1055cd1aecfeSDuncan P. N. Exon Smith              VarInfo->getScope()->getSubprogram() &&
1056cd1aecfeSDuncan P. N. Exon Smith          "Expected matching subprograms");
1057ef860a24SChandler Carruth   if (!DeclareFn)
10580fe506bcSReid Kleckner     DeclareFn = getDeclareIntrin(M);
1059ef860a24SChandler Carruth 
10605bf8fef5SDuncan P. N. Exon Smith   trackIfUnresolved(VarInfo);
10615bf8fef5SDuncan P. N. Exon Smith   trackIfUnresolved(Expr);
10625bf8fef5SDuncan P. N. Exon Smith   Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
10635bf8fef5SDuncan P. N. Exon Smith                    MetadataAsValue::get(VMContext, VarInfo),
10645bf8fef5SDuncan P. N. Exon Smith                    MetadataAsValue::get(VMContext, Expr)};
1065ef860a24SChandler Carruth 
106680397d2dSNikita Popov   IRBuilder<> B(DL->getContext());
106780397d2dSNikita Popov   initIRBuilder(B, DL, InsertBB, InsertBefore);
1068bc669474SReid Kleckner   return B.CreateCall(DeclareFn, Args);
1069ef860a24SChandler Carruth }
1070ef860a24SChandler Carruth 
insertDbgIntrinsic(llvm::Function * IntrinsicFn,Value * V,DILocalVariable * VarInfo,DIExpression * Expr,const DILocation * DL,BasicBlock * InsertBB,Instruction * InsertBefore)10717ed95d15SMichael Gottesman Instruction *DIBuilder::insertDbgIntrinsic(llvm::Function *IntrinsicFn,
10727ed95d15SMichael Gottesman                                            Value *V, DILocalVariable *VarInfo,
10737ed95d15SMichael Gottesman                                            DIExpression *Expr,
10747ed95d15SMichael Gottesman                                            const DILocation *DL,
10757ed95d15SMichael Gottesman                                            BasicBlock *InsertBB,
10767ed95d15SMichael Gottesman                                            Instruction *InsertBefore) {
10777ed95d15SMichael Gottesman   assert(IntrinsicFn && "must pass a non-null intrinsic function");
10787ed95d15SMichael Gottesman   assert(V && "must pass a value to a dbg intrinsic");
10797ed95d15SMichael Gottesman   assert(VarInfo &&
10807ed95d15SMichael Gottesman          "empty or invalid DILocalVariable* passed to debug intrinsic");
1081cd1aecfeSDuncan P. N. Exon Smith   assert(DL && "Expected debug loc");
1082cd1aecfeSDuncan P. N. Exon Smith   assert(DL->getScope()->getSubprogram() ==
1083cd1aecfeSDuncan P. N. Exon Smith              VarInfo->getScope()->getSubprogram() &&
1084cd1aecfeSDuncan P. N. Exon Smith          "Expected matching subprograms");
1085ef860a24SChandler Carruth 
10865bf8fef5SDuncan P. N. Exon Smith   trackIfUnresolved(VarInfo);
10875bf8fef5SDuncan P. N. Exon Smith   trackIfUnresolved(Expr);
10885bf8fef5SDuncan P. N. Exon Smith   Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, V),
10895bf8fef5SDuncan P. N. Exon Smith                    MetadataAsValue::get(VMContext, VarInfo),
10905bf8fef5SDuncan P. N. Exon Smith                    MetadataAsValue::get(VMContext, Expr)};
1091cd1aecfeSDuncan P. N. Exon Smith 
109280397d2dSNikita Popov   IRBuilder<> B(DL->getContext());
109380397d2dSNikita Popov   initIRBuilder(B, DL, InsertBB, InsertBefore);
10947ed95d15SMichael Gottesman   return B.CreateCall(IntrinsicFn, Args);
1095ef860a24SChandler Carruth }
109697f07c27SDuncan P. N. Exon Smith 
insertLabel(DILabel * LabelInfo,const DILocation * DL,BasicBlock * InsertBB,Instruction * InsertBefore)1097665b4138SLuís Ferreira Instruction *DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL,
1098665b4138SLuís Ferreira                                     BasicBlock *InsertBB,
1099665b4138SLuís Ferreira                                     Instruction *InsertBefore) {
11002c864551SShiva Chen   assert(LabelInfo && "empty or invalid DILabel* passed to dbg.label");
11012c864551SShiva Chen   assert(DL && "Expected debug loc");
11022c864551SShiva Chen   assert(DL->getScope()->getSubprogram() ==
11032c864551SShiva Chen              LabelInfo->getScope()->getSubprogram() &&
11042c864551SShiva Chen          "Expected matching subprograms");
11052c864551SShiva Chen   if (!LabelFn)
11062c864551SShiva Chen     LabelFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_label);
11072c864551SShiva Chen 
11082c864551SShiva Chen   trackIfUnresolved(LabelInfo);
11092c864551SShiva Chen   Value *Args[] = {MetadataAsValue::get(VMContext, LabelInfo)};
11102c864551SShiva Chen 
111180397d2dSNikita Popov   IRBuilder<> B(DL->getContext());
111280397d2dSNikita Popov   initIRBuilder(B, DL, InsertBB, InsertBefore);
11132c864551SShiva Chen   return B.CreateCall(LabelFn, Args);
11142c864551SShiva Chen }
11152c864551SShiva Chen 
replaceVTableHolder(DICompositeType * & T,DIType * VTableHolder)1116665b4138SLuís Ferreira void DIBuilder::replaceVTableHolder(DICompositeType *&T, DIType *VTableHolder) {
11178d33fdc3SDuncan P. N. Exon Smith   {
1118a9308c49SDuncan P. N. Exon Smith     TypedTrackingMDRef<DICompositeType> N(T);
1119a59d3e5aSDuncan P. N. Exon Smith     N->replaceVTableHolder(VTableHolder);
11208d33fdc3SDuncan P. N. Exon Smith     T = N.get();
11218d33fdc3SDuncan P. N. Exon Smith   }
112297f07c27SDuncan P. N. Exon Smith 
112397f07c27SDuncan P. N. Exon Smith   // If this didn't create a self-reference, just return.
112497f07c27SDuncan P. N. Exon Smith   if (T != VTableHolder)
112597f07c27SDuncan P. N. Exon Smith     return;
112697f07c27SDuncan P. N. Exon Smith 
112718a25b01SAdrian Prantl   // Look for unresolved operands.  T will drop RAUW support, orphaning any
112818a25b01SAdrian Prantl   // cycles underneath it.
112918a25b01SAdrian Prantl   if (T->isResolved())
113097f07c27SDuncan P. N. Exon Smith     for (const MDOperand &O : T->operands())
113197f07c27SDuncan P. N. Exon Smith       if (auto *N = dyn_cast_or_null<MDNode>(O))
113297f07c27SDuncan P. N. Exon Smith         trackIfUnresolved(N);
113397f07c27SDuncan P. N. Exon Smith }
113497f07c27SDuncan P. N. Exon Smith 
replaceArrays(DICompositeType * & T,DINodeArray Elements,DINodeArray TParams)1135a9308c49SDuncan P. N. Exon Smith void DIBuilder::replaceArrays(DICompositeType *&T, DINodeArray Elements,
1136a9308c49SDuncan P. N. Exon Smith                               DINodeArray TParams) {
11378d33fdc3SDuncan P. N. Exon Smith   {
1138a9308c49SDuncan P. N. Exon Smith     TypedTrackingMDRef<DICompositeType> N(T);
11398d33fdc3SDuncan P. N. Exon Smith     if (Elements)
1140000fa2c6SDuncan P. N. Exon Smith       N->replaceElements(Elements);
11418d33fdc3SDuncan P. N. Exon Smith     if (TParams)
1142a9308c49SDuncan P. N. Exon Smith       N->replaceTemplateParams(DITemplateParameterArray(TParams));
11438d33fdc3SDuncan P. N. Exon Smith     T = N.get();
11448d33fdc3SDuncan P. N. Exon Smith   }
114597f07c27SDuncan P. N. Exon Smith 
114697f07c27SDuncan P. N. Exon Smith   // If T isn't resolved, there's no problem.
114797f07c27SDuncan P. N. Exon Smith   if (!T->isResolved())
114897f07c27SDuncan P. N. Exon Smith     return;
114997f07c27SDuncan P. N. Exon Smith 
115012d52849SAdrian Prantl   // If T is resolved, it may be due to a self-reference cycle.  Track the
115197f07c27SDuncan P. N. Exon Smith   // arrays explicitly if they're unresolved, or else the cycles will be
115297f07c27SDuncan P. N. Exon Smith   // orphaned.
115397f07c27SDuncan P. N. Exon Smith   if (Elements)
11541134473fSDuncan P. N. Exon Smith     trackIfUnresolved(Elements.get());
115597f07c27SDuncan P. N. Exon Smith   if (TParams)
11561134473fSDuncan P. N. Exon Smith     trackIfUnresolved(TParams.get());
115797f07c27SDuncan P. N. Exon Smith }
1158