LLVM 22.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#include <utility>
44
45using namespace llvm;
46using namespace llvm::at;
47using namespace llvm::dwarf;
48
50 // This function is hot. Check whether the value has any metadata to avoid a
51 // DenseMap lookup. This check is a bitfield datamember lookup.
52 if (!V->isUsedByMetadata())
53 return {};
55 if (!L)
56 return {};
57
59 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers())
60 if (DVR->getType() == DbgVariableRecord::LocationType::Declare)
61 Declares.push_back(DVR);
62
63 return Declares;
64}
65
67 // This function is hot. Check whether the value has any metadata to avoid a
68 // DenseMap lookup. This check is a bitfield datamember lookup.
69 if (!V->isUsedByMetadata())
70 return {};
72 if (!L)
73 return {};
74
76 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers())
77 if (DVR->isValueOfVariable())
78 Values.push_back(DVR);
79
80 return Values;
81}
82
83template <bool DbgAssignAndValuesOnly>
84static void
86 SmallVectorImpl<DbgVariableRecord *> &DbgVariableRecords) {
87 // This function is hot. Check whether the value has any metadata to avoid a
88 // DenseMap lookup.
89 if (!V->isUsedByMetadata())
90 return;
91
92 // TODO: If this value appears multiple times in a DIArgList, we should still
93 // only add the owning dbg.value once; use this set to track ArgListUsers.
94 // This behaviour can be removed when we can automatically remove duplicates.
95 // V will also appear twice in a dbg.assign if its used in the both the value
96 // and address components.
97 SmallPtrSet<DbgVariableRecord *, 4> EncounteredDbgVariableRecords;
98
99 /// Append users of MetadataAsValue(MD).
100 auto AppendUsers = [&EncounteredDbgVariableRecords,
101 &DbgVariableRecords](Metadata *MD) {
102 // Get DbgVariableRecords that use this as a single value.
104 for (DbgVariableRecord *DVR : L->getAllDbgVariableRecordUsers()) {
105 if (!DbgAssignAndValuesOnly || DVR->isDbgValue() || DVR->isDbgAssign())
106 if (EncounteredDbgVariableRecords.insert(DVR).second)
107 DbgVariableRecords.push_back(DVR);
108 }
109 }
110 };
111
112 if (auto *L = LocalAsMetadata::getIfExists(V)) {
113 AppendUsers(L);
114 for (Metadata *AL : L->getAllArgListUsers()) {
115 AppendUsers(AL);
116 DIArgList *DI = cast<DIArgList>(AL);
118 if (!DbgAssignAndValuesOnly || DVR->isDbgValue() || DVR->isDbgAssign())
119 if (EncounteredDbgVariableRecords.insert(DVR).second)
120 DbgVariableRecords.push_back(DVR);
121 }
122 }
123}
124
126 Value *V, SmallVectorImpl<DbgVariableRecord *> &DbgVariableRecords) {
127 findDbgIntrinsics</*DbgAssignAndValuesOnly=*/true>(V, DbgVariableRecords);
128}
129
131 Value *V, SmallVectorImpl<DbgVariableRecord *> &DbgVariableRecords) {
132 findDbgIntrinsics</*DbgAssignAndValuesOnly=*/false>(V, DbgVariableRecords);
133}
134
136 if (auto *LocalScope = dyn_cast_or_null<DILocalScope>(Scope))
137 return LocalScope->getSubprogram();
138 return nullptr;
139}
140
142 // Original dbg.declare must have a location.
143 const DebugLoc &DeclareLoc = DVR->getDebugLoc();
144 MDNode *Scope = DeclareLoc.getScope();
145 DILocation *InlinedAt = DeclareLoc.getInlinedAt();
146 // Because no machine insts can come from debug intrinsics, only the scope
147 // and inlinedAt is significant. Zero line numbers are used in case this
148 // DebugLoc leaks into any adjacent instructions. Produce an unknown location
149 // with the correct scope / inlinedAt fields.
150 return DILocation::get(DVR->getContext(), 0, 0, Scope, InlinedAt);
151}
152
153//===----------------------------------------------------------------------===//
154// DebugInfoFinder implementations.
155//===----------------------------------------------------------------------===//
156
158 CUs.clear();
159 SPs.clear();
160 GVs.clear();
161 TYs.clear();
162 Scopes.clear();
163 NodesSeen.clear();
164}
165
167 for (auto *CU : M.debug_compile_units())
168 processCompileUnit(CU);
169 for (auto &F : M.functions()) {
170 if (auto *SP = cast_or_null<DISubprogram>(F.getSubprogram()))
172 // There could be subprograms from inlined functions referenced from
173 // instructions only. Walk the function to find them.
174 for (const BasicBlock &BB : F)
175 for (const Instruction &I : BB)
177 }
178}
179
180void DebugInfoFinder::processCompileUnit(DICompileUnit *CU) {
181 if (!addCompileUnit(CU))
182 return;
183 for (auto *DIG : CU->getGlobalVariables()) {
184 if (!addGlobalVariable(DIG))
185 continue;
186 auto *GV = DIG->getVariable();
187 processScope(GV->getScope());
188 processType(GV->getType());
189 }
190 for (auto *ET : CU->getEnumTypes())
191 processType(ET);
192 for (auto *RT : CU->getRetainedTypes())
193 if (auto *T = dyn_cast<DIType>(RT))
194 processType(T);
195 else
197 for (auto *Import : CU->getImportedEntities())
198 processImportedEntity(Import);
199}
200
202 const Instruction &I) {
203 if (auto *DVI = dyn_cast<DbgVariableIntrinsic>(&I))
204 processVariable(DVI->getVariable());
205
206 if (auto DbgLoc = I.getDebugLoc())
207 processLocation(M, DbgLoc.get());
208
209 for (const DbgRecord &DPR : I.getDbgRecordRange())
210 processDbgRecord(M, DPR);
211}
212
214 if (!Loc)
215 return;
216 processScope(Loc->getScope());
217 processLocation(M, Loc->getInlinedAt());
218}
219
222 processVariable(DVR->getVariable());
224}
225
226void DebugInfoFinder::processType(DIType *DT) {
227 if (!addType(DT))
228 return;
229 processScope(DT->getScope());
230 if (auto *ST = dyn_cast<DISubroutineType>(DT)) {
231 for (DIType *Ref : ST->getTypeArray())
232 processType(Ref);
233 return;
234 }
235 if (auto *DCT = dyn_cast<DICompositeType>(DT)) {
236 processType(DCT->getBaseType());
237 for (Metadata *D : DCT->getElements()) {
238 if (auto *T = dyn_cast<DIType>(D))
239 processType(T);
240 else if (auto *SP = dyn_cast<DISubprogram>(D))
242 }
243 return;
244 }
245 if (auto *DDT = dyn_cast<DIDerivedType>(DT)) {
246 processType(DDT->getBaseType());
247 }
248}
249
250void DebugInfoFinder::processImportedEntity(DIImportedEntity *Import) {
251 auto *Entity = Import->getEntity();
252 if (auto *T = dyn_cast<DIType>(Entity))
253 processType(T);
254 else if (auto *SP = dyn_cast<DISubprogram>(Entity))
256 else if (auto *NS = dyn_cast<DINamespace>(Entity))
257 processScope(NS->getScope());
258 else if (auto *M = dyn_cast<DIModule>(Entity))
259 processScope(M->getScope());
260}
261
262void DebugInfoFinder::processScope(DIScope *Scope) {
263 if (!Scope)
264 return;
265 if (auto *Ty = dyn_cast<DIType>(Scope)) {
266 processType(Ty);
267 return;
268 }
269 if (auto *CU = dyn_cast<DICompileUnit>(Scope)) {
270 addCompileUnit(CU);
271 return;
272 }
273 if (auto *SP = dyn_cast<DISubprogram>(Scope)) {
275 return;
276 }
277 if (!addScope(Scope))
278 return;
279 if (auto *LB = dyn_cast<DILexicalBlockBase>(Scope)) {
280 processScope(LB->getScope());
281 } else if (auto *NS = dyn_cast<DINamespace>(Scope)) {
282 processScope(NS->getScope());
283 } else if (auto *M = dyn_cast<DIModule>(Scope)) {
284 processScope(M->getScope());
285 }
286}
287
289 if (!addSubprogram(SP))
290 return;
291 processScope(SP->getScope());
292 // Some of the users, e.g. CloneFunctionInto / CloneModule, need to set up a
293 // ValueMap containing identity mappings for all of the DICompileUnit's, not
294 // just DISubprogram's, referenced from anywhere within the Function being
295 // cloned prior to calling MapMetadata / RemapInstruction to avoid their
296 // duplication later as DICompileUnit's are also directly referenced by
297 // llvm.dbg.cu list. Thefore we need to collect DICompileUnit's here as well.
298 // Also, DICompileUnit's may reference DISubprogram's too and therefore need
299 // to be at least looked through.
300 processCompileUnit(SP->getUnit());
301 processType(SP->getType());
302 for (auto *Element : SP->getTemplateParams()) {
303 if (auto *TType = dyn_cast<DITemplateTypeParameter>(Element)) {
304 processType(TType->getType());
305 } else if (auto *TVal = dyn_cast<DITemplateValueParameter>(Element)) {
306 processType(TVal->getType());
307 }
308 }
309
310 for (auto *N : SP->getRetainedNodes()) {
311 if (auto *Var = dyn_cast_or_null<DILocalVariable>(N))
312 processVariable(Var);
314 processImportedEntity(Import);
315 }
316}
317
319 if (!NodesSeen.insert(DV).second)
320 return;
321 processScope(DV->getScope());
322 processType(DV->getType());
323}
324
325bool DebugInfoFinder::addType(DIType *DT) {
326 if (!DT)
327 return false;
328
329 if (!NodesSeen.insert(DT).second)
330 return false;
331
332 TYs.push_back(DT);
333 return true;
334}
335
336bool DebugInfoFinder::addCompileUnit(DICompileUnit *CU) {
337 if (!CU)
338 return false;
339 if (!NodesSeen.insert(CU).second)
340 return false;
341
342 CUs.push_back(CU);
343 return true;
344}
345
346bool DebugInfoFinder::addGlobalVariable(DIGlobalVariableExpression *DIG) {
347 if (!NodesSeen.insert(DIG).second)
348 return false;
349
350 GVs.push_back(DIG);
351 return true;
352}
353
354bool DebugInfoFinder::addSubprogram(DISubprogram *SP) {
355 if (!SP)
356 return false;
357
358 if (!NodesSeen.insert(SP).second)
359 return false;
360
361 SPs.push_back(SP);
362 return true;
363}
364
365bool DebugInfoFinder::addScope(DIScope *Scope) {
366 if (!Scope)
367 return false;
368 // FIXME: Ocaml binding generates a scope with no content, we treat it
369 // as null for now.
370 if (Scope->getNumOperands() == 0)
371 return false;
372 if (!NodesSeen.insert(Scope).second)
373 return false;
374 Scopes.push_back(Scope);
375 return true;
376}
377
379 MDNode *OrigLoopID, function_ref<Metadata *(Metadata *)> Updater) {
380 assert(OrigLoopID && OrigLoopID->getNumOperands() > 0 &&
381 "Loop ID needs at least one operand");
382 assert(OrigLoopID && OrigLoopID->getOperand(0).get() == OrigLoopID &&
383 "Loop ID should refer to itself");
384
385 // Save space for the self-referential LoopID.
386 SmallVector<Metadata *, 4> MDs = {nullptr};
387
388 for (unsigned i = 1; i < OrigLoopID->getNumOperands(); ++i) {
389 Metadata *MD = OrigLoopID->getOperand(i);
390 if (!MD)
391 MDs.push_back(nullptr);
392 else if (Metadata *NewMD = Updater(MD))
393 MDs.push_back(NewMD);
394 }
395
396 MDNode *NewLoopID = MDNode::getDistinct(OrigLoopID->getContext(), MDs);
397 // Insert the self-referential LoopID.
398 NewLoopID->replaceOperandWith(0, NewLoopID);
399 return NewLoopID;
400}
401
403 Instruction &I, function_ref<Metadata *(Metadata *)> Updater) {
404 MDNode *OrigLoopID = I.getMetadata(LLVMContext::MD_loop);
405 if (!OrigLoopID)
406 return;
407 MDNode *NewLoopID = updateLoopMetadataDebugLocationsImpl(OrigLoopID, Updater);
408 I.setMetadata(LLVMContext::MD_loop, NewLoopID);
409}
410
411/// Return true if a node is a DILocation or if a DILocation is
412/// indirectly referenced by one of the node's children.
415 Metadata *MD) {
417 if (!N)
418 return false;
419 if (isa<DILocation>(N) || Reachable.count(N))
420 return true;
421 if (!Visited.insert(N).second)
422 return false;
423 for (auto &OpIt : N->operands()) {
424 Metadata *Op = OpIt.get();
425 if (isDILocationReachable(Visited, Reachable, Op)) {
426 // Don't return just yet as we want to visit all MD's children to
427 // initialize DILocationReachable in stripDebugLocFromLoopID
428 Reachable.insert(N);
429 }
430 }
431 return Reachable.count(N);
432}
433
435 SmallPtrSetImpl<Metadata *> &AllDILocation,
436 const SmallPtrSetImpl<Metadata *> &DIReachable,
437 Metadata *MD) {
439 if (!N)
440 return false;
441 if (isa<DILocation>(N) || AllDILocation.count(N))
442 return true;
443 if (!DIReachable.count(N))
444 return false;
445 if (!Visited.insert(N).second)
446 return false;
447 for (auto &OpIt : N->operands()) {
448 Metadata *Op = OpIt.get();
449 if (Op == MD)
450 continue;
451 if (!isAllDILocation(Visited, AllDILocation, DIReachable, Op)) {
452 return false;
453 }
454 }
455 AllDILocation.insert(N);
456 return true;
457}
458
459static Metadata *
461 const SmallPtrSetImpl<Metadata *> &DIReachable, Metadata *MD) {
462 if (isa<DILocation>(MD) || AllDILocation.count(MD))
463 return nullptr;
464
465 if (!DIReachable.count(MD))
466 return MD;
467
469 if (!N)
470 return MD;
471
473 bool HasSelfRef = false;
474 for (unsigned i = 0; i < N->getNumOperands(); ++i) {
475 Metadata *A = N->getOperand(i);
476 if (!A) {
477 Args.push_back(nullptr);
478 } else if (A == MD) {
479 assert(i == 0 && "expected i==0 for self-reference");
480 HasSelfRef = true;
481 Args.push_back(nullptr);
482 } else if (Metadata *NewArg =
483 stripLoopMDLoc(AllDILocation, DIReachable, A)) {
484 Args.push_back(NewArg);
485 }
486 }
487 if (Args.empty() || (HasSelfRef && Args.size() == 1))
488 return nullptr;
489
490 MDNode *NewMD = N->isDistinct() ? MDNode::getDistinct(N->getContext(), Args)
491 : MDNode::get(N->getContext(), Args);
492 if (HasSelfRef)
493 NewMD->replaceOperandWith(0, NewMD);
494 return NewMD;
495}
496
498 assert(!N->operands().empty() && "Missing self reference?");
499 SmallPtrSet<Metadata *, 8> Visited, DILocationReachable, AllDILocation;
500 // If we already visited N, there is nothing to do.
501 if (!Visited.insert(N).second)
502 return N;
503
504 // If there is no debug location, we do not have to rewrite this
505 // MDNode. This loop also initializes DILocationReachable, later
506 // needed by updateLoopMetadataDebugLocationsImpl; the use of
507 // count_if avoids an early exit.
508 if (!llvm::count_if(llvm::drop_begin(N->operands()),
509 [&Visited, &DILocationReachable](const MDOperand &Op) {
510 return isDILocationReachable(
511 Visited, DILocationReachable, Op.get());
512 }))
513 return N;
514
515 Visited.clear();
516 // If there is only the debug location without any actual loop metadata, we
517 // can remove the metadata.
518 if (llvm::all_of(llvm::drop_begin(N->operands()),
519 [&Visited, &AllDILocation,
520 &DILocationReachable](const MDOperand &Op) {
521 return isAllDILocation(Visited, AllDILocation,
522 DILocationReachable, Op.get());
523 }))
524 return nullptr;
525
527 N, [&AllDILocation, &DILocationReachable](Metadata *MD) -> Metadata * {
528 return stripLoopMDLoc(AllDILocation, DILocationReachable, MD);
529 });
530}
531
533 bool Changed = false;
534 if (F.hasMetadata(LLVMContext::MD_dbg)) {
535 Changed = true;
536 F.setSubprogram(nullptr);
537 }
538
540 for (BasicBlock &BB : F) {
542 if (I.getDebugLoc()) {
543 Changed = true;
544 I.setDebugLoc(DebugLoc());
545 }
546 if (auto *LoopID = I.getMetadata(LLVMContext::MD_loop)) {
547 auto *NewLoopID = LoopIDsMap.lookup(LoopID);
548 if (!NewLoopID)
549 NewLoopID = LoopIDsMap[LoopID] = stripDebugLocFromLoopID(LoopID);
550 if (NewLoopID != LoopID)
551 I.setMetadata(LLVMContext::MD_loop, NewLoopID);
552 }
553 // Strip other attachments that are or use debug info.
554 if (I.hasMetadataOtherThanDebugLoc()) {
555 // Heapallocsites point into the DIType system.
556 I.setMetadata("heapallocsite", nullptr);
557 // DIAssignID are debug info metadata primitives.
558 I.setMetadata(LLVMContext::MD_DIAssignID, nullptr);
559 }
560 I.dropDbgRecords();
561 }
562 }
563 return Changed;
564}
565
567 llvm::TimeTraceScope timeScope("Strip debug info");
568 bool Changed = false;
569
570 for (NamedMDNode &NMD : llvm::make_early_inc_range(M.named_metadata())) {
571 // We're stripping debug info, and without them, coverage information
572 // doesn't quite make sense.
573 if (NMD.getName().starts_with("llvm.dbg.") ||
574 NMD.getName() == "llvm.gcov") {
575 NMD.eraseFromParent();
576 Changed = true;
577 }
578 }
579
580 for (Function &F : M)
582
583 for (auto &GV : M.globals()) {
584 Changed |= GV.eraseMetadata(LLVMContext::MD_dbg);
585 }
586
587 if (GVMaterializer *Materializer = M.getMaterializer())
588 Materializer->setStripDebugInfo();
589
590 return Changed;
591}
592
593namespace {
594
595/// Helper class to downgrade -g metadata to -gline-tables-only metadata.
596class DebugTypeInfoRemoval {
598
599public:
600 /// The (void)() type.
601 MDNode *EmptySubroutineType;
602
603private:
604 /// Remember what linkage name we originally had before stripping. If we end
605 /// up making two subprograms identical who originally had different linkage
606 /// names, then we need to make one of them distinct, to avoid them getting
607 /// uniqued. Maps the new node to the old linkage name.
609
610 // TODO: Remember the distinct subprogram we created for a given linkage name,
611 // so that we can continue to unique whenever possible. Map <newly created
612 // node, old linkage name> to the first (possibly distinct) mdsubprogram
613 // created for that combination. This is not strictly needed for correctness,
614 // but can cut down on the number of MDNodes and let us diff cleanly with the
615 // output of -gline-tables-only.
616
617public:
618 DebugTypeInfoRemoval(LLVMContext &C)
619 : EmptySubroutineType(DISubroutineType::get(C, DINode::FlagZero, 0,
620 MDNode::get(C, {}))) {}
621
622 Metadata *map(Metadata *M) {
623 if (!M)
624 return nullptr;
625 auto Replacement = Replacements.find(M);
626 if (Replacement != Replacements.end())
627 return Replacement->second;
628
629 return M;
630 }
631 MDNode *mapNode(Metadata *N) { return dyn_cast_or_null<MDNode>(map(N)); }
632
633 /// Recursively remap N and all its referenced children. Does a DF post-order
634 /// traversal, so as to remap bottoms up.
635 void traverseAndRemap(MDNode *N) { traverse(N); }
636
637private:
638 // Create a new DISubprogram, to replace the one given.
639 DISubprogram *getReplacementSubprogram(DISubprogram *MDS) {
640 auto *FileAndScope = cast_or_null<DIFile>(map(MDS->getFile()));
641 StringRef LinkageName = MDS->getName().empty() ? MDS->getLinkageName() : "";
642 DISubprogram *Declaration = nullptr;
643 auto *Type = cast_or_null<DISubroutineType>(map(MDS->getType()));
644 DIType *ContainingType =
645 cast_or_null<DIType>(map(MDS->getContainingType()));
646 auto *Unit = cast_or_null<DICompileUnit>(map(MDS->getUnit()));
647 auto Variables = nullptr;
648 auto TemplateParams = nullptr;
649
650 // Make a distinct DISubprogram, for situations that warrent it.
651 auto distinctMDSubprogram = [&]() {
652 return DISubprogram::getDistinct(
653 MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
654 FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(),
655 ContainingType, MDS->getVirtualIndex(), MDS->getThisAdjustment(),
656 MDS->getFlags(), MDS->getSPFlags(), Unit, TemplateParams, Declaration,
657 Variables);
658 };
659
660 if (MDS->isDistinct())
661 return distinctMDSubprogram();
662
663 auto *NewMDS = DISubprogram::get(
664 MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
665 FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(), ContainingType,
666 MDS->getVirtualIndex(), MDS->getThisAdjustment(), MDS->getFlags(),
667 MDS->getSPFlags(), Unit, TemplateParams, Declaration, Variables);
668
669 StringRef OldLinkageName = MDS->getLinkageName();
670
671 // See if we need to make a distinct one.
672 auto OrigLinkage = NewToLinkageName.find(NewMDS);
673 if (OrigLinkage != NewToLinkageName.end()) {
674 if (OrigLinkage->second == OldLinkageName)
675 // We're good.
676 return NewMDS;
677
678 // Otherwise, need to make a distinct one.
679 // TODO: Query the map to see if we already have one.
680 return distinctMDSubprogram();
681 }
682
683 NewToLinkageName.insert({NewMDS, MDS->getLinkageName()});
684 return NewMDS;
685 }
686
687 /// Create a new compile unit, to replace the one given
688 DICompileUnit *getReplacementCU(DICompileUnit *CU) {
689 // Drop skeleton CUs.
690 if (CU->getDWOId())
691 return nullptr;
692
693 auto *File = cast_or_null<DIFile>(map(CU->getFile()));
694 MDTuple *EnumTypes = nullptr;
695 MDTuple *RetainedTypes = nullptr;
696 MDTuple *GlobalVariables = nullptr;
697 MDTuple *ImportedEntities = nullptr;
698 return DICompileUnit::getDistinct(
699 CU->getContext(), CU->getSourceLanguage(), File, CU->getProducer(),
700 CU->isOptimized(), CU->getFlags(), CU->getRuntimeVersion(),
702 RetainedTypes, GlobalVariables, ImportedEntities, CU->getMacros(),
703 CU->getDWOId(), CU->getSplitDebugInlining(),
705 CU->getRangesBaseAddress(), CU->getSysRoot(), CU->getSDK());
706 }
707
708 DILocation *getReplacementMDLocation(DILocation *MLD) {
709 auto *Scope = map(MLD->getScope());
710 auto *InlinedAt = map(MLD->getInlinedAt());
711 if (MLD->isDistinct())
712 return DILocation::getDistinct(MLD->getContext(), MLD->getLine(),
713 MLD->getColumn(), Scope, InlinedAt);
714 return DILocation::get(MLD->getContext(), MLD->getLine(), MLD->getColumn(),
715 Scope, InlinedAt);
716 }
717
718 /// Create a new generic MDNode, to replace the one given
719 MDNode *getReplacementMDNode(MDNode *N) {
721 Ops.reserve(N->getNumOperands());
722 for (auto &I : N->operands())
723 if (I)
724 Ops.push_back(map(I));
725 auto *Ret = MDNode::get(N->getContext(), Ops);
726 return Ret;
727 }
728
729 /// Attempt to re-map N to a newly created node.
730 void remap(MDNode *N) {
731 if (Replacements.count(N))
732 return;
733
734 auto doRemap = [&](MDNode *N) -> MDNode * {
735 if (!N)
736 return nullptr;
737 if (auto *MDSub = dyn_cast<DISubprogram>(N)) {
738 remap(MDSub->getUnit());
739 return getReplacementSubprogram(MDSub);
740 }
742 return EmptySubroutineType;
743 if (auto *CU = dyn_cast<DICompileUnit>(N))
744 return getReplacementCU(CU);
745 if (isa<DIFile>(N))
746 return N;
747 if (auto *MDLB = dyn_cast<DILexicalBlockBase>(N))
748 // Remap to our referenced scope (recursively).
749 return mapNode(MDLB->getScope());
750 if (auto *MLD = dyn_cast<DILocation>(N))
751 return getReplacementMDLocation(MLD);
752
753 // Otherwise, if we see these, just drop them now. Not strictly necessary,
754 // but this speeds things up a little.
755 if (isa<DINode>(N))
756 return nullptr;
757
758 return getReplacementMDNode(N);
759 };
760 // Separate recursive doRemap and operator [] into 2 lines to avoid
761 // out-of-order evaluations since both of them can access the same memory
762 // location in map Replacements.
763 auto Value = doRemap(N);
764 Replacements[N] = Value;
765 }
766
767 /// Do the remapping traversal.
768 void traverse(MDNode *);
769};
770
771} // end anonymous namespace
772
773void DebugTypeInfoRemoval::traverse(MDNode *N) {
774 if (!N || Replacements.count(N))
775 return;
776
777 // To avoid cycles, as well as for efficiency sake, we will sometimes prune
778 // parts of the graph.
779 auto prune = [](MDNode *Parent, MDNode *Child) {
780 if (auto *MDS = dyn_cast<DISubprogram>(Parent))
781 return Child == MDS->getRetainedNodes().get();
782 return false;
783 };
784
786 DenseSet<MDNode *> Opened;
787
788 // Visit each node starting at N in post order, and map them.
789 ToVisit.push_back(N);
790 while (!ToVisit.empty()) {
791 auto *N = ToVisit.back();
792 if (!Opened.insert(N).second) {
793 // Close it.
794 remap(N);
795 ToVisit.pop_back();
796 continue;
797 }
798 for (auto &I : N->operands())
799 if (auto *MDN = dyn_cast_or_null<MDNode>(I))
800 if (!Opened.count(MDN) && !Replacements.count(MDN) && !prune(N, MDN) &&
801 !isa<DICompileUnit>(MDN))
802 ToVisit.push_back(MDN);
803 }
804}
805
807 bool Changed = false;
808
809 // Delete non-CU debug info named metadata nodes.
810 for (auto NMI = M.named_metadata_begin(), NME = M.named_metadata_end();
811 NMI != NME;) {
812 NamedMDNode *NMD = &*NMI;
813 ++NMI;
814 // Specifically keep dbg.cu around.
815 if (NMD->getName() == "llvm.dbg.cu")
816 continue;
817 }
818
819 // Drop all dbg attachments from global variables.
820 for (auto &GV : M.globals())
821 GV.eraseMetadata(LLVMContext::MD_dbg);
822
823 DebugTypeInfoRemoval Mapper(M.getContext());
824 auto remap = [&](MDNode *Node) -> MDNode * {
825 if (!Node)
826 return nullptr;
827 Mapper.traverseAndRemap(Node);
828 auto *NewNode = Mapper.mapNode(Node);
829 Changed |= Node != NewNode;
830 Node = NewNode;
831 return NewNode;
832 };
833
834 // Rewrite the DebugLocs to be equivalent to what
835 // -gline-tables-only would have created.
836 for (auto &F : M) {
837 if (auto *SP = F.getSubprogram()) {
838 Mapper.traverseAndRemap(SP);
839 auto *NewSP = cast<DISubprogram>(Mapper.mapNode(SP));
840 Changed |= SP != NewSP;
841 F.setSubprogram(NewSP);
842 }
843 for (auto &BB : F) {
844 for (auto &I : BB) {
845 auto remapDebugLoc = [&](const DebugLoc &DL) -> DebugLoc {
846 auto *Scope = DL.getScope();
847 MDNode *InlinedAt = DL.getInlinedAt();
848 Scope = remap(Scope);
849 InlinedAt = remap(InlinedAt);
850 return DILocation::get(M.getContext(), DL.getLine(), DL.getCol(),
851 Scope, InlinedAt);
852 };
853
854 if (I.getDebugLoc() != DebugLoc())
855 I.setDebugLoc(remapDebugLoc(I.getDebugLoc()));
856
857 // Remap DILocations in llvm.loop attachments.
859 if (auto *Loc = dyn_cast_or_null<DILocation>(MD))
860 return remapDebugLoc(Loc).get();
861 return MD;
862 });
863
864 // Strip heapallocsite attachments, they point into the DIType system.
865 if (I.hasMetadataOtherThanDebugLoc())
866 I.setMetadata("heapallocsite", nullptr);
867
868 // Strip any DbgRecords attached.
869 I.dropDbgRecords();
870 }
871 }
872 }
873
874 // Create a new llvm.dbg.cu, which is equivalent to the one
875 // -gline-tables-only would have created.
876 for (auto &NMD : M.named_metadata()) {
878 for (MDNode *Op : NMD.operands())
879 Ops.push_back(remap(Op));
880
881 if (!Changed)
882 continue;
883
884 NMD.clearOperands();
885 for (auto *Op : Ops)
886 if (Op)
887 NMD.addOperand(Op);
888 }
889 return Changed;
890}
891
894 M.getModuleFlag("Debug Info Version")))
895 return Val->getZExtValue();
896 return 0;
897}
898
902
904 ArrayRef<const Instruction *> SourceInstructions) {
905 // Replace all uses (and attachments) of all the DIAssignIDs
906 // on SourceInstructions with a single merged value.
907 assert(getFunction() && "Uninserted instruction merged");
908 // Collect up the DIAssignID tags.
910 for (const Instruction *I : SourceInstructions) {
911 if (auto *MD = I->getMetadata(LLVMContext::MD_DIAssignID))
913 assert(getFunction() == I->getFunction() &&
914 "Merging with instruction from another function not allowed");
915 }
916
917 // Add this instruction's DIAssignID too, if it has one.
918 if (auto *MD = getMetadata(LLVMContext::MD_DIAssignID))
920
921 if (IDs.empty())
922 return; // No DIAssignID tags to process.
923
924 DIAssignID *MergeID = IDs[0];
925 for (DIAssignID *AssignID : drop_begin(IDs)) {
926 if (AssignID != MergeID)
927 at::RAUW(AssignID, MergeID);
928 }
929 setMetadata(LLVMContext::MD_DIAssignID, MergeID);
930}
931
933
935 const DebugLoc &DL = getDebugLoc();
936 if (!DL) {
938 return;
939 }
940
941 // If this isn't a call, drop the location to allow a location from a
942 // preceding instruction to propagate.
943 bool MayLowerToCall = false;
944 if (isa<CallBase>(this)) {
945 auto *II = dyn_cast<IntrinsicInst>(this);
946 MayLowerToCall =
947 !II || IntrinsicInst::mayLowerToFunctionCall(II->getIntrinsicID());
948 }
949
950 if (!MayLowerToCall) {
952 return;
953 }
954
955 // Set a line 0 location for calls to preserve scope information in case
956 // inlining occurs.
958 if (SP)
959 // If a function scope is available, set it on the line 0 location. When
960 // hoisting a call to a predecessor block, using the function scope avoids
961 // making it look like the callee was reached earlier than it should be.
963 else
964 // The parent function has no scope. Go ahead and drop the location. If
965 // the parent function is inlined, and the callee has a subprogram, the
966 // inliner will attach a location to the call.
967 //
968 // One alternative is to set a line 0 location with the existing scope and
969 // inlinedAt info. The location might be sensitive to when inlining occurs.
971}
972
973//===----------------------------------------------------------------------===//
974// LLVM C API implementations.
975//===----------------------------------------------------------------------===//
976
978 switch (lang) {
979#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \
980 case LLVMDWARFSourceLanguage##NAME: \
981 return ID;
982#include "llvm/BinaryFormat/Dwarf.def"
983#undef HANDLE_DW_LANG
984 }
985 llvm_unreachable("Unhandled Tag");
986}
987
988template <typename DIT> DIT *unwrapDI(LLVMMetadataRef Ref) {
989 return (DIT *)(Ref ? unwrap<MDNode>(Ref) : nullptr);
990}
991
993 return static_cast<DINode::DIFlags>(Flags);
994}
995
997 return static_cast<LLVMDIFlags>(Flags);
998}
999
1001pack_into_DISPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized) {
1002 return DISubprogram::toSPFlags(IsLocalToUnit, IsDefinition, IsOptimized);
1003}
1004
1007}
1008
1012
1016
1020
1024
1026 delete unwrap(Builder);
1027}
1028
1030 unwrap(Builder)->finalize();
1031}
1032
1034 LLVMMetadataRef subprogram) {
1035 unwrap(Builder)->finalizeSubprogram(unwrapDI<DISubprogram>(subprogram));
1036}
1037
1040 LLVMMetadataRef FileRef, const char *Producer, size_t ProducerLen,
1041 LLVMBool isOptimized, const char *Flags, size_t FlagsLen,
1042 unsigned RuntimeVer, const char *SplitName, size_t SplitNameLen,
1043 LLVMDWARFEmissionKind Kind, unsigned DWOId, LLVMBool SplitDebugInlining,
1044 LLVMBool DebugInfoForProfiling, const char *SysRoot, size_t SysRootLen,
1045 const char *SDK, size_t SDKLen) {
1046 auto File = unwrapDI<DIFile>(FileRef);
1047
1048 return wrap(unwrap(Builder)->createCompileUnit(
1050 StringRef(Producer, ProducerLen), isOptimized, StringRef(Flags, FlagsLen),
1051 RuntimeVer, StringRef(SplitName, SplitNameLen),
1052 static_cast<DICompileUnit::DebugEmissionKind>(Kind), DWOId,
1053 SplitDebugInlining, DebugInfoForProfiling,
1055 StringRef(SysRoot, SysRootLen), StringRef(SDK, SDKLen)));
1056}
1057
1059LLVMDIBuilderCreateFile(LLVMDIBuilderRef Builder, const char *Filename,
1060 size_t FilenameLen, const char *Directory,
1061 size_t DirectoryLen) {
1062 return wrap(unwrap(Builder)->createFile(StringRef(Filename, FilenameLen),
1063 StringRef(Directory, DirectoryLen)));
1064}
1065
1068 const char *Name, size_t NameLen,
1069 const char *ConfigMacros, size_t ConfigMacrosLen,
1070 const char *IncludePath, size_t IncludePathLen,
1071 const char *APINotesFile, size_t APINotesFileLen) {
1072 return wrap(unwrap(Builder)->createModule(
1073 unwrapDI<DIScope>(ParentScope), StringRef(Name, NameLen),
1074 StringRef(ConfigMacros, ConfigMacrosLen),
1075 StringRef(IncludePath, IncludePathLen),
1076 StringRef(APINotesFile, APINotesFileLen)));
1077}
1078
1080 LLVMMetadataRef ParentScope,
1081 const char *Name, size_t NameLen,
1082 LLVMBool ExportSymbols) {
1083 return wrap(unwrap(Builder)->createNameSpace(
1084 unwrapDI<DIScope>(ParentScope), StringRef(Name, NameLen), ExportSymbols));
1085}
1086
1088 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1089 size_t NameLen, const char *LinkageName, size_t LinkageNameLen,
1090 LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1091 LLVMBool IsLocalToUnit, LLVMBool IsDefinition,
1092 unsigned ScopeLine, LLVMDIFlags Flags, LLVMBool IsOptimized) {
1093 return wrap(unwrap(Builder)->createFunction(
1094 unwrapDI<DIScope>(Scope), {Name, NameLen}, {LinkageName, LinkageNameLen},
1095 unwrapDI<DIFile>(File), LineNo, unwrapDI<DISubroutineType>(Ty), ScopeLine,
1096 map_from_llvmDIFlags(Flags),
1097 pack_into_DISPFlags(IsLocalToUnit, IsDefinition, IsOptimized), nullptr,
1098 nullptr, nullptr));
1099}
1100
1101
1103 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope,
1104 LLVMMetadataRef File, unsigned Line, unsigned Col) {
1105 return wrap(unwrap(Builder)->createLexicalBlock(unwrapDI<DIScope>(Scope),
1106 unwrapDI<DIFile>(File),
1107 Line, Col));
1108}
1109
1112 LLVMMetadataRef Scope,
1113 LLVMMetadataRef File,
1114 unsigned Discriminator) {
1115 return wrap(unwrap(Builder)->createLexicalBlockFile(unwrapDI<DIScope>(Scope),
1116 unwrapDI<DIFile>(File),
1117 Discriminator));
1118}
1119
1122 LLVMMetadataRef Scope,
1123 LLVMMetadataRef NS,
1124 LLVMMetadataRef File,
1125 unsigned Line) {
1126 return wrap(unwrap(Builder)->createImportedModule(unwrapDI<DIScope>(Scope),
1128 unwrapDI<DIFile>(File),
1129 Line));
1130}
1131
1133 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope,
1134 LLVMMetadataRef ImportedEntity, LLVMMetadataRef File, unsigned Line,
1135 LLVMMetadataRef *Elements, unsigned NumElements) {
1136 auto Elts =
1137 (NumElements > 0)
1138 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1139 : nullptr;
1140 return wrap(unwrap(Builder)->createImportedModule(
1141 unwrapDI<DIScope>(Scope), unwrapDI<DIImportedEntity>(ImportedEntity),
1142 unwrapDI<DIFile>(File), Line, Elts));
1143}
1144
1147 LLVMMetadataRef File, unsigned Line, LLVMMetadataRef *Elements,
1148 unsigned NumElements) {
1149 auto Elts =
1150 (NumElements > 0)
1151 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1152 : nullptr;
1153 return wrap(unwrap(Builder)->createImportedModule(
1155 Line, Elts));
1156}
1157
1160 LLVMMetadataRef File, unsigned Line, const char *Name, size_t NameLen,
1161 LLVMMetadataRef *Elements, unsigned NumElements) {
1162 auto Elts =
1163 (NumElements > 0)
1164 ? unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements})
1165 : nullptr;
1166 return wrap(unwrap(Builder)->createImportedDeclaration(
1168 Line, {Name, NameLen}, Elts));
1169}
1170
1173 unsigned Column, LLVMMetadataRef Scope,
1174 LLVMMetadataRef InlinedAt) {
1175 return wrap(DILocation::get(*unwrap(Ctx), Line, Column, unwrap(Scope),
1176 unwrap(InlinedAt)));
1177}
1178
1180 return unwrapDI<DILocation>(Location)->getLine();
1181}
1182
1184 return unwrapDI<DILocation>(Location)->getColumn();
1185}
1186
1188 return wrap(unwrapDI<DILocation>(Location)->getScope());
1189}
1190
1192 return wrap(unwrapDI<DILocation>(Location)->getInlinedAt());
1193}
1194
1196 return wrap(unwrapDI<DIScope>(Scope)->getFile());
1197}
1198
1199const char *LLVMDIFileGetDirectory(LLVMMetadataRef File, unsigned *Len) {
1200 auto Dir = unwrapDI<DIFile>(File)->getDirectory();
1201 *Len = Dir.size();
1202 return Dir.data();
1203}
1204
1205const char *LLVMDIFileGetFilename(LLVMMetadataRef File, unsigned *Len) {
1206 auto Name = unwrapDI<DIFile>(File)->getFilename();
1207 *Len = Name.size();
1208 return Name.data();
1209}
1210
1211const char *LLVMDIFileGetSource(LLVMMetadataRef File, unsigned *Len) {
1212 if (auto Src = unwrapDI<DIFile>(File)->getSource()) {
1213 *Len = Src->size();
1214 return Src->data();
1215 }
1216 *Len = 0;
1217 return "";
1218}
1219
1221 LLVMMetadataRef ParentMacroFile,
1222 unsigned Line,
1224 const char *Name, size_t NameLen,
1225 const char *Value, size_t ValueLen) {
1226 return wrap(
1227 unwrap(Builder)->createMacro(unwrapDI<DIMacroFile>(ParentMacroFile), Line,
1228 static_cast<MacinfoRecordType>(RecordType),
1229 {Name, NameLen}, {Value, ValueLen}));
1230}
1231
1234 LLVMMetadataRef ParentMacroFile, unsigned Line,
1235 LLVMMetadataRef File) {
1236 return wrap(unwrap(Builder)->createTempMacroFile(
1237 unwrapDI<DIMacroFile>(ParentMacroFile), Line, unwrapDI<DIFile>(File)));
1238}
1239
1241 const char *Name, size_t NameLen,
1242 int64_t Value,
1243 LLVMBool IsUnsigned) {
1244 return wrap(unwrap(Builder)->createEnumerator({Name, NameLen}, Value,
1245 IsUnsigned != 0));
1246}
1247
1249 LLVMDIBuilderRef Builder, const char *Name, size_t NameLen,
1250 uint64_t SizeInBits, const uint64_t Words[], LLVMBool IsUnsigned) {
1251 uint64_t NumWords = (SizeInBits + 63) / 64;
1252 return wrap(unwrap(Builder)->createEnumerator(
1253 {Name, NameLen},
1254 APSInt(APInt(SizeInBits, ArrayRef(Words, NumWords)), IsUnsigned != 0)));
1255}
1256
1258 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1259 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1260 uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef *Elements,
1261 unsigned NumElements, LLVMMetadataRef ClassTy) {
1262auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1263 NumElements});
1264return wrap(unwrap(Builder)->createEnumerationType(
1265 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1266 LineNumber, SizeInBits, AlignInBits, Elts, unwrapDI<DIType>(ClassTy)));
1267}
1268
1270 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1271 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1272 uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef BaseTy) {
1273 return wrap(unwrap(Builder)->createSetType(
1274 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1275 LineNumber, SizeInBits, AlignInBits, unwrapDI<DIType>(BaseTy)));
1276}
1277
1279 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1280 size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t SizeInBits,
1281 uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef BaseTy,
1282 LLVMMetadataRef LowerBound, LLVMMetadataRef UpperBound,
1283 LLVMMetadataRef Stride, LLVMMetadataRef Bias) {
1284 return wrap(unwrap(Builder)->createSubrangeType(
1285 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, unwrapDI<DIScope>(Scope),
1286 SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1287 unwrapDI<DIType>(BaseTy), unwrap(LowerBound), unwrap(UpperBound),
1288 unwrap(Stride), unwrap(Bias)));
1289}
1290
1291/// MD may be nullptr, a DIExpression or DIVariable.
1293 if (!MD)
1294 return nullptr;
1295 MDNode *MDN = unwrapDI<MDNode>(MD);
1296 if (auto *E = dyn_cast<DIExpression>(MDN))
1297 return E;
1298 assert(isa<DIVariable>(MDN) && "Expected DIExpression or DIVariable");
1299 return cast<DIVariable>(MDN);
1300}
1301
1303 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1304 size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t Size,
1305 uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts,
1306 unsigned NumSubscripts, LLVMMetadataRef DataLocation,
1307 LLVMMetadataRef Associated, LLVMMetadataRef Allocated, LLVMMetadataRef Rank,
1308 LLVMMetadataRef BitStride) {
1309 auto Subs =
1310 unwrap(Builder)->getOrCreateArray({unwrap(Subscripts), NumSubscripts});
1311 return wrap(unwrap(Builder)->createArrayType(
1312 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1313 Size, AlignInBits, unwrapDI<DIType>(Ty), Subs,
1314 unwrapExprVar(DataLocation), unwrapExprVar(Associated),
1315 unwrapExprVar(Allocated), unwrapExprVar(Rank), unwrap(BitStride)));
1316}
1317
1319 LLVMMetadataRef *Elements, unsigned NumElements) {
1320 auto CT = unwrap<DICompositeType>(*T);
1321 auto Elts =
1322 unwrap(Builder)->getOrCreateArray({unwrap(Elements), NumElements});
1323 unwrap(Builder)->replaceArrays(CT, Elts);
1324}
1325
1327 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1328 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1329 uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags,
1330 LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang,
1331 const char *UniqueId, size_t UniqueIdLen) {
1332 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1333 NumElements});
1334 return wrap(unwrap(Builder)->createUnionType(
1335 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1336 LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1337 Elts, RunTimeLang, {UniqueId, UniqueIdLen}));
1338}
1339
1340
1343 uint32_t AlignInBits, LLVMMetadataRef Ty,
1344 LLVMMetadataRef *Subscripts,
1345 unsigned NumSubscripts) {
1346 auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts),
1347 NumSubscripts});
1348 return wrap(unwrap(Builder)->createArrayType(Size, AlignInBits,
1349 unwrapDI<DIType>(Ty), Subs));
1350}
1351
1354 uint32_t AlignInBits, LLVMMetadataRef Ty,
1355 LLVMMetadataRef *Subscripts,
1356 unsigned NumSubscripts) {
1357 auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts),
1358 NumSubscripts});
1359 return wrap(unwrap(Builder)->createVectorType(Size, AlignInBits,
1360 unwrapDI<DIType>(Ty), Subs));
1361}
1362
1365 size_t NameLen, uint64_t SizeInBits,
1366 LLVMDWARFTypeEncoding Encoding,
1367 LLVMDIFlags Flags) {
1368 return wrap(unwrap(Builder)->createBasicType({Name, NameLen},
1369 SizeInBits, Encoding,
1370 map_from_llvmDIFlags(Flags)));
1371}
1372
1374 LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeTy,
1375 uint64_t SizeInBits, uint32_t AlignInBits, unsigned AddressSpace,
1376 const char *Name, size_t NameLen) {
1377 return wrap(unwrap(Builder)->createPointerType(
1378 unwrapDI<DIType>(PointeeTy), SizeInBits, AlignInBits, AddressSpace,
1379 {Name, NameLen}));
1380}
1381
1383 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1384 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1385 uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags,
1386 LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements,
1387 unsigned NumElements, unsigned RunTimeLang, LLVMMetadataRef VTableHolder,
1388 const char *UniqueId, size_t UniqueIdLen) {
1389 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1390 NumElements});
1391 return wrap(unwrap(Builder)->createStructType(
1392 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1393 LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags),
1394 unwrapDI<DIType>(DerivedFrom), Elts, RunTimeLang,
1395 unwrapDI<DIType>(VTableHolder), {UniqueId, UniqueIdLen}));
1396}
1397
1399 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1400 size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits,
1401 uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags,
1402 LLVMMetadataRef Ty) {
1403 return wrap(unwrap(Builder)->createMemberType(unwrapDI<DIScope>(Scope),
1404 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo, SizeInBits, AlignInBits,
1405 OffsetInBits, map_from_llvmDIFlags(Flags), unwrapDI<DIType>(Ty)));
1406}
1407
1410 size_t NameLen) {
1411 return wrap(unwrap(Builder)->createUnspecifiedType({Name, NameLen}));
1412}
1413
1415 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1416 size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,
1417 LLVMMetadataRef Type, LLVMDIFlags Flags, LLVMValueRef ConstantVal,
1418 uint32_t AlignInBits) {
1419 return wrap(unwrap(Builder)->createStaticMemberType(
1420 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1421 LineNumber, unwrapDI<DIType>(Type), map_from_llvmDIFlags(Flags),
1422 unwrap<Constant>(ConstantVal), DW_TAG_member, AlignInBits));
1423}
1424
1427 const char *Name, size_t NameLen,
1428 LLVMMetadataRef File, unsigned LineNo,
1429 uint64_t SizeInBits, uint32_t AlignInBits,
1430 uint64_t OffsetInBits, LLVMDIFlags Flags,
1431 LLVMMetadataRef Ty, LLVMMetadataRef PropertyNode) {
1432 return wrap(unwrap(Builder)->createObjCIVar(
1433 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1434 SizeInBits, AlignInBits, OffsetInBits,
1436 unwrapDI<MDNode>(PropertyNode)));
1437}
1438
1441 const char *Name, size_t NameLen,
1442 LLVMMetadataRef File, unsigned LineNo,
1443 const char *GetterName, size_t GetterNameLen,
1444 const char *SetterName, size_t SetterNameLen,
1445 unsigned PropertyAttributes,
1446 LLVMMetadataRef Ty) {
1447 return wrap(unwrap(Builder)->createObjCProperty(
1448 {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1449 {GetterName, GetterNameLen}, {SetterName, SetterNameLen},
1450 PropertyAttributes, unwrapDI<DIType>(Ty)));
1451}
1452
1455 LLVMBool Implicit) {
1456 return wrap(unwrap(Builder)->createObjectPointerType(unwrapDI<DIType>(Type),
1457 Implicit));
1458}
1459
1462 const char *Name, size_t NameLen,
1463 LLVMMetadataRef File, unsigned LineNo,
1464 LLVMMetadataRef Scope, uint32_t AlignInBits) {
1465 return wrap(unwrap(Builder)->createTypedef(
1466 unwrapDI<DIType>(Type), {Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1467 unwrapDI<DIScope>(Scope), AlignInBits));
1468}
1469
1473 uint64_t BaseOffset, uint32_t VBPtrOffset,
1474 LLVMDIFlags Flags) {
1475 return wrap(unwrap(Builder)->createInheritance(
1477 BaseOffset, VBPtrOffset, map_from_llvmDIFlags(Flags)));
1478}
1479
1482 LLVMDIBuilderRef Builder, unsigned Tag, const char *Name,
1483 size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line,
1484 unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits,
1485 const char *UniqueIdentifier, size_t UniqueIdentifierLen) {
1486 return wrap(unwrap(Builder)->createForwardDecl(
1487 Tag, {Name, NameLen}, unwrapDI<DIScope>(Scope),
1488 unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits,
1489 AlignInBits, {UniqueIdentifier, UniqueIdentifierLen}));
1490}
1491
1494 LLVMDIBuilderRef Builder, unsigned Tag, const char *Name,
1495 size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line,
1496 unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits,
1497 LLVMDIFlags Flags, const char *UniqueIdentifier,
1498 size_t UniqueIdentifierLen) {
1499 return wrap(unwrap(Builder)->createReplaceableCompositeType(
1500 Tag, {Name, NameLen}, unwrapDI<DIScope>(Scope),
1501 unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits,
1502 AlignInBits, map_from_llvmDIFlags(Flags),
1503 {UniqueIdentifier, UniqueIdentifierLen}));
1504}
1505
1509 return wrap(unwrap(Builder)->createQualifiedType(Tag,
1511}
1512
1516 return wrap(unwrap(Builder)->createReferenceType(Tag,
1518}
1519
1522 return wrap(unwrap(Builder)->createNullPtrType());
1523}
1524
1527 LLVMMetadataRef PointeeType,
1528 LLVMMetadataRef ClassType,
1529 uint64_t SizeInBits,
1530 uint32_t AlignInBits,
1531 LLVMDIFlags Flags) {
1532 return wrap(unwrap(Builder)->createMemberPointerType(
1533 unwrapDI<DIType>(PointeeType),
1534 unwrapDI<DIType>(ClassType), AlignInBits, SizeInBits,
1535 map_from_llvmDIFlags(Flags)));
1536}
1537
1540 LLVMMetadataRef Scope,
1541 const char *Name, size_t NameLen,
1542 LLVMMetadataRef File, unsigned LineNumber,
1543 uint64_t SizeInBits,
1544 uint64_t OffsetInBits,
1545 uint64_t StorageOffsetInBits,
1547 return wrap(unwrap(Builder)->createBitFieldMemberType(
1548 unwrapDI<DIScope>(Scope), {Name, NameLen},
1549 unwrapDI<DIFile>(File), LineNumber,
1550 SizeInBits, OffsetInBits, StorageOffsetInBits,
1552}
1553
1555 LLVMMetadataRef Scope, const char *Name, size_t NameLen,
1556 LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits,
1557 uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags,
1558 LLVMMetadataRef DerivedFrom,
1559 LLVMMetadataRef *Elements, unsigned NumElements,
1560 LLVMMetadataRef VTableHolder, LLVMMetadataRef TemplateParamsNode,
1561 const char *UniqueIdentifier, size_t UniqueIdentifierLen) {
1562 auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements),
1563 NumElements});
1564 return wrap(unwrap(Builder)->createClassType(
1565 unwrapDI<DIScope>(Scope), {Name, NameLen}, unwrapDI<DIFile>(File),
1566 LineNumber, SizeInBits, AlignInBits, OffsetInBits,
1567 map_from_llvmDIFlags(Flags), unwrapDI<DIType>(DerivedFrom), Elts,
1568 /*RunTimeLang=*/0, unwrapDI<DIType>(VTableHolder),
1569 unwrapDI<MDNode>(TemplateParamsNode),
1570 {UniqueIdentifier, UniqueIdentifierLen}));
1571}
1572
1576 return wrap(unwrap(Builder)->createArtificialType(unwrapDI<DIType>(Type)));
1577}
1578
1580 return unwrapDI<DINode>(MD)->getTag();
1581}
1582
1583const char *LLVMDITypeGetName(LLVMMetadataRef DType, size_t *Length) {
1584 StringRef Str = unwrapDI<DIType>(DType)->getName();
1585 *Length = Str.size();
1586 return Str.data();
1587}
1588
1590 return unwrapDI<DIType>(DType)->getSizeInBits();
1591}
1592
1594 return unwrapDI<DIType>(DType)->getOffsetInBits();
1595}
1596
1598 return unwrapDI<DIType>(DType)->getAlignInBits();
1599}
1600
1602 return unwrapDI<DIType>(DType)->getLine();
1603}
1604
1608
1610 LLVMMetadataRef *Types,
1611 size_t Length) {
1612 return wrap(
1613 unwrap(Builder)->getOrCreateTypeArray({unwrap(Types), Length}).get());
1614}
1615
1618 LLVMMetadataRef File,
1619 LLVMMetadataRef *ParameterTypes,
1620 unsigned NumParameterTypes,
1621 LLVMDIFlags Flags) {
1622 auto Elts = unwrap(Builder)->getOrCreateTypeArray({unwrap(ParameterTypes),
1623 NumParameterTypes});
1624 return wrap(unwrap(Builder)->createSubroutineType(
1625 Elts, map_from_llvmDIFlags(Flags)));
1626}
1627
1629 uint64_t *Addr, size_t Length) {
1630 return wrap(
1631 unwrap(Builder)->createExpression(ArrayRef<uint64_t>(Addr, Length)));
1632}
1633
1636 uint64_t Value) {
1637 return wrap(unwrap(Builder)->createConstantValueExpression(Value));
1638}
1639
1641 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1642 size_t NameLen, const char *Linkage, size_t LinkLen, LLVMMetadataRef File,
1643 unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit,
1644 LLVMMetadataRef Expr, LLVMMetadataRef Decl, uint32_t AlignInBits) {
1645 return wrap(unwrap(Builder)->createGlobalVariableExpression(
1646 unwrapDI<DIScope>(Scope), {Name, NameLen}, {Linkage, LinkLen},
1647 unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit,
1648 true, unwrap<DIExpression>(Expr), unwrapDI<MDNode>(Decl),
1649 nullptr, AlignInBits));
1650}
1651
1655
1660
1664
1668
1670 return unwrapDI<DIVariable>(Var)->getLine();
1671}
1672
1674 size_t Count) {
1675 return wrap(
1676 MDTuple::getTemporary(*unwrap(Ctx), {unwrap(Data), Count}).release());
1677}
1678
1682
1684 LLVMMetadataRef Replacement) {
1685 auto *Node = unwrapDI<MDNode>(TargetMetadata);
1686 Node->replaceAllUsesWith(unwrap(Replacement));
1688}
1689
1691 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1692 size_t NameLen, const char *Linkage, size_t LnkLen, LLVMMetadataRef File,
1693 unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit,
1694 LLVMMetadataRef Decl, uint32_t AlignInBits) {
1695 return wrap(unwrap(Builder)->createTempGlobalVariableFwdDecl(
1696 unwrapDI<DIScope>(Scope), {Name, NameLen}, {Linkage, LnkLen},
1697 unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit,
1698 unwrapDI<MDNode>(Decl), nullptr, AlignInBits));
1699}
1700
1702 LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo,
1704 DbgInstPtr DbgInst = unwrap(Builder)->insertDeclare(
1705 unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
1707 Instr ? InsertPosition(unwrap<Instruction>(Instr)->getIterator())
1708 : nullptr);
1709 // This assert will fail if the module is in the old debug info format.
1710 // This function should only be called if the module is in the new
1711 // debug info format.
1712 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1713 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1714 assert(isa<DbgRecord *>(DbgInst) &&
1715 "Function unexpectedly in old debug info format");
1716 return wrap(cast<DbgRecord *>(DbgInst));
1717}
1718
1720 LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo,
1722 DbgInstPtr DbgInst = unwrap(Builder)->insertDeclare(
1723 unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
1725 // This assert will fail if the module is in the old debug info format.
1726 // This function should only be called if the module is in the new
1727 // debug info format.
1728 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1729 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1730 assert(isa<DbgRecord *>(DbgInst) &&
1731 "Function unexpectedly in old debug info format");
1732 return wrap(cast<DbgRecord *>(DbgInst));
1733}
1734
1736 LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo,
1738 DbgInstPtr DbgInst = unwrap(Builder)->insertDbgValueIntrinsic(
1741 Instr ? InsertPosition(unwrap<Instruction>(Instr)->getIterator())
1742 : nullptr);
1743 // This assert will fail if the module is in the old debug info format.
1744 // This function should only be called if the module is in the new
1745 // debug info format.
1746 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1747 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1748 assert(isa<DbgRecord *>(DbgInst) &&
1749 "Function unexpectedly in old debug info format");
1750 return wrap(cast<DbgRecord *>(DbgInst));
1751}
1752
1754 LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo,
1756 DbgInstPtr DbgInst = unwrap(Builder)->insertDbgValueIntrinsic(
1759 Block ? InsertPosition(unwrap(Block)->end()) : nullptr);
1760 // This assert will fail if the module is in the old debug info format.
1761 // This function should only be called if the module is in the new
1762 // debug info format.
1763 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1764 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1765 assert(isa<DbgRecord *>(DbgInst) &&
1766 "Function unexpectedly in old debug info format");
1767 return wrap(cast<DbgRecord *>(DbgInst));
1768}
1769
1771 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1772 size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty,
1773 LLVMBool AlwaysPreserve, LLVMDIFlags Flags, uint32_t AlignInBits) {
1774 return wrap(unwrap(Builder)->createAutoVariable(
1775 unwrap<DIScope>(Scope), {Name, NameLen}, unwrap<DIFile>(File),
1776 LineNo, unwrap<DIType>(Ty), AlwaysPreserve,
1777 map_from_llvmDIFlags(Flags), AlignInBits));
1778}
1779
1781 LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
1782 size_t NameLen, unsigned ArgNo, LLVMMetadataRef File, unsigned LineNo,
1783 LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags) {
1784 return wrap(unwrap(Builder)->createParameterVariable(
1785 unwrap<DIScope>(Scope), {Name, NameLen}, ArgNo, unwrap<DIFile>(File),
1786 LineNo, unwrap<DIType>(Ty), AlwaysPreserve,
1787 map_from_llvmDIFlags(Flags)));
1788}
1789
1791 int64_t Lo, int64_t Count) {
1792 return wrap(unwrap(Builder)->getOrCreateSubrange(Lo, Count));
1793}
1794
1797 size_t Length) {
1798 Metadata **DataValue = unwrap(Data);
1799 return wrap(unwrap(Builder)->getOrCreateArray({DataValue, Length}).get());
1800}
1801
1805
1807 unwrap<Function>(Func)->setSubprogram(unwrap<DISubprogram>(SP));
1808}
1809
1811 return unwrapDI<DISubprogram>(Subprogram)->getLine();
1812}
1813
1815 LLVMMetadataRef SubroutineType) {
1816 unwrapDI<DISubprogram>(Subprogram)
1817 ->replaceType(unwrapDI<DISubroutineType>(SubroutineType));
1818}
1819
1823
1825 if (Loc)
1826 unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc(unwrap<MDNode>(Loc)));
1827 else
1828 unwrap<Instruction>(Inst)->setDebugLoc(DebugLoc());
1829}
1830
1832 LLVMMetadataRef Context,
1833 const char *Name, size_t NameLen,
1834 LLVMMetadataRef File, unsigned LineNo,
1835 LLVMBool AlwaysPreserve) {
1836 return wrap(unwrap(Builder)->createLabel(
1837 unwrapDI<DIScope>(Context), StringRef(Name, NameLen),
1838 unwrapDI<DIFile>(File), LineNo, /*Column*/ 0, /*IsArtificial*/ false,
1839 /*CoroSuspendIdx*/ std::nullopt, AlwaysPreserve));
1840}
1841
1843 LLVMMetadataRef LabelInfo,
1844 LLVMMetadataRef Location,
1845 LLVMValueRef InsertBefore) {
1846 DbgInstPtr DbgInst = unwrap(Builder)->insertLabel(
1847 unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location),
1848 InsertBefore
1849 ? InsertPosition(unwrap<Instruction>(InsertBefore)->getIterator())
1850 : nullptr);
1851 // This assert will fail if the module is in the old debug info format.
1852 // This function should only be called if the module is in the new
1853 // debug info format.
1854 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1855 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1856 assert(isa<DbgRecord *>(DbgInst) &&
1857 "Function unexpectedly in old debug info format");
1858 return wrap(cast<DbgRecord *>(DbgInst));
1859}
1860
1862 LLVMMetadataRef LabelInfo,
1863 LLVMMetadataRef Location,
1864 LLVMBasicBlockRef InsertAtEnd) {
1865 DbgInstPtr DbgInst = unwrap(Builder)->insertLabel(
1866 unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location),
1867 InsertAtEnd ? InsertPosition(unwrap(InsertAtEnd)->end()) : nullptr);
1868 // This assert will fail if the module is in the old debug info format.
1869 // This function should only be called if the module is in the new
1870 // debug info format.
1871 // See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes,
1872 // LLVMIsNewDbgInfoFormat, and LLVMSetIsNewDbgInfoFormat for more info.
1873 assert(isa<DbgRecord *>(DbgInst) &&
1874 "Function unexpectedly in old debug info format");
1875 return wrap(cast<DbgRecord *>(DbgInst));
1876}
1877
1879 switch(unwrap(Metadata)->getMetadataID()) {
1880#define HANDLE_METADATA_LEAF(CLASS) \
1881 case Metadata::CLASS##Kind: \
1882 return (LLVMMetadataKind)LLVM##CLASS##MetadataKind;
1883#include "llvm/IR/Metadata.def"
1884 default:
1886 }
1887}
1888
1890 assert(ID && "Expected non-null ID");
1891 LLVMContext &Ctx = ID->getContext();
1892 auto &Map = Ctx.pImpl->AssignmentIDToInstrs;
1893
1894 auto MapIt = Map.find(ID);
1895 if (MapIt == Map.end())
1896 return make_range(nullptr, nullptr);
1897
1898 return make_range(MapIt->second.begin(), MapIt->second.end());
1899}
1900
1902 for (auto *DVR : getDVRAssignmentMarkers(Inst))
1903 DVR->eraseFromParent();
1904}
1905
1907 // Replace attachments.
1908 AssignmentInstRange InstRange = getAssignmentInsts(Old);
1909 // Use intermediate storage for the instruction ptrs because the
1910 // getAssignmentInsts range iterators will be invalidated by adding and
1911 // removing DIAssignID attachments.
1912 SmallVector<Instruction *> InstVec(InstRange.begin(), InstRange.end());
1913 for (auto *I : InstVec)
1914 I->setMetadata(LLVMContext::MD_DIAssignID, New);
1915
1916 Old->replaceAllUsesWith(New);
1917}
1918
1920 for (BasicBlock &BB : *F) {
1921 for (Instruction &I : BB) {
1922 for (DbgVariableRecord &DVR :
1923 make_early_inc_range(filterDbgVars(I.getDbgRecordRange())))
1924 if (DVR.isDbgAssign())
1925 DVR.eraseFromParent();
1926
1927 I.setMetadata(LLVMContext::MD_DIAssignID, nullptr);
1928 }
1929 }
1930}
1931
1933 const DataLayout &DL, const Value *Dest, uint64_t SliceOffsetInBits,
1934 uint64_t SliceSizeInBits, const DbgVariableRecord *AssignRecord,
1935 std::optional<DIExpression::FragmentInfo> &Result) {
1936 // No overlap if this DbgRecord describes a killed location.
1937 if (AssignRecord->isKillAddress())
1938 return false;
1939
1940 int64_t AddrOffsetInBits;
1941 {
1942 int64_t AddrOffsetInBytes;
1943 SmallVector<uint64_t> PostOffsetOps; //< Unused.
1944 // Bail if we can't find a constant offset (or none) in the expression.
1945 if (!AssignRecord->getAddressExpression()->extractLeadingOffset(
1946 AddrOffsetInBytes, PostOffsetOps))
1947 return false;
1948 AddrOffsetInBits = AddrOffsetInBytes * 8;
1949 }
1950
1951 Value *Addr = AssignRecord->getAddress();
1952 // FIXME: It may not always be zero.
1953 int64_t BitExtractOffsetInBits = 0;
1955 AssignRecord->getFragmentOrEntireVariable();
1956
1957 int64_t OffsetFromLocationInBits; //< Unused.
1959 DL, Dest, SliceOffsetInBits, SliceSizeInBits, Addr, AddrOffsetInBits,
1960 BitExtractOffsetInBits, VarFrag, Result, OffsetFromLocationInBits);
1961}
1962
1963/// Update inlined instructions' DIAssignID metadata. We need to do this
1964/// otherwise a function inlined more than once into the same function
1965/// will cause DIAssignID to be shared by many instructions.
1967 Instruction &I) {
1968 auto GetNewID = [&Map](Metadata *Old) {
1969 DIAssignID *OldID = cast<DIAssignID>(Old);
1970 if (DIAssignID *NewID = Map.lookup(OldID))
1971 return NewID;
1973 Map[OldID] = NewID;
1974 return NewID;
1975 };
1976 // If we find a DIAssignID attachment or use, replace it with a new version.
1977 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
1978 if (DVR.isDbgAssign())
1979 DVR.setAssignId(GetNewID(DVR.getAssignID()));
1980 }
1981 if (auto *ID = I.getMetadata(LLVMContext::MD_DIAssignID))
1982 I.setMetadata(LLVMContext::MD_DIAssignID, GetNewID(ID));
1983}
1984
1985/// Collect constant properies (base, size, offset) of \p StoreDest.
1986/// Return std::nullopt if any properties are not constants or the
1987/// offset from the base pointer is negative.
1988static std::optional<AssignmentInfo>
1989getAssignmentInfoImpl(const DataLayout &DL, const Value *StoreDest,
1990 TypeSize SizeInBits) {
1991 if (SizeInBits.isScalable())
1992 return std::nullopt;
1993 APInt GEPOffset(DL.getIndexTypeSizeInBits(StoreDest->getType()), 0);
1994 const Value *Base = StoreDest->stripAndAccumulateConstantOffsets(
1995 DL, GEPOffset, /*AllowNonInbounds*/ true);
1996
1997 if (GEPOffset.isNegative())
1998 return std::nullopt;
1999
2000 uint64_t OffsetInBytes = GEPOffset.getLimitedValue();
2001 // Check for overflow.
2002 if (OffsetInBytes == UINT64_MAX)
2003 return std::nullopt;
2004 if (const auto *Alloca = dyn_cast<AllocaInst>(Base))
2005 return AssignmentInfo(DL, Alloca, OffsetInBytes * 8, SizeInBits);
2006 return std::nullopt;
2007}
2008
2009std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2010 const MemIntrinsic *I) {
2011 const Value *StoreDest = I->getRawDest();
2012 // Assume 8 bit bytes.
2013 auto *ConstLengthInBytes = dyn_cast<ConstantInt>(I->getLength());
2014 if (!ConstLengthInBytes)
2015 // We can't use a non-const size, bail.
2016 return std::nullopt;
2017 uint64_t SizeInBits = 8 * ConstLengthInBytes->getZExtValue();
2018 return getAssignmentInfoImpl(DL, StoreDest, TypeSize::getFixed(SizeInBits));
2019}
2020
2021std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2022 const StoreInst *SI) {
2023 TypeSize SizeInBits = DL.getTypeSizeInBits(SI->getValueOperand()->getType());
2024 return getAssignmentInfoImpl(DL, SI->getPointerOperand(), SizeInBits);
2025}
2026
2027std::optional<AssignmentInfo> at::getAssignmentInfo(const DataLayout &DL,
2028 const AllocaInst *AI) {
2029 TypeSize SizeInBits = DL.getTypeSizeInBits(AI->getAllocatedType());
2030 return getAssignmentInfoImpl(DL, AI, SizeInBits);
2031}
2032
2033/// Returns nullptr if the assignment shouldn't be attributed to this variable.
2035 Instruction &StoreLikeInst, const VarRecord &VarRec,
2036 DIBuilder &DIB) {
2037 auto *ID = StoreLikeInst.getMetadata(LLVMContext::MD_DIAssignID);
2038 assert(ID && "Store instruction must have DIAssignID metadata");
2039 (void)ID;
2040
2041 const uint64_t StoreStartBit = Info.OffsetInBits;
2042 const uint64_t StoreEndBit = Info.OffsetInBits + Info.SizeInBits;
2043
2044 uint64_t FragStartBit = StoreStartBit;
2045 uint64_t FragEndBit = StoreEndBit;
2046
2047 bool StoreToWholeVariable = Info.StoreToWholeAlloca;
2048 if (auto Size = VarRec.Var->getSizeInBits()) {
2049 // NOTE: trackAssignments doesn't understand base expressions yet, so all
2050 // variables that reach here are guaranteed to start at offset 0 in the
2051 // alloca.
2052 const uint64_t VarStartBit = 0;
2053 const uint64_t VarEndBit = *Size;
2054
2055 // FIXME: trim FragStartBit when nonzero VarStartBit is supported.
2056 FragEndBit = std::min(FragEndBit, VarEndBit);
2057
2058 // Discard stores to bits outside this variable.
2059 if (FragStartBit >= FragEndBit)
2060 return;
2061
2062 StoreToWholeVariable = FragStartBit <= VarStartBit && FragEndBit >= *Size;
2063 }
2064
2065 DIExpression *Expr = DIExpression::get(StoreLikeInst.getContext(), {});
2066 if (!StoreToWholeVariable) {
2067 auto R = DIExpression::createFragmentExpression(Expr, FragStartBit,
2068 FragEndBit - FragStartBit);
2069 assert(R.has_value() && "failed to create fragment expression");
2070 Expr = *R;
2071 }
2072 DIExpression *AddrExpr = DIExpression::get(StoreLikeInst.getContext(), {});
2074 &StoreLikeInst, Val, VarRec.Var, Expr, Dest, AddrExpr, VarRec.DL);
2075 (void)Assign;
2076 LLVM_DEBUG(if (Assign) errs() << " > INSERT: " << *Assign << "\n");
2077}
2078
2079#undef DEBUG_TYPE // Silence redefinition warning (from ConstantsContext.h).
2080#define DEBUG_TYPE "assignment-tracking"
2081
2083 const StorageToVarsMap &Vars, const DataLayout &DL,
2084 bool DebugPrints) {
2085 // Early-exit if there are no interesting variables.
2086 if (Vars.empty())
2087 return;
2088
2089 auto &Ctx = Start->getContext();
2090 auto &Module = *Start->getModule();
2091
2092 // Poison type doesn't matter, so long as it isn't void. Let's just use i1.
2094 DIBuilder DIB(Module, /*AllowUnresolved*/ false);
2095
2096 // Scan the instructions looking for stores to local variables' storage.
2097 LLVM_DEBUG(errs() << "# Scanning instructions\n");
2098 for (auto BBI = Start; BBI != End; ++BBI) {
2099 for (Instruction &I : *BBI) {
2100
2101 std::optional<AssignmentInfo> Info;
2102 Value *ValueComponent = nullptr;
2103 Value *DestComponent = nullptr;
2104 if (auto *AI = dyn_cast<AllocaInst>(&I)) {
2105 // We want to track the variable's stack home from its alloca's
2106 // position onwards so we treat it as an assignment (where the stored
2107 // value is poison).
2108 Info = getAssignmentInfo(DL, AI);
2109 ValueComponent = Poison;
2110 DestComponent = AI;
2111 } else if (auto *SI = dyn_cast<StoreInst>(&I)) {
2112 Info = getAssignmentInfo(DL, SI);
2113 ValueComponent = SI->getValueOperand();
2114 DestComponent = SI->getPointerOperand();
2115 } else if (auto *MI = dyn_cast<MemTransferInst>(&I)) {
2116 Info = getAssignmentInfo(DL, MI);
2117 // May not be able to represent this value easily.
2118 ValueComponent = Poison;
2119 DestComponent = MI->getOperand(0);
2120 } else if (auto *MI = dyn_cast<MemSetInst>(&I)) {
2121 Info = getAssignmentInfo(DL, MI);
2122 // If we're zero-initing we can state the assigned value is zero,
2123 // otherwise use undef.
2124 auto *ConstValue = dyn_cast<ConstantInt>(MI->getOperand(1));
2125 if (ConstValue && ConstValue->isZero())
2126 ValueComponent = ConstValue;
2127 else
2128 ValueComponent = Poison;
2129 DestComponent = MI->getOperand(0);
2130 } else {
2131 // Not a store-like instruction.
2132 continue;
2133 }
2134
2135 assert(ValueComponent && DestComponent);
2136 LLVM_DEBUG(errs() << "SCAN: Found store-like: " << I << "\n");
2137
2138 // Check if getAssignmentInfo failed to understand this store.
2139 if (!Info.has_value()) {
2140 LLVM_DEBUG(
2141 errs()
2142 << " | SKIP: Untrackable store (e.g. through non-const gep)\n");
2143 continue;
2144 }
2145 LLVM_DEBUG(errs() << " | BASE: " << *Info->Base << "\n");
2146
2147 // Check if the store destination is a local variable with debug info.
2148 auto LocalIt = Vars.find(Info->Base);
2149 if (LocalIt == Vars.end()) {
2150 LLVM_DEBUG(
2151 errs()
2152 << " | SKIP: Base address not associated with local variable\n");
2153 continue;
2154 }
2155
2156 DIAssignID *ID =
2157 cast_or_null<DIAssignID>(I.getMetadata(LLVMContext::MD_DIAssignID));
2158 if (!ID) {
2160 I.setMetadata(LLVMContext::MD_DIAssignID, ID);
2161 }
2162
2163 for (const VarRecord &R : LocalIt->second)
2164 emitDbgAssign(*Info, ValueComponent, DestComponent, I, R, DIB);
2165 }
2166 }
2167}
2168
2169bool AssignmentTrackingPass::runOnFunction(Function &F) {
2170 // No value in assignment tracking without optimisations.
2171 if (F.hasFnAttribute(Attribute::OptimizeNone))
2172 return /*Changed*/ false;
2173
2174 bool Changed = false;
2175 auto *DL = &F.getDataLayout();
2176 // Collect a map of {backing storage : dbg.declares} (currently "backing
2177 // storage" is limited to Allocas). We'll use this to find dbg.declares to
2178 // delete after running `trackAssignments`.
2180 // Create another similar map of {storage : variables} that we'll pass to
2181 // trackAssignments.
2182 StorageToVarsMap Vars;
2183 auto ProcessDeclare = [&](DbgVariableRecord &Declare) {
2184 // FIXME: trackAssignments doesn't let you specify any modifiers to the
2185 // variable (e.g. fragment) or location (e.g. offset), so we have to
2186 // leave dbg.declares with non-empty expressions in place.
2187 if (Declare.getExpression()->getNumElements() != 0)
2188 return;
2189 if (!Declare.getAddress())
2190 return;
2191 if (AllocaInst *Alloca =
2192 dyn_cast<AllocaInst>(Declare.getAddress()->stripPointerCasts())) {
2193 // FIXME: Skip VLAs for now (let these variables use dbg.declares).
2194 if (!Alloca->isStaticAlloca())
2195 return;
2196 // Similarly, skip scalable vectors (use dbg.declares instead).
2197 if (auto Sz = Alloca->getAllocationSize(*DL); Sz && Sz->isScalable())
2198 return;
2199 DVRDeclares[Alloca].insert(&Declare);
2200 Vars[Alloca].insert(VarRecord(&Declare));
2201 }
2202 };
2203 for (auto &BB : F) {
2204 for (auto &I : BB) {
2205 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
2206 if (DVR.isDbgDeclare())
2207 ProcessDeclare(DVR);
2208 }
2209 }
2210 }
2211
2212 // FIXME: Locals can be backed by caller allocas (sret, byval).
2213 // Note: trackAssignments doesn't respect dbg.declare's IR positions (as it
2214 // doesn't "understand" dbg.declares). However, this doesn't appear to break
2215 // any rules given this description of dbg.declare from
2216 // llvm/docs/SourceLevelDebugging.rst:
2217 //
2218 // It is not control-dependent, meaning that if a call to llvm.dbg.declare
2219 // exists and has a valid location argument, that address is considered to
2220 // be the true home of the variable across its entire lifetime.
2221 trackAssignments(F.begin(), F.end(), Vars, *DL);
2222
2223 // Delete dbg.declares for variables now tracked with assignment tracking.
2224 for (auto &[Insts, Declares] : DVRDeclares) {
2226 for (auto *Declare : Declares) {
2227 // Assert that the alloca that Declare uses is now linked to a dbg.assign
2228 // describing the same variable (i.e. check that this dbg.declare has
2229 // been replaced by a dbg.assign). Use DebugVariableAggregate to Discard
2230 // the fragment part because trackAssignments may alter the
2231 // fragment. e.g. if the alloca is smaller than the variable, then
2232 // trackAssignments will create an alloca-sized fragment for the
2233 // dbg.assign.
2234 assert(llvm::any_of(Markers, [Declare](auto *Assign) {
2235 return DebugVariableAggregate(Assign) ==
2236 DebugVariableAggregate(Declare);
2237 }));
2238 // Delete Declare because the variable location is now tracked using
2239 // assignment tracking.
2240 Declare->eraseFromParent();
2241 Changed = true;
2242 }
2243 };
2244 return Changed;
2245}
2246
2248 "debug-info-assignment-tracking";
2249
2253 ConstantInt::get(Type::getInt1Ty(M.getContext()), 1)));
2254}
2255
2257 Metadata *Value = M.getModuleFlag(AssignmentTrackingModuleFlag);
2258 return Value && !cast<ConstantAsMetadata>(Value)->getValue()->isZeroValue();
2259}
2260
2264
2267 if (!runOnFunction(F))
2268 return PreservedAnalyses::all();
2269
2270 // Record that this module uses assignment tracking. It doesn't matter that
2271 // some functons in the module may not use it - the debug info in those
2272 // functions will still be handled properly.
2273 setAssignmentTrackingModuleFlag(*F.getParent());
2274
2275 // Q: Can we return a less conservative set than just CFGAnalyses? Can we
2276 // return PreservedAnalyses::all()?
2279 return PA;
2280}
2281
2284 bool Changed = false;
2285 for (auto &F : M)
2286 Changed |= runOnFunction(F);
2287
2288 if (!Changed)
2289 return PreservedAnalyses::all();
2290
2291 // Record that this module uses assignment tracking.
2293
2294 // Q: Can we return a less conservative set than just CFGAnalyses? Can we
2295 // return PreservedAnalyses::all()?
2298 return PA;
2299}
2300
2301#undef DEBUG_TYPE
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
Analysis containing CSE Info
Definition CSEInfo.cpp:27
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)
Definition DebugInfo.cpp:85
static Metadata * stripLoopMDLoc(const SmallPtrSetImpl< Metadata * > &AllDILocation, const SmallPtrSetImpl< Metadata * > &DIReachable, Metadata *MD)
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 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 properies (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:55
#define I(x, y, z)
Definition MD5.cpp:58
static DebugLoc getDebugLoc(MachineBasicBlock::instr_iterator FirstMI, MachineBasicBlock::instr_iterator LastMI)
Return the first found DebugLoc that has a DILocation, given a range of instructions.
This file contains the declarations for metadata subclasses.
#define T
uint64_t IntrinsicInst * II
R600 Emit Clause Markers
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
FunctionLoweringInfo::StatepointRelocationRecord RecordType
#define LLVM_DEBUG(...)
Definition Debug.h:119
static uint32_t getFlags(const Symbol *Sym)
Definition TapiFile.cpp:26
Class for arbitrary precision integers.
Definition APInt.h:78
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:329
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:475
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.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
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:535
List of ValueAsMetadata, to be used as an argument to a dbg.value intrinsic.
SmallVector< DbgVariableRecord * > getAllDbgVariableRecordUsers()
static DIAssignID * getDistinct(LLVMContext &Context)
bool getDebugInfoForProfiling() const
StringRef getFlags() const
StringRef getSDK() const
static LLVM_ABI std::optional< DebugNameTableKind > getNameTableKind(StringRef Str)
bool getRangesBaseAddress() const
DIMacroNodeArray getMacros() const
unsigned getRuntimeVersion() const
bool getSplitDebugInlining() const
StringRef getSysRoot() const
StringRef getProducer() const
unsigned 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 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...
LLVM_ABI bool extractLeadingOffset(int64_t &OffsetInBytes, SmallVectorImpl< uint64_t > &RemainingOps) const
Assuming that the expression operates on an address, extract a constant offset and the successive ops...
A pair of DIGlobalVariable and DIExpression.
An imported module (C++ using directive or similar).
LLVM_ABI DISubprogram * getSubprogram() const
Get the subprogram for this scope.
DILocalScope * getScope() const
Get the local scope for this variable.
Tagged DWARF-like metadata node.
DIFlags
Debug info flags.
Base class for scope-like contexts.
LLVM_ABI StringRef getName() const
DIFile * getFile() const
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.
Type array for a subprogram.
Base class for types.
DIScope * getScope() const
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:63
Base class for non-instruction debug metadata records that have positions within IR.
DebugLoc getDebugLoc() const
LLVM_ABI LLVMContext & getContext()
Record of a variable value-assignment, aka a non instruction representation of the dbg....
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...
LLVM_ABI Value * getAddress() const
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 processVariable(DILocalVariable *DVI)
Process a DILocalVariable.
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 processDbgRecord(const Module &M, const DbgRecord &DR)
Process a DbgRecord.
A debug info location.
Definition DebugLoc.h:124
LLVM_ABI DILocation * get() const
Get the underlying DILocation.
Definition DebugLoc.cpp:50
LLVM_ABI MDNode * getScope() const
Definition DebugLoc.cpp:64
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:183
LLVM_ABI DILocation * getInlinedAt() const
Definition DebugLoc.cpp:69
static DebugLoc getDropped()
Definition DebugLoc.h:164
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
Definition DenseMap.h:187
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:214
Implements a dense probed hash-table based set.
Definition DenseSet.h:261
BasicBlockListType::iterator iterator
Definition Function.h:69
DISubprogram * getSubprogram() const
Get the attached subprogram.
LLVM_ABI void mergeDIAssignID(ArrayRef< const Instruction * > SourceInstructions)
Merge the DIAssignID metadata from this instruction and those attached to instructions in SourceInstr...
LLVM_ABI void dropLocation()
Drop the instruction's debug location.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
LLVM_ABI void updateLocationAfterHoist()
Updates the debug location given that the instruction has been hoisted from a block to a predecessor ...
Instruction(const Instruction &)=delete
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI void applyMergedLocation(DebugLoc LocA, DebugLoc LocB)
Merge 2 debug locations and apply it to the Instruction.
static LLVM_ABI bool mayLowerToFunctionCall(Intrinsic::ID IID)
Check if the intrinsic might lower into a regular function call in the course of IR transformations.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
static LocalAsMetadata * getIfExists(Value *Local)
Definition Metadata.h:565
Metadata node.
Definition Metadata.h:1077
LLVM_ABI void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1573
void replaceAllUsesWith(Metadata *MD)
RAUW a temporary.
Definition Metadata.h:1281
static LLVM_ABI void deleteTemporary(MDNode *N)
Deallocate a node created by getTemporary.
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1445
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1565
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1451
bool isDistinct() const
Definition Metadata.h:1260
LLVMContext & getContext() const
Definition Metadata.h:1241
Tracking metadata reference owned by Metadata.
Definition Metadata.h:899
Metadata * get() const
Definition Metadata.h:928
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a temporary node.
Definition Metadata.h:1542
This is the common base class for memset/memcpy/memmove.
Root of the metadata hierarchy.
Definition Metadata.h:63
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
@ Max
Takes the max of the two values, which are required to be integers.
Definition Module.h:149
A tuple of MDNodes.
Definition Metadata.h:1753
LLVM_ABI StringRef getName() const
A discriminated union of two or more pointer types, with the discriminator in the low bit of the poin...
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.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:151
The TimeTraceScope is a helper class to call the begin and end functions of the time trace profiler.
TinyPtrVector - This class is specialized for cases where there are normally 0 or 1 element in a vect...
void push_back(EltTy NewVal)
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:294
static LLVM_ABI ValueAsMetadata * getIfExists(Value *V)
Definition Metadata.cpp:521
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
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.
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.cpp:1101
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:194
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:174
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.
IteratorT end() const
IteratorT begin() const
Changed
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateImportedDeclaration(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef Decl, LLVMMetadataRef File, unsigned Line, const char *Name, size_t NameLen, LLVMMetadataRef *Elements, unsigned NumElements)
Create a descriptor for an imported function, type, or variable.
LLVM_C_ABI LLVMMetadataRef LLVMDILocationGetInlinedAt(LLVMMetadataRef Location)
Get the "inline at" location associated with this debug location.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateStaticMemberType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, LLVMMetadataRef Type, LLVMDIFlags Flags, LLVMValueRef ConstantVal, uint32_t AlignInBits)
Create debugging information entry for a C++ static data member.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateArrayType(LLVMDIBuilderRef Builder, uint64_t Size, uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts, unsigned NumSubscripts)
Create debugging information entry for an array.
LLVM_C_ABI unsigned LLVMDISubprogramGetLine(LLVMMetadataRef Subprogram)
Get the line associated with a given subprogram.
LLVM_C_ABI LLVMMetadataRef LLVMDILocationGetScope(LLVMMetadataRef Location)
Get the local scope associated with this debug location.
LLVM_C_ABI unsigned LLVMDITypeGetLine(LLVMMetadataRef DType)
Get the source line where this DIType is declared.
LLVMDWARFMacinfoRecordType
Describes the kind of macro declaration used for LLVMDIBuilderCreateMacro.
Definition DebugInfo.h:216
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 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.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromModule(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef M, LLVMMetadataRef File, unsigned Line, LLVMMetadataRef *Elements, unsigned NumElements)
Create a descriptor for an imported module.
LLVM_C_ABI LLVMMetadataRef LLVMDIVariableGetFile(LLVMMetadataRef Var)
Get the metadata of the file associated with a given variable.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderGetOrCreateSubrange(LLVMDIBuilderRef Builder, int64_t LowerBound, int64_t Count)
Create a descriptor for a value range.
LLVM_C_ABI unsigned LLVMDILocationGetLine(LLVMMetadataRef Location)
Get the line number of this debug location.
LLVM_C_ABI LLVMDbgRecordRef LLVMDIBuilderInsertLabelBefore(LLVMDIBuilderRef Builder, LLVMMetadataRef LabelInfo, LLVMMetadataRef Location, LLVMValueRef InsertBefore)
Insert a new llvm.dbg.label intrinsic call.
LLVM_C_ABI unsigned LLVMDIVariableGetLine(LLVMMetadataRef Var)
Get the source line where this DIVariable is declared.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateQualifiedType(LLVMDIBuilderRef Builder, unsigned Tag, LLVMMetadataRef Type)
Create debugging information entry for a qualified type, e.g.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateClassType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements, unsigned NumElements, LLVMMetadataRef VTableHolder, LLVMMetadataRef TemplateParamsNode, const char *UniqueIdentifier, size_t UniqueIdentifierLen)
Create debugging information entry for a class.
LLVM_C_ABI LLVMMetadataKind LLVMGetMetadataKind(LLVMMetadataRef Metadata)
Obtain the enumerated type of a Metadata instance.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateDynamicArrayType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t Size, uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts, unsigned NumSubscripts, LLVMMetadataRef DataLocation, LLVMMetadataRef Associated, LLVMMetadataRef Allocated, LLVMMetadataRef Rank, LLVMMetadataRef BitStride)
Create debugging information entry for a dynamic array.
LLVMDWARFEmissionKind
The amount of debug information to emit.
Definition DebugInfo.h:153
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateSubrangeType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, unsigned LineNo, LLVMMetadataRef File, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef BaseTy, LLVMMetadataRef LowerBound, LLVMMetadataRef UpperBound, LLVMMetadataRef Stride, LLVMMetadataRef Bias)
Create a descriptor for a subrange with dynamic bounds.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateMemberType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef Ty)
Create debugging information entry for a member.
LLVM_C_ABI const char * LLVMDITypeGetName(LLVMMetadataRef DType, size_t *Length)
Get the name of this DIType.
LLVM_C_ABI uint64_t LLVMDITypeGetOffsetInBits(LLVMMetadataRef DType)
Get the offset of this DIType in bits.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateReplaceableCompositeType(LLVMDIBuilderRef Builder, unsigned Tag, const char *Name, size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, const char *UniqueIdentifier, size_t UniqueIdentifierLen)
Create a temporary forward-declared type.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateTempMacroFile(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentMacroFile, unsigned Line, LLVMMetadataRef File)
Create debugging information temporary entry for a macro file.
LLVM_C_ABI LLVMDIFlags LLVMDITypeGetFlags(LLVMMetadataRef DType)
Get the flags associated with this DIType.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateModule(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentScope, const char *Name, size_t NameLen, const char *ConfigMacros, size_t ConfigMacrosLen, const char *IncludePath, size_t IncludePathLen, const char *APINotesFile, size_t APINotesFileLen)
Creates a new descriptor for a module with the specified parent scope.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateMemberPointerType(LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeType, LLVMMetadataRef ClassType, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags)
Create debugging information entry for a pointer to member.
LLVM_C_ABI uint16_t LLVMGetDINodeTag(LLVMMetadataRef MD)
Get the dwarf::Tag of a DINode.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateEnumeratorOfArbitraryPrecision(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, uint64_t SizeInBits, const uint64_t Words[], LLVMBool IsUnsigned)
Create debugging information entry for an enumerator of arbitrary precision.
LLVM_C_ABI void LLVMReplaceArrays(LLVMDIBuilderRef Builder, LLVMMetadataRef *T, LLVMMetadataRef *Elements, unsigned NumElements)
Replace arrays.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateNameSpace(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentScope, const char *Name, size_t NameLen, LLVMBool ExportSymbols)
Creates a new descriptor for a namespace with the specified parent scope.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateStructType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang, LLVMMetadataRef VTableHolder, const char *UniqueId, size_t UniqueIdLen)
Create debugging information entry for a struct.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateLexicalBlockFile(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Discriminator)
Create a descriptor for a lexical block with a new file attached.
LLVM_C_ABI void LLVMDisposeTemporaryMDNode(LLVMMetadataRef TempNode)
Deallocate a temporary node.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateObjectPointerType(LLVMDIBuilderRef Builder, LLVMMetadataRef Type, LLVMBool Implicit)
Create a uniqued DIType* clone with FlagObjectPointer.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateTypedef(LLVMDIBuilderRef Builder, LLVMMetadataRef Type, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Scope, uint32_t AlignInBits)
Create debugging information entry for a typedef.
unsigned LLVMDWARFTypeEncoding
An LLVM DWARF type encoding.
Definition DebugInfo.h:209
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateAutoVariable(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags, uint32_t AlignInBits)
Create a new descriptor for a local auto variable.
LLVM_C_ABI void LLVMInstructionSetDebugLoc(LLVMValueRef Inst, LLVMMetadataRef Loc)
Set the debug location for the given instruction.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef Builder, LLVMMetadataRef File, LLVMMetadataRef *ParameterTypes, unsigned NumParameterTypes, LLVMDIFlags Flags)
Create subroutine type.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateVectorType(LLVMDIBuilderRef Builder, uint64_t Size, uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts, unsigned NumSubscripts)
Create debugging information entry for a vector type.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreatePointerType(LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeTy, uint64_t SizeInBits, uint32_t AlignInBits, unsigned AddressSpace, const char *Name, size_t NameLen)
Create debugging information entry for a pointer.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateNullPtrType(LLVMDIBuilderRef Builder)
Create C++11 nullptr type.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateEnumerationType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef *Elements, unsigned NumElements, LLVMMetadataRef ClassTy)
Create debugging information entry for an enumeration.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromAlias(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef ImportedEntity, LLVMMetadataRef File, unsigned Line, LLVMMetadataRef *Elements, unsigned NumElements)
Create a descriptor for an imported module that aliases another imported entity descriptor.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateInheritance(LLVMDIBuilderRef Builder, LLVMMetadataRef Ty, LLVMMetadataRef BaseTy, uint64_t BaseOffset, uint32_t VBPtrOffset, LLVMDIFlags Flags)
Create debugging information entry to establish inheritance relationship between two types.
unsigned LLVMMetadataKind
Definition DebugInfo.h:204
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateReferenceType(LLVMDIBuilderRef Builder, unsigned Tag, LLVMMetadataRef Type)
Create debugging information entry for a c++ style reference or rvalue reference type.
LLVM_C_ABI LLVMBool LLVMStripModuleDebugInfo(LLVMModuleRef Module)
Strip debug info in the module if it exists.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, uint64_t SizeInBits, LLVMDWARFTypeEncoding Encoding, LLVMDIFlags Flags)
Create debugging information entry for a basic type.
LLVM_C_ABI uint32_t LLVMDITypeGetAlignInBits(LLVMMetadataRef DType)
Get the alignment of this DIType in bits.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateLexicalBlock(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, unsigned Column)
Create a descriptor for a lexical block with the specified parent context.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateArtificialType(LLVMDIBuilderRef Builder, LLVMMetadataRef Type)
Create a uniqued DIType* clone with FlagArtificial set.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateDebugLocation(LLVMContextRef Ctx, unsigned Line, unsigned Column, LLVMMetadataRef Scope, LLVMMetadataRef InlinedAt)
Creates a new DebugLocation that describes a source location.
LLVM_C_ABI const char * LLVMDIFileGetDirectory(LLVMMetadataRef File, unsigned *Len)
Get the directory of a given file.
LLVM_C_ABI LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromNamespace(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef NS, LLVMMetadataRef File, unsigned Line)
Create a descriptor for an imported namespace.
@ LLVMGenericDINodeMetadataKind
Definition DebugInfo.h:173
struct LLVMOpaqueValue * LLVMValueRef
Represents an individual value in LLVM IR.
Definition Types.h:75
int LLVMBool
Definition Types.h:28
struct LLVMOpaqueDbgRecord * LLVMDbgRecordRef
Definition Types.h:175
struct LLVMOpaqueContext * LLVMContextRef
The top-level container for all LLVM global data.
Definition Types.h:53
struct LLVMOpaqueBasicBlock * LLVMBasicBlockRef
Represents a basic block of instructions in LLVM IR.
Definition Types.h:82
struct LLVMOpaqueMetadata * LLVMMetadataRef
Represents an LLVM Metadata.
Definition Types.h:89
struct LLVMOpaqueModule * LLVMModuleRef
The top-level container for all other LLVM Intermediate Representation (IR) objects.
Definition Types.h:61
struct LLVMOpaqueDIBuilder * LLVMDIBuilderRef
Represents an LLVM debug info builder.
Definition Types.h:117
#define UINT64_MAX
Definition DataTypes.h:77
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
Assignment Tracking (at).
Definition DebugInfo.h:179
LLVM_ABI void deleteAll(Function *F)
Remove all Assignment Tracking related intrinsics and metadata from F.
LLVM_ABI AssignmentInstRange getAssignmentInsts(DIAssignID *ID)
Return a range of instructions (typically just one) that have ID as an attachment.
iterator_range< SmallVectorImpl< Instruction * >::iterator > AssignmentInstRange
A range of instructions.
Definition DebugInfo.h:184
LLVM_ABI void trackAssignments(Function::iterator Start, Function::iterator End, const StorageToVarsMap &Vars, const DataLayout &DL, bool DebugPrints=false)
Track assignments to Vars between Start and End.
LLVM_ABI void remapAssignID(DenseMap< DIAssignID *, DIAssignID * > &Map, Instruction &I)
Replace DIAssignID uses and attachments with IDs from Map.
SmallVector< DbgVariableRecord * > getDVRAssignmentMarkers(const Instruction *Inst)
Return a range of dbg_assign records for which Inst performs the assignment they encode.
Definition DebugInfo.h:201
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:284
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:34
MacinfoRecordType
Definition Dwarf.h:801
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:707
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:330
@ Length
Definition DWP.cpp:477
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1727
LLVM_ABI void findDbgValues(Value *V, SmallVectorImpl< DbgVariableRecord * > &DbgVariableRecords)
Finds the dbg.values describing a value.
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:649
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
@ Import
Import information from summary.
Definition IPO.h:56
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:646
auto cast_or_null(const Y &Val)
Definition Casting.h:720
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:759
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:1734
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
LLVM_ABI bool stripNonLineTableDebugInfo(Module &M)
Downgrade the debug info in a module to contain only line table information.
LLVM_ABI TinyPtrVector< DbgVariableRecord * > findDVRValues(Value *V)
As above, for DVRValues.
Definition DebugInfo.cpp:66
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:548
LLVM_ABI unsigned getDebugMetadataVersionFromModule(const Module &M)
Return Debug Info Metadata Version by checking module flags.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
LLVM_ABI bool StripDebugInfo(Module &M)
Strip debug info in the module if it exists.
@ Ref
The access may reference the value stored in memory.
Definition ModRef.h:32
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
Attribute unwrap(LLVMAttributeRef Attr)
Definition Attributes.h:351
LLVM_ABI bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
LLVM_ABI DebugLoc getDebugValueLoc(DbgVariableRecord *DVR)
Produce a DebugLoc to use for each dbg.declare that is promoted to a dbg.value.
DWARFExpression::Operation Op
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:1963
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:565
LLVMAttributeRef wrap(Attribute Attr)
Definition Attributes.h:346
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:49
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
PointerUnion< Instruction *, DbgRecord * > DbgInstPtr
Definition DIBuilder.h:44
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
LLVM_ABI void updateLoopMetadataDebugLocations(Instruction &I, function_ref< Metadata *(Metadata *)> Updater)
Update the debug locations contained within the MD_loop metadata attached to the instruction I,...
@ DEBUG_METADATA_VERSION
Definition Metadata.h:53
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
Describes properties of a store that has a static size and offset into a some base storage.
Definition DebugInfo.h:295
Helper struct for trackAssignments, below.
Definition DebugInfo.h:242
DILocation * DL
Definition DebugInfo.h:244
DILocalVariable * Var
Definition DebugInfo.h:243