LLVM 23.0.0git
DebugInfo.cpp
Go to the documentation of this file.
1//===- DebugInfo.cpp - Debug Information Helper Classes -------------------===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the helper classes used to build and interpret debug
10// information in LLVM IR form.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm-c/DebugInfo.h"
15#include "LLVMContextImpl.h"
16#include "llvm/ADT/APSInt.h"
17#include "llvm/ADT/DenseMap.h"
18#include "llvm/ADT/DenseSet.h"
19#include "llvm/ADT/STLExtras.h"
22#include "llvm/ADT/StringRef.h"
23#include "llvm/IR/BasicBlock.h"
24#include "llvm/IR/Constants.h"
25#include "llvm/IR/DIBuilder.h"
26#include "llvm/IR/DebugInfo.h"
28#include "llvm/IR/DebugLoc.h"
30#include "llvm/IR/Function.h"
32#include "llvm/IR/Instruction.h"
34#include "llvm/IR/LLVMContext.h"
35#include "llvm/IR/Metadata.h"
36#include "llvm/IR/Module.h"
37#include "llvm/IR/PassManager.h"
40#include <algorithm>
41#include <cassert>
42#include <optional>
43
44using namespace llvm;
45using namespace llvm::at;
46using namespace llvm::dwarf;
47
49 // This function is hot. Check whether the value has any metadata to avoid a
50 // DenseMap lookup. This check is a bitfield datamember lookup.
51 if (!V->isUsedByMetadata())
52 return {};
54 if (!L)
55 return {};
56
58 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers())
59 if (DVR->getType() == DbgVariableRecord::LocationType::Declare)
60 Declares.push_back(DVR);
61
62 return Declares;
63}
64
66 // This function is hot. Check whether the value has any metadata to avoid a
67 // DenseMap lookup. This check is a bitfield datamember lookup.
68 if (!V->isUsedByMetadata())
69 return {};
71 if (!L)
72 return {};
73
75 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers())
77 DEclareValues.push_back(DVR);
78
79 return DEclareValues;
80}
81
83 // This function is hot. Check whether the value has any metadata to avoid a
84 // DenseMap lookup. This check is a bitfield datamember lookup.
85 if (!V->isUsedByMetadata())
86 return {};
88 if (!L)
89 return {};
90
92 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers())
93 if (DVR->isValueOfVariable())
94 Values.push_back(DVR);
95
96 return Values;
97}
98
99template <bool DbgAssignAndValuesOnly>
100static void
102 SmallVectorImpl<DbgVariableRecord *> &DbgVariableRecords) {
103 // This function is hot. Check whether the value has any metadata to avoid a
104 // DenseMap lookup.
105 if (!V->isUsedByMetadata())
106 return;
107
108 // TODO: If this value appears multiple times in a DIArgList, we should still
109 // only add the owning dbg.value once; use this set to track ArgListUsers.
110 // This behaviour can be removed when we can automatically remove duplicates.
111 // V will also appear twice in a dbg.assign if its used in the both the value
112 // and address components.
113 SmallPtrSet<DbgVariableRecord *, 4> EncounteredDbgVariableRecords;
114
115 /// Append users of MetadataAsValue(MD).
116 auto AppendUsers = [&EncounteredDbgVariableRecords,
117 &DbgVariableRecords](Metadata *MD) {
118 // Get DbgVariableRecords that use this as a single value.
120 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers()) {
121 if (!DbgAssignAndValuesOnly || DVR->isDbgValue() || DVR->isDbgAssign())
122 if (EncounteredDbgVariableRecords.insert(DVR).second)
123 DbgVariableRecords.push_back(DVR);
124 }
125 }
126 };
127
128 if (auto *L = LocalAsMetadata::getIfExists(V)) {
129 AppendUsers(L);
130 for (Metadata *AL : L->getAllArgListUsers()) {
131 AppendUsers(AL);
132 DIArgList *DI = cast<DIArgList>(AL);
134 if (!DbgAssignAndValuesOnly || DVR->isDbgValue() || DVR->isDbgAssign())
135 if (EncounteredDbgVariableRecords.insert(DVR).second)
136 DbgVariableRecords.push_back(DVR);
137 }
138 }
139}
140
142 Value *V, SmallVectorImpl<DbgVariableRecord *> &DbgVariableRecords) {
143 findDbgIntrinsics</*DbgAssignAndValuesOnly=*/true>(V, DbgVariableRecords);
144}
145
147 Value *V, SmallVectorImpl<DbgVariableRecord *> &DbgVariableRecords) {
148 findDbgIntrinsics</*DbgAssignAndValuesOnly=*/false>(V, DbgVariableRecords);
149}
150
152 if (auto *LocalScope = dyn_cast_or_null<DILocalScope>(Scope))
153 return LocalScope->getSubprogram();
154 return nullptr;
155}
156
158 // Original dbg.declare must have a location.
159 const DebugLoc &DeclareLoc = DVR->getDebugLoc();
160 MDNode *Scope = DeclareLoc.getScope();
161 DILocation *InlinedAt = DeclareLoc.getInlinedAt();
162 // Because no machine insts can come from debug intrinsics, only the scope
163 // and inlinedAt is significant. Zero line numbers are used in case this
164 // DebugLoc leaks into any adjacent instructions. Produce an unknown location
165 // with the correct scope / inlinedAt fields.
166 return DILocation::get(DVR->getContext(), 0, 0, Scope, InlinedAt);
167}
168
169//===----------------------------------------------------------------------===//
170// DebugInfoFinder implementations.
171//===----------------------------------------------------------------------===//
172
174 CUs.clear();
175 SPs.clear();
176 GVs.clear();
177 TYs.clear();
178 Scopes.clear();
179 Macros.clear();
180 NodesSeen.clear();
181}
182
184 for (auto *CU : M.debug_compile_units())
185 processCompileUnit(CU);
186 for (auto &F : M.functions()) {
187 if (auto *SP = cast_or_null<DISubprogram>(F.getSubprogram()))
189 // There could be subprograms from inlined functions referenced from
190 // instructions only. Walk the function to find them.
191 for (const BasicBlock &BB : F)
192 for (const Instruction &I : BB)
194 }
195}
196
197void DebugInfoFinder::processCompileUnit(DICompileUnit *CU) {
198 if (!addCompileUnit(CU))
199 return;
200 for (auto *DIG : CU->getGlobalVariables()) {
201 if (!addGlobalVariable(DIG))
202 continue;
203 auto *GV = DIG->getVariable();
204 processScope(GV->getScope());
205 processType(GV->getType());
206 }
207 for (auto *ET : CU->getEnumTypes())
208 processType(ET);
209 for (auto *RT : CU->getRetainedTypes())
210 if (auto *T = dyn_cast<DIType>(RT))
211 processType(T);
212 else
214 for (auto *Import : CU->getImportedEntities())
215 processImportedEntity(Import);
216 for (auto *Macro : CU->getMacros())
217 processMacroNode(Macro, nullptr);
218}
219
221 const Instruction &I) {
222 if (auto *DVI = dyn_cast<DbgVariableIntrinsic>(&I))
223 processVariable(DVI->getVariable());
224
225 if (auto DbgLoc = I.getDebugLoc())
226 processLocation(M, DbgLoc.get());
227
228 for (const DbgRecord &DPR : I.getDbgRecordRange())
229 processDbgRecord(M, DPR);
230}
231
233 if (!Loc)
234 return;
235 processScope(Loc->getScope());
236 processLocation(M, Loc->getInlinedAt());
237}
238
241 processVariable(DVR->getVariable());
243}
244
245void DebugInfoFinder::processType(DIType *DT) {
246 if (!addType(DT))
247 return;
248 processScope(DT->getScope());
249 if (auto *ST = dyn_cast<DISubroutineType>(DT)) {
250 for (DIType *Ref : ST->getTypeArray())
251 processType(Ref);
252 return;
253 }
254 if (auto *DCT = dyn_cast<DICompositeType>(DT)) {
255 processType(DCT->getBaseType());
256 for (Metadata *D : DCT->getElements()) {
257 if (auto *T = dyn_cast<DIType>(D))
258 processType(T);
259 else if (auto *SP = dyn_cast<DISubprogram>(D))
261 }
262 return;
263 }
264 if (auto *DDT = dyn_cast<DIDerivedType>(DT)) {
265 processType(DDT->getBaseType());
266 }
267}
268
269void DebugInfoFinder::processImportedEntity(const DIImportedEntity *Import) {
270 auto *Entity = Import->getEntity();
271 if (auto *T = dyn_cast<DIType>(Entity))
272 processType(T);
273 else if (auto *SP = dyn_cast<DISubprogram>(Entity))
275 else if (auto *NS = dyn_cast<DINamespace>(Entity))
276 processScope(NS->getScope());
277 else if (auto *M = dyn_cast<DIModule>(Entity))
278 processScope(M->getScope());
279}
280
281/// Process a macro debug info node (DIMacroNode).
282///
283/// A DIMacroNode is one of two types:
284/// - DIMacro: A single macro definition. Add it to the Macros list along with
285/// its containing DIMacroFile.
286/// - DIMacroFile: A file containing macros. Recursively process all nested
287/// macro nodes within it (avoiding duplicates by tracking visited nodes).
288void DebugInfoFinder::processMacroNode(DIMacroNode *Macro,
289 DIMacroFile *CurrentMacroFile) {
290 if (!Macro)
291 return;
292
293 if (auto *M = dyn_cast<DIMacro>(Macro)) {
294 addMacro(M, CurrentMacroFile);
295 return;
296 }
297
298 auto *MF = dyn_cast<DIMacroFile>(Macro);
299 assert(MF &&
300 "Expected a DIMacroFile (it can't be any other type at this point)");
301
302 // Check if we've already seen this macro file to avoid infinite recursion
303 if (!NodesSeen.insert(MF).second)
304 return;
305
306 // Recursively process nested macros in the macro file
307 for (auto *Element : MF->getElements())
308 processMacroNode(Element, MF);
309}
310
311void DebugInfoFinder::processScope(DIScope *Scope) {
312 if (!Scope)
313 return;
314 if (auto *Ty = dyn_cast<DIType>(Scope)) {
315 processType(Ty);
316 return;
317 }
318 if (auto *CU = dyn_cast<DICompileUnit>(Scope)) {
319 addCompileUnit(CU);
320 return;
321 }
322 if (auto *SP = dyn_cast<DISubprogram>(Scope)) {
324 return;
325 }
326 if (!addScope(Scope))
327 return;
328 if (auto *LB = dyn_cast<DILexicalBlockBase>(Scope)) {
329 processScope(LB->getScope());
330 } else if (auto *NS = dyn_cast<DINamespace>(Scope)) {
331 processScope(NS->getScope());
332 } else if (auto *M = dyn_cast<DIModule>(Scope)) {
333 processScope(M->getScope());
334 }
335}
336
338 if (!addSubprogram(SP))
339 return;
340 processScope(SP->getScope());
341 // Some of the users, e.g. CloneFunctionInto / CloneModule, need to set up a
342 // ValueMap containing identity mappings for all of the DICompileUnit's, not
343 // just DISubprogram's, referenced from anywhere within the Function being
344 // cloned prior to calling MapMetadata / RemapInstruction to avoid their
345 // duplication later as DICompileUnit's are also directly referenced by
346 // llvm.dbg.cu list. Therefore we need to collect DICompileUnit's here as
347 // well. Also, DICompileUnit's may reference DISubprogram's too and therefore
348 // need to be at least looked through.
349 processCompileUnit(SP->getUnit());
350 processType(SP->getType());
351 for (auto *Element : SP->getTemplateParams()) {
352 if (auto *TType = dyn_cast<DITemplateTypeParameter>(Element)) {
353 processType(TType->getType());
354 } else if (auto *TVal = dyn_cast<DITemplateValueParameter>(Element)) {
355 processType(TVal->getType());
356 }
357 }
358
359 SP->forEachRetainedNode(
360 [this](DILocalVariable *LV) { processVariable(LV); }, [](DILabel *L) {},
361 [this](DIImportedEntity *IE) { processImportedEntity(IE); },
362 [this](DIType *T) { processType(T); });
363}
364
366 if (!NodesSeen.insert(DV).second)
367 return;
368 processScope(DV->getScope());
369 processType(DV->getType());
370}
371
372bool DebugInfoFinder::addType(DIType *DT) {
373 if (!DT)
374 return false;
375
376 if (!NodesSeen.insert(DT).second)
377 return false;
378
379 TYs.push_back(DT);
380 return true;
381}
382
383bool DebugInfoFinder::addCompileUnit(DICompileUnit *CU) {
384 if (!CU)
385 return false;
386 if (!NodesSeen.insert(CU).second)
387 return false;
388
389 CUs.push_back(CU);
390 return true;
391}
392
393bool DebugInfoFinder::addGlobalVariable(DIGlobalVariableExpression *DIG) {
394 if (!NodesSeen.insert(DIG).second)
395 return false;
396
397 GVs.push_back(DIG);
398 return true;
399}
400
401bool DebugInfoFinder::addSubprogram(DISubprogram *SP) {
402 if (!SP)
403 return false;
404
405 if (!NodesSeen.insert(SP).second)
406 return false;
407
408 SPs.push_back(SP);
409 return true;
410}
411
412bool DebugInfoFinder::addScope(DIScope *Scope) {
413 if (!Scope)
414 return false;
415 // FIXME: Ocaml binding generates a scope with no content, we treat it
416 // as null for now.
417 if (Scope->getNumOperands() == 0)
418 return false;
419 if (!NodesSeen.insert(Scope).second)
420 return false;
421 Scopes.push_back(Scope);
422 return true;
423}
424
425bool DebugInfoFinder::addMacro(DIMacro *Macro, DIMacroFile *MacroFile) {
426 if (!Macro)
427 return false;
428
429 if (!NodesSeen.insert(Macro).second)
430 return false;
431
432 Macros.push_back(std::make_pair(Macro, MacroFile));
433 return true;
434}
435
436/// Recursively handle DILocations in followup metadata etc.
437///
438/// TODO: If for example a followup loop metadata would reference itself this
439/// function would go into infinite recursion. We do not expect such cycles in
440/// the loop metadata (except for the self-referencing first element
441/// "LoopID"). However, we could at least handle such situations more gracefully
442/// somehow (e.g. by keeping track of visited nodes and dropping metadata).
444 Metadata *MetadataIn, function_ref<Metadata *(Metadata *)> Updater) {
445 const MDTuple *M = dyn_cast_or_null<MDTuple>(MetadataIn);
446 // The loop metadata options should start with a MDString.
447 if (!M || M->getNumOperands() < 1 || !isa<MDString>(M->getOperand(0)))
448 return MetadataIn;
449
450 bool Updated = false;
451 SmallVector<Metadata *, 4> MDs{M->getOperand(0)};
452 for (Metadata *MD : llvm::drop_begin(M->operands())) {
453 if (!MD) {
454 MDs.push_back(nullptr);
455 continue;
456 }
457 Metadata *NewMD =
458 Updater(updateLoopMetadataDebugLocationsRecursive(MD, Updater));
459 if (NewMD)
460 MDs.push_back(NewMD);
461 Updated |= NewMD != MD;
462 }
463
464 assert(!M->isDistinct() && "M should not be distinct.");
465 return Updated ? MDNode::get(M->getContext(), MDs) : MetadataIn;
466}
467
469 MDNode *OrigLoopID, function_ref<Metadata *(Metadata *)> Updater) {
470 assert(OrigLoopID && OrigLoopID->getNumOperands() > 0 &&
471 "Loop ID needs at least one operand");
472 assert(OrigLoopID && OrigLoopID->getOperand(0).get() == OrigLoopID &&
473 "Loop ID should refer to itself");
474
475 // Save space for the self-referential LoopID.
476 SmallVector<Metadata *, 4> MDs = {nullptr};
477
478 for (Metadata *MD : llvm::drop_begin(OrigLoopID->operands())) {
479 if (!MD)
480 MDs.push_back(nullptr);
481 else if (Metadata *NewMD = Updater(
483 MDs.push_back(NewMD);
484 }
485
486 MDNode *NewLoopID = MDNode::getDistinct(OrigLoopID->getContext(), MDs);
487 // Insert the self-referential LoopID.
488 NewLoopID->replaceOperandWith(0, NewLoopID);
489 return NewLoopID;
490}
491
493 Instruction &I, function_ref<Metadata *(Metadata *)> Updater) {
494 MDNode *OrigLoopID = I.getMetadata(LLVMContext::MD_loop);
495 if (!OrigLoopID)
496 return;
497 MDNode *NewLoopID = updateLoopMetadataDebugLocationsImpl(OrigLoopID, Updater);
498 I.setMetadata(LLVMContext::MD_loop, NewLoopID);
499}
500
501/// Return true if a node is a DILocation or if a DILocation is
502/// indirectly referenced by one of the node's children.
505 Metadata *MD) {
507 if (!N)
508 return false;
509 if (isa<DILocation>(N) || Reachable.count(N))
510 return true;
511 if (!Visited.insert(N).second)
512 return false;
513 for (auto &OpIt : N->operands()) {
514 Metadata *Op = OpIt.get();
515 if (isDILocationReachable(Visited, Reachable, Op)) {
516 // Don't return just yet as we want to visit all MD's children to
517 // initialize DILocationReachable in stripDebugLocFromLoopID
518 Reachable.insert(N);
519 }
520 }
521 return Reachable.count(N);
522}
523
525 SmallPtrSetImpl<Metadata *> &AllDILocation,
526 const SmallPtrSetImpl<Metadata *> &DIReachable,
527 Metadata *MD) {
529 if (!N)
530 return false;
531 if (isa<DILocation>(N) || AllDILocation.count(N))
532 return true;
533 if (!DIReachable.count(N))
534 return false;
535 if (!Visited.insert(N).second)
536 return false;
537 for (auto &OpIt : N->operands()) {
538 Metadata *Op = OpIt.get();
539 if (Op == MD)
540 continue;
541 if (!isAllDILocation(Visited, AllDILocation, DIReachable, Op)) {
542 return false;
543 }
544 }
545 AllDILocation.insert(N);
546 return true;
547}
548
549static Metadata *
551 const SmallPtrSetImpl<Metadata *> &DIReachable, Metadata *MD) {
552 if (isa<DILocation>(MD) || AllDILocation.count(MD))
553 return nullptr;
554
555 if (!DIReachable.count(MD))
556 return MD;
557
559 if (!N)
560 return MD;
561
563 bool HasSelfRef = false;
564 for (unsigned i = 0; i < N->getNumOperands(); ++i) {
565 Metadata *A = N->getOperand(i);
566 if (!A) {
567 Args.push_back(nullptr);
568 } else if (A == MD) {
569 assert(i == 0 && "expected i==0 for self-reference");
570 HasSelfRef = true;
571 Args.push_back(nullptr);
572 } else if (Metadata *NewArg =
573 stripLoopMDLoc(AllDILocation, DIReachable, A)) {
574 Args.push_back(NewArg);
575 }
576 }
577 if (Args.empty() || (HasSelfRef && Args.size() == 1))
578 return nullptr;
579
580 MDNode *NewMD = N->isDistinct() ? MDNode::getDistinct(N->getContext(), Args)
581 : MDNode::get(N->getContext(), Args);
582 if (HasSelfRef)
583 NewMD->replaceOperandWith(0, NewMD);
584 return NewMD;
585}
586
588 assert(!N->operands().empty() && "Missing self reference?");
589 SmallPtrSet<Metadata *, 8> Visited, DILocationReachable, AllDILocation;
590 // If we already visited N, there is nothing to do.
591 if (!Visited.insert(N).second)
592 return N;
593
594 // If there is no debug location, we do not have to rewrite this
595 // MDNode. This loop also initializes DILocationReachable, later
596 // needed by updateLoopMetadataDebugLocationsImpl; the use of
597 // count_if avoids an early exit.
598 if (!llvm::count_if(llvm::drop_begin(N->operands()),
599 [&Visited, &DILocationReachable](const MDOperand &Op) {
600 return isDILocationReachable(
601 Visited, DILocationReachable, Op.get());
602 }))
603 return N;
604
605 Visited.clear();
606 // If there is only the debug location without any actual loop metadata, we
607 // can remove the metadata.
608 if (llvm::all_of(llvm::drop_begin(N->operands()),
609 [&Visited, &AllDILocation,
610 &DILocationReachable](const MDOperand &Op) {
611 return isAllDILocation(Visited, AllDILocation,
612 DILocationReachable, Op.get());
613 }))
614 return nullptr;
615
617 N, [&AllDILocation, &DILocationReachable](Metadata *MD) -> Metadata * {
618 return stripLoopMDLoc(AllDILocation, DILocationReachable, MD);
619 });
620}
621
623 bool Changed = false;
624 if (F.hasMetadata(LLVMContext::MD_dbg)) {
625 Changed = true;
626 F.setSubprogram(nullptr);
627 }
628
630 for (BasicBlock &BB : F) {
632 if (I.getDebugLoc()) {
633 Changed = true;
634 I.setDebugLoc(DebugLoc());
635 }
636 if (auto *LoopID = I.getMetadata(LLVMContext::MD_loop)) {
637 auto *NewLoopID = LoopIDsMap.lookup(LoopID);
638 if (!NewLoopID)
639 NewLoopID = LoopIDsMap[LoopID] = stripDebugLocFromLoopID(LoopID);
640 if (NewLoopID != LoopID)
641 I.setMetadata(LLVMContext::MD_loop, NewLoopID);
642 }
643 // Strip other attachments that are or use debug info.
644 if (I.hasMetadataOtherThanDebugLoc()) {
645 // Heapallocsites point into the DIType system.
646 I.setMetadata("heapallocsite", nullptr);
647 // DIAssignID are debug info metadata primitives.
648 I.setMetadata(LLVMContext::MD_DIAssignID, nullptr);
649 }
650 I.dropDbgRecords();
651 }
652 }
653 return Changed;
654}
655
657 llvm::TimeTraceScope timeScope("Strip debug info");
658 bool Changed = false;
659
660 for (NamedMDNode &NMD : llvm::make_early_inc_range(M.named_metadata())) {
661 // We're stripping debug info, and without them, coverage information
662 // doesn't quite make sense.
663 if (NMD.getName().starts_with("llvm.dbg.") ||
664 NMD.getName() == "llvm.gcov") {
665 NMD.eraseFromParent();
666 Changed = true;
667 }
668 }
669
670 for (Function &F : M)
672
673 for (auto &GV : M.globals()) {
674 Changed |= GV.eraseMetadata(LLVMContext::MD_dbg);
675 }
676
677 if (GVMaterializer *Materializer = M.getMaterializer())
678 Materializer->setStripDebugInfo();
679
680 return Changed;
681}
682
683namespace {
684
685/// Helper class to downgrade -g metadata to -gline-tables-only metadata.
686class DebugTypeInfoRemoval {
688
689public:
690 /// The (void)() type.
691 MDNode *EmptySubroutineType;
692
693private:
694 /// Remember what linkage name we originally had before stripping. If we end
695 /// up making two subprograms identical who originally had different linkage
696 /// names, then we need to make one of them distinct, to avoid them getting
697 /// uniqued. Maps the new node to the old linkage name.
699
700 // TODO: Remember the distinct subprogram we created for a given linkage name,
701 // so that we can continue to unique whenever possible. Map <newly created
702 // node, old linkage name> to the first (possibly distinct) mdsubprogram
703 // created for that combination. This is not strictly needed for correctness,
704 // but can cut down on the number of MDNodes and let us diff cleanly with the
705 // output of -gline-tables-only.
706
707public:
708 DebugTypeInfoRemoval(LLVMContext &C)
709 : EmptySubroutineType(DISubroutineType::get(C, DINode::FlagZero, 0,
710 MDNode::get(C, {}))) {}
711
712 Metadata *map(Metadata *M) {
713 if (!M)
714 return nullptr;
715 auto Replacement = Replacements.find(M);
716 if (Replacement != Replacements.end())
717 return Replacement->second;
718
719 return M;
720 }
721 MDNode *mapNode(Metadata *N) { return dyn_cast_or_null<MDNode>(map(N)); }
722
723 /// Recursively remap N and all its referenced children. Does a DF post-order
724 /// traversal, so as to remap bottoms up.
725 void traverseAndRemap(MDNode *N) { traverse(N); }
726
727private:
728 // Create a new DISubprogram, to replace the one given.
729 DISubprogram *getReplacementSubprogram(DISubprogram *MDS) {
730 auto *FileAndScope = cast_or_null<DIFile>(map(MDS->getFile()));
731 StringRef LinkageName = MDS->getName().empty() ? MDS->getLinkageName() : "";
732 DISubprogram *Declaration = nullptr;
733 auto *Type = cast_or_null<DISubroutineType>(map(MDS->getType()));
734 DIType *ContainingType =
735 cast_or_null<DIType>(map(MDS->getContainingType()));
736 auto *Unit = cast_or_null<DICompileUnit>(map(MDS->getUnit()));
737 auto Variables = nullptr;
738 auto TemplateParams = nullptr;
739
740 // Make a distinct DISubprogram, for situations that warrant it.
741 auto distinctMDSubprogram = [&]() {
742 return DISubprogram::getDistinct(
743 MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
744 FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(),
745 ContainingType, MDS->getVirtualIndex(), MDS->getThisAdjustment(),
746 MDS->getFlags(), MDS->getSPFlags(), Unit, TemplateParams, Declaration,
747 Variables);
748 };
749
750 if (MDS->isDistinct())
751 return distinctMDSubprogram();
752
753 auto *NewMDS = DISubprogram::get(
754 MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
755 FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(), ContainingType,
756 MDS->getVirtualIndex(), MDS->getThisAdjustment(), MDS->getFlags(),
757 MDS->getSPFlags(), Unit, TemplateParams, Declaration, Variables);
758
759 StringRef OldLinkageName = MDS->getLinkageName();
760
761 // See if we need to make a distinct one.
762 auto OrigLinkage = NewToLinkageName.find(NewMDS);
763 if (OrigLinkage != NewToLinkageName.end()) {
764 if (OrigLinkage->second == OldLinkageName)
765 // We're good.
766 return NewMDS;
767
768 // Otherwise, need to make a distinct one.
769 // TODO: Query the map to see if we already have one.
770 return distinctMDSubprogram();
771 }
772
773 NewToLinkageName.insert({NewMDS, MDS->getLinkageName()});
774 return NewMDS;
775 }
776
777 /// Create a new compile unit, to replace the one given
778 DICompileUnit *getReplacementCU(DICompileUnit *CU) {
779 // Drop skeleton CUs.
780 if (CU->getDWOId())
781 return nullptr;
782
783 auto *File = cast_or_null<DIFile>(map(CU->getFile()));
784 MDTuple *EnumTypes = nullptr;
785 MDTuple *RetainedTypes = nullptr;
786 MDTuple *GlobalVariables = nullptr;
787 MDTuple *ImportedEntities = nullptr;
788 return DICompileUnit::getDistinct(
789 CU->getContext(), CU->getSourceLanguage(), File, CU->getProducer(),
790 CU->isOptimized(), CU->getFlags(), CU->getRuntimeVersion(),
792 RetainedTypes, GlobalVariables, ImportedEntities, CU->getMacros(),
793 CU->getDWOId(), CU->getSplitDebugInlining(),
795 CU->getRangesBaseAddress(), CU->getSysRoot(), CU->getSDK());
796 }
797
798 DILocation *getReplacementMDLocation(DILocation *MLD) {
799 auto *Scope = map(MLD->getScope());
800 auto *InlinedAt = map(MLD->getInlinedAt());
801 if (MLD->isDistinct())
802 return DILocation::getDistinct(MLD->getContext(), MLD->getLine(),
803 MLD->getColumn(), Scope, InlinedAt);
804 return DILocation::get(MLD->getContext(), MLD->getLine(), MLD->getColumn(),
805 Scope, InlinedAt);
806 }
807
808 /// Create a new generic MDNode, to replace the one given
809 MDNode *getReplacementMDNode(MDNode *N) {
811 Ops.reserve(N->getNumOperands());
812 for (auto &I : N->operands())
813 if (I)
814 Ops.push_back(map(I));
815 auto *Ret = MDNode::get(N->getContext(), Ops);
816 return Ret;
817 }
818
819 /// Attempt to re-map N to a newly created node.
820 void remap(MDNode *N) {
821 if (Replacements.count(N))
822 return;
823
824 auto doRemap = [&](MDNode *N) -> MDNode * {
825 if (!N)
826 return nullptr;
827 if (auto *MDSub = dyn_cast<DISubprogram>(N)) {
828 remap(MDSub->getUnit());
829 return getReplacementSubprogram(MDSub);
830 }
832 return EmptySubroutineType;
833 if (auto *CU = dyn_cast<DICompileUnit>(N))
834 return getReplacementCU(CU);
835 if (isa<DIFile>(N))
836 return N;
837 if (auto *MDLB = dyn_cast<DILexicalBlockBase>(N))
838 // Remap to our referenced scope (recursively).
839 return mapNode(MDLB->getScope());
840 if (auto *MLD = dyn_cast<DILocation>(N))
841 return getReplacementMDLocation(MLD);
842
843 // Otherwise, if we see these, just drop them now. Not strictly necessary,
844 // but this speeds things up a little.
845 if (isa<DINode>(N))
846 return nullptr;
847
848 return getReplacementMDNode(N);
849 };
850 // Separate recursive doRemap and operator [] into 2 lines to avoid
851 // out-of-order evaluations since both of them can access the same memory
852 // location in map Replacements.
853 auto Value = doRemap(N);
854 Replacements[N] = Value;
855 }
856
857 /// Do the remapping traversal.
858 void traverse(MDNode *);
859};
860
861} // end anonymous namespace
862
863void DebugTypeInfoRemoval::traverse(MDNode *N) {
864 if (!N || Replacements.count(N))
865 return;
866
867 // To avoid cycles, as well as for efficiency sake, we will sometimes prune
868 // parts of the graph.
869 auto prune = [](MDNode *Parent, MDNode *Child) {
870 if (auto *MDS = dyn_cast<DISubprogram>(Parent))
871 return Child == MDS->getRetainedNodes().get();
872 return false;
873 };
874
876 DenseSet<MDNode *> Opened;
877
878 // Visit each node starting at N in post order, and map them.
879 ToVisit.push_back(N);
880 while (!ToVisit.empty()) {
881 auto *N = ToVisit.back();
882 if (!Opened.insert(N).second) {
883 // Close it.
884 remap(N);
885 ToVisit.pop_back();
886 continue;
887 }
888 for (auto &I : N->operands())
889 if (auto *MDN = dyn_cast_or_null<MDNode>(I))
890 if (!Opened.count(MDN) && !Replacements.count(MDN) && !prune(N, MDN) &&
891 !isa<DICompileUnit>(MDN))
892 ToVisit.push_back(MDN);
893 }
894}
895
897 bool Changed = false;
898
899 // Delete non-CU debug info named metadata nodes.
900 for (auto NMI = M.named_metadata_begin(), NME = M.named_metadata_end();
901 NMI != NME;) {
902 NamedMDNode *NMD = &*NMI;
903 ++NMI;
904 // Specifically keep dbg.cu around.
905 if (NMD->getName() == "llvm.dbg.cu")
906 continue;
907 }
908
909 // Drop all dbg attachments from global variables.
910 for (auto &GV : M.globals())
911 GV.eraseMetadata(LLVMContext::MD_dbg);
912
913 DebugTypeInfoRemoval Mapper(M.getContext());
914 auto remap = [&](MDNode *Node) -> MDNode * {
915 if (!Node)
916 return nullptr;
917 Mapper.traverseAndRemap(Node);
918 auto *NewNode = Mapper.mapNode(Node);
919 Changed |= Node != NewNode;
920 Node = NewNode;
921 return NewNode;
922 };
923
924 // Rewrite the DebugLocs to be equivalent to what
925 // -gline-tables-only would have created.
926 for (auto &F : M) {
927 if (auto *SP = F.getSubprogram()) {
928 Mapper.traverseAndRemap(SP);
929 auto *NewSP = cast<DISubprogram>(Mapper.mapNode(SP));
930 Changed |= SP != NewSP;
931 F.setSubprogram(NewSP);
932 }
933 for (auto &BB : F) {
934 for (auto &I : BB) {
935 auto remapDebugLoc = [&](const DebugLoc &DL) -> DebugLoc {
936 auto *Scope = DL.getScope();
937 MDNode *InlinedAt = DL.getInlinedAt();
938 Scope = remap(Scope);
939 InlinedAt = remap(InlinedAt);
940 return DILocation::get(M.getContext(), DL.getLine(), DL.getCol(),
941 Scope, InlinedAt);
942 };
943
944 if (I.getDebugLoc() != DebugLoc())
945 I.setDebugLoc(remapDebugLoc(I.getDebugLoc()));
946
947 // Remap DILocations in llvm.loop attachments.
949 if (auto *Loc = dyn_cast_or_null<DILocation>(MD))
950 return remapDebugLoc(Loc).get();
951 return MD;
952 });
953
954 // Strip heapallocsite attachments, they point into the DIType system.
955 if (I.hasMetadataOtherThanDebugLoc())
956 I.setMetadata("heapallocsite", nullptr);
957
958 // Strip any DbgRecords attached.
959 I.dropDbgRecords();
960 }
961 }
962 }
963
964 // Create a new llvm.dbg.cu, which is equivalent to the one
965 // -gline-tables-only would have created.
966 for (auto &NMD : M.named_metadata()) {
968 for (MDNode *Op : NMD.operands())
969 Ops.push_back(remap(Op));
970
971 if (!Changed)
972 continue;
973
974 NMD.clearOperands();
975 for (auto *Op : Ops)
976 if (Op)
977 NMD.addOperand(Op);
978 }
979 return Changed;
980}
981
984 M.getModuleFlag("Debug Info Version")))
985 return Val->getZExtValue();
986 return 0;
987}
988
992
994 ArrayRef<const Instruction *> SourceInstructions) {
995 // Replace all uses (and attachments) of all the DIAssignIDs
996 // on SourceInstructions with a single merged value.
997 assert(getFunction() && "Uninserted instruction merged");
998 // Collect up the DIAssignID tags.
1000 for (const Instruction *I : SourceInstructions) {
1001 if (auto *MD = I->getMetadata(LLVMContext::MD_DIAssignID))
1002 IDs.push_back(cast<DIAssignID>(MD));
1003 assert(getFunction() == I->getFunction() &&
1004 "Merging with instruction from another function not allowed");
1005 }
1006
1007 // Add this instruction's DIAssignID too, if it has one.
1008 if (auto *MD = getMetadata(LLVMContext::MD_DIAssignID))
1009 IDs.push_back(cast<DIAssignID>(MD));
1010
1011 if (IDs.empty())
1012 return; // No DIAssignID tags to process.
1013
1014 DIAssignID *MergeID = IDs[0];
1015 for (DIAssignID *AssignID : drop_begin(IDs)) {
1016 if (AssignID != MergeID)
1017 at::RAUW(AssignID, MergeID);
1018 }
1019 setMetadata(LLVMContext::MD_DIAssignID, MergeID);
1020}
1021
1023
1025 const DebugLoc &DL = getDebugLoc();
1026 if (!DL) {
1028 return;
1029 }
1030
1031 // If this isn't a call, drop the location to allow a location from a
1032 // preceding instruction to propagate.
1033 bool MayLowerToCall = false;
1034 if (isa<CallBase>(this)) {
1035 auto *II = dyn_cast<IntrinsicInst>(this);
1036 MayLowerToCall =
1037 !II || IntrinsicInst::mayLowerToFunctionCall(II->getIntrinsicID());
1038 }
1039
1040 if (!MayLowerToCall) {
1042 return;
1043 }
1044
1045 // Set a line 0 location for calls to preserve scope information in case
1046 // inlining occurs.
1048 if (SP)
1049 // If a function scope is available, set it on the line 0 location. When
1050 // hoisting a call to a predecessor block, using the function scope avoids
1051 // making it look like the callee was reached earlier than it should be.
1053 else
1054 // The parent function has no scope. Go ahead and drop the location. If
1055 // the parent function is inlined, and the callee has a subprogram, the
1056 // inliner will attach a location to the call.
1057 //
1058 // One alternative is to set a line 0 location with the existing scope and
1059 // inlinedAt info. The location might be sensitive to when inlining occurs.
1061}
1062
1063//===----------------------------------------------------------------------===//
1064// LLVM C API implementations.
1065//===----------------------------------------------------------------------===//
1066
1068 switch (lang) {
1069#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \
1070 case LLVMDWARFSourceLanguage##NAME: \
1071 return ID;
1072#include "llvm/BinaryFormat/Dwarf.def"
1073#undef HANDLE_DW_LANG
1074 }
1075 llvm_unreachable("Unhandled Tag");
1076}
1077
1078template <typename DIT> DIT *unwrapDI(LLVMMetadataRef Ref) {
1079 return (DIT *)(Ref ? unwrap<MDNode>(Ref) : nullptr);
1080}
1081
1083 return static_cast<DINode::DIFlags>(Flags);
1084}
1085
1087 return static_cast<LLVMDIFlags>(Flags);
1088}
1089
1091pack_into_DISPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized) {
1092 return DISubprogram::toSPFlags(IsLocalToUnit, IsDefinition, IsOptimized);
1093}
1094
1097}
1098
1102
1106
1110
1114
1116 delete unwrap(Builder);
1117}
1118
1120 unwrap(Builder)->finalize();
1121}
1122
1124 LLVMMetadataRef subprogram) {
1125 unwrap(Builder)->finalizeSubprogram(unwrapDI<DISubprogram>(subprogram));
1126}
1127
1130 LLVMMetadataRef FileRef, const char *Producer, size_t ProducerLen,
1131 LLVMBool isOptimized, const char *Flags, size_t FlagsLen,
1132 unsigned RuntimeVer, const char *SplitName, size_t SplitNameLen,
1133 LLVMDWARFEmissionKind Kind, unsigned DWOId, LLVMBool SplitDebugInlining,
1134 LLVMBool DebugInfoForProfiling, const char *SysRoot, size_t SysRootLen,
1135 const char *SDK, size_t SDKLen) {
1136 auto File = unwrapDI<DIFile>(FileRef);
1137
1138 return wrap(unwrap(Builder)->createCompileUnit(
1140 StringRef(Producer, ProducerLen), isOptimized, StringRef(Flags, FlagsLen),
1141 RuntimeVer, StringRef(SplitName, SplitNameLen),
1142 static_cast<DICompileUnit::DebugEmissionKind>(Kind), DWOId,
1143 SplitDebugInlining, DebugInfoForProfiling,
1145 StringRef(SysRoot, SysRootLen), StringRef(SDK, SDKLen)));
1146}
1147
1150 size_t FilenameLen, const char *Directory,
1151 size_t DirectoryLen) {
1152 return wrap(unwrap(Builder)->createFile(StringRef(Filename, FilenameLen),
1153 StringRef(Directory, DirectoryLen)));
1154}
1155
1158 switch (CSKind) {
1160 return llvm::DIFile::CSK_MD5;
1165 }
1166 llvm_unreachable("Unhandled Checksum Kind");
1167}
1168
1170 LLVMDIBuilderRef Builder, const char *Filename, size_t FilenameLen,
1171 const char *Directory, size_t DirectoryLen, LLVMChecksumKind ChecksumKind,
1172 const char *Checksum, size_t ChecksumLen, const char *Source,
1173 size_t SourceLen) {
1174 StringRef ChkSum = StringRef(Checksum, ChecksumLen);
1175 auto CSK = map_from_llvmChecksumKind(ChecksumKind);
1176 llvm::DIFile::ChecksumInfo<StringRef> CSInfo(CSK, ChkSum);
1177 std::optional<StringRef> Src;
1178 if (SourceLen > 0)
1179 Src = StringRef(Source, SourceLen);
1180 return wrap(unwrap(Builder)->createFile(StringRef(Filename, FilenameLen),
1181 StringRef(Directory, DirectoryLen),
1182 CSInfo, Src));
1183}
1184
1187 const char *Name, size_t NameLen,
1188 const char *ConfigMacros, size_t ConfigMacrosLen,
1189 const char *IncludePath, size_t IncludePathLen,
1190 const char *APINotesFile, size_t APINotesFileLen) {
1191 return wrap(unwrap(Builder)->createModule(
1192 unwrapDI<DIScope>(ParentScope), StringRef(Name, NameLen),
1193 StringRef(ConfigMacros, ConfigMacrosLen),
1194 StringRef(IncludePath, IncludePathLen),
1195 StringRef(APINotesFile, APINotesFileLen)));
1196}
1197
1199 LLVMMetadataRef ParentScope,
1200 const char *Name, size_t NameLen,
1201 LLVMBool ExportSymbols) {
1202 return wrap(unwrap(Builder)->createNameSpace(
1203 unwrapDI<DIScope>(ParentScope), StringRef(Name, NameLen), ExportSymbols));
1204}
1205
1207 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1208 size_t NameLen, const char *LinkageName, size_t LinkageNameLen,
1209 LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1210 LLVMBool IsLocalToUnit, LLVMBool IsDefinition,
1211 unsigned ScopeLine, LLVMDIFlags Flags, LLVMBool IsOptimized) {
1212 return wrap(unwrap(Builder)->createFunction(
1213 unwrapDI<DIScope>(Scope), {Name, NameLen}, {LinkageName, LinkageNameLen},
1214 unwrapDI<DIFile>(File), LineNo, unwrapDI<DISubroutineType>(Ty), ScopeLine,
1215 map_from_llvmDIFlags(Flags),
1216 pack_into_DISPFlags(IsLocalToUnit, IsDefinition, IsOptimized), nullptr,
1217 nullptr, nullptr));
1218}
1219
1220
1222 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope,
1223 LLVMMetadataRef File, unsigned Line, unsigned Col) {
1224 return wrap(unwrap(Builder)->createLexicalBlock(unwrapDI<DIScope>(Scope),
1225 unwrapDI<DIFile>(File),
1226 Line, Col));
1227}
1228
1231 LLVMMetadataRef Scope,
1232 LLVMMetadataRef File,
1233 unsigned Discriminator) {
1234 return wrap(unwrap(Builder)->createLexicalBlockFile(unwrapDI<DIScope>(Scope),
1235 unwrapDI<DIFile>(File),
1236 Discriminator));
1237}
1238
1241 LLVMMetadataRef Scope,
1242 LLVMMetadataRef NS,
1243 LLVMMetadataRef File,
1244 unsigned Line) {
1245 return wrap(unwrap(Builder)->createImportedModule(unwrapDI<DIScope>(Scope),
1247 unwrapDI<DIFile>(File),
1248 Line));
1249}
1250
1252 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope,
1253 LLVMMetadataRef ImportedEntity, LLVMMetadataRef File, unsigned Line,
1254 LLVMMetadataRef *Elements, unsigned NumElements) {
1255 auto Elts =
1256 (NumElements > 0)
1257 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1258 : nullptr;
1259 return wrap(unwrap(Builder)->createImportedModule(
1260 unwrapDI<DIScope>(Scope), unwrapDI<DIImportedEntity>(ImportedEntity),
1261 unwrapDI<DIFile>(File), Line, Elts));
1262}
1263
1266 LLVMMetadataRef File, unsigned Line, LLVMMetadataRef *Elements,
1267 unsigned NumElements) {
1268 auto Elts =
1269 (NumElements > 0)
1270 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1271 : nullptr;
1272 return wrap(unwrap(Builder)->createImportedModule(
1274 Line, Elts));
1275}
1276
1279 LLVMMetadataRef File, unsigned Line, const char *Name, size_t NameLen,
1280 LLVMMetadataRef *Elements, unsigned NumElements) {
1281 auto Elts =
1282 (NumElements > 0)
1283 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1284 : nullptr;
1285 return wrap(unwrap(Builder)->createImportedDeclaration(
1287 Line, {Name, NameLen}, Elts));
1288}
1289
1292 unsigned Column, LLVMMetadataRef Scope,
1293 LLVMMetadataRef InlinedAt) {
1294 return wrap(DILocation::get(*unwrap(Ctx), Line, Column, unwrap(Scope),
1295 unwrap(InlinedAt)));
1296}
1297
1299 return unwrapDI<DILocation>(Location)->getLine();
1300}
1301
1303 return unwrapDI<DILocation>(Location)->getColumn();
1304}
1305
1307 return wrap(unwrapDI<DILocation>(Location)->getScope());
1308}
1309
1311 return wrap(unwrapDI<DILocation>(Location)->getInlinedAt());
1312}
1313
1315 return wrap(unwrapDI<DIScope>(Scope)->getFile());
1316}
1317
1318const char *LLVMDIFileGetDirectory(LLVMMetadataRef File, unsigned *Len) {
1319 auto Dir = unwrapDI<DIFile>(File)->getDirectory();
1320 *Len = Dir.size();
1321 return Dir.data();
1322}
1323
1324const char *LLVMDIFileGetFilename(LLVMMetadataRef File, unsigned *Len) {
1325 auto Name = unwrapDI<DIFile>(File)->getFilename();
1326 *Len = Name.size();
1327 return Name.data();
1328}
1329
1330const char *LLVMDIFileGetSource(LLVMMetadataRef File, unsigned *Len) {
1331 if (auto Src = unwrapDI<DIFile>(File)->getSource()) {
1332 *Len = Src->size();
1333 return Src->data();
1334 }
1335 *Len = 0;
1336 return "";
1337}
1338
1340 LLVMMetadataRef ParentMacroFile,
1341 unsigned Line,
1343 const char *Name, size_t NameLen,
1344 const char *Value, size_t ValueLen) {
1345 return wrap(
1346 unwrap(Builder)->createMacro(unwrapDI<DIMacroFile>(ParentMacroFile), Line,
1347 static_cast<MacinfoRecordType>(RecordType),
1348 {Name, NameLen}, {Value, ValueLen}));
1349}
1350
1353 LLVMMetadataRef ParentMacroFile, unsigned Line,
1354 LLVMMetadataRef File) {
1355 return wrap(unwrap(Builder)->createTempMacroFile(
1356 unwrapDI<DIMacroFile>(ParentMacroFile), Line, unwrapDI<DIFile>(File)));
1357}
1358
1360 const char *Name, size_t NameLen,
1361 int64_t Value,
1362 LLVMBool IsUnsigned) {
1363 return wrap(unwrap(Builder)->createEnumerator({Name, NameLen}, Value,
1364 IsUnsigned != 0));
1365}
1366
1368 LLVMDIBuilderRef Builder, const char *Name, size_t NameLen,
1369 uint64_t SizeInBits, const uint64_t Words[], LLVMBool IsUnsigned) {
1370 uint64_t NumWords = (SizeInBits + 63) / 64;
1371 return wrap(unwrap(Builder)->createEnumerator(
1372 {Name, NameLen},
1373 APSInt(APInt(SizeInBits, ArrayRef(Words, NumWords)), IsUnsigned != 0)));
1374}
1375
1377 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1378 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1379 uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef *Elements,
1380 unsigned NumElements, LLVMMetadataRef ClassTy) {
1381auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1382 NumElements});
1383return wrap(unwrap(Builder)->createEnumerationType(
1384 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1385 LineNumber, SizeInBits, AlignInBits, Elts, unwrapDI<DIType>(ClassTy)));
1386}
1387
1389 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1390 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1391 uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef BaseTy) {
1392 return wrap(unwrap(Builder)->createSetType(
1393 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1394 LineNumber, SizeInBits, AlignInBits, unwrapDI<DIType>(BaseTy)));
1395}
1396
1398 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1399 size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t SizeInBits,
1400 uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef BaseTy,
1401 LLVMMetadataRef LowerBound, LLVMMetadataRef UpperBound,
1402 LLVMMetadataRef Stride, LLVMMetadataRef Bias) {
1403 return wrap(unwrap(Builder)->createSubrangeType(
1404 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, unwrapDI<DIScope>(Scope),
1405 SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1406 unwrapDI<DIType>(BaseTy), unwrap(LowerBound), unwrap(UpperBound),
1407 unwrap(Stride), unwrap(Bias)));
1408}
1409
1410/// MD may be nullptr, a DIExpression or DIVariable.
1412 if (!MD)
1413 return nullptr;
1414 MDNode *MDN = unwrapDI<MDNode>(MD);
1415 if (auto *E = dyn_cast<DIExpression>(MDN))
1416 return E;
1417 assert(isa<DIVariable>(MDN) && "Expected DIExpression or DIVariable");
1418 return cast<DIVariable>(MDN);
1419}
1420
1422 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1423 size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t Size,
1424 uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts,
1425 unsigned NumSubscripts, LLVMMetadataRef DataLocation,
1426 LLVMMetadataRef Associated, LLVMMetadataRef Allocated, LLVMMetadataRef Rank,
1427 LLVMMetadataRef BitStride) {
1428 auto Subs =
1429 unwrap(Builder)->getOrCreateArray({unwrap(Subscripts), NumSubscripts});
1430 return wrap(unwrap(Builder)->createArrayType(
1431 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1432 Size, AlignInBits, unwrapDI<DIType>(Ty), Subs,
1433 unwrapExprVar(DataLocation), unwrapExprVar(Associated),
1434 unwrapExprVar(Allocated), unwrapExprVar(Rank), unwrap(BitStride)));
1435}
1436
1438 LLVMMetadataRef *Elements, unsigned NumElements) {
1439 auto CT = unwrap<DICompositeType>(*T);
1440 auto Elts =
1441 unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements});
1442 unwrap(Builder)->replaceArrays(CT, Elts);
1443}
1444
1446 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1447 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1448 uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags,
1449 LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang,
1450 const char *UniqueId, size_t UniqueIdLen) {
1451 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1452 NumElements});
1453 return wrap(unwrap(Builder)->createUnionType(
1454 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1455 LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1456 Elts, RunTimeLang, {UniqueId, UniqueIdLen}));
1457}
1458
1459
1462 uint32_t AlignInBits, LLVMMetadataRef Ty,
1463 LLVMMetadataRef *Subscripts,
1464 unsigned NumSubscripts) {
1465 auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts),
1466 NumSubscripts});
1467 return wrap(unwrap(Builder)->createArrayType(Size, AlignInBits,
1468 unwrapDI<DIType>(Ty), Subs));
1469}
1470
1473 uint32_t AlignInBits, LLVMMetadataRef Ty,
1474 LLVMMetadataRef *Subscripts,
1475 unsigned NumSubscripts) {
1476 auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts),
1477 NumSubscripts});
1478 return wrap(unwrap(Builder)->createVectorType(Size, AlignInBits,
1479 unwrapDI<DIType>(Ty), Subs));
1480}
1481
1484 size_t NameLen, uint64_t SizeInBits,
1485 LLVMDWARFTypeEncoding Encoding,
1486 LLVMDIFlags Flags) {
1487 return wrap(unwrap(Builder)->createBasicType({Name, NameLen},
1488 SizeInBits, Encoding,
1489 map_from_llvmDIFlags(Flags)));
1490}
1491
1493 LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeTy,
1494 uint64_t SizeInBits, uint32_t AlignInBits, unsigned AddressSpace,
1495 const char *Name, size_t NameLen) {
1496 return wrap(unwrap(Builder)->createPointerType(
1497 unwrapDI<DIType>(PointeeTy), SizeInBits, AlignInBits, AddressSpace,
1498 {Name, NameLen}));
1499}
1500
1502 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1503 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1504 uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags,
1505 LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements,
1506 unsigned NumElements, unsigned RunTimeLang, LLVMMetadataRef VTableHolder,
1507 const char *UniqueId, size_t UniqueIdLen) {
1508 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1509 NumElements});
1510 return wrap(unwrap(Builder)->createStructType(
1511 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1512 LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1513 unwrapDI<DIType>(DerivedFrom), Elts, RunTimeLang,
1514 unwrapDI<DIType>(VTableHolder), {UniqueId, UniqueIdLen}));
1515}
1516
1518 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1519 size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits,
1520 uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags,
1521 LLVMMetadataRef Ty) {
1522 return wrap(unwrap(Builder)->createMemberType(unwrapDI<DIScope>(Scope),
1523 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, SizeInBits, AlignInBits,
1524 OffsetInBits, map_from_llvmDIFlags(Flags), unwrapDI<DIType>(Ty)));
1525}
1526
1529 size_t NameLen) {
1530 return wrap(unwrap(Builder)->createUnspecifiedType({Name, NameLen}));
1531}
1532
1534 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1535 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1536 LLVMMetadataRef Type, LLVMDIFlags Flags, LLVMValueRef ConstantVal,
1537 uint32_t AlignInBits) {
1538 return wrap(unwrap(Builder)->createStaticMemberType(
1539 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1540 LineNumber, unwrapDI<DIType>(Type), map_from_llvmDIFlags(Flags),
1541 unwrap<Constant>(ConstantVal), DW_TAG_member, AlignInBits));
1542}
1543
1546 const char *Name, size_t NameLen,
1547 LLVMMetadataRef File, unsigned LineNo,
1548 uint64_t SizeInBits, uint32_t AlignInBits,
1549 uint64_t OffsetInBits, LLVMDIFlags Flags,
1550 LLVMMetadataRef Ty, LLVMMetadataRef PropertyNode) {
1551 return wrap(unwrap(Builder)->createObjCIVar(
1552 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1553 SizeInBits, AlignInBits, OffsetInBits,
1555 unwrapDI<MDNode>(PropertyNode)));
1556}
1557
1560 const char *Name, size_t NameLen,
1561 LLVMMetadataRef File, unsigned LineNo,
1562 const char *GetterName, size_t GetterNameLen,
1563 const char *SetterName, size_t SetterNameLen,
1564 unsigned PropertyAttributes,
1565 LLVMMetadataRef Ty) {
1566 return wrap(unwrap(Builder)->createObjCProperty(
1567 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1568 {GetterName, GetterNameLen}, {SetterName, SetterNameLen},
1569 PropertyAttributes, unwrapDI<DIType>(Ty)));
1570}
1571
1575 return wrap(unwrap(Builder)->createObjectPointerType(unwrapDI<DIType>(Type),
1576 Implicit));
1577}
1578
1581 const char *Name, size_t NameLen,
1582 LLVMMetadataRef File, unsigned LineNo,
1583 LLVMMetadataRef Scope, uint32_t AlignInBits) {
1584 return wrap(unwrap(Builder)->createTypedef(
1585 unwrapDI<DIType>(Type), {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1586 unwrapDI<DIScope>(Scope), AlignInBits));
1587}
1588
1592 uint64_t BaseOffset, uint32_t VBPtrOffset,
1593 LLVMDIFlags Flags) {
1594 return wrap(unwrap(Builder)->createInheritance(
1596 BaseOffset, VBPtrOffset, map_from_llvmDIFlags(Flags)));
1597}
1598
1601 LLVMDIBuilderRef Builder, unsigned Tag, const char *Name,
1602 size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line,
1603 unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits,
1604 const char *UniqueIdentifier, size_t UniqueIdentifierLen) {
1605 return wrap(unwrap(Builder)->createForwardDecl(
1606 Tag, {Name, NameLen}, unwrapDI<DIScope>(Scope),
1607 unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits,
1608 AlignInBits, {UniqueIdentifier, UniqueIdentifierLen}));
1609}
1610
1613 LLVMDIBuilderRef Builder, unsigned Tag, const char *Name,
1614 size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line,
1615 unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits,
1616 LLVMDIFlags Flags, const char *UniqueIdentifier,
1617 size_t UniqueIdentifierLen) {
1618 return wrap(unwrap(Builder)->createReplaceableCompositeType(
1619 Tag, {Name, NameLen}, unwrapDI<DIScope>(Scope),
1620 unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits,
1621 AlignInBits, map_from_llvmDIFlags(Flags),
1622 {UniqueIdentifier, UniqueIdentifierLen}));
1623}
1624
1628 return wrap(unwrap(Builder)->createQualifiedType(Tag,
1630}
1631
1635 return wrap(unwrap(Builder)->createReferenceType(Tag,
1637}
1638
1641 return wrap(unwrap(Builder)->createNullPtrType());
1642}
1643
1646 LLVMMetadataRef PointeeType,
1647 LLVMMetadataRef ClassType,
1648 uint64_t SizeInBits,
1649 uint32_t AlignInBits,
1650 LLVMDIFlags Flags) {
1651 return wrap(unwrap(Builder)->createMemberPointerType(
1652 unwrapDI<DIType>(PointeeType),
1653 unwrapDI<DIType>(ClassType), AlignInBits, SizeInBits,
1654 map_from_llvmDIFlags(Flags)));
1655}
1656
1659 LLVMMetadataRef Scope,
1660 const char *Name, size_t NameLen,
1661 LLVMMetadataRef File, unsigned LineNumber,
1662 uint64_t SizeInBits,
1663 uint64_t OffsetInBits,
1664 uint64_t StorageOffsetInBits,
1666 return wrap(unwrap(Builder)->createBitFieldMemberType(
1667 unwrapDI<DIScope>(Scope), {Name, NameLen},
1668 unwrapDI<DIFile>(File), LineNumber,
1669 SizeInBits, OffsetInBits, StorageOffsetInBits,
1671}
1672
1674 LLVMMetadataRef Scope, const char *Name, size_t NameLen,
1675 LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits,
1676 uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags,
1677 LLVMMetadataRef DerivedFrom,
1678 LLVMMetadataRef *Elements, unsigned NumElements,
1679 LLVMMetadataRef VTableHolder, LLVMMetadataRef TemplateParamsNode,
1680 const char *UniqueIdentifier, size_t UniqueIdentifierLen) {
1681 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1682 NumElements});
1683 return wrap(unwrap(Builder)->createClassType(
1684 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1685 LineNumber, SizeInBits, AlignInBits, OffsetInBits,
1686 map_from_llvmDIFlags(Flags), unwrapDI<DIType>(DerivedFrom), Elts,
1687 /*RunTimeLang=*/0, unwrapDI<DIType>(VTableHolder),
1688 unwrapDI<MDNode>(TemplateParamsNode),
1689 {UniqueIdentifier, UniqueIdentifierLen}));
1690}
1691
1695 return wrap(unwrap(Builder)->createArtificialType(unwrapDI<DIType>(Type)));
1696}
1697
1699 return unwrapDI<DINode>(MD)->getTag();
1700}
1701
1702const char *LLVMDITypeGetName(LLVMMetadataRef DType, size_t *Length) {
1703 StringRef Str = unwrapDI<DIType>(DType)->getName();
1704 *Length = Str.size();
1705 return Str.data();
1706}
1707
1709 return unwrapDI<DIType>(DType)->getSizeInBits();
1710}
1711
1713 return unwrapDI<DIType>(DType)->getOffsetInBits();
1714}
1715
1717 return unwrapDI<DIType>(DType)->getAlignInBits();
1718}
1719
1721 return unwrapDI<DIType>(DType)->getLine();
1722}
1723
1727
1729 LLVMMetadataRef *Types,
1730 size_t Length) {
1731 return wrap(
1732 unwrap(Builder)->getOrCreateTypeArray({unwrap(Types), Length}).get());
1733}
1734
1737 LLVMMetadataRef File,
1738 LLVMMetadataRef *ParameterTypes,
1739 unsigned NumParameterTypes,
1740 LLVMDIFlags Flags) {
1741 auto Elts = unwrap(Builder)->getOrCreateTypeArray({unwrap(ParameterTypes),
1742 NumParameterTypes});
1743 return wrap(unwrap(Builder)->createSubroutineType(
1744 Elts, map_from_llvmDIFlags(Flags)));
1745}
1746
1748 uint64_t *Addr, size_t Length) {
1749 return wrap(
1750 unwrap(Builder)->createExpression(ArrayRef<uint64_t>(Addr, Length)));
1751}
1752
1755 uint64_t Value) {
1756 return wrap(unwrap(Builder)->createConstantValueExpression(Value));
1757}
1758
1760 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1761 size_t NameLen, const char *Linkage, size_t LinkLen, LLVMMetadataRef File,
1762 unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit,
1763 LLVMMetadataRef Expr, LLVMMetadataRef Decl, uint32_t AlignInBits) {
1764 return wrap(unwrap(Builder)->createGlobalVariableExpression(
1765 unwrapDI<DIScope>(Scope), {Name, NameLen}, {Linkage, LinkLen},
1766 unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit,
1767 true, unwrap<DIExpression>(Expr), unwrapDI<MDNode>(Decl),
1768 nullptr, AlignInBits));
1769}
1770
1774
1779
1783
1787
1789 return unwrapDI<DIVariable>(Var)->getLine();
1790}
1791
1793 size_t Count) {
1794 return wrap(
1795 MDTuple::getTemporary(*unwrap(Ctx), {unwrap(Data), Count}).release());
1796}
1797
1801
1803 LLVMMetadataRef Replacement) {
1804 auto *Node = unwrapDI<MDNode>(TargetMetadata);
1805 Node->replaceAllUsesWith(unwrap(Replacement));
1807}
1808
1810 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1811 size_t NameLen, const char *Linkage, size_t LnkLen, LLVMMetadataRef File,
1812 unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit,
1813 LLVMMetadataRef Decl, uint32_t AlignInBits) {
1814 return wrap(unwrap(Builder)->createTempGlobalVariableFwdDecl(
1815 unwrapDI<DIScope>(Scope), {Name, NameLen}, {Linkage, LnkLen},
1816 unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit,
1817 unwrapDI<MDNode>(Decl), nullptr, AlignInBits));
1818}
1819
1821 LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo,
1823 DbgInstPtr DbgInst = unwrap(Builder)->insertDeclare(
1824 unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
1826 Instr ? InsertPosition(unwrap<Instruction>(Instr)->getIterator())
1827 : nullptr);
1828 // This assert will fail if the module is in the old debug info format.
1829 // This function should only be called if the module is in the new
1830 // debug info format.
1831 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1832 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1833 assert(isa<DbgRecord *>(DbgInst) &&
1834 "Function unexpectedly in old debug info format");
1835 return wrap(cast<DbgRecord *>(DbgInst));
1836}
1837
1839 LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo,
1841 DbgInstPtr DbgInst = unwrap(Builder)->insertDeclare(
1842 unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
1844 // This assert will fail if the module is in the old debug info format.
1845 // This function should only be called if the module is in the new
1846 // debug info format.
1847 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1848 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1849 assert(isa<DbgRecord *>(DbgInst) &&
1850 "Function unexpectedly in old debug info format");
1851 return wrap(cast<DbgRecord *>(DbgInst));
1852}
1853
1855 LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo,
1857 DbgInstPtr DbgInst = unwrap(Builder)->insertDbgValueIntrinsic(
1860 Instr ? InsertPosition(unwrap<Instruction>(Instr)->getIterator())
1861 : nullptr);
1862 // This assert will fail if the module is in the old debug info format.
1863 // This function should only be called if the module is in the new
1864 // debug info format.
1865 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1866 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1867 assert(isa<DbgRecord *>(DbgInst) &&
1868 "Function unexpectedly in old debug info format");
1869 return wrap(cast<DbgRecord *>(DbgInst));
1870}
1871
1873 LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo,
1875 DbgInstPtr DbgInst = unwrap(Builder)->insertDbgValueIntrinsic(
1878 Block ? InsertPosition(unwrap(Block)->end()) : nullptr);
1879 // This assert will fail if the module is in the old debug info format.
1880 // This function should only be called if the module is in the new
1881 // debug info format.
1882 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1883 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1884 assert(isa<DbgRecord *>(DbgInst) &&
1885 "Function unexpectedly in old debug info format");
1886 return wrap(cast<DbgRecord *>(DbgInst));
1887}
1888
1890 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1891 size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1892 LLVMBool AlwaysPreserve, LLVMDIFlags Flags, uint32_t AlignInBits) {
1893 return wrap(unwrap(Builder)->createAutoVariable(
1894 unwrap<DIScope>(Scope), {Name, NameLen}, unwrap<DIFile>(File),
1895 LineNo, unwrap<DIType>(Ty), AlwaysPreserve,
1896 map_from_llvmDIFlags(Flags), AlignInBits));
1897}
1898
1900 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1901 size_t NameLen, unsigned ArgNo, LLVMMetadataRef File, unsigned LineNo,
1902 LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags) {
1903 return wrap(unwrap(Builder)->createParameterVariable(
1904 unwrap<DIScope>(Scope), {Name, NameLen}, ArgNo, unwrap<DIFile>(File),
1905 LineNo, unwrap<DIType>(Ty), AlwaysPreserve,
1906 map_from_llvmDIFlags(Flags)));
1907}
1908
1910 int64_t Lo, int64_t Count) {
1911 return wrap(unwrap(Builder)->getOrCreateSubrange(Lo, Count));
1912}
1913
1916 size_t Length) {
1917 Metadata **DataValue = unwrap(Data);
1918 return wrap(unwrap(Builder)->getOrCreateArray({DataValue, Length}).get());
1919}
1920
1924
1926 unwrap<Function>(Func)->setSubprogram(unwrap<DISubprogram>(SP));
1927}
1928
1930 return unwrapDI<DISubprogram>(Subprogram)->getLine();
1931}
1932
1934 LLVMMetadataRef SubroutineType) {
1935 unwrapDI<DISubprogram>(Subprogram)
1936 ->replaceType(unwrapDI<DISubroutineType>(SubroutineType));
1937}
1938
1942
1944 if (Loc)
1945 unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc(unwrap<MDNode>(Loc)));
1946 else
1947 unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc());
1948}
1949
1951 LLVMMetadataRef Context,
1952 const char *Name, size_t NameLen,
1953 LLVMMetadataRef File, unsigned LineNo,
1954 LLVMBool AlwaysPreserve) {
1955 return wrap(unwrap(Builder)->createLabel(
1956 unwrapDI<DIScope>(Context), StringRef(Name, NameLen),
1957 unwrapDI<DIFile>(File), LineNo, /*Column*/ 0, /*IsArtificial*/ false,
1958 /*CoroSuspendIdx*/ std::nullopt, AlwaysPreserve));
1959}
1960
1962 LLVMMetadataRef LabelInfo,
1963 LLVMMetadataRef Location,
1964 LLVMValueRef InsertBefore) {
1965 DbgInstPtr DbgInst = unwrap(Builder)->insertLabel(
1966 unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location),
1967 InsertBefore
1968 ? InsertPosition(unwrap<Instruction>(InsertBefore)->getIterator())
1969 : nullptr);
1970 // This assert will fail if the module is in the old debug info format.
1971 // This function should only be called if the module is in the new
1972 // debug info format.
1973 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1974 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1975 assert(isa<DbgRecord *>(DbgInst) &&
1976 "Function unexpectedly in old debug info format");
1977 return wrap(cast<DbgRecord *>(DbgInst));
1978}
1979
1981 LLVMMetadataRef LabelInfo,
1982 LLVMMetadataRef Location,
1983 LLVMBasicBlockRef InsertAtEnd) {
1984 DbgInstPtr DbgInst = unwrap(Builder)->insertLabel(
1985 unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location),
1986 InsertAtEnd ? InsertPosition(unwrap(InsertAtEnd)->end()) : nullptr);
1987 // This assert will fail if the module is in the old debug info format.
1988 // This function should only be called if the module is in the new
1989 // debug info format.
1990 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1991 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1992 assert(isa<DbgRecord *>(DbgInst) &&
1993 "Function unexpectedly in old debug info format");
1994 return wrap(cast<DbgRecord *>(DbgInst));
1995}
1996
1998 switch(unwrap(Metadata)->getMetadataID()) {
1999#define HANDLE_METADATA_LEAF(CLASS) \
2000 case Metadata::CLASS##Kind: \
2001 return (LLVMMetadataKind)LLVM##CLASS##MetadataKind;
2002#include "llvm/IR/Metadata.def"
2003 default:
2005 }
2006}
2007
2009 assert(ID && "Expected non-null ID");
2010 LLVMContext &Ctx = ID->getContext();
2011 auto &Map = Ctx.pImpl->AssignmentIDToInstrs;
2012
2013 auto MapIt = Map.find(ID);
2014 if (MapIt == Map.end())
2015 return make_range(nullptr, nullptr);
2016
2017 return make_range(MapIt->second.begin(), MapIt->second.end());
2018}
2019
2021 for (auto *DVR : getDVRAssignmentMarkers(Inst))
2022 DVR->eraseFromParent();
2023}
2024
2026 // Replace attachments.
2027 AssignmentInstRange InstRange = getAssignmentInsts(Old);
2028 // Use intermediate storage for the instruction ptrs because the
2029 // getAssignmentInsts range iterators will be invalidated by adding and
2030 // removing DIAssignID attachments.
2031 SmallVector<Instruction *> InstVec(InstRange.begin(), InstRange.end());
2032 for (auto *I : InstVec)
2033 I->setMetadata(LLVMContext::MD_DIAssignID, New);
2034
2035 Old->replaceAllUsesWith(New);
2036}
2037
2039 for (BasicBlock &BB : *F) {
2040 for (Instruction &I : BB) {
2041 for (DbgVariableRecord &DVR :
2042 make_early_inc_range(filterDbgVars(I.getDbgRecordRange())))
2043 if (DVR.isDbgAssign())
2044 DVR.eraseFromParent();
2045
2046 I.setMetadata(LLVMContext::MD_DIAssignID, nullptr);
2047 }
2048 }
2049}
2050
2052 const DataLayout &DL, const Value *Dest, uint64_t SliceOffsetInBits,
2053 uint64_t SliceSizeInBits, const DbgVariableRecord *AssignRecord,
2054 std::optional<DIExpression::FragmentInfo> &Result) {
2055 // No overlap if this DbgRecord describes a killed location.
2056 if (AssignRecord->isKillAddress())
2057 return false;
2058
2059 int64_t AddrOffsetInBits;
2060 {
2061 int64_t AddrOffsetInBytes;
2062 SmallVector<uint64_t> PostOffsetOps; //< Unused.
2063 // Bail if we can't find a constant offset (or none) in the expression.
2064 if (!AssignRecord->getAddressExpression()->extractLeadingOffset(
2065 AddrOffsetInBytes, PostOffsetOps))
2066 return false;
2067 AddrOffsetInBits = AddrOffsetInBytes * 8;
2068 }
2069
2070 Value *Addr = AssignRecord->getAddress();
2071 // FIXME: It may not always be zero.
2072 int64_t BitExtractOffsetInBits = 0;
2074 AssignRecord->getFragmentOrEntireVariable();
2075
2076 int64_t OffsetFromLocationInBits; //< Unused.
2078 DL, Dest, SliceOffsetInBits, SliceSizeInBits, Addr, AddrOffsetInBits,
2079 BitExtractOffsetInBits, VarFrag, Result, OffsetFromLocationInBits);
2080}
2081
2082/// Update inlined instructions' DIAssignID metadata. We need to do this
2083/// otherwise a function inlined more than once into the same function
2084/// will cause DIAssignID to be shared by many instructions.
2086 Instruction &I) {
2087 auto GetNewID = [&Map](Metadata *Old) {
2088 DIAssignID *OldID = cast<DIAssignID>(Old);
2089 if (DIAssignID *NewID = Map.lookup(OldID))
2090 return NewID;
2092 Map[OldID] = NewID;
2093 return NewID;
2094 };
2095 // If we find a DIAssignID attachment or use, replace it with a new version.
2096 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
2097 if (DVR.isDbgAssign())
2098 DVR.setAssignId(GetNewID(DVR.getAssignID()));
2099 }
2100 if (auto *ID = I.getMetadata(LLVMContext::MD_DIAssignID))
2101 I.setMetadata(LLVMContext::MD_DIAssignID, GetNewID(ID));
2102}
2103
2104/// Collect constant properties (base, size, offset) of \p StoreDest.
2105/// Return std::nullopt if any properties are not constants or the
2106/// offset from the base pointer is negative.
2107static std::optional<AssignmentInfo>
2108getAssignmentInfoImpl(const DataLayout &DL, const Value *StoreDest,
2109 TypeSize SizeInBits) {
2110 if (SizeInBits.isScalable())
2111 return std::nullopt;
2112 APInt GEPOffset(DL.getIndexTypeSizeInBits(StoreDest->getType()), 0);
2113 const Value *Base = StoreDest->stripAndAccumulateConstantOffsets(
2114 DL, GEPOffset, /*AllowNonInbounds*/ true);
2115
2116 if (GEPOffset.isNegative())
2117 return std::nullopt;
2118
2119 uint64_t OffsetInBytes = GEPOffset.getLimitedValue();
2120 // Check for overflow.
2121 if (OffsetInBytes == UINT64_MAX)
2122 return std::nullopt;
2123 if (const auto *Alloca = dyn_cast<AllocaInst>(Base))
2124 return AssignmentInfo(DL, Alloca, OffsetInBytes * 8, SizeInBits);
2125 return std::nullopt;
2126}
2127
2128std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2129 const MemIntrinsic *I) {
2130 const Value *StoreDest = I->getRawDest();
2131 // Assume 8 bit bytes.
2132 auto *ConstLengthInBytes = dyn_cast<ConstantInt>(I->getLength());
2133 if (!ConstLengthInBytes)
2134 // We can't use a non-const size, bail.
2135 return std::nullopt;
2136 uint64_t SizeInBits = 8 * ConstLengthInBytes->getZExtValue();
2137 return getAssignmentInfoImpl(DL, StoreDest, TypeSize::getFixed(SizeInBits));
2138}
2139
2140std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2141 const StoreInst *SI) {
2142 TypeSize SizeInBits = DL.getTypeSizeInBits(SI->getValueOperand()->getType());
2143 return getAssignmentInfoImpl(DL, SI->getPointerOperand(), SizeInBits);
2144}
2145
2146std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2147 const AllocaInst *AI) {
2148 TypeSize SizeInBits = DL.getTypeSizeInBits(AI->getAllocatedType());
2149 return getAssignmentInfoImpl(DL, AI, SizeInBits);
2150}
2151
2152/// Returns nullptr if the assignment shouldn't be attributed to this variable.
2153static void emitDbgAssign(AssignmentInfo Info, Value *Val, Value *Dest,
2154 Instruction &StoreLikeInst, const VarRecord &VarRec,
2155 DIBuilder &DIB) {
2156 auto *ID = StoreLikeInst.getMetadata(LLVMContext::MD_DIAssignID);
2157 assert(ID && "Store instruction must have DIAssignID metadata");
2158 (void)ID;
2159
2160 const uint64_t StoreStartBit = Info.OffsetInBits;
2161 const uint64_t StoreEndBit = Info.OffsetInBits + Info.SizeInBits;
2162
2163 uint64_t FragStartBit = StoreStartBit;
2164 uint64_t FragEndBit = StoreEndBit;
2165
2166 bool StoreToWholeVariable = Info.StoreToWholeAlloca;
2167 if (auto Size = VarRec.Var->getSizeInBits()) {
2168 // NOTE: trackAssignments doesn't understand base expressions yet, so all
2169 // variables that reach here are guaranteed to start at offset 0 in the
2170 // alloca.
2171 const uint64_t VarStartBit = 0;
2172 const uint64_t VarEndBit = *Size;
2173
2174 // FIXME: trim FragStartBit when nonzero VarStartBit is supported.
2175 FragEndBit = std::min(FragEndBit, VarEndBit);
2176
2177 // Discard stores to bits outside this variable.
2178 if (FragStartBit >= FragEndBit)
2179 return;
2180
2181 StoreToWholeVariable = FragStartBit <= VarStartBit && FragEndBit >= *Size;
2182 }
2183
2184 DIExpression *Expr = DIExpression::get(StoreLikeInst.getContext(), {});
2185 if (!StoreToWholeVariable) {
2186 auto R = DIExpression::createFragmentExpression(Expr, FragStartBit,
2187 FragEndBit - FragStartBit);
2188 assert(R.has_value() && "failed to create fragment expression");
2189 Expr = *R;
2190 }
2191 DIExpression *AddrExpr = DIExpression::get(StoreLikeInst.getContext(), {});
2193 &StoreLikeInst, Val, VarRec.Var, Expr, Dest, AddrExpr, VarRec.DL);
2194 (void)Assign;
2195 LLVM_DEBUG(if (Assign) errs() << " > INSERT: " << *Assign << "\n");
2196}
2197
2198#undef DEBUG_TYPE // Silence redefinition warning (from ConstantsContext.h).
2199#define DEBUG_TYPE "assignment-tracking"
2200
2202 const StorageToVarsMap &Vars, const DataLayout &DL,
2203 bool DebugPrints) {
2204 // Early-exit if there are no interesting variables.
2205 if (Vars.empty())
2206 return;
2207
2208 auto &Ctx = Start->getContext();
2209 auto &Module = *Start->getModule();
2210
2211 // Poison type doesn't matter, so long as it isn't void. Let's just use i1.
2213 DIBuilder DIB(Module, /*AllowUnresolved*/ false);
2214
2215 // Scan the instructions looking for stores to local variables' storage.
2216 LLVM_DEBUG(errs() << "# Scanning instructions\n");
2217 for (auto BBI = Start; BBI != End; ++BBI) {
2218 for (Instruction &I : *BBI) {
2219
2220 std::optional<AssignmentInfo> Info;
2221 Value *ValueComponent = nullptr;
2222 Value *DestComponent = nullptr;
2223 if (auto *AI = dyn_cast<AllocaInst>(&I)) {
2224 // We want to track the variable's stack home from its alloca's
2225 // position onwards so we treat it as an assignment (where the stored
2226 // value is poison).
2227 Info = getAssignmentInfo(DL, AI);
2228 ValueComponent = Poison;
2229 DestComponent = AI;
2230 } else if (auto *SI = dyn_cast<StoreInst>(&I)) {
2231 Info = getAssignmentInfo(DL, SI);
2232 ValueComponent = SI->getValueOperand();
2233 DestComponent = SI->getPointerOperand();
2234 } else if (auto *MI = dyn_cast<MemTransferInst>(&I)) {
2235 Info = getAssignmentInfo(DL, MI);
2236 // May not be able to represent this value easily.
2237 ValueComponent = Poison;
2238 DestComponent = MI->getOperand(0);
2239 } else if (auto *MI = dyn_cast<MemSetInst>(&I)) {
2240 Info = getAssignmentInfo(DL, MI);
2241 // If we're zero-initing we can state the assigned value is zero,
2242 // otherwise use undef.
2243 auto *ConstValue = dyn_cast<ConstantInt>(MI->getOperand(1));
2244 if (ConstValue && ConstValue->isZero())
2245 ValueComponent = ConstValue;
2246 else
2247 ValueComponent = Poison;
2248 DestComponent = MI->getOperand(0);
2249 } else {
2250 // Not a store-like instruction.
2251 continue;
2252 }
2253
2254 assert(ValueComponent && DestComponent);
2255 LLVM_DEBUG(errs() << "SCAN: Found store-like: " << I << "\n");
2256
2257 // Check if getAssignmentInfo failed to understand this store.
2258 if (!Info.has_value()) {
2259 LLVM_DEBUG(
2260 errs()
2261 << " | SKIP: Untrackable store (e.g. through non-const gep)\n");
2262 continue;
2263 }
2264 LLVM_DEBUG(errs() << " | BASE: " << *Info->Base << "\n");
2265
2266 // Check if the store destination is a local variable with debug info.
2267 auto LocalIt = Vars.find(Info->Base);
2268 if (LocalIt == Vars.end()) {
2269 LLVM_DEBUG(
2270 errs()
2271 << " | SKIP: Base address not associated with local variable\n");
2272 continue;
2273 }
2274
2275 DIAssignID *ID =
2276 cast_or_null<DIAssignID>(I.getMetadata(LLVMContext::MD_DIAssignID));
2277 if (!ID) {
2279 I.setMetadata(LLVMContext::MD_DIAssignID, ID);
2280 }
2281
2282 for (const VarRecord &R : LocalIt->second)
2283 emitDbgAssign(*Info, ValueComponent, DestComponent, I, R, DIB);
2284 }
2285 }
2286}
2287
2288bool AssignmentTrackingPass::runOnFunction(Function &F) {
2289 // No value in assignment tracking without optimisations.
2290 if (F.hasFnAttribute(Attribute::OptimizeNone))
2291 return /*Changed*/ false;
2292
2293 bool Changed = false;
2294 auto *DL = &F.getDataLayout();
2295 // Collect a map of {backing storage : dbg.declares} (currently "backing
2296 // storage" is limited to Allocas). We'll use this to find dbg.declares to
2297 // delete after running `trackAssignments`.
2299 // Create another similar map of {storage : variables} that we'll pass to
2300 // trackAssignments.
2301 StorageToVarsMap Vars;
2302 auto ProcessDeclare = [&](DbgVariableRecord &Declare) {
2303 // FIXME: trackAssignments doesn't let you specify any modifiers to the
2304 // variable (e.g. fragment) or location (e.g. offset), so we have to
2305 // leave dbg.declares with non-empty expressions in place.
2306 if (Declare.getExpression()->getNumElements() != 0)
2307 return;
2308 if (!Declare.getAddress())
2309 return;
2310 if (AllocaInst *Alloca =
2311 dyn_cast<AllocaInst>(Declare.getAddress()->stripPointerCasts())) {
2312 // FIXME: Skip VLAs for now (let these variables use dbg.declares).
2313 if (!Alloca->isStaticAlloca())
2314 return;
2315 // Similarly, skip scalable vectors (use dbg.declares instead).
2316 if (auto Sz = Alloca->getAllocationSize(*DL); Sz && Sz->isScalable())
2317 return;
2318 DVRDeclares[Alloca].insert(&Declare);
2319 Vars[Alloca].insert(VarRecord(&Declare));
2320 }
2321 };
2322 for (auto &BB : F) {
2323 for (auto &I : BB) {
2324 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
2325 if (DVR.isDbgDeclare())
2326 ProcessDeclare(DVR);
2327 }
2328 }
2329 }
2330
2331 // FIXME: Locals can be backed by caller allocas (sret, byval).
2332 // Note: trackAssignments doesn't respect dbg.declare's IR positions (as it
2333 // doesn't "understand" dbg.declares). However, this doesn't appear to break
2334 // any rules given this description of dbg.declare from
2335 // llvm/docs/SourceLevelDebugging.rst:
2336 //
2337 // It is not control-dependent, meaning that if a call to llvm.dbg.declare
2338 // exists and has a valid location argument, that address is considered to
2339 // be the true home of the variable across its entire lifetime.
2340 trackAssignments(F.begin(), F.end(), Vars, *DL);
2341
2342 // Delete dbg.declares for variables now tracked with assignment tracking.
2343 for (auto &[Insts, Declares] : DVRDeclares) {
2345 for (auto *Declare : Declares) {
2346 // Assert that the alloca that Declare uses is now linked to a dbg.assign
2347 // describing the same variable (i.e. check that this dbg.declare has
2348 // been replaced by a dbg.assign). Use DebugVariableAggregate to Discard
2349 // the fragment part because trackAssignments may alter the
2350 // fragment. e.g. if the alloca is smaller than the variable, then
2351 // trackAssignments will create an alloca-sized fragment for the
2352 // dbg.assign.
2353 assert(llvm::any_of(Markers, [Declare](auto *Assign) {
2354 return DebugVariableAggregate(Assign) ==
2355 DebugVariableAggregate(Declare);
2356 }));
2357 // Delete Declare because the variable location is now tracked using
2358 // assignment tracking.
2359 Declare->eraseFromParent();
2360 Changed = true;
2361 }
2362 };
2363 return Changed;
2364}
2365
2367 "debug-info-assignment-tracking";
2368
2372 ConstantInt::get(Type::getInt1Ty(M.getContext()), 1)));
2373}
2374
2376 Metadata *Value = M.getModuleFlag(AssignmentTrackingModuleFlag);
2377 return Value && !cast<ConstantAsMetadata>(Value)->getValue()->isNullValue();
2378}
2379
2383
2386 if (!runOnFunction(F))
2387 return PreservedAnalyses::all();
2388
2389 // Record that this module uses assignment tracking. It doesn't matter that
2390 // some functions in the module may not use it - the debug info in those
2391 // functions will still be handled properly.
2392 setAssignmentTrackingModuleFlag(*F.getParent());
2393
2394 // Q: Can we return a less conservative set than just CFGAnalyses? Can we
2395 // return PreservedAnalyses::all()?
2398 return PA;
2399}
2400
2403 bool Changed = false;
2404 for (auto &F : M)
2405 Changed |= runOnFunction(F);
2406
2407 if (!Changed)
2408 return PreservedAnalyses::all();
2409
2410 // Record that this module uses assignment tracking.
2412
2413 // Q: Can we return a less conservative set than just CFGAnalyses? Can we
2414 // return PreservedAnalyses::all()?
2417 return PA;
2418}
2419
2420#undef DEBUG_TYPE
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static DISubprogram * getSubprogram(bool IsDistinct, Ts &&...Args)
static DIImportedEntity * createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope *Context, Metadata *NS, DIFile *File, unsigned Line, StringRef Name, DINodeArray Elements, SmallVectorImpl< TrackingMDNodeRef > &ImportedModules)
DXIL Finalize Linkage
dxil translate DXIL Translate Metadata
static void setAssignmentTrackingModuleFlag(Module &M)
static DISubprogram::DISPFlags pack_into_DISPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized)
static void findDbgIntrinsics(Value *V, SmallVectorImpl< DbgVariableRecord * > &DbgVariableRecords)
static Metadata * stripLoopMDLoc(const SmallPtrSetImpl< Metadata * > &AllDILocation, const SmallPtrSetImpl< Metadata * > &DIReachable, Metadata *MD)
static llvm::DIFile::ChecksumKind map_from_llvmChecksumKind(LLVMChecksumKind CSKind)
static MDNode * updateLoopMetadataDebugLocationsImpl(MDNode *OrigLoopID, function_ref< Metadata *(Metadata *)> Updater)
static MDNode * stripDebugLocFromLoopID(MDNode *N)
static const char * AssignmentTrackingModuleFlag
static DINode::DIFlags map_from_llvmDIFlags(LLVMDIFlags Flags)
static unsigned map_from_llvmDWARFsourcelanguage(LLVMDWARFSourceLanguage lang)
static void emitDbgAssign(AssignmentInfo Info, Value *Val, Value *Dest, Instruction &StoreLikeInst, const VarRecord &VarRec, DIBuilder &DIB)
Returns nullptr if the assignment shouldn't be attributed to this variable.
static LLVMDIFlags map_to_llvmDIFlags(DINode::DIFlags Flags)
static bool getAssignmentTrackingModuleFlag(const Module &M)
PointerUnion< DIExpression *, DIVariable * > unwrapExprVar(LLVMMetadataRef MD)
MD may be nullptr, a DIExpression or DIVariable.
static bool isAllDILocation(SmallPtrSetImpl< Metadata * > &Visited, SmallPtrSetImpl< Metadata * > &AllDILocation, const SmallPtrSetImpl< Metadata * > &DIReachable, Metadata *MD)
static Metadata * updateLoopMetadataDebugLocationsRecursive(Metadata *MetadataIn, function_ref< Metadata *(Metadata *)> Updater)
Recursively handle DILocations in followup metadata etc.
static bool isDILocationReachable(SmallPtrSetImpl< Metadata * > &Visited, SmallPtrSetImpl< Metadata * > &Reachable, Metadata *MD)
Return true if a node is a DILocation or if a DILocation is indirectly referenced by one of the node'...
DIT * unwrapDI(LLVMMetadataRef Ref)
static std::optional< AssignmentInfo > getAssignmentInfoImpl(const DataLayout &DL, const Value *StoreDest, TypeSize SizeInBits)
Collect constant properties (base, size, offset) of StoreDest.
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
IRTranslator LLVM IR MI
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
static DebugLoc getDebugLoc(MachineBasicBlock::instr_iterator FirstMI, MachineBasicBlock::instr_iterator LastMI)
Return the first DebugLoc that has line number information, given a range of instructions.
This file contains the declarations for metadata subclasses.
#define T
uint64_t IntrinsicInst * II
static constexpr StringLiteral Filename
R600 Emit Clause Markers
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
FunctionLoweringInfo::StatepointRelocationRecord RecordType
#define LLVM_DEBUG(...)
Definition Debug.h:114
static uint32_t getFlags(const Symbol *Sym)
Definition TapiFile.cpp:26
Class for arbitrary precision integers.
Definition APInt.h:78
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:330
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition APInt.h:476
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
an instruction to allocate memory on the stack
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
static LLVM_ABI Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val=0)
Return a uniquified Attribute object.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
Represents analyses that only rely on functions' control flow.
Definition Analysis.h:73
static ConstantAsMetadata * get(Constant *C)
Definition Metadata.h:537
List of ValueAsMetadata, to be used as an argument to a dbg.value intrinsic.
SmallVector< DbgVariableRecord * > getAllDbgVariableRecordUsers()
static DIAssignID * getDistinct(LLVMContext &Context)
bool getDebugInfoForProfiling() const
StringRef getFlags() const
StringRef getSDK() const
static LLVM_ABI std::optional< DebugNameTableKind > getNameTableKind(StringRef Str)
bool getRangesBaseAddress() const
DIMacroNodeArray getMacros() const
unsigned getRuntimeVersion() const
bool getSplitDebugInlining() const
StringRef getSysRoot() const
StringRef getProducer() const
DISourceLanguageName getSourceLanguage() const
uint64_t getDWOId() const
StringRef getSplitDebugFilename() const
DWARF expression.
DbgVariableFragmentInfo FragmentInfo
static LLVM_ABI bool calculateFragmentIntersect(const DataLayout &DL, const Value *SliceStart, uint64_t SliceOffsetInBits, uint64_t SliceSizeInBits, const Value *DbgPtr, int64_t DbgPtrOffsetInBits, int64_t DbgExtractOffsetInBits, DIExpression::FragmentInfo VarFrag, std::optional< DIExpression::FragmentInfo > &Result, int64_t &OffsetFromLocationInBits)
Computes a fragment, bit-extract operation if needed, and new constant offset to describe a part of a...
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
LLVM_ABI bool extractLeadingOffset(int64_t &OffsetInBytes, SmallVectorImpl< uint64_t > &RemainingOps) const
Assuming that the expression operates on an address, extract a constant offset and the successive ops...
ChecksumKind
Which algorithm (e.g.
A pair of DIGlobalVariable and DIExpression.
An imported module (C++ using directive or similar).
LLVM_ABI DISubprogram * getSubprogram() const
Get the subprogram for this scope.
DILocalScope * getScope() const
Get the local scope for this variable.
Macro Info DWARF-like metadata node.
Tagged DWARF-like metadata node.
DIFlags
Debug info flags.
Base class for scope-like contexts.
LLVM_ABI StringRef getName() const
DIFile * getFile() const
Wrapper structure that holds a language name and its version.
Subprogram description. Uses SubclassData1.
static LLVM_ABI DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized, unsigned Virtuality=SPFlagNonvirtual, bool IsMainSubprogram=false)
DISPFlags
Debug info subprogram flags.
Type array for a subprogram.
Base class for types.
DIScope * getScope() const
LLVM_ABI std::optional< uint64_t > getSizeInBits() const
Determines the size of the variable's type.
DIType * getType() const
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Base class for non-instruction debug metadata records that have positions within IR.
LLVM_ABI LLVMContext & getContext()
DebugLoc getDebugLoc() const
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LLVM_ABI Value * getAddress() const
LLVM_ABI bool isKillAddress() const
Check whether this kills the address component.
DbgVariableFragmentInfo getFragmentOrEntireVariable() const
Get the FragmentInfo for the variable if it exists, otherwise return a FragmentInfo that covers the e...
static LLVM_ABI DbgVariableRecord * createLinkedDVRAssign(Instruction *LinkedInstr, Value *Val, DILocalVariable *Variable, DIExpression *Expression, Value *Address, DIExpression *AddressExpression, const DILocation *DI)
DIExpression * getAddressExpression() const
LLVM_ABI void processInstruction(const Module &M, const Instruction &I)
Process a single instruction and collect debug info anchors.
LLVM_ABI void processModule(const Module &M)
Process entire module and collect debug info anchors.
LLVM_ABI void processSubprogram(DISubprogram *SP)
Process subprogram.
LLVM_ABI void processLocation(const Module &M, const DILocation *Loc)
Process debug info location.
LLVM_ABI void reset()
Clear all lists.
LLVM_ABI void processVariable(const DILocalVariable *DVI)
Process a DILocalVariable.
LLVM_ABI void processDbgRecord(const Module &M, const DbgRecord &DR)
Process a DbgRecord.
A debug info location.
Definition DebugLoc.h:123
LLVM_ABI DILocation * get() const
Get the underlying DILocation.
Definition DebugLoc.cpp:48
LLVM_ABI MDNode * getScope() const
Definition DebugLoc.cpp:62
static LLVM_ABI DebugLoc getMergedLocation(DebugLoc LocA, DebugLoc LocB)
When two instructions are combined into a single instruction we also need to combine the original loc...
Definition DebugLoc.cpp:179
LLVM_ABI DILocation * getInlinedAt() const
Definition DebugLoc.cpp:67
static DebugLoc getDropped()
Definition DebugLoc.h:163
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
Definition DenseMap.h:205
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:241
Implements a dense probed hash-table based set.
Definition DenseSet.h:279
BasicBlockListType::iterator iterator
Definition Function.h:70
DISubprogram * getSubprogram() const
Get the attached subprogram.
LLVM_ABI void mergeDIAssignID(ArrayRef< const Instruction * > SourceInstructions)
Merge the DIAssignID metadata from this instruction and those attached to instructions in SourceInstr...
LLVM_ABI void dropLocation()
Drop the instruction's debug location.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
LLVM_ABI void updateLocationAfterHoist()
Updates the debug location given that the instruction has been hoisted from a block to a predecessor ...
Instruction(const Instruction &)=delete
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI void applyMergedLocation(DebugLoc LocA, DebugLoc LocB)
Merge 2 debug locations and apply it to the Instruction.
static LLVM_ABI bool mayLowerToFunctionCall(Intrinsic::ID IID)
Check if the intrinsic might lower into a regular function call in the course of IR transformations.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
static LocalAsMetadata * getIfExists(Value *Local)
Definition Metadata.h:567
Metadata node.
Definition Metadata.h:1080
LLVM_ABI void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1580
void replaceAllUsesWith(Metadata *MD)
RAUW a temporary.
Definition Metadata.h:1284
static LLVM_ABI void deleteTemporary(MDNode *N)
Deallocate a node created by getTemporary.
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1444
ArrayRef< MDOperand > operands() const
Definition Metadata.h:1442
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1572
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1450
bool isDistinct() const
Definition Metadata.h:1263
LLVMContext & getContext() const
Definition Metadata.h:1244
Tracking metadata reference owned by Metadata.
Definition Metadata.h:902
Metadata * get() const
Definition Metadata.h:931
Tuple of metadata.
Definition Metadata.h:1500
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a temporary node.
Definition Metadata.h:1549
This is the common base class for memset/memcpy/memmove.
Root of the metadata hierarchy.
Definition Metadata.h:64
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
@ Max
Takes the max of the two values, which are required to be integers.
Definition Module.h:149
A tuple of MDNodes.
Definition Metadata.h:1760
LLVM_ABI StringRef getName() const
A discriminated union of two or more pointer types, with the discriminator in the low bit of the poin...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
Definition Analysis.h:151
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:140
The TimeTraceScope is a helper class to call the begin and end functions of the time trace profiler.
TinyPtrVector - This class is specialized for cases where there are normally 0 or 1 element in a vect...
void push_back(EltTy NewVal)
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:293
static LLVM_ABI ValueAsMetadata * getIfExists(Value *V)
Definition Metadata.cpp:528
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:259
LLVM_ABI const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr, bool LookThroughIntToPtr=false) const
Accumulate the constant offset this value has compared to a base pointer.
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:202
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
Definition DenseSet.h:180
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
An efficient, type-erasing, non-owning reference to a callable.
IteratorT end() const
IteratorT begin() const
Changed
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateImportedDeclaration(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef Decl, LLVMMetadataRef File, unsigned Line, const char *Name, size_t NameLen, LLVMMetadataRef *Elements, unsigned NumElements)
Create a descriptor for an imported function, type, or variable.
LLVM_C_ABI LLVMMetadataRef LLVMDILocationGetInlinedAt(LLVMMetadataRef Location)
Get the "inline at" location associated with this debug location.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateStaticMemberType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, LLVMMetadataRef Type, LLVMDIFlags Flags, LLVMValueRef ConstantVal, uint32_t AlignInBits)
Create debugging information entry for a C++ static data member.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateArrayType(LLVMDIBuilderRef Builder, uint64_t Size, uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts, unsigned NumSubscripts)
Create debugging information entry for an array.
LLVM_C_ABI unsigned LLVMDISubprogramGetLine(LLVMMetadataRef Subprogram)
Get the line associated with a given subprogram.
LLVM_C_ABI LLVMMetadataRef LLVMDILocationGetScope(LLVMMetadataRef Location)
Get the local scope associated with this debug location.
LLVM_C_ABI unsigned LLVMDITypeGetLine(LLVMMetadataRef DType)
Get the source line where this DIType is declared.
LLVMDWARFMacinfoRecordType
Describes the kind of macro declaration used for LLVMDIBuilderCreateMacro.
Definition DebugInfo.h:221
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateEnumerator(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, int64_t Value, LLVMBool IsUnsigned)
Create debugging information entry for an enumerator.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateConstantValueExpression(LLVMDIBuilderRef Builder, uint64_t Value)
Create a new descriptor for the specified variable that does not have an address, but does have a con...
LLVM_C_ABI void LLVMDIBuilderFinalize(LLVMDIBuilderRef Builder)
Construct any deferred debug info descriptors.
LLVM_C_ABI void LLVMSetSubprogram(LLVMValueRef Func, LLVMMetadataRef SP)
Set the subprogram attached to a function.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateSetType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef BaseTy)
Create debugging information entry for a set.
LLVM_C_ABI void LLVMDIBuilderFinalizeSubprogram(LLVMDIBuilderRef Builder, LLVMMetadataRef Subprogram)
Finalize a specific subprogram.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateMacro(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentMacroFile, unsigned Line, LLVMDWARFMacinfoRecordType RecordType, const char *Name, size_t NameLen, const char *Value, size_t ValueLen)
Create debugging information entry for a macro.
LLVM_C_ABI LLVMDbgRecordRef LLVMDIBuilderInsertDbgValueRecordAtEnd(LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMBasicBlockRef Block)
Only use in "new debug format" (LLVMIsNewDbgInfoFormat() is true).
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateUnspecifiedType(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen)
Create a DWARF unspecified type.
LLVM_C_ABI LLVMDIBuilderRef LLVMCreateDIBuilderDisallowUnresolved(LLVMModuleRef M)
Construct a builder for a module, and do not allow for unresolved nodes attached to the module.
LLVM_C_ABI LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef Ctx, LLVMMetadataRef *Data, size_t NumElements)
Create a new temporary MDNode.
LLVM_C_ABI LLVMMetadataRef LLVMDIScopeGetFile(LLVMMetadataRef Scope)
Get the metadata of the file associated with a given scope.
LLVM_C_ABI LLVMDbgRecordRef LLVMDIBuilderInsertDeclareRecordBefore(LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMValueRef Instr)
Only use in "new debug format" (LLVMIsNewDbgInfoFormat() is true).
LLVM_C_ABI LLVMDIBuilderRef LLVMCreateDIBuilder(LLVMModuleRef M)
Construct a builder for a module and collect unresolved nodes attached to the module in order to reso...
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateLabel(LLVMDIBuilderRef Builder, LLVMMetadataRef Context, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMBool AlwaysPreserve)
Create a new descriptor for a label.
LLVM_C_ABI const char * LLVMDIFileGetSource(LLVMMetadataRef File, unsigned *Len)
Get the source of a given file.
LLVM_C_ABI unsigned LLVMDILocationGetColumn(LLVMMetadataRef Location)
Get the column number of this debug location.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateExpression(LLVMDIBuilderRef Builder, uint64_t *Addr, size_t Length)
Create a new descriptor for the specified variable which has a complex address expression for its add...
LLVM_C_ABI const char * LLVMDIFileGetFilename(LLVMMetadataRef File, unsigned *Len)
Get the name of a given file.
LLVM_C_ABI LLVMMetadataRef LLVMGetSubprogram(LLVMValueRef Func)
Get the metadata of the subprogram attached to a function.
LLVMDWARFSourceLanguage
Source languages known by DWARF.
Definition DebugInfo.h:79
LLVM_C_ABI LLVMDbgRecordRef LLVMDIBuilderInsertLabelAtEnd(LLVMDIBuilderRef Builder, LLVMMetadataRef LabelInfo, LLVMMetadataRef Location, LLVMBasicBlockRef InsertAtEnd)
Insert a new llvm.dbg.label intrinsic call.
LLVM_C_ABI LLVMMetadataRef LLVMInstructionGetDebugLoc(LLVMValueRef Inst)
Get the debug location for the given instruction.
LLVM_C_ABI LLVMDbgRecordRef LLVMDIBuilderInsertDeclareRecordAtEnd(LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMBasicBlockRef Block)
Only use in "new debug format" (LLVMIsNewDbgInfoFormat() is true).
LLVM_C_ABI void LLVMDisposeDIBuilder(LLVMDIBuilderRef Builder)
Deallocates the DIBuilder and everything it owns.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateUnionType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang, const char *UniqueId, size_t UniqueIdLen)
Create debugging information entry for a union.
LLVM_C_ABI LLVMDbgRecordRef LLVMDIBuilderInsertDbgValueRecordBefore(LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMValueRef Instr)
Only use in "new debug format" (LLVMIsNewDbgInfoFormat() is true).
LLVM_C_ABI LLVMMetadataRef LLVMDIGlobalVariableExpressionGetVariable(LLVMMetadataRef GVE)
Retrieves the DIVariable associated with this global variable expression.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderGetOrCreateArray(LLVMDIBuilderRef Builder, LLVMMetadataRef *Data, size_t NumElements)
Create an array of DI Nodes.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateFunction(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, const char *LinkageName, size_t LinkageNameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool IsLocalToUnit, LLVMBool IsDefinition, unsigned ScopeLine, LLVMDIFlags Flags, LLVMBool IsOptimized)
Create a new descriptor for the specified subprogram.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateParameterVariable(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, unsigned ArgNo, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags)
Create a new descriptor for a function parameter variable.
LLVM_C_ABI uint64_t LLVMDITypeGetSizeInBits(LLVMMetadataRef DType)
Get the size of this DIType in bits.
LLVM_C_ABI void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef TempTargetMetadata, LLVMMetadataRef Replacement)
Replace all uses of temporary metadata.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderGetOrCreateTypeArray(LLVMDIBuilderRef Builder, LLVMMetadataRef *Data, size_t NumElements)
Create a type array.
LLVM_C_ABI LLVMMetadataRef LLVMDIGlobalVariableExpressionGetExpression(LLVMMetadataRef GVE)
Retrieves the DIExpression associated with this global variable expression.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateFileWithChecksum(LLVMDIBuilderRef Builder, const char *Filename, size_t FilenameLen, const char *Directory, size_t DirectoryLen, LLVMChecksumKind ChecksumKind, const char *Checksum, size_t ChecksumLen, const char *Source, size_t SourceLen)
Create a file descriptor to hold debugging information for a file.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateBitFieldMemberType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint64_t OffsetInBits, uint64_t StorageOffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef Type)
Create debugging information entry for a bit field member.
LLVMDIFlags
Debug info flags.
Definition DebugInfo.h:35
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateFile(LLVMDIBuilderRef Builder, const char *Filename, size_t FilenameLen, const char *Directory, size_t DirectoryLen)
Create a file descriptor to hold debugging information for a file.
LLVM_C_ABI unsigned LLVMDebugMetadataVersion(void)
The current debug metadata version number.
LLVM_C_ABI unsigned LLVMGetModuleDebugMetadataVersion(LLVMModuleRef Module)
The version of debug metadata that's present in the provided Module.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateObjCIVar(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef Ty, LLVMMetadataRef PropertyNode)
Create debugging information entry for Objective-C instance variable.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateTempGlobalVariableFwdDecl(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, const char *Linkage, size_t LnkLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit, LLVMMetadataRef Decl, uint32_t AlignInBits)
Create a new descriptor for the specified global variable that is temporary and meant to be RAUWed.
LLVM_C_ABI void LLVMDISubprogramReplaceType(LLVMMetadataRef Subprogram, LLVMMetadataRef SubroutineType)
Replace the subprogram subroutine type.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateForwardDecl(LLVMDIBuilderRef Builder, unsigned Tag, const char *Name, size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits, const char *UniqueIdentifier, size_t UniqueIdentifierLen)
Create a permanent forward-declared type.
LLVM_C_ABI LLVMMetadataRef LLVMDIVariableGetScope(LLVMMetadataRef Var)
Get the metadata of the scope associated with a given variable.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateGlobalVariableExpression(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, const char *Linkage, size_t LinkLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit, LLVMMetadataRef Expr, LLVMMetadataRef Decl, uint32_t AlignInBits)
Create a new descriptor for the specified variable.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateCompileUnit(LLVMDIBuilderRef Builder, LLVMDWARFSourceLanguage Lang, LLVMMetadataRef FileRef, const char *Producer, size_t ProducerLen, LLVMBool isOptimized, const char *Flags, size_t FlagsLen, unsigned RuntimeVer, const char *SplitName, size_t SplitNameLen, LLVMDWARFEmissionKind Kind, unsigned DWOId, LLVMBool SplitDebugInlining, LLVMBool DebugInfoForProfiling, const char *SysRoot, size_t SysRootLen, const char *SDK, size_t SDKLen)
A CompileUnit provides an anchor for all debugging information generated during this instance of comp...
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateObjCProperty(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, const char *GetterName, size_t GetterNameLen, const char *SetterName, size_t SetterNameLen, unsigned PropertyAttributes, LLVMMetadataRef Ty)
Create debugging information entry for Objective-C property.
LLVMChecksumKind
The kind of checksum to emit.
Definition DebugInfo.h:209
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromModule(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef M, LLVMMetadataRef File, unsigned Line, LLVMMetadataRef *Elements, unsigned NumElements)
Create a descriptor for an imported module.
LLVM_C_ABI LLVMMetadataRef LLVMDIVariableGetFile(LLVMMetadataRef Var)
Get the metadata of the file associated with a given variable.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderGetOrCreateSubrange(LLVMDIBuilderRef Builder, int64_t LowerBound, int64_t Count)
Create a descriptor for a value range.
LLVM_C_ABI unsigned LLVMDILocationGetLine(LLVMMetadataRef Location)
Get the line number of this debug location.
LLVM_C_ABI LLVMDbgRecordRef LLVMDIBuilderInsertLabelBefore(LLVMDIBuilderRef Builder, LLVMMetadataRef LabelInfo, LLVMMetadataRef Location, LLVMValueRef InsertBefore)
Insert a new llvm.dbg.label intrinsic call.
LLVM_C_ABI unsigned LLVMDIVariableGetLine(LLVMMetadataRef Var)
Get the source line where this DIVariable is declared.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateQualifiedType(LLVMDIBuilderRef Builder, unsigned Tag, LLVMMetadataRef Type)
Create debugging information entry for a qualified type, e.g.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateClassType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements, unsigned NumElements, LLVMMetadataRef VTableHolder, LLVMMetadataRef TemplateParamsNode, const char *UniqueIdentifier, size_t UniqueIdentifierLen)
Create debugging information entry for a class.
LLVM_C_ABI LLVMMetadataKind LLVMGetMetadataKind(LLVMMetadataRef Metadata)
Obtain the enumerated type of a Metadata instance.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateDynamicArrayType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t Size, uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts, unsigned NumSubscripts, LLVMMetadataRef DataLocation, LLVMMetadataRef Associated, LLVMMetadataRef Allocated, LLVMMetadataRef Rank, LLVMMetadataRef BitStride)
Create debugging information entry for a dynamic array.
LLVMDWARFEmissionKind
The amount of debug information to emit.
Definition DebugInfo.h:153
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateSubrangeType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef BaseTy, LLVMMetadataRef LowerBound, LLVMMetadataRef UpperBound, LLVMMetadataRef Stride, LLVMMetadataRef Bias)
Create a descriptor for a subrange with dynamic bounds.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateMemberType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef Ty)
Create debugging information entry for a member.
LLVM_C_ABI const char * LLVMDITypeGetName(LLVMMetadataRef DType, size_t *Length)
Get the name of this DIType.
LLVM_C_ABI uint64_t LLVMDITypeGetOffsetInBits(LLVMMetadataRef DType)
Get the offset of this DIType in bits.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateReplaceableCompositeType(LLVMDIBuilderRef Builder, unsigned Tag, const char *Name, size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, const char *UniqueIdentifier, size_t UniqueIdentifierLen)
Create a temporary forward-declared type.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateTempMacroFile(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentMacroFile, unsigned Line, LLVMMetadataRef File)
Create debugging information temporary entry for a macro file.
LLVM_C_ABI LLVMDIFlags LLVMDITypeGetFlags(LLVMMetadataRef DType)
Get the flags associated with this DIType.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateModule(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentScope, const char *Name, size_t NameLen, const char *ConfigMacros, size_t ConfigMacrosLen, const char *IncludePath, size_t IncludePathLen, const char *APINotesFile, size_t APINotesFileLen)
Creates a new descriptor for a module with the specified parent scope.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateMemberPointerType(LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeType, LLVMMetadataRef ClassType, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags)
Create debugging information entry for a pointer to member.
LLVM_C_ABI uint16_t LLVMGetDINodeTag(LLVMMetadataRef MD)
Get the dwarf::Tag of a DINode.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateEnumeratorOfArbitraryPrecision(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, uint64_t SizeInBits, const uint64_t Words[], LLVMBool IsUnsigned)
Create debugging information entry for an enumerator of arbitrary precision.
LLVM_C_ABI void LLVMReplaceArrays(LLVMDIBuilderRef Builder, LLVMMetadataRef *T, LLVMMetadataRef *Elements, unsigned NumElements)
Replace arrays.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateNameSpace(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentScope, const char *Name, size_t NameLen, LLVMBool ExportSymbols)
Creates a new descriptor for a namespace with the specified parent scope.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateStructType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang, LLVMMetadataRef VTableHolder, const char *UniqueId, size_t UniqueIdLen)
Create debugging information entry for a struct.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateLexicalBlockFile(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Discriminator)
Create a descriptor for a lexical block with a new file attached.
LLVM_C_ABI void LLVMDisposeTemporaryMDNode(LLVMMetadataRef TempNode)
Deallocate a temporary node.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateObjectPointerType(LLVMDIBuilderRef Builder, LLVMMetadataRef Type, LLVMBool Implicit)
Create a uniqued DIType* clone with FlagObjectPointer.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateTypedef(LLVMDIBuilderRef Builder, LLVMMetadataRef Type, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Scope, uint32_t AlignInBits)
Create debugging information entry for a typedef.
unsigned LLVMDWARFTypeEncoding
An LLVM DWARF type encoding.
Definition DebugInfo.h:214
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateAutoVariable(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags, uint32_t AlignInBits)
Create a new descriptor for a local auto variable.
LLVM_C_ABI void LLVMInstructionSetDebugLoc(LLVMValueRef Inst, LLVMMetadataRef Loc)
Set the debug location for the given instruction.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef Builder, LLVMMetadataRef File, LLVMMetadataRef *ParameterTypes, unsigned NumParameterTypes, LLVMDIFlags Flags)
Create subroutine type.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateVectorType(LLVMDIBuilderRef Builder, uint64_t Size, uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts, unsigned NumSubscripts)
Create debugging information entry for a vector type.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreatePointerType(LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeTy, uint64_t SizeInBits, uint32_t AlignInBits, unsigned AddressSpace, const char *Name, size_t NameLen)
Create debugging information entry for a pointer.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateNullPtrType(LLVMDIBuilderRef Builder)
Create C++11 nullptr type.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateEnumerationType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef *Elements, unsigned NumElements, LLVMMetadataRef ClassTy)
Create debugging information entry for an enumeration.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromAlias(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef ImportedEntity, LLVMMetadataRef File, unsigned Line, LLVMMetadataRef *Elements, unsigned NumElements)
Create a descriptor for an imported module that aliases another imported entity descriptor.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateInheritance(LLVMDIBuilderRef Builder, LLVMMetadataRef Ty, LLVMMetadataRef BaseTy, uint64_t BaseOffset, uint32_t VBPtrOffset, LLVMDIFlags Flags)
Create debugging information entry to establish inheritance relationship between two types.
unsigned LLVMMetadataKind
Definition DebugInfo.h:204
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateReferenceType(LLVMDIBuilderRef Builder, unsigned Tag, LLVMMetadataRef Type)
Create debugging information entry for a c++ style reference or rvalue reference type.
LLVM_C_ABI LLVMBool LLVMStripModuleDebugInfo(LLVMModuleRef Module)
Strip debug info in the module if it exists.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, uint64_t SizeInBits, LLVMDWARFTypeEncoding Encoding, LLVMDIFlags Flags)
Create debugging information entry for a basic type.
LLVM_C_ABI uint32_t LLVMDITypeGetAlignInBits(LLVMMetadataRef DType)
Get the alignment of this DIType in bits.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateLexicalBlock(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, unsigned Column)
Create a descriptor for a lexical block with the specified parent context.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateArtificialType(LLVMDIBuilderRef Builder, LLVMMetadataRef Type)
Create a uniqued DIType* clone with FlagArtificial set.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateDebugLocation(LLVMContextRef Ctx, unsigned Line, unsigned Column, LLVMMetadataRef Scope, LLVMMetadataRef InlinedAt)
Creates a new DebugLocation that describes a source location.
LLVM_C_ABI const char * LLVMDIFileGetDirectory(LLVMMetadataRef File, unsigned *Len)
Get the directory of a given file.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromNamespace(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef NS, LLVMMetadataRef File, unsigned Line)
Create a descriptor for an imported namespace.
@ LLVMGenericDINodeMetadataKind
Definition DebugInfo.h:173
@ CSK_SHA1
Definition DebugInfo.h:209
@ CSK_SHA256
Definition DebugInfo.h:209
@ CSK_MD5
Definition DebugInfo.h:209
struct LLVMOpaqueValue * LLVMValueRef
Represents an individual value in LLVM IR.
Definition Types.h:75
int LLVMBool
Definition Types.h:28
struct LLVMOpaqueDbgRecord * LLVMDbgRecordRef
Definition Types.h:175
struct LLVMOpaqueContext * LLVMContextRef
The top-level container for all LLVM global data.
Definition Types.h:53
struct LLVMOpaqueBasicBlock * LLVMBasicBlockRef
Represents a basic block of instructions in LLVM IR.
Definition Types.h:82
struct LLVMOpaqueMetadata * LLVMMetadataRef
Represents an LLVM Metadata.
Definition Types.h:89
struct LLVMOpaqueModule * LLVMModuleRef
The top-level container for all other LLVM Intermediate Representation (IR) objects.
Definition Types.h:61
struct LLVMOpaqueDIBuilder * LLVMDIBuilderRef
Represents an LLVM debug info builder.
Definition Types.h:117
#define UINT64_MAX
Definition DataTypes.h:77
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
Assignment Tracking (at).
Definition DebugInfo.h:181
LLVM_ABI void deleteAll(Function *F)
Remove all Assignment Tracking related intrinsics and metadata from F.
LLVM_ABI AssignmentInstRange getAssignmentInsts(DIAssignID *ID)
Return a range of instructions (typically just one) that have ID as an attachment.
iterator_range< SmallVectorImpl< Instruction * >::iterator > AssignmentInstRange
A range of instructions.
Definition DebugInfo.h:186
LLVM_ABI void trackAssignments(Function::iterator Start, Function::iterator End, const StorageToVarsMap &Vars, const DataLayout &DL, bool DebugPrints=false)
Track assignments to Vars between Start and End.
LLVM_ABI void remapAssignID(DenseMap< DIAssignID *, DIAssignID * > &Map, Instruction &I)
Replace DIAssignID uses and attachments with IDs from Map.
SmallVector< DbgVariableRecord * > getDVRAssignmentMarkers(const Instruction *Inst)
Return a range of dbg_assign records for which Inst performs the assignment they encode.
Definition DebugInfo.h:203
LLVM_ABI void deleteAssignmentMarkers(const Instruction *Inst)
Delete the llvm.dbg.assign intrinsics linked to Inst.
LLVM_ABI std::optional< AssignmentInfo > getAssignmentInfo(const DataLayout &DL, const MemIntrinsic *I)
DenseMap< const AllocaInst *, SmallSetVector< VarRecord, 2 > > StorageToVarsMap
Map of backing storage to a set of variables that are stored to it.
Definition DebugInfo.h:286
LLVM_ABI void RAUW(DIAssignID *Old, DIAssignID *New)
Replace all uses (and attachments) of Old with New.
LLVM_ABI bool calculateFragmentIntersect(const DataLayout &DL, const Value *Dest, uint64_t SliceOffsetInBits, uint64_t SliceSizeInBits, const DbgVariableRecord *DVRAssign, std::optional< DIExpression::FragmentInfo > &Result)
Calculate the fragment of the variable in DAI covered from (Dest + SliceOffsetInBits) to to (Dest + S...
Calculates the starting offsets for various sections within the .debug_names section.
Definition Dwarf.h:35
MacinfoRecordType
Definition Dwarf.h:815
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract_or_null(Y &&MD)
Extract a Value from Metadata, if any, allowing null.
Definition Metadata.h:709
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:316
@ Length
Definition DWP.cpp:532
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
LLVM_ABI void findDbgValues(Value *V, SmallVectorImpl< DbgVariableRecord * > &DbgVariableRecords)
Finds the dbg.values describing a value.
@ Implicit
Not emitted register (e.g. carry, or temporary result).
LLVM_ABI bool stripDebugInfo(Function &F)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
@ Import
Import information from summary.
Definition IPO.h:56
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:634
auto cast_or_null(const Y &Val)
Definition Casting.h:714
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
LLVM_ABI bool stripNonLineTableDebugInfo(Module &M)
Downgrade the debug info in a module to contain only line table information.
LLVM_ABI TinyPtrVector< DbgVariableRecord * > findDVRValues(Value *V)
As above, for DVRValues.
Definition DebugInfo.cpp:82
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI unsigned getDebugMetadataVersionFromModule(const Module &M)
Return Debug Info Metadata Version by checking module flags.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
LLVM_ABI bool StripDebugInfo(Module &M)
Strip debug info in the module if it exists.
@ Ref
The access may reference the value stored in memory.
Definition ModRef.h:32
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
Attribute unwrap(LLVMAttributeRef Attr)
Definition Attributes.h:397
LLVM_ABI bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
LLVM_ABI DebugLoc getDebugValueLoc(DbgVariableRecord *DVR)
Produce a DebugLoc to use for each dbg.declare that is promoted to a dbg.value.
DWARFExpression::Operation Op
LLVM_ABI TinyPtrVector< DbgVariableRecord * > findDVRDeclareValues(Value *V)
As above, for DVRDeclareValues.
Definition DebugInfo.cpp:65
ArrayRef(const T &OneElt) -> ArrayRef< T >
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
Definition STLExtras.h:2019
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVMAttributeRef wrap(Attribute Attr)
Definition Attributes.h:392
LLVM_ABI TinyPtrVector< DbgVariableRecord * > findDVRDeclares(Value *V)
Finds dbg.declare records declaring local variables as living in the memory that 'V' points to.
Definition DebugInfo.cpp:48
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
PointerUnion< Instruction *, DbgRecord * > DbgInstPtr
Definition DIBuilder.h:44
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
LLVM_ABI void updateLoopMetadataDebugLocations(Instruction &I, function_ref< Metadata *(Metadata *)> Updater)
Update the debug locations contained within the MD_loop metadata attached to the instruction I,...
@ DEBUG_METADATA_VERSION
Definition Metadata.h:54
LLVM_ABI void findDbgUsers(Value *V, SmallVectorImpl< DbgVariableRecord * > &DbgVariableRecords)
Finds the debug info records describing a value.
LLVM_ABI DISubprogram * getDISubprogram(const MDNode *Scope)
Find subprogram that is enclosing this scope.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
#define N
A single checksum, represented by a Kind and a Value (a string).
Describes properties of a store that has a static size and offset into a some base storage.
Definition DebugInfo.h:297
Helper struct for trackAssignments, below.
Definition DebugInfo.h:244
DILocation * DL
Definition DebugInfo.h:246
DILocalVariable * Var
Definition DebugInfo.h:245