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