LLVM 24.0.0git
DebugInfo.cpp
Go to the documentation of this file.
1//===- DebugInfo.cpp - Debug Information Helper Classes -------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the helper classes used to build and interpret debug
10// information in LLVM IR form.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm-c/DebugInfo.h"
15#include "LLVMContextImpl.h"
16#include "llvm/ADT/APSInt.h"
17#include "llvm/ADT/DenseMap.h"
18#include "llvm/ADT/DenseSet.h"
19#include "llvm/ADT/STLExtras.h"
22#include "llvm/ADT/StringRef.h"
23#include "llvm/IR/BasicBlock.h"
24#include "llvm/IR/Constants.h"
25#include "llvm/IR/DIBuilder.h"
26#include "llvm/IR/DebugInfo.h"
28#include "llvm/IR/DebugLoc.h"
30#include "llvm/IR/Function.h"
32#include "llvm/IR/Instruction.h"
34#include "llvm/IR/LLVMContext.h"
35#include "llvm/IR/Metadata.h"
36#include "llvm/IR/Module.h"
37#include "llvm/IR/PassManager.h"
40#include <algorithm>
41#include <cassert>
42#include <optional>
43
44using namespace llvm;
45using namespace llvm::at;
46using namespace llvm::dwarf;
47
49 // This function is hot. Check whether the value has any metadata to avoid a
50 // DenseMap lookup. This check is a bitfield datamember lookup.
51 if (!V->isUsedByMetadata())
52 return {};
54 if (!L)
55 return {};
56
58 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers())
59 if (DVR->getType() == DbgVariableRecord::LocationType::Declare)
60 Declares.push_back(DVR);
61
62 return Declares;
63}
64
66 // This function is hot. Check whether the value has any metadata to avoid a
67 // DenseMap lookup. This check is a bitfield datamember lookup.
68 if (!V->isUsedByMetadata())
69 return {};
71 if (!L)
72 return {};
73
75 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers())
77 DEclareValues.push_back(DVR);
78
79 return DEclareValues;
80}
81
83 // This function is hot. Check whether the value has any metadata to avoid a
84 // DenseMap lookup. This check is a bitfield datamember lookup.
85 if (!V->isUsedByMetadata())
86 return {};
88 if (!L)
89 return {};
90
92 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers())
93 if (DVR->isValueOfVariable())
94 Values.push_back(DVR);
95
96 return Values;
97}
98
99template <bool DbgAssignAndValuesOnly>
100static void
102 SmallVectorImpl<DbgVariableRecord *> &DbgVariableRecords) {
103 // This function is hot. Check whether the value has any metadata to avoid a
104 // DenseMap lookup.
105 if (!V->isUsedByMetadata())
106 return;
107
108 // TODO: If this value appears multiple times in a DIArgList, we should still
109 // only add the owning dbg.value once; use this set to track ArgListUsers.
110 // This behaviour can be removed when we can automatically remove duplicates.
111 // V will also appear twice in a dbg.assign if its used in the both the value
112 // and address components.
113 SmallPtrSet<DbgVariableRecord *, 4> EncounteredDbgVariableRecords;
114
115 /// Append users of MetadataAsValue(MD).
116 auto AppendUsers = [&EncounteredDbgVariableRecords,
117 &DbgVariableRecords](Metadata *MD) {
118 // Get DbgVariableRecords that use this as a single value.
120 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers()) {
121 if (!DbgAssignAndValuesOnly || DVR->isDbgValue() || DVR->isDbgAssign())
122 if (EncounteredDbgVariableRecords.insert(DVR).second)
123 DbgVariableRecords.push_back(DVR);
124 }
125 }
126 };
127
128 if (auto *L = LocalAsMetadata::getIfExists(V)) {
129 AppendUsers(L);
130 for (Metadata *AL : L->getAllArgListUsers()) {
131 AppendUsers(AL);
132 DIArgList *DI = cast<DIArgList>(AL);
134 if (!DbgAssignAndValuesOnly || DVR->isDbgValue() || DVR->isDbgAssign())
135 if (EncounteredDbgVariableRecords.insert(DVR).second)
136 DbgVariableRecords.push_back(DVR);
137 }
138 }
139}
140
142 Value *V, SmallVectorImpl<DbgVariableRecord *> &DbgVariableRecords) {
143 findDbgIntrinsics</*DbgAssignAndValuesOnly=*/true>(V, DbgVariableRecords);
144}
145
147 Value *V, SmallVectorImpl<DbgVariableRecord *> &DbgVariableRecords) {
148 findDbgIntrinsics</*DbgAssignAndValuesOnly=*/false>(V, DbgVariableRecords);
149}
150
152 if (auto *LocalScope = dyn_cast_or_null<DILocalScope>(Scope))
153 return LocalScope->getSubprogram();
154 return nullptr;
155}
156
158 // Original dbg.declare must have a location.
159 const DebugLoc &DeclareLoc = DVR->getDebugLoc();
160 MDNode *Scope = DeclareLoc.getScope();
161 DILocation *InlinedAt = DeclareLoc.getInlinedAt();
162 // Because no machine insts can come from debug intrinsics, only the scope
163 // and inlinedAt is significant. Zero line numbers are used in case this
164 // DebugLoc leaks into any adjacent instructions. Produce an unknown location
165 // with the correct scope / inlinedAt fields.
166 return DILocation::get(DVR->getContext(), 0, 0, Scope, InlinedAt);
167}
168
169//===----------------------------------------------------------------------===//
170// DebugInfoFinder implementations.
171//===----------------------------------------------------------------------===//
172
174 CUs.clear();
175 SPs.clear();
176 GVs.clear();
177 TYs.clear();
178 Scopes.clear();
179 Macros.clear();
180 NodesSeen.clear();
181}
182
184 for (auto *CU : M.debug_compile_units())
185 processCompileUnit(CU);
186 for (auto &F : M.functions()) {
187 if (auto *SP = cast_or_null<DISubprogram>(F.getSubprogram()))
189 // There could be subprograms from inlined functions referenced from
190 // instructions only. Walk the function to find them.
191 for (const BasicBlock &BB : F)
192 for (const Instruction &I : BB)
194 }
195}
196
197void DebugInfoFinder::processCompileUnit(DICompileUnit *CU) {
198 if (!addCompileUnit(CU))
199 return;
200 for (auto *GVE : CU->getGlobalVariables())
201 processGlobalVariableExpression(GVE);
202 for (auto *ET : CU->getEnumTypes())
203 processType(ET);
204 for (auto *RT : CU->getRetainedTypes())
205 if (auto *T = dyn_cast<DIType>(RT))
206 processType(T);
207 else
209 for (auto *Import : CU->getImportedEntities())
210 processImportedEntity(Import);
211 for (auto *Macro : CU->getMacros())
212 processMacroNode(Macro, nullptr);
213}
214
215void DebugInfoFinder::processGlobalVariableExpression(
217 if (!addGlobalVariable(GVE))
218 return;
219 auto *GV = GVE->getVariable();
220 processScope(GV->getScope());
221 processType(GV->getType());
222}
223
225 const Instruction &I) {
226 if (auto *DVI = dyn_cast<DbgVariableIntrinsic>(&I))
227 processVariable(DVI->getVariable());
228
229 if (auto DbgLoc = I.getDebugLoc())
230 processLocation(M, DbgLoc.get());
231
232 for (const DbgRecord &DPR : I.getDbgRecordRange())
233 processDbgRecord(M, DPR);
234}
235
237 if (!Loc)
238 return;
239 processScope(Loc->getScope());
240 processLocation(M, Loc->getInlinedAt());
241}
242
245 processVariable(DVR->getVariable());
247}
248
250 if (auto *DLV = dyn_cast_or_null<DILocalVariable>(DV))
251 processVariable(DLV);
252}
253
254void DebugInfoFinder::processType(DIType *DT) {
255 if (!addType(DT))
256 return;
257 processScope(DT->getScope());
258 if (auto *ST = dyn_cast<DISubroutineType>(DT)) {
259 for (DIType *Ref : ST->getTypeArray())
260 processType(Ref);
261 return;
262 }
263 if (auto *DCT = dyn_cast<DICompositeType>(DT)) {
264 processType(DCT->getBaseType());
265 processType(DCT->getVTableHolder());
266 processType(DCT->getDiscriminator());
267 processType(DCT->getSpecification());
268 processVariable(DCT->getDataLocation());
269 processVariable(DCT->getAssociated());
270 processVariable(DCT->getAllocated());
271 for (Metadata *D : DCT->getElements()) {
272 if (auto *T = dyn_cast<DIType>(D))
273 processType(T);
274 else if (auto *SP = dyn_cast<DISubprogram>(D))
276 else if (auto *P = dyn_cast<DIProperty>(D))
277 processType(P->getType());
278 else if (auto *SR = dyn_cast_or_null<DISubrange>(D)) {
279 auto VisitBound = [&](DISubrange::BoundType Bound) {
280 if (auto *BV = dyn_cast_if_present<DIVariable *>(Bound))
281 processVariable(BV);
282 };
283 VisitBound(SR->getLowerBound());
284 VisitBound(SR->getCount());
285 VisitBound(SR->getUpperBound());
286 VisitBound(SR->getStride());
287 } else if (auto *GSR = dyn_cast_or_null<DIGenericSubrange>(D)) {
288 auto VisitBound = [&](DIGenericSubrange::BoundType Bound) {
289 if (auto *BV = dyn_cast_if_present<DIVariable *>(Bound))
290 processVariable(BV);
291 };
292 VisitBound(GSR->getLowerBound());
293 VisitBound(GSR->getCount());
294 VisitBound(GSR->getUpperBound());
295 VisitBound(GSR->getStride());
296 }
297 }
298 return;
299 }
300 if (auto *ST = dyn_cast<DIStringType>(DT)) {
301 processVariable(ST->getStringLength());
302 return;
303 }
304 if (auto *SRT = dyn_cast<DISubrangeType>(DT)) {
305 processType(SRT->getBaseType());
306 auto VisitBound = [&](DISubrangeType::BoundType Bound) {
307 if (auto *V = dyn_cast_if_present<DIVariable *>(Bound))
309 else if (auto *T = dyn_cast_if_present<DIDerivedType *>(Bound))
310 processType(T);
311 };
312 VisitBound(SRT->getLowerBound());
313 VisitBound(SRT->getUpperBound());
314 VisitBound(SRT->getStride());
315 VisitBound(SRT->getBias());
316 return;
317 }
318 if (auto *DDT = dyn_cast<DIDerivedType>(DT)) {
319 processType(DDT->getBaseType());
320 }
321}
322
323void DebugInfoFinder::processImportedEntity(const DIImportedEntity *Import) {
324 auto *Entity = Import->getEntity();
325 if (auto *T = dyn_cast<DIType>(Entity))
326 processType(T);
327 else if (auto *SP = dyn_cast<DISubprogram>(Entity))
329 else if (auto *NS = dyn_cast<DINamespace>(Entity))
330 processScope(NS->getScope());
331 else if (auto *M = dyn_cast<DIModule>(Entity))
332 processScope(M->getScope());
333}
334
335/// Process a macro debug info node (DIMacroNode).
336///
337/// A DIMacroNode is one of two types:
338/// - DIMacro: A single macro definition. Add it to the Macros list along with
339/// its containing DIMacroFile.
340/// - DIMacroFile: A file containing macros. Recursively process all nested
341/// macro nodes within it (avoiding duplicates by tracking visited nodes).
342void DebugInfoFinder::processMacroNode(DIMacroNode *Macro,
343 DIMacroFile *CurrentMacroFile) {
344 if (!Macro)
345 return;
346
347 if (auto *M = dyn_cast<DIMacro>(Macro)) {
348 addMacro(M, CurrentMacroFile);
349 return;
350 }
351
352 auto *MF = dyn_cast<DIMacroFile>(Macro);
353 assert(MF &&
354 "Expected a DIMacroFile (it can't be any other type at this point)");
355
356 // Check if we've already seen this macro file to avoid infinite recursion
357 if (!NodesSeen.insert(MF).second)
358 return;
359
360 // Recursively process nested macros in the macro file
361 for (auto *Element : MF->getElements())
362 processMacroNode(Element, MF);
363}
364
365void DebugInfoFinder::processScope(DIScope *Scope) {
366 if (!Scope)
367 return;
368 if (auto *Ty = dyn_cast<DIType>(Scope)) {
369 processType(Ty);
370 return;
371 }
372 if (auto *CU = dyn_cast<DICompileUnit>(Scope)) {
373 addCompileUnit(CU);
374 return;
375 }
376 if (auto *SP = dyn_cast<DISubprogram>(Scope)) {
378 return;
379 }
380 if (!addScope(Scope))
381 return;
382 if (auto *LB = dyn_cast<DILexicalBlockBase>(Scope)) {
383 processScope(LB->getScope());
384 } else if (auto *NS = dyn_cast<DINamespace>(Scope)) {
385 processScope(NS->getScope());
386 } else if (auto *M = dyn_cast<DIModule>(Scope)) {
387 processScope(M->getScope());
388 }
389}
390
392 if (!addSubprogram(SP))
393 return;
394 processScope(SP->getScope());
395 // Some of the users, e.g. CloneFunctionInto / CloneModule, need to set up a
396 // ValueMap containing identity mappings for all of the DICompileUnit's, not
397 // just DISubprogram's, referenced from anywhere within the Function being
398 // cloned prior to calling MapMetadata / RemapInstruction to avoid their
399 // duplication later as DICompileUnit's are also directly referenced by
400 // llvm.dbg.cu list. Therefore we need to collect DICompileUnit's here as
401 // well. Also, DICompileUnit's may reference DISubprogram's too and therefore
402 // need to be at least looked through.
403 processCompileUnit(SP->getUnit());
404 processType(SP->getType());
405 for (auto *Element : SP->getTemplateParams()) {
406 if (auto *TType = dyn_cast<DITemplateTypeParameter>(Element)) {
407 processType(TType->getType());
408 } else if (auto *TVal = dyn_cast<DITemplateValueParameter>(Element)) {
409 processType(TVal->getType());
410 }
411 }
412
413 SP->forEachRetainedNode(
414 [this](DILocalVariable *LV) { processVariable(LV); }, [](DILabel *L) {},
415 [this](DIImportedEntity *IE) { processImportedEntity(IE); },
416 [this](DIType *T) { processType(T); },
417 [this](auto *GVE) { return processGlobalVariableExpression(GVE); });
418
419 // Not reached through the scope, type, or retained nodes.
420 if (DISubprogram *Decl = SP->getDeclaration())
421 processSubprogram(Decl);
422}
423
425 if (!NodesSeen.insert(DV).second)
426 return;
427 processScope(DV->getScope());
428 processType(DV->getType());
429}
430
431bool DebugInfoFinder::addType(DIType *DT) {
432 if (!DT)
433 return false;
434
435 if (!NodesSeen.insert(DT).second)
436 return false;
437
438 TYs.push_back(DT);
439 return true;
440}
441
442bool DebugInfoFinder::addCompileUnit(DICompileUnit *CU) {
443 if (!CU)
444 return false;
445 if (!NodesSeen.insert(CU).second)
446 return false;
447
448 CUs.push_back(CU);
449 return true;
450}
451
452bool DebugInfoFinder::addGlobalVariable(DIGlobalVariableExpression *DIG) {
453 if (!NodesSeen.insert(DIG).second)
454 return false;
455
456 GVs.push_back(DIG);
457 return true;
458}
459
460bool DebugInfoFinder::addSubprogram(DISubprogram *SP) {
461 if (!SP)
462 return false;
463
464 if (!NodesSeen.insert(SP).second)
465 return false;
466
467 SPs.push_back(SP);
468 return true;
469}
470
471bool DebugInfoFinder::addScope(DIScope *Scope) {
472 if (!Scope)
473 return false;
474 // FIXME: Ocaml binding generates a scope with no content, we treat it
475 // as null for now.
476 if (Scope->getNumOperands() == 0)
477 return false;
478 if (!NodesSeen.insert(Scope).second)
479 return false;
480 Scopes.push_back(Scope);
481 return true;
482}
483
484bool DebugInfoFinder::addMacro(DIMacro *Macro, DIMacroFile *MacroFile) {
485 if (!Macro)
486 return false;
487
488 if (!NodesSeen.insert(Macro).second)
489 return false;
490
491 Macros.push_back(std::make_pair(Macro, MacroFile));
492 return true;
493}
494
495/// Recursively handle DILocations in followup metadata etc.
496///
497/// TODO: If for example a followup loop metadata would reference itself this
498/// function would go into infinite recursion. We do not expect such cycles in
499/// the loop metadata (except for the self-referencing first element
500/// "LoopID"). However, we could at least handle such situations more gracefully
501/// somehow (e.g. by keeping track of visited nodes and dropping metadata).
503 Metadata *MetadataIn, function_ref<Metadata *(Metadata *)> Updater) {
504 const MDTuple *M = dyn_cast_or_null<MDTuple>(MetadataIn);
505 // The loop metadata options should start with a MDString.
506 if (!M || M->getNumOperands() < 1 || !isa<MDString>(M->getOperand(0)))
507 return MetadataIn;
508
509 bool Updated = false;
510 SmallVector<Metadata *, 4> MDs{M->getOperand(0)};
511 for (Metadata *MD : llvm::drop_begin(M->operands())) {
512 if (!MD) {
513 MDs.push_back(nullptr);
514 continue;
515 }
516 Metadata *NewMD =
517 Updater(updateLoopMetadataDebugLocationsRecursive(MD, Updater));
518 if (NewMD)
519 MDs.push_back(NewMD);
520 Updated |= NewMD != MD;
521 }
522
523 assert(!M->isDistinct() && "M should not be distinct.");
524 return Updated ? MDNode::get(M->getContext(), MDs) : MetadataIn;
525}
526
528 MDNode *OrigLoopID, function_ref<Metadata *(Metadata *)> Updater) {
529 assert(OrigLoopID && OrigLoopID->getNumOperands() > 0 &&
530 "Loop ID needs at least one operand");
531 assert(OrigLoopID && OrigLoopID->getOperand(0).get() == OrigLoopID &&
532 "Loop ID should refer to itself");
533
534 // Save space for the self-referential LoopID.
535 SmallVector<Metadata *, 4> MDs = {nullptr};
536
537 for (Metadata *MD : llvm::drop_begin(OrigLoopID->operands())) {
538 if (!MD)
539 MDs.push_back(nullptr);
540 else if (Metadata *NewMD = Updater(
542 MDs.push_back(NewMD);
543 }
544
545 MDNode *NewLoopID = MDNode::getDistinct(OrigLoopID->getContext(), MDs);
546 // Insert the self-referential LoopID.
547 NewLoopID->replaceOperandWith(0, NewLoopID);
548 return NewLoopID;
549}
550
552 Instruction &I, function_ref<Metadata *(Metadata *)> Updater) {
553 MDNode *OrigLoopID = I.getMetadata(LLVMContext::MD_loop);
554 if (!OrigLoopID)
555 return;
556 MDNode *NewLoopID = updateLoopMetadataDebugLocationsImpl(OrigLoopID, Updater);
557 I.setMetadata(LLVMContext::MD_loop, NewLoopID);
558}
559
560/// Return true if a node is a DILocation or if a DILocation is
561/// indirectly referenced by one of the node's children.
564 Metadata *MD) {
566 if (!N)
567 return false;
568 if (isa<DILocation>(N) || Reachable.count(N))
569 return true;
570 if (!Visited.insert(N).second)
571 return false;
572 for (auto &OpIt : N->operands()) {
573 Metadata *Op = OpIt.get();
574 if (isDILocationReachable(Visited, Reachable, Op)) {
575 // Don't return just yet as we want to visit all MD's children to
576 // initialize DILocationReachable in stripDebugLocFromLoopID
577 Reachable.insert(N);
578 }
579 }
580 return Reachable.count(N);
581}
582
584 SmallPtrSetImpl<Metadata *> &AllDILocation,
585 const SmallPtrSetImpl<Metadata *> &DIReachable,
586 Metadata *MD) {
588 if (!N)
589 return false;
590 if (isa<DILocation>(N) || AllDILocation.count(N))
591 return true;
592 if (!DIReachable.count(N))
593 return false;
594 if (!Visited.insert(N).second)
595 return false;
596 for (auto &OpIt : N->operands()) {
597 Metadata *Op = OpIt.get();
598 if (Op == MD)
599 continue;
600 if (!isAllDILocation(Visited, AllDILocation, DIReachable, Op)) {
601 return false;
602 }
603 }
604 AllDILocation.insert(N);
605 return true;
606}
607
608static Metadata *
610 const SmallPtrSetImpl<Metadata *> &DIReachable, Metadata *MD) {
611 if (isa<DILocation>(MD) || AllDILocation.count(MD))
612 return nullptr;
613
614 if (!DIReachable.count(MD))
615 return MD;
616
618 if (!N)
619 return MD;
620
622 bool HasSelfRef = false;
623 for (unsigned i = 0; i < N->getNumOperands(); ++i) {
624 Metadata *A = N->getOperand(i);
625 if (!A) {
626 Args.push_back(nullptr);
627 } else if (A == MD) {
628 assert(i == 0 && "expected i==0 for self-reference");
629 HasSelfRef = true;
630 Args.push_back(nullptr);
631 } else if (Metadata *NewArg =
632 stripLoopMDLoc(AllDILocation, DIReachable, A)) {
633 Args.push_back(NewArg);
634 }
635 }
636 if (Args.empty() || (HasSelfRef && Args.size() == 1))
637 return nullptr;
638
639 MDNode *NewMD = N->isDistinct() ? MDNode::getDistinct(N->getContext(), Args)
640 : MDNode::get(N->getContext(), Args);
641 if (HasSelfRef)
642 NewMD->replaceOperandWith(0, NewMD);
643 return NewMD;
644}
645
647 assert(!N->operands().empty() && "Missing self reference?");
648 SmallPtrSet<Metadata *, 8> Visited, DILocationReachable, AllDILocation;
649 // If we already visited N, there is nothing to do.
650 if (!Visited.insert(N).second)
651 return N;
652
653 // If there is no debug location, we do not have to rewrite this
654 // MDNode. This loop also initializes DILocationReachable, later
655 // needed by updateLoopMetadataDebugLocationsImpl; the use of
656 // count_if avoids an early exit.
657 if (!llvm::count_if(llvm::drop_begin(N->operands()),
658 [&Visited, &DILocationReachable](const MDOperand &Op) {
659 return isDILocationReachable(
660 Visited, DILocationReachable, Op.get());
661 }))
662 return N;
663
664 Visited.clear();
665 // If there is only the debug location without any actual loop metadata, we
666 // can remove the metadata.
667 if (llvm::all_of(llvm::drop_begin(N->operands()),
668 [&Visited, &AllDILocation,
669 &DILocationReachable](const MDOperand &Op) {
670 return isAllDILocation(Visited, AllDILocation,
671 DILocationReachable, Op.get());
672 }))
673 return nullptr;
674
676 N, [&AllDILocation, &DILocationReachable](Metadata *MD) -> Metadata * {
677 return stripLoopMDLoc(AllDILocation, DILocationReachable, MD);
678 });
679}
680
682 bool Changed = false;
683 if (F.hasMetadata(LLVMContext::MD_dbg)) {
684 Changed = true;
685 F.setSubprogram(nullptr);
686 }
687
689 for (BasicBlock &BB : F) {
691 if (I.getDebugLoc()) {
692 Changed = true;
693 I.setDebugLoc(DebugLoc());
694 }
695 if (auto *LoopID = I.getMetadata(LLVMContext::MD_loop)) {
696 auto *NewLoopID = LoopIDsMap.lookup(LoopID);
697 if (!NewLoopID)
698 NewLoopID = LoopIDsMap[LoopID] = stripDebugLocFromLoopID(LoopID);
699 if (NewLoopID != LoopID)
700 I.setMetadata(LLVMContext::MD_loop, NewLoopID);
701 }
702 // Strip other attachments that are or use debug info.
703 if (I.hasMetadataOtherThanDebugLoc()) {
704 // Heapallocsites point into the DIType system.
705 I.setMetadata("heapallocsite", nullptr);
706 // DIAssignID are debug info metadata primitives.
707 I.setMetadata(LLVMContext::MD_DIAssignID, nullptr);
708 }
709 I.dropDbgRecords();
710 }
711 }
712 return Changed;
713}
714
716 llvm::TimeTraceScope timeScope("Strip debug info");
717 bool Changed = false;
718
719 for (NamedMDNode &NMD : llvm::make_early_inc_range(M.named_metadata())) {
720 // We're stripping debug info, and without them, coverage information
721 // doesn't quite make sense.
722 if (NMD.getName().starts_with("llvm.dbg.") ||
723 NMD.getName() == "llvm.gcov") {
724 NMD.eraseFromParent();
725 Changed = true;
726 }
727 }
728
729 for (Function &F : M)
731
732 for (auto &GV : M.globals()) {
733 Changed |= GV.eraseMetadata(LLVMContext::MD_dbg);
734 }
735
736 if (GVMaterializer *Materializer = M.getMaterializer())
737 Materializer->setStripDebugInfo();
738
739 return Changed;
740}
741
742namespace {
743
744/// Helper class to downgrade -g metadata to -gline-tables-only metadata.
745class DebugTypeInfoRemoval {
747
748public:
749 /// The (void)() type.
750 MDNode *EmptySubroutineType;
751
752private:
753 /// Remember what linkage name we originally had before stripping. If we end
754 /// up making two subprograms identical who originally had different linkage
755 /// names, then we need to make one of them distinct, to avoid them getting
756 /// uniqued. Maps the new node to the old linkage name.
758
759 // TODO: Remember the distinct subprogram we created for a given linkage name,
760 // so that we can continue to unique whenever possible. Map <newly created
761 // node, old linkage name> to the first (possibly distinct) mdsubprogram
762 // created for that combination. This is not strictly needed for correctness,
763 // but can cut down on the number of MDNodes and let us diff cleanly with the
764 // output of -gline-tables-only.
765
766public:
767 DebugTypeInfoRemoval(LLVMContext &C)
768 : EmptySubroutineType(DISubroutineType::get(C, DINode::FlagZero, 0,
769 MDNode::get(C, {}))) {}
770
771 Metadata *map(Metadata *M) {
772 if (!M)
773 return nullptr;
774 auto Replacement = Replacements.find(M);
775 if (Replacement != Replacements.end())
776 return Replacement->second;
777
778 return M;
779 }
780 MDNode *mapNode(Metadata *N) { return dyn_cast_or_null<MDNode>(map(N)); }
781
782 /// Recursively remap N and all its referenced children. Does a DF post-order
783 /// traversal, so as to remap bottoms up.
784 void traverseAndRemap(MDNode *N) { traverse(N); }
785
786private:
787 // Create a new DISubprogram, to replace the one given.
788 DISubprogram *getReplacementSubprogram(DISubprogram *MDS) {
789 auto *FileAndScope = cast_or_null<DIFile>(map(MDS->getFile()));
790 DISubprogram *Declaration = nullptr;
791 auto *Type = cast_or_null<DISubroutineType>(map(MDS->getType()));
792 DIType *ContainingType =
793 cast_or_null<DIType>(map(MDS->getContainingType()));
794 auto *Unit = cast_or_null<DICompileUnit>(map(MDS->getUnit()));
795 auto Variables = nullptr;
796 auto TemplateParams = nullptr;
797 // Keep linkage names for profiling CUs, as -gline-tables-only does.
798 StringRef LinkageName;
799 if (MDS->getName().empty() || (Unit && Unit->getDebugInfoForProfiling()))
800 LinkageName = MDS->getLinkageName();
801
802 // Make a distinct DISubprogram, for situations that warrant it.
803 auto distinctMDSubprogram = [&]() {
804 return DISubprogram::getDistinct(
805 MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
806 FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(),
807 ContainingType, MDS->getVirtualIndex(), MDS->getThisAdjustment(),
808 MDS->getFlags(), MDS->getSPFlags(), Unit, TemplateParams, Declaration,
809 Variables);
810 };
811
812 if (MDS->isDistinct())
813 return distinctMDSubprogram();
814
815 auto *NewMDS = DISubprogram::get(
816 MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
817 FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(), ContainingType,
818 MDS->getVirtualIndex(), MDS->getThisAdjustment(), MDS->getFlags(),
819 MDS->getSPFlags(), Unit, TemplateParams, Declaration, Variables);
820
821 StringRef OldLinkageName = MDS->getLinkageName();
822
823 // See if we need to make a distinct one.
824 auto OrigLinkage = NewToLinkageName.find(NewMDS);
825 if (OrigLinkage != NewToLinkageName.end()) {
826 if (OrigLinkage->second == OldLinkageName)
827 // We're good.
828 return NewMDS;
829
830 // Otherwise, need to make a distinct one.
831 // TODO: Query the map to see if we already have one.
832 return distinctMDSubprogram();
833 }
834
835 NewToLinkageName.insert({NewMDS, MDS->getLinkageName()});
836 return NewMDS;
837 }
838
839 /// Create a new compile unit, to replace the one given
840 DICompileUnit *getReplacementCU(DICompileUnit *CU) {
841 // Drop skeleton CUs.
842 if (CU->getDWOId())
843 return nullptr;
844
845 auto *File = cast_or_null<DIFile>(map(CU->getFile()));
846 MDTuple *EnumTypes = nullptr;
847 MDTuple *RetainedTypes = nullptr;
848 MDTuple *GlobalVariables = nullptr;
849 MDTuple *ImportedEntities = nullptr;
850 return DICompileUnit::getDistinct(
851 CU->getContext(), CU->getSourceLanguage(), File, CU->getProducer(),
852 CU->isOptimized(), CU->getFlags(), CU->getRuntimeVersion(),
854 RetainedTypes, GlobalVariables, ImportedEntities, CU->getMacros(),
855 CU->getDWOId(), CU->getSplitDebugInlining(),
857 CU->getRangesBaseAddress(), CU->getSysRoot(), CU->getSDK());
858 }
859
860 DILocation *getReplacementMDLocation(DILocation *MLD) {
861 auto *Scope = map(MLD->getScope());
862 auto *InlinedAt = map(MLD->getInlinedAt());
863 if (MLD->isDistinct())
864 return DILocation::getDistinct(MLD->getContext(), MLD->getLine(),
865 MLD->getColumn(), Scope, InlinedAt);
866 return DILocation::get(MLD->getContext(), MLD->getLine(), MLD->getColumn(),
867 Scope, InlinedAt);
868 }
869
870 /// Create a new generic MDNode, to replace the one given
871 MDNode *getReplacementMDNode(MDNode *N) {
873 Ops.reserve(N->getNumOperands());
874 for (auto &I : N->operands())
875 if (I)
876 Ops.push_back(map(I));
877 auto *Ret = MDNode::get(N->getContext(), Ops);
878 return Ret;
879 }
880
881 /// Attempt to re-map N to a newly created node.
882 void remap(MDNode *N) {
883 if (Replacements.count(N))
884 return;
885
886 auto doRemap = [&](MDNode *N) -> MDNode * {
887 if (!N)
888 return nullptr;
889 if (auto *MDSub = dyn_cast<DISubprogram>(N)) {
890 remap(MDSub->getUnit());
891 return getReplacementSubprogram(MDSub);
892 }
894 return EmptySubroutineType;
895 if (auto *CU = dyn_cast<DICompileUnit>(N))
896 return getReplacementCU(CU);
897 if (isa<DIFile>(N))
898 return N;
899 if (auto *MDLB = dyn_cast<DILexicalBlockBase>(N))
900 // Remap to our referenced scope (recursively).
901 return mapNode(MDLB->getScope());
902 if (auto *MLD = dyn_cast<DILocation>(N))
903 return getReplacementMDLocation(MLD);
904
905 // Otherwise, if we see these, just drop them now. Not strictly necessary,
906 // but this speeds things up a little.
907 if (isa<DINode>(N))
908 return nullptr;
909
910 return getReplacementMDNode(N);
911 };
912 // Separate recursive doRemap and operator [] into 2 lines to avoid
913 // out-of-order evaluations since both of them can access the same memory
914 // location in map Replacements.
915 auto Value = doRemap(N);
916 Replacements[N] = Value;
917 }
918
919 /// Do the remapping traversal.
920 void traverse(MDNode *);
921};
922
923} // end anonymous namespace
924
925void DebugTypeInfoRemoval::traverse(MDNode *N) {
926 if (!N || Replacements.count(N))
927 return;
928
929 // To avoid cycles, as well as for efficiency sake, we will sometimes prune
930 // parts of the graph.
931 auto prune = [](MDNode *Parent, MDNode *Child) {
932 if (auto *MDS = dyn_cast<DISubprogram>(Parent))
933 return Child == MDS->getRetainedNodes().get();
934 return false;
935 };
936
938 DenseSet<MDNode *> Opened;
939
940 // Visit each node starting at N in post order, and map them.
941 ToVisit.push_back(N);
942 while (!ToVisit.empty()) {
943 auto *N = ToVisit.back();
944 if (!Opened.insert(N).second) {
945 // Close it.
946 remap(N);
947 ToVisit.pop_back();
948 continue;
949 }
950 for (auto &I : N->operands())
951 if (auto *MDN = dyn_cast_or_null<MDNode>(I))
952 if (!Opened.count(MDN) && !Replacements.count(MDN) && !prune(N, MDN) &&
953 !isa<DICompileUnit>(MDN))
954 ToVisit.push_back(MDN);
955 }
956}
957
959 bool Changed = false;
960
961 // Delete non-CU debug info named metadata nodes.
962 for (auto NMI = M.named_metadata_begin(), NME = M.named_metadata_end();
963 NMI != NME;) {
964 NamedMDNode *NMD = &*NMI;
965 ++NMI;
966 // Specifically keep dbg.cu around.
967 if (NMD->getName() == "llvm.dbg.cu")
968 continue;
969 }
970
971 // Drop all dbg attachments from global variables.
972 for (auto &GV : M.globals())
973 GV.eraseMetadata(LLVMContext::MD_dbg);
974
975 DebugTypeInfoRemoval Mapper(M.getContext());
976 auto remap = [&](MDNode *Node) -> MDNode * {
977 if (!Node)
978 return nullptr;
979 Mapper.traverseAndRemap(Node);
980 auto *NewNode = Mapper.mapNode(Node);
981 Changed |= Node != NewNode;
982 Node = NewNode;
983 return NewNode;
984 };
985
986 // Rewrite the DebugLocs to be equivalent to what
987 // -gline-tables-only would have created.
988 for (auto &F : M) {
989 if (auto *SP = F.getSubprogram()) {
990 Mapper.traverseAndRemap(SP);
991 auto *NewSP = cast<DISubprogram>(Mapper.mapNode(SP));
992 Changed |= SP != NewSP;
993 F.setSubprogram(NewSP);
994 }
995 for (auto &BB : F) {
996 for (auto &I : BB) {
997 auto remapDebugLoc = [&](const DebugLoc &DL) -> DebugLoc {
998 auto *Scope = DL.getScope();
999 MDNode *InlinedAt = DL.getInlinedAt();
1000 Scope = remap(Scope);
1001 InlinedAt = remap(InlinedAt);
1002 return DILocation::get(M.getContext(), DL.getLine(), DL.getCol(),
1003 Scope, InlinedAt);
1004 };
1005
1006 if (I.getDebugLoc() != DebugLoc())
1007 I.setDebugLoc(remapDebugLoc(I.getDebugLoc()));
1008
1009 // Remap DILocations in llvm.loop attachments.
1011 if (auto *Loc = dyn_cast_or_null<DILocation>(MD))
1012 return remapDebugLoc(Loc).get();
1013 return MD;
1014 });
1015
1016 // Strip heapallocsite attachments, they point into the DIType system.
1017 if (I.hasMetadataOtherThanDebugLoc())
1018 I.setMetadata("heapallocsite", nullptr);
1019
1020 // Strip any DbgRecords attached.
1021 I.dropDbgRecords();
1022 }
1023 }
1024 }
1025
1026 // Create a new llvm.dbg.cu, which is equivalent to the one
1027 // -gline-tables-only would have created.
1028 for (auto &NMD : M.named_metadata()) {
1030 for (MDNode *Op : NMD.operands())
1031 Ops.push_back(remap(Op));
1032
1033 if (!Changed)
1034 continue;
1035
1036 NMD.clearOperands();
1037 for (auto *Op : Ops)
1038 if (Op)
1039 NMD.addOperand(Op);
1040 }
1041 return Changed;
1042}
1043
1046 M.getModuleFlag("Debug Info Version")))
1047 return Val->getZExtValue();
1048 return 0;
1049}
1050
1054
1056 ArrayRef<const Instruction *> SourceInstructions) {
1057 // Replace all uses (and attachments) of all the DIAssignIDs
1058 // on SourceInstructions with a single merged value.
1059 assert(getFunction() && "Uninserted instruction merged");
1060 // Collect up the DIAssignID tags.
1062 for (const Instruction *I : SourceInstructions) {
1063 if (auto *MD = I->getMetadata(LLVMContext::MD_DIAssignID))
1064 IDs.push_back(cast<DIAssignID>(MD));
1065 assert(getFunction() == I->getFunction() &&
1066 "Merging with instruction from another function not allowed");
1067 }
1068
1069 // Add this instruction's DIAssignID too, if it has one.
1070 if (auto *MD = getMetadata(LLVMContext::MD_DIAssignID))
1071 IDs.push_back(cast<DIAssignID>(MD));
1072
1073 if (IDs.empty())
1074 return; // No DIAssignID tags to process.
1075
1076 DIAssignID *MergeID = IDs[0];
1077 for (DIAssignID *AssignID : drop_begin(IDs)) {
1078 if (AssignID != MergeID)
1079 at::RAUW(AssignID, MergeID);
1080 }
1081 setMetadata(LLVMContext::MD_DIAssignID, MergeID);
1082}
1083
1085
1087 const DebugLoc &DL = getDebugLoc();
1088 if (!DL) {
1090 return;
1091 }
1092
1093 // If this isn't a call, drop the location to allow a location from a
1094 // preceding instruction to propagate.
1095 bool MayLowerToCall = false;
1096 if (isa<CallBase>(this)) {
1097 auto *II = dyn_cast<IntrinsicInst>(this);
1098 MayLowerToCall =
1099 !II || IntrinsicInst::mayLowerToFunctionCall(II->getIntrinsicID());
1100 }
1101
1102 if (!MayLowerToCall) {
1104 return;
1105 }
1106
1107 // Set a line 0 location for calls to preserve scope information in case
1108 // inlining occurs.
1110 if (SP)
1111 // If a function scope is available, set it on the line 0 location. When
1112 // hoisting a call to a predecessor block, using the function scope avoids
1113 // making it look like the callee was reached earlier than it should be.
1115 else
1116 // The parent function has no scope. Go ahead and drop the location. If
1117 // the parent function is inlined, and the callee has a subprogram, the
1118 // inliner will attach a location to the call.
1119 //
1120 // One alternative is to set a line 0 location with the existing scope and
1121 // inlinedAt info. The location might be sensitive to when inlining occurs.
1123}
1124
1125//===----------------------------------------------------------------------===//
1126// LLVM C API implementations.
1127//===----------------------------------------------------------------------===//
1128
1130 switch (lang) {
1131#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \
1132 case LLVMDWARFSourceLanguage##NAME: \
1133 return ID;
1134#include "llvm/BinaryFormat/Dwarf.def"
1135#undef HANDLE_DW_LANG
1136 }
1137 llvm_unreachable("Unhandled Tag");
1138}
1139
1140template <typename DIT> DIT *unwrapDI(LLVMMetadataRef Ref) {
1141 return (DIT *)(Ref ? unwrap<MDNode>(Ref) : nullptr);
1142}
1143
1145 return static_cast<DINode::DIFlags>(Flags);
1146}
1147
1149 return static_cast<LLVMDIFlags>(Flags);
1150}
1151
1153pack_into_DISPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized) {
1154 return DISubprogram::toSPFlags(IsLocalToUnit, IsDefinition, IsOptimized);
1155}
1156
1159}
1160
1164
1168
1172
1176
1178 delete unwrap(Builder);
1179}
1180
1182 unwrap(Builder)->finalize();
1183}
1184
1186 LLVMMetadataRef subprogram) {
1187 unwrap(Builder)->finalizeSubprogram(unwrapDI<DISubprogram>(subprogram));
1188}
1189
1192 LLVMMetadataRef FileRef, const char *Producer, size_t ProducerLen,
1193 LLVMBool isOptimized, const char *Flags, size_t FlagsLen,
1194 unsigned RuntimeVer, const char *SplitName, size_t SplitNameLen,
1195 LLVMDWARFEmissionKind Kind, unsigned DWOId, LLVMBool SplitDebugInlining,
1196 LLVMBool DebugInfoForProfiling, const char *SysRoot, size_t SysRootLen,
1197 const char *SDK, size_t SDKLen) {
1198 auto File = unwrapDI<DIFile>(FileRef);
1199
1200 return wrap(unwrap(Builder)->createCompileUnit(
1202 StringRef(Producer, ProducerLen), isOptimized, StringRef(Flags, FlagsLen),
1203 RuntimeVer, StringRef(SplitName, SplitNameLen),
1204 static_cast<DICompileUnit::DebugEmissionKind>(Kind), DWOId,
1205 SplitDebugInlining, DebugInfoForProfiling,
1207 StringRef(SysRoot, SysRootLen), StringRef(SDK, SDKLen)));
1208}
1209
1212 size_t FilenameLen, const char *Directory,
1213 size_t DirectoryLen) {
1214 return wrap(unwrap(Builder)->createFile(StringRef(Filename, FilenameLen),
1215 StringRef(Directory, DirectoryLen)));
1216}
1217
1220 switch (CSKind) {
1222 return llvm::DIFile::CSK_MD5;
1227 }
1228 llvm_unreachable("Unhandled Checksum Kind");
1229}
1230
1232 LLVMDIBuilderRef Builder, const char *Filename, size_t FilenameLen,
1233 const char *Directory, size_t DirectoryLen, LLVMChecksumKind ChecksumKind,
1234 const char *Checksum, size_t ChecksumLen, const char *Source,
1235 size_t SourceLen) {
1236 StringRef ChkSum = StringRef(Checksum, ChecksumLen);
1237 auto CSK = map_from_llvmChecksumKind(ChecksumKind);
1238 llvm::DIFile::ChecksumInfo<StringRef> CSInfo(CSK, ChkSum);
1239 std::optional<StringRef> Src;
1240 if (SourceLen > 0)
1241 Src = StringRef(Source, SourceLen);
1242 return wrap(unwrap(Builder)->createFile(StringRef(Filename, FilenameLen),
1243 StringRef(Directory, DirectoryLen),
1244 CSInfo, Src));
1245}
1246
1249 const char *Name, size_t NameLen,
1250 const char *ConfigMacros, size_t ConfigMacrosLen,
1251 const char *IncludePath, size_t IncludePathLen,
1252 const char *APINotesFile, size_t APINotesFileLen) {
1253 return wrap(unwrap(Builder)->createModule(
1254 unwrapDI<DIScope>(ParentScope), StringRef(Name, NameLen),
1255 StringRef(ConfigMacros, ConfigMacrosLen),
1256 StringRef(IncludePath, IncludePathLen),
1257 StringRef(APINotesFile, APINotesFileLen)));
1258}
1259
1261 LLVMMetadataRef ParentScope,
1262 const char *Name, size_t NameLen,
1263 LLVMBool ExportSymbols) {
1264 return wrap(unwrap(Builder)->createNameSpace(
1265 unwrapDI<DIScope>(ParentScope), StringRef(Name, NameLen), ExportSymbols));
1266}
1267
1269 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1270 size_t NameLen, const char *LinkageName, size_t LinkageNameLen,
1271 LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1272 LLVMBool IsLocalToUnit, LLVMBool IsDefinition,
1273 unsigned ScopeLine, LLVMDIFlags Flags, LLVMBool IsOptimized) {
1274 return wrap(unwrap(Builder)->createFunction(
1275 unwrapDI<DIScope>(Scope), {Name, NameLen}, {LinkageName, LinkageNameLen},
1276 unwrapDI<DIFile>(File), LineNo, unwrapDI<DISubroutineType>(Ty), ScopeLine,
1277 map_from_llvmDIFlags(Flags),
1278 pack_into_DISPFlags(IsLocalToUnit, IsDefinition, IsOptimized), nullptr,
1279 nullptr, nullptr));
1280}
1281
1282
1284 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope,
1285 LLVMMetadataRef File, unsigned Line, unsigned Col) {
1286 return wrap(unwrap(Builder)->createLexicalBlock(unwrapDI<DIScope>(Scope),
1287 unwrapDI<DIFile>(File),
1288 Line, Col));
1289}
1290
1293 LLVMMetadataRef Scope,
1294 LLVMMetadataRef File,
1295 unsigned Discriminator) {
1296 return wrap(unwrap(Builder)->createLexicalBlockFile(unwrapDI<DIScope>(Scope),
1297 unwrapDI<DIFile>(File),
1298 Discriminator));
1299}
1300
1303 LLVMMetadataRef Scope,
1304 LLVMMetadataRef NS,
1305 LLVMMetadataRef File,
1306 unsigned Line) {
1307 return wrap(unwrap(Builder)->createImportedModule(unwrapDI<DIScope>(Scope),
1309 unwrapDI<DIFile>(File),
1310 Line));
1311}
1312
1314 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope,
1315 LLVMMetadataRef ImportedEntity, LLVMMetadataRef File, unsigned Line,
1316 LLVMMetadataRef *Elements, unsigned NumElements) {
1317 auto Elts =
1318 (NumElements > 0)
1319 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1320 : nullptr;
1321 return wrap(unwrap(Builder)->createImportedModule(
1322 unwrapDI<DIScope>(Scope), unwrapDI<DIImportedEntity>(ImportedEntity),
1323 unwrapDI<DIFile>(File), Line, Elts));
1324}
1325
1328 LLVMMetadataRef File, unsigned Line, LLVMMetadataRef *Elements,
1329 unsigned NumElements) {
1330 auto Elts =
1331 (NumElements > 0)
1332 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1333 : nullptr;
1334 return wrap(unwrap(Builder)->createImportedModule(
1336 Line, Elts));
1337}
1338
1341 LLVMMetadataRef File, unsigned Line, const char *Name, size_t NameLen,
1342 LLVMMetadataRef *Elements, unsigned NumElements) {
1343 auto Elts =
1344 (NumElements > 0)
1345 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1346 : nullptr;
1347 return wrap(unwrap(Builder)->createImportedDeclaration(
1349 Line, {Name, NameLen}, Elts));
1350}
1351
1354 unsigned Column, LLVMMetadataRef Scope,
1355 LLVMMetadataRef InlinedAt) {
1356 return wrap(DILocation::get(*unwrap(Ctx), Line, Column, unwrap(Scope),
1357 unwrap(InlinedAt)));
1358}
1359
1361 return unwrapDI<DILocation>(Location)->getLine();
1362}
1363
1365 return unwrapDI<DILocation>(Location)->getColumn();
1366}
1367
1371
1373 return wrap(unwrapDI<DILocation>(Location)->getInlinedAt());
1374}
1375
1377 return wrap(unwrapDI<DIScope>(Scope)->getFile());
1378}
1379
1380const char *LLVMDIFileGetDirectory(LLVMMetadataRef File, unsigned *Len) {
1381 auto Dir = unwrapDI<DIFile>(File)->getDirectory();
1382 *Len = Dir.size();
1383 return Dir.data();
1384}
1385
1386const char *LLVMDIFileGetFilename(LLVMMetadataRef File, unsigned *Len) {
1387 auto Name = unwrapDI<DIFile>(File)->getFilename();
1388 *Len = Name.size();
1389 return Name.data();
1390}
1391
1392const char *LLVMDIFileGetSource(LLVMMetadataRef File, unsigned *Len) {
1393 if (auto Src = unwrapDI<DIFile>(File)->getSource()) {
1394 *Len = Src->size();
1395 return Src->data();
1396 }
1397 *Len = 0;
1398 return "";
1399}
1400
1402 LLVMMetadataRef ParentMacroFile,
1403 unsigned Line,
1405 const char *Name, size_t NameLen,
1406 const char *Value, size_t ValueLen) {
1407 return wrap(
1408 unwrap(Builder)->createMacro(unwrapDI<DIMacroFile>(ParentMacroFile), Line,
1409 static_cast<MacinfoRecordType>(RecordType),
1410 {Name, NameLen}, {Value, ValueLen}));
1411}
1412
1415 LLVMMetadataRef ParentMacroFile, unsigned Line,
1416 LLVMMetadataRef File) {
1417 return wrap(unwrap(Builder)->createTempMacroFile(
1418 unwrapDI<DIMacroFile>(ParentMacroFile), Line, unwrapDI<DIFile>(File)));
1419}
1420
1422 const char *Name, size_t NameLen,
1423 int64_t Value,
1424 LLVMBool IsUnsigned) {
1425 return wrap(unwrap(Builder)->createEnumerator({Name, NameLen}, Value,
1426 IsUnsigned != 0));
1427}
1428
1430 LLVMDIBuilderRef Builder, const char *Name, size_t NameLen,
1431 uint64_t SizeInBits, const uint64_t Words[], LLVMBool IsUnsigned) {
1432 uint64_t NumWords = (SizeInBits + 63) / 64;
1433 return wrap(unwrap(Builder)->createEnumerator(
1434 {Name, NameLen},
1435 APSInt(APInt(SizeInBits, ArrayRef(Words, NumWords)), IsUnsigned != 0)));
1436}
1437
1439 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1440 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1441 uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef *Elements,
1442 unsigned NumElements, LLVMMetadataRef ClassTy) {
1443auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1444 NumElements});
1445return wrap(unwrap(Builder)->createEnumerationType(
1446 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1447 LineNumber, SizeInBits, AlignInBits, Elts, unwrapDI<DIType>(ClassTy)));
1448}
1449
1451 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1452 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1453 uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef BaseTy) {
1454 return wrap(unwrap(Builder)->createSetType(
1455 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1456 LineNumber, SizeInBits, AlignInBits, unwrapDI<DIType>(BaseTy)));
1457}
1458
1460 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1461 size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t SizeInBits,
1462 uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef BaseTy,
1463 LLVMMetadataRef LowerBound, LLVMMetadataRef UpperBound,
1464 LLVMMetadataRef Stride, LLVMMetadataRef Bias) {
1465 return wrap(unwrap(Builder)->createSubrangeType(
1466 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, unwrapDI<DIScope>(Scope),
1467 SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1468 unwrapDI<DIType>(BaseTy), unwrap(LowerBound), unwrap(UpperBound),
1469 unwrap(Stride), unwrap(Bias)));
1470}
1471
1472/// MD may be nullptr, a DIExpression or DIVariable.
1474 if (!MD)
1475 return nullptr;
1476 MDNode *MDN = unwrapDI<MDNode>(MD);
1477 if (auto *E = dyn_cast<DIExpression>(MDN))
1478 return E;
1479 assert(isa<DIVariable>(MDN) && "Expected DIExpression or DIVariable");
1480 return cast<DIVariable>(MDN);
1481}
1482
1484 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1485 size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t Size,
1486 uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts,
1487 unsigned NumSubscripts, LLVMMetadataRef DataLocation,
1488 LLVMMetadataRef Associated, LLVMMetadataRef Allocated, LLVMMetadataRef Rank,
1489 LLVMMetadataRef BitStride) {
1490 auto Subs =
1491 unwrap(Builder)->getOrCreateArray({unwrap(Subscripts), NumSubscripts});
1492 return wrap(unwrap(Builder)->createArrayType(
1493 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1494 Size, AlignInBits, unwrapDI<DIType>(Ty), Subs,
1495 unwrapExprVar(DataLocation), unwrapExprVar(Associated),
1496 unwrapExprVar(Allocated), unwrapExprVar(Rank), unwrap(BitStride)));
1497}
1498
1500 LLVMMetadataRef *Elements, unsigned NumElements) {
1501 auto CT = unwrap<DICompositeType>(*T);
1502 auto Elts =
1503 unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements});
1504 unwrap(Builder)->replaceArrays(CT, Elts);
1505}
1506
1508 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1509 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1510 uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags,
1511 LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang,
1512 const char *UniqueId, size_t UniqueIdLen) {
1513 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1514 NumElements});
1515 return wrap(unwrap(Builder)->createUnionType(
1516 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1517 LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1518 Elts, RunTimeLang, {UniqueId, UniqueIdLen}));
1519}
1520
1521
1524 uint32_t AlignInBits, LLVMMetadataRef Ty,
1525 LLVMMetadataRef *Subscripts,
1526 unsigned NumSubscripts) {
1527 auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts),
1528 NumSubscripts});
1529 return wrap(unwrap(Builder)->createArrayType(Size, AlignInBits,
1530 unwrapDI<DIType>(Ty), Subs));
1531}
1532
1535 uint32_t AlignInBits, LLVMMetadataRef Ty,
1536 LLVMMetadataRef *Subscripts,
1537 unsigned NumSubscripts) {
1538 auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts),
1539 NumSubscripts});
1540 return wrap(unwrap(Builder)->createVectorType(Size, AlignInBits,
1541 unwrapDI<DIType>(Ty), Subs));
1542}
1543
1546 size_t NameLen, uint64_t SizeInBits,
1547 LLVMDWARFTypeEncoding Encoding,
1548 LLVMDIFlags Flags) {
1549 return wrap(unwrap(Builder)->createBasicType({Name, NameLen},
1550 SizeInBits, Encoding,
1551 map_from_llvmDIFlags(Flags)));
1552}
1553
1555 LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeTy,
1556 uint64_t SizeInBits, uint32_t AlignInBits, unsigned AddressSpace,
1557 const char *Name, size_t NameLen) {
1558 return wrap(unwrap(Builder)->createPointerType(
1559 unwrapDI<DIType>(PointeeTy), SizeInBits, AlignInBits, AddressSpace,
1560 {Name, NameLen}));
1561}
1562
1564 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1565 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1566 uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags,
1567 LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements,
1568 unsigned NumElements, unsigned RunTimeLang, LLVMMetadataRef VTableHolder,
1569 const char *UniqueId, size_t UniqueIdLen) {
1570 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1571 NumElements});
1572 return wrap(unwrap(Builder)->createStructType(
1573 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1574 LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1575 unwrapDI<DIType>(DerivedFrom), Elts, RunTimeLang,
1576 unwrapDI<DIType>(VTableHolder), {UniqueId, UniqueIdLen}));
1577}
1578
1580 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1581 size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits,
1582 uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags,
1583 LLVMMetadataRef Ty) {
1584 return wrap(unwrap(Builder)->createMemberType(unwrapDI<DIScope>(Scope),
1585 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, SizeInBits, AlignInBits,
1586 OffsetInBits, map_from_llvmDIFlags(Flags), unwrapDI<DIType>(Ty)));
1587}
1588
1591 size_t NameLen) {
1592 return wrap(unwrap(Builder)->createUnspecifiedType({Name, NameLen}));
1593}
1594
1596 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1597 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1598 LLVMMetadataRef Type, LLVMDIFlags Flags, LLVMValueRef ConstantVal,
1599 uint32_t AlignInBits) {
1600 return wrap(unwrap(Builder)->createStaticMemberType(
1601 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1602 LineNumber, unwrapDI<DIType>(Type), map_from_llvmDIFlags(Flags),
1603 unwrap<Constant>(ConstantVal), DW_TAG_member, AlignInBits));
1604}
1605
1608 const char *Name, size_t NameLen,
1609 LLVMMetadataRef File, unsigned LineNo,
1610 uint64_t SizeInBits, uint32_t AlignInBits,
1611 uint64_t OffsetInBits, LLVMDIFlags Flags,
1612 LLVMMetadataRef Ty, LLVMMetadataRef PropertyNode) {
1613 return wrap(unwrap(Builder)->createObjCIVar(
1614 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1615 SizeInBits, AlignInBits, OffsetInBits,
1617 unwrapDI<MDNode>(PropertyNode)));
1618}
1619
1622 const char *Name, size_t NameLen,
1623 LLVMMetadataRef File, unsigned LineNo,
1624 const char *GetterName, size_t GetterNameLen,
1625 const char *SetterName, size_t SetterNameLen,
1626 unsigned PropertyAttributes,
1627 LLVMMetadataRef Ty) {
1628 return wrap(unwrap(Builder)->createObjCProperty(
1629 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1630 {GetterName, GetterNameLen}, {SetterName, SetterNameLen},
1631 PropertyAttributes, unwrapDI<DIType>(Ty)));
1632}
1633
1637 return wrap(unwrap(Builder)->createObjectPointerType(unwrapDI<DIType>(Type),
1638 Implicit));
1639}
1640
1643 const char *Name, size_t NameLen,
1644 LLVMMetadataRef File, unsigned LineNo,
1645 LLVMMetadataRef Scope, uint32_t AlignInBits) {
1646 return wrap(unwrap(Builder)->createTypedef(
1647 unwrapDI<DIType>(Type), {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1648 unwrapDI<DIScope>(Scope), AlignInBits));
1649}
1650
1654 uint64_t BaseOffset, uint32_t VBPtrOffset,
1655 LLVMDIFlags Flags) {
1656 return wrap(unwrap(Builder)->createInheritance(
1658 BaseOffset, VBPtrOffset, map_from_llvmDIFlags(Flags)));
1659}
1660
1663 LLVMDIBuilderRef Builder, unsigned Tag, const char *Name,
1664 size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line,
1665 unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits,
1666 const char *UniqueIdentifier, size_t UniqueIdentifierLen) {
1667 return wrap(unwrap(Builder)->createForwardDecl(
1668 Tag, {Name, NameLen}, unwrapDI<DIScope>(Scope),
1669 unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits,
1670 AlignInBits, {UniqueIdentifier, UniqueIdentifierLen}));
1671}
1672
1675 LLVMDIBuilderRef Builder, unsigned Tag, const char *Name,
1676 size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line,
1677 unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits,
1678 LLVMDIFlags Flags, const char *UniqueIdentifier,
1679 size_t UniqueIdentifierLen) {
1680 return wrap(unwrap(Builder)->createReplaceableCompositeType(
1681 Tag, {Name, NameLen}, unwrapDI<DIScope>(Scope),
1682 unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits,
1683 AlignInBits, map_from_llvmDIFlags(Flags),
1684 {UniqueIdentifier, UniqueIdentifierLen}));
1685}
1686
1690 return wrap(unwrap(Builder)->createQualifiedType(Tag,
1692}
1693
1697 return wrap(unwrap(Builder)->createReferenceType(Tag,
1699}
1700
1703 return wrap(unwrap(Builder)->createNullPtrType());
1704}
1705
1708 LLVMMetadataRef PointeeType,
1709 LLVMMetadataRef ClassType,
1710 uint64_t SizeInBits,
1711 uint32_t AlignInBits,
1712 LLVMDIFlags Flags) {
1713 return wrap(unwrap(Builder)->createMemberPointerType(
1714 unwrapDI<DIType>(PointeeType),
1715 unwrapDI<DIType>(ClassType), AlignInBits, SizeInBits,
1716 map_from_llvmDIFlags(Flags)));
1717}
1718
1721 LLVMMetadataRef Scope,
1722 const char *Name, size_t NameLen,
1723 LLVMMetadataRef File, unsigned LineNumber,
1724 uint64_t SizeInBits,
1725 uint64_t OffsetInBits,
1726 uint64_t StorageOffsetInBits,
1728 return wrap(unwrap(Builder)->createBitFieldMemberType(
1729 unwrapDI<DIScope>(Scope), {Name, NameLen},
1730 unwrapDI<DIFile>(File), LineNumber,
1731 SizeInBits, OffsetInBits, StorageOffsetInBits,
1733}
1734
1736 LLVMMetadataRef Scope, const char *Name, size_t NameLen,
1737 LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits,
1738 uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags,
1739 LLVMMetadataRef DerivedFrom,
1740 LLVMMetadataRef *Elements, unsigned NumElements,
1741 LLVMMetadataRef VTableHolder, LLVMMetadataRef TemplateParamsNode,
1742 const char *UniqueIdentifier, size_t UniqueIdentifierLen) {
1743 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1744 NumElements});
1745 return wrap(unwrap(Builder)->createClassType(
1746 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1747 LineNumber, SizeInBits, AlignInBits, OffsetInBits,
1748 map_from_llvmDIFlags(Flags), unwrapDI<DIType>(DerivedFrom), Elts,
1749 /*RunTimeLang=*/0, unwrapDI<DIType>(VTableHolder),
1750 unwrapDI<MDNode>(TemplateParamsNode),
1751 {UniqueIdentifier, UniqueIdentifierLen}));
1752}
1753
1757 return wrap(unwrap(Builder)->createArtificialType(unwrapDI<DIType>(Type)));
1758}
1759
1761 return unwrapDI<DINode>(MD)->getTag();
1762}
1763
1764const char *LLVMDITypeGetName(LLVMMetadataRef DType, size_t *Length) {
1765 StringRef Str = unwrapDI<DIType>(DType)->getName();
1766 *Length = Str.size();
1767 return Str.data();
1768}
1769
1771 return unwrapDI<DIType>(DType)->getSizeInBits();
1772}
1773
1775 return unwrapDI<DIType>(DType)->getOffsetInBits();
1776}
1777
1779 return unwrapDI<DIType>(DType)->getAlignInBits();
1780}
1781
1783 return unwrapDI<DIType>(DType)->getLine();
1784}
1785
1789
1791 LLVMMetadataRef *Types,
1792 size_t Length) {
1793 return wrap(
1794 unwrap(Builder)->getOrCreateTypeArray({unwrap(Types), Length}).get());
1795}
1796
1799 LLVMMetadataRef File,
1800 LLVMMetadataRef *ParameterTypes,
1801 unsigned NumParameterTypes,
1802 LLVMDIFlags Flags) {
1803 auto Elts = unwrap(Builder)->getOrCreateTypeArray({unwrap(ParameterTypes),
1804 NumParameterTypes});
1805 return wrap(unwrap(Builder)->createSubroutineType(
1806 Elts, map_from_llvmDIFlags(Flags)));
1807}
1808
1810 uint64_t *Addr, size_t Length) {
1811 return wrap(
1812 unwrap(Builder)->createExpression(ArrayRef<uint64_t>(Addr, Length)));
1813}
1814
1817 uint64_t Value) {
1818 return wrap(unwrap(Builder)->createConstantValueExpression(Value));
1819}
1820
1822 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1823 size_t NameLen, const char *Linkage, size_t LinkLen, LLVMMetadataRef File,
1824 unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit,
1825 LLVMMetadataRef Expr, LLVMMetadataRef Decl, uint32_t AlignInBits) {
1826 return wrap(unwrap(Builder)->createGlobalVariableExpression(
1827 unwrapDI<DIScope>(Scope), {Name, NameLen}, {Linkage, LinkLen},
1828 unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit,
1829 true, unwrap<DIExpression>(Expr), unwrapDI<MDNode>(Decl),
1830 nullptr, AlignInBits));
1831}
1832
1836
1841
1845
1849
1851 return unwrapDI<DIVariable>(Var)->getLine();
1852}
1853
1855 size_t Count) {
1856 return wrap(
1857 MDTuple::getTemporary(*unwrap(Ctx), {unwrap(Data), Count}).release());
1858}
1859
1863
1865 LLVMMetadataRef Replacement) {
1866 auto *Node = unwrapDI<MDNode>(TargetMetadata);
1867 Node->replaceAllUsesWith(unwrap(Replacement));
1869}
1870
1872 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1873 size_t NameLen, const char *Linkage, size_t LnkLen, LLVMMetadataRef File,
1874 unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit,
1875 LLVMMetadataRef Decl, uint32_t AlignInBits) {
1876 return wrap(unwrap(Builder)->createTempGlobalVariableFwdDecl(
1877 unwrapDI<DIScope>(Scope), {Name, NameLen}, {Linkage, LnkLen},
1878 unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit,
1879 unwrapDI<MDNode>(Decl), nullptr, AlignInBits));
1880}
1881
1883 LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo,
1885 DbgRecord *DbgInst = unwrap(Builder)->insertDeclare(
1886 unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
1888 Instr ? InsertPosition(unwrap<Instruction>(Instr)->getIterator())
1889 : nullptr);
1890 return wrap(DbgInst);
1891}
1892
1894 LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo,
1896 DbgRecord *DbgInst = unwrap(Builder)->insertDeclare(
1897 unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
1899 return wrap(DbgInst);
1900}
1901
1903 LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo,
1905 DbgRecord *DbgInst = unwrap(Builder)->insertDbgValue(
1908 Instr ? InsertPosition(unwrap<Instruction>(Instr)->getIterator())
1909 : nullptr);
1910 return wrap(DbgInst);
1911}
1912
1914 LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo,
1916 DbgRecord *DbgInst = unwrap(Builder)->insertDbgValue(
1919 Block ? InsertPosition(unwrap(Block)->end()) : nullptr);
1920 return wrap(DbgInst);
1921}
1922
1924 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1925 size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1926 LLVMBool AlwaysPreserve, LLVMDIFlags Flags, uint32_t AlignInBits) {
1927 return wrap(unwrap(Builder)->createAutoVariable(
1928 unwrap<DIScope>(Scope), {Name, NameLen}, unwrap<DIFile>(File),
1929 LineNo, unwrap<DIType>(Ty), AlwaysPreserve,
1930 map_from_llvmDIFlags(Flags), AlignInBits));
1931}
1932
1934 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1935 size_t NameLen, unsigned ArgNo, LLVMMetadataRef File, unsigned LineNo,
1936 LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags) {
1937 return wrap(unwrap(Builder)->createParameterVariable(
1938 unwrap<DIScope>(Scope), {Name, NameLen}, ArgNo, unwrap<DIFile>(File),
1939 LineNo, unwrap<DIType>(Ty), AlwaysPreserve,
1940 map_from_llvmDIFlags(Flags)));
1941}
1942
1944 int64_t Lo, int64_t Count) {
1945 return wrap(unwrap(Builder)->getOrCreateSubrange(Lo, Count));
1946}
1947
1950 size_t Length) {
1951 Metadata **DataValue = unwrap(Data);
1952 return wrap(unwrap(Builder)->getOrCreateArray({DataValue, Length}).get());
1953}
1954
1958
1960 unwrap<Function>(Func)->setSubprogram(unwrap<DISubprogram>(SP));
1961}
1962
1964 return unwrapDI<DISubprogram>(Subprogram)->getLine();
1965}
1966
1968 LLVMMetadataRef SubroutineType) {
1969 unwrapDI<DISubprogram>(Subprogram)
1970 ->replaceType(unwrapDI<DISubroutineType>(SubroutineType));
1971}
1972
1976
1978 if (Loc)
1979 unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc(unwrap<DILocation>(Loc)));
1980 else
1981 unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc());
1982}
1983
1985 LLVMMetadataRef Context,
1986 const char *Name, size_t NameLen,
1987 LLVMMetadataRef File, unsigned LineNo,
1988 LLVMBool AlwaysPreserve) {
1989 return wrap(unwrap(Builder)->createLabel(
1990 unwrapDI<DIScope>(Context), StringRef(Name, NameLen),
1991 unwrapDI<DIFile>(File), LineNo, /*Column*/ 0, /*IsArtificial*/ false,
1992 /*CoroSuspendIdx*/ std::nullopt, AlwaysPreserve));
1993}
1994
1996 LLVMMetadataRef LabelInfo,
1997 LLVMMetadataRef Location,
1998 LLVMValueRef InsertBefore) {
1999 DbgRecord *DbgInst = unwrap(Builder)->insertLabel(
2000 unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location),
2001 InsertBefore
2002 ? InsertPosition(unwrap<Instruction>(InsertBefore)->getIterator())
2003 : nullptr);
2004 return wrap(DbgInst);
2005}
2006
2008 LLVMMetadataRef LabelInfo,
2009 LLVMMetadataRef Location,
2010 LLVMBasicBlockRef InsertAtEnd) {
2011 DbgRecord *DbgInst = unwrap(Builder)->insertLabel(
2012 unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location),
2013 InsertAtEnd ? InsertPosition(unwrap(InsertAtEnd)->end()) : nullptr);
2014 return wrap(DbgInst);
2015}
2016
2018 switch(unwrap(Metadata)->getMetadataID()) {
2019#define HANDLE_METADATA_LEAF(CLASS) \
2020 case Metadata::CLASS##Kind: \
2021 return (LLVMMetadataKind)LLVM##CLASS##MetadataKind;
2022#include "llvm/IR/Metadata.def"
2023 default:
2025 }
2026}
2027
2029 for (auto *DVR : getDVRAssignmentMarkers(Inst))
2030 DVR->eraseFromParent();
2031}
2032
2034 // Replace attachments.
2035 AssignmentInstRange InstRange = getAssignmentInsts(Old);
2036 // Use intermediate storage for the instruction ptrs because the
2037 // getAssignmentInsts range iterators will be invalidated by adding and
2038 // removing DIAssignID attachments.
2039 SmallVector<Instruction *> InstVec(InstRange.begin(), InstRange.end());
2040 for (auto *I : InstVec)
2041 I->setMetadata(LLVMContext::MD_DIAssignID, New);
2042
2043 for (DbgVariableRecord *DVR :
2045 DVR->setAssignId(New);
2046}
2047
2049 for (BasicBlock &BB : *F) {
2050 for (Instruction &I : BB) {
2051 for (DbgVariableRecord &DVR :
2052 make_early_inc_range(filterDbgVars(I.getDbgRecordRange())))
2053 if (DVR.isDbgAssign())
2054 DVR.eraseFromParent();
2055
2056 I.setMetadata(LLVMContext::MD_DIAssignID, nullptr);
2057 }
2058 }
2059}
2060
2062 const DataLayout &DL, const Value *Dest, uint64_t SliceOffsetInBits,
2063 uint64_t SliceSizeInBits, const DbgVariableRecord *AssignRecord,
2064 std::optional<DIExpression::FragmentInfo> &Result) {
2065 // No overlap if this DbgRecord describes a killed location.
2066 if (AssignRecord->isKillAddress())
2067 return false;
2068
2069 int64_t AddrOffsetInBits;
2070 {
2071 int64_t AddrOffsetInBytes;
2072 SmallVector<uint64_t> PostOffsetOps; //< Unused.
2073 // Bail if we can't find a constant offset (or none) in the expression.
2074 if (!AssignRecord->getAddressExpression()->extractLeadingOffset(
2075 AddrOffsetInBytes, PostOffsetOps))
2076 return false;
2077 AddrOffsetInBits = AddrOffsetInBytes * 8;
2078 }
2079
2080 Value *Addr = AssignRecord->getAddress();
2081 // FIXME: It may not always be zero.
2082 int64_t BitExtractOffsetInBits = 0;
2084 AssignRecord->getFragmentOrEntireVariable();
2085
2086 int64_t OffsetFromLocationInBits; //< Unused.
2088 DL, Dest, SliceOffsetInBits, SliceSizeInBits, Addr, AddrOffsetInBits,
2089 BitExtractOffsetInBits, VarFrag, Result, OffsetFromLocationInBits);
2090}
2091
2092/// Update inlined instructions' DIAssignID metadata. We need to do this
2093/// otherwise a function inlined more than once into the same function
2094/// will cause DIAssignID to be shared by many instructions.
2096 Instruction &I) {
2097 auto GetNewID = [&Map](Metadata *Old) {
2098 DIAssignID *OldID = cast<DIAssignID>(Old);
2099 if (DIAssignID *NewID = Map.lookup(OldID))
2100 return NewID;
2102 Map[OldID] = NewID;
2103 return NewID;
2104 };
2105 // If we find a DIAssignID attachment or use, replace it with a new version.
2106 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
2107 if (DVR.isDbgAssign())
2108 DVR.setAssignId(GetNewID(DVR.getAssignID()));
2109 }
2110 if (auto *ID = I.getMetadata(LLVMContext::MD_DIAssignID))
2111 I.setMetadata(LLVMContext::MD_DIAssignID, GetNewID(ID));
2112}
2113
2114/// Collect constant properties (base, size, offset) of \p StoreDest.
2115/// Return std::nullopt if any properties are not constants or the
2116/// offset from the base pointer is negative.
2117static std::optional<AssignmentInfo>
2118getAssignmentInfoImpl(const DataLayout &DL, const Value *StoreDest,
2119 TypeSize SizeInBits) {
2120 if (SizeInBits.isScalable())
2121 return std::nullopt;
2122 APInt GEPOffset(DL.getIndexTypeSizeInBits(StoreDest->getType()), 0);
2123 const Value *Base = StoreDest->stripAndAccumulateConstantOffsets(
2124 DL, GEPOffset, /*AllowNonInbounds*/ true);
2125
2126 if (GEPOffset.isNegative())
2127 return std::nullopt;
2128
2129 uint64_t OffsetInBytes = GEPOffset.getLimitedValue();
2130 // Check for overflow.
2131 if (OffsetInBytes == UINT64_MAX)
2132 return std::nullopt;
2133 if (const auto *Alloca = dyn_cast<AllocaInst>(Base))
2134 if (!Alloca->isScalable())
2135 return AssignmentInfo(DL, Alloca, OffsetInBytes * 8, SizeInBits);
2136 return std::nullopt;
2137}
2138
2139std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2140 const MemIntrinsic *I) {
2141 const Value *StoreDest = I->getRawDest();
2142 // Assume 8 bit bytes.
2143 auto *ConstLengthInBytes = dyn_cast<ConstantInt>(I->getLength());
2144 if (!ConstLengthInBytes)
2145 // We can't use a non-const size, bail.
2146 return std::nullopt;
2147 uint64_t SizeInBits = 8 * ConstLengthInBytes->getZExtValue();
2148 return getAssignmentInfoImpl(DL, StoreDest, TypeSize::getFixed(SizeInBits));
2149}
2150
2151std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2152 const StoreInst *SI) {
2153 TypeSize SizeInBits = DL.getTypeSizeInBits(SI->getValueOperand()->getType());
2154 return getAssignmentInfoImpl(DL, SI->getPointerOperand(), SizeInBits);
2155}
2156
2157std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2158 const AllocaInst *AI) {
2159 TypeSize SizeInBits = DL.getTypeSizeInBits(AI->getAllocatedType());
2160 return getAssignmentInfoImpl(DL, AI, SizeInBits);
2161}
2162
2163/// Returns nullptr if the assignment shouldn't be attributed to this variable.
2164static void emitDbgAssign(AssignmentInfo Info, Value *Val, Value *Dest,
2165 Instruction &StoreLikeInst, const VarRecord &VarRec,
2166 DIBuilder &DIB) {
2167 auto *ID = StoreLikeInst.getMetadata(LLVMContext::MD_DIAssignID);
2168 assert(ID && "Store instruction must have DIAssignID metadata");
2169 (void)ID;
2170
2171 const uint64_t StoreStartBit = Info.OffsetInBits;
2172 const uint64_t StoreEndBit = Info.OffsetInBits + Info.SizeInBits;
2173
2174 uint64_t FragStartBit = StoreStartBit;
2175 uint64_t FragEndBit = StoreEndBit;
2176
2177 bool StoreToWholeVariable = Info.StoreToWholeAlloca;
2178 if (auto Size = VarRec.Var->getSizeInBits()) {
2179 // NOTE: trackAssignments doesn't understand base expressions yet, so all
2180 // variables that reach here are guaranteed to start at offset 0 in the
2181 // alloca.
2182 const uint64_t VarStartBit = 0;
2183 const uint64_t VarEndBit = *Size;
2184
2185 // FIXME: trim FragStartBit when nonzero VarStartBit is supported.
2186 FragEndBit = std::min(FragEndBit, VarEndBit);
2187
2188 // Discard stores to bits outside this variable.
2189 if (FragStartBit >= FragEndBit)
2190 return;
2191
2192 StoreToWholeVariable = FragStartBit <= VarStartBit && FragEndBit >= *Size;
2193 }
2194
2195 DIExpression *Expr = DIExpression::get(StoreLikeInst.getContext(), {});
2196 if (!StoreToWholeVariable) {
2197 auto R = DIExpression::createFragmentExpression(Expr, FragStartBit,
2198 FragEndBit - FragStartBit);
2199 assert(R.has_value() && "failed to create fragment expression");
2200 Expr = *R;
2201 }
2202 DIExpression *AddrExpr = DIExpression::get(StoreLikeInst.getContext(), {});
2204 &StoreLikeInst, Val, VarRec.Var, Expr, Dest, AddrExpr, VarRec.DL);
2205 (void)Assign;
2206 LLVM_DEBUG(if (Assign) errs() << " > INSERT: " << *Assign << "\n");
2207}
2208
2209#undef DEBUG_TYPE // Silence redefinition warning (from ConstantsContext.h).
2210#define DEBUG_TYPE "assignment-tracking"
2211
2213 const StorageToVarsMap &Vars, const DataLayout &DL,
2214 bool DebugPrints) {
2215 // Early-exit if there are no interesting variables.
2216 if (Vars.empty())
2217 return;
2218
2219 auto &Ctx = Start->getContext();
2220 auto &Module = *Start->getModule();
2221
2222 // Poison type doesn't matter, so long as it isn't void. Let's just use i1.
2223 auto *Poison = PoisonValue::get(Type::getInt1Ty(Ctx));
2224 DIBuilder DIB(Module, /*AllowUnresolved*/ false);
2225
2226 // Scan the instructions looking for stores to local variables' storage.
2227 LLVM_DEBUG(errs() << "# Scanning instructions\n");
2228 for (auto BBI = Start; BBI != End; ++BBI) {
2229 for (Instruction &I : *BBI) {
2230
2231 std::optional<AssignmentInfo> Info;
2232 Value *ValueComponent = nullptr;
2233 Value *DestComponent = nullptr;
2234 if (auto *AI = dyn_cast<AllocaInst>(&I)) {
2235 // We want to track the variable's stack home from its alloca's
2236 // position onwards so we treat it as an assignment (where the stored
2237 // value is poison).
2238 Info = getAssignmentInfo(DL, AI);
2239 ValueComponent = Poison;
2240 DestComponent = AI;
2241 } else if (auto *SI = dyn_cast<StoreInst>(&I)) {
2242 Info = getAssignmentInfo(DL, SI);
2243 ValueComponent = SI->getValueOperand();
2244 DestComponent = SI->getPointerOperand();
2245 } else if (auto *MI = dyn_cast<MemTransferInst>(&I)) {
2246 Info = getAssignmentInfo(DL, MI);
2247 // May not be able to represent this value easily.
2248 ValueComponent = Poison;
2249 DestComponent = MI->getOperand(0);
2250 } else if (auto *MI = dyn_cast<MemSetInst>(&I)) {
2251 Info = getAssignmentInfo(DL, MI);
2252 // If we're zero-initing we can state the assigned value is zero,
2253 // otherwise use undef.
2254 auto *ConstValue = dyn_cast<ConstantInt>(MI->getOperand(1));
2255 if (ConstValue && ConstValue->isZero())
2256 ValueComponent = ConstValue;
2257 else
2258 ValueComponent = Poison;
2259 DestComponent = MI->getOperand(0);
2260 } else {
2261 // Not a store-like instruction.
2262 continue;
2263 }
2264
2265 assert(ValueComponent && DestComponent);
2266 LLVM_DEBUG(errs() << "SCAN: Found store-like: " << I << "\n");
2267
2268 // Check if getAssignmentInfo failed to understand this store.
2269 if (!Info.has_value()) {
2270 LLVM_DEBUG(
2271 errs()
2272 << " | SKIP: Untrackable store (e.g. through non-const gep)\n");
2273 continue;
2274 }
2275 LLVM_DEBUG(errs() << " | BASE: " << *Info->Base << "\n");
2276
2277 // Check if the store destination is a local variable with debug info.
2278 auto LocalIt = Vars.find(Info->Base);
2279 if (LocalIt == Vars.end()) {
2280 LLVM_DEBUG(
2281 errs()
2282 << " | SKIP: Base address not associated with local variable\n");
2283 continue;
2284 }
2285
2286 DIAssignID *ID =
2287 cast_or_null<DIAssignID>(I.getMetadata(LLVMContext::MD_DIAssignID));
2288 if (!ID) {
2289 ID = DIAssignID::getDistinct(Ctx);
2290 I.setMetadata(LLVMContext::MD_DIAssignID, ID);
2291 }
2292
2293 for (const VarRecord &R : LocalIt->second)
2294 emitDbgAssign(*Info, ValueComponent, DestComponent, I, R, DIB);
2295 }
2296 }
2297}
2298
2299bool AssignmentTrackingPass::runOnFunction(Function &F) {
2300 // No value in assignment tracking without optimisations.
2301 if (F.hasFnAttribute(Attribute::OptimizeNone))
2302 return /*Changed*/ false;
2303
2304 bool Changed = false;
2305 auto *DL = &F.getDataLayout();
2306 // Collect a map of {backing storage : dbg.declares} (currently "backing
2307 // storage" is limited to Allocas). We'll use this to find dbg.declares to
2308 // delete after running `trackAssignments`.
2310 // Create another similar map of {storage : variables} that we'll pass to
2311 // trackAssignments.
2312 StorageToVarsMap Vars;
2313 auto ProcessDeclare = [&](DbgVariableRecord &Declare) {
2314 // FIXME: trackAssignments doesn't let you specify any modifiers to the
2315 // variable (e.g. fragment) or location (e.g. offset), so we have to
2316 // leave dbg.declares with non-empty expressions in place.
2317 if (Declare.getExpression()->getNumElements() != 0)
2318 return;
2319 if (!Declare.getAddress())
2320 return;
2321 if (AllocaInst *Alloca =
2322 dyn_cast<AllocaInst>(Declare.getAddress()->stripPointerCasts())) {
2323 // FIXME: Skip VLAs for now (let these variables use dbg.declares).
2324 if (!Alloca->isStaticAlloca())
2325 return;
2326 // Similarly, skip scalable vectors (use dbg.declares instead).
2327 if (auto Sz = Alloca->getAllocationSize(*DL); Sz && Sz->isScalable())
2328 return;
2329 DVRDeclares[Alloca].insert(&Declare);
2330 Vars[Alloca].insert(VarRecord(&Declare));
2331 }
2332 };
2333 for (auto &BB : F) {
2334 for (auto &I : BB) {
2335 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
2336 if (DVR.isDbgDeclare())
2337 ProcessDeclare(DVR);
2338 }
2339 }
2340 }
2341
2342 // FIXME: Locals can be backed by caller allocas (sret, byval).
2343 // Note: trackAssignments doesn't respect dbg.declare's IR positions (as it
2344 // doesn't "understand" dbg.declares). However, this doesn't appear to break
2345 // any rules given this description of dbg.declare from
2346 // llvm/docs/SourceLevelDebugging.md:
2347 //
2348 // It is not control-dependent, meaning that if a call to llvm.dbg.declare
2349 // exists and has a valid location argument, that address is considered to
2350 // be the true home of the variable across its entire lifetime.
2351 trackAssignments(F.begin(), F.end(), Vars, *DL);
2352
2353 // Delete dbg.declares for variables now tracked with assignment tracking.
2354 for (auto &[Insts, Declares] : DVRDeclares) {
2356 for (auto *Declare : Declares) {
2357 // Assert that the alloca that Declare uses is now linked to a dbg.assign
2358 // describing the same variable (i.e. check that this dbg.declare has
2359 // been replaced by a dbg.assign). Use DebugVariableAggregate to Discard
2360 // the fragment part because trackAssignments may alter the
2361 // fragment. e.g. if the alloca is smaller than the variable, then
2362 // trackAssignments will create an alloca-sized fragment for the
2363 // dbg.assign.
2364 assert(llvm::any_of(Markers, [Declare](auto *Assign) {
2365 return DebugVariableAggregate(Assign) ==
2366 DebugVariableAggregate(Declare);
2367 }));
2368 // Delete Declare because the variable location is now tracked using
2369 // assignment tracking.
2370 Declare->eraseFromParent();
2371 Changed = true;
2372 }
2373 };
2374 return Changed;
2375}
2376
2378 "debug-info-assignment-tracking";
2379
2383 ConstantInt::get(Type::getInt1Ty(M.getContext()), 1)));
2384}
2385
2387 Metadata *Value = M.getModuleFlag(AssignmentTrackingModuleFlag);
2388 return Value && !cast<ConstantAsMetadata>(Value)->getValue()->isNullValue();
2389}
2390
2394
2397 if (!runOnFunction(F))
2398 return PreservedAnalyses::all();
2399
2400 // Record that this module uses assignment tracking. It doesn't matter that
2401 // some functions in the module may not use it - the debug info in those
2402 // functions will still be handled properly.
2403 setAssignmentTrackingModuleFlag(*F.getParent());
2404
2405 // Q: Can we return a less conservative set than just CFGAnalyses? Can we
2406 // return PreservedAnalyses::all()?
2409 return PA;
2410}
2411
2414 bool Changed = false;
2415 for (auto &F : M)
2416 Changed |= runOnFunction(F);
2417
2418 if (!Changed)
2419 return PreservedAnalyses::all();
2420
2421 // Record that this module uses assignment tracking.
2423
2424 // Q: Can we return a less conservative set than just CFGAnalyses? Can we
2425 // return PreservedAnalyses::all()?
2428 return PA;
2429}
2430
2431#undef DEBUG_TYPE
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned uint64_t
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static DISubprogram * getSubprogram(bool IsDistinct, Ts &&...Args)
static DIImportedEntity * createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope *Context, Metadata *NS, DIFile *File, unsigned Line, StringRef Name, DINodeArray Elements, SmallVectorImpl< TrackingMDNodeRef > &ImportedModules)
DXIL Finalize Linkage
dxil translate DXIL Translate Metadata
static void setAssignmentTrackingModuleFlag(Module &M)
static DISubprogram::DISPFlags pack_into_DISPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized)
static void findDbgIntrinsics(Value *V, SmallVectorImpl< DbgVariableRecord * > &DbgVariableRecords)
static Metadata * stripLoopMDLoc(const SmallPtrSetImpl< Metadata * > &AllDILocation, const SmallPtrSetImpl< Metadata * > &DIReachable, Metadata *MD)
static llvm::DIFile::ChecksumKind map_from_llvmChecksumKind(LLVMChecksumKind CSKind)
static MDNode * updateLoopMetadataDebugLocationsImpl(MDNode *OrigLoopID, function_ref< Metadata *(Metadata *)> Updater)
static MDNode * stripDebugLocFromLoopID(MDNode *N)
static const char * AssignmentTrackingModuleFlag
static DINode::DIFlags map_from_llvmDIFlags(LLVMDIFlags Flags)
static unsigned map_from_llvmDWARFsourcelanguage(LLVMDWARFSourceLanguage lang)
static void emitDbgAssign(AssignmentInfo Info, Value *Val, Value *Dest, Instruction &StoreLikeInst, const VarRecord &VarRec, DIBuilder &DIB)
Returns nullptr if the assignment shouldn't be attributed to this variable.
static LLVMDIFlags map_to_llvmDIFlags(DINode::DIFlags Flags)
static bool getAssignmentTrackingModuleFlag(const Module &M)
PointerUnion< DIExpression *, DIVariable * > unwrapExprVar(LLVMMetadataRef MD)
MD may be nullptr, a DIExpression or DIVariable.
static bool isAllDILocation(SmallPtrSetImpl< Metadata * > &Visited, SmallPtrSetImpl< Metadata * > &AllDILocation, const SmallPtrSetImpl< Metadata * > &DIReachable, Metadata *MD)
static Metadata * updateLoopMetadataDebugLocationsRecursive(Metadata *MetadataIn, function_ref< Metadata *(Metadata *)> Updater)
Recursively handle DILocations in followup metadata etc.
static bool isDILocationReachable(SmallPtrSetImpl< Metadata * > &Visited, SmallPtrSetImpl< Metadata * > &Reachable, Metadata *MD)
Return true if a node is a DILocation or if a DILocation is indirectly referenced by one of the node'...
DIT * unwrapDI(LLVMMetadataRef Ref)
static std::optional< AssignmentInfo > getAssignmentInfoImpl(const DataLayout &DL, const Value *StoreDest, TypeSize SizeInBits)
Collect constant properties (base, size, offset) of StoreDest.
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
IRTranslator LLVM IR MI
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file contains the declarations for metadata subclasses.
#define T
uint64_t IntrinsicInst * II
static constexpr StringLiteral Filename
#define P(N)
R600 Emit Clause Markers
Func MI getDebugLoc()))
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
FunctionLoweringInfo::StatepointRelocationRecord RecordType
#define LLVM_DEBUG(...)
Definition Debug.h:119
static uint32_t getFlags(const Symbol *Sym)
Definition TapiFile.cpp:26
Class for arbitrary precision integers.
Definition APInt.h:78
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:325
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:471
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
iterator end() const
Definition ArrayRef.h:130
iterator begin() const
Definition ArrayRef.h:129
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:548
List of ValueAsMetadata, to be used as an argument to a dbg.value intrinsic.
SmallVector< DbgVariableRecord * > getAllDbgVariableRecordUsers()
ArrayRef< DbgVariableRecord * > getRecords() const
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:226
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:186
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:794
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:828
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:71
static LocalAsMetadata * getIfExists(Value *Local)
Definition Metadata.h:578
Metadata node.
Definition Metadata.h:1081
LLVM_ABI void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1587
static LLVM_ABI void deleteTemporary(MDNode *N)
Deallocate a node created by getTemporary.
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1437
ArrayRef< MDOperand > operands() const
Definition Metadata.h:1435
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1579
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1443
bool isDistinct() const
Definition Metadata.h:1264
LLVMContext & getContext() const
Definition Metadata.h:1245
Tracking metadata reference owned by Metadata.
Definition Metadata.h:902
Metadata * get() const
Definition Metadata.h:931
Tuple of metadata.
Definition Metadata.h:1496
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a temporary node.
Definition Metadata.h:1545
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:68
@ Max
Takes the max of the two values, which are required to be integers.
Definition Module.h:150
A tuple of MDNodes.
Definition Metadata.h:1797
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:339
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:296
static LLVM_ABI ValueAsMetadata * getIfExists(Value *V)
Definition Metadata.cpp:533
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
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.
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:236
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:224
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:165
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:229
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:219
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:185
@ CSK_SHA1
Definition DebugInfo.h:224
@ CSK_SHA256
Definition DebugInfo.h:224
@ CSK_MD5
Definition DebugInfo.h:224
struct LLVMOpaqueValue * LLVMValueRef
Represents an individual value in LLVM IR.
Definition Types.h:75
int LLVMBool
Definition Types.h:28
struct LLVMOpaqueDbgRecord * LLVMDbgRecordRef
Definition Types.h:175
struct LLVMOpaqueContext * LLVMContextRef
The top-level container for all LLVM global data.
Definition Types.h:53
struct LLVMOpaqueBasicBlock * LLVMBasicBlockRef
Represents a basic block of instructions in LLVM IR.
Definition Types.h:82
struct LLVMOpaqueMetadata * LLVMMetadataRef
Represents an LLVM Metadata.
Definition Types.h:89
struct LLVMOpaqueModule * LLVMModuleRef
The top-level container for all other LLVM Intermediate Representation (IR) objects.
Definition Types.h:61
struct LLVMOpaqueDIBuilder * LLVMDIBuilderRef
Represents an LLVM debug info builder.
Definition Types.h:117
#define UINT64_MAX
Definition DataTypes.h:77
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Assignment Tracking (at).
Definition DebugInfo.h:180
LLVM_ABI void deleteAll(Function *F)
Remove all Assignment Tracking related intrinsics and metadata from F.
AssignmentInstRange getAssignmentInsts(DIAssignID *ID)
Return a range of instructions (typically just one) that have ID as an attachment.
Definition DebugInfo.h:190
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.
ArrayRef< Instruction * > AssignmentInstRange
A range of instructions.
Definition DebugInfo.h:185
SmallVector< DbgVariableRecord * > getDVRAssignmentMarkers(const Instruction *Inst)
Return a range of dbg_assign records for which Inst performs the assignment they encode.
Definition DebugInfo.h:209
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:282
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:913
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:720
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:316
@ Length
Definition DWP.cpp:577
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1755
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
@ Import
Import information from summary.
Definition IPO.h:39
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:649
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:1762
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:400
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:2035
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:395
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.
@ End
Run the machine verifier once, at the end of the pipeline.
Definition CodeGen.h:267
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:293
Helper struct for trackAssignments, below.
Definition DebugInfo.h:250
DILocation * DL
Definition DebugInfo.h:252
DILocalVariable * Var
Definition DebugInfo.h:251