LLVM 24.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 *GVE : CU->getGlobalVariables())
201 processGlobalVariableExpression(GVE);
202 for (auto *ET : CU->getEnumTypes())
203 processType(ET);
204 for (auto *RT : CU->getRetainedTypes())
205 if (auto *T = dyn_cast<DIType>(RT))
206 processType(T);
207 else
209 for (auto *Import : CU->getImportedEntities())
210 processImportedEntity(Import);
211 for (auto *Macro : CU->getMacros())
212 processMacroNode(Macro, nullptr);
213}
214
215void DebugInfoFinder::processGlobalVariableExpression(
217 if (!addGlobalVariable(GVE))
218 return;
219 auto *GV = GVE->getVariable();
220 processScope(GV->getScope());
221 processType(GV->getType());
222}
223
225 const Instruction &I) {
226 if (auto *DVI = dyn_cast<DbgVariableIntrinsic>(&I))
227 processVariable(DVI->getVariable());
228
229 if (auto DbgLoc = I.getDebugLoc())
230 processLocation(M, DbgLoc.get());
231
232 for (const DbgRecord &DPR : I.getDbgRecordRange())
233 processDbgRecord(M, DPR);
234}
235
237 if (!Loc)
238 return;
239 processScope(Loc->getScope());
240 processLocation(M, Loc->getInlinedAt());
241}
242
245 processVariable(DVR->getVariable());
247}
248
250 if (auto *DLV = dyn_cast_or_null<DILocalVariable>(DV))
251 processVariable(DLV);
252}
253
254void DebugInfoFinder::processType(DIType *DT) {
255 if (!addType(DT))
256 return;
257 processScope(DT->getScope());
258 if (auto *ST = dyn_cast<DISubroutineType>(DT)) {
259 for (DIType *Ref : ST->getTypeArray())
260 processType(Ref);
261 return;
262 }
263 if (auto *DCT = dyn_cast<DICompositeType>(DT)) {
264 processType(DCT->getBaseType());
265 processType(DCT->getVTableHolder());
266 processType(DCT->getDiscriminator());
267 processType(DCT->getSpecification());
268 processVariable(DCT->getDataLocation());
269 processVariable(DCT->getAssociated());
270 processVariable(DCT->getAllocated());
271 for (Metadata *D : DCT->getElements()) {
272 if (auto *T = dyn_cast<DIType>(D))
273 processType(T);
274 else if (auto *SP = dyn_cast<DISubprogram>(D))
276 else if (auto *P = dyn_cast<DIProperty>(D))
277 processType(P->getType());
278 else if (auto *SR = dyn_cast_or_null<DISubrange>(D)) {
279 auto VisitBound = [&](DISubrange::BoundType Bound) {
280 if (auto *BV = dyn_cast_if_present<DIVariable *>(Bound))
281 processVariable(BV);
282 };
283 VisitBound(SR->getLowerBound());
284 VisitBound(SR->getCount());
285 VisitBound(SR->getUpperBound());
286 VisitBound(SR->getStride());
287 } else if (auto *GSR = dyn_cast_or_null<DIGenericSubrange>(D)) {
288 auto VisitBound = [&](DIGenericSubrange::BoundType Bound) {
289 if (auto *BV = dyn_cast_if_present<DIVariable *>(Bound))
290 processVariable(BV);
291 };
292 VisitBound(GSR->getLowerBound());
293 VisitBound(GSR->getCount());
294 VisitBound(GSR->getUpperBound());
295 VisitBound(GSR->getStride());
296 }
297 }
298 return;
299 }
300 if (auto *ST = dyn_cast<DIStringType>(DT)) {
301 processVariable(ST->getStringLength());
302 return;
303 }
304 if (auto *SRT = dyn_cast<DISubrangeType>(DT)) {
305 processType(SRT->getBaseType());
306 auto VisitBound = [&](DISubrangeType::BoundType Bound) {
307 if (auto *V = dyn_cast_if_present<DIVariable *>(Bound))
309 else if (auto *T = dyn_cast_if_present<DIDerivedType *>(Bound))
310 processType(T);
311 };
312 VisitBound(SRT->getLowerBound());
313 VisitBound(SRT->getUpperBound());
314 VisitBound(SRT->getStride());
315 VisitBound(SRT->getBias());
316 return;
317 }
318 if (auto *DDT = dyn_cast<DIDerivedType>(DT)) {
319 processType(DDT->getBaseType());
320 }
321}
322
323void DebugInfoFinder::processImportedEntity(const DIImportedEntity *Import) {
324 auto *Entity = Import->getEntity();
325 if (auto *T = dyn_cast<DIType>(Entity))
326 processType(T);
327 else if (auto *SP = dyn_cast<DISubprogram>(Entity))
329 else if (auto *NS = dyn_cast<DINamespace>(Entity))
330 processScope(NS->getScope());
331 else if (auto *M = dyn_cast<DIModule>(Entity))
332 processScope(M->getScope());
333}
334
335/// Process a macro debug info node (DIMacroNode).
336///
337/// A DIMacroNode is one of two types:
338/// - DIMacro: A single macro definition. Add it to the Macros list along with
339/// its containing DIMacroFile.
340/// - DIMacroFile: A file containing macros. Recursively process all nested
341/// macro nodes within it (avoiding duplicates by tracking visited nodes).
342void DebugInfoFinder::processMacroNode(DIMacroNode *Macro,
343 DIMacroFile *CurrentMacroFile) {
344 if (!Macro)
345 return;
346
347 if (auto *M = dyn_cast<DIMacro>(Macro)) {
348 addMacro(M, CurrentMacroFile);
349 return;
350 }
351
352 auto *MF = dyn_cast<DIMacroFile>(Macro);
353 assert(MF &&
354 "Expected a DIMacroFile (it can't be any other type at this point)");
355
356 // Check if we've already seen this macro file to avoid infinite recursion
357 if (!NodesSeen.insert(MF).second)
358 return;
359
360 // Recursively process nested macros in the macro file
361 for (auto *Element : MF->getElements())
362 processMacroNode(Element, MF);
363}
364
365void DebugInfoFinder::processScope(DIScope *Scope) {
366 if (!Scope)
367 return;
368 if (auto *Ty = dyn_cast<DIType>(Scope)) {
369 processType(Ty);
370 return;
371 }
372 if (auto *CU = dyn_cast<DICompileUnit>(Scope)) {
373 addCompileUnit(CU);
374 return;
375 }
376 if (auto *SP = dyn_cast<DISubprogram>(Scope)) {
378 return;
379 }
380 if (!addScope(Scope))
381 return;
382 if (auto *LB = dyn_cast<DILexicalBlockBase>(Scope)) {
383 processScope(LB->getScope());
384 } else if (auto *NS = dyn_cast<DINamespace>(Scope)) {
385 processScope(NS->getScope());
386 } else if (auto *M = dyn_cast<DIModule>(Scope)) {
387 processScope(M->getScope());
388 }
389}
390
392 if (!addSubprogram(SP))
393 return;
394 processScope(SP->getScope());
395 // Some of the users, e.g. CloneFunctionInto / CloneModule, need to set up a
396 // ValueMap containing identity mappings for all of the DICompileUnit's, not
397 // just DISubprogram's, referenced from anywhere within the Function being
398 // cloned prior to calling MapMetadata / RemapInstruction to avoid their
399 // duplication later as DICompileUnit's are also directly referenced by
400 // llvm.dbg.cu list. Therefore we need to collect DICompileUnit's here as
401 // well. Also, DICompileUnit's may reference DISubprogram's too and therefore
402 // need to be at least looked through.
403 processCompileUnit(SP->getUnit());
404 processType(SP->getType());
405 for (auto *Element : SP->getTemplateParams()) {
406 if (auto *TType = dyn_cast<DITemplateTypeParameter>(Element)) {
407 processType(TType->getType());
408 } else if (auto *TVal = dyn_cast<DITemplateValueParameter>(Element)) {
409 processType(TVal->getType());
410 }
411 }
412
413 SP->forEachRetainedNode(
414 [this](DILocalVariable *LV) { processVariable(LV); }, [](DILabel *L) {},
415 [this](DIImportedEntity *IE) { processImportedEntity(IE); },
416 [this](DIType *T) { processType(T); },
417 [this](auto *GVE) { return processGlobalVariableExpression(GVE); });
418}
419
421 if (!NodesSeen.insert(DV).second)
422 return;
423 processScope(DV->getScope());
424 processType(DV->getType());
425}
426
427bool DebugInfoFinder::addType(DIType *DT) {
428 if (!DT)
429 return false;
430
431 if (!NodesSeen.insert(DT).second)
432 return false;
433
434 TYs.push_back(DT);
435 return true;
436}
437
438bool DebugInfoFinder::addCompileUnit(DICompileUnit *CU) {
439 if (!CU)
440 return false;
441 if (!NodesSeen.insert(CU).second)
442 return false;
443
444 CUs.push_back(CU);
445 return true;
446}
447
448bool DebugInfoFinder::addGlobalVariable(DIGlobalVariableExpression *DIG) {
449 if (!NodesSeen.insert(DIG).second)
450 return false;
451
452 GVs.push_back(DIG);
453 return true;
454}
455
456bool DebugInfoFinder::addSubprogram(DISubprogram *SP) {
457 if (!SP)
458 return false;
459
460 if (!NodesSeen.insert(SP).second)
461 return false;
462
463 SPs.push_back(SP);
464 return true;
465}
466
467bool DebugInfoFinder::addScope(DIScope *Scope) {
468 if (!Scope)
469 return false;
470 // FIXME: Ocaml binding generates a scope with no content, we treat it
471 // as null for now.
472 if (Scope->getNumOperands() == 0)
473 return false;
474 if (!NodesSeen.insert(Scope).second)
475 return false;
476 Scopes.push_back(Scope);
477 return true;
478}
479
480bool DebugInfoFinder::addMacro(DIMacro *Macro, DIMacroFile *MacroFile) {
481 if (!Macro)
482 return false;
483
484 if (!NodesSeen.insert(Macro).second)
485 return false;
486
487 Macros.push_back(std::make_pair(Macro, MacroFile));
488 return true;
489}
490
491/// Recursively handle DILocations in followup metadata etc.
492///
493/// TODO: If for example a followup loop metadata would reference itself this
494/// function would go into infinite recursion. We do not expect such cycles in
495/// the loop metadata (except for the self-referencing first element
496/// "LoopID"). However, we could at least handle such situations more gracefully
497/// somehow (e.g. by keeping track of visited nodes and dropping metadata).
499 Metadata *MetadataIn, function_ref<Metadata *(Metadata *)> Updater) {
500 const MDTuple *M = dyn_cast_or_null<MDTuple>(MetadataIn);
501 // The loop metadata options should start with a MDString.
502 if (!M || M->getNumOperands() < 1 || !isa<MDString>(M->getOperand(0)))
503 return MetadataIn;
504
505 bool Updated = false;
506 SmallVector<Metadata *, 4> MDs{M->getOperand(0)};
507 for (Metadata *MD : llvm::drop_begin(M->operands())) {
508 if (!MD) {
509 MDs.push_back(nullptr);
510 continue;
511 }
512 Metadata *NewMD =
513 Updater(updateLoopMetadataDebugLocationsRecursive(MD, Updater));
514 if (NewMD)
515 MDs.push_back(NewMD);
516 Updated |= NewMD != MD;
517 }
518
519 assert(!M->isDistinct() && "M should not be distinct.");
520 return Updated ? MDNode::get(M->getContext(), MDs) : MetadataIn;
521}
522
524 MDNode *OrigLoopID, function_ref<Metadata *(Metadata *)> Updater) {
525 assert(OrigLoopID && OrigLoopID->getNumOperands() > 0 &&
526 "Loop ID needs at least one operand");
527 assert(OrigLoopID && OrigLoopID->getOperand(0).get() == OrigLoopID &&
528 "Loop ID should refer to itself");
529
530 // Save space for the self-referential LoopID.
531 SmallVector<Metadata *, 4> MDs = {nullptr};
532
533 for (Metadata *MD : llvm::drop_begin(OrigLoopID->operands())) {
534 if (!MD)
535 MDs.push_back(nullptr);
536 else if (Metadata *NewMD = Updater(
538 MDs.push_back(NewMD);
539 }
540
541 MDNode *NewLoopID = MDNode::getDistinct(OrigLoopID->getContext(), MDs);
542 // Insert the self-referential LoopID.
543 NewLoopID->replaceOperandWith(0, NewLoopID);
544 return NewLoopID;
545}
546
548 Instruction &I, function_ref<Metadata *(Metadata *)> Updater) {
549 MDNode *OrigLoopID = I.getMetadata(LLVMContext::MD_loop);
550 if (!OrigLoopID)
551 return;
552 MDNode *NewLoopID = updateLoopMetadataDebugLocationsImpl(OrigLoopID, Updater);
553 I.setMetadata(LLVMContext::MD_loop, NewLoopID);
554}
555
556/// Return true if a node is a DILocation or if a DILocation is
557/// indirectly referenced by one of the node's children.
560 Metadata *MD) {
562 if (!N)
563 return false;
564 if (isa<DILocation>(N) || Reachable.count(N))
565 return true;
566 if (!Visited.insert(N).second)
567 return false;
568 for (auto &OpIt : N->operands()) {
569 Metadata *Op = OpIt.get();
570 if (isDILocationReachable(Visited, Reachable, Op)) {
571 // Don't return just yet as we want to visit all MD's children to
572 // initialize DILocationReachable in stripDebugLocFromLoopID
573 Reachable.insert(N);
574 }
575 }
576 return Reachable.count(N);
577}
578
580 SmallPtrSetImpl<Metadata *> &AllDILocation,
581 const SmallPtrSetImpl<Metadata *> &DIReachable,
582 Metadata *MD) {
584 if (!N)
585 return false;
586 if (isa<DILocation>(N) || AllDILocation.count(N))
587 return true;
588 if (!DIReachable.count(N))
589 return false;
590 if (!Visited.insert(N).second)
591 return false;
592 for (auto &OpIt : N->operands()) {
593 Metadata *Op = OpIt.get();
594 if (Op == MD)
595 continue;
596 if (!isAllDILocation(Visited, AllDILocation, DIReachable, Op)) {
597 return false;
598 }
599 }
600 AllDILocation.insert(N);
601 return true;
602}
603
604static Metadata *
606 const SmallPtrSetImpl<Metadata *> &DIReachable, Metadata *MD) {
607 if (isa<DILocation>(MD) || AllDILocation.count(MD))
608 return nullptr;
609
610 if (!DIReachable.count(MD))
611 return MD;
612
614 if (!N)
615 return MD;
616
618 bool HasSelfRef = false;
619 for (unsigned i = 0; i < N->getNumOperands(); ++i) {
620 Metadata *A = N->getOperand(i);
621 if (!A) {
622 Args.push_back(nullptr);
623 } else if (A == MD) {
624 assert(i == 0 && "expected i==0 for self-reference");
625 HasSelfRef = true;
626 Args.push_back(nullptr);
627 } else if (Metadata *NewArg =
628 stripLoopMDLoc(AllDILocation, DIReachable, A)) {
629 Args.push_back(NewArg);
630 }
631 }
632 if (Args.empty() || (HasSelfRef && Args.size() == 1))
633 return nullptr;
634
635 MDNode *NewMD = N->isDistinct() ? MDNode::getDistinct(N->getContext(), Args)
636 : MDNode::get(N->getContext(), Args);
637 if (HasSelfRef)
638 NewMD->replaceOperandWith(0, NewMD);
639 return NewMD;
640}
641
643 assert(!N->operands().empty() && "Missing self reference?");
644 SmallPtrSet<Metadata *, 8> Visited, DILocationReachable, AllDILocation;
645 // If we already visited N, there is nothing to do.
646 if (!Visited.insert(N).second)
647 return N;
648
649 // If there is no debug location, we do not have to rewrite this
650 // MDNode. This loop also initializes DILocationReachable, later
651 // needed by updateLoopMetadataDebugLocationsImpl; the use of
652 // count_if avoids an early exit.
653 if (!llvm::count_if(llvm::drop_begin(N->operands()),
654 [&Visited, &DILocationReachable](const MDOperand &Op) {
655 return isDILocationReachable(
656 Visited, DILocationReachable, Op.get());
657 }))
658 return N;
659
660 Visited.clear();
661 // If there is only the debug location without any actual loop metadata, we
662 // can remove the metadata.
663 if (llvm::all_of(llvm::drop_begin(N->operands()),
664 [&Visited, &AllDILocation,
665 &DILocationReachable](const MDOperand &Op) {
666 return isAllDILocation(Visited, AllDILocation,
667 DILocationReachable, Op.get());
668 }))
669 return nullptr;
670
672 N, [&AllDILocation, &DILocationReachable](Metadata *MD) -> Metadata * {
673 return stripLoopMDLoc(AllDILocation, DILocationReachable, MD);
674 });
675}
676
678 bool Changed = false;
679 if (F.hasMetadata(LLVMContext::MD_dbg)) {
680 Changed = true;
681 F.setSubprogram(nullptr);
682 }
683
685 for (BasicBlock &BB : F) {
687 if (I.getDebugLoc()) {
688 Changed = true;
689 I.setDebugLoc(DebugLoc());
690 }
691 if (auto *LoopID = I.getMetadata(LLVMContext::MD_loop)) {
692 auto *NewLoopID = LoopIDsMap.lookup(LoopID);
693 if (!NewLoopID)
694 NewLoopID = LoopIDsMap[LoopID] = stripDebugLocFromLoopID(LoopID);
695 if (NewLoopID != LoopID)
696 I.setMetadata(LLVMContext::MD_loop, NewLoopID);
697 }
698 // Strip other attachments that are or use debug info.
699 if (I.hasMetadataOtherThanDebugLoc()) {
700 // Heapallocsites point into the DIType system.
701 I.setMetadata("heapallocsite", nullptr);
702 // DIAssignID are debug info metadata primitives.
703 I.setMetadata(LLVMContext::MD_DIAssignID, nullptr);
704 }
705 I.dropDbgRecords();
706 }
707 }
708 return Changed;
709}
710
712 llvm::TimeTraceScope timeScope("Strip debug info");
713 bool Changed = false;
714
715 for (NamedMDNode &NMD : llvm::make_early_inc_range(M.named_metadata())) {
716 // We're stripping debug info, and without them, coverage information
717 // doesn't quite make sense.
718 if (NMD.getName().starts_with("llvm.dbg.") ||
719 NMD.getName() == "llvm.gcov") {
720 NMD.eraseFromParent();
721 Changed = true;
722 }
723 }
724
725 for (Function &F : M)
727
728 for (auto &GV : M.globals()) {
729 Changed |= GV.eraseMetadata(LLVMContext::MD_dbg);
730 }
731
732 if (GVMaterializer *Materializer = M.getMaterializer())
733 Materializer->setStripDebugInfo();
734
735 return Changed;
736}
737
738namespace {
739
740/// Helper class to downgrade -g metadata to -gline-tables-only metadata.
741class DebugTypeInfoRemoval {
743
744public:
745 /// The (void)() type.
746 MDNode *EmptySubroutineType;
747
748private:
749 /// Remember what linkage name we originally had before stripping. If we end
750 /// up making two subprograms identical who originally had different linkage
751 /// names, then we need to make one of them distinct, to avoid them getting
752 /// uniqued. Maps the new node to the old linkage name.
754
755 // TODO: Remember the distinct subprogram we created for a given linkage name,
756 // so that we can continue to unique whenever possible. Map <newly created
757 // node, old linkage name> to the first (possibly distinct) mdsubprogram
758 // created for that combination. This is not strictly needed for correctness,
759 // but can cut down on the number of MDNodes and let us diff cleanly with the
760 // output of -gline-tables-only.
761
762public:
763 DebugTypeInfoRemoval(LLVMContext &C)
764 : EmptySubroutineType(DISubroutineType::get(C, DINode::FlagZero, 0,
765 MDNode::get(C, {}))) {}
766
767 Metadata *map(Metadata *M) {
768 if (!M)
769 return nullptr;
770 auto Replacement = Replacements.find(M);
771 if (Replacement != Replacements.end())
772 return Replacement->second;
773
774 return M;
775 }
776 MDNode *mapNode(Metadata *N) { return dyn_cast_or_null<MDNode>(map(N)); }
777
778 /// Recursively remap N and all its referenced children. Does a DF post-order
779 /// traversal, so as to remap bottoms up.
780 void traverseAndRemap(MDNode *N) { traverse(N); }
781
782private:
783 // Create a new DISubprogram, to replace the one given.
784 DISubprogram *getReplacementSubprogram(DISubprogram *MDS) {
785 auto *FileAndScope = cast_or_null<DIFile>(map(MDS->getFile()));
786 DISubprogram *Declaration = nullptr;
787 auto *Type = cast_or_null<DISubroutineType>(map(MDS->getType()));
788 DIType *ContainingType =
789 cast_or_null<DIType>(map(MDS->getContainingType()));
790 auto *Unit = cast_or_null<DICompileUnit>(map(MDS->getUnit()));
791 auto Variables = nullptr;
792 auto TemplateParams = nullptr;
793 // Keep linkage names for profiling CUs, as -gline-tables-only does.
794 StringRef LinkageName;
795 if (MDS->getName().empty() || (Unit && Unit->getDebugInfoForProfiling()))
796 LinkageName = MDS->getLinkageName();
797
798 // Make a distinct DISubprogram, for situations that warrant it.
799 auto distinctMDSubprogram = [&]() {
800 return DISubprogram::getDistinct(
801 MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
802 FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(),
803 ContainingType, MDS->getVirtualIndex(), MDS->getThisAdjustment(),
804 MDS->getFlags(), MDS->getSPFlags(), Unit, TemplateParams, Declaration,
805 Variables);
806 };
807
808 if (MDS->isDistinct())
809 return distinctMDSubprogram();
810
811 auto *NewMDS = DISubprogram::get(
812 MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
813 FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(), ContainingType,
814 MDS->getVirtualIndex(), MDS->getThisAdjustment(), MDS->getFlags(),
815 MDS->getSPFlags(), Unit, TemplateParams, Declaration, Variables);
816
817 StringRef OldLinkageName = MDS->getLinkageName();
818
819 // See if we need to make a distinct one.
820 auto OrigLinkage = NewToLinkageName.find(NewMDS);
821 if (OrigLinkage != NewToLinkageName.end()) {
822 if (OrigLinkage->second == OldLinkageName)
823 // We're good.
824 return NewMDS;
825
826 // Otherwise, need to make a distinct one.
827 // TODO: Query the map to see if we already have one.
828 return distinctMDSubprogram();
829 }
830
831 NewToLinkageName.insert({NewMDS, MDS->getLinkageName()});
832 return NewMDS;
833 }
834
835 /// Create a new compile unit, to replace the one given
836 DICompileUnit *getReplacementCU(DICompileUnit *CU) {
837 // Drop skeleton CUs.
838 if (CU->getDWOId())
839 return nullptr;
840
841 auto *File = cast_or_null<DIFile>(map(CU->getFile()));
842 MDTuple *EnumTypes = nullptr;
843 MDTuple *RetainedTypes = nullptr;
844 MDTuple *GlobalVariables = nullptr;
845 MDTuple *ImportedEntities = nullptr;
846 return DICompileUnit::getDistinct(
847 CU->getContext(), CU->getSourceLanguage(), File, CU->getProducer(),
848 CU->isOptimized(), CU->getFlags(), CU->getRuntimeVersion(),
850 RetainedTypes, GlobalVariables, ImportedEntities, CU->getMacros(),
851 CU->getDWOId(), CU->getSplitDebugInlining(),
853 CU->getRangesBaseAddress(), CU->getSysRoot(), CU->getSDK());
854 }
855
856 DILocation *getReplacementMDLocation(DILocation *MLD) {
857 auto *Scope = map(MLD->getScope());
858 auto *InlinedAt = map(MLD->getInlinedAt());
859 if (MLD->isDistinct())
860 return DILocation::getDistinct(MLD->getContext(), MLD->getLine(),
861 MLD->getColumn(), Scope, InlinedAt);
862 return DILocation::get(MLD->getContext(), MLD->getLine(), MLD->getColumn(),
863 Scope, InlinedAt);
864 }
865
866 /// Create a new generic MDNode, to replace the one given
867 MDNode *getReplacementMDNode(MDNode *N) {
869 Ops.reserve(N->getNumOperands());
870 for (auto &I : N->operands())
871 if (I)
872 Ops.push_back(map(I));
873 auto *Ret = MDNode::get(N->getContext(), Ops);
874 return Ret;
875 }
876
877 /// Attempt to re-map N to a newly created node.
878 void remap(MDNode *N) {
879 if (Replacements.count(N))
880 return;
881
882 auto doRemap = [&](MDNode *N) -> MDNode * {
883 if (!N)
884 return nullptr;
885 if (auto *MDSub = dyn_cast<DISubprogram>(N)) {
886 remap(MDSub->getUnit());
887 return getReplacementSubprogram(MDSub);
888 }
890 return EmptySubroutineType;
891 if (auto *CU = dyn_cast<DICompileUnit>(N))
892 return getReplacementCU(CU);
893 if (isa<DIFile>(N))
894 return N;
895 if (auto *MDLB = dyn_cast<DILexicalBlockBase>(N))
896 // Remap to our referenced scope (recursively).
897 return mapNode(MDLB->getScope());
898 if (auto *MLD = dyn_cast<DILocation>(N))
899 return getReplacementMDLocation(MLD);
900
901 // Otherwise, if we see these, just drop them now. Not strictly necessary,
902 // but this speeds things up a little.
903 if (isa<DINode>(N))
904 return nullptr;
905
906 return getReplacementMDNode(N);
907 };
908 // Separate recursive doRemap and operator [] into 2 lines to avoid
909 // out-of-order evaluations since both of them can access the same memory
910 // location in map Replacements.
911 auto Value = doRemap(N);
912 Replacements[N] = Value;
913 }
914
915 /// Do the remapping traversal.
916 void traverse(MDNode *);
917};
918
919} // end anonymous namespace
920
921void DebugTypeInfoRemoval::traverse(MDNode *N) {
922 if (!N || Replacements.count(N))
923 return;
924
925 // To avoid cycles, as well as for efficiency sake, we will sometimes prune
926 // parts of the graph.
927 auto prune = [](MDNode *Parent, MDNode *Child) {
928 if (auto *MDS = dyn_cast<DISubprogram>(Parent))
929 return Child == MDS->getRetainedNodes().get();
930 return false;
931 };
932
934 DenseSet<MDNode *> Opened;
935
936 // Visit each node starting at N in post order, and map them.
937 ToVisit.push_back(N);
938 while (!ToVisit.empty()) {
939 auto *N = ToVisit.back();
940 if (!Opened.insert(N).second) {
941 // Close it.
942 remap(N);
943 ToVisit.pop_back();
944 continue;
945 }
946 for (auto &I : N->operands())
947 if (auto *MDN = dyn_cast_or_null<MDNode>(I))
948 if (!Opened.count(MDN) && !Replacements.count(MDN) && !prune(N, MDN) &&
949 !isa<DICompileUnit>(MDN))
950 ToVisit.push_back(MDN);
951 }
952}
953
955 bool Changed = false;
956
957 // Delete non-CU debug info named metadata nodes.
958 for (auto NMI = M.named_metadata_begin(), NME = M.named_metadata_end();
959 NMI != NME;) {
960 NamedMDNode *NMD = &*NMI;
961 ++NMI;
962 // Specifically keep dbg.cu around.
963 if (NMD->getName() == "llvm.dbg.cu")
964 continue;
965 }
966
967 // Drop all dbg attachments from global variables.
968 for (auto &GV : M.globals())
969 GV.eraseMetadata(LLVMContext::MD_dbg);
970
971 DebugTypeInfoRemoval Mapper(M.getContext());
972 auto remap = [&](MDNode *Node) -> MDNode * {
973 if (!Node)
974 return nullptr;
975 Mapper.traverseAndRemap(Node);
976 auto *NewNode = Mapper.mapNode(Node);
977 Changed |= Node != NewNode;
978 Node = NewNode;
979 return NewNode;
980 };
981
982 // Rewrite the DebugLocs to be equivalent to what
983 // -gline-tables-only would have created.
984 for (auto &F : M) {
985 if (auto *SP = F.getSubprogram()) {
986 Mapper.traverseAndRemap(SP);
987 auto *NewSP = cast<DISubprogram>(Mapper.mapNode(SP));
988 Changed |= SP != NewSP;
989 F.setSubprogram(NewSP);
990 }
991 for (auto &BB : F) {
992 for (auto &I : BB) {
993 auto remapDebugLoc = [&](const DebugLoc &DL) -> DebugLoc {
994 auto *Scope = DL.getScope();
995 MDNode *InlinedAt = DL.getInlinedAt();
996 Scope = remap(Scope);
997 InlinedAt = remap(InlinedAt);
998 return DILocation::get(M.getContext(), DL.getLine(), DL.getCol(),
999 Scope, InlinedAt);
1000 };
1001
1002 if (I.getDebugLoc() != DebugLoc())
1003 I.setDebugLoc(remapDebugLoc(I.getDebugLoc()));
1004
1005 // Remap DILocations in llvm.loop attachments.
1007 if (auto *Loc = dyn_cast_or_null<DILocation>(MD))
1008 return remapDebugLoc(Loc).get();
1009 return MD;
1010 });
1011
1012 // Strip heapallocsite attachments, they point into the DIType system.
1013 if (I.hasMetadataOtherThanDebugLoc())
1014 I.setMetadata("heapallocsite", nullptr);
1015
1016 // Strip any DbgRecords attached.
1017 I.dropDbgRecords();
1018 }
1019 }
1020 }
1021
1022 // Create a new llvm.dbg.cu, which is equivalent to the one
1023 // -gline-tables-only would have created.
1024 for (auto &NMD : M.named_metadata()) {
1026 for (MDNode *Op : NMD.operands())
1027 Ops.push_back(remap(Op));
1028
1029 if (!Changed)
1030 continue;
1031
1032 NMD.clearOperands();
1033 for (auto *Op : Ops)
1034 if (Op)
1035 NMD.addOperand(Op);
1036 }
1037 return Changed;
1038}
1039
1042 M.getModuleFlag("Debug Info Version")))
1043 return Val->getZExtValue();
1044 return 0;
1045}
1046
1050
1052 ArrayRef<const Instruction *> SourceInstructions) {
1053 // Replace all uses (and attachments) of all the DIAssignIDs
1054 // on SourceInstructions with a single merged value.
1055 assert(getFunction() && "Uninserted instruction merged");
1056 // Collect up the DIAssignID tags.
1058 for (const Instruction *I : SourceInstructions) {
1059 if (auto *MD = I->getMetadata(LLVMContext::MD_DIAssignID))
1060 IDs.push_back(cast<DIAssignID>(MD));
1061 assert(getFunction() == I->getFunction() &&
1062 "Merging with instruction from another function not allowed");
1063 }
1064
1065 // Add this instruction's DIAssignID too, if it has one.
1066 if (auto *MD = getMetadata(LLVMContext::MD_DIAssignID))
1067 IDs.push_back(cast<DIAssignID>(MD));
1068
1069 if (IDs.empty())
1070 return; // No DIAssignID tags to process.
1071
1072 DIAssignID *MergeID = IDs[0];
1073 for (DIAssignID *AssignID : drop_begin(IDs)) {
1074 if (AssignID != MergeID)
1075 at::RAUW(AssignID, MergeID);
1076 }
1077 setMetadata(LLVMContext::MD_DIAssignID, MergeID);
1078}
1079
1081
1083 const DebugLoc &DL = getDebugLoc();
1084 if (!DL) {
1086 return;
1087 }
1088
1089 // If this isn't a call, drop the location to allow a location from a
1090 // preceding instruction to propagate.
1091 bool MayLowerToCall = false;
1092 if (isa<CallBase>(this)) {
1093 auto *II = dyn_cast<IntrinsicInst>(this);
1094 MayLowerToCall =
1095 !II || IntrinsicInst::mayLowerToFunctionCall(II->getIntrinsicID());
1096 }
1097
1098 if (!MayLowerToCall) {
1100 return;
1101 }
1102
1103 // Set a line 0 location for calls to preserve scope information in case
1104 // inlining occurs.
1106 if (SP)
1107 // If a function scope is available, set it on the line 0 location. When
1108 // hoisting a call to a predecessor block, using the function scope avoids
1109 // making it look like the callee was reached earlier than it should be.
1111 else
1112 // The parent function has no scope. Go ahead and drop the location. If
1113 // the parent function is inlined, and the callee has a subprogram, the
1114 // inliner will attach a location to the call.
1115 //
1116 // One alternative is to set a line 0 location with the existing scope and
1117 // inlinedAt info. The location might be sensitive to when inlining occurs.
1119}
1120
1121//===----------------------------------------------------------------------===//
1122// LLVM C API implementations.
1123//===----------------------------------------------------------------------===//
1124
1126 switch (lang) {
1127#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \
1128 case LLVMDWARFSourceLanguage##NAME: \
1129 return ID;
1130#include "llvm/BinaryFormat/Dwarf.def"
1131#undef HANDLE_DW_LANG
1132 }
1133 llvm_unreachable("Unhandled Tag");
1134}
1135
1136template <typename DIT> DIT *unwrapDI(LLVMMetadataRef Ref) {
1137 return (DIT *)(Ref ? unwrap<MDNode>(Ref) : nullptr);
1138}
1139
1141 return static_cast<DINode::DIFlags>(Flags);
1142}
1143
1145 return static_cast<LLVMDIFlags>(Flags);
1146}
1147
1149pack_into_DISPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized) {
1150 return DISubprogram::toSPFlags(IsLocalToUnit, IsDefinition, IsOptimized);
1151}
1152
1155}
1156
1160
1164
1168
1172
1174 delete unwrap(Builder);
1175}
1176
1178 unwrap(Builder)->finalize();
1179}
1180
1182 LLVMMetadataRef subprogram) {
1183 unwrap(Builder)->finalizeSubprogram(unwrapDI<DISubprogram>(subprogram));
1184}
1185
1188 LLVMMetadataRef FileRef, const char *Producer, size_t ProducerLen,
1189 LLVMBool isOptimized, const char *Flags, size_t FlagsLen,
1190 unsigned RuntimeVer, const char *SplitName, size_t SplitNameLen,
1191 LLVMDWARFEmissionKind Kind, unsigned DWOId, LLVMBool SplitDebugInlining,
1192 LLVMBool DebugInfoForProfiling, const char *SysRoot, size_t SysRootLen,
1193 const char *SDK, size_t SDKLen) {
1194 auto File = unwrapDI<DIFile>(FileRef);
1195
1196 return wrap(unwrap(Builder)->createCompileUnit(
1198 StringRef(Producer, ProducerLen), isOptimized, StringRef(Flags, FlagsLen),
1199 RuntimeVer, StringRef(SplitName, SplitNameLen),
1200 static_cast<DICompileUnit::DebugEmissionKind>(Kind), DWOId,
1201 SplitDebugInlining, DebugInfoForProfiling,
1203 StringRef(SysRoot, SysRootLen), StringRef(SDK, SDKLen)));
1204}
1205
1208 size_t FilenameLen, const char *Directory,
1209 size_t DirectoryLen) {
1210 return wrap(unwrap(Builder)->createFile(StringRef(Filename, FilenameLen),
1211 StringRef(Directory, DirectoryLen)));
1212}
1213
1216 switch (CSKind) {
1218 return llvm::DIFile::CSK_MD5;
1223 }
1224 llvm_unreachable("Unhandled Checksum Kind");
1225}
1226
1228 LLVMDIBuilderRef Builder, const char *Filename, size_t FilenameLen,
1229 const char *Directory, size_t DirectoryLen, LLVMChecksumKind ChecksumKind,
1230 const char *Checksum, size_t ChecksumLen, const char *Source,
1231 size_t SourceLen) {
1232 StringRef ChkSum = StringRef(Checksum, ChecksumLen);
1233 auto CSK = map_from_llvmChecksumKind(ChecksumKind);
1234 llvm::DIFile::ChecksumInfo<StringRef> CSInfo(CSK, ChkSum);
1235 std::optional<StringRef> Src;
1236 if (SourceLen > 0)
1237 Src = StringRef(Source, SourceLen);
1238 return wrap(unwrap(Builder)->createFile(StringRef(Filename, FilenameLen),
1239 StringRef(Directory, DirectoryLen),
1240 CSInfo, Src));
1241}
1242
1245 const char *Name, size_t NameLen,
1246 const char *ConfigMacros, size_t ConfigMacrosLen,
1247 const char *IncludePath, size_t IncludePathLen,
1248 const char *APINotesFile, size_t APINotesFileLen) {
1249 return wrap(unwrap(Builder)->createModule(
1250 unwrapDI<DIScope>(ParentScope), StringRef(Name, NameLen),
1251 StringRef(ConfigMacros, ConfigMacrosLen),
1252 StringRef(IncludePath, IncludePathLen),
1253 StringRef(APINotesFile, APINotesFileLen)));
1254}
1255
1257 LLVMMetadataRef ParentScope,
1258 const char *Name, size_t NameLen,
1259 LLVMBool ExportSymbols) {
1260 return wrap(unwrap(Builder)->createNameSpace(
1261 unwrapDI<DIScope>(ParentScope), StringRef(Name, NameLen), ExportSymbols));
1262}
1263
1265 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1266 size_t NameLen, const char *LinkageName, size_t LinkageNameLen,
1267 LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1268 LLVMBool IsLocalToUnit, LLVMBool IsDefinition,
1269 unsigned ScopeLine, LLVMDIFlags Flags, LLVMBool IsOptimized) {
1270 return wrap(unwrap(Builder)->createFunction(
1271 unwrapDI<DIScope>(Scope), {Name, NameLen}, {LinkageName, LinkageNameLen},
1272 unwrapDI<DIFile>(File), LineNo, unwrapDI<DISubroutineType>(Ty), ScopeLine,
1273 map_from_llvmDIFlags(Flags),
1274 pack_into_DISPFlags(IsLocalToUnit, IsDefinition, IsOptimized), nullptr,
1275 nullptr, nullptr));
1276}
1277
1278
1280 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope,
1281 LLVMMetadataRef File, unsigned Line, unsigned Col) {
1282 return wrap(unwrap(Builder)->createLexicalBlock(unwrapDI<DIScope>(Scope),
1283 unwrapDI<DIFile>(File),
1284 Line, Col));
1285}
1286
1289 LLVMMetadataRef Scope,
1290 LLVMMetadataRef File,
1291 unsigned Discriminator) {
1292 return wrap(unwrap(Builder)->createLexicalBlockFile(unwrapDI<DIScope>(Scope),
1293 unwrapDI<DIFile>(File),
1294 Discriminator));
1295}
1296
1299 LLVMMetadataRef Scope,
1300 LLVMMetadataRef NS,
1301 LLVMMetadataRef File,
1302 unsigned Line) {
1303 return wrap(unwrap(Builder)->createImportedModule(unwrapDI<DIScope>(Scope),
1305 unwrapDI<DIFile>(File),
1306 Line));
1307}
1308
1310 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope,
1311 LLVMMetadataRef ImportedEntity, LLVMMetadataRef File, unsigned Line,
1312 LLVMMetadataRef *Elements, unsigned NumElements) {
1313 auto Elts =
1314 (NumElements > 0)
1315 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1316 : nullptr;
1317 return wrap(unwrap(Builder)->createImportedModule(
1318 unwrapDI<DIScope>(Scope), unwrapDI<DIImportedEntity>(ImportedEntity),
1319 unwrapDI<DIFile>(File), Line, Elts));
1320}
1321
1324 LLVMMetadataRef File, unsigned Line, LLVMMetadataRef *Elements,
1325 unsigned NumElements) {
1326 auto Elts =
1327 (NumElements > 0)
1328 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1329 : nullptr;
1330 return wrap(unwrap(Builder)->createImportedModule(
1332 Line, Elts));
1333}
1334
1337 LLVMMetadataRef File, unsigned Line, const char *Name, size_t NameLen,
1338 LLVMMetadataRef *Elements, unsigned NumElements) {
1339 auto Elts =
1340 (NumElements > 0)
1341 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1342 : nullptr;
1343 return wrap(unwrap(Builder)->createImportedDeclaration(
1345 Line, {Name, NameLen}, Elts));
1346}
1347
1350 unsigned Column, LLVMMetadataRef Scope,
1351 LLVMMetadataRef InlinedAt) {
1352 return wrap(DILocation::get(*unwrap(Ctx), Line, Column, unwrap(Scope),
1353 unwrap(InlinedAt)));
1354}
1355
1357 return unwrapDI<DILocation>(Location)->getLine();
1358}
1359
1361 return unwrapDI<DILocation>(Location)->getColumn();
1362}
1363
1367
1369 return wrap(unwrapDI<DILocation>(Location)->getInlinedAt());
1370}
1371
1373 return wrap(unwrapDI<DIScope>(Scope)->getFile());
1374}
1375
1376const char *LLVMDIFileGetDirectory(LLVMMetadataRef File, unsigned *Len) {
1377 auto Dir = unwrapDI<DIFile>(File)->getDirectory();
1378 *Len = Dir.size();
1379 return Dir.data();
1380}
1381
1382const char *LLVMDIFileGetFilename(LLVMMetadataRef File, unsigned *Len) {
1383 auto Name = unwrapDI<DIFile>(File)->getFilename();
1384 *Len = Name.size();
1385 return Name.data();
1386}
1387
1388const char *LLVMDIFileGetSource(LLVMMetadataRef File, unsigned *Len) {
1389 if (auto Src = unwrapDI<DIFile>(File)->getSource()) {
1390 *Len = Src->size();
1391 return Src->data();
1392 }
1393 *Len = 0;
1394 return "";
1395}
1396
1398 LLVMMetadataRef ParentMacroFile,
1399 unsigned Line,
1401 const char *Name, size_t NameLen,
1402 const char *Value, size_t ValueLen) {
1403 return wrap(
1404 unwrap(Builder)->createMacro(unwrapDI<DIMacroFile>(ParentMacroFile), Line,
1405 static_cast<MacinfoRecordType>(RecordType),
1406 {Name, NameLen}, {Value, ValueLen}));
1407}
1408
1411 LLVMMetadataRef ParentMacroFile, unsigned Line,
1412 LLVMMetadataRef File) {
1413 return wrap(unwrap(Builder)->createTempMacroFile(
1414 unwrapDI<DIMacroFile>(ParentMacroFile), Line, unwrapDI<DIFile>(File)));
1415}
1416
1418 const char *Name, size_t NameLen,
1419 int64_t Value,
1420 LLVMBool IsUnsigned) {
1421 return wrap(unwrap(Builder)->createEnumerator({Name, NameLen}, Value,
1422 IsUnsigned != 0));
1423}
1424
1426 LLVMDIBuilderRef Builder, const char *Name, size_t NameLen,
1427 uint64_t SizeInBits, const uint64_t Words[], LLVMBool IsUnsigned) {
1428 uint64_t NumWords = (SizeInBits + 63) / 64;
1429 return wrap(unwrap(Builder)->createEnumerator(
1430 {Name, NameLen},
1431 APSInt(APInt(SizeInBits, ArrayRef(Words, NumWords)), IsUnsigned != 0)));
1432}
1433
1435 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1436 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1437 uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef *Elements,
1438 unsigned NumElements, LLVMMetadataRef ClassTy) {
1439auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1440 NumElements});
1441return wrap(unwrap(Builder)->createEnumerationType(
1442 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1443 LineNumber, SizeInBits, AlignInBits, Elts, unwrapDI<DIType>(ClassTy)));
1444}
1445
1447 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1448 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1449 uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef BaseTy) {
1450 return wrap(unwrap(Builder)->createSetType(
1451 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1452 LineNumber, SizeInBits, AlignInBits, unwrapDI<DIType>(BaseTy)));
1453}
1454
1456 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1457 size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t SizeInBits,
1458 uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef BaseTy,
1459 LLVMMetadataRef LowerBound, LLVMMetadataRef UpperBound,
1460 LLVMMetadataRef Stride, LLVMMetadataRef Bias) {
1461 return wrap(unwrap(Builder)->createSubrangeType(
1462 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, unwrapDI<DIScope>(Scope),
1463 SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1464 unwrapDI<DIType>(BaseTy), unwrap(LowerBound), unwrap(UpperBound),
1465 unwrap(Stride), unwrap(Bias)));
1466}
1467
1468/// MD may be nullptr, a DIExpression or DIVariable.
1470 if (!MD)
1471 return nullptr;
1472 MDNode *MDN = unwrapDI<MDNode>(MD);
1473 if (auto *E = dyn_cast<DIExpression>(MDN))
1474 return E;
1475 assert(isa<DIVariable>(MDN) && "Expected DIExpression or DIVariable");
1476 return cast<DIVariable>(MDN);
1477}
1478
1480 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1481 size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t Size,
1482 uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts,
1483 unsigned NumSubscripts, LLVMMetadataRef DataLocation,
1484 LLVMMetadataRef Associated, LLVMMetadataRef Allocated, LLVMMetadataRef Rank,
1485 LLVMMetadataRef BitStride) {
1486 auto Subs =
1487 unwrap(Builder)->getOrCreateArray({unwrap(Subscripts), NumSubscripts});
1488 return wrap(unwrap(Builder)->createArrayType(
1489 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1490 Size, AlignInBits, unwrapDI<DIType>(Ty), Subs,
1491 unwrapExprVar(DataLocation), unwrapExprVar(Associated),
1492 unwrapExprVar(Allocated), unwrapExprVar(Rank), unwrap(BitStride)));
1493}
1494
1496 LLVMMetadataRef *Elements, unsigned NumElements) {
1497 auto CT = unwrap<DICompositeType>(*T);
1498 auto Elts =
1499 unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements});
1500 unwrap(Builder)->replaceArrays(CT, Elts);
1501}
1502
1504 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1505 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1506 uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags,
1507 LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang,
1508 const char *UniqueId, size_t UniqueIdLen) {
1509 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1510 NumElements});
1511 return wrap(unwrap(Builder)->createUnionType(
1512 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1513 LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1514 Elts, RunTimeLang, {UniqueId, UniqueIdLen}));
1515}
1516
1517
1520 uint32_t AlignInBits, LLVMMetadataRef Ty,
1521 LLVMMetadataRef *Subscripts,
1522 unsigned NumSubscripts) {
1523 auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts),
1524 NumSubscripts});
1525 return wrap(unwrap(Builder)->createArrayType(Size, AlignInBits,
1526 unwrapDI<DIType>(Ty), Subs));
1527}
1528
1531 uint32_t AlignInBits, LLVMMetadataRef Ty,
1532 LLVMMetadataRef *Subscripts,
1533 unsigned NumSubscripts) {
1534 auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts),
1535 NumSubscripts});
1536 return wrap(unwrap(Builder)->createVectorType(Size, AlignInBits,
1537 unwrapDI<DIType>(Ty), Subs));
1538}
1539
1542 size_t NameLen, uint64_t SizeInBits,
1543 LLVMDWARFTypeEncoding Encoding,
1544 LLVMDIFlags Flags) {
1545 return wrap(unwrap(Builder)->createBasicType({Name, NameLen},
1546 SizeInBits, Encoding,
1547 map_from_llvmDIFlags(Flags)));
1548}
1549
1551 LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeTy,
1552 uint64_t SizeInBits, uint32_t AlignInBits, unsigned AddressSpace,
1553 const char *Name, size_t NameLen) {
1554 return wrap(unwrap(Builder)->createPointerType(
1555 unwrapDI<DIType>(PointeeTy), SizeInBits, AlignInBits, AddressSpace,
1556 {Name, NameLen}));
1557}
1558
1560 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1561 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1562 uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags,
1563 LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements,
1564 unsigned NumElements, unsigned RunTimeLang, LLVMMetadataRef VTableHolder,
1565 const char *UniqueId, size_t UniqueIdLen) {
1566 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1567 NumElements});
1568 return wrap(unwrap(Builder)->createStructType(
1569 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1570 LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1571 unwrapDI<DIType>(DerivedFrom), Elts, RunTimeLang,
1572 unwrapDI<DIType>(VTableHolder), {UniqueId, UniqueIdLen}));
1573}
1574
1576 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1577 size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits,
1578 uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags,
1579 LLVMMetadataRef Ty) {
1580 return wrap(unwrap(Builder)->createMemberType(unwrapDI<DIScope>(Scope),
1581 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, SizeInBits, AlignInBits,
1582 OffsetInBits, map_from_llvmDIFlags(Flags), unwrapDI<DIType>(Ty)));
1583}
1584
1587 size_t NameLen) {
1588 return wrap(unwrap(Builder)->createUnspecifiedType({Name, NameLen}));
1589}
1590
1592 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1593 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1594 LLVMMetadataRef Type, LLVMDIFlags Flags, LLVMValueRef ConstantVal,
1595 uint32_t AlignInBits) {
1596 return wrap(unwrap(Builder)->createStaticMemberType(
1597 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1598 LineNumber, unwrapDI<DIType>(Type), map_from_llvmDIFlags(Flags),
1599 unwrap<Constant>(ConstantVal), DW_TAG_member, AlignInBits));
1600}
1601
1604 const char *Name, size_t NameLen,
1605 LLVMMetadataRef File, unsigned LineNo,
1606 uint64_t SizeInBits, uint32_t AlignInBits,
1607 uint64_t OffsetInBits, LLVMDIFlags Flags,
1608 LLVMMetadataRef Ty, LLVMMetadataRef PropertyNode) {
1609 return wrap(unwrap(Builder)->createObjCIVar(
1610 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1611 SizeInBits, AlignInBits, OffsetInBits,
1613 unwrapDI<MDNode>(PropertyNode)));
1614}
1615
1618 const char *Name, size_t NameLen,
1619 LLVMMetadataRef File, unsigned LineNo,
1620 const char *GetterName, size_t GetterNameLen,
1621 const char *SetterName, size_t SetterNameLen,
1622 unsigned PropertyAttributes,
1623 LLVMMetadataRef Ty) {
1624 return wrap(unwrap(Builder)->createObjCProperty(
1625 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1626 {GetterName, GetterNameLen}, {SetterName, SetterNameLen},
1627 PropertyAttributes, unwrapDI<DIType>(Ty)));
1628}
1629
1633 return wrap(unwrap(Builder)->createObjectPointerType(unwrapDI<DIType>(Type),
1634 Implicit));
1635}
1636
1639 const char *Name, size_t NameLen,
1640 LLVMMetadataRef File, unsigned LineNo,
1641 LLVMMetadataRef Scope, uint32_t AlignInBits) {
1642 return wrap(unwrap(Builder)->createTypedef(
1643 unwrapDI<DIType>(Type), {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1644 unwrapDI<DIScope>(Scope), AlignInBits));
1645}
1646
1650 uint64_t BaseOffset, uint32_t VBPtrOffset,
1651 LLVMDIFlags Flags) {
1652 return wrap(unwrap(Builder)->createInheritance(
1654 BaseOffset, VBPtrOffset, map_from_llvmDIFlags(Flags)));
1655}
1656
1659 LLVMDIBuilderRef Builder, unsigned Tag, const char *Name,
1660 size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line,
1661 unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits,
1662 const char *UniqueIdentifier, size_t UniqueIdentifierLen) {
1663 return wrap(unwrap(Builder)->createForwardDecl(
1664 Tag, {Name, NameLen}, unwrapDI<DIScope>(Scope),
1665 unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits,
1666 AlignInBits, {UniqueIdentifier, UniqueIdentifierLen}));
1667}
1668
1671 LLVMDIBuilderRef Builder, unsigned Tag, const char *Name,
1672 size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line,
1673 unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits,
1674 LLVMDIFlags Flags, const char *UniqueIdentifier,
1675 size_t UniqueIdentifierLen) {
1676 return wrap(unwrap(Builder)->createReplaceableCompositeType(
1677 Tag, {Name, NameLen}, unwrapDI<DIScope>(Scope),
1678 unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits,
1679 AlignInBits, map_from_llvmDIFlags(Flags),
1680 {UniqueIdentifier, UniqueIdentifierLen}));
1681}
1682
1686 return wrap(unwrap(Builder)->createQualifiedType(Tag,
1688}
1689
1693 return wrap(unwrap(Builder)->createReferenceType(Tag,
1695}
1696
1699 return wrap(unwrap(Builder)->createNullPtrType());
1700}
1701
1704 LLVMMetadataRef PointeeType,
1705 LLVMMetadataRef ClassType,
1706 uint64_t SizeInBits,
1707 uint32_t AlignInBits,
1708 LLVMDIFlags Flags) {
1709 return wrap(unwrap(Builder)->createMemberPointerType(
1710 unwrapDI<DIType>(PointeeType),
1711 unwrapDI<DIType>(ClassType), AlignInBits, SizeInBits,
1712 map_from_llvmDIFlags(Flags)));
1713}
1714
1717 LLVMMetadataRef Scope,
1718 const char *Name, size_t NameLen,
1719 LLVMMetadataRef File, unsigned LineNumber,
1720 uint64_t SizeInBits,
1721 uint64_t OffsetInBits,
1722 uint64_t StorageOffsetInBits,
1724 return wrap(unwrap(Builder)->createBitFieldMemberType(
1725 unwrapDI<DIScope>(Scope), {Name, NameLen},
1726 unwrapDI<DIFile>(File), LineNumber,
1727 SizeInBits, OffsetInBits, StorageOffsetInBits,
1729}
1730
1732 LLVMMetadataRef Scope, const char *Name, size_t NameLen,
1733 LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits,
1734 uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags,
1735 LLVMMetadataRef DerivedFrom,
1736 LLVMMetadataRef *Elements, unsigned NumElements,
1737 LLVMMetadataRef VTableHolder, LLVMMetadataRef TemplateParamsNode,
1738 const char *UniqueIdentifier, size_t UniqueIdentifierLen) {
1739 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1740 NumElements});
1741 return wrap(unwrap(Builder)->createClassType(
1742 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1743 LineNumber, SizeInBits, AlignInBits, OffsetInBits,
1744 map_from_llvmDIFlags(Flags), unwrapDI<DIType>(DerivedFrom), Elts,
1745 /*RunTimeLang=*/0, unwrapDI<DIType>(VTableHolder),
1746 unwrapDI<MDNode>(TemplateParamsNode),
1747 {UniqueIdentifier, UniqueIdentifierLen}));
1748}
1749
1753 return wrap(unwrap(Builder)->createArtificialType(unwrapDI<DIType>(Type)));
1754}
1755
1757 return unwrapDI<DINode>(MD)->getTag();
1758}
1759
1760const char *LLVMDITypeGetName(LLVMMetadataRef DType, size_t *Length) {
1761 StringRef Str = unwrapDI<DIType>(DType)->getName();
1762 *Length = Str.size();
1763 return Str.data();
1764}
1765
1767 return unwrapDI<DIType>(DType)->getSizeInBits();
1768}
1769
1771 return unwrapDI<DIType>(DType)->getOffsetInBits();
1772}
1773
1775 return unwrapDI<DIType>(DType)->getAlignInBits();
1776}
1777
1779 return unwrapDI<DIType>(DType)->getLine();
1780}
1781
1785
1787 LLVMMetadataRef *Types,
1788 size_t Length) {
1789 return wrap(
1790 unwrap(Builder)->getOrCreateTypeArray({unwrap(Types), Length}).get());
1791}
1792
1795 LLVMMetadataRef File,
1796 LLVMMetadataRef *ParameterTypes,
1797 unsigned NumParameterTypes,
1798 LLVMDIFlags Flags) {
1799 auto Elts = unwrap(Builder)->getOrCreateTypeArray({unwrap(ParameterTypes),
1800 NumParameterTypes});
1801 return wrap(unwrap(Builder)->createSubroutineType(
1802 Elts, map_from_llvmDIFlags(Flags)));
1803}
1804
1806 uint64_t *Addr, size_t Length) {
1807 return wrap(
1808 unwrap(Builder)->createExpression(ArrayRef<uint64_t>(Addr, Length)));
1809}
1810
1813 uint64_t Value) {
1814 return wrap(unwrap(Builder)->createConstantValueExpression(Value));
1815}
1816
1818 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1819 size_t NameLen, const char *Linkage, size_t LinkLen, LLVMMetadataRef File,
1820 unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit,
1821 LLVMMetadataRef Expr, LLVMMetadataRef Decl, uint32_t AlignInBits) {
1822 return wrap(unwrap(Builder)->createGlobalVariableExpression(
1823 unwrapDI<DIScope>(Scope), {Name, NameLen}, {Linkage, LinkLen},
1824 unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit,
1825 true, unwrap<DIExpression>(Expr), unwrapDI<MDNode>(Decl),
1826 nullptr, AlignInBits));
1827}
1828
1832
1837
1841
1845
1847 return unwrapDI<DIVariable>(Var)->getLine();
1848}
1849
1851 size_t Count) {
1852 return wrap(
1853 MDTuple::getTemporary(*unwrap(Ctx), {unwrap(Data), Count}).release());
1854}
1855
1859
1861 LLVMMetadataRef Replacement) {
1862 auto *Node = unwrapDI<MDNode>(TargetMetadata);
1863 Node->replaceAllUsesWith(unwrap(Replacement));
1865}
1866
1868 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1869 size_t NameLen, const char *Linkage, size_t LnkLen, LLVMMetadataRef File,
1870 unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit,
1871 LLVMMetadataRef Decl, uint32_t AlignInBits) {
1872 return wrap(unwrap(Builder)->createTempGlobalVariableFwdDecl(
1873 unwrapDI<DIScope>(Scope), {Name, NameLen}, {Linkage, LnkLen},
1874 unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit,
1875 unwrapDI<MDNode>(Decl), nullptr, AlignInBits));
1876}
1877
1879 LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo,
1881 DbgRecord *DbgInst = unwrap(Builder)->insertDeclare(
1882 unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
1884 Instr ? InsertPosition(unwrap<Instruction>(Instr)->getIterator())
1885 : nullptr);
1886 return wrap(DbgInst);
1887}
1888
1890 LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo,
1892 DbgRecord *DbgInst = unwrap(Builder)->insertDeclare(
1893 unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
1895 return wrap(DbgInst);
1896}
1897
1899 LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo,
1901 DbgRecord *DbgInst = unwrap(Builder)->insertDbgValue(
1904 Instr ? InsertPosition(unwrap<Instruction>(Instr)->getIterator())
1905 : nullptr);
1906 return wrap(DbgInst);
1907}
1908
1910 LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo,
1912 DbgRecord *DbgInst = unwrap(Builder)->insertDbgValue(
1915 Block ? InsertPosition(unwrap(Block)->end()) : nullptr);
1916 return wrap(DbgInst);
1917}
1918
1920 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1921 size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1922 LLVMBool AlwaysPreserve, LLVMDIFlags Flags, uint32_t AlignInBits) {
1923 return wrap(unwrap(Builder)->createAutoVariable(
1924 unwrap<DIScope>(Scope), {Name, NameLen}, unwrap<DIFile>(File),
1925 LineNo, unwrap<DIType>(Ty), AlwaysPreserve,
1926 map_from_llvmDIFlags(Flags), AlignInBits));
1927}
1928
1930 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1931 size_t NameLen, unsigned ArgNo, LLVMMetadataRef File, unsigned LineNo,
1932 LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags) {
1933 return wrap(unwrap(Builder)->createParameterVariable(
1934 unwrap<DIScope>(Scope), {Name, NameLen}, ArgNo, unwrap<DIFile>(File),
1935 LineNo, unwrap<DIType>(Ty), AlwaysPreserve,
1936 map_from_llvmDIFlags(Flags)));
1937}
1938
1940 int64_t Lo, int64_t Count) {
1941 return wrap(unwrap(Builder)->getOrCreateSubrange(Lo, Count));
1942}
1943
1946 size_t Length) {
1947 Metadata **DataValue = unwrap(Data);
1948 return wrap(unwrap(Builder)->getOrCreateArray({DataValue, Length}).get());
1949}
1950
1954
1956 unwrap<Function>(Func)->setSubprogram(unwrap<DISubprogram>(SP));
1957}
1958
1960 return unwrapDI<DISubprogram>(Subprogram)->getLine();
1961}
1962
1964 LLVMMetadataRef SubroutineType) {
1965 unwrapDI<DISubprogram>(Subprogram)
1966 ->replaceType(unwrapDI<DISubroutineType>(SubroutineType));
1967}
1968
1972
1974 if (Loc)
1975 unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc(unwrap<DILocation>(Loc)));
1976 else
1977 unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc());
1978}
1979
1981 LLVMMetadataRef Context,
1982 const char *Name, size_t NameLen,
1983 LLVMMetadataRef File, unsigned LineNo,
1984 LLVMBool AlwaysPreserve) {
1985 return wrap(unwrap(Builder)->createLabel(
1986 unwrapDI<DIScope>(Context), StringRef(Name, NameLen),
1987 unwrapDI<DIFile>(File), LineNo, /*Column*/ 0, /*IsArtificial*/ false,
1988 /*CoroSuspendIdx*/ std::nullopt, AlwaysPreserve));
1989}
1990
1992 LLVMMetadataRef LabelInfo,
1993 LLVMMetadataRef Location,
1994 LLVMValueRef InsertBefore) {
1995 DbgRecord *DbgInst = unwrap(Builder)->insertLabel(
1996 unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location),
1997 InsertBefore
1998 ? InsertPosition(unwrap<Instruction>(InsertBefore)->getIterator())
1999 : nullptr);
2000 return wrap(DbgInst);
2001}
2002
2004 LLVMMetadataRef LabelInfo,
2005 LLVMMetadataRef Location,
2006 LLVMBasicBlockRef InsertAtEnd) {
2007 DbgRecord *DbgInst = unwrap(Builder)->insertLabel(
2008 unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location),
2009 InsertAtEnd ? InsertPosition(unwrap(InsertAtEnd)->end()) : nullptr);
2010 return wrap(DbgInst);
2011}
2012
2014 switch(unwrap(Metadata)->getMetadataID()) {
2015#define HANDLE_METADATA_LEAF(CLASS) \
2016 case Metadata::CLASS##Kind: \
2017 return (LLVMMetadataKind)LLVM##CLASS##MetadataKind;
2018#include "llvm/IR/Metadata.def"
2019 default:
2021 }
2022}
2023
2025 assert(ID && "Expected non-null ID");
2026 LLVMContext &Ctx = ID->getContext();
2027 auto &Map = Ctx.pImpl->AssignmentIDToInstrs;
2028
2029 auto MapIt = Map.find(ID);
2030 if (MapIt == Map.end())
2031 return make_range(nullptr, nullptr);
2032
2033 return make_range(MapIt->second.begin(), MapIt->second.end());
2034}
2035
2037 for (auto *DVR : getDVRAssignmentMarkers(Inst))
2038 DVR->eraseFromParent();
2039}
2040
2042 // Replace attachments.
2043 AssignmentInstRange InstRange = getAssignmentInsts(Old);
2044 // Use intermediate storage for the instruction ptrs because the
2045 // getAssignmentInsts range iterators will be invalidated by adding and
2046 // removing DIAssignID attachments.
2047 SmallVector<Instruction *> InstVec(InstRange.begin(), InstRange.end());
2048 for (auto *I : InstVec)
2049 I->setMetadata(LLVMContext::MD_DIAssignID, New);
2050
2051 Old->replaceAllUsesWith(New);
2052}
2053
2055 for (BasicBlock &BB : *F) {
2056 for (Instruction &I : BB) {
2057 for (DbgVariableRecord &DVR :
2058 make_early_inc_range(filterDbgVars(I.getDbgRecordRange())))
2059 if (DVR.isDbgAssign())
2060 DVR.eraseFromParent();
2061
2062 I.setMetadata(LLVMContext::MD_DIAssignID, nullptr);
2063 }
2064 }
2065}
2066
2068 const DataLayout &DL, const Value *Dest, uint64_t SliceOffsetInBits,
2069 uint64_t SliceSizeInBits, const DbgVariableRecord *AssignRecord,
2070 std::optional<DIExpression::FragmentInfo> &Result) {
2071 // No overlap if this DbgRecord describes a killed location.
2072 if (AssignRecord->isKillAddress())
2073 return false;
2074
2075 int64_t AddrOffsetInBits;
2076 {
2077 int64_t AddrOffsetInBytes;
2078 SmallVector<uint64_t> PostOffsetOps; //< Unused.
2079 // Bail if we can't find a constant offset (or none) in the expression.
2080 if (!AssignRecord->getAddressExpression()->extractLeadingOffset(
2081 AddrOffsetInBytes, PostOffsetOps))
2082 return false;
2083 AddrOffsetInBits = AddrOffsetInBytes * 8;
2084 }
2085
2086 Value *Addr = AssignRecord->getAddress();
2087 // FIXME: It may not always be zero.
2088 int64_t BitExtractOffsetInBits = 0;
2090 AssignRecord->getFragmentOrEntireVariable();
2091
2092 int64_t OffsetFromLocationInBits; //< Unused.
2094 DL, Dest, SliceOffsetInBits, SliceSizeInBits, Addr, AddrOffsetInBits,
2095 BitExtractOffsetInBits, VarFrag, Result, OffsetFromLocationInBits);
2096}
2097
2098/// Update inlined instructions' DIAssignID metadata. We need to do this
2099/// otherwise a function inlined more than once into the same function
2100/// will cause DIAssignID to be shared by many instructions.
2102 Instruction &I) {
2103 auto GetNewID = [&Map](Metadata *Old) {
2104 DIAssignID *OldID = cast<DIAssignID>(Old);
2105 if (DIAssignID *NewID = Map.lookup(OldID))
2106 return NewID;
2108 Map[OldID] = NewID;
2109 return NewID;
2110 };
2111 // If we find a DIAssignID attachment or use, replace it with a new version.
2112 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
2113 if (DVR.isDbgAssign())
2114 DVR.setAssignId(GetNewID(DVR.getAssignID()));
2115 }
2116 if (auto *ID = I.getMetadata(LLVMContext::MD_DIAssignID))
2117 I.setMetadata(LLVMContext::MD_DIAssignID, GetNewID(ID));
2118}
2119
2120/// Collect constant properties (base, size, offset) of \p StoreDest.
2121/// Return std::nullopt if any properties are not constants or the
2122/// offset from the base pointer is negative.
2123static std::optional<AssignmentInfo>
2124getAssignmentInfoImpl(const DataLayout &DL, const Value *StoreDest,
2125 TypeSize SizeInBits) {
2126 if (SizeInBits.isScalable())
2127 return std::nullopt;
2128 APInt GEPOffset(DL.getIndexTypeSizeInBits(StoreDest->getType()), 0);
2129 const Value *Base = StoreDest->stripAndAccumulateConstantOffsets(
2130 DL, GEPOffset, /*AllowNonInbounds*/ true);
2131
2132 if (GEPOffset.isNegative())
2133 return std::nullopt;
2134
2135 uint64_t OffsetInBytes = GEPOffset.getLimitedValue();
2136 // Check for overflow.
2137 if (OffsetInBytes == UINT64_MAX)
2138 return std::nullopt;
2139 if (const auto *Alloca = dyn_cast<AllocaInst>(Base))
2140 if (!Alloca->isScalable())
2141 return AssignmentInfo(DL, Alloca, OffsetInBytes * 8, SizeInBits);
2142 return std::nullopt;
2143}
2144
2145std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2146 const MemIntrinsic *I) {
2147 const Value *StoreDest = I->getRawDest();
2148 // Assume 8 bit bytes.
2149 auto *ConstLengthInBytes = dyn_cast<ConstantInt>(I->getLength());
2150 if (!ConstLengthInBytes)
2151 // We can't use a non-const size, bail.
2152 return std::nullopt;
2153 uint64_t SizeInBits = 8 * ConstLengthInBytes->getZExtValue();
2154 return getAssignmentInfoImpl(DL, StoreDest, TypeSize::getFixed(SizeInBits));
2155}
2156
2157std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2158 const StoreInst *SI) {
2159 TypeSize SizeInBits = DL.getTypeSizeInBits(SI->getValueOperand()->getType());
2160 return getAssignmentInfoImpl(DL, SI->getPointerOperand(), SizeInBits);
2161}
2162
2163std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2164 const AllocaInst *AI) {
2165 TypeSize SizeInBits = DL.getTypeSizeInBits(AI->getAllocatedType());
2166 return getAssignmentInfoImpl(DL, AI, SizeInBits);
2167}
2168
2169/// Returns nullptr if the assignment shouldn't be attributed to this variable.
2170static void emitDbgAssign(AssignmentInfo Info, Value *Val, Value *Dest,
2171 Instruction &StoreLikeInst, const VarRecord &VarRec,
2172 DIBuilder &DIB) {
2173 auto *ID = StoreLikeInst.getMetadata(LLVMContext::MD_DIAssignID);
2174 assert(ID && "Store instruction must have DIAssignID metadata");
2175 (void)ID;
2176
2177 const uint64_t StoreStartBit = Info.OffsetInBits;
2178 const uint64_t StoreEndBit = Info.OffsetInBits + Info.SizeInBits;
2179
2180 uint64_t FragStartBit = StoreStartBit;
2181 uint64_t FragEndBit = StoreEndBit;
2182
2183 bool StoreToWholeVariable = Info.StoreToWholeAlloca;
2184 if (auto Size = VarRec.Var->getSizeInBits()) {
2185 // NOTE: trackAssignments doesn't understand base expressions yet, so all
2186 // variables that reach here are guaranteed to start at offset 0 in the
2187 // alloca.
2188 const uint64_t VarStartBit = 0;
2189 const uint64_t VarEndBit = *Size;
2190
2191 // FIXME: trim FragStartBit when nonzero VarStartBit is supported.
2192 FragEndBit = std::min(FragEndBit, VarEndBit);
2193
2194 // Discard stores to bits outside this variable.
2195 if (FragStartBit >= FragEndBit)
2196 return;
2197
2198 StoreToWholeVariable = FragStartBit <= VarStartBit && FragEndBit >= *Size;
2199 }
2200
2201 DIExpression *Expr = DIExpression::get(StoreLikeInst.getContext(), {});
2202 if (!StoreToWholeVariable) {
2203 auto R = DIExpression::createFragmentExpression(Expr, FragStartBit,
2204 FragEndBit - FragStartBit);
2205 assert(R.has_value() && "failed to create fragment expression");
2206 Expr = *R;
2207 }
2208 DIExpression *AddrExpr = DIExpression::get(StoreLikeInst.getContext(), {});
2210 &StoreLikeInst, Val, VarRec.Var, Expr, Dest, AddrExpr, VarRec.DL);
2211 (void)Assign;
2212 LLVM_DEBUG(if (Assign) errs() << " > INSERT: " << *Assign << "\n");
2213}
2214
2215#undef DEBUG_TYPE // Silence redefinition warning (from ConstantsContext.h).
2216#define DEBUG_TYPE "assignment-tracking"
2217
2219 const StorageToVarsMap &Vars, const DataLayout &DL,
2220 bool DebugPrints) {
2221 // Early-exit if there are no interesting variables.
2222 if (Vars.empty())
2223 return;
2224
2225 auto &Ctx = Start->getContext();
2226 auto &Module = *Start->getModule();
2227
2228 // Poison type doesn't matter, so long as it isn't void. Let's just use i1.
2230 DIBuilder DIB(Module, /*AllowUnresolved*/ false);
2231
2232 // Scan the instructions looking for stores to local variables' storage.
2233 LLVM_DEBUG(errs() << "# Scanning instructions\n");
2234 for (auto BBI = Start; BBI != End; ++BBI) {
2235 for (Instruction &I : *BBI) {
2236
2237 std::optional<AssignmentInfo> Info;
2238 Value *ValueComponent = nullptr;
2239 Value *DestComponent = nullptr;
2240 if (auto *AI = dyn_cast<AllocaInst>(&I)) {
2241 // We want to track the variable's stack home from its alloca's
2242 // position onwards so we treat it as an assignment (where the stored
2243 // value is poison).
2244 Info = getAssignmentInfo(DL, AI);
2245 ValueComponent = Poison;
2246 DestComponent = AI;
2247 } else if (auto *SI = dyn_cast<StoreInst>(&I)) {
2248 Info = getAssignmentInfo(DL, SI);
2249 ValueComponent = SI->getValueOperand();
2250 DestComponent = SI->getPointerOperand();
2251 } else if (auto *MI = dyn_cast<MemTransferInst>(&I)) {
2252 Info = getAssignmentInfo(DL, MI);
2253 // May not be able to represent this value easily.
2254 ValueComponent = Poison;
2255 DestComponent = MI->getOperand(0);
2256 } else if (auto *MI = dyn_cast<MemSetInst>(&I)) {
2257 Info = getAssignmentInfo(DL, MI);
2258 // If we're zero-initing we can state the assigned value is zero,
2259 // otherwise use undef.
2260 auto *ConstValue = dyn_cast<ConstantInt>(MI->getOperand(1));
2261 if (ConstValue && ConstValue->isZero())
2262 ValueComponent = ConstValue;
2263 else
2264 ValueComponent = Poison;
2265 DestComponent = MI->getOperand(0);
2266 } else {
2267 // Not a store-like instruction.
2268 continue;
2269 }
2270
2271 assert(ValueComponent && DestComponent);
2272 LLVM_DEBUG(errs() << "SCAN: Found store-like: " << I << "\n");
2273
2274 // Check if getAssignmentInfo failed to understand this store.
2275 if (!Info.has_value()) {
2276 LLVM_DEBUG(
2277 errs()
2278 << " | SKIP: Untrackable store (e.g. through non-const gep)\n");
2279 continue;
2280 }
2281 LLVM_DEBUG(errs() << " | BASE: " << *Info->Base << "\n");
2282
2283 // Check if the store destination is a local variable with debug info.
2284 auto LocalIt = Vars.find(Info->Base);
2285 if (LocalIt == Vars.end()) {
2286 LLVM_DEBUG(
2287 errs()
2288 << " | SKIP: Base address not associated with local variable\n");
2289 continue;
2290 }
2291
2292 DIAssignID *ID =
2293 cast_or_null<DIAssignID>(I.getMetadata(LLVMContext::MD_DIAssignID));
2294 if (!ID) {
2295 ID = DIAssignID::getDistinct(Ctx);
2296 I.setMetadata(LLVMContext::MD_DIAssignID, ID);
2297 }
2298
2299 for (const VarRecord &R : LocalIt->second)
2300 emitDbgAssign(*Info, ValueComponent, DestComponent, I, R, DIB);
2301 }
2302 }
2303}
2304
2305bool AssignmentTrackingPass::runOnFunction(Function &F) {
2306 // No value in assignment tracking without optimisations.
2307 if (F.hasFnAttribute(Attribute::OptimizeNone))
2308 return /*Changed*/ false;
2309
2310 bool Changed = false;
2311 auto *DL = &F.getDataLayout();
2312 // Collect a map of {backing storage : dbg.declares} (currently "backing
2313 // storage" is limited to Allocas). We'll use this to find dbg.declares to
2314 // delete after running `trackAssignments`.
2316 // Create another similar map of {storage : variables} that we'll pass to
2317 // trackAssignments.
2318 StorageToVarsMap Vars;
2319 auto ProcessDeclare = [&](DbgVariableRecord &Declare) {
2320 // FIXME: trackAssignments doesn't let you specify any modifiers to the
2321 // variable (e.g. fragment) or location (e.g. offset), so we have to
2322 // leave dbg.declares with non-empty expressions in place.
2323 if (Declare.getExpression()->getNumElements() != 0)
2324 return;
2325 if (!Declare.getAddress())
2326 return;
2327 if (AllocaInst *Alloca =
2328 dyn_cast<AllocaInst>(Declare.getAddress()->stripPointerCasts())) {
2329 // FIXME: Skip VLAs for now (let these variables use dbg.declares).
2330 if (!Alloca->isStaticAlloca())
2331 return;
2332 // Similarly, skip scalable vectors (use dbg.declares instead).
2333 if (auto Sz = Alloca->getAllocationSize(*DL); Sz && Sz->isScalable())
2334 return;
2335 DVRDeclares[Alloca].insert(&Declare);
2336 Vars[Alloca].insert(VarRecord(&Declare));
2337 }
2338 };
2339 for (auto &BB : F) {
2340 for (auto &I : BB) {
2341 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
2342 if (DVR.isDbgDeclare())
2343 ProcessDeclare(DVR);
2344 }
2345 }
2346 }
2347
2348 // FIXME: Locals can be backed by caller allocas (sret, byval).
2349 // Note: trackAssignments doesn't respect dbg.declare's IR positions (as it
2350 // doesn't "understand" dbg.declares). However, this doesn't appear to break
2351 // any rules given this description of dbg.declare from
2352 // llvm/docs/SourceLevelDebugging.md:
2353 //
2354 // It is not control-dependent, meaning that if a call to llvm.dbg.declare
2355 // exists and has a valid location argument, that address is considered to
2356 // be the true home of the variable across its entire lifetime.
2357 trackAssignments(F.begin(), F.end(), Vars, *DL);
2358
2359 // Delete dbg.declares for variables now tracked with assignment tracking.
2360 for (auto &[Insts, Declares] : DVRDeclares) {
2362 for (auto *Declare : Declares) {
2363 // Assert that the alloca that Declare uses is now linked to a dbg.assign
2364 // describing the same variable (i.e. check that this dbg.declare has
2365 // been replaced by a dbg.assign). Use DebugVariableAggregate to Discard
2366 // the fragment part because trackAssignments may alter the
2367 // fragment. e.g. if the alloca is smaller than the variable, then
2368 // trackAssignments will create an alloca-sized fragment for the
2369 // dbg.assign.
2370 assert(llvm::any_of(Markers, [Declare](auto *Assign) {
2371 return DebugVariableAggregate(Assign) ==
2372 DebugVariableAggregate(Declare);
2373 }));
2374 // Delete Declare because the variable location is now tracked using
2375 // assignment tracking.
2376 Declare->eraseFromParent();
2377 Changed = true;
2378 }
2379 };
2380 return Changed;
2381}
2382
2384 "debug-info-assignment-tracking";
2385
2389 ConstantInt::get(Type::getInt1Ty(M.getContext()), 1)));
2390}
2391
2393 Metadata *Value = M.getModuleFlag(AssignmentTrackingModuleFlag);
2394 return Value && !cast<ConstantAsMetadata>(Value)->getValue()->isNullValue();
2395}
2396
2400
2403 if (!runOnFunction(F))
2404 return PreservedAnalyses::all();
2405
2406 // Record that this module uses assignment tracking. It doesn't matter that
2407 // some functions in the module may not use it - the debug info in those
2408 // functions will still be handled properly.
2409 setAssignmentTrackingModuleFlag(*F.getParent());
2410
2411 // Q: Can we return a less conservative set than just CFGAnalyses? Can we
2412 // return PreservedAnalyses::all()?
2415 return PA;
2416}
2417
2420 bool Changed = false;
2421 for (auto &F : M)
2422 Changed |= runOnFunction(F);
2423
2424 if (!Changed)
2425 return PreservedAnalyses::all();
2426
2427 // Record that this module uses assignment tracking.
2429
2430 // Q: Can we return a less conservative set than just CFGAnalyses? Can we
2431 // return PreservedAnalyses::all()?
2434 return PA;
2435}
2436
2437#undef DEBUG_TYPE
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned uint64_t
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< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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
This file contains the declarations for metadata subclasses.
#define T
uint64_t IntrinsicInst * II
static constexpr StringLiteral Filename
#define P(N)
R600 Emit Clause Markers
Func MI getDebugLoc()))
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:119
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:326
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:472
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.
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 bool extractLeadingOffset(ArrayRef< uint64_t > Ops, int64_t &OffsetInBytes, SmallVectorImpl< uint64_t > &RemainingOps)
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...
ChecksumKind
Which algorithm (e.g.
PointerUnion< DIVariable *, DIExpression * > BoundType
A pair of DIGlobalVariable and DIExpression.
DIGlobalVariable * getVariable() const
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 source language identity metadata that includes language name,...
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.
PointerUnion< ConstantInt *, DIVariable *, DIExpression *, DIDerivedType * > BoundType
Type array for a subprogram.
Base class for types.
DIScope * getScope() const
Base class for variables.
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:126
DILocation * get() const
Get the underlying DILocation.
Definition DebugLoc.h:220
LLVM_ABI MDNode * getScope() const
Definition DebugLoc.cpp:53
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:172
LLVM_ABI DILocation * getInlinedAt() const
Definition DebugLoc.cpp:58
static DebugLoc getDropped()
Definition DebugLoc.h:155
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
Definition DenseMap.h:250
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:284
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
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:1069
LLVM_ABI void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1575
void replaceAllUsesWith(Metadata *MD)
RAUW a temporary.
Definition Metadata.h:1266
static LLVM_ABI void deleteTemporary(MDNode *N)
Deallocate a node created by getTemporary.
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1426
ArrayRef< MDOperand > operands() const
Definition Metadata.h:1424
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1567
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1432
bool isDistinct() const
Definition Metadata.h:1252
LLVMContext & getContext() const
Definition Metadata.h:1233
Tracking metadata reference owned by Metadata.
Definition Metadata.h:891
Metadata * get() const
Definition Metadata.h:920
Tuple of metadata.
Definition Metadata.h:1484
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a temporary node.
Definition Metadata.h:1533
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:1755
LLVM_ABI StringRef getName() const
A discriminated union of two or more pointer types, with the discriminator in the low bits of the poi...
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.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
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:46
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:306
static LLVM_ABI ValueAsMetadata * getIfExists(Value *V)
Definition Metadata.cpp:529
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:258
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:209
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:187
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:233
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:221
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:164
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:226
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:216
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:184
@ CSK_SHA1
Definition DebugInfo.h:221
@ CSK_SHA256
Definition DebugInfo.h:221
@ CSK_MD5
Definition DebugInfo.h:221
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.
Assignment Tracking (at).
Definition DebugInfo.h:183
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:188
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:205
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:278
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:898
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.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:315
@ Length
Definition DWP.cpp:577
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
RelativeUniformCounterPtr Values
Definition InstrProf.h:91
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
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
@ Import
Import information from summary.
Definition IPO.h:39
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:633
auto cast_or_null(const Y &Val)
Definition Casting.h:714
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
static const DIScope * getScope(const NodeT *N)
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)
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
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.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
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.
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:289
Helper struct for trackAssignments, below.
Definition DebugInfo.h:246
DILocation * DL
Definition DebugInfo.h:248
DILocalVariable * Var
Definition DebugInfo.h:247