LLVM 23.0.0git
DebugInfo.cpp
Go to the documentation of this file.
1//===- DebugInfo.cpp - Debug Information Helper Classes -------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the helper classes used to build and interpret debug
10// information in LLVM IR form.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm-c/DebugInfo.h"
15#include "LLVMContextImpl.h"
16#include "llvm/ADT/APSInt.h"
17#include "llvm/ADT/DenseMap.h"
18#include "llvm/ADT/DenseSet.h"
19#include "llvm/ADT/STLExtras.h"
22#include "llvm/ADT/StringRef.h"
23#include "llvm/IR/BasicBlock.h"
24#include "llvm/IR/Constants.h"
25#include "llvm/IR/DIBuilder.h"
26#include "llvm/IR/DebugInfo.h"
28#include "llvm/IR/DebugLoc.h"
30#include "llvm/IR/Function.h"
32#include "llvm/IR/Instruction.h"
34#include "llvm/IR/LLVMContext.h"
35#include "llvm/IR/Metadata.h"
36#include "llvm/IR/Module.h"
37#include "llvm/IR/PassManager.h"
40#include <algorithm>
41#include <cassert>
42#include <optional>
43
44using namespace llvm;
45using namespace llvm::at;
46using namespace llvm::dwarf;
47
49 // This function is hot. Check whether the value has any metadata to avoid a
50 // DenseMap lookup. This check is a bitfield datamember lookup.
51 if (!V->isUsedByMetadata())
52 return {};
54 if (!L)
55 return {};
56
58 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers())
59 if (DVR->getType() == DbgVariableRecord::LocationType::Declare)
60 Declares.push_back(DVR);
61
62 return Declares;
63}
64
66 // This function is hot. Check whether the value has any metadata to avoid a
67 // DenseMap lookup. This check is a bitfield datamember lookup.
68 if (!V->isUsedByMetadata())
69 return {};
71 if (!L)
72 return {};
73
75 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers())
77 DEclareValues.push_back(DVR);
78
79 return DEclareValues;
80}
81
83 // This function is hot. Check whether the value has any metadata to avoid a
84 // DenseMap lookup. This check is a bitfield datamember lookup.
85 if (!V->isUsedByMetadata())
86 return {};
88 if (!L)
89 return {};
90
92 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers())
93 if (DVR->isValueOfVariable())
94 Values.push_back(DVR);
95
96 return Values;
97}
98
99template <bool DbgAssignAndValuesOnly>
100static void
102 SmallVectorImpl<DbgVariableRecord *> &DbgVariableRecords) {
103 // This function is hot. Check whether the value has any metadata to avoid a
104 // DenseMap lookup.
105 if (!V->isUsedByMetadata())
106 return;
107
108 // TODO: If this value appears multiple times in a DIArgList, we should still
109 // only add the owning dbg.value once; use this set to track ArgListUsers.
110 // This behaviour can be removed when we can automatically remove duplicates.
111 // V will also appear twice in a dbg.assign if its used in the both the value
112 // and address components.
113 SmallPtrSet<DbgVariableRecord *, 4> EncounteredDbgVariableRecords;
114
115 /// Append users of MetadataAsValue(MD).
116 auto AppendUsers = [&EncounteredDbgVariableRecords,
117 &DbgVariableRecords](Metadata *MD) {
118 // Get DbgVariableRecords that use this as a single value.
120 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers()) {
121 if (!DbgAssignAndValuesOnly || DVR->isDbgValue() || DVR->isDbgAssign())
122 if (EncounteredDbgVariableRecords.insert(DVR).second)
123 DbgVariableRecords.push_back(DVR);
124 }
125 }
126 };
127
128 if (auto *L = LocalAsMetadata::getIfExists(V)) {
129 AppendUsers(L);
130 for (Metadata *AL : L->getAllArgListUsers()) {
131 AppendUsers(AL);
132 DIArgList *DI = cast<DIArgList>(AL);
134 if (!DbgAssignAndValuesOnly || DVR->isDbgValue() || DVR->isDbgAssign())
135 if (EncounteredDbgVariableRecords.insert(DVR).second)
136 DbgVariableRecords.push_back(DVR);
137 }
138 }
139}
140
142 Value *V, SmallVectorImpl<DbgVariableRecord *> &DbgVariableRecords) {
143 findDbgIntrinsics</*DbgAssignAndValuesOnly=*/true>(V, DbgVariableRecords);
144}
145
147 Value *V, SmallVectorImpl<DbgVariableRecord *> &DbgVariableRecords) {
148 findDbgIntrinsics</*DbgAssignAndValuesOnly=*/false>(V, DbgVariableRecords);
149}
150
152 if (auto *LocalScope = dyn_cast_or_null<DILocalScope>(Scope))
153 return LocalScope->getSubprogram();
154 return nullptr;
155}
156
158 // Original dbg.declare must have a location.
159 const DebugLoc &DeclareLoc = DVR->getDebugLoc();
160 MDNode *Scope = DeclareLoc.getScope();
161 DILocation *InlinedAt = DeclareLoc.getInlinedAt();
162 // Because no machine insts can come from debug intrinsics, only the scope
163 // and inlinedAt is significant. Zero line numbers are used in case this
164 // DebugLoc leaks into any adjacent instructions. Produce an unknown location
165 // with the correct scope / inlinedAt fields.
166 return DILocation::get(DVR->getContext(), 0, 0, Scope, InlinedAt);
167}
168
169//===----------------------------------------------------------------------===//
170// DebugInfoFinder implementations.
171//===----------------------------------------------------------------------===//
172
174 CUs.clear();
175 SPs.clear();
176 GVs.clear();
177 TYs.clear();
178 Scopes.clear();
179 Macros.clear();
180 NodesSeen.clear();
181}
182
184 for (auto *CU : M.debug_compile_units())
185 processCompileUnit(CU);
186 for (auto &F : M.functions()) {
187 if (auto *SP = cast_or_null<DISubprogram>(F.getSubprogram()))
189 // There could be subprograms from inlined functions referenced from
190 // instructions only. Walk the function to find them.
191 for (const BasicBlock &BB : F)
192 for (const Instruction &I : BB)
194 }
195}
196
197void DebugInfoFinder::processCompileUnit(DICompileUnit *CU) {
198 if (!addCompileUnit(CU))
199 return;
200 for (auto *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 *SR = dyn_cast_or_null<DISubrange>(D)) {
277 auto VisitBound = [&](DISubrange::BoundType Bound) {
278 if (auto *BV = dyn_cast_if_present<DIVariable *>(Bound))
279 processVariable(BV);
280 };
281 VisitBound(SR->getLowerBound());
282 VisitBound(SR->getCount());
283 VisitBound(SR->getUpperBound());
284 VisitBound(SR->getStride());
285 } else if (auto *GSR = dyn_cast_or_null<DIGenericSubrange>(D)) {
286 auto VisitBound = [&](DIGenericSubrange::BoundType Bound) {
287 if (auto *BV = dyn_cast_if_present<DIVariable *>(Bound))
288 processVariable(BV);
289 };
290 VisitBound(GSR->getLowerBound());
291 VisitBound(GSR->getCount());
292 VisitBound(GSR->getUpperBound());
293 VisitBound(GSR->getStride());
294 }
295 }
296 return;
297 }
298 if (auto *ST = dyn_cast<DIStringType>(DT)) {
299 processVariable(ST->getStringLength());
300 return;
301 }
302 if (auto *SRT = dyn_cast<DISubrangeType>(DT)) {
303 processType(SRT->getBaseType());
304 auto VisitBound = [&](DISubrangeType::BoundType Bound) {
305 if (auto *V = dyn_cast_if_present<DIVariable *>(Bound))
307 else if (auto *T = dyn_cast_if_present<DIDerivedType *>(Bound))
308 processType(T);
309 };
310 VisitBound(SRT->getLowerBound());
311 VisitBound(SRT->getUpperBound());
312 VisitBound(SRT->getStride());
313 VisitBound(SRT->getBias());
314 return;
315 }
316 if (auto *DDT = dyn_cast<DIDerivedType>(DT)) {
317 processType(DDT->getBaseType());
318 }
319}
320
321void DebugInfoFinder::processImportedEntity(const DIImportedEntity *Import) {
322 auto *Entity = Import->getEntity();
323 if (auto *T = dyn_cast<DIType>(Entity))
324 processType(T);
325 else if (auto *SP = dyn_cast<DISubprogram>(Entity))
327 else if (auto *NS = dyn_cast<DINamespace>(Entity))
328 processScope(NS->getScope());
329 else if (auto *M = dyn_cast<DIModule>(Entity))
330 processScope(M->getScope());
331}
332
333/// Process a macro debug info node (DIMacroNode).
334///
335/// A DIMacroNode is one of two types:
336/// - DIMacro: A single macro definition. Add it to the Macros list along with
337/// its containing DIMacroFile.
338/// - DIMacroFile: A file containing macros. Recursively process all nested
339/// macro nodes within it (avoiding duplicates by tracking visited nodes).
340void DebugInfoFinder::processMacroNode(DIMacroNode *Macro,
341 DIMacroFile *CurrentMacroFile) {
342 if (!Macro)
343 return;
344
345 if (auto *M = dyn_cast<DIMacro>(Macro)) {
346 addMacro(M, CurrentMacroFile);
347 return;
348 }
349
350 auto *MF = dyn_cast<DIMacroFile>(Macro);
351 assert(MF &&
352 "Expected a DIMacroFile (it can't be any other type at this point)");
353
354 // Check if we've already seen this macro file to avoid infinite recursion
355 if (!NodesSeen.insert(MF).second)
356 return;
357
358 // Recursively process nested macros in the macro file
359 for (auto *Element : MF->getElements())
360 processMacroNode(Element, MF);
361}
362
363void DebugInfoFinder::processScope(DIScope *Scope) {
364 if (!Scope)
365 return;
366 if (auto *Ty = dyn_cast<DIType>(Scope)) {
367 processType(Ty);
368 return;
369 }
370 if (auto *CU = dyn_cast<DICompileUnit>(Scope)) {
371 addCompileUnit(CU);
372 return;
373 }
374 if (auto *SP = dyn_cast<DISubprogram>(Scope)) {
376 return;
377 }
378 if (!addScope(Scope))
379 return;
380 if (auto *LB = dyn_cast<DILexicalBlockBase>(Scope)) {
381 processScope(LB->getScope());
382 } else if (auto *NS = dyn_cast<DINamespace>(Scope)) {
383 processScope(NS->getScope());
384 } else if (auto *M = dyn_cast<DIModule>(Scope)) {
385 processScope(M->getScope());
386 }
387}
388
390 if (!addSubprogram(SP))
391 return;
392 processScope(SP->getScope());
393 // Some of the users, e.g. CloneFunctionInto / CloneModule, need to set up a
394 // ValueMap containing identity mappings for all of the DICompileUnit's, not
395 // just DISubprogram's, referenced from anywhere within the Function being
396 // cloned prior to calling MapMetadata / RemapInstruction to avoid their
397 // duplication later as DICompileUnit's are also directly referenced by
398 // llvm.dbg.cu list. Therefore we need to collect DICompileUnit's here as
399 // well. Also, DICompileUnit's may reference DISubprogram's too and therefore
400 // need to be at least looked through.
401 processCompileUnit(SP->getUnit());
402 processType(SP->getType());
403 for (auto *Element : SP->getTemplateParams()) {
404 if (auto *TType = dyn_cast<DITemplateTypeParameter>(Element)) {
405 processType(TType->getType());
406 } else if (auto *TVal = dyn_cast<DITemplateValueParameter>(Element)) {
407 processType(TVal->getType());
408 }
409 }
410
411 SP->forEachRetainedNode(
412 [this](DILocalVariable *LV) { processVariable(LV); }, [](DILabel *L) {},
413 [this](DIImportedEntity *IE) { processImportedEntity(IE); },
414 [this](DIType *T) { processType(T); },
415 [this](auto *GVE) { return processGlobalVariableExpression(GVE); });
416}
417
419 if (!NodesSeen.insert(DV).second)
420 return;
421 processScope(DV->getScope());
422 processType(DV->getType());
423}
424
425bool DebugInfoFinder::addType(DIType *DT) {
426 if (!DT)
427 return false;
428
429 if (!NodesSeen.insert(DT).second)
430 return false;
431
432 TYs.push_back(DT);
433 return true;
434}
435
436bool DebugInfoFinder::addCompileUnit(DICompileUnit *CU) {
437 if (!CU)
438 return false;
439 if (!NodesSeen.insert(CU).second)
440 return false;
441
442 CUs.push_back(CU);
443 return true;
444}
445
446bool DebugInfoFinder::addGlobalVariable(DIGlobalVariableExpression *DIG) {
447 if (!NodesSeen.insert(DIG).second)
448 return false;
449
450 GVs.push_back(DIG);
451 return true;
452}
453
454bool DebugInfoFinder::addSubprogram(DISubprogram *SP) {
455 if (!SP)
456 return false;
457
458 if (!NodesSeen.insert(SP).second)
459 return false;
460
461 SPs.push_back(SP);
462 return true;
463}
464
465bool DebugInfoFinder::addScope(DIScope *Scope) {
466 if (!Scope)
467 return false;
468 // FIXME: Ocaml binding generates a scope with no content, we treat it
469 // as null for now.
470 if (Scope->getNumOperands() == 0)
471 return false;
472 if (!NodesSeen.insert(Scope).second)
473 return false;
474 Scopes.push_back(Scope);
475 return true;
476}
477
478bool DebugInfoFinder::addMacro(DIMacro *Macro, DIMacroFile *MacroFile) {
479 if (!Macro)
480 return false;
481
482 if (!NodesSeen.insert(Macro).second)
483 return false;
484
485 Macros.push_back(std::make_pair(Macro, MacroFile));
486 return true;
487}
488
489/// Recursively handle DILocations in followup metadata etc.
490///
491/// TODO: If for example a followup loop metadata would reference itself this
492/// function would go into infinite recursion. We do not expect such cycles in
493/// the loop metadata (except for the self-referencing first element
494/// "LoopID"). However, we could at least handle such situations more gracefully
495/// somehow (e.g. by keeping track of visited nodes and dropping metadata).
497 Metadata *MetadataIn, function_ref<Metadata *(Metadata *)> Updater) {
498 const MDTuple *M = dyn_cast_or_null<MDTuple>(MetadataIn);
499 // The loop metadata options should start with a MDString.
500 if (!M || M->getNumOperands() < 1 || !isa<MDString>(M->getOperand(0)))
501 return MetadataIn;
502
503 bool Updated = false;
504 SmallVector<Metadata *, 4> MDs{M->getOperand(0)};
505 for (Metadata *MD : llvm::drop_begin(M->operands())) {
506 if (!MD) {
507 MDs.push_back(nullptr);
508 continue;
509 }
510 Metadata *NewMD =
511 Updater(updateLoopMetadataDebugLocationsRecursive(MD, Updater));
512 if (NewMD)
513 MDs.push_back(NewMD);
514 Updated |= NewMD != MD;
515 }
516
517 assert(!M->isDistinct() && "M should not be distinct.");
518 return Updated ? MDNode::get(M->getContext(), MDs) : MetadataIn;
519}
520
522 MDNode *OrigLoopID, function_ref<Metadata *(Metadata *)> Updater) {
523 assert(OrigLoopID && OrigLoopID->getNumOperands() > 0 &&
524 "Loop ID needs at least one operand");
525 assert(OrigLoopID && OrigLoopID->getOperand(0).get() == OrigLoopID &&
526 "Loop ID should refer to itself");
527
528 // Save space for the self-referential LoopID.
529 SmallVector<Metadata *, 4> MDs = {nullptr};
530
531 for (Metadata *MD : llvm::drop_begin(OrigLoopID->operands())) {
532 if (!MD)
533 MDs.push_back(nullptr);
534 else if (Metadata *NewMD = Updater(
536 MDs.push_back(NewMD);
537 }
538
539 MDNode *NewLoopID = MDNode::getDistinct(OrigLoopID->getContext(), MDs);
540 // Insert the self-referential LoopID.
541 NewLoopID->replaceOperandWith(0, NewLoopID);
542 return NewLoopID;
543}
544
546 Instruction &I, function_ref<Metadata *(Metadata *)> Updater) {
547 MDNode *OrigLoopID = I.getMetadata(LLVMContext::MD_loop);
548 if (!OrigLoopID)
549 return;
550 MDNode *NewLoopID = updateLoopMetadataDebugLocationsImpl(OrigLoopID, Updater);
551 I.setMetadata(LLVMContext::MD_loop, NewLoopID);
552}
553
554/// Return true if a node is a DILocation or if a DILocation is
555/// indirectly referenced by one of the node's children.
558 Metadata *MD) {
560 if (!N)
561 return false;
562 if (isa<DILocation>(N) || Reachable.count(N))
563 return true;
564 if (!Visited.insert(N).second)
565 return false;
566 for (auto &OpIt : N->operands()) {
567 Metadata *Op = OpIt.get();
568 if (isDILocationReachable(Visited, Reachable, Op)) {
569 // Don't return just yet as we want to visit all MD's children to
570 // initialize DILocationReachable in stripDebugLocFromLoopID
571 Reachable.insert(N);
572 }
573 }
574 return Reachable.count(N);
575}
576
578 SmallPtrSetImpl<Metadata *> &AllDILocation,
579 const SmallPtrSetImpl<Metadata *> &DIReachable,
580 Metadata *MD) {
582 if (!N)
583 return false;
584 if (isa<DILocation>(N) || AllDILocation.count(N))
585 return true;
586 if (!DIReachable.count(N))
587 return false;
588 if (!Visited.insert(N).second)
589 return false;
590 for (auto &OpIt : N->operands()) {
591 Metadata *Op = OpIt.get();
592 if (Op == MD)
593 continue;
594 if (!isAllDILocation(Visited, AllDILocation, DIReachable, Op)) {
595 return false;
596 }
597 }
598 AllDILocation.insert(N);
599 return true;
600}
601
602static Metadata *
604 const SmallPtrSetImpl<Metadata *> &DIReachable, Metadata *MD) {
605 if (isa<DILocation>(MD) || AllDILocation.count(MD))
606 return nullptr;
607
608 if (!DIReachable.count(MD))
609 return MD;
610
612 if (!N)
613 return MD;
614
616 bool HasSelfRef = false;
617 for (unsigned i = 0; i < N->getNumOperands(); ++i) {
618 Metadata *A = N->getOperand(i);
619 if (!A) {
620 Args.push_back(nullptr);
621 } else if (A == MD) {
622 assert(i == 0 && "expected i==0 for self-reference");
623 HasSelfRef = true;
624 Args.push_back(nullptr);
625 } else if (Metadata *NewArg =
626 stripLoopMDLoc(AllDILocation, DIReachable, A)) {
627 Args.push_back(NewArg);
628 }
629 }
630 if (Args.empty() || (HasSelfRef && Args.size() == 1))
631 return nullptr;
632
633 MDNode *NewMD = N->isDistinct() ? MDNode::getDistinct(N->getContext(), Args)
634 : MDNode::get(N->getContext(), Args);
635 if (HasSelfRef)
636 NewMD->replaceOperandWith(0, NewMD);
637 return NewMD;
638}
639
641 assert(!N->operands().empty() && "Missing self reference?");
642 SmallPtrSet<Metadata *, 8> Visited, DILocationReachable, AllDILocation;
643 // If we already visited N, there is nothing to do.
644 if (!Visited.insert(N).second)
645 return N;
646
647 // If there is no debug location, we do not have to rewrite this
648 // MDNode. This loop also initializes DILocationReachable, later
649 // needed by updateLoopMetadataDebugLocationsImpl; the use of
650 // count_if avoids an early exit.
651 if (!llvm::count_if(llvm::drop_begin(N->operands()),
652 [&Visited, &DILocationReachable](const MDOperand &Op) {
653 return isDILocationReachable(
654 Visited, DILocationReachable, Op.get());
655 }))
656 return N;
657
658 Visited.clear();
659 // If there is only the debug location without any actual loop metadata, we
660 // can remove the metadata.
661 if (llvm::all_of(llvm::drop_begin(N->operands()),
662 [&Visited, &AllDILocation,
663 &DILocationReachable](const MDOperand &Op) {
664 return isAllDILocation(Visited, AllDILocation,
665 DILocationReachable, Op.get());
666 }))
667 return nullptr;
668
670 N, [&AllDILocation, &DILocationReachable](Metadata *MD) -> Metadata * {
671 return stripLoopMDLoc(AllDILocation, DILocationReachable, MD);
672 });
673}
674
676 bool Changed = false;
677 if (F.hasMetadata(LLVMContext::MD_dbg)) {
678 Changed = true;
679 F.setSubprogram(nullptr);
680 }
681
683 for (BasicBlock &BB : F) {
685 if (I.getDebugLoc()) {
686 Changed = true;
687 I.setDebugLoc(DebugLoc());
688 }
689 if (auto *LoopID = I.getMetadata(LLVMContext::MD_loop)) {
690 auto *NewLoopID = LoopIDsMap.lookup(LoopID);
691 if (!NewLoopID)
692 NewLoopID = LoopIDsMap[LoopID] = stripDebugLocFromLoopID(LoopID);
693 if (NewLoopID != LoopID)
694 I.setMetadata(LLVMContext::MD_loop, NewLoopID);
695 }
696 // Strip other attachments that are or use debug info.
697 if (I.hasMetadataOtherThanDebugLoc()) {
698 // Heapallocsites point into the DIType system.
699 I.setMetadata("heapallocsite", nullptr);
700 // DIAssignID are debug info metadata primitives.
701 I.setMetadata(LLVMContext::MD_DIAssignID, nullptr);
702 }
703 I.dropDbgRecords();
704 }
705 }
706 return Changed;
707}
708
710 llvm::TimeTraceScope timeScope("Strip debug info");
711 bool Changed = false;
712
713 for (NamedMDNode &NMD : llvm::make_early_inc_range(M.named_metadata())) {
714 // We're stripping debug info, and without them, coverage information
715 // doesn't quite make sense.
716 if (NMD.getName().starts_with("llvm.dbg.") ||
717 NMD.getName() == "llvm.gcov") {
718 NMD.eraseFromParent();
719 Changed = true;
720 }
721 }
722
723 for (Function &F : M)
725
726 for (auto &GV : M.globals()) {
727 Changed |= GV.eraseMetadata(LLVMContext::MD_dbg);
728 }
729
730 if (GVMaterializer *Materializer = M.getMaterializer())
731 Materializer->setStripDebugInfo();
732
733 return Changed;
734}
735
736namespace {
737
738/// Helper class to downgrade -g metadata to -gline-tables-only metadata.
739class DebugTypeInfoRemoval {
741
742public:
743 /// The (void)() type.
744 MDNode *EmptySubroutineType;
745
746private:
747 /// Remember what linkage name we originally had before stripping. If we end
748 /// up making two subprograms identical who originally had different linkage
749 /// names, then we need to make one of them distinct, to avoid them getting
750 /// uniqued. Maps the new node to the old linkage name.
752
753 // TODO: Remember the distinct subprogram we created for a given linkage name,
754 // so that we can continue to unique whenever possible. Map <newly created
755 // node, old linkage name> to the first (possibly distinct) mdsubprogram
756 // created for that combination. This is not strictly needed for correctness,
757 // but can cut down on the number of MDNodes and let us diff cleanly with the
758 // output of -gline-tables-only.
759
760public:
761 DebugTypeInfoRemoval(LLVMContext &C)
762 : EmptySubroutineType(DISubroutineType::get(C, DINode::FlagZero, 0,
763 MDNode::get(C, {}))) {}
764
765 Metadata *map(Metadata *M) {
766 if (!M)
767 return nullptr;
768 auto Replacement = Replacements.find(M);
769 if (Replacement != Replacements.end())
770 return Replacement->second;
771
772 return M;
773 }
774 MDNode *mapNode(Metadata *N) { return dyn_cast_or_null<MDNode>(map(N)); }
775
776 /// Recursively remap N and all its referenced children. Does a DF post-order
777 /// traversal, so as to remap bottoms up.
778 void traverseAndRemap(MDNode *N) { traverse(N); }
779
780private:
781 // Create a new DISubprogram, to replace the one given.
782 DISubprogram *getReplacementSubprogram(DISubprogram *MDS) {
783 auto *FileAndScope = cast_or_null<DIFile>(map(MDS->getFile()));
784 StringRef LinkageName = MDS->getName().empty() ? MDS->getLinkageName() : "";
785 DISubprogram *Declaration = nullptr;
786 auto *Type = cast_or_null<DISubroutineType>(map(MDS->getType()));
787 DIType *ContainingType =
788 cast_or_null<DIType>(map(MDS->getContainingType()));
789 auto *Unit = cast_or_null<DICompileUnit>(map(MDS->getUnit()));
790 auto Variables = nullptr;
791 auto TemplateParams = nullptr;
792
793 // Make a distinct DISubprogram, for situations that warrant it.
794 auto distinctMDSubprogram = [&]() {
795 return DISubprogram::getDistinct(
796 MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
797 FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(),
798 ContainingType, MDS->getVirtualIndex(), MDS->getThisAdjustment(),
799 MDS->getFlags(), MDS->getSPFlags(), Unit, TemplateParams, Declaration,
800 Variables);
801 };
802
803 if (MDS->isDistinct())
804 return distinctMDSubprogram();
805
806 auto *NewMDS = DISubprogram::get(
807 MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
808 FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(), ContainingType,
809 MDS->getVirtualIndex(), MDS->getThisAdjustment(), MDS->getFlags(),
810 MDS->getSPFlags(), Unit, TemplateParams, Declaration, Variables);
811
812 StringRef OldLinkageName = MDS->getLinkageName();
813
814 // See if we need to make a distinct one.
815 auto OrigLinkage = NewToLinkageName.find(NewMDS);
816 if (OrigLinkage != NewToLinkageName.end()) {
817 if (OrigLinkage->second == OldLinkageName)
818 // We're good.
819 return NewMDS;
820
821 // Otherwise, need to make a distinct one.
822 // TODO: Query the map to see if we already have one.
823 return distinctMDSubprogram();
824 }
825
826 NewToLinkageName.insert({NewMDS, MDS->getLinkageName()});
827 return NewMDS;
828 }
829
830 /// Create a new compile unit, to replace the one given
831 DICompileUnit *getReplacementCU(DICompileUnit *CU) {
832 // Drop skeleton CUs.
833 if (CU->getDWOId())
834 return nullptr;
835
836 auto *File = cast_or_null<DIFile>(map(CU->getFile()));
837 MDTuple *EnumTypes = nullptr;
838 MDTuple *RetainedTypes = nullptr;
839 MDTuple *GlobalVariables = nullptr;
840 MDTuple *ImportedEntities = nullptr;
841 return DICompileUnit::getDistinct(
842 CU->getContext(), CU->getSourceLanguage(), File, CU->getProducer(),
843 CU->isOptimized(), CU->getFlags(), CU->getRuntimeVersion(),
845 RetainedTypes, GlobalVariables, ImportedEntities, CU->getMacros(),
846 CU->getDWOId(), CU->getSplitDebugInlining(),
848 CU->getRangesBaseAddress(), CU->getSysRoot(), CU->getSDK());
849 }
850
851 DILocation *getReplacementMDLocation(DILocation *MLD) {
852 auto *Scope = map(MLD->getScope());
853 auto *InlinedAt = map(MLD->getInlinedAt());
854 if (MLD->isDistinct())
855 return DILocation::getDistinct(MLD->getContext(), MLD->getLine(),
856 MLD->getColumn(), Scope, InlinedAt);
857 return DILocation::get(MLD->getContext(), MLD->getLine(), MLD->getColumn(),
858 Scope, InlinedAt);
859 }
860
861 /// Create a new generic MDNode, to replace the one given
862 MDNode *getReplacementMDNode(MDNode *N) {
864 Ops.reserve(N->getNumOperands());
865 for (auto &I : N->operands())
866 if (I)
867 Ops.push_back(map(I));
868 auto *Ret = MDNode::get(N->getContext(), Ops);
869 return Ret;
870 }
871
872 /// Attempt to re-map N to a newly created node.
873 void remap(MDNode *N) {
874 if (Replacements.count(N))
875 return;
876
877 auto doRemap = [&](MDNode *N) -> MDNode * {
878 if (!N)
879 return nullptr;
880 if (auto *MDSub = dyn_cast<DISubprogram>(N)) {
881 remap(MDSub->getUnit());
882 return getReplacementSubprogram(MDSub);
883 }
885 return EmptySubroutineType;
886 if (auto *CU = dyn_cast<DICompileUnit>(N))
887 return getReplacementCU(CU);
888 if (isa<DIFile>(N))
889 return N;
890 if (auto *MDLB = dyn_cast<DILexicalBlockBase>(N))
891 // Remap to our referenced scope (recursively).
892 return mapNode(MDLB->getScope());
893 if (auto *MLD = dyn_cast<DILocation>(N))
894 return getReplacementMDLocation(MLD);
895
896 // Otherwise, if we see these, just drop them now. Not strictly necessary,
897 // but this speeds things up a little.
898 if (isa<DINode>(N))
899 return nullptr;
900
901 return getReplacementMDNode(N);
902 };
903 // Separate recursive doRemap and operator [] into 2 lines to avoid
904 // out-of-order evaluations since both of them can access the same memory
905 // location in map Replacements.
906 auto Value = doRemap(N);
907 Replacements[N] = Value;
908 }
909
910 /// Do the remapping traversal.
911 void traverse(MDNode *);
912};
913
914} // end anonymous namespace
915
916void DebugTypeInfoRemoval::traverse(MDNode *N) {
917 if (!N || Replacements.count(N))
918 return;
919
920 // To avoid cycles, as well as for efficiency sake, we will sometimes prune
921 // parts of the graph.
922 auto prune = [](MDNode *Parent, MDNode *Child) {
923 if (auto *MDS = dyn_cast<DISubprogram>(Parent))
924 return Child == MDS->getRetainedNodes().get();
925 return false;
926 };
927
929 DenseSet<MDNode *> Opened;
930
931 // Visit each node starting at N in post order, and map them.
932 ToVisit.push_back(N);
933 while (!ToVisit.empty()) {
934 auto *N = ToVisit.back();
935 if (!Opened.insert(N).second) {
936 // Close it.
937 remap(N);
938 ToVisit.pop_back();
939 continue;
940 }
941 for (auto &I : N->operands())
942 if (auto *MDN = dyn_cast_or_null<MDNode>(I))
943 if (!Opened.count(MDN) && !Replacements.count(MDN) && !prune(N, MDN) &&
944 !isa<DICompileUnit>(MDN))
945 ToVisit.push_back(MDN);
946 }
947}
948
950 bool Changed = false;
951
952 // Delete non-CU debug info named metadata nodes.
953 for (auto NMI = M.named_metadata_begin(), NME = M.named_metadata_end();
954 NMI != NME;) {
955 NamedMDNode *NMD = &*NMI;
956 ++NMI;
957 // Specifically keep dbg.cu around.
958 if (NMD->getName() == "llvm.dbg.cu")
959 continue;
960 }
961
962 // Drop all dbg attachments from global variables.
963 for (auto &GV : M.globals())
964 GV.eraseMetadata(LLVMContext::MD_dbg);
965
966 DebugTypeInfoRemoval Mapper(M.getContext());
967 auto remap = [&](MDNode *Node) -> MDNode * {
968 if (!Node)
969 return nullptr;
970 Mapper.traverseAndRemap(Node);
971 auto *NewNode = Mapper.mapNode(Node);
972 Changed |= Node != NewNode;
973 Node = NewNode;
974 return NewNode;
975 };
976
977 // Rewrite the DebugLocs to be equivalent to what
978 // -gline-tables-only would have created.
979 for (auto &F : M) {
980 if (auto *SP = F.getSubprogram()) {
981 Mapper.traverseAndRemap(SP);
982 auto *NewSP = cast<DISubprogram>(Mapper.mapNode(SP));
983 Changed |= SP != NewSP;
984 F.setSubprogram(NewSP);
985 }
986 for (auto &BB : F) {
987 for (auto &I : BB) {
988 auto remapDebugLoc = [&](const DebugLoc &DL) -> DebugLoc {
989 auto *Scope = DL.getScope();
990 MDNode *InlinedAt = DL.getInlinedAt();
991 Scope = remap(Scope);
992 InlinedAt = remap(InlinedAt);
993 return DILocation::get(M.getContext(), DL.getLine(), DL.getCol(),
994 Scope, InlinedAt);
995 };
996
997 if (I.getDebugLoc() != DebugLoc())
998 I.setDebugLoc(remapDebugLoc(I.getDebugLoc()));
999
1000 // Remap DILocations in llvm.loop attachments.
1002 if (auto *Loc = dyn_cast_or_null<DILocation>(MD))
1003 return remapDebugLoc(Loc).get();
1004 return MD;
1005 });
1006
1007 // Strip heapallocsite attachments, they point into the DIType system.
1008 if (I.hasMetadataOtherThanDebugLoc())
1009 I.setMetadata("heapallocsite", nullptr);
1010
1011 // Strip any DbgRecords attached.
1012 I.dropDbgRecords();
1013 }
1014 }
1015 }
1016
1017 // Create a new llvm.dbg.cu, which is equivalent to the one
1018 // -gline-tables-only would have created.
1019 for (auto &NMD : M.named_metadata()) {
1021 for (MDNode *Op : NMD.operands())
1022 Ops.push_back(remap(Op));
1023
1024 if (!Changed)
1025 continue;
1026
1027 NMD.clearOperands();
1028 for (auto *Op : Ops)
1029 if (Op)
1030 NMD.addOperand(Op);
1031 }
1032 return Changed;
1033}
1034
1037 M.getModuleFlag("Debug Info Version")))
1038 return Val->getZExtValue();
1039 return 0;
1040}
1041
1045
1047 ArrayRef<const Instruction *> SourceInstructions) {
1048 // Replace all uses (and attachments) of all the DIAssignIDs
1049 // on SourceInstructions with a single merged value.
1050 assert(getFunction() && "Uninserted instruction merged");
1051 // Collect up the DIAssignID tags.
1053 for (const Instruction *I : SourceInstructions) {
1054 if (auto *MD = I->getMetadata(LLVMContext::MD_DIAssignID))
1055 IDs.push_back(cast<DIAssignID>(MD));
1056 assert(getFunction() == I->getFunction() &&
1057 "Merging with instruction from another function not allowed");
1058 }
1059
1060 // Add this instruction's DIAssignID too, if it has one.
1061 if (auto *MD = getMetadata(LLVMContext::MD_DIAssignID))
1062 IDs.push_back(cast<DIAssignID>(MD));
1063
1064 if (IDs.empty())
1065 return; // No DIAssignID tags to process.
1066
1067 DIAssignID *MergeID = IDs[0];
1068 for (DIAssignID *AssignID : drop_begin(IDs)) {
1069 if (AssignID != MergeID)
1070 at::RAUW(AssignID, MergeID);
1071 }
1072 setMetadata(LLVMContext::MD_DIAssignID, MergeID);
1073}
1074
1076
1078 const DebugLoc &DL = getDebugLoc();
1079 if (!DL) {
1081 return;
1082 }
1083
1084 // If this isn't a call, drop the location to allow a location from a
1085 // preceding instruction to propagate.
1086 bool MayLowerToCall = false;
1087 if (isa<CallBase>(this)) {
1088 auto *II = dyn_cast<IntrinsicInst>(this);
1089 MayLowerToCall =
1090 !II || IntrinsicInst::mayLowerToFunctionCall(II->getIntrinsicID());
1091 }
1092
1093 if (!MayLowerToCall) {
1095 return;
1096 }
1097
1098 // Set a line 0 location for calls to preserve scope information in case
1099 // inlining occurs.
1101 if (SP)
1102 // If a function scope is available, set it on the line 0 location. When
1103 // hoisting a call to a predecessor block, using the function scope avoids
1104 // making it look like the callee was reached earlier than it should be.
1106 else
1107 // The parent function has no scope. Go ahead and drop the location. If
1108 // the parent function is inlined, and the callee has a subprogram, the
1109 // inliner will attach a location to the call.
1110 //
1111 // One alternative is to set a line 0 location with the existing scope and
1112 // inlinedAt info. The location might be sensitive to when inlining occurs.
1114}
1115
1116//===----------------------------------------------------------------------===//
1117// LLVM C API implementations.
1118//===----------------------------------------------------------------------===//
1119
1121 switch (lang) {
1122#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \
1123 case LLVMDWARFSourceLanguage##NAME: \
1124 return ID;
1125#include "llvm/BinaryFormat/Dwarf.def"
1126#undef HANDLE_DW_LANG
1127 }
1128 llvm_unreachable("Unhandled Tag");
1129}
1130
1131template <typename DIT> DIT *unwrapDI(LLVMMetadataRef Ref) {
1132 return (DIT *)(Ref ? unwrap<MDNode>(Ref) : nullptr);
1133}
1134
1136 return static_cast<DINode::DIFlags>(Flags);
1137}
1138
1140 return static_cast<LLVMDIFlags>(Flags);
1141}
1142
1144pack_into_DISPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized) {
1145 return DISubprogram::toSPFlags(IsLocalToUnit, IsDefinition, IsOptimized);
1146}
1147
1150}
1151
1155
1159
1163
1167
1169 delete unwrap(Builder);
1170}
1171
1173 unwrap(Builder)->finalize();
1174}
1175
1177 LLVMMetadataRef subprogram) {
1178 unwrap(Builder)->finalizeSubprogram(unwrapDI<DISubprogram>(subprogram));
1179}
1180
1183 LLVMMetadataRef FileRef, const char *Producer, size_t ProducerLen,
1184 LLVMBool isOptimized, const char *Flags, size_t FlagsLen,
1185 unsigned RuntimeVer, const char *SplitName, size_t SplitNameLen,
1186 LLVMDWARFEmissionKind Kind, unsigned DWOId, LLVMBool SplitDebugInlining,
1187 LLVMBool DebugInfoForProfiling, const char *SysRoot, size_t SysRootLen,
1188 const char *SDK, size_t SDKLen) {
1189 auto File = unwrapDI<DIFile>(FileRef);
1190
1191 return wrap(unwrap(Builder)->createCompileUnit(
1193 StringRef(Producer, ProducerLen), isOptimized, StringRef(Flags, FlagsLen),
1194 RuntimeVer, StringRef(SplitName, SplitNameLen),
1195 static_cast<DICompileUnit::DebugEmissionKind>(Kind), DWOId,
1196 SplitDebugInlining, DebugInfoForProfiling,
1198 StringRef(SysRoot, SysRootLen), StringRef(SDK, SDKLen)));
1199}
1200
1203 size_t FilenameLen, const char *Directory,
1204 size_t DirectoryLen) {
1205 return wrap(unwrap(Builder)->createFile(StringRef(Filename, FilenameLen),
1206 StringRef(Directory, DirectoryLen)));
1207}
1208
1211 switch (CSKind) {
1213 return llvm::DIFile::CSK_MD5;
1218 }
1219 llvm_unreachable("Unhandled Checksum Kind");
1220}
1221
1223 LLVMDIBuilderRef Builder, const char *Filename, size_t FilenameLen,
1224 const char *Directory, size_t DirectoryLen, LLVMChecksumKind ChecksumKind,
1225 const char *Checksum, size_t ChecksumLen, const char *Source,
1226 size_t SourceLen) {
1227 StringRef ChkSum = StringRef(Checksum, ChecksumLen);
1228 auto CSK = map_from_llvmChecksumKind(ChecksumKind);
1229 llvm::DIFile::ChecksumInfo<StringRef> CSInfo(CSK, ChkSum);
1230 std::optional<StringRef> Src;
1231 if (SourceLen > 0)
1232 Src = StringRef(Source, SourceLen);
1233 return wrap(unwrap(Builder)->createFile(StringRef(Filename, FilenameLen),
1234 StringRef(Directory, DirectoryLen),
1235 CSInfo, Src));
1236}
1237
1240 const char *Name, size_t NameLen,
1241 const char *ConfigMacros, size_t ConfigMacrosLen,
1242 const char *IncludePath, size_t IncludePathLen,
1243 const char *APINotesFile, size_t APINotesFileLen) {
1244 return wrap(unwrap(Builder)->createModule(
1245 unwrapDI<DIScope>(ParentScope), StringRef(Name, NameLen),
1246 StringRef(ConfigMacros, ConfigMacrosLen),
1247 StringRef(IncludePath, IncludePathLen),
1248 StringRef(APINotesFile, APINotesFileLen)));
1249}
1250
1252 LLVMMetadataRef ParentScope,
1253 const char *Name, size_t NameLen,
1254 LLVMBool ExportSymbols) {
1255 return wrap(unwrap(Builder)->createNameSpace(
1256 unwrapDI<DIScope>(ParentScope), StringRef(Name, NameLen), ExportSymbols));
1257}
1258
1260 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1261 size_t NameLen, const char *LinkageName, size_t LinkageNameLen,
1262 LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1263 LLVMBool IsLocalToUnit, LLVMBool IsDefinition,
1264 unsigned ScopeLine, LLVMDIFlags Flags, LLVMBool IsOptimized) {
1265 return wrap(unwrap(Builder)->createFunction(
1266 unwrapDI<DIScope>(Scope), {Name, NameLen}, {LinkageName, LinkageNameLen},
1267 unwrapDI<DIFile>(File), LineNo, unwrapDI<DISubroutineType>(Ty), ScopeLine,
1268 map_from_llvmDIFlags(Flags),
1269 pack_into_DISPFlags(IsLocalToUnit, IsDefinition, IsOptimized), nullptr,
1270 nullptr, nullptr));
1271}
1272
1273
1275 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope,
1276 LLVMMetadataRef File, unsigned Line, unsigned Col) {
1277 return wrap(unwrap(Builder)->createLexicalBlock(unwrapDI<DIScope>(Scope),
1278 unwrapDI<DIFile>(File),
1279 Line, Col));
1280}
1281
1284 LLVMMetadataRef Scope,
1285 LLVMMetadataRef File,
1286 unsigned Discriminator) {
1287 return wrap(unwrap(Builder)->createLexicalBlockFile(unwrapDI<DIScope>(Scope),
1288 unwrapDI<DIFile>(File),
1289 Discriminator));
1290}
1291
1294 LLVMMetadataRef Scope,
1295 LLVMMetadataRef NS,
1296 LLVMMetadataRef File,
1297 unsigned Line) {
1298 return wrap(unwrap(Builder)->createImportedModule(unwrapDI<DIScope>(Scope),
1300 unwrapDI<DIFile>(File),
1301 Line));
1302}
1303
1305 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope,
1306 LLVMMetadataRef ImportedEntity, LLVMMetadataRef File, unsigned Line,
1307 LLVMMetadataRef *Elements, unsigned NumElements) {
1308 auto Elts =
1309 (NumElements > 0)
1310 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1311 : nullptr;
1312 return wrap(unwrap(Builder)->createImportedModule(
1313 unwrapDI<DIScope>(Scope), unwrapDI<DIImportedEntity>(ImportedEntity),
1314 unwrapDI<DIFile>(File), Line, Elts));
1315}
1316
1319 LLVMMetadataRef File, unsigned Line, LLVMMetadataRef *Elements,
1320 unsigned NumElements) {
1321 auto Elts =
1322 (NumElements > 0)
1323 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1324 : nullptr;
1325 return wrap(unwrap(Builder)->createImportedModule(
1327 Line, Elts));
1328}
1329
1332 LLVMMetadataRef File, unsigned Line, const char *Name, size_t NameLen,
1333 LLVMMetadataRef *Elements, unsigned NumElements) {
1334 auto Elts =
1335 (NumElements > 0)
1336 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1337 : nullptr;
1338 return wrap(unwrap(Builder)->createImportedDeclaration(
1340 Line, {Name, NameLen}, Elts));
1341}
1342
1345 unsigned Column, LLVMMetadataRef Scope,
1346 LLVMMetadataRef InlinedAt) {
1347 return wrap(DILocation::get(*unwrap(Ctx), Line, Column, unwrap(Scope),
1348 unwrap(InlinedAt)));
1349}
1350
1352 return unwrapDI<DILocation>(Location)->getLine();
1353}
1354
1356 return unwrapDI<DILocation>(Location)->getColumn();
1357}
1358
1362
1364 return wrap(unwrapDI<DILocation>(Location)->getInlinedAt());
1365}
1366
1368 return wrap(unwrapDI<DIScope>(Scope)->getFile());
1369}
1370
1371const char *LLVMDIFileGetDirectory(LLVMMetadataRef File, unsigned *Len) {
1372 auto Dir = unwrapDI<DIFile>(File)->getDirectory();
1373 *Len = Dir.size();
1374 return Dir.data();
1375}
1376
1377const char *LLVMDIFileGetFilename(LLVMMetadataRef File, unsigned *Len) {
1378 auto Name = unwrapDI<DIFile>(File)->getFilename();
1379 *Len = Name.size();
1380 return Name.data();
1381}
1382
1383const char *LLVMDIFileGetSource(LLVMMetadataRef File, unsigned *Len) {
1384 if (auto Src = unwrapDI<DIFile>(File)->getSource()) {
1385 *Len = Src->size();
1386 return Src->data();
1387 }
1388 *Len = 0;
1389 return "";
1390}
1391
1393 LLVMMetadataRef ParentMacroFile,
1394 unsigned Line,
1396 const char *Name, size_t NameLen,
1397 const char *Value, size_t ValueLen) {
1398 return wrap(
1399 unwrap(Builder)->createMacro(unwrapDI<DIMacroFile>(ParentMacroFile), Line,
1400 static_cast<MacinfoRecordType>(RecordType),
1401 {Name, NameLen}, {Value, ValueLen}));
1402}
1403
1406 LLVMMetadataRef ParentMacroFile, unsigned Line,
1407 LLVMMetadataRef File) {
1408 return wrap(unwrap(Builder)->createTempMacroFile(
1409 unwrapDI<DIMacroFile>(ParentMacroFile), Line, unwrapDI<DIFile>(File)));
1410}
1411
1413 const char *Name, size_t NameLen,
1414 int64_t Value,
1415 LLVMBool IsUnsigned) {
1416 return wrap(unwrap(Builder)->createEnumerator({Name, NameLen}, Value,
1417 IsUnsigned != 0));
1418}
1419
1421 LLVMDIBuilderRef Builder, const char *Name, size_t NameLen,
1422 uint64_t SizeInBits, const uint64_t Words[], LLVMBool IsUnsigned) {
1423 uint64_t NumWords = (SizeInBits + 63) / 64;
1424 return wrap(unwrap(Builder)->createEnumerator(
1425 {Name, NameLen},
1426 APSInt(APInt(SizeInBits, ArrayRef(Words, NumWords)), IsUnsigned != 0)));
1427}
1428
1430 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1431 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1432 uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef *Elements,
1433 unsigned NumElements, LLVMMetadataRef ClassTy) {
1434auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1435 NumElements});
1436return wrap(unwrap(Builder)->createEnumerationType(
1437 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1438 LineNumber, SizeInBits, AlignInBits, Elts, unwrapDI<DIType>(ClassTy)));
1439}
1440
1442 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1443 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1444 uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef BaseTy) {
1445 return wrap(unwrap(Builder)->createSetType(
1446 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1447 LineNumber, SizeInBits, AlignInBits, unwrapDI<DIType>(BaseTy)));
1448}
1449
1451 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1452 size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t SizeInBits,
1453 uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef BaseTy,
1454 LLVMMetadataRef LowerBound, LLVMMetadataRef UpperBound,
1455 LLVMMetadataRef Stride, LLVMMetadataRef Bias) {
1456 return wrap(unwrap(Builder)->createSubrangeType(
1457 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, unwrapDI<DIScope>(Scope),
1458 SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1459 unwrapDI<DIType>(BaseTy), unwrap(LowerBound), unwrap(UpperBound),
1460 unwrap(Stride), unwrap(Bias)));
1461}
1462
1463/// MD may be nullptr, a DIExpression or DIVariable.
1465 if (!MD)
1466 return nullptr;
1467 MDNode *MDN = unwrapDI<MDNode>(MD);
1468 if (auto *E = dyn_cast<DIExpression>(MDN))
1469 return E;
1470 assert(isa<DIVariable>(MDN) && "Expected DIExpression or DIVariable");
1471 return cast<DIVariable>(MDN);
1472}
1473
1475 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1476 size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t Size,
1477 uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts,
1478 unsigned NumSubscripts, LLVMMetadataRef DataLocation,
1479 LLVMMetadataRef Associated, LLVMMetadataRef Allocated, LLVMMetadataRef Rank,
1480 LLVMMetadataRef BitStride) {
1481 auto Subs =
1482 unwrap(Builder)->getOrCreateArray({unwrap(Subscripts), NumSubscripts});
1483 return wrap(unwrap(Builder)->createArrayType(
1484 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1485 Size, AlignInBits, unwrapDI<DIType>(Ty), Subs,
1486 unwrapExprVar(DataLocation), unwrapExprVar(Associated),
1487 unwrapExprVar(Allocated), unwrapExprVar(Rank), unwrap(BitStride)));
1488}
1489
1491 LLVMMetadataRef *Elements, unsigned NumElements) {
1492 auto CT = unwrap<DICompositeType>(*T);
1493 auto Elts =
1494 unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements});
1495 unwrap(Builder)->replaceArrays(CT, Elts);
1496}
1497
1499 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1500 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1501 uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags,
1502 LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang,
1503 const char *UniqueId, size_t UniqueIdLen) {
1504 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1505 NumElements});
1506 return wrap(unwrap(Builder)->createUnionType(
1507 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1508 LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1509 Elts, RunTimeLang, {UniqueId, UniqueIdLen}));
1510}
1511
1512
1515 uint32_t AlignInBits, LLVMMetadataRef Ty,
1516 LLVMMetadataRef *Subscripts,
1517 unsigned NumSubscripts) {
1518 auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts),
1519 NumSubscripts});
1520 return wrap(unwrap(Builder)->createArrayType(Size, AlignInBits,
1521 unwrapDI<DIType>(Ty), Subs));
1522}
1523
1526 uint32_t AlignInBits, LLVMMetadataRef Ty,
1527 LLVMMetadataRef *Subscripts,
1528 unsigned NumSubscripts) {
1529 auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts),
1530 NumSubscripts});
1531 return wrap(unwrap(Builder)->createVectorType(Size, AlignInBits,
1532 unwrapDI<DIType>(Ty), Subs));
1533}
1534
1537 size_t NameLen, uint64_t SizeInBits,
1538 LLVMDWARFTypeEncoding Encoding,
1539 LLVMDIFlags Flags) {
1540 return wrap(unwrap(Builder)->createBasicType({Name, NameLen},
1541 SizeInBits, Encoding,
1542 map_from_llvmDIFlags(Flags)));
1543}
1544
1546 LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeTy,
1547 uint64_t SizeInBits, uint32_t AlignInBits, unsigned AddressSpace,
1548 const char *Name, size_t NameLen) {
1549 return wrap(unwrap(Builder)->createPointerType(
1550 unwrapDI<DIType>(PointeeTy), SizeInBits, AlignInBits, AddressSpace,
1551 {Name, NameLen}));
1552}
1553
1555 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1556 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1557 uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags,
1558 LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements,
1559 unsigned NumElements, unsigned RunTimeLang, LLVMMetadataRef VTableHolder,
1560 const char *UniqueId, size_t UniqueIdLen) {
1561 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1562 NumElements});
1563 return wrap(unwrap(Builder)->createStructType(
1564 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1565 LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1566 unwrapDI<DIType>(DerivedFrom), Elts, RunTimeLang,
1567 unwrapDI<DIType>(VTableHolder), {UniqueId, UniqueIdLen}));
1568}
1569
1571 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1572 size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits,
1573 uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags,
1574 LLVMMetadataRef Ty) {
1575 return wrap(unwrap(Builder)->createMemberType(unwrapDI<DIScope>(Scope),
1576 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, SizeInBits, AlignInBits,
1577 OffsetInBits, map_from_llvmDIFlags(Flags), unwrapDI<DIType>(Ty)));
1578}
1579
1582 size_t NameLen) {
1583 return wrap(unwrap(Builder)->createUnspecifiedType({Name, NameLen}));
1584}
1585
1587 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1588 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1589 LLVMMetadataRef Type, LLVMDIFlags Flags, LLVMValueRef ConstantVal,
1590 uint32_t AlignInBits) {
1591 return wrap(unwrap(Builder)->createStaticMemberType(
1592 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1593 LineNumber, unwrapDI<DIType>(Type), map_from_llvmDIFlags(Flags),
1594 unwrap<Constant>(ConstantVal), DW_TAG_member, AlignInBits));
1595}
1596
1599 const char *Name, size_t NameLen,
1600 LLVMMetadataRef File, unsigned LineNo,
1601 uint64_t SizeInBits, uint32_t AlignInBits,
1602 uint64_t OffsetInBits, LLVMDIFlags Flags,
1603 LLVMMetadataRef Ty, LLVMMetadataRef PropertyNode) {
1604 return wrap(unwrap(Builder)->createObjCIVar(
1605 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1606 SizeInBits, AlignInBits, OffsetInBits,
1608 unwrapDI<MDNode>(PropertyNode)));
1609}
1610
1613 const char *Name, size_t NameLen,
1614 LLVMMetadataRef File, unsigned LineNo,
1615 const char *GetterName, size_t GetterNameLen,
1616 const char *SetterName, size_t SetterNameLen,
1617 unsigned PropertyAttributes,
1618 LLVMMetadataRef Ty) {
1619 return wrap(unwrap(Builder)->createObjCProperty(
1620 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1621 {GetterName, GetterNameLen}, {SetterName, SetterNameLen},
1622 PropertyAttributes, unwrapDI<DIType>(Ty)));
1623}
1624
1628 return wrap(unwrap(Builder)->createObjectPointerType(unwrapDI<DIType>(Type),
1629 Implicit));
1630}
1631
1634 const char *Name, size_t NameLen,
1635 LLVMMetadataRef File, unsigned LineNo,
1636 LLVMMetadataRef Scope, uint32_t AlignInBits) {
1637 return wrap(unwrap(Builder)->createTypedef(
1638 unwrapDI<DIType>(Type), {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1639 unwrapDI<DIScope>(Scope), AlignInBits));
1640}
1641
1645 uint64_t BaseOffset, uint32_t VBPtrOffset,
1646 LLVMDIFlags Flags) {
1647 return wrap(unwrap(Builder)->createInheritance(
1649 BaseOffset, VBPtrOffset, map_from_llvmDIFlags(Flags)));
1650}
1651
1654 LLVMDIBuilderRef Builder, unsigned Tag, const char *Name,
1655 size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line,
1656 unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits,
1657 const char *UniqueIdentifier, size_t UniqueIdentifierLen) {
1658 return wrap(unwrap(Builder)->createForwardDecl(
1659 Tag, {Name, NameLen}, unwrapDI<DIScope>(Scope),
1660 unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits,
1661 AlignInBits, {UniqueIdentifier, UniqueIdentifierLen}));
1662}
1663
1666 LLVMDIBuilderRef Builder, unsigned Tag, const char *Name,
1667 size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line,
1668 unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits,
1669 LLVMDIFlags Flags, const char *UniqueIdentifier,
1670 size_t UniqueIdentifierLen) {
1671 return wrap(unwrap(Builder)->createReplaceableCompositeType(
1672 Tag, {Name, NameLen}, unwrapDI<DIScope>(Scope),
1673 unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits,
1674 AlignInBits, map_from_llvmDIFlags(Flags),
1675 {UniqueIdentifier, UniqueIdentifierLen}));
1676}
1677
1681 return wrap(unwrap(Builder)->createQualifiedType(Tag,
1683}
1684
1688 return wrap(unwrap(Builder)->createReferenceType(Tag,
1690}
1691
1694 return wrap(unwrap(Builder)->createNullPtrType());
1695}
1696
1699 LLVMMetadataRef PointeeType,
1700 LLVMMetadataRef ClassType,
1701 uint64_t SizeInBits,
1702 uint32_t AlignInBits,
1703 LLVMDIFlags Flags) {
1704 return wrap(unwrap(Builder)->createMemberPointerType(
1705 unwrapDI<DIType>(PointeeType),
1706 unwrapDI<DIType>(ClassType), AlignInBits, SizeInBits,
1707 map_from_llvmDIFlags(Flags)));
1708}
1709
1712 LLVMMetadataRef Scope,
1713 const char *Name, size_t NameLen,
1714 LLVMMetadataRef File, unsigned LineNumber,
1715 uint64_t SizeInBits,
1716 uint64_t OffsetInBits,
1717 uint64_t StorageOffsetInBits,
1719 return wrap(unwrap(Builder)->createBitFieldMemberType(
1720 unwrapDI<DIScope>(Scope), {Name, NameLen},
1721 unwrapDI<DIFile>(File), LineNumber,
1722 SizeInBits, OffsetInBits, StorageOffsetInBits,
1724}
1725
1727 LLVMMetadataRef Scope, const char *Name, size_t NameLen,
1728 LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits,
1729 uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags,
1730 LLVMMetadataRef DerivedFrom,
1731 LLVMMetadataRef *Elements, unsigned NumElements,
1732 LLVMMetadataRef VTableHolder, LLVMMetadataRef TemplateParamsNode,
1733 const char *UniqueIdentifier, size_t UniqueIdentifierLen) {
1734 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1735 NumElements});
1736 return wrap(unwrap(Builder)->createClassType(
1737 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1738 LineNumber, SizeInBits, AlignInBits, OffsetInBits,
1739 map_from_llvmDIFlags(Flags), unwrapDI<DIType>(DerivedFrom), Elts,
1740 /*RunTimeLang=*/0, unwrapDI<DIType>(VTableHolder),
1741 unwrapDI<MDNode>(TemplateParamsNode),
1742 {UniqueIdentifier, UniqueIdentifierLen}));
1743}
1744
1748 return wrap(unwrap(Builder)->createArtificialType(unwrapDI<DIType>(Type)));
1749}
1750
1752 return unwrapDI<DINode>(MD)->getTag();
1753}
1754
1755const char *LLVMDITypeGetName(LLVMMetadataRef DType, size_t *Length) {
1756 StringRef Str = unwrapDI<DIType>(DType)->getName();
1757 *Length = Str.size();
1758 return Str.data();
1759}
1760
1762 return unwrapDI<DIType>(DType)->getSizeInBits();
1763}
1764
1766 return unwrapDI<DIType>(DType)->getOffsetInBits();
1767}
1768
1770 return unwrapDI<DIType>(DType)->getAlignInBits();
1771}
1772
1774 return unwrapDI<DIType>(DType)->getLine();
1775}
1776
1780
1782 LLVMMetadataRef *Types,
1783 size_t Length) {
1784 return wrap(
1785 unwrap(Builder)->getOrCreateTypeArray({unwrap(Types), Length}).get());
1786}
1787
1790 LLVMMetadataRef File,
1791 LLVMMetadataRef *ParameterTypes,
1792 unsigned NumParameterTypes,
1793 LLVMDIFlags Flags) {
1794 auto Elts = unwrap(Builder)->getOrCreateTypeArray({unwrap(ParameterTypes),
1795 NumParameterTypes});
1796 return wrap(unwrap(Builder)->createSubroutineType(
1797 Elts, map_from_llvmDIFlags(Flags)));
1798}
1799
1801 uint64_t *Addr, size_t Length) {
1802 return wrap(
1803 unwrap(Builder)->createExpression(ArrayRef<uint64_t>(Addr, Length)));
1804}
1805
1808 uint64_t Value) {
1809 return wrap(unwrap(Builder)->createConstantValueExpression(Value));
1810}
1811
1813 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1814 size_t NameLen, const char *Linkage, size_t LinkLen, LLVMMetadataRef File,
1815 unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit,
1816 LLVMMetadataRef Expr, LLVMMetadataRef Decl, uint32_t AlignInBits) {
1817 return wrap(unwrap(Builder)->createGlobalVariableExpression(
1818 unwrapDI<DIScope>(Scope), {Name, NameLen}, {Linkage, LinkLen},
1819 unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit,
1820 true, unwrap<DIExpression>(Expr), unwrapDI<MDNode>(Decl),
1821 nullptr, AlignInBits));
1822}
1823
1827
1832
1836
1840
1842 return unwrapDI<DIVariable>(Var)->getLine();
1843}
1844
1846 size_t Count) {
1847 return wrap(
1848 MDTuple::getTemporary(*unwrap(Ctx), {unwrap(Data), Count}).release());
1849}
1850
1854
1856 LLVMMetadataRef Replacement) {
1857 auto *Node = unwrapDI<MDNode>(TargetMetadata);
1858 Node->replaceAllUsesWith(unwrap(Replacement));
1860}
1861
1863 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1864 size_t NameLen, const char *Linkage, size_t LnkLen, LLVMMetadataRef File,
1865 unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit,
1866 LLVMMetadataRef Decl, uint32_t AlignInBits) {
1867 return wrap(unwrap(Builder)->createTempGlobalVariableFwdDecl(
1868 unwrapDI<DIScope>(Scope), {Name, NameLen}, {Linkage, LnkLen},
1869 unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit,
1870 unwrapDI<MDNode>(Decl), nullptr, AlignInBits));
1871}
1872
1874 LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo,
1876 DbgInstPtr DbgInst = unwrap(Builder)->insertDeclare(
1877 unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
1879 Instr ? InsertPosition(unwrap<Instruction>(Instr)->getIterator())
1880 : nullptr);
1881 // This assert will fail if the module is in the old debug info format.
1882 // This function should only be called if the module is in the new
1883 // debug info format.
1884 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1885 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1886 assert(isa<DbgRecord *>(DbgInst) &&
1887 "Function unexpectedly in old debug info format");
1888 return wrap(cast<DbgRecord *>(DbgInst));
1889}
1890
1892 LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo,
1894 DbgInstPtr DbgInst = unwrap(Builder)->insertDeclare(
1895 unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
1897 // This assert will fail if the module is in the old debug info format.
1898 // This function should only be called if the module is in the new
1899 // debug info format.
1900 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1901 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1902 assert(isa<DbgRecord *>(DbgInst) &&
1903 "Function unexpectedly in old debug info format");
1904 return wrap(cast<DbgRecord *>(DbgInst));
1905}
1906
1908 LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo,
1910 DbgInstPtr DbgInst = unwrap(Builder)->insertDbgValueIntrinsic(
1913 Instr ? InsertPosition(unwrap<Instruction>(Instr)->getIterator())
1914 : nullptr);
1915 // This assert will fail if the module is in the old debug info format.
1916 // This function should only be called if the module is in the new
1917 // debug info format.
1918 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1919 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1920 assert(isa<DbgRecord *>(DbgInst) &&
1921 "Function unexpectedly in old debug info format");
1922 return wrap(cast<DbgRecord *>(DbgInst));
1923}
1924
1926 LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo,
1928 DbgInstPtr DbgInst = unwrap(Builder)->insertDbgValueIntrinsic(
1931 Block ? InsertPosition(unwrap(Block)->end()) : nullptr);
1932 // This assert will fail if the module is in the old debug info format.
1933 // This function should only be called if the module is in the new
1934 // debug info format.
1935 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1936 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1937 assert(isa<DbgRecord *>(DbgInst) &&
1938 "Function unexpectedly in old debug info format");
1939 return wrap(cast<DbgRecord *>(DbgInst));
1940}
1941
1943 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1944 size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1945 LLVMBool AlwaysPreserve, LLVMDIFlags Flags, uint32_t AlignInBits) {
1946 return wrap(unwrap(Builder)->createAutoVariable(
1947 unwrap<DIScope>(Scope), {Name, NameLen}, unwrap<DIFile>(File),
1948 LineNo, unwrap<DIType>(Ty), AlwaysPreserve,
1949 map_from_llvmDIFlags(Flags), AlignInBits));
1950}
1951
1953 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1954 size_t NameLen, unsigned ArgNo, LLVMMetadataRef File, unsigned LineNo,
1955 LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags) {
1956 return wrap(unwrap(Builder)->createParameterVariable(
1957 unwrap<DIScope>(Scope), {Name, NameLen}, ArgNo, unwrap<DIFile>(File),
1958 LineNo, unwrap<DIType>(Ty), AlwaysPreserve,
1959 map_from_llvmDIFlags(Flags)));
1960}
1961
1963 int64_t Lo, int64_t Count) {
1964 return wrap(unwrap(Builder)->getOrCreateSubrange(Lo, Count));
1965}
1966
1969 size_t Length) {
1970 Metadata **DataValue = unwrap(Data);
1971 return wrap(unwrap(Builder)->getOrCreateArray({DataValue, Length}).get());
1972}
1973
1977
1979 unwrap<Function>(Func)->setSubprogram(unwrap<DISubprogram>(SP));
1980}
1981
1983 return unwrapDI<DISubprogram>(Subprogram)->getLine();
1984}
1985
1987 LLVMMetadataRef SubroutineType) {
1988 unwrapDI<DISubprogram>(Subprogram)
1989 ->replaceType(unwrapDI<DISubroutineType>(SubroutineType));
1990}
1991
1995
1997 if (Loc)
1998 unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc(unwrap<DILocation>(Loc)));
1999 else
2000 unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc());
2001}
2002
2004 LLVMMetadataRef Context,
2005 const char *Name, size_t NameLen,
2006 LLVMMetadataRef File, unsigned LineNo,
2007 LLVMBool AlwaysPreserve) {
2008 return wrap(unwrap(Builder)->createLabel(
2009 unwrapDI<DIScope>(Context), StringRef(Name, NameLen),
2010 unwrapDI<DIFile>(File), LineNo, /*Column*/ 0, /*IsArtificial*/ false,
2011 /*CoroSuspendIdx*/ std::nullopt, AlwaysPreserve));
2012}
2013
2015 LLVMMetadataRef LabelInfo,
2016 LLVMMetadataRef Location,
2017 LLVMValueRef InsertBefore) {
2018 DbgInstPtr DbgInst = unwrap(Builder)->insertLabel(
2019 unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location),
2020 InsertBefore
2021 ? InsertPosition(unwrap<Instruction>(InsertBefore)->getIterator())
2022 : nullptr);
2023 // This assert will fail if the module is in the old debug info format.
2024 // This function should only be called if the module is in the new
2025 // debug info format.
2026 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
2027 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
2028 assert(isa<DbgRecord *>(DbgInst) &&
2029 "Function unexpectedly in old debug info format");
2030 return wrap(cast<DbgRecord *>(DbgInst));
2031}
2032
2034 LLVMMetadataRef LabelInfo,
2035 LLVMMetadataRef Location,
2036 LLVMBasicBlockRef InsertAtEnd) {
2037 DbgInstPtr DbgInst = unwrap(Builder)->insertLabel(
2038 unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location),
2039 InsertAtEnd ? InsertPosition(unwrap(InsertAtEnd)->end()) : nullptr);
2040 // This assert will fail if the module is in the old debug info format.
2041 // This function should only be called if the module is in the new
2042 // debug info format.
2043 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
2044 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
2045 assert(isa<DbgRecord *>(DbgInst) &&
2046 "Function unexpectedly in old debug info format");
2047 return wrap(cast<DbgRecord *>(DbgInst));
2048}
2049
2051 switch(unwrap(Metadata)->getMetadataID()) {
2052#define HANDLE_METADATA_LEAF(CLASS) \
2053 case Metadata::CLASS##Kind: \
2054 return (LLVMMetadataKind)LLVM##CLASS##MetadataKind;
2055#include "llvm/IR/Metadata.def"
2056 default:
2058 }
2059}
2060
2062 assert(ID && "Expected non-null ID");
2063 LLVMContext &Ctx = ID->getContext();
2064 auto &Map = Ctx.pImpl->AssignmentIDToInstrs;
2065
2066 auto MapIt = Map.find(ID);
2067 if (MapIt == Map.end())
2068 return make_range(nullptr, nullptr);
2069
2070 return make_range(MapIt->second.begin(), MapIt->second.end());
2071}
2072
2074 for (auto *DVR : getDVRAssignmentMarkers(Inst))
2075 DVR->eraseFromParent();
2076}
2077
2079 // Replace attachments.
2080 AssignmentInstRange InstRange = getAssignmentInsts(Old);
2081 // Use intermediate storage for the instruction ptrs because the
2082 // getAssignmentInsts range iterators will be invalidated by adding and
2083 // removing DIAssignID attachments.
2084 SmallVector<Instruction *> InstVec(InstRange.begin(), InstRange.end());
2085 for (auto *I : InstVec)
2086 I->setMetadata(LLVMContext::MD_DIAssignID, New);
2087
2088 Old->replaceAllUsesWith(New);
2089}
2090
2092 for (BasicBlock &BB : *F) {
2093 for (Instruction &I : BB) {
2094 for (DbgVariableRecord &DVR :
2095 make_early_inc_range(filterDbgVars(I.getDbgRecordRange())))
2096 if (DVR.isDbgAssign())
2097 DVR.eraseFromParent();
2098
2099 I.setMetadata(LLVMContext::MD_DIAssignID, nullptr);
2100 }
2101 }
2102}
2103
2105 const DataLayout &DL, const Value *Dest, uint64_t SliceOffsetInBits,
2106 uint64_t SliceSizeInBits, const DbgVariableRecord *AssignRecord,
2107 std::optional<DIExpression::FragmentInfo> &Result) {
2108 // No overlap if this DbgRecord describes a killed location.
2109 if (AssignRecord->isKillAddress())
2110 return false;
2111
2112 int64_t AddrOffsetInBits;
2113 {
2114 int64_t AddrOffsetInBytes;
2115 SmallVector<uint64_t> PostOffsetOps; //< Unused.
2116 // Bail if we can't find a constant offset (or none) in the expression.
2117 if (!AssignRecord->getAddressExpression()->extractLeadingOffset(
2118 AddrOffsetInBytes, PostOffsetOps))
2119 return false;
2120 AddrOffsetInBits = AddrOffsetInBytes * 8;
2121 }
2122
2123 Value *Addr = AssignRecord->getAddress();
2124 // FIXME: It may not always be zero.
2125 int64_t BitExtractOffsetInBits = 0;
2127 AssignRecord->getFragmentOrEntireVariable();
2128
2129 int64_t OffsetFromLocationInBits; //< Unused.
2131 DL, Dest, SliceOffsetInBits, SliceSizeInBits, Addr, AddrOffsetInBits,
2132 BitExtractOffsetInBits, VarFrag, Result, OffsetFromLocationInBits);
2133}
2134
2135/// Update inlined instructions' DIAssignID metadata. We need to do this
2136/// otherwise a function inlined more than once into the same function
2137/// will cause DIAssignID to be shared by many instructions.
2139 Instruction &I) {
2140 auto GetNewID = [&Map](Metadata *Old) {
2141 DIAssignID *OldID = cast<DIAssignID>(Old);
2142 if (DIAssignID *NewID = Map.lookup(OldID))
2143 return NewID;
2145 Map[OldID] = NewID;
2146 return NewID;
2147 };
2148 // If we find a DIAssignID attachment or use, replace it with a new version.
2149 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
2150 if (DVR.isDbgAssign())
2151 DVR.setAssignId(GetNewID(DVR.getAssignID()));
2152 }
2153 if (auto *ID = I.getMetadata(LLVMContext::MD_DIAssignID))
2154 I.setMetadata(LLVMContext::MD_DIAssignID, GetNewID(ID));
2155}
2156
2157/// Collect constant properties (base, size, offset) of \p StoreDest.
2158/// Return std::nullopt if any properties are not constants or the
2159/// offset from the base pointer is negative.
2160static std::optional<AssignmentInfo>
2161getAssignmentInfoImpl(const DataLayout &DL, const Value *StoreDest,
2162 TypeSize SizeInBits) {
2163 if (SizeInBits.isScalable())
2164 return std::nullopt;
2165 APInt GEPOffset(DL.getIndexTypeSizeInBits(StoreDest->getType()), 0);
2166 const Value *Base = StoreDest->stripAndAccumulateConstantOffsets(
2167 DL, GEPOffset, /*AllowNonInbounds*/ true);
2168
2169 if (GEPOffset.isNegative())
2170 return std::nullopt;
2171
2172 uint64_t OffsetInBytes = GEPOffset.getLimitedValue();
2173 // Check for overflow.
2174 if (OffsetInBytes == UINT64_MAX)
2175 return std::nullopt;
2176 if (const auto *Alloca = dyn_cast<AllocaInst>(Base))
2177 if (!DL.getTypeSizeInBits(Alloca->getAllocatedType()).isScalable())
2178 return AssignmentInfo(DL, Alloca, OffsetInBytes * 8, SizeInBits);
2179 return std::nullopt;
2180}
2181
2182std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2183 const MemIntrinsic *I) {
2184 const Value *StoreDest = I->getRawDest();
2185 // Assume 8 bit bytes.
2186 auto *ConstLengthInBytes = dyn_cast<ConstantInt>(I->getLength());
2187 if (!ConstLengthInBytes)
2188 // We can't use a non-const size, bail.
2189 return std::nullopt;
2190 uint64_t SizeInBits = 8 * ConstLengthInBytes->getZExtValue();
2191 return getAssignmentInfoImpl(DL, StoreDest, TypeSize::getFixed(SizeInBits));
2192}
2193
2194std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2195 const StoreInst *SI) {
2196 TypeSize SizeInBits = DL.getTypeSizeInBits(SI->getValueOperand()->getType());
2197 return getAssignmentInfoImpl(DL, SI->getPointerOperand(), SizeInBits);
2198}
2199
2200std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2201 const AllocaInst *AI) {
2202 TypeSize SizeInBits = DL.getTypeSizeInBits(AI->getAllocatedType());
2203 return getAssignmentInfoImpl(DL, AI, SizeInBits);
2204}
2205
2206/// Returns nullptr if the assignment shouldn't be attributed to this variable.
2207static void emitDbgAssign(AssignmentInfo Info, Value *Val, Value *Dest,
2208 Instruction &StoreLikeInst, const VarRecord &VarRec,
2209 DIBuilder &DIB) {
2210 auto *ID = StoreLikeInst.getMetadata(LLVMContext::MD_DIAssignID);
2211 assert(ID && "Store instruction must have DIAssignID metadata");
2212 (void)ID;
2213
2214 const uint64_t StoreStartBit = Info.OffsetInBits;
2215 const uint64_t StoreEndBit = Info.OffsetInBits + Info.SizeInBits;
2216
2217 uint64_t FragStartBit = StoreStartBit;
2218 uint64_t FragEndBit = StoreEndBit;
2219
2220 bool StoreToWholeVariable = Info.StoreToWholeAlloca;
2221 if (auto Size = VarRec.Var->getSizeInBits()) {
2222 // NOTE: trackAssignments doesn't understand base expressions yet, so all
2223 // variables that reach here are guaranteed to start at offset 0 in the
2224 // alloca.
2225 const uint64_t VarStartBit = 0;
2226 const uint64_t VarEndBit = *Size;
2227
2228 // FIXME: trim FragStartBit when nonzero VarStartBit is supported.
2229 FragEndBit = std::min(FragEndBit, VarEndBit);
2230
2231 // Discard stores to bits outside this variable.
2232 if (FragStartBit >= FragEndBit)
2233 return;
2234
2235 StoreToWholeVariable = FragStartBit <= VarStartBit && FragEndBit >= *Size;
2236 }
2237
2238 DIExpression *Expr = DIExpression::get(StoreLikeInst.getContext(), {});
2239 if (!StoreToWholeVariable) {
2240 auto R = DIExpression::createFragmentExpression(Expr, FragStartBit,
2241 FragEndBit - FragStartBit);
2242 assert(R.has_value() && "failed to create fragment expression");
2243 Expr = *R;
2244 }
2245 DIExpression *AddrExpr = DIExpression::get(StoreLikeInst.getContext(), {});
2247 &StoreLikeInst, Val, VarRec.Var, Expr, Dest, AddrExpr, VarRec.DL);
2248 (void)Assign;
2249 LLVM_DEBUG(if (Assign) errs() << " > INSERT: " << *Assign << "\n");
2250}
2251
2252#undef DEBUG_TYPE // Silence redefinition warning (from ConstantsContext.h).
2253#define DEBUG_TYPE "assignment-tracking"
2254
2256 const StorageToVarsMap &Vars, const DataLayout &DL,
2257 bool DebugPrints) {
2258 // Early-exit if there are no interesting variables.
2259 if (Vars.empty())
2260 return;
2261
2262 auto &Ctx = Start->getContext();
2263 auto &Module = *Start->getModule();
2264
2265 // Poison type doesn't matter, so long as it isn't void. Let's just use i1.
2267 DIBuilder DIB(Module, /*AllowUnresolved*/ false);
2268
2269 // Scan the instructions looking for stores to local variables' storage.
2270 LLVM_DEBUG(errs() << "# Scanning instructions\n");
2271 for (auto BBI = Start; BBI != End; ++BBI) {
2272 for (Instruction &I : *BBI) {
2273
2274 std::optional<AssignmentInfo> Info;
2275 Value *ValueComponent = nullptr;
2276 Value *DestComponent = nullptr;
2277 if (auto *AI = dyn_cast<AllocaInst>(&I)) {
2278 // We want to track the variable's stack home from its alloca's
2279 // position onwards so we treat it as an assignment (where the stored
2280 // value is poison).
2281 Info = getAssignmentInfo(DL, AI);
2282 ValueComponent = Poison;
2283 DestComponent = AI;
2284 } else if (auto *SI = dyn_cast<StoreInst>(&I)) {
2285 Info = getAssignmentInfo(DL, SI);
2286 ValueComponent = SI->getValueOperand();
2287 DestComponent = SI->getPointerOperand();
2288 } else if (auto *MI = dyn_cast<MemTransferInst>(&I)) {
2289 Info = getAssignmentInfo(DL, MI);
2290 // May not be able to represent this value easily.
2291 ValueComponent = Poison;
2292 DestComponent = MI->getOperand(0);
2293 } else if (auto *MI = dyn_cast<MemSetInst>(&I)) {
2294 Info = getAssignmentInfo(DL, MI);
2295 // If we're zero-initing we can state the assigned value is zero,
2296 // otherwise use undef.
2297 auto *ConstValue = dyn_cast<ConstantInt>(MI->getOperand(1));
2298 if (ConstValue && ConstValue->isZero())
2299 ValueComponent = ConstValue;
2300 else
2301 ValueComponent = Poison;
2302 DestComponent = MI->getOperand(0);
2303 } else {
2304 // Not a store-like instruction.
2305 continue;
2306 }
2307
2308 assert(ValueComponent && DestComponent);
2309 LLVM_DEBUG(errs() << "SCAN: Found store-like: " << I << "\n");
2310
2311 // Check if getAssignmentInfo failed to understand this store.
2312 if (!Info.has_value()) {
2313 LLVM_DEBUG(
2314 errs()
2315 << " | SKIP: Untrackable store (e.g. through non-const gep)\n");
2316 continue;
2317 }
2318 LLVM_DEBUG(errs() << " | BASE: " << *Info->Base << "\n");
2319
2320 // Check if the store destination is a local variable with debug info.
2321 auto LocalIt = Vars.find(Info->Base);
2322 if (LocalIt == Vars.end()) {
2323 LLVM_DEBUG(
2324 errs()
2325 << " | SKIP: Base address not associated with local variable\n");
2326 continue;
2327 }
2328
2329 DIAssignID *ID =
2330 cast_or_null<DIAssignID>(I.getMetadata(LLVMContext::MD_DIAssignID));
2331 if (!ID) {
2333 I.setMetadata(LLVMContext::MD_DIAssignID, ID);
2334 }
2335
2336 for (const VarRecord &R : LocalIt->second)
2337 emitDbgAssign(*Info, ValueComponent, DestComponent, I, R, DIB);
2338 }
2339 }
2340}
2341
2342bool AssignmentTrackingPass::runOnFunction(Function &F) {
2343 // No value in assignment tracking without optimisations.
2344 if (F.hasFnAttribute(Attribute::OptimizeNone))
2345 return /*Changed*/ false;
2346
2347 bool Changed = false;
2348 auto *DL = &F.getDataLayout();
2349 // Collect a map of {backing storage : dbg.declares} (currently "backing
2350 // storage" is limited to Allocas). We'll use this to find dbg.declares to
2351 // delete after running `trackAssignments`.
2353 // Create another similar map of {storage : variables} that we'll pass to
2354 // trackAssignments.
2355 StorageToVarsMap Vars;
2356 auto ProcessDeclare = [&](DbgVariableRecord &Declare) {
2357 // FIXME: trackAssignments doesn't let you specify any modifiers to the
2358 // variable (e.g. fragment) or location (e.g. offset), so we have to
2359 // leave dbg.declares with non-empty expressions in place.
2360 if (Declare.getExpression()->getNumElements() != 0)
2361 return;
2362 if (!Declare.getAddress())
2363 return;
2364 if (AllocaInst *Alloca =
2365 dyn_cast<AllocaInst>(Declare.getAddress()->stripPointerCasts())) {
2366 // FIXME: Skip VLAs for now (let these variables use dbg.declares).
2367 if (!Alloca->isStaticAlloca())
2368 return;
2369 // Similarly, skip scalable vectors (use dbg.declares instead).
2370 if (auto Sz = Alloca->getAllocationSize(*DL); Sz && Sz->isScalable())
2371 return;
2372 DVRDeclares[Alloca].insert(&Declare);
2373 Vars[Alloca].insert(VarRecord(&Declare));
2374 }
2375 };
2376 for (auto &BB : F) {
2377 for (auto &I : BB) {
2378 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
2379 if (DVR.isDbgDeclare())
2380 ProcessDeclare(DVR);
2381 }
2382 }
2383 }
2384
2385 // FIXME: Locals can be backed by caller allocas (sret, byval).
2386 // Note: trackAssignments doesn't respect dbg.declare's IR positions (as it
2387 // doesn't "understand" dbg.declares). However, this doesn't appear to break
2388 // any rules given this description of dbg.declare from
2389 // llvm/docs/SourceLevelDebugging.md:
2390 //
2391 // It is not control-dependent, meaning that if a call to llvm.dbg.declare
2392 // exists and has a valid location argument, that address is considered to
2393 // be the true home of the variable across its entire lifetime.
2394 trackAssignments(F.begin(), F.end(), Vars, *DL);
2395
2396 // Delete dbg.declares for variables now tracked with assignment tracking.
2397 for (auto &[Insts, Declares] : DVRDeclares) {
2399 for (auto *Declare : Declares) {
2400 // Assert that the alloca that Declare uses is now linked to a dbg.assign
2401 // describing the same variable (i.e. check that this dbg.declare has
2402 // been replaced by a dbg.assign). Use DebugVariableAggregate to Discard
2403 // the fragment part because trackAssignments may alter the
2404 // fragment. e.g. if the alloca is smaller than the variable, then
2405 // trackAssignments will create an alloca-sized fragment for the
2406 // dbg.assign.
2407 assert(llvm::any_of(Markers, [Declare](auto *Assign) {
2408 return DebugVariableAggregate(Assign) ==
2409 DebugVariableAggregate(Declare);
2410 }));
2411 // Delete Declare because the variable location is now tracked using
2412 // assignment tracking.
2413 Declare->eraseFromParent();
2414 Changed = true;
2415 }
2416 };
2417 return Changed;
2418}
2419
2421 "debug-info-assignment-tracking";
2422
2426 ConstantInt::get(Type::getInt1Ty(M.getContext()), 1)));
2427}
2428
2430 Metadata *Value = M.getModuleFlag(AssignmentTrackingModuleFlag);
2431 return Value && !cast<ConstantAsMetadata>(Value)->getValue()->isNullValue();
2432}
2433
2437
2440 if (!runOnFunction(F))
2441 return PreservedAnalyses::all();
2442
2443 // Record that this module uses assignment tracking. It doesn't matter that
2444 // some functions in the module may not use it - the debug info in those
2445 // functions will still be handled properly.
2446 setAssignmentTrackingModuleFlag(*F.getParent());
2447
2448 // Q: Can we return a less conservative set than just CFGAnalyses? Can we
2449 // return PreservedAnalyses::all()?
2452 return PA;
2453}
2454
2457 bool Changed = false;
2458 for (auto &F : M)
2459 Changed |= runOnFunction(F);
2460
2461 if (!Changed)
2462 return PreservedAnalyses::all();
2463
2464 // Record that this module uses assignment tracking.
2466
2467 // Q: Can we return a less conservative set than just CFGAnalyses? Can we
2468 // return PreservedAnalyses::all()?
2471 return PA;
2472}
2473
2474#undef DEBUG_TYPE
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static DISubprogram * getSubprogram(bool IsDistinct, Ts &&...Args)
static DIImportedEntity * createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope *Context, Metadata *NS, DIFile *File, unsigned Line, StringRef Name, DINodeArray Elements, SmallVectorImpl< TrackingMDNodeRef > &ImportedModules)
DXIL Finalize Linkage
dxil translate DXIL Translate Metadata
static void setAssignmentTrackingModuleFlag(Module &M)
static DISubprogram::DISPFlags pack_into_DISPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized)
static void findDbgIntrinsics(Value *V, SmallVectorImpl< DbgVariableRecord * > &DbgVariableRecords)
static Metadata * stripLoopMDLoc(const SmallPtrSetImpl< Metadata * > &AllDILocation, const SmallPtrSetImpl< Metadata * > &DIReachable, Metadata *MD)
static llvm::DIFile::ChecksumKind map_from_llvmChecksumKind(LLVMChecksumKind CSKind)
static MDNode * updateLoopMetadataDebugLocationsImpl(MDNode *OrigLoopID, function_ref< Metadata *(Metadata *)> Updater)
static MDNode * stripDebugLocFromLoopID(MDNode *N)
static const char * AssignmentTrackingModuleFlag
static DINode::DIFlags map_from_llvmDIFlags(LLVMDIFlags Flags)
static unsigned map_from_llvmDWARFsourcelanguage(LLVMDWARFSourceLanguage lang)
static void emitDbgAssign(AssignmentInfo Info, Value *Val, Value *Dest, Instruction &StoreLikeInst, const VarRecord &VarRec, DIBuilder &DIB)
Returns nullptr if the assignment shouldn't be attributed to this variable.
static LLVMDIFlags map_to_llvmDIFlags(DINode::DIFlags Flags)
static bool getAssignmentTrackingModuleFlag(const Module &M)
PointerUnion< DIExpression *, DIVariable * > unwrapExprVar(LLVMMetadataRef MD)
MD may be nullptr, a DIExpression or DIVariable.
static bool isAllDILocation(SmallPtrSetImpl< Metadata * > &Visited, SmallPtrSetImpl< Metadata * > &AllDILocation, const SmallPtrSetImpl< Metadata * > &DIReachable, Metadata *MD)
static Metadata * updateLoopMetadataDebugLocationsRecursive(Metadata *MetadataIn, function_ref< Metadata *(Metadata *)> Updater)
Recursively handle DILocations in followup metadata etc.
static bool isDILocationReachable(SmallPtrSetImpl< Metadata * > &Visited, SmallPtrSetImpl< Metadata * > &Reachable, Metadata *MD)
Return true if a node is a DILocation or if a DILocation is indirectly referenced by one of the node'...
DIT * unwrapDI(LLVMMetadataRef Ref)
static std::optional< AssignmentInfo > getAssignmentInfoImpl(const DataLayout &DL, const Value *StoreDest, TypeSize SizeInBits)
Collect constant properties (base, size, offset) of StoreDest.
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
IRTranslator LLVM IR MI
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file contains the declarations for metadata subclasses.
#define T
uint64_t IntrinsicInst * II
static constexpr StringLiteral Filename
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:330
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition APInt.h:476
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
an instruction to allocate memory on the stack
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
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:1573
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:1565
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:1482
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a temporary node.
Definition Metadata.h:1531
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:1753
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:528
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:221
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateEnumerator(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, int64_t Value, LLVMBool IsUnsigned)
Create debugging information entry for an enumerator.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateConstantValueExpression(LLVMDIBuilderRef Builder, uint64_t Value)
Create a new descriptor for the specified variable that does not have an address, but does have a con...
LLVM_C_ABI void LLVMDIBuilderFinalize(LLVMDIBuilderRef Builder)
Construct any deferred debug info descriptors.
LLVM_C_ABI void LLVMSetSubprogram(LLVMValueRef Func, LLVMMetadataRef SP)
Set the subprogram attached to a function.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateSetType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef BaseTy)
Create debugging information entry for a set.
LLVM_C_ABI void LLVMDIBuilderFinalizeSubprogram(LLVMDIBuilderRef Builder, LLVMMetadataRef Subprogram)
Finalize a specific subprogram.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateMacro(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentMacroFile, unsigned Line, LLVMDWARFMacinfoRecordType RecordType, const char *Name, size_t NameLen, const char *Value, size_t ValueLen)
Create debugging information entry for a macro.
LLVM_C_ABI LLVMDbgRecordRef LLVMDIBuilderInsertDbgValueRecordAtEnd(LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMBasicBlockRef Block)
Only use in "new debug format" (LLVMIsNewDbgInfoFormat() is true).
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateUnspecifiedType(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen)
Create a DWARF unspecified type.
LLVM_C_ABI LLVMDIBuilderRef LLVMCreateDIBuilderDisallowUnresolved(LLVMModuleRef M)
Construct a builder for a module, and do not allow for unresolved nodes attached to the module.
LLVM_C_ABI LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef Ctx, LLVMMetadataRef *Data, size_t NumElements)
Create a new temporary MDNode.
LLVM_C_ABI LLVMMetadataRef LLVMDIScopeGetFile(LLVMMetadataRef Scope)
Get the metadata of the file associated with a given scope.
LLVM_C_ABI LLVMDbgRecordRef LLVMDIBuilderInsertDeclareRecordBefore(LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMValueRef Instr)
Only use in "new debug format" (LLVMIsNewDbgInfoFormat() is true).
LLVM_C_ABI LLVMDIBuilderRef LLVMCreateDIBuilder(LLVMModuleRef M)
Construct a builder for a module and collect unresolved nodes attached to the module in order to reso...
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateLabel(LLVMDIBuilderRef Builder, LLVMMetadataRef Context, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMBool AlwaysPreserve)
Create a new descriptor for a label.
LLVM_C_ABI const char * LLVMDIFileGetSource(LLVMMetadataRef File, unsigned *Len)
Get the source of a given file.
LLVM_C_ABI unsigned LLVMDILocationGetColumn(LLVMMetadataRef Location)
Get the column number of this debug location.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateExpression(LLVMDIBuilderRef Builder, uint64_t *Addr, size_t Length)
Create a new descriptor for the specified variable which has a complex address expression for its add...
LLVM_C_ABI const char * LLVMDIFileGetFilename(LLVMMetadataRef File, unsigned *Len)
Get the name of a given file.
LLVM_C_ABI LLVMMetadataRef LLVMGetSubprogram(LLVMValueRef Func)
Get the metadata of the subprogram attached to a function.
LLVMDWARFSourceLanguage
Source languages known by DWARF.
Definition DebugInfo.h:79
LLVM_C_ABI LLVMDbgRecordRef LLVMDIBuilderInsertLabelAtEnd(LLVMDIBuilderRef Builder, LLVMMetadataRef LabelInfo, LLVMMetadataRef Location, LLVMBasicBlockRef InsertAtEnd)
Insert a new llvm.dbg.label intrinsic call.
LLVM_C_ABI LLVMMetadataRef LLVMInstructionGetDebugLoc(LLVMValueRef Inst)
Get the debug location for the given instruction.
LLVM_C_ABI LLVMDbgRecordRef LLVMDIBuilderInsertDeclareRecordAtEnd(LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMBasicBlockRef Block)
Only use in "new debug format" (LLVMIsNewDbgInfoFormat() is true).
LLVM_C_ABI void LLVMDisposeDIBuilder(LLVMDIBuilderRef Builder)
Deallocates the DIBuilder and everything it owns.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateUnionType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang, const char *UniqueId, size_t UniqueIdLen)
Create debugging information entry for a union.
LLVM_C_ABI LLVMDbgRecordRef LLVMDIBuilderInsertDbgValueRecordBefore(LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMValueRef Instr)
Only use in "new debug format" (LLVMIsNewDbgInfoFormat() is true).
LLVM_C_ABI LLVMMetadataRef LLVMDIGlobalVariableExpressionGetVariable(LLVMMetadataRef GVE)
Retrieves the DIVariable associated with this global variable expression.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderGetOrCreateArray(LLVMDIBuilderRef Builder, LLVMMetadataRef *Data, size_t NumElements)
Create an array of DI Nodes.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateFunction(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, const char *LinkageName, size_t LinkageNameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool IsLocalToUnit, LLVMBool IsDefinition, unsigned ScopeLine, LLVMDIFlags Flags, LLVMBool IsOptimized)
Create a new descriptor for the specified subprogram.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateParameterVariable(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, unsigned ArgNo, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags)
Create a new descriptor for a function parameter variable.
LLVM_C_ABI uint64_t LLVMDITypeGetSizeInBits(LLVMMetadataRef DType)
Get the size of this DIType in bits.
LLVM_C_ABI void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef TempTargetMetadata, LLVMMetadataRef Replacement)
Replace all uses of temporary metadata.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderGetOrCreateTypeArray(LLVMDIBuilderRef Builder, LLVMMetadataRef *Data, size_t NumElements)
Create a type array.
LLVM_C_ABI LLVMMetadataRef LLVMDIGlobalVariableExpressionGetExpression(LLVMMetadataRef GVE)
Retrieves the DIExpression associated with this global variable expression.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateFileWithChecksum(LLVMDIBuilderRef Builder, const char *Filename, size_t FilenameLen, const char *Directory, size_t DirectoryLen, LLVMChecksumKind ChecksumKind, const char *Checksum, size_t ChecksumLen, const char *Source, size_t SourceLen)
Create a file descriptor to hold debugging information for a file.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateBitFieldMemberType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint64_t OffsetInBits, uint64_t StorageOffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef Type)
Create debugging information entry for a bit field member.
LLVMDIFlags
Debug info flags.
Definition DebugInfo.h:35
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateFile(LLVMDIBuilderRef Builder, const char *Filename, size_t FilenameLen, const char *Directory, size_t DirectoryLen)
Create a file descriptor to hold debugging information for a file.
LLVM_C_ABI unsigned LLVMDebugMetadataVersion(void)
The current debug metadata version number.
LLVM_C_ABI unsigned LLVMGetModuleDebugMetadataVersion(LLVMModuleRef Module)
The version of debug metadata that's present in the provided Module.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateObjCIVar(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef Ty, LLVMMetadataRef PropertyNode)
Create debugging information entry for Objective-C instance variable.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateTempGlobalVariableFwdDecl(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, const char *Linkage, size_t LnkLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit, LLVMMetadataRef Decl, uint32_t AlignInBits)
Create a new descriptor for the specified global variable that is temporary and meant to be RAUWed.
LLVM_C_ABI void LLVMDISubprogramReplaceType(LLVMMetadataRef Subprogram, LLVMMetadataRef SubroutineType)
Replace the subprogram subroutine type.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateForwardDecl(LLVMDIBuilderRef Builder, unsigned Tag, const char *Name, size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits, const char *UniqueIdentifier, size_t UniqueIdentifierLen)
Create a permanent forward-declared type.
LLVM_C_ABI LLVMMetadataRef LLVMDIVariableGetScope(LLVMMetadataRef Var)
Get the metadata of the scope associated with a given variable.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateGlobalVariableExpression(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, const char *Linkage, size_t LinkLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit, LLVMMetadataRef Expr, LLVMMetadataRef Decl, uint32_t AlignInBits)
Create a new descriptor for the specified variable.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateCompileUnit(LLVMDIBuilderRef Builder, LLVMDWARFSourceLanguage Lang, LLVMMetadataRef FileRef, const char *Producer, size_t ProducerLen, LLVMBool isOptimized, const char *Flags, size_t FlagsLen, unsigned RuntimeVer, const char *SplitName, size_t SplitNameLen, LLVMDWARFEmissionKind Kind, unsigned DWOId, LLVMBool SplitDebugInlining, LLVMBool DebugInfoForProfiling, const char *SysRoot, size_t SysRootLen, const char *SDK, size_t SDKLen)
A CompileUnit provides an anchor for all debugging information generated during this instance of comp...
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateObjCProperty(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, const char *GetterName, size_t GetterNameLen, const char *SetterName, size_t SetterNameLen, unsigned PropertyAttributes, LLVMMetadataRef Ty)
Create debugging information entry for Objective-C property.
LLVMChecksumKind
The kind of checksum to emit.
Definition DebugInfo.h:209
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromModule(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef M, LLVMMetadataRef File, unsigned Line, LLVMMetadataRef *Elements, unsigned NumElements)
Create a descriptor for an imported module.
LLVM_C_ABI LLVMMetadataRef LLVMDIVariableGetFile(LLVMMetadataRef Var)
Get the metadata of the file associated with a given variable.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderGetOrCreateSubrange(LLVMDIBuilderRef Builder, int64_t LowerBound, int64_t Count)
Create a descriptor for a value range.
LLVM_C_ABI unsigned LLVMDILocationGetLine(LLVMMetadataRef Location)
Get the line number of this debug location.
LLVM_C_ABI LLVMDbgRecordRef LLVMDIBuilderInsertLabelBefore(LLVMDIBuilderRef Builder, LLVMMetadataRef LabelInfo, LLVMMetadataRef Location, LLVMValueRef InsertBefore)
Insert a new llvm.dbg.label intrinsic call.
LLVM_C_ABI unsigned LLVMDIVariableGetLine(LLVMMetadataRef Var)
Get the source line where this DIVariable is declared.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateQualifiedType(LLVMDIBuilderRef Builder, unsigned Tag, LLVMMetadataRef Type)
Create debugging information entry for a qualified type, e.g.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateClassType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements, unsigned NumElements, LLVMMetadataRef VTableHolder, LLVMMetadataRef TemplateParamsNode, const char *UniqueIdentifier, size_t UniqueIdentifierLen)
Create debugging information entry for a class.
LLVM_C_ABI LLVMMetadataKind LLVMGetMetadataKind(LLVMMetadataRef Metadata)
Obtain the enumerated type of a Metadata instance.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateDynamicArrayType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t Size, uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts, unsigned NumSubscripts, LLVMMetadataRef DataLocation, LLVMMetadataRef Associated, LLVMMetadataRef Allocated, LLVMMetadataRef Rank, LLVMMetadataRef BitStride)
Create debugging information entry for a dynamic array.
LLVMDWARFEmissionKind
The amount of debug information to emit.
Definition DebugInfo.h:153
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateSubrangeType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef BaseTy, LLVMMetadataRef LowerBound, LLVMMetadataRef UpperBound, LLVMMetadataRef Stride, LLVMMetadataRef Bias)
Create a descriptor for a subrange with dynamic bounds.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateMemberType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef Ty)
Create debugging information entry for a member.
LLVM_C_ABI const char * LLVMDITypeGetName(LLVMMetadataRef DType, size_t *Length)
Get the name of this DIType.
LLVM_C_ABI uint64_t LLVMDITypeGetOffsetInBits(LLVMMetadataRef DType)
Get the offset of this DIType in bits.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateReplaceableCompositeType(LLVMDIBuilderRef Builder, unsigned Tag, const char *Name, size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, const char *UniqueIdentifier, size_t UniqueIdentifierLen)
Create a temporary forward-declared type.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateTempMacroFile(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentMacroFile, unsigned Line, LLVMMetadataRef File)
Create debugging information temporary entry for a macro file.
LLVM_C_ABI LLVMDIFlags LLVMDITypeGetFlags(LLVMMetadataRef DType)
Get the flags associated with this DIType.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateModule(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentScope, const char *Name, size_t NameLen, const char *ConfigMacros, size_t ConfigMacrosLen, const char *IncludePath, size_t IncludePathLen, const char *APINotesFile, size_t APINotesFileLen)
Creates a new descriptor for a module with the specified parent scope.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateMemberPointerType(LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeType, LLVMMetadataRef ClassType, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags)
Create debugging information entry for a pointer to member.
LLVM_C_ABI uint16_t LLVMGetDINodeTag(LLVMMetadataRef MD)
Get the dwarf::Tag of a DINode.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateEnumeratorOfArbitraryPrecision(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, uint64_t SizeInBits, const uint64_t Words[], LLVMBool IsUnsigned)
Create debugging information entry for an enumerator of arbitrary precision.
LLVM_C_ABI void LLVMReplaceArrays(LLVMDIBuilderRef Builder, LLVMMetadataRef *T, LLVMMetadataRef *Elements, unsigned NumElements)
Replace arrays.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateNameSpace(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentScope, const char *Name, size_t NameLen, LLVMBool ExportSymbols)
Creates a new descriptor for a namespace with the specified parent scope.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateStructType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang, LLVMMetadataRef VTableHolder, const char *UniqueId, size_t UniqueIdLen)
Create debugging information entry for a struct.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateLexicalBlockFile(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Discriminator)
Create a descriptor for a lexical block with a new file attached.
LLVM_C_ABI void LLVMDisposeTemporaryMDNode(LLVMMetadataRef TempNode)
Deallocate a temporary node.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateObjectPointerType(LLVMDIBuilderRef Builder, LLVMMetadataRef Type, LLVMBool Implicit)
Create a uniqued DIType* clone with FlagObjectPointer.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateTypedef(LLVMDIBuilderRef Builder, LLVMMetadataRef Type, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Scope, uint32_t AlignInBits)
Create debugging information entry for a typedef.
unsigned LLVMDWARFTypeEncoding
An LLVM DWARF type encoding.
Definition DebugInfo.h:214
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateAutoVariable(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags, uint32_t AlignInBits)
Create a new descriptor for a local auto variable.
LLVM_C_ABI void LLVMInstructionSetDebugLoc(LLVMValueRef Inst, LLVMMetadataRef Loc)
Set the debug location for the given instruction.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef Builder, LLVMMetadataRef File, LLVMMetadataRef *ParameterTypes, unsigned NumParameterTypes, LLVMDIFlags Flags)
Create subroutine type.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateVectorType(LLVMDIBuilderRef Builder, uint64_t Size, uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts, unsigned NumSubscripts)
Create debugging information entry for a vector type.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreatePointerType(LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeTy, uint64_t SizeInBits, uint32_t AlignInBits, unsigned AddressSpace, const char *Name, size_t NameLen)
Create debugging information entry for a pointer.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateNullPtrType(LLVMDIBuilderRef Builder)
Create C++11 nullptr type.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateEnumerationType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef *Elements, unsigned NumElements, LLVMMetadataRef ClassTy)
Create debugging information entry for an enumeration.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromAlias(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef ImportedEntity, LLVMMetadataRef File, unsigned Line, LLVMMetadataRef *Elements, unsigned NumElements)
Create a descriptor for an imported module that aliases another imported entity descriptor.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateInheritance(LLVMDIBuilderRef Builder, LLVMMetadataRef Ty, LLVMMetadataRef BaseTy, uint64_t BaseOffset, uint32_t VBPtrOffset, LLVMDIFlags Flags)
Create debugging information entry to establish inheritance relationship between two types.
unsigned LLVMMetadataKind
Definition DebugInfo.h:204
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateReferenceType(LLVMDIBuilderRef Builder, unsigned Tag, LLVMMetadataRef Type)
Create debugging information entry for a c++ style reference or rvalue reference type.
LLVM_C_ABI LLVMBool LLVMStripModuleDebugInfo(LLVMModuleRef Module)
Strip debug info in the module if it exists.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, uint64_t SizeInBits, LLVMDWARFTypeEncoding Encoding, LLVMDIFlags Flags)
Create debugging information entry for a basic type.
LLVM_C_ABI uint32_t LLVMDITypeGetAlignInBits(LLVMMetadataRef DType)
Get the alignment of this DIType in bits.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateLexicalBlock(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, unsigned Column)
Create a descriptor for a lexical block with the specified parent context.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateArtificialType(LLVMDIBuilderRef Builder, LLVMMetadataRef Type)
Create a uniqued DIType* clone with FlagArtificial set.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateDebugLocation(LLVMContextRef Ctx, unsigned Line, unsigned Column, LLVMMetadataRef Scope, LLVMMetadataRef InlinedAt)
Creates a new DebugLocation that describes a source location.
LLVM_C_ABI const char * LLVMDIFileGetDirectory(LLVMMetadataRef File, unsigned *Len)
Get the directory of a given file.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromNamespace(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef NS, LLVMMetadataRef File, unsigned Line)
Create a descriptor for an imported namespace.
@ LLVMGenericDINodeMetadataKind
Definition DebugInfo.h:173
@ CSK_SHA1
Definition DebugInfo.h:209
@ CSK_SHA256
Definition DebugInfo.h:209
@ CSK_MD5
Definition DebugInfo.h:209
struct LLVMOpaqueValue * LLVMValueRef
Represents an individual value in LLVM IR.
Definition Types.h:75
int LLVMBool
Definition Types.h:28
struct LLVMOpaqueDbgRecord * LLVMDbgRecordRef
Definition Types.h:175
struct LLVMOpaqueContext * LLVMContextRef
The top-level container for all LLVM global data.
Definition Types.h:53
struct LLVMOpaqueBasicBlock * LLVMBasicBlockRef
Represents a basic block of instructions in LLVM IR.
Definition Types.h:82
struct LLVMOpaqueMetadata * LLVMMetadataRef
Represents an LLVM Metadata.
Definition Types.h:89
struct LLVMOpaqueModule * LLVMModuleRef
The top-level container for all other LLVM Intermediate Representation (IR) objects.
Definition Types.h:61
struct LLVMOpaqueDIBuilder * LLVMDIBuilderRef
Represents an LLVM debug info builder.
Definition Types.h:117
#define UINT64_MAX
Definition DataTypes.h:77
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
Assignment Tracking (at).
Definition DebugInfo.h: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:821
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:573
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:56
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h: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.
PointerUnion< Instruction *, DbgRecord * > DbgInstPtr
Definition DIBuilder.h:44
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
LLVM_ABI void updateLoopMetadataDebugLocations(Instruction &I, function_ref< Metadata *(Metadata *)> Updater)
Update the debug locations contained within the MD_loop metadata attached to the instruction I,...
@ DEBUG_METADATA_VERSION
Definition Metadata.h:54
LLVM_ABI void findDbgUsers(Value *V, SmallVectorImpl< DbgVariableRecord * > &DbgVariableRecords)
Finds the debug info records describing a value.
LLVM_ABI DISubprogram * getDISubprogram(const MDNode *Scope)
Find subprogram that is enclosing this scope.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
#define N
A single checksum, represented by a Kind and a Value (a string).
Describes properties of a store that has a static size and offset into a some base storage.
Definition DebugInfo.h:289
Helper struct for trackAssignments, below.
Definition DebugInfo.h:246
DILocation * DL
Definition DebugInfo.h:248
DILocalVariable * Var
Definition DebugInfo.h:247