1 //===- DebugInfo.cpp - Debug Information Helper Classes -------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file implements the helper classes used to build and interpret debug
10 // information in LLVM IR form.
12 //===----------------------------------------------------------------------===//
14 #include "llvm-c/DebugInfo.h"
15 #include "llvm/ADT/DenseMap.h"
16 #include "llvm/ADT/DenseSet.h"
17 #include "llvm/ADT/None.h"
18 #include "llvm/ADT/STLExtras.h"
19 #include "llvm/ADT/SmallPtrSet.h"
20 #include "llvm/ADT/SmallVector.h"
21 #include "llvm/ADT/StringRef.h"
22 #include "llvm/IR/BasicBlock.h"
23 #include "llvm/IR/Constants.h"
24 #include "llvm/IR/DebugInfoMetadata.h"
25 #include "llvm/IR/DebugLoc.h"
26 #include "llvm/IR/DebugInfo.h"
27 #include "llvm/IR/DIBuilder.h"
28 #include "llvm/IR/Function.h"
29 #include "llvm/IR/GVMaterializer.h"
30 #include "llvm/IR/Instruction.h"
31 #include "llvm/IR/IntrinsicInst.h"
32 #include "llvm/IR/LLVMContext.h"
33 #include "llvm/IR/Metadata.h"
34 #include "llvm/IR/Module.h"
35 #include "llvm/Support/Casting.h"
41 using namespace llvm::dwarf
;
43 DISubprogram
*llvm::getDISubprogram(const MDNode
*Scope
) {
44 if (auto *LocalScope
= dyn_cast_or_null
<DILocalScope
>(Scope
))
45 return LocalScope
->getSubprogram();
49 //===----------------------------------------------------------------------===//
50 // DebugInfoFinder implementations.
51 //===----------------------------------------------------------------------===//
53 void DebugInfoFinder::reset() {
62 void DebugInfoFinder::processModule(const Module
&M
) {
63 for (auto *CU
: M
.debug_compile_units())
64 processCompileUnit(CU
);
65 for (auto &F
: M
.functions()) {
66 if (auto *SP
= cast_or_null
<DISubprogram
>(F
.getSubprogram()))
67 processSubprogram(SP
);
68 // There could be subprograms from inlined functions referenced from
69 // instructions only. Walk the function to find them.
70 for (const BasicBlock
&BB
: F
)
71 for (const Instruction
&I
: BB
)
72 processInstruction(M
, I
);
76 void DebugInfoFinder::processCompileUnit(DICompileUnit
*CU
) {
77 if (!addCompileUnit(CU
))
79 for (auto DIG
: CU
->getGlobalVariables()) {
80 if (!addGlobalVariable(DIG
))
82 auto *GV
= DIG
->getVariable();
83 processScope(GV
->getScope());
84 processType(GV
->getType().resolve());
86 for (auto *ET
: CU
->getEnumTypes())
88 for (auto *RT
: CU
->getRetainedTypes())
89 if (auto *T
= dyn_cast
<DIType
>(RT
))
92 processSubprogram(cast
<DISubprogram
>(RT
));
93 for (auto *Import
: CU
->getImportedEntities()) {
94 auto *Entity
= Import
->getEntity().resolve();
95 if (auto *T
= dyn_cast
<DIType
>(Entity
))
97 else if (auto *SP
= dyn_cast
<DISubprogram
>(Entity
))
98 processSubprogram(SP
);
99 else if (auto *NS
= dyn_cast
<DINamespace
>(Entity
))
100 processScope(NS
->getScope());
101 else if (auto *M
= dyn_cast
<DIModule
>(Entity
))
102 processScope(M
->getScope());
106 void DebugInfoFinder::processInstruction(const Module
&M
,
107 const Instruction
&I
) {
108 if (auto *DDI
= dyn_cast
<DbgDeclareInst
>(&I
))
109 processDeclare(M
, DDI
);
110 else if (auto *DVI
= dyn_cast
<DbgValueInst
>(&I
))
111 processValue(M
, DVI
);
113 if (auto DbgLoc
= I
.getDebugLoc())
114 processLocation(M
, DbgLoc
.get());
117 void DebugInfoFinder::processLocation(const Module
&M
, const DILocation
*Loc
) {
120 processScope(Loc
->getScope());
121 processLocation(M
, Loc
->getInlinedAt());
124 void DebugInfoFinder::processType(DIType
*DT
) {
127 processScope(DT
->getScope().resolve());
128 if (auto *ST
= dyn_cast
<DISubroutineType
>(DT
)) {
129 for (DITypeRef Ref
: ST
->getTypeArray())
130 processType(Ref
.resolve());
133 if (auto *DCT
= dyn_cast
<DICompositeType
>(DT
)) {
134 processType(DCT
->getBaseType().resolve());
135 for (Metadata
*D
: DCT
->getElements()) {
136 if (auto *T
= dyn_cast
<DIType
>(D
))
138 else if (auto *SP
= dyn_cast
<DISubprogram
>(D
))
139 processSubprogram(SP
);
143 if (auto *DDT
= dyn_cast
<DIDerivedType
>(DT
)) {
144 processType(DDT
->getBaseType().resolve());
148 void DebugInfoFinder::processScope(DIScope
*Scope
) {
151 if (auto *Ty
= dyn_cast
<DIType
>(Scope
)) {
155 if (auto *CU
= dyn_cast
<DICompileUnit
>(Scope
)) {
159 if (auto *SP
= dyn_cast
<DISubprogram
>(Scope
)) {
160 processSubprogram(SP
);
163 if (!addScope(Scope
))
165 if (auto *LB
= dyn_cast
<DILexicalBlockBase
>(Scope
)) {
166 processScope(LB
->getScope());
167 } else if (auto *NS
= dyn_cast
<DINamespace
>(Scope
)) {
168 processScope(NS
->getScope());
169 } else if (auto *M
= dyn_cast
<DIModule
>(Scope
)) {
170 processScope(M
->getScope());
174 void DebugInfoFinder::processSubprogram(DISubprogram
*SP
) {
175 if (!addSubprogram(SP
))
177 processScope(SP
->getScope().resolve());
178 // Some of the users, e.g. CloneFunctionInto / CloneModule, need to set up a
179 // ValueMap containing identity mappings for all of the DICompileUnit's, not
180 // just DISubprogram's, referenced from anywhere within the Function being
181 // cloned prior to calling MapMetadata / RemapInstruction to avoid their
182 // duplication later as DICompileUnit's are also directly referenced by
183 // llvm.dbg.cu list. Thefore we need to collect DICompileUnit's here as well.
184 // Also, DICompileUnit's may reference DISubprogram's too and therefore need
185 // to be at least looked through.
186 processCompileUnit(SP
->getUnit());
187 processType(SP
->getType());
188 for (auto *Element
: SP
->getTemplateParams()) {
189 if (auto *TType
= dyn_cast
<DITemplateTypeParameter
>(Element
)) {
190 processType(TType
->getType().resolve());
191 } else if (auto *TVal
= dyn_cast
<DITemplateValueParameter
>(Element
)) {
192 processType(TVal
->getType().resolve());
197 void DebugInfoFinder::processDeclare(const Module
&M
,
198 const DbgDeclareInst
*DDI
) {
199 auto *N
= dyn_cast
<MDNode
>(DDI
->getVariable());
203 auto *DV
= dyn_cast
<DILocalVariable
>(N
);
207 if (!NodesSeen
.insert(DV
).second
)
209 processScope(DV
->getScope());
210 processType(DV
->getType().resolve());
213 void DebugInfoFinder::processValue(const Module
&M
, const DbgValueInst
*DVI
) {
214 auto *N
= dyn_cast
<MDNode
>(DVI
->getVariable());
218 auto *DV
= dyn_cast
<DILocalVariable
>(N
);
222 if (!NodesSeen
.insert(DV
).second
)
224 processScope(DV
->getScope());
225 processType(DV
->getType().resolve());
228 bool DebugInfoFinder::addType(DIType
*DT
) {
232 if (!NodesSeen
.insert(DT
).second
)
235 TYs
.push_back(const_cast<DIType
*>(DT
));
239 bool DebugInfoFinder::addCompileUnit(DICompileUnit
*CU
) {
242 if (!NodesSeen
.insert(CU
).second
)
249 bool DebugInfoFinder::addGlobalVariable(DIGlobalVariableExpression
*DIG
) {
250 if (!NodesSeen
.insert(DIG
).second
)
257 bool DebugInfoFinder::addSubprogram(DISubprogram
*SP
) {
261 if (!NodesSeen
.insert(SP
).second
)
268 bool DebugInfoFinder::addScope(DIScope
*Scope
) {
271 // FIXME: Ocaml binding generates a scope with no content, we treat it
273 if (Scope
->getNumOperands() == 0)
275 if (!NodesSeen
.insert(Scope
).second
)
277 Scopes
.push_back(Scope
);
281 static MDNode
*stripDebugLocFromLoopID(MDNode
*N
) {
282 assert(!empty(N
->operands()) && "Missing self reference?");
284 // if there is no debug location, we do not have to rewrite this MDNode.
285 if (std::none_of(N
->op_begin() + 1, N
->op_end(), [](const MDOperand
&Op
) {
286 return isa
<DILocation
>(Op
.get());
290 // If there is only the debug location without any actual loop metadata, we
291 // can remove the metadata.
292 if (std::none_of(N
->op_begin() + 1, N
->op_end(), [](const MDOperand
&Op
) {
293 return !isa
<DILocation
>(Op
.get());
297 SmallVector
<Metadata
*, 4> Args
;
298 // Reserve operand 0 for loop id self reference.
299 auto TempNode
= MDNode::getTemporary(N
->getContext(), None
);
300 Args
.push_back(TempNode
.get());
301 // Add all non-debug location operands back.
302 for (auto Op
= N
->op_begin() + 1; Op
!= N
->op_end(); Op
++) {
303 if (!isa
<DILocation
>(*Op
))
307 // Set the first operand to itself.
308 MDNode
*LoopID
= MDNode::get(N
->getContext(), Args
);
309 LoopID
->replaceOperandWith(0, LoopID
);
313 bool llvm::stripDebugInfo(Function
&F
) {
314 bool Changed
= false;
315 if (F
.hasMetadata(LLVMContext::MD_dbg
)) {
317 F
.setSubprogram(nullptr);
320 DenseMap
<MDNode
*, MDNode
*> LoopIDsMap
;
321 for (BasicBlock
&BB
: F
) {
322 for (auto II
= BB
.begin(), End
= BB
.end(); II
!= End
;) {
323 Instruction
&I
= *II
++; // We may delete the instruction, increment now.
324 if (isa
<DbgInfoIntrinsic
>(&I
)) {
329 if (I
.getDebugLoc()) {
331 I
.setDebugLoc(DebugLoc());
335 auto *TermInst
= BB
.getTerminator();
337 // This is invalid IR, but we may not have run the verifier yet
339 if (auto *LoopID
= TermInst
->getMetadata(LLVMContext::MD_loop
)) {
340 auto *NewLoopID
= LoopIDsMap
.lookup(LoopID
);
342 NewLoopID
= LoopIDsMap
[LoopID
] = stripDebugLocFromLoopID(LoopID
);
343 if (NewLoopID
!= LoopID
)
344 TermInst
->setMetadata(LLVMContext::MD_loop
, NewLoopID
);
350 bool llvm::StripDebugInfo(Module
&M
) {
351 bool Changed
= false;
353 for (Module::named_metadata_iterator NMI
= M
.named_metadata_begin(),
354 NME
= M
.named_metadata_end(); NMI
!= NME
;) {
355 NamedMDNode
*NMD
= &*NMI
;
358 // We're stripping debug info, and without them, coverage information
359 // doesn't quite make sense.
360 if (NMD
->getName().startswith("llvm.dbg.") ||
361 NMD
->getName() == "llvm.gcov") {
362 NMD
->eraseFromParent();
367 for (Function
&F
: M
)
368 Changed
|= stripDebugInfo(F
);
370 for (auto &GV
: M
.globals()) {
371 Changed
|= GV
.eraseMetadata(LLVMContext::MD_dbg
);
374 if (GVMaterializer
*Materializer
= M
.getMaterializer())
375 Materializer
->setStripDebugInfo();
382 /// Helper class to downgrade -g metadata to -gline-tables-only metadata.
383 class DebugTypeInfoRemoval
{
384 DenseMap
<Metadata
*, Metadata
*> Replacements
;
387 /// The (void)() type.
388 MDNode
*EmptySubroutineType
;
391 /// Remember what linkage name we originally had before stripping. If we end
392 /// up making two subprograms identical who originally had different linkage
393 /// names, then we need to make one of them distinct, to avoid them getting
394 /// uniqued. Maps the new node to the old linkage name.
395 DenseMap
<DISubprogram
*, StringRef
> NewToLinkageName
;
397 // TODO: Remember the distinct subprogram we created for a given linkage name,
398 // so that we can continue to unique whenever possible. Map <newly created
399 // node, old linkage name> to the first (possibly distinct) mdsubprogram
400 // created for that combination. This is not strictly needed for correctness,
401 // but can cut down on the number of MDNodes and let us diff cleanly with the
402 // output of -gline-tables-only.
405 DebugTypeInfoRemoval(LLVMContext
&C
)
406 : EmptySubroutineType(DISubroutineType::get(C
, DINode::FlagZero
, 0,
407 MDNode::get(C
, {}))) {}
409 Metadata
*map(Metadata
*M
) {
412 auto Replacement
= Replacements
.find(M
);
413 if (Replacement
!= Replacements
.end())
414 return Replacement
->second
;
418 MDNode
*mapNode(Metadata
*N
) { return dyn_cast_or_null
<MDNode
>(map(N
)); }
420 /// Recursively remap N and all its referenced children. Does a DF post-order
421 /// traversal, so as to remap bottoms up.
422 void traverseAndRemap(MDNode
*N
) { traverse(N
); }
425 // Create a new DISubprogram, to replace the one given.
426 DISubprogram
*getReplacementSubprogram(DISubprogram
*MDS
) {
427 auto *FileAndScope
= cast_or_null
<DIFile
>(map(MDS
->getFile()));
428 StringRef LinkageName
= MDS
->getName().empty() ? MDS
->getLinkageName() : "";
429 DISubprogram
*Declaration
= nullptr;
430 auto *Type
= cast_or_null
<DISubroutineType
>(map(MDS
->getType()));
431 DITypeRef
ContainingType(map(MDS
->getContainingType()));
432 auto *Unit
= cast_or_null
<DICompileUnit
>(map(MDS
->getUnit()));
433 auto Variables
= nullptr;
434 auto TemplateParams
= nullptr;
436 // Make a distinct DISubprogram, for situations that warrent it.
437 auto distinctMDSubprogram
= [&]() {
438 return DISubprogram::getDistinct(
439 MDS
->getContext(), FileAndScope
, MDS
->getName(), LinkageName
,
440 FileAndScope
, MDS
->getLine(), Type
, MDS
->getScopeLine(),
441 ContainingType
, MDS
->getVirtualIndex(), MDS
->getThisAdjustment(),
442 MDS
->getFlags(), MDS
->getSPFlags(), Unit
, TemplateParams
, Declaration
,
446 if (MDS
->isDistinct())
447 return distinctMDSubprogram();
449 auto *NewMDS
= DISubprogram::get(
450 MDS
->getContext(), FileAndScope
, MDS
->getName(), LinkageName
,
451 FileAndScope
, MDS
->getLine(), Type
, MDS
->getScopeLine(), ContainingType
,
452 MDS
->getVirtualIndex(), MDS
->getThisAdjustment(), MDS
->getFlags(),
453 MDS
->getSPFlags(), Unit
, TemplateParams
, Declaration
, Variables
);
455 StringRef OldLinkageName
= MDS
->getLinkageName();
457 // See if we need to make a distinct one.
458 auto OrigLinkage
= NewToLinkageName
.find(NewMDS
);
459 if (OrigLinkage
!= NewToLinkageName
.end()) {
460 if (OrigLinkage
->second
== OldLinkageName
)
464 // Otherwise, need to make a distinct one.
465 // TODO: Query the map to see if we already have one.
466 return distinctMDSubprogram();
469 NewToLinkageName
.insert({NewMDS
, MDS
->getLinkageName()});
473 /// Create a new compile unit, to replace the one given
474 DICompileUnit
*getReplacementCU(DICompileUnit
*CU
) {
475 // Drop skeleton CUs.
479 auto *File
= cast_or_null
<DIFile
>(map(CU
->getFile()));
480 MDTuple
*EnumTypes
= nullptr;
481 MDTuple
*RetainedTypes
= nullptr;
482 MDTuple
*GlobalVariables
= nullptr;
483 MDTuple
*ImportedEntities
= nullptr;
484 return DICompileUnit::getDistinct(
485 CU
->getContext(), CU
->getSourceLanguage(), File
, CU
->getProducer(),
486 CU
->isOptimized(), CU
->getFlags(), CU
->getRuntimeVersion(),
487 CU
->getSplitDebugFilename(), DICompileUnit::LineTablesOnly
, EnumTypes
,
488 RetainedTypes
, GlobalVariables
, ImportedEntities
, CU
->getMacros(),
489 CU
->getDWOId(), CU
->getSplitDebugInlining(),
490 CU
->getDebugInfoForProfiling(), CU
->getNameTableKind(),
491 CU
->getRangesBaseAddress());
494 DILocation
*getReplacementMDLocation(DILocation
*MLD
) {
495 auto *Scope
= map(MLD
->getScope());
496 auto *InlinedAt
= map(MLD
->getInlinedAt());
497 if (MLD
->isDistinct())
498 return DILocation::getDistinct(MLD
->getContext(), MLD
->getLine(),
499 MLD
->getColumn(), Scope
, InlinedAt
);
500 return DILocation::get(MLD
->getContext(), MLD
->getLine(), MLD
->getColumn(),
504 /// Create a new generic MDNode, to replace the one given
505 MDNode
*getReplacementMDNode(MDNode
*N
) {
506 SmallVector
<Metadata
*, 8> Ops
;
507 Ops
.reserve(N
->getNumOperands());
508 for (auto &I
: N
->operands())
510 Ops
.push_back(map(I
));
511 auto *Ret
= MDNode::get(N
->getContext(), Ops
);
515 /// Attempt to re-map N to a newly created node.
516 void remap(MDNode
*N
) {
517 if (Replacements
.count(N
))
520 auto doRemap
= [&](MDNode
*N
) -> MDNode
* {
523 if (auto *MDSub
= dyn_cast
<DISubprogram
>(N
)) {
524 remap(MDSub
->getUnit());
525 return getReplacementSubprogram(MDSub
);
527 if (isa
<DISubroutineType
>(N
))
528 return EmptySubroutineType
;
529 if (auto *CU
= dyn_cast
<DICompileUnit
>(N
))
530 return getReplacementCU(CU
);
533 if (auto *MDLB
= dyn_cast
<DILexicalBlockBase
>(N
))
534 // Remap to our referenced scope (recursively).
535 return mapNode(MDLB
->getScope());
536 if (auto *MLD
= dyn_cast
<DILocation
>(N
))
537 return getReplacementMDLocation(MLD
);
539 // Otherwise, if we see these, just drop them now. Not strictly necessary,
540 // but this speeds things up a little.
544 return getReplacementMDNode(N
);
546 Replacements
[N
] = doRemap(N
);
549 /// Do the remapping traversal.
550 void traverse(MDNode
*);
553 } // end anonymous namespace
555 void DebugTypeInfoRemoval::traverse(MDNode
*N
) {
556 if (!N
|| Replacements
.count(N
))
559 // To avoid cycles, as well as for efficiency sake, we will sometimes prune
560 // parts of the graph.
561 auto prune
= [](MDNode
*Parent
, MDNode
*Child
) {
562 if (auto *MDS
= dyn_cast
<DISubprogram
>(Parent
))
563 return Child
== MDS
->getRetainedNodes().get();
567 SmallVector
<MDNode
*, 16> ToVisit
;
568 DenseSet
<MDNode
*> Opened
;
570 // Visit each node starting at N in post order, and map them.
571 ToVisit
.push_back(N
);
572 while (!ToVisit
.empty()) {
573 auto *N
= ToVisit
.back();
574 if (!Opened
.insert(N
).second
) {
580 for (auto &I
: N
->operands())
581 if (auto *MDN
= dyn_cast_or_null
<MDNode
>(I
))
582 if (!Opened
.count(MDN
) && !Replacements
.count(MDN
) && !prune(N
, MDN
) &&
583 !isa
<DICompileUnit
>(MDN
))
584 ToVisit
.push_back(MDN
);
588 bool llvm::stripNonLineTableDebugInfo(Module
&M
) {
589 bool Changed
= false;
591 // First off, delete the debug intrinsics.
592 auto RemoveUses
= [&](StringRef Name
) {
593 if (auto *DbgVal
= M
.getFunction(Name
)) {
594 while (!DbgVal
->use_empty())
595 cast
<Instruction
>(DbgVal
->user_back())->eraseFromParent();
596 DbgVal
->eraseFromParent();
600 RemoveUses("llvm.dbg.declare");
601 RemoveUses("llvm.dbg.value");
603 // Delete non-CU debug info named metadata nodes.
604 for (auto NMI
= M
.named_metadata_begin(), NME
= M
.named_metadata_end();
606 NamedMDNode
*NMD
= &*NMI
;
608 // Specifically keep dbg.cu around.
609 if (NMD
->getName() == "llvm.dbg.cu")
613 // Drop all dbg attachments from global variables.
614 for (auto &GV
: M
.globals())
615 GV
.eraseMetadata(LLVMContext::MD_dbg
);
617 DebugTypeInfoRemoval
Mapper(M
.getContext());
618 auto remap
= [&](MDNode
*Node
) -> MDNode
* {
621 Mapper
.traverseAndRemap(Node
);
622 auto *NewNode
= Mapper
.mapNode(Node
);
623 Changed
|= Node
!= NewNode
;
628 // Rewrite the DebugLocs to be equivalent to what
629 // -gline-tables-only would have created.
631 if (auto *SP
= F
.getSubprogram()) {
632 Mapper
.traverseAndRemap(SP
);
633 auto *NewSP
= cast
<DISubprogram
>(Mapper
.mapNode(SP
));
634 Changed
|= SP
!= NewSP
;
635 F
.setSubprogram(NewSP
);
639 auto remapDebugLoc
= [&](DebugLoc DL
) -> DebugLoc
{
640 auto *Scope
= DL
.getScope();
641 MDNode
*InlinedAt
= DL
.getInlinedAt();
642 Scope
= remap(Scope
);
643 InlinedAt
= remap(InlinedAt
);
644 return DebugLoc::get(DL
.getLine(), DL
.getCol(), Scope
, InlinedAt
);
647 if (I
.getDebugLoc() != DebugLoc())
648 I
.setDebugLoc(remapDebugLoc(I
.getDebugLoc()));
650 // Remap DILocations in untyped MDNodes (e.g., llvm.loop).
651 SmallVector
<std::pair
<unsigned, MDNode
*>, 2> MDs
;
652 I
.getAllMetadata(MDs
);
653 for (auto Attachment
: MDs
)
654 if (auto *T
= dyn_cast_or_null
<MDTuple
>(Attachment
.second
))
655 for (unsigned N
= 0; N
< T
->getNumOperands(); ++N
)
656 if (auto *Loc
= dyn_cast_or_null
<DILocation
>(T
->getOperand(N
)))
657 if (Loc
!= DebugLoc())
658 T
->replaceOperandWith(N
, remapDebugLoc(Loc
));
663 // Create a new llvm.dbg.cu, which is equivalent to the one
664 // -gline-tables-only would have created.
665 for (auto &NMD
: M
.getNamedMDList()) {
666 SmallVector
<MDNode
*, 8> Ops
;
667 for (MDNode
*Op
: NMD
.operands())
668 Ops
.push_back(remap(Op
));
681 unsigned llvm::getDebugMetadataVersionFromModule(const Module
&M
) {
682 if (auto *Val
= mdconst::dyn_extract_or_null
<ConstantInt
>(
683 M
.getModuleFlag("Debug Info Version")))
684 return Val
->getZExtValue();
688 void Instruction::applyMergedLocation(const DILocation
*LocA
,
689 const DILocation
*LocB
) {
690 setDebugLoc(DILocation::getMergedLocation(LocA
, LocB
));
693 //===----------------------------------------------------------------------===//
694 // LLVM C API implementations.
695 //===----------------------------------------------------------------------===//
697 static unsigned map_from_llvmDWARFsourcelanguage(LLVMDWARFSourceLanguage lang
) {
699 #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \
700 case LLVMDWARFSourceLanguage##NAME: \
702 #include "llvm/BinaryFormat/Dwarf.def"
703 #undef HANDLE_DW_LANG
705 llvm_unreachable("Unhandled Tag");
708 template <typename DIT
> DIT
*unwrapDI(LLVMMetadataRef Ref
) {
709 return (DIT
*)(Ref
? unwrap
<MDNode
>(Ref
) : nullptr);
712 static DINode::DIFlags
map_from_llvmDIFlags(LLVMDIFlags Flags
) {
713 return static_cast<DINode::DIFlags
>(Flags
);
716 static LLVMDIFlags
map_to_llvmDIFlags(DINode::DIFlags Flags
) {
717 return static_cast<LLVMDIFlags
>(Flags
);
720 static DISubprogram::DISPFlags
721 pack_into_DISPFlags(bool IsLocalToUnit
, bool IsDefinition
, bool IsOptimized
) {
722 return DISubprogram::toSPFlags(IsLocalToUnit
, IsDefinition
, IsOptimized
);
725 unsigned LLVMDebugMetadataVersion() {
726 return DEBUG_METADATA_VERSION
;
729 LLVMDIBuilderRef
LLVMCreateDIBuilderDisallowUnresolved(LLVMModuleRef M
) {
730 return wrap(new DIBuilder(*unwrap(M
), false));
733 LLVMDIBuilderRef
LLVMCreateDIBuilder(LLVMModuleRef M
) {
734 return wrap(new DIBuilder(*unwrap(M
)));
737 unsigned LLVMGetModuleDebugMetadataVersion(LLVMModuleRef M
) {
738 return getDebugMetadataVersionFromModule(*unwrap(M
));
741 LLVMBool
LLVMStripModuleDebugInfo(LLVMModuleRef M
) {
742 return StripDebugInfo(*unwrap(M
));
745 void LLVMDisposeDIBuilder(LLVMDIBuilderRef Builder
) {
746 delete unwrap(Builder
);
749 void LLVMDIBuilderFinalize(LLVMDIBuilderRef Builder
) {
750 unwrap(Builder
)->finalize();
753 LLVMMetadataRef
LLVMDIBuilderCreateCompileUnit(
754 LLVMDIBuilderRef Builder
, LLVMDWARFSourceLanguage Lang
,
755 LLVMMetadataRef FileRef
, const char *Producer
, size_t ProducerLen
,
756 LLVMBool isOptimized
, const char *Flags
, size_t FlagsLen
,
757 unsigned RuntimeVer
, const char *SplitName
, size_t SplitNameLen
,
758 LLVMDWARFEmissionKind Kind
, unsigned DWOId
, LLVMBool SplitDebugInlining
,
759 LLVMBool DebugInfoForProfiling
) {
760 auto File
= unwrapDI
<DIFile
>(FileRef
);
762 return wrap(unwrap(Builder
)->createCompileUnit(
763 map_from_llvmDWARFsourcelanguage(Lang
), File
,
764 StringRef(Producer
, ProducerLen
), isOptimized
,
765 StringRef(Flags
, FlagsLen
), RuntimeVer
,
766 StringRef(SplitName
, SplitNameLen
),
767 static_cast<DICompileUnit::DebugEmissionKind
>(Kind
), DWOId
,
768 SplitDebugInlining
, DebugInfoForProfiling
));
772 LLVMDIBuilderCreateFile(LLVMDIBuilderRef Builder
, const char *Filename
,
773 size_t FilenameLen
, const char *Directory
,
774 size_t DirectoryLen
) {
775 return wrap(unwrap(Builder
)->createFile(StringRef(Filename
, FilenameLen
),
776 StringRef(Directory
, DirectoryLen
)));
780 LLVMDIBuilderCreateModule(LLVMDIBuilderRef Builder
, LLVMMetadataRef ParentScope
,
781 const char *Name
, size_t NameLen
,
782 const char *ConfigMacros
, size_t ConfigMacrosLen
,
783 const char *IncludePath
, size_t IncludePathLen
,
784 const char *ISysRoot
, size_t ISysRootLen
) {
785 return wrap(unwrap(Builder
)->createModule(
786 unwrapDI
<DIScope
>(ParentScope
), StringRef(Name
, NameLen
),
787 StringRef(ConfigMacros
, ConfigMacrosLen
),
788 StringRef(IncludePath
, IncludePathLen
),
789 StringRef(ISysRoot
, ISysRootLen
)));
792 LLVMMetadataRef
LLVMDIBuilderCreateNameSpace(LLVMDIBuilderRef Builder
,
793 LLVMMetadataRef ParentScope
,
794 const char *Name
, size_t NameLen
,
795 LLVMBool ExportSymbols
) {
796 return wrap(unwrap(Builder
)->createNameSpace(
797 unwrapDI
<DIScope
>(ParentScope
), StringRef(Name
, NameLen
), ExportSymbols
));
800 LLVMMetadataRef
LLVMDIBuilderCreateFunction(
801 LLVMDIBuilderRef Builder
, LLVMMetadataRef Scope
, const char *Name
,
802 size_t NameLen
, const char *LinkageName
, size_t LinkageNameLen
,
803 LLVMMetadataRef File
, unsigned LineNo
, LLVMMetadataRef Ty
,
804 LLVMBool IsLocalToUnit
, LLVMBool IsDefinition
,
805 unsigned ScopeLine
, LLVMDIFlags Flags
, LLVMBool IsOptimized
) {
806 return wrap(unwrap(Builder
)->createFunction(
807 unwrapDI
<DIScope
>(Scope
), {Name
, NameLen
}, {LinkageName
, LinkageNameLen
},
808 unwrapDI
<DIFile
>(File
), LineNo
, unwrapDI
<DISubroutineType
>(Ty
), ScopeLine
,
809 map_from_llvmDIFlags(Flags
),
810 pack_into_DISPFlags(IsLocalToUnit
, IsDefinition
, IsOptimized
), nullptr,
815 LLVMMetadataRef
LLVMDIBuilderCreateLexicalBlock(
816 LLVMDIBuilderRef Builder
, LLVMMetadataRef Scope
,
817 LLVMMetadataRef File
, unsigned Line
, unsigned Col
) {
818 return wrap(unwrap(Builder
)->createLexicalBlock(unwrapDI
<DIScope
>(Scope
),
819 unwrapDI
<DIFile
>(File
),
824 LLVMDIBuilderCreateLexicalBlockFile(LLVMDIBuilderRef Builder
,
825 LLVMMetadataRef Scope
,
826 LLVMMetadataRef File
,
827 unsigned Discriminator
) {
828 return wrap(unwrap(Builder
)->createLexicalBlockFile(unwrapDI
<DIScope
>(Scope
),
829 unwrapDI
<DIFile
>(File
),
834 LLVMDIBuilderCreateImportedModuleFromNamespace(LLVMDIBuilderRef Builder
,
835 LLVMMetadataRef Scope
,
837 LLVMMetadataRef File
,
839 return wrap(unwrap(Builder
)->createImportedModule(unwrapDI
<DIScope
>(Scope
),
840 unwrapDI
<DINamespace
>(NS
),
841 unwrapDI
<DIFile
>(File
),
846 LLVMDIBuilderCreateImportedModuleFromAlias(LLVMDIBuilderRef Builder
,
847 LLVMMetadataRef Scope
,
848 LLVMMetadataRef ImportedEntity
,
849 LLVMMetadataRef File
,
851 return wrap(unwrap(Builder
)->createImportedModule(
852 unwrapDI
<DIScope
>(Scope
),
853 unwrapDI
<DIImportedEntity
>(ImportedEntity
),
854 unwrapDI
<DIFile
>(File
), Line
));
858 LLVMDIBuilderCreateImportedModuleFromModule(LLVMDIBuilderRef Builder
,
859 LLVMMetadataRef Scope
,
861 LLVMMetadataRef File
,
863 return wrap(unwrap(Builder
)->createImportedModule(unwrapDI
<DIScope
>(Scope
),
864 unwrapDI
<DIModule
>(M
),
865 unwrapDI
<DIFile
>(File
),
870 LLVMDIBuilderCreateImportedDeclaration(LLVMDIBuilderRef Builder
,
871 LLVMMetadataRef Scope
,
872 LLVMMetadataRef Decl
,
873 LLVMMetadataRef File
,
875 const char *Name
, size_t NameLen
) {
876 return wrap(unwrap(Builder
)->createImportedDeclaration(
877 unwrapDI
<DIScope
>(Scope
),
878 unwrapDI
<DINode
>(Decl
),
879 unwrapDI
<DIFile
>(File
), Line
, {Name
, NameLen
}));
883 LLVMDIBuilderCreateDebugLocation(LLVMContextRef Ctx
, unsigned Line
,
884 unsigned Column
, LLVMMetadataRef Scope
,
885 LLVMMetadataRef InlinedAt
) {
886 return wrap(DILocation::get(*unwrap(Ctx
), Line
, Column
, unwrap(Scope
),
890 unsigned LLVMDILocationGetLine(LLVMMetadataRef Location
) {
891 return unwrapDI
<DILocation
>(Location
)->getLine();
894 unsigned LLVMDILocationGetColumn(LLVMMetadataRef Location
) {
895 return unwrapDI
<DILocation
>(Location
)->getColumn();
898 LLVMMetadataRef
LLVMDILocationGetScope(LLVMMetadataRef Location
) {
899 return wrap(unwrapDI
<DILocation
>(Location
)->getScope());
902 LLVMMetadataRef
LLVMDIBuilderCreateEnumerator(LLVMDIBuilderRef Builder
,
903 const char *Name
, size_t NameLen
,
905 LLVMBool IsUnsigned
) {
906 return wrap(unwrap(Builder
)->createEnumerator({Name
, NameLen
}, Value
,
910 LLVMMetadataRef
LLVMDIBuilderCreateEnumerationType(
911 LLVMDIBuilderRef Builder
, LLVMMetadataRef Scope
, const char *Name
,
912 size_t NameLen
, LLVMMetadataRef File
, unsigned LineNumber
,
913 uint64_t SizeInBits
, uint32_t AlignInBits
, LLVMMetadataRef
*Elements
,
914 unsigned NumElements
, LLVMMetadataRef ClassTy
) {
915 auto Elts
= unwrap(Builder
)->getOrCreateArray({unwrap(Elements
),
917 return wrap(unwrap(Builder
)->createEnumerationType(
918 unwrapDI
<DIScope
>(Scope
), {Name
, NameLen
}, unwrapDI
<DIFile
>(File
),
919 LineNumber
, SizeInBits
, AlignInBits
, Elts
, unwrapDI
<DIType
>(ClassTy
)));
922 LLVMMetadataRef
LLVMDIBuilderCreateUnionType(
923 LLVMDIBuilderRef Builder
, LLVMMetadataRef Scope
, const char *Name
,
924 size_t NameLen
, LLVMMetadataRef File
, unsigned LineNumber
,
925 uint64_t SizeInBits
, uint32_t AlignInBits
, LLVMDIFlags Flags
,
926 LLVMMetadataRef
*Elements
, unsigned NumElements
, unsigned RunTimeLang
,
927 const char *UniqueId
, size_t UniqueIdLen
) {
928 auto Elts
= unwrap(Builder
)->getOrCreateArray({unwrap(Elements
),
930 return wrap(unwrap(Builder
)->createUnionType(
931 unwrapDI
<DIScope
>(Scope
), {Name
, NameLen
}, unwrapDI
<DIFile
>(File
),
932 LineNumber
, SizeInBits
, AlignInBits
, map_from_llvmDIFlags(Flags
),
933 Elts
, RunTimeLang
, {UniqueId
, UniqueIdLen
}));
938 LLVMDIBuilderCreateArrayType(LLVMDIBuilderRef Builder
, uint64_t Size
,
939 uint32_t AlignInBits
, LLVMMetadataRef Ty
,
940 LLVMMetadataRef
*Subscripts
,
941 unsigned NumSubscripts
) {
942 auto Subs
= unwrap(Builder
)->getOrCreateArray({unwrap(Subscripts
),
944 return wrap(unwrap(Builder
)->createArrayType(Size
, AlignInBits
,
945 unwrapDI
<DIType
>(Ty
), Subs
));
949 LLVMDIBuilderCreateVectorType(LLVMDIBuilderRef Builder
, uint64_t Size
,
950 uint32_t AlignInBits
, LLVMMetadataRef Ty
,
951 LLVMMetadataRef
*Subscripts
,
952 unsigned NumSubscripts
) {
953 auto Subs
= unwrap(Builder
)->getOrCreateArray({unwrap(Subscripts
),
955 return wrap(unwrap(Builder
)->createVectorType(Size
, AlignInBits
,
956 unwrapDI
<DIType
>(Ty
), Subs
));
960 LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef Builder
, const char *Name
,
961 size_t NameLen
, uint64_t SizeInBits
,
962 LLVMDWARFTypeEncoding Encoding
,
964 return wrap(unwrap(Builder
)->createBasicType({Name
, NameLen
},
965 SizeInBits
, Encoding
,
966 map_from_llvmDIFlags(Flags
)));
969 LLVMMetadataRef
LLVMDIBuilderCreatePointerType(
970 LLVMDIBuilderRef Builder
, LLVMMetadataRef PointeeTy
,
971 uint64_t SizeInBits
, uint32_t AlignInBits
, unsigned AddressSpace
,
972 const char *Name
, size_t NameLen
) {
973 return wrap(unwrap(Builder
)->createPointerType(unwrapDI
<DIType
>(PointeeTy
),
974 SizeInBits
, AlignInBits
,
975 AddressSpace
, {Name
, NameLen
}));
978 LLVMMetadataRef
LLVMDIBuilderCreateStructType(
979 LLVMDIBuilderRef Builder
, LLVMMetadataRef Scope
, const char *Name
,
980 size_t NameLen
, LLVMMetadataRef File
, unsigned LineNumber
,
981 uint64_t SizeInBits
, uint32_t AlignInBits
, LLVMDIFlags Flags
,
982 LLVMMetadataRef DerivedFrom
, LLVMMetadataRef
*Elements
,
983 unsigned NumElements
, unsigned RunTimeLang
, LLVMMetadataRef VTableHolder
,
984 const char *UniqueId
, size_t UniqueIdLen
) {
985 auto Elts
= unwrap(Builder
)->getOrCreateArray({unwrap(Elements
),
987 return wrap(unwrap(Builder
)->createStructType(
988 unwrapDI
<DIScope
>(Scope
), {Name
, NameLen
}, unwrapDI
<DIFile
>(File
),
989 LineNumber
, SizeInBits
, AlignInBits
, map_from_llvmDIFlags(Flags
),
990 unwrapDI
<DIType
>(DerivedFrom
), Elts
, RunTimeLang
,
991 unwrapDI
<DIType
>(VTableHolder
), {UniqueId
, UniqueIdLen
}));
994 LLVMMetadataRef
LLVMDIBuilderCreateMemberType(
995 LLVMDIBuilderRef Builder
, LLVMMetadataRef Scope
, const char *Name
,
996 size_t NameLen
, LLVMMetadataRef File
, unsigned LineNo
, uint64_t SizeInBits
,
997 uint32_t AlignInBits
, uint64_t OffsetInBits
, LLVMDIFlags Flags
,
998 LLVMMetadataRef Ty
) {
999 return wrap(unwrap(Builder
)->createMemberType(unwrapDI
<DIScope
>(Scope
),
1000 {Name
, NameLen
}, unwrapDI
<DIFile
>(File
), LineNo
, SizeInBits
, AlignInBits
,
1001 OffsetInBits
, map_from_llvmDIFlags(Flags
), unwrapDI
<DIType
>(Ty
)));
1005 LLVMDIBuilderCreateUnspecifiedType(LLVMDIBuilderRef Builder
, const char *Name
,
1007 return wrap(unwrap(Builder
)->createUnspecifiedType({Name
, NameLen
}));
1011 LLVMDIBuilderCreateStaticMemberType(
1012 LLVMDIBuilderRef Builder
, LLVMMetadataRef Scope
, const char *Name
,
1013 size_t NameLen
, LLVMMetadataRef File
, unsigned LineNumber
,
1014 LLVMMetadataRef Type
, LLVMDIFlags Flags
, LLVMValueRef ConstantVal
,
1015 uint32_t AlignInBits
) {
1016 return wrap(unwrap(Builder
)->createStaticMemberType(
1017 unwrapDI
<DIScope
>(Scope
), {Name
, NameLen
},
1018 unwrapDI
<DIFile
>(File
), LineNumber
, unwrapDI
<DIType
>(Type
),
1019 map_from_llvmDIFlags(Flags
), unwrap
<Constant
>(ConstantVal
),
1024 LLVMDIBuilderCreateObjCIVar(LLVMDIBuilderRef Builder
,
1025 const char *Name
, size_t NameLen
,
1026 LLVMMetadataRef File
, unsigned LineNo
,
1027 uint64_t SizeInBits
, uint32_t AlignInBits
,
1028 uint64_t OffsetInBits
, LLVMDIFlags Flags
,
1029 LLVMMetadataRef Ty
, LLVMMetadataRef PropertyNode
) {
1030 return wrap(unwrap(Builder
)->createObjCIVar(
1031 {Name
, NameLen
}, unwrapDI
<DIFile
>(File
), LineNo
,
1032 SizeInBits
, AlignInBits
, OffsetInBits
,
1033 map_from_llvmDIFlags(Flags
), unwrapDI
<DIType
>(Ty
),
1034 unwrapDI
<MDNode
>(PropertyNode
)));
1038 LLVMDIBuilderCreateObjCProperty(LLVMDIBuilderRef Builder
,
1039 const char *Name
, size_t NameLen
,
1040 LLVMMetadataRef File
, unsigned LineNo
,
1041 const char *GetterName
, size_t GetterNameLen
,
1042 const char *SetterName
, size_t SetterNameLen
,
1043 unsigned PropertyAttributes
,
1044 LLVMMetadataRef Ty
) {
1045 return wrap(unwrap(Builder
)->createObjCProperty(
1046 {Name
, NameLen
}, unwrapDI
<DIFile
>(File
), LineNo
,
1047 {GetterName
, GetterNameLen
}, {SetterName
, SetterNameLen
},
1048 PropertyAttributes
, unwrapDI
<DIType
>(Ty
)));
1052 LLVMDIBuilderCreateObjectPointerType(LLVMDIBuilderRef Builder
,
1053 LLVMMetadataRef Type
) {
1054 return wrap(unwrap(Builder
)->createObjectPointerType(unwrapDI
<DIType
>(Type
)));
1058 LLVMDIBuilderCreateTypedef(LLVMDIBuilderRef Builder
, LLVMMetadataRef Type
,
1059 const char *Name
, size_t NameLen
,
1060 LLVMMetadataRef File
, unsigned LineNo
,
1061 LLVMMetadataRef Scope
) {
1062 return wrap(unwrap(Builder
)->createTypedef(
1063 unwrapDI
<DIType
>(Type
), {Name
, NameLen
},
1064 unwrapDI
<DIFile
>(File
), LineNo
,
1065 unwrapDI
<DIScope
>(Scope
)));
1069 LLVMDIBuilderCreateInheritance(LLVMDIBuilderRef Builder
,
1070 LLVMMetadataRef Ty
, LLVMMetadataRef BaseTy
,
1071 uint64_t BaseOffset
, uint32_t VBPtrOffset
,
1072 LLVMDIFlags Flags
) {
1073 return wrap(unwrap(Builder
)->createInheritance(
1074 unwrapDI
<DIType
>(Ty
), unwrapDI
<DIType
>(BaseTy
),
1075 BaseOffset
, VBPtrOffset
, map_from_llvmDIFlags(Flags
)));
1079 LLVMDIBuilderCreateForwardDecl(
1080 LLVMDIBuilderRef Builder
, unsigned Tag
, const char *Name
,
1081 size_t NameLen
, LLVMMetadataRef Scope
, LLVMMetadataRef File
, unsigned Line
,
1082 unsigned RuntimeLang
, uint64_t SizeInBits
, uint32_t AlignInBits
,
1083 const char *UniqueIdentifier
, size_t UniqueIdentifierLen
) {
1084 return wrap(unwrap(Builder
)->createForwardDecl(
1085 Tag
, {Name
, NameLen
}, unwrapDI
<DIScope
>(Scope
),
1086 unwrapDI
<DIFile
>(File
), Line
, RuntimeLang
, SizeInBits
,
1087 AlignInBits
, {UniqueIdentifier
, UniqueIdentifierLen
}));
1091 LLVMDIBuilderCreateReplaceableCompositeType(
1092 LLVMDIBuilderRef Builder
, unsigned Tag
, const char *Name
,
1093 size_t NameLen
, LLVMMetadataRef Scope
, LLVMMetadataRef File
, unsigned Line
,
1094 unsigned RuntimeLang
, uint64_t SizeInBits
, uint32_t AlignInBits
,
1095 LLVMDIFlags Flags
, const char *UniqueIdentifier
,
1096 size_t UniqueIdentifierLen
) {
1097 return wrap(unwrap(Builder
)->createReplaceableCompositeType(
1098 Tag
, {Name
, NameLen
}, unwrapDI
<DIScope
>(Scope
),
1099 unwrapDI
<DIFile
>(File
), Line
, RuntimeLang
, SizeInBits
,
1100 AlignInBits
, map_from_llvmDIFlags(Flags
),
1101 {UniqueIdentifier
, UniqueIdentifierLen
}));
1105 LLVMDIBuilderCreateQualifiedType(LLVMDIBuilderRef Builder
, unsigned Tag
,
1106 LLVMMetadataRef Type
) {
1107 return wrap(unwrap(Builder
)->createQualifiedType(Tag
,
1108 unwrapDI
<DIType
>(Type
)));
1112 LLVMDIBuilderCreateReferenceType(LLVMDIBuilderRef Builder
, unsigned Tag
,
1113 LLVMMetadataRef Type
) {
1114 return wrap(unwrap(Builder
)->createReferenceType(Tag
,
1115 unwrapDI
<DIType
>(Type
)));
1119 LLVMDIBuilderCreateNullPtrType(LLVMDIBuilderRef Builder
) {
1120 return wrap(unwrap(Builder
)->createNullPtrType());
1124 LLVMDIBuilderCreateMemberPointerType(LLVMDIBuilderRef Builder
,
1125 LLVMMetadataRef PointeeType
,
1126 LLVMMetadataRef ClassType
,
1127 uint64_t SizeInBits
,
1128 uint32_t AlignInBits
,
1129 LLVMDIFlags Flags
) {
1130 return wrap(unwrap(Builder
)->createMemberPointerType(
1131 unwrapDI
<DIType
>(PointeeType
),
1132 unwrapDI
<DIType
>(ClassType
), AlignInBits
, SizeInBits
,
1133 map_from_llvmDIFlags(Flags
)));
1137 LLVMDIBuilderCreateBitFieldMemberType(LLVMDIBuilderRef Builder
,
1138 LLVMMetadataRef Scope
,
1139 const char *Name
, size_t NameLen
,
1140 LLVMMetadataRef File
, unsigned LineNumber
,
1141 uint64_t SizeInBits
,
1142 uint64_t OffsetInBits
,
1143 uint64_t StorageOffsetInBits
,
1144 LLVMDIFlags Flags
, LLVMMetadataRef Type
) {
1145 return wrap(unwrap(Builder
)->createBitFieldMemberType(
1146 unwrapDI
<DIScope
>(Scope
), {Name
, NameLen
},
1147 unwrapDI
<DIFile
>(File
), LineNumber
,
1148 SizeInBits
, OffsetInBits
, StorageOffsetInBits
,
1149 map_from_llvmDIFlags(Flags
), unwrapDI
<DIType
>(Type
)));
1152 LLVMMetadataRef
LLVMDIBuilderCreateClassType(LLVMDIBuilderRef Builder
,
1153 LLVMMetadataRef Scope
, const char *Name
, size_t NameLen
,
1154 LLVMMetadataRef File
, unsigned LineNumber
, uint64_t SizeInBits
,
1155 uint32_t AlignInBits
, uint64_t OffsetInBits
, LLVMDIFlags Flags
,
1156 LLVMMetadataRef DerivedFrom
,
1157 LLVMMetadataRef
*Elements
, unsigned NumElements
,
1158 LLVMMetadataRef VTableHolder
, LLVMMetadataRef TemplateParamsNode
,
1159 const char *UniqueIdentifier
, size_t UniqueIdentifierLen
) {
1160 auto Elts
= unwrap(Builder
)->getOrCreateArray({unwrap(Elements
),
1162 return wrap(unwrap(Builder
)->createClassType(
1163 unwrapDI
<DIScope
>(Scope
), {Name
, NameLen
},
1164 unwrapDI
<DIFile
>(File
), LineNumber
,
1165 SizeInBits
, AlignInBits
, OffsetInBits
,
1166 map_from_llvmDIFlags(Flags
), unwrapDI
<DIType
>(DerivedFrom
),
1167 Elts
, unwrapDI
<DIType
>(VTableHolder
),
1168 unwrapDI
<MDNode
>(TemplateParamsNode
),
1169 {UniqueIdentifier
, UniqueIdentifierLen
}));
1173 LLVMDIBuilderCreateArtificialType(LLVMDIBuilderRef Builder
,
1174 LLVMMetadataRef Type
) {
1175 return wrap(unwrap(Builder
)->createArtificialType(unwrapDI
<DIType
>(Type
)));
1178 const char *LLVMDITypeGetName(LLVMMetadataRef DType
, size_t *Length
) {
1179 StringRef Str
= unwrap
<DIType
>(DType
)->getName();
1180 *Length
= Str
.size();
1184 uint64_t LLVMDITypeGetSizeInBits(LLVMMetadataRef DType
) {
1185 return unwrapDI
<DIType
>(DType
)->getSizeInBits();
1188 uint64_t LLVMDITypeGetOffsetInBits(LLVMMetadataRef DType
) {
1189 return unwrapDI
<DIType
>(DType
)->getOffsetInBits();
1192 uint32_t LLVMDITypeGetAlignInBits(LLVMMetadataRef DType
) {
1193 return unwrapDI
<DIType
>(DType
)->getAlignInBits();
1196 unsigned LLVMDITypeGetLine(LLVMMetadataRef DType
) {
1197 return unwrapDI
<DIType
>(DType
)->getLine();
1200 LLVMDIFlags
LLVMDITypeGetFlags(LLVMMetadataRef DType
) {
1201 return map_to_llvmDIFlags(unwrapDI
<DIType
>(DType
)->getFlags());
1204 LLVMMetadataRef
LLVMDIBuilderGetOrCreateTypeArray(LLVMDIBuilderRef Builder
,
1205 LLVMMetadataRef
*Types
,
1208 unwrap(Builder
)->getOrCreateTypeArray({unwrap(Types
), Length
}).get());
1212 LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef Builder
,
1213 LLVMMetadataRef File
,
1214 LLVMMetadataRef
*ParameterTypes
,
1215 unsigned NumParameterTypes
,
1216 LLVMDIFlags Flags
) {
1217 auto Elts
= unwrap(Builder
)->getOrCreateTypeArray({unwrap(ParameterTypes
),
1218 NumParameterTypes
});
1219 return wrap(unwrap(Builder
)->createSubroutineType(
1220 Elts
, map_from_llvmDIFlags(Flags
)));
1223 LLVMMetadataRef
LLVMDIBuilderCreateExpression(LLVMDIBuilderRef Builder
,
1224 int64_t *Addr
, size_t Length
) {
1225 return wrap(unwrap(Builder
)->createExpression(ArrayRef
<int64_t>(Addr
,
1230 LLVMDIBuilderCreateConstantValueExpression(LLVMDIBuilderRef Builder
,
1232 return wrap(unwrap(Builder
)->createConstantValueExpression(Value
));
1235 LLVMMetadataRef
LLVMDIBuilderCreateGlobalVariableExpression(
1236 LLVMDIBuilderRef Builder
, LLVMMetadataRef Scope
, const char *Name
,
1237 size_t NameLen
, const char *Linkage
, size_t LinkLen
, LLVMMetadataRef File
,
1238 unsigned LineNo
, LLVMMetadataRef Ty
, LLVMBool LocalToUnit
,
1239 LLVMMetadataRef Expr
, LLVMMetadataRef Decl
, uint32_t AlignInBits
) {
1240 return wrap(unwrap(Builder
)->createGlobalVariableExpression(
1241 unwrapDI
<DIScope
>(Scope
), {Name
, NameLen
}, {Linkage
, LinkLen
},
1242 unwrapDI
<DIFile
>(File
), LineNo
, unwrapDI
<DIType
>(Ty
), LocalToUnit
,
1243 unwrap
<DIExpression
>(Expr
), unwrapDI
<MDNode
>(Decl
),
1244 nullptr, AlignInBits
));
1247 LLVMMetadataRef
LLVMTemporaryMDNode(LLVMContextRef Ctx
, LLVMMetadataRef
*Data
,
1250 MDTuple::getTemporary(*unwrap(Ctx
), {unwrap(Data
), Count
}).release());
1253 void LLVMDisposeTemporaryMDNode(LLVMMetadataRef TempNode
) {
1254 MDNode::deleteTemporary(unwrapDI
<MDNode
>(TempNode
));
1257 void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef TargetMetadata
,
1258 LLVMMetadataRef Replacement
) {
1259 auto *Node
= unwrapDI
<MDNode
>(TargetMetadata
);
1260 Node
->replaceAllUsesWith(unwrap
<Metadata
>(Replacement
));
1261 MDNode::deleteTemporary(Node
);
1264 LLVMMetadataRef
LLVMDIBuilderCreateTempGlobalVariableFwdDecl(
1265 LLVMDIBuilderRef Builder
, LLVMMetadataRef Scope
, const char *Name
,
1266 size_t NameLen
, const char *Linkage
, size_t LnkLen
, LLVMMetadataRef File
,
1267 unsigned LineNo
, LLVMMetadataRef Ty
, LLVMBool LocalToUnit
,
1268 LLVMMetadataRef Decl
, uint32_t AlignInBits
) {
1269 return wrap(unwrap(Builder
)->createTempGlobalVariableFwdDecl(
1270 unwrapDI
<DIScope
>(Scope
), {Name
, NameLen
}, {Linkage
, LnkLen
},
1271 unwrapDI
<DIFile
>(File
), LineNo
, unwrapDI
<DIType
>(Ty
), LocalToUnit
,
1272 unwrapDI
<MDNode
>(Decl
), nullptr, AlignInBits
));
1276 LLVMDIBuilderInsertDeclareBefore(LLVMDIBuilderRef Builder
, LLVMValueRef Storage
,
1277 LLVMMetadataRef VarInfo
, LLVMMetadataRef Expr
,
1278 LLVMMetadataRef DL
, LLVMValueRef Instr
) {
1279 return wrap(unwrap(Builder
)->insertDeclare(
1280 unwrap(Storage
), unwrap
<DILocalVariable
>(VarInfo
),
1281 unwrap
<DIExpression
>(Expr
), unwrap
<DILocation
>(DL
),
1282 unwrap
<Instruction
>(Instr
)));
1285 LLVMValueRef
LLVMDIBuilderInsertDeclareAtEnd(
1286 LLVMDIBuilderRef Builder
, LLVMValueRef Storage
, LLVMMetadataRef VarInfo
,
1287 LLVMMetadataRef Expr
, LLVMMetadataRef DL
, LLVMBasicBlockRef Block
) {
1288 return wrap(unwrap(Builder
)->insertDeclare(
1289 unwrap(Storage
), unwrap
<DILocalVariable
>(VarInfo
),
1290 unwrap
<DIExpression
>(Expr
), unwrap
<DILocation
>(DL
),
1294 LLVMValueRef
LLVMDIBuilderInsertDbgValueBefore(LLVMDIBuilderRef Builder
,
1296 LLVMMetadataRef VarInfo
,
1297 LLVMMetadataRef Expr
,
1298 LLVMMetadataRef DebugLoc
,
1299 LLVMValueRef Instr
) {
1300 return wrap(unwrap(Builder
)->insertDbgValueIntrinsic(
1301 unwrap(Val
), unwrap
<DILocalVariable
>(VarInfo
),
1302 unwrap
<DIExpression
>(Expr
), unwrap
<DILocation
>(DebugLoc
),
1303 unwrap
<Instruction
>(Instr
)));
1306 LLVMValueRef
LLVMDIBuilderInsertDbgValueAtEnd(LLVMDIBuilderRef Builder
,
1308 LLVMMetadataRef VarInfo
,
1309 LLVMMetadataRef Expr
,
1310 LLVMMetadataRef DebugLoc
,
1311 LLVMBasicBlockRef Block
) {
1312 return wrap(unwrap(Builder
)->insertDbgValueIntrinsic(
1313 unwrap(Val
), unwrap
<DILocalVariable
>(VarInfo
),
1314 unwrap
<DIExpression
>(Expr
), unwrap
<DILocation
>(DebugLoc
),
1318 LLVMMetadataRef
LLVMDIBuilderCreateAutoVariable(
1319 LLVMDIBuilderRef Builder
, LLVMMetadataRef Scope
, const char *Name
,
1320 size_t NameLen
, LLVMMetadataRef File
, unsigned LineNo
, LLVMMetadataRef Ty
,
1321 LLVMBool AlwaysPreserve
, LLVMDIFlags Flags
, uint32_t AlignInBits
) {
1322 return wrap(unwrap(Builder
)->createAutoVariable(
1323 unwrap
<DIScope
>(Scope
), {Name
, NameLen
}, unwrap
<DIFile
>(File
),
1324 LineNo
, unwrap
<DIType
>(Ty
), AlwaysPreserve
,
1325 map_from_llvmDIFlags(Flags
), AlignInBits
));
1328 LLVMMetadataRef
LLVMDIBuilderCreateParameterVariable(
1329 LLVMDIBuilderRef Builder
, LLVMMetadataRef Scope
, const char *Name
,
1330 size_t NameLen
, unsigned ArgNo
, LLVMMetadataRef File
, unsigned LineNo
,
1331 LLVMMetadataRef Ty
, LLVMBool AlwaysPreserve
, LLVMDIFlags Flags
) {
1332 return wrap(unwrap(Builder
)->createParameterVariable(
1333 unwrap
<DIScope
>(Scope
), {Name
, NameLen
}, ArgNo
, unwrap
<DIFile
>(File
),
1334 LineNo
, unwrap
<DIType
>(Ty
), AlwaysPreserve
,
1335 map_from_llvmDIFlags(Flags
)));
1338 LLVMMetadataRef
LLVMDIBuilderGetOrCreateSubrange(LLVMDIBuilderRef Builder
,
1339 int64_t Lo
, int64_t Count
) {
1340 return wrap(unwrap(Builder
)->getOrCreateSubrange(Lo
, Count
));
1343 LLVMMetadataRef
LLVMDIBuilderGetOrCreateArray(LLVMDIBuilderRef Builder
,
1344 LLVMMetadataRef
*Data
,
1346 Metadata
**DataValue
= unwrap(Data
);
1347 return wrap(unwrap(Builder
)->getOrCreateArray({DataValue
, Length
}).get());
1350 LLVMMetadataRef
LLVMGetSubprogram(LLVMValueRef Func
) {
1351 return wrap(unwrap
<Function
>(Func
)->getSubprogram());
1354 void LLVMSetSubprogram(LLVMValueRef Func
, LLVMMetadataRef SP
) {
1355 unwrap
<Function
>(Func
)->setSubprogram(unwrap
<DISubprogram
>(SP
));
1358 LLVMMetadataKind
LLVMGetMetadataKind(LLVMMetadataRef Metadata
) {
1359 switch(unwrap(Metadata
)->getMetadataID()) {
1360 #define HANDLE_METADATA_LEAF(CLASS) \
1361 case Metadata::CLASS##Kind: \
1362 return (LLVMMetadataKind)LLVM##CLASS##MetadataKind;
1363 #include "llvm/IR/Metadata.def"
1365 return (LLVMMetadataKind
)LLVMGenericDINodeMetadataKind
;