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