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