LLVM 22.0.0git
DebugInfoMetadata.cpp
Go to the documentation of this file.
1//===- DebugInfoMetadata.cpp - Implement debug info metadata --------------===//
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 debug info Metadata classes.
10//
11//===----------------------------------------------------------------------===//
12
14#include "LLVMContextImpl.h"
15#include "MetadataImpl.h"
16#include "llvm/ADT/SetVector.h"
20#include "llvm/IR/Function.h"
22#include "llvm/IR/Type.h"
23#include "llvm/IR/Value.h"
26
27#include <numeric>
28#include <optional>
29
30using namespace llvm;
31
32namespace llvm {
33// Use FS-AFDO discriminator.
35 "enable-fs-discriminator", cl::Hidden,
36 cl::desc("Enable adding flow sensitive discriminators"));
37
38// When true, preserves line and column number by picking one of the merged
39// location info in a deterministic manner to assist sample based PGO.
41 "pick-merged-source-locations", cl::init(false), cl::Hidden,
42 cl::desc("Preserve line and column number when merging locations."));
43} // namespace llvm
44
46 return (getTag() == dwarf::DW_TAG_LLVM_ptrauth_type ? 0 : SubclassData32);
47}
48
49const DIExpression::FragmentInfo DebugVariable::DefaultFragment = {
50 std::numeric_limits<uint64_t>::max(), std::numeric_limits<uint64_t>::min()};
51
53 : Variable(DVR->getVariable()),
54 Fragment(DVR->getExpression()->getFragmentInfo()),
55 InlinedAt(DVR->getDebugLoc().getInlinedAt()) {}
56
60
61DILocation::DILocation(LLVMContext &C, StorageType Storage, unsigned Line,
62 unsigned Column, uint64_t AtomGroup, uint8_t AtomRank,
63 ArrayRef<Metadata *> MDs, bool ImplicitCode)
64 : MDNode(C, DILocationKind, Storage, MDs), AtomGroup(AtomGroup),
65 AtomRank(AtomRank) {
66 assert(AtomRank <= 7 && "AtomRank number should fit in 3 bits");
67 if (AtomGroup)
68 C.updateDILocationAtomGroupWaterline(AtomGroup + 1);
69
70 assert((MDs.size() == 1 || MDs.size() == 2) &&
71 "Expected a scope and optional inlined-at");
72 // Set line and column.
73 assert(Column < (1u << 16) && "Expected 16-bit column");
74
75 SubclassData32 = Line;
76 SubclassData16 = Column;
77
78 setImplicitCode(ImplicitCode);
79}
80
81static void adjustColumn(unsigned &Column) {
82 // Set to unknown on overflow. We only have 16 bits to play with here.
83 if (Column >= (1u << 16))
84 Column = 0;
85}
86
87DILocation *DILocation::getImpl(LLVMContext &Context, unsigned Line,
88 unsigned Column, Metadata *Scope,
89 Metadata *InlinedAt, bool ImplicitCode,
90 uint64_t AtomGroup, uint8_t AtomRank,
91 StorageType Storage, bool ShouldCreate) {
92 // Fixup column.
94
95 if (Storage == Uniqued) {
96 if (auto *N = getUniqued(Context.pImpl->DILocations,
97 DILocationInfo::KeyTy(Line, Column, Scope,
99 AtomGroup, AtomRank)))
100 return N;
101 if (!ShouldCreate)
102 return nullptr;
103 } else {
104 assert(ShouldCreate && "Expected non-uniqued nodes to always be created");
105 }
106
108 Ops.push_back(Scope);
109 if (InlinedAt)
110 Ops.push_back(InlinedAt);
111 return storeImpl(new (Ops.size(), Storage)
112 DILocation(Context, Storage, Line, Column, AtomGroup,
113 AtomRank, Ops, ImplicitCode),
114 Storage, Context.pImpl->DILocations);
115}
116
118 if (Locs.empty())
119 return nullptr;
120 if (Locs.size() == 1)
121 return Locs[0];
122 auto *Merged = Locs[0];
123 for (DILocation *L : llvm::drop_begin(Locs)) {
124 Merged = getMergedLocation(Merged, L);
125 if (Merged == nullptr)
126 break;
127 }
128 return Merged;
129}
130
132 DIScope *NewParent) {
133 TempMDNode ClonedScope = LBB->clone();
134 cast<DILexicalBlockBase>(*ClonedScope).replaceScope(NewParent);
136 MDNode::replaceWithUniqued(std::move(ClonedScope)));
137}
138
139using LineColumn = std::pair<unsigned /* Line */, unsigned /* Column */>;
140
141/// Returns the location of DILocalScope, if present, or a default value.
143 assert(isa<DILocalScope>(S) && "Expected DILocalScope.");
144
146 return Default;
147 if (auto *LB = dyn_cast<DILexicalBlock>(S))
148 return {LB->getLine(), LB->getColumn()};
149 if (auto *SP = dyn_cast<DISubprogram>(S))
150 return {SP->getLine(), 0u};
151
152 llvm_unreachable("Unhandled type of DILocalScope.");
153}
154
155// Returns the nearest matching scope inside a subprogram.
156template <typename MatcherT>
157static std::pair<DIScope *, LineColumn>
159 MatcherT Matcher;
160
161 DIScope *S1 = L1->getScope();
162 DIScope *S2 = L2->getScope();
163
164 LineColumn Loc1(L1->getLine(), L1->getColumn());
165 for (; S1; S1 = S1->getScope()) {
166 Loc1 = getLocalScopeLocationOr(S1, Loc1);
167 Matcher.insert(S1, Loc1);
169 break;
170 }
171
172 LineColumn Loc2(L2->getLine(), L2->getColumn());
173 for (; S2; S2 = S2->getScope()) {
174 Loc2 = getLocalScopeLocationOr(S2, Loc2);
175
176 if (DIScope *S = Matcher.match(S2, Loc2))
177 return std::make_pair(S, Loc2);
178
179 if (isa<DISubprogram>(S2))
180 break;
181 }
182 return std::make_pair(nullptr, LineColumn(L2->getLine(), L2->getColumn()));
183}
184
185// Matches equal scopes.
188
189 void insert(DIScope *S, LineColumn Loc) { Scopes.insert(S); }
190
192 return Scopes.contains(S) ? S : nullptr;
193 }
194};
195
196// Matches scopes with the same location.
199 8>
201
203 Scopes[{S->getFile(), Loc}].insert(S);
204 }
205
207 auto ScopesAtLoc = Scopes.find({S->getFile(), Loc});
208 // No scope found with the given location.
209 if (ScopesAtLoc == Scopes.end())
210 return nullptr;
211
212 // Prefer S over other scopes with the same location.
213 if (ScopesAtLoc->second.contains(S))
214 return S;
215
216 if (!ScopesAtLoc->second.empty())
217 return *ScopesAtLoc->second.begin();
218
219 llvm_unreachable("Scopes must not have empty entries.");
220 }
221};
222
223DILocation *DILocation::getMergedLocation(DILocation *LocA, DILocation *LocB) {
224 if (LocA == LocB)
225 return LocA;
226
227 // For some use cases (SamplePGO), it is important to retain distinct source
228 // locations. When this flag is set, we choose arbitrarily between A and B,
229 // rather than computing a merged location using line 0, which is typically
230 // not useful for PGO. If one of them is null, then try to return one which is
231 // valid.
233 if (!LocA || !LocB)
234 return LocA ? LocA : LocB;
235
236 auto A = std::make_tuple(LocA->getLine(), LocA->getColumn(),
237 LocA->getDiscriminator(), LocA->getFilename(),
238 LocA->getDirectory());
239 auto B = std::make_tuple(LocB->getLine(), LocB->getColumn(),
240 LocB->getDiscriminator(), LocB->getFilename(),
241 LocB->getDirectory());
242 return A < B ? LocA : LocB;
243 }
244
245 if (!LocA || !LocB)
246 return nullptr;
247
248 LLVMContext &C = LocA->getContext();
249
250 using LocVec = SmallVector<const DILocation *>;
251 LocVec ALocs;
252 LocVec BLocs;
254 4>
255 ALookup;
256
257 // Walk through LocA and its inlined-at locations, populate them in ALocs and
258 // save the index for the subprogram and inlined-at pair, which we use to find
259 // a matching starting location in LocB's chain.
260 for (auto [L, I] = std::make_pair(LocA, 0U); L; L = L->getInlinedAt(), I++) {
261 ALocs.push_back(L);
262 auto Res = ALookup.try_emplace(
263 {L->getScope()->getSubprogram(), L->getInlinedAt()}, I);
264 assert(Res.second && "Multiple <SP, InlinedAt> pairs in a location chain?");
265 (void)Res;
266 }
267
268 LocVec::reverse_iterator ARIt = ALocs.rend();
269 LocVec::reverse_iterator BRIt = BLocs.rend();
270
271 // Populate BLocs and look for a matching starting location, the first
272 // location with the same subprogram and inlined-at location as in LocA's
273 // chain. Since the two locations have the same inlined-at location we do
274 // not need to look at those parts of the chains.
275 for (auto [L, I] = std::make_pair(LocB, 0U); L; L = L->getInlinedAt(), I++) {
276 BLocs.push_back(L);
277
278 if (ARIt != ALocs.rend())
279 // We have already found a matching starting location.
280 continue;
281
282 auto IT = ALookup.find({L->getScope()->getSubprogram(), L->getInlinedAt()});
283 if (IT == ALookup.end())
284 continue;
285
286 // The + 1 is to account for the &*rev_it = &(it - 1) relationship.
287 ARIt = LocVec::reverse_iterator(ALocs.begin() + IT->second + 1);
288 BRIt = LocVec::reverse_iterator(BLocs.begin() + I + 1);
289
290 // If we have found a matching starting location we do not need to add more
291 // locations to BLocs, since we will only look at location pairs preceding
292 // the matching starting location, and adding more elements to BLocs could
293 // invalidate the iterator that we initialized here.
294 break;
295 }
296
297 // Merge the two locations if possible, using the supplied
298 // inlined-at location for the created location.
299 auto *LocAIA = LocA->getInlinedAt();
300 auto *LocBIA = LocB->getInlinedAt();
301 auto MergeLocPair = [&C, LocAIA,
302 LocBIA](const DILocation *L1, const DILocation *L2,
303 DILocation *InlinedAt) -> DILocation * {
304 if (L1 == L2)
305 return DILocation::get(C, L1->getLine(), L1->getColumn(), L1->getScope(),
306 InlinedAt, L1->isImplicitCode(),
307 L1->getAtomGroup(), L1->getAtomRank());
308
309 // If the locations originate from different subprograms we can't produce
310 // a common location.
311 if (L1->getScope()->getSubprogram() != L2->getScope()->getSubprogram())
312 return nullptr;
313
314 // Find nearest common scope inside subprogram.
316 assert(Scope && "No common scope in the same subprogram?");
317
318 // Try using the nearest scope with common location if files are different.
319 if (Scope->getFile() != L1->getFile() || L1->getFile() != L2->getFile()) {
320 auto [CommonLocScope, CommonLoc] =
322
323 // If CommonLocScope is a DILexicalBlockBase, clone it and locate
324 // a new scope inside the nearest common scope to preserve
325 // lexical blocks structure.
326 if (auto *LBB = dyn_cast<DILexicalBlockBase>(CommonLocScope);
327 LBB && LBB != Scope)
328 CommonLocScope = cloneAndReplaceParentScope(LBB, Scope);
329
330 Scope = CommonLocScope;
331
332 // If files are still different, assume that L1 and L2 were "included"
333 // from CommonLoc. Use it as merged location.
334 if (Scope->getFile() != L1->getFile() || L1->getFile() != L2->getFile())
335 return DILocation::get(C, CommonLoc.first, CommonLoc.second,
336 CommonLocScope, InlinedAt);
337 }
338
339 bool SameLine = L1->getLine() == L2->getLine();
340 bool SameCol = L1->getColumn() == L2->getColumn();
341 unsigned Line = SameLine ? L1->getLine() : 0;
342 unsigned Col = SameLine && SameCol ? L1->getColumn() : 0;
343 bool IsImplicitCode = L1->isImplicitCode() && L2->isImplicitCode();
344
345 // Discard source location atom if the line becomes 0. And there's nothing
346 // further to do if neither location has an atom number.
347 if (!SameLine || !(L1->getAtomGroup() || L2->getAtomGroup()))
348 return DILocation::get(C, Line, Col, Scope, InlinedAt, IsImplicitCode,
349 /*AtomGroup*/ 0, /*AtomRank*/ 0);
350
351 uint64_t Group = 0;
352 uint64_t Rank = 0;
353 // If we're preserving the same matching inlined-at field we can
354 // preserve the atom.
355 if (LocBIA == LocAIA && InlinedAt == LocBIA) {
356 // Deterministically keep the lowest non-zero ranking atom group
357 // number.
358 // FIXME: It would be nice if we could track that an instruction
359 // belongs to two source atoms.
360 bool UseL1Atom = [L1, L2]() {
361 if (L1->getAtomRank() == L2->getAtomRank()) {
362 // Arbitrarily choose the lowest non-zero group number.
363 if (!L1->getAtomGroup() || !L2->getAtomGroup())
364 return !L2->getAtomGroup();
365 return L1->getAtomGroup() < L2->getAtomGroup();
366 }
367 // Choose the lowest non-zero rank.
368 if (!L1->getAtomRank() || !L2->getAtomRank())
369 return !L2->getAtomRank();
370 return L1->getAtomRank() < L2->getAtomRank();
371 }();
372 Group = UseL1Atom ? L1->getAtomGroup() : L2->getAtomGroup();
373 Rank = UseL1Atom ? L1->getAtomRank() : L2->getAtomRank();
374 } else {
375 // If either instruction is part of a source atom, reassign it a new
376 // atom group. This essentially regresses to non-key-instructions
377 // behaviour (now that it's the only instruction in its group it'll
378 // probably get is_stmt applied).
379 Group = C.incNextDILocationAtomGroup();
380 Rank = 1;
381 }
382 return DILocation::get(C, Line, Col, Scope, InlinedAt, IsImplicitCode,
383 Group, Rank);
384 };
385
386 DILocation *Result = ARIt != ALocs.rend() ? (*ARIt)->getInlinedAt() : nullptr;
387
388 // If we have found a common starting location, walk up the inlined-at chains
389 // and try to produce common locations.
390 for (; ARIt != ALocs.rend() && BRIt != BLocs.rend(); ++ARIt, ++BRIt) {
391 DILocation *Tmp = MergeLocPair(*ARIt, *BRIt, Result);
392
393 if (!Tmp)
394 // We have walked up to a point in the chains where the two locations
395 // are irreconsilable. At this point Result contains the nearest common
396 // location in the inlined-at chains of LocA and LocB, so we break here.
397 break;
398
399 Result = Tmp;
400 }
401
402 if (Result)
403 return Result;
404
405 // We ended up with LocA and LocB as irreconsilable locations. Produce a
406 // location at 0:0 with one of the locations' scope. The function has
407 // historically picked A's scope, and a nullptr inlined-at location, so that
408 // behavior is mimicked here but I am not sure if this is always the correct
409 // way to handle this.
410 // Key Instructions: it's fine to drop atom group and rank here, as line 0
411 // is a nonsensical is_stmt location.
412 return DILocation::get(C, 0, 0, LocA->getScope(), nullptr, false,
413 /*AtomGroup*/ 0, /*AtomRank*/ 0);
414}
415
416std::optional<unsigned>
417DILocation::encodeDiscriminator(unsigned BD, unsigned DF, unsigned CI) {
418 std::array<unsigned, 3> Components = {BD, DF, CI};
419 uint64_t RemainingWork = 0U;
420 // We use RemainingWork to figure out if we have no remaining components to
421 // encode. For example: if BD != 0 but DF == 0 && CI == 0, we don't need to
422 // encode anything for the latter 2.
423 // Since any of the input components is at most 32 bits, their sum will be
424 // less than 34 bits, and thus RemainingWork won't overflow.
425 RemainingWork =
426 std::accumulate(Components.begin(), Components.end(), RemainingWork);
427
428 int I = 0;
429 unsigned Ret = 0;
430 unsigned NextBitInsertionIndex = 0;
431 while (RemainingWork > 0) {
432 unsigned C = Components[I++];
433 RemainingWork -= C;
434 unsigned EC = encodeComponent(C);
435 Ret |= (EC << NextBitInsertionIndex);
436 NextBitInsertionIndex += encodingBits(C);
437 }
438
439 // Encoding may be unsuccessful because of overflow. We determine success by
440 // checking equivalence of components before & after encoding. Alternatively,
441 // we could determine Success during encoding, but the current alternative is
442 // simpler.
443 unsigned TBD, TDF, TCI = 0;
444 decodeDiscriminator(Ret, TBD, TDF, TCI);
445 if (TBD == BD && TDF == DF && TCI == CI)
446 return Ret;
447 return std::nullopt;
448}
449
458
460 return StringSwitch<DIFlags>(Flag)
461#define HANDLE_DI_FLAG(ID, NAME) .Case("DIFlag" #NAME, Flag##NAME)
462#include "llvm/IR/DebugInfoFlags.def"
463 .Default(DINode::FlagZero);
464}
465
467 switch (Flag) {
468#define HANDLE_DI_FLAG(ID, NAME) \
469 case Flag##NAME: \
470 return "DIFlag" #NAME;
471#include "llvm/IR/DebugInfoFlags.def"
472 }
473 return "";
474}
475
477 SmallVectorImpl<DIFlags> &SplitFlags) {
478 // Flags that are packed together need to be specially handled, so
479 // that, for example, we emit "DIFlagPublic" and not
480 // "DIFlagPrivate | DIFlagProtected".
481 if (DIFlags A = Flags & FlagAccessibility) {
482 if (A == FlagPrivate)
483 SplitFlags.push_back(FlagPrivate);
484 else if (A == FlagProtected)
485 SplitFlags.push_back(FlagProtected);
486 else
487 SplitFlags.push_back(FlagPublic);
488 Flags &= ~A;
489 }
490 if (DIFlags R = Flags & FlagPtrToMemberRep) {
491 if (R == FlagSingleInheritance)
492 SplitFlags.push_back(FlagSingleInheritance);
493 else if (R == FlagMultipleInheritance)
494 SplitFlags.push_back(FlagMultipleInheritance);
495 else
496 SplitFlags.push_back(FlagVirtualInheritance);
497 Flags &= ~R;
498 }
499 if ((Flags & FlagIndirectVirtualBase) == FlagIndirectVirtualBase) {
500 Flags &= ~FlagIndirectVirtualBase;
501 SplitFlags.push_back(FlagIndirectVirtualBase);
502 }
503
504#define HANDLE_DI_FLAG(ID, NAME) \
505 if (DIFlags Bit = Flags & Flag##NAME) { \
506 SplitFlags.push_back(Bit); \
507 Flags &= ~Bit; \
508 }
509#include "llvm/IR/DebugInfoFlags.def"
510 return Flags;
511}
512
514 if (auto *T = dyn_cast<DIType>(this))
515 return T->getScope();
516
517 if (auto *SP = dyn_cast<DISubprogram>(this))
518 return SP->getScope();
519
520 if (auto *LB = dyn_cast<DILexicalBlockBase>(this))
521 return LB->getScope();
522
523 if (auto *NS = dyn_cast<DINamespace>(this))
524 return NS->getScope();
525
526 if (auto *CB = dyn_cast<DICommonBlock>(this))
527 return CB->getScope();
528
529 if (auto *M = dyn_cast<DIModule>(this))
530 return M->getScope();
531
532 assert((isa<DIFile>(this) || isa<DICompileUnit>(this)) &&
533 "Unhandled type of scope.");
534 return nullptr;
535}
536
538 if (auto *T = dyn_cast<DIType>(this))
539 return T->getName();
540 if (auto *SP = dyn_cast<DISubprogram>(this))
541 return SP->getName();
542 if (auto *NS = dyn_cast<DINamespace>(this))
543 return NS->getName();
544 if (auto *CB = dyn_cast<DICommonBlock>(this))
545 return CB->getName();
546 if (auto *M = dyn_cast<DIModule>(this))
547 return M->getName();
549 isa<DICompileUnit>(this)) &&
550 "Unhandled type of scope.");
551 return "";
552}
553
554#ifndef NDEBUG
555static bool isCanonical(const MDString *S) {
556 return !S || !S->getString().empty();
557}
558#endif
559
561GenericDINode *GenericDINode::getImpl(LLVMContext &Context, unsigned Tag,
562 MDString *Header,
563 ArrayRef<Metadata *> DwarfOps,
564 StorageType Storage, bool ShouldCreate) {
565 unsigned Hash = 0;
566 if (Storage == Uniqued) {
567 GenericDINodeInfo::KeyTy Key(Tag, Header, DwarfOps);
568 if (auto *N = getUniqued(Context.pImpl->GenericDINodes, Key))
569 return N;
570 if (!ShouldCreate)
571 return nullptr;
572 Hash = Key.getHash();
573 } else {
574 assert(ShouldCreate && "Expected non-uniqued nodes to always be created");
575 }
576
577 // Use a nullptr for empty headers.
578 assert(isCanonical(Header) && "Expected canonical MDString");
579 Metadata *PreOps[] = {Header};
580 return storeImpl(new (DwarfOps.size() + 1, Storage) GenericDINode(
581 Context, Storage, Hash, Tag, PreOps, DwarfOps),
582 Storage, Context.pImpl->GenericDINodes);
583}
584
585void GenericDINode::recalculateHash() {
586 setHash(GenericDINodeInfo::KeyTy::calculateHash(this));
587}
588
589#define UNWRAP_ARGS_IMPL(...) __VA_ARGS__
590#define UNWRAP_ARGS(ARGS) UNWRAP_ARGS_IMPL ARGS
591#define DEFINE_GETIMPL_LOOKUP(CLASS, ARGS) \
592 do { \
593 if (Storage == Uniqued) { \
594 if (auto *N = getUniqued(Context.pImpl->CLASS##s, \
595 CLASS##Info::KeyTy(UNWRAP_ARGS(ARGS)))) \
596 return N; \
597 if (!ShouldCreate) \
598 return nullptr; \
599 } else { \
600 assert(ShouldCreate && \
601 "Expected non-uniqued nodes to always be created"); \
602 } \
603 } while (false)
604#define DEFINE_GETIMPL_STORE(CLASS, ARGS, OPS) \
605 return storeImpl(new (std::size(OPS), Storage) \
606 CLASS(Context, Storage, UNWRAP_ARGS(ARGS), OPS), \
607 Storage, Context.pImpl->CLASS##s)
608#define DEFINE_GETIMPL_STORE_NO_OPS(CLASS, ARGS) \
609 return storeImpl(new (0u, Storage) \
610 CLASS(Context, Storage, UNWRAP_ARGS(ARGS)), \
611 Storage, Context.pImpl->CLASS##s)
612#define DEFINE_GETIMPL_STORE_NO_CONSTRUCTOR_ARGS(CLASS, OPS) \
613 return storeImpl(new (std::size(OPS), Storage) CLASS(Context, Storage, OPS), \
614 Storage, Context.pImpl->CLASS##s)
615#define DEFINE_GETIMPL_STORE_N(CLASS, ARGS, OPS, NUM_OPS) \
616 return storeImpl(new (NUM_OPS, Storage) \
617 CLASS(Context, Storage, UNWRAP_ARGS(ARGS), OPS), \
618 Storage, Context.pImpl->CLASS##s)
619
620DISubrange::DISubrange(LLVMContext &C, StorageType Storage,
622 : DINode(C, DISubrangeKind, Storage, dwarf::DW_TAG_subrange_type, Ops) {}
623DISubrange *DISubrange::getImpl(LLVMContext &Context, int64_t Count, int64_t Lo,
624 StorageType Storage, bool ShouldCreate) {
627 auto *LB = ConstantAsMetadata::get(
629 return getImpl(Context, CountNode, LB, nullptr, nullptr, Storage,
630 ShouldCreate);
631}
632
633DISubrange *DISubrange::getImpl(LLVMContext &Context, Metadata *CountNode,
634 int64_t Lo, StorageType Storage,
635 bool ShouldCreate) {
636 auto *LB = ConstantAsMetadata::get(
638 return getImpl(Context, CountNode, LB, nullptr, nullptr, Storage,
639 ShouldCreate);
640}
641
642DISubrange *DISubrange::getImpl(LLVMContext &Context, Metadata *CountNode,
643 Metadata *LB, Metadata *UB, Metadata *Stride,
644 StorageType Storage, bool ShouldCreate) {
645 DEFINE_GETIMPL_LOOKUP(DISubrange, (CountNode, LB, UB, Stride));
646 Metadata *Ops[] = {CountNode, LB, UB, Stride};
648}
649
650DISubrange::BoundType DISubrange::getCount() const {
651 Metadata *CB = getRawCountNode();
652 if (!CB)
653 return BoundType();
654
656 isa<DIExpression>(CB)) &&
657 "Count must be signed constant or DIVariable or DIExpression");
658
659 if (auto *MD = dyn_cast<ConstantAsMetadata>(CB))
660 return BoundType(cast<ConstantInt>(MD->getValue()));
661
662 if (auto *MD = dyn_cast<DIVariable>(CB))
663 return BoundType(MD);
664
665 if (auto *MD = dyn_cast<DIExpression>(CB))
666 return BoundType(MD);
667
668 return BoundType();
669}
670
671DISubrange::BoundType DISubrange::getLowerBound() const {
672 Metadata *LB = getRawLowerBound();
673 if (!LB)
674 return BoundType();
675
677 isa<DIExpression>(LB)) &&
678 "LowerBound must be signed constant or DIVariable or DIExpression");
679
680 if (auto *MD = dyn_cast<ConstantAsMetadata>(LB))
681 return BoundType(cast<ConstantInt>(MD->getValue()));
682
683 if (auto *MD = dyn_cast<DIVariable>(LB))
684 return BoundType(MD);
685
686 if (auto *MD = dyn_cast<DIExpression>(LB))
687 return BoundType(MD);
688
689 return BoundType();
690}
691
692DISubrange::BoundType DISubrange::getUpperBound() const {
693 Metadata *UB = getRawUpperBound();
694 if (!UB)
695 return BoundType();
696
698 isa<DIExpression>(UB)) &&
699 "UpperBound must be signed constant or DIVariable or DIExpression");
700
701 if (auto *MD = dyn_cast<ConstantAsMetadata>(UB))
702 return BoundType(cast<ConstantInt>(MD->getValue()));
703
704 if (auto *MD = dyn_cast<DIVariable>(UB))
705 return BoundType(MD);
706
707 if (auto *MD = dyn_cast<DIExpression>(UB))
708 return BoundType(MD);
709
710 return BoundType();
711}
712
713DISubrange::BoundType DISubrange::getStride() const {
714 Metadata *ST = getRawStride();
715 if (!ST)
716 return BoundType();
717
719 isa<DIExpression>(ST)) &&
720 "Stride must be signed constant or DIVariable or DIExpression");
721
722 if (auto *MD = dyn_cast<ConstantAsMetadata>(ST))
723 return BoundType(cast<ConstantInt>(MD->getValue()));
724
725 if (auto *MD = dyn_cast<DIVariable>(ST))
726 return BoundType(MD);
727
728 if (auto *MD = dyn_cast<DIExpression>(ST))
729 return BoundType(MD);
730
731 return BoundType();
732}
733DIGenericSubrange::DIGenericSubrange(LLVMContext &C, StorageType Storage,
735 : DINode(C, DIGenericSubrangeKind, Storage, dwarf::DW_TAG_generic_subrange,
736 Ops) {}
737
738DIGenericSubrange *DIGenericSubrange::getImpl(LLVMContext &Context,
739 Metadata *CountNode, Metadata *LB,
740 Metadata *UB, Metadata *Stride,
741 StorageType Storage,
742 bool ShouldCreate) {
743 DEFINE_GETIMPL_LOOKUP(DIGenericSubrange, (CountNode, LB, UB, Stride));
744 Metadata *Ops[] = {CountNode, LB, UB, Stride};
746}
747
750 if (!CB)
751 return BoundType();
752
754 "Count must be signed constant or DIVariable or DIExpression");
755
756 if (auto *MD = dyn_cast<DIVariable>(CB))
757 return BoundType(MD);
758
759 if (auto *MD = dyn_cast<DIExpression>(CB))
760 return BoundType(MD);
761
762 return BoundType();
763}
764
767 if (!LB)
768 return BoundType();
769
771 "LowerBound must be signed constant or DIVariable or DIExpression");
772
773 if (auto *MD = dyn_cast<DIVariable>(LB))
774 return BoundType(MD);
775
776 if (auto *MD = dyn_cast<DIExpression>(LB))
777 return BoundType(MD);
778
779 return BoundType();
780}
781
784 if (!UB)
785 return BoundType();
786
788 "UpperBound must be signed constant or DIVariable or DIExpression");
789
790 if (auto *MD = dyn_cast<DIVariable>(UB))
791 return BoundType(MD);
792
793 if (auto *MD = dyn_cast<DIExpression>(UB))
794 return BoundType(MD);
795
796 return BoundType();
797}
798
800 Metadata *ST = getRawStride();
801 if (!ST)
802 return BoundType();
803
805 "Stride must be signed constant or DIVariable or DIExpression");
806
807 if (auto *MD = dyn_cast<DIVariable>(ST))
808 return BoundType(MD);
809
810 if (auto *MD = dyn_cast<DIExpression>(ST))
811 return BoundType(MD);
812
813 return BoundType();
814}
815
816DISubrangeType::DISubrangeType(LLVMContext &C, StorageType Storage,
817 unsigned Line, uint32_t AlignInBits,
818 DIFlags Flags, ArrayRef<Metadata *> Ops)
819 : DIType(C, DISubrangeTypeKind, Storage, dwarf::DW_TAG_subrange_type, Line,
820 AlignInBits, 0, Flags, Ops) {}
821
822DISubrangeType *DISubrangeType::getImpl(
823 LLVMContext &Context, MDString *Name, Metadata *File, unsigned Line,
824 Metadata *Scope, Metadata *SizeInBits, uint32_t AlignInBits, DIFlags Flags,
825 Metadata *BaseType, Metadata *LowerBound, Metadata *UpperBound,
826 Metadata *Stride, Metadata *Bias, StorageType Storage, bool ShouldCreate) {
827 assert(isCanonical(Name) && "Expected canonical MDString");
829 AlignInBits, Flags, BaseType,
831 Metadata *Ops[] = {File, Scope, Name, SizeInBits, nullptr,
833 DEFINE_GETIMPL_STORE(DISubrangeType, (Line, AlignInBits, Flags), Ops);
834}
835
837DISubrangeType::convertRawToBound(Metadata *IN) const {
838 if (!IN)
839 return BoundType();
840
843
844 if (auto *MD = dyn_cast<ConstantAsMetadata>(IN))
845 return BoundType(cast<ConstantInt>(MD->getValue()));
846
847 if (auto *MD = dyn_cast<DIVariable>(IN))
848 return BoundType(MD);
849
850 if (auto *MD = dyn_cast<DIExpression>(IN))
851 return BoundType(MD);
852
853 return BoundType();
854}
855
856DIEnumerator::DIEnumerator(LLVMContext &C, StorageType Storage,
857 const APInt &Value, bool IsUnsigned,
859 : DINode(C, DIEnumeratorKind, Storage, dwarf::DW_TAG_enumerator, Ops),
860 Value(Value) {
861 SubclassData32 = IsUnsigned;
862}
863DIEnumerator *DIEnumerator::getImpl(LLVMContext &Context, const APInt &Value,
864 bool IsUnsigned, MDString *Name,
865 StorageType Storage, bool ShouldCreate) {
866 assert(isCanonical(Name) && "Expected canonical MDString");
867 DEFINE_GETIMPL_LOOKUP(DIEnumerator, (Value, IsUnsigned, Name));
868 Metadata *Ops[] = {Name};
869 DEFINE_GETIMPL_STORE(DIEnumerator, (Value, IsUnsigned), Ops);
870}
871
874 uint32_t AlignInBits, unsigned Encoding,
876 StorageType Storage, bool ShouldCreate) {
877 assert(isCanonical(Name) && "Expected canonical MDString");
879 Encoding, NumExtraInhabitants, Flags));
880 Metadata *Ops[] = {nullptr, nullptr, Name, SizeInBits, nullptr};
883 Ops);
884}
885
886std::optional<DIBasicType::Signedness> DIBasicType::getSignedness() const {
887 switch (getEncoding()) {
888 case dwarf::DW_ATE_signed:
889 case dwarf::DW_ATE_signed_char:
890 case dwarf::DW_ATE_signed_fixed:
891 return Signedness::Signed;
892 case dwarf::DW_ATE_unsigned:
893 case dwarf::DW_ATE_unsigned_char:
894 case dwarf::DW_ATE_unsigned_fixed:
896 default:
897 return std::nullopt;
898 }
899}
900
902DIFixedPointType::getImpl(LLVMContext &Context, unsigned Tag, MDString *Name,
903 Metadata *SizeInBits, uint32_t AlignInBits,
904 unsigned Encoding, DIFlags Flags, unsigned Kind,
905 int Factor, APInt Numerator, APInt Denominator,
906 StorageType Storage, bool ShouldCreate) {
909 Kind, Factor, Numerator, Denominator));
910 Metadata *Ops[] = {nullptr, nullptr, Name, SizeInBits, nullptr};
913 (Tag, AlignInBits, Encoding, Flags, Kind, Factor, Numerator, Denominator),
914 Ops);
915}
916
918 return getEncoding() == dwarf::DW_ATE_signed_fixed;
919}
920
921std::optional<DIFixedPointType::FixedPointKind>
924 .Case("Binary", FixedPointBinary)
925 .Case("Decimal", FixedPointDecimal)
926 .Case("Rational", FixedPointRational)
927 .Default(std::nullopt);
928}
929
931 switch (V) {
932 case FixedPointBinary:
933 return "Binary";
935 return "Decimal";
937 return "Rational";
938 }
939 return nullptr;
940}
941
942DIStringType *DIStringType::getImpl(LLVMContext &Context, unsigned Tag,
943 MDString *Name, Metadata *StringLength,
944 Metadata *StringLengthExp,
945 Metadata *StringLocationExp,
946 Metadata *SizeInBits, uint32_t AlignInBits,
947 unsigned Encoding, StorageType Storage,
948 bool ShouldCreate) {
949 assert(isCanonical(Name) && "Expected canonical MDString");
953 Metadata *Ops[] = {nullptr, nullptr, Name,
954 SizeInBits, nullptr, StringLength,
957}
959 assert(getTag() == dwarf::DW_TAG_ptr_to_member_type);
961}
963 assert(getTag() == dwarf::DW_TAG_inheritance);
965 if (auto *CI = dyn_cast_or_null<ConstantInt>(CM->getValue()))
966 return static_cast<uint32_t>(CI->getZExtValue());
967 return 0;
968}
970 assert(getTag() == dwarf::DW_TAG_member && isBitField());
972 return C->getValue();
973 return nullptr;
974}
975
977 assert((getTag() == dwarf::DW_TAG_member ||
978 getTag() == dwarf::DW_TAG_variable) &&
981 return C->getValue();
982 return nullptr;
983}
985 assert(getTag() == dwarf::DW_TAG_member && !isStaticMember());
987 return C->getValue();
988 return nullptr;
989}
990
991DIDerivedType *DIDerivedType::getImpl(
992 LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
993 unsigned Line, Metadata *Scope, Metadata *BaseType, Metadata *SizeInBits,
994 uint32_t AlignInBits, Metadata *OffsetInBits,
995 std::optional<unsigned> DWARFAddressSpace,
996 std::optional<PtrAuthData> PtrAuthData, DIFlags Flags, Metadata *ExtraData,
997 Metadata *Annotations, StorageType Storage, bool ShouldCreate) {
998 assert(isCanonical(Name) && "Expected canonical MDString");
1000 (Tag, Name, File, Line, Scope, BaseType, SizeInBits,
1002 PtrAuthData, Flags, ExtraData, Annotations));
1003 Metadata *Ops[] = {File, Scope, Name, SizeInBits,
1004 OffsetInBits, BaseType, ExtraData, Annotations};
1007 (Tag, Line, AlignInBits, DWARFAddressSpace, PtrAuthData, Flags), Ops);
1008}
1009
1010std::optional<DIDerivedType::PtrAuthData>
1011DIDerivedType::getPtrAuthData() const {
1012 return getTag() == dwarf::DW_TAG_LLVM_ptrauth_type
1013 ? std::make_optional<PtrAuthData>(SubclassData32)
1014 : std::nullopt;
1015}
1016
1017DICompositeType *DICompositeType::getImpl(
1018 LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
1019 unsigned Line, Metadata *Scope, Metadata *BaseType, Metadata *SizeInBits,
1020 uint32_t AlignInBits, Metadata *OffsetInBits, DIFlags Flags,
1021 Metadata *Elements, unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1022 Metadata *VTableHolder, Metadata *TemplateParams, MDString *Identifier,
1023 Metadata *Discriminator, Metadata *DataLocation, Metadata *Associated,
1024 Metadata *Allocated, Metadata *Rank, Metadata *Annotations,
1025 Metadata *Specification, uint32_t NumExtraInhabitants, Metadata *BitStride,
1026 StorageType Storage, bool ShouldCreate) {
1027 assert(isCanonical(Name) && "Expected canonical MDString");
1028
1029 // Keep this in sync with buildODRType.
1031 DICompositeType,
1041 DEFINE_GETIMPL_STORE(DICompositeType,
1042 (Tag, Line, RuntimeLang, AlignInBits,
1043 NumExtraInhabitants, EnumKind, Flags),
1044 Ops);
1045}
1046
1048 LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name,
1052 Metadata *Elements, unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1056 assert(!Identifier.getString().empty() && "Expected valid identifier");
1057 if (!Context.isODRUniquingDebugTypes())
1058 return nullptr;
1059 auto *&CT = (*Context.pImpl->DITypeMap)[&Identifier];
1060 if (!CT)
1061 return CT = DICompositeType::getDistinct(
1062 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits,
1063 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
1067 if (CT->getTag() != Tag)
1068 return nullptr;
1069
1070 // Only mutate CT if it's a forward declaration and the new operands aren't.
1071 assert(CT->getRawIdentifier() == &Identifier && "Wrong ODR identifier?");
1072 if (!CT->isForwardDecl() || (Flags & DINode::FlagFwdDecl))
1073 return CT;
1074
1075 // Mutate CT in place. Keep this in sync with getImpl.
1076 CT->mutate(Tag, Line, RuntimeLang, AlignInBits, NumExtraInhabitants, EnumKind,
1077 Flags);
1083 assert((std::end(Ops) - std::begin(Ops)) == (int)CT->getNumOperands() &&
1084 "Mismatched number of operands");
1085 for (unsigned I = 0, E = CT->getNumOperands(); I != E; ++I)
1086 if (Ops[I] != CT->getOperand(I))
1087 CT->setOperand(I, Ops[I]);
1088 return CT;
1089}
1090
1091DICompositeType *DICompositeType::getODRType(
1092 LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name,
1093 Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType,
1094 Metadata *SizeInBits, uint32_t AlignInBits, Metadata *OffsetInBits,
1095 Metadata *Specification, uint32_t NumExtraInhabitants, DIFlags Flags,
1096 Metadata *Elements, unsigned RuntimeLang, std::optional<uint32_t> EnumKind,
1097 Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator,
1098 Metadata *DataLocation, Metadata *Associated, Metadata *Allocated,
1099 Metadata *Rank, Metadata *Annotations, Metadata *BitStride) {
1100 assert(!Identifier.getString().empty() && "Expected valid identifier");
1101 if (!Context.isODRUniquingDebugTypes())
1102 return nullptr;
1103 auto *&CT = (*Context.pImpl->DITypeMap)[&Identifier];
1104 if (!CT) {
1106 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits,
1111 } else {
1112 if (CT->getTag() != Tag)
1113 return nullptr;
1114 }
1115 return CT;
1116}
1117
1120 assert(!Identifier.getString().empty() && "Expected valid identifier");
1121 if (!Context.isODRUniquingDebugTypes())
1122 return nullptr;
1123 return Context.pImpl->DITypeMap->lookup(&Identifier);
1124}
1125DISubroutineType::DISubroutineType(LLVMContext &C, StorageType Storage,
1126 DIFlags Flags, uint8_t CC,
1128 : DIType(C, DISubroutineTypeKind, Storage, dwarf::DW_TAG_subroutine_type, 0,
1129 0, 0, Flags, Ops),
1130 CC(CC) {}
1131
1132DISubroutineType *DISubroutineType::getImpl(LLVMContext &Context, DIFlags Flags,
1133 uint8_t CC, Metadata *TypeArray,
1134 StorageType Storage,
1135 bool ShouldCreate) {
1137 Metadata *Ops[] = {nullptr, nullptr, nullptr, nullptr, nullptr, TypeArray};
1138 DEFINE_GETIMPL_STORE(DISubroutineType, (Flags, CC), Ops);
1139}
1140
1141DIFile::DIFile(LLVMContext &C, StorageType Storage,
1142 std::optional<ChecksumInfo<MDString *>> CS, MDString *Src,
1144 : DIScope(C, DIFileKind, Storage, dwarf::DW_TAG_file_type, Ops),
1145 Checksum(CS), Source(Src) {}
1146
1147// FIXME: Implement this string-enum correspondence with a .def file and macros,
1148// so that the association is explicit rather than implied.
1149static const char *ChecksumKindName[DIFile::CSK_Last] = {
1150 "CSK_MD5",
1151 "CSK_SHA1",
1152 "CSK_SHA256",
1153};
1154
1155StringRef DIFile::getChecksumKindAsString(ChecksumKind CSKind) {
1156 assert(CSKind <= DIFile::CSK_Last && "Invalid checksum kind");
1157 // The first space was originally the CSK_None variant, which is now
1158 // obsolete, but the space is still reserved in ChecksumKind, so we account
1159 // for it here.
1160 return ChecksumKindName[CSKind - 1];
1161}
1162
1163std::optional<DIFile::ChecksumKind>
1166 .Case("CSK_MD5", DIFile::CSK_MD5)
1167 .Case("CSK_SHA1", DIFile::CSK_SHA1)
1168 .Case("CSK_SHA256", DIFile::CSK_SHA256)
1169 .Default(std::nullopt);
1170}
1171
1172DIFile *DIFile::getImpl(LLVMContext &Context, MDString *Filename,
1173 MDString *Directory,
1174 std::optional<DIFile::ChecksumInfo<MDString *>> CS,
1175 MDString *Source, StorageType Storage,
1176 bool ShouldCreate) {
1177 assert(isCanonical(Filename) && "Expected canonical MDString");
1178 assert(isCanonical(Directory) && "Expected canonical MDString");
1179 assert((!CS || isCanonical(CS->Value)) && "Expected canonical MDString");
1180 // We do *NOT* expect Source to be a canonical MDString because nullptr
1181 // means none, so we need something to represent the empty file.
1183 Metadata *Ops[] = {Filename, Directory, CS ? CS->Value : nullptr, Source};
1185}
1186DICompileUnit::DICompileUnit(LLVMContext &C, StorageType Storage,
1188 bool IsOptimized, unsigned RuntimeVersion,
1189 unsigned EmissionKind, uint64_t DWOId,
1190 bool SplitDebugInlining,
1191 bool DebugInfoForProfiling, unsigned NameTableKind,
1192 bool RangesBaseAddress, ArrayRef<Metadata *> Ops)
1193 : DIScope(C, DICompileUnitKind, Storage, dwarf::DW_TAG_compile_unit, Ops),
1194 SourceLanguage(SourceLanguage), RuntimeVersion(RuntimeVersion),
1196 IsOptimized(IsOptimized), SplitDebugInlining(SplitDebugInlining),
1197 DebugInfoForProfiling(DebugInfoForProfiling),
1198 RangesBaseAddress(RangesBaseAddress) {
1200}
1201
1202DICompileUnit *DICompileUnit::getImpl(
1204 MDString *Producer, bool IsOptimized, MDString *Flags,
1205 unsigned RuntimeVersion, MDString *SplitDebugFilename,
1206 unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes,
1207 Metadata *GlobalVariables, Metadata *ImportedEntities, Metadata *Macros,
1208 uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling,
1209 unsigned NameTableKind, bool RangesBaseAddress, MDString *SysRoot,
1210 MDString *SDK, StorageType Storage, bool ShouldCreate) {
1211 assert(Storage != Uniqued && "Cannot unique DICompileUnit");
1212 assert(isCanonical(Producer) && "Expected canonical MDString");
1213 assert(isCanonical(Flags) && "Expected canonical MDString");
1214 assert(isCanonical(SplitDebugFilename) && "Expected canonical MDString");
1215
1216 Metadata *Ops[] = {File,
1217 Producer,
1218 Flags,
1220 EnumTypes,
1224 Macros,
1225 SysRoot,
1226 SDK};
1227 return storeImpl(new (std::size(Ops), Storage) DICompileUnit(
1228 Context, Storage, SourceLanguage, IsOptimized,
1229 RuntimeVersion, EmissionKind, DWOId, SplitDebugInlining,
1230 DebugInfoForProfiling, NameTableKind, RangesBaseAddress,
1231 Ops),
1232 Storage);
1233}
1234
1235std::optional<DICompileUnit::DebugEmissionKind>
1238 .Case("NoDebug", NoDebug)
1239 .Case("FullDebug", FullDebug)
1240 .Case("LineTablesOnly", LineTablesOnly)
1241 .Case("DebugDirectivesOnly", DebugDirectivesOnly)
1242 .Default(std::nullopt);
1243}
1244
1245std::optional<DICompileUnit::DebugNameTableKind>
1254
1256 switch (EK) {
1257 case NoDebug:
1258 return "NoDebug";
1259 case FullDebug:
1260 return "FullDebug";
1261 case LineTablesOnly:
1262 return "LineTablesOnly";
1264 return "DebugDirectivesOnly";
1265 }
1266 return nullptr;
1267}
1268
1270 switch (NTK) {
1272 return nullptr;
1274 return "GNU";
1276 return "Apple";
1278 return "None";
1279 }
1280 return nullptr;
1281}
1282DISubprogram::DISubprogram(LLVMContext &C, StorageType Storage, unsigned Line,
1283 unsigned ScopeLine, unsigned VirtualIndex,
1284 int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags,
1285 bool UsesKeyInstructions, ArrayRef<Metadata *> Ops)
1286 : DILocalScope(C, DISubprogramKind, Storage, dwarf::DW_TAG_subprogram, Ops),
1287 Line(Line), ScopeLine(ScopeLine), VirtualIndex(VirtualIndex),
1288 ThisAdjustment(ThisAdjustment), Flags(Flags), SPFlags(SPFlags) {
1289 static_assert(dwarf::DW_VIRTUALITY_max < 4, "Virtuality out of range");
1290 SubclassData1 = UsesKeyInstructions;
1291}
1293DISubprogram::toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized,
1294 unsigned Virtuality, bool IsMainSubprogram) {
1295 // We're assuming virtuality is the low-order field.
1296 static_assert(int(SPFlagVirtual) == int(dwarf::DW_VIRTUALITY_virtual) &&
1297 int(SPFlagPureVirtual) ==
1298 int(dwarf::DW_VIRTUALITY_pure_virtual),
1299 "Virtuality constant mismatch");
1300 return static_cast<DISPFlags>(
1301 (Virtuality & SPFlagVirtuality) |
1302 (IsLocalToUnit ? SPFlagLocalToUnit : SPFlagZero) |
1303 (IsDefinition ? SPFlagDefinition : SPFlagZero) |
1304 (IsOptimized ? SPFlagOptimized : SPFlagZero) |
1305 (IsMainSubprogram ? SPFlagMainSubprogram : SPFlagZero));
1306}
1307
1309 if (auto *Block = dyn_cast<DILexicalBlockBase>(this))
1310 return Block->getScope()->getSubprogram();
1311 return const_cast<DISubprogram *>(cast<DISubprogram>(this));
1312}
1313
1315 if (auto *File = dyn_cast<DILexicalBlockFile>(this))
1316 return File->getScope()->getNonLexicalBlockFileScope();
1317 return const_cast<DILocalScope *>(this);
1318}
1319
1321 DILocalScope &RootScope, DISubprogram &NewSP, LLVMContext &Ctx,
1323 SmallVector<DIScope *> ScopeChain;
1324 DIScope *CachedResult = nullptr;
1325
1326 for (DIScope *Scope = &RootScope; !isa<DISubprogram>(Scope);
1327 Scope = Scope->getScope()) {
1328 if (auto It = Cache.find(Scope); It != Cache.end()) {
1329 CachedResult = cast<DIScope>(It->second);
1330 break;
1331 }
1332 ScopeChain.push_back(Scope);
1333 }
1334
1335 // Recreate the scope chain, bottom-up, starting at the new subprogram (or a
1336 // cached result).
1337 DIScope *UpdatedScope = CachedResult ? CachedResult : &NewSP;
1338 for (DIScope *ScopeToUpdate : reverse(ScopeChain)) {
1339 UpdatedScope = cloneAndReplaceParentScope(
1340 cast<DILexicalBlockBase>(ScopeToUpdate), UpdatedScope);
1341 Cache[ScopeToUpdate] = UpdatedScope;
1342 }
1343
1344 return cast<DILocalScope>(UpdatedScope);
1345}
1346
1348 return StringSwitch<DISPFlags>(Flag)
1349#define HANDLE_DISP_FLAG(ID, NAME) .Case("DISPFlag" #NAME, SPFlag##NAME)
1350#include "llvm/IR/DebugInfoFlags.def"
1351 .Default(SPFlagZero);
1352}
1353
1355 switch (Flag) {
1356 // Appease a warning.
1357 case SPFlagVirtuality:
1358 return "";
1359#define HANDLE_DISP_FLAG(ID, NAME) \
1360 case SPFlag##NAME: \
1361 return "DISPFlag" #NAME;
1362#include "llvm/IR/DebugInfoFlags.def"
1363 }
1364 return "";
1365}
1366
1369 SmallVectorImpl<DISPFlags> &SplitFlags) {
1370 // Multi-bit fields can require special handling. In our case, however, the
1371 // only multi-bit field is virtuality, and all its values happen to be
1372 // single-bit values, so the right behavior just falls out.
1373#define HANDLE_DISP_FLAG(ID, NAME) \
1374 if (DISPFlags Bit = Flags & SPFlag##NAME) { \
1375 SplitFlags.push_back(Bit); \
1376 Flags &= ~Bit; \
1377 }
1378#include "llvm/IR/DebugInfoFlags.def"
1379 return Flags;
1380}
1381
1382DISubprogram *DISubprogram::getImpl(
1383 LLVMContext &Context, Metadata *Scope, MDString *Name,
1384 MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type,
1385 unsigned ScopeLine, Metadata *ContainingType, unsigned VirtualIndex,
1386 int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
1387 Metadata *TemplateParams, Metadata *Declaration, Metadata *RetainedNodes,
1388 Metadata *ThrownTypes, Metadata *Annotations, MDString *TargetFuncName,
1389 bool UsesKeyInstructions, StorageType Storage, bool ShouldCreate) {
1390 assert(isCanonical(Name) && "Expected canonical MDString");
1391 assert(isCanonical(LinkageName) && "Expected canonical MDString");
1392 assert(isCanonical(TargetFuncName) && "Expected canonical MDString");
1394 (Scope, Name, LinkageName, File, Line, Type, ScopeLine,
1400 File, Scope, Name, LinkageName,
1404 if (!TargetFuncName) {
1405 Ops.pop_back();
1406 if (!Annotations) {
1407 Ops.pop_back();
1408 if (!ThrownTypes) {
1409 Ops.pop_back();
1410 if (!TemplateParams) {
1411 Ops.pop_back();
1412 if (!ContainingType)
1413 Ops.pop_back();
1414 }
1415 }
1416 }
1417 }
1418 DEFINE_GETIMPL_STORE_N(DISubprogram,
1419 (Line, ScopeLine, VirtualIndex, ThisAdjustment, Flags,
1420 SPFlags, UsesKeyInstructions),
1421 Ops, Ops.size());
1422}
1423
1424bool DISubprogram::describes(const Function *F) const {
1425 assert(F && "Invalid function");
1426 return F->getSubprogram() == this;
1427}
1432
1433DILexicalBlock *DILexicalBlock::getImpl(LLVMContext &Context, Metadata *Scope,
1434 Metadata *File, unsigned Line,
1435 unsigned Column, StorageType Storage,
1436 bool ShouldCreate) {
1437 // Fixup column.
1439
1440 assert(Scope && "Expected scope");
1442 Metadata *Ops[] = {File, Scope};
1444}
1445
1446DILexicalBlockFile *DILexicalBlockFile::getImpl(LLVMContext &Context,
1447 Metadata *Scope, Metadata *File,
1448 unsigned Discriminator,
1449 StorageType Storage,
1450 bool ShouldCreate) {
1451 assert(Scope && "Expected scope");
1452 DEFINE_GETIMPL_LOOKUP(DILexicalBlockFile, (Scope, File, Discriminator));
1453 Metadata *Ops[] = {File, Scope};
1454 DEFINE_GETIMPL_STORE(DILexicalBlockFile, (Discriminator), Ops);
1455}
1456
1457DINamespace::DINamespace(LLVMContext &Context, StorageType Storage,
1458 bool ExportSymbols, ArrayRef<Metadata *> Ops)
1459 : DIScope(Context, DINamespaceKind, Storage, dwarf::DW_TAG_namespace, Ops) {
1460 SubclassData1 = ExportSymbols;
1461}
1462DINamespace *DINamespace::getImpl(LLVMContext &Context, Metadata *Scope,
1463 MDString *Name, bool ExportSymbols,
1464 StorageType Storage, bool ShouldCreate) {
1465 assert(isCanonical(Name) && "Expected canonical MDString");
1467 // The nullptr is for DIScope's File operand. This should be refactored.
1468 Metadata *Ops[] = {nullptr, Scope, Name};
1469 DEFINE_GETIMPL_STORE(DINamespace, (ExportSymbols), Ops);
1470}
1471
1472DICommonBlock::DICommonBlock(LLVMContext &Context, StorageType Storage,
1473 unsigned LineNo, ArrayRef<Metadata *> Ops)
1474 : DIScope(Context, DICommonBlockKind, Storage, dwarf::DW_TAG_common_block,
1475 Ops) {
1476 SubclassData32 = LineNo;
1477}
1478DICommonBlock *DICommonBlock::getImpl(LLVMContext &Context, Metadata *Scope,
1479 Metadata *Decl, MDString *Name,
1480 Metadata *File, unsigned LineNo,
1481 StorageType Storage, bool ShouldCreate) {
1482 assert(isCanonical(Name) && "Expected canonical MDString");
1483 DEFINE_GETIMPL_LOOKUP(DICommonBlock, (Scope, Decl, Name, File, LineNo));
1484 // The nullptr is for DIScope's File operand. This should be refactored.
1485 Metadata *Ops[] = {Scope, Decl, Name, File};
1486 DEFINE_GETIMPL_STORE(DICommonBlock, (LineNo), Ops);
1487}
1488
1489DIModule::DIModule(LLVMContext &Context, StorageType Storage, unsigned LineNo,
1490 bool IsDecl, ArrayRef<Metadata *> Ops)
1491 : DIScope(Context, DIModuleKind, Storage, dwarf::DW_TAG_module, Ops) {
1492 SubclassData1 = IsDecl;
1493 SubclassData32 = LineNo;
1494}
1495DIModule *DIModule::getImpl(LLVMContext &Context, Metadata *File,
1496 Metadata *Scope, MDString *Name,
1497 MDString *ConfigurationMacros,
1498 MDString *IncludePath, MDString *APINotesFile,
1499 unsigned LineNo, bool IsDecl, StorageType Storage,
1500 bool ShouldCreate) {
1501 assert(isCanonical(Name) && "Expected canonical MDString");
1503 IncludePath, APINotesFile, LineNo, IsDecl));
1506 DEFINE_GETIMPL_STORE(DIModule, (LineNo, IsDecl), Ops);
1507}
1508DITemplateTypeParameter::DITemplateTypeParameter(LLVMContext &Context,
1509 StorageType Storage,
1510 bool IsDefault,
1512 : DITemplateParameter(Context, DITemplateTypeParameterKind, Storage,
1513 dwarf::DW_TAG_template_type_parameter, IsDefault,
1514 Ops) {}
1515
1517DITemplateTypeParameter::getImpl(LLVMContext &Context, MDString *Name,
1518 Metadata *Type, bool isDefault,
1519 StorageType Storage, bool ShouldCreate) {
1520 assert(isCanonical(Name) && "Expected canonical MDString");
1521 DEFINE_GETIMPL_LOOKUP(DITemplateTypeParameter, (Name, Type, isDefault));
1522 Metadata *Ops[] = {Name, Type};
1523 DEFINE_GETIMPL_STORE(DITemplateTypeParameter, (isDefault), Ops);
1524}
1525
1526DITemplateValueParameter *DITemplateValueParameter::getImpl(
1527 LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *Type,
1528 bool isDefault, Metadata *Value, StorageType Storage, bool ShouldCreate) {
1529 assert(isCanonical(Name) && "Expected canonical MDString");
1530 DEFINE_GETIMPL_LOOKUP(DITemplateValueParameter,
1531 (Tag, Name, Type, isDefault, Value));
1532 Metadata *Ops[] = {Name, Type, Value};
1533 DEFINE_GETIMPL_STORE(DITemplateValueParameter, (Tag, isDefault), Ops);
1534}
1535
1537DIGlobalVariable::getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
1538 MDString *LinkageName, Metadata *File, unsigned Line,
1539 Metadata *Type, bool IsLocalToUnit, bool IsDefinition,
1540 Metadata *StaticDataMemberDeclaration,
1541 Metadata *TemplateParams, uint32_t AlignInBits,
1542 Metadata *Annotations, StorageType Storage,
1543 bool ShouldCreate) {
1544 assert(isCanonical(Name) && "Expected canonical MDString");
1545 assert(isCanonical(LinkageName) && "Expected canonical MDString");
1547 DIGlobalVariable,
1548 (Scope, Name, LinkageName, File, Line, Type, IsLocalToUnit, IsDefinition,
1550 Metadata *Ops[] = {Scope,
1551 Name,
1552 File,
1553 Type,
1554 Name,
1558 Annotations};
1559 DEFINE_GETIMPL_STORE(DIGlobalVariable,
1560 (Line, IsLocalToUnit, IsDefinition, AlignInBits), Ops);
1561}
1562
1564DILocalVariable::getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
1565 Metadata *File, unsigned Line, Metadata *Type,
1566 unsigned Arg, DIFlags Flags, uint32_t AlignInBits,
1567 Metadata *Annotations, StorageType Storage,
1568 bool ShouldCreate) {
1569 // 64K ought to be enough for any frontend.
1570 assert(Arg <= UINT16_MAX && "Expected argument number to fit in 16-bits");
1571
1572 assert(Scope && "Expected scope");
1573 assert(isCanonical(Name) && "Expected canonical MDString");
1574 DEFINE_GETIMPL_LOOKUP(DILocalVariable, (Scope, Name, File, Line, Type, Arg,
1575 Flags, AlignInBits, Annotations));
1577 DEFINE_GETIMPL_STORE(DILocalVariable, (Line, Arg, Flags, AlignInBits), Ops);
1578}
1579
1581 signed Line, ArrayRef<Metadata *> Ops,
1582 uint32_t AlignInBits)
1583 : DINode(C, ID, Storage, dwarf::DW_TAG_variable, Ops), Line(Line) {
1584 SubclassData32 = AlignInBits;
1585}
1586std::optional<uint64_t> DIVariable::getSizeInBits() const {
1587 // This is used by the Verifier so be mindful of broken types.
1588 const Metadata *RawType = getRawType();
1589 while (RawType) {
1590 // Try to get the size directly.
1591 if (auto *T = dyn_cast<DIType>(RawType))
1592 if (uint64_t Size = T->getSizeInBits())
1593 return Size;
1594
1595 if (auto *DT = dyn_cast<DIDerivedType>(RawType)) {
1596 // Look at the base type.
1597 RawType = DT->getRawBaseType();
1598 continue;
1599 }
1600
1601 // Missing type or size.
1602 break;
1603 }
1604
1605 // Fail gracefully.
1606 return std::nullopt;
1607}
1608
1609DILabel::DILabel(LLVMContext &C, StorageType Storage, unsigned Line,
1610 unsigned Column, bool IsArtificial,
1611 std::optional<unsigned> CoroSuspendIdx,
1613 : DINode(C, DILabelKind, Storage, dwarf::DW_TAG_label, Ops) {
1614 this->SubclassData32 = Line;
1615 this->Column = Column;
1616 this->IsArtificial = IsArtificial;
1617 this->CoroSuspendIdx = CoroSuspendIdx;
1618}
1619DILabel *DILabel::getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
1620 Metadata *File, unsigned Line, unsigned Column,
1621 bool IsArtificial,
1622 std::optional<unsigned> CoroSuspendIdx,
1623 StorageType Storage, bool ShouldCreate) {
1624 assert(Scope && "Expected scope");
1625 assert(isCanonical(Name) && "Expected canonical MDString");
1627 DILabel, (Scope, Name, File, Line, Column, IsArtificial, CoroSuspendIdx));
1628 Metadata *Ops[] = {Scope, Name, File};
1629 DEFINE_GETIMPL_STORE(DILabel, (Line, Column, IsArtificial, CoroSuspendIdx),
1630 Ops);
1631}
1632
1633DIExpression *DIExpression::getImpl(LLVMContext &Context,
1634 ArrayRef<uint64_t> Elements,
1635 StorageType Storage, bool ShouldCreate) {
1636 DEFINE_GETIMPL_LOOKUP(DIExpression, (Elements));
1637 DEFINE_GETIMPL_STORE_NO_OPS(DIExpression, (Elements));
1638}
1640 if (auto singleLocElts = getSingleLocationExpressionElements()) {
1641 return singleLocElts->size() > 0 &&
1642 (*singleLocElts)[0] == dwarf::DW_OP_LLVM_entry_value;
1643 }
1644 return false;
1645}
1647 if (auto singleLocElts = getSingleLocationExpressionElements())
1648 return singleLocElts->size() > 0 &&
1649 (*singleLocElts)[0] == dwarf::DW_OP_deref;
1650 return false;
1651}
1653 if (auto singleLocElts = getSingleLocationExpressionElements())
1654 return singleLocElts->size() == 1 &&
1655 (*singleLocElts)[0] == dwarf::DW_OP_deref;
1656 return false;
1657}
1658
1659DIAssignID *DIAssignID::getImpl(LLVMContext &Context, StorageType Storage,
1660 bool ShouldCreate) {
1661 // Uniqued DIAssignID are not supported as the instance address *is* the ID.
1662 assert(Storage != StorageType::Uniqued && "uniqued DIAssignID unsupported");
1663 return storeImpl(new (0u, Storage) DIAssignID(Context, Storage), Storage);
1664}
1665
1667 uint64_t Op = getOp();
1668
1669 if (Op >= dwarf::DW_OP_breg0 && Op <= dwarf::DW_OP_breg31)
1670 return 2;
1671
1672 switch (Op) {
1677 case dwarf::DW_OP_bregx:
1678 return 3;
1679 case dwarf::DW_OP_constu:
1680 case dwarf::DW_OP_consts:
1681 case dwarf::DW_OP_deref_size:
1682 case dwarf::DW_OP_plus_uconst:
1686 case dwarf::DW_OP_regx:
1687 return 2;
1688 default:
1689 return 1;
1690 }
1691}
1692
1694 for (auto I = expr_op_begin(), E = expr_op_end(); I != E; ++I) {
1695 // Check that there's space for the operand.
1696 if (I->get() + I->getSize() > E->get())
1697 return false;
1698
1699 uint64_t Op = I->getOp();
1700 if ((Op >= dwarf::DW_OP_reg0 && Op <= dwarf::DW_OP_reg31) ||
1701 (Op >= dwarf::DW_OP_breg0 && Op <= dwarf::DW_OP_breg31))
1702 return true;
1703
1704 // Check that the operand is valid.
1705 switch (Op) {
1706 default:
1707 return false;
1709 // A fragment operator must appear at the end.
1710 return I->get() + I->getSize() == E->get();
1711 case dwarf::DW_OP_stack_value: {
1712 // Must be the last one or followed by a DW_OP_LLVM_fragment.
1713 if (I->get() + I->getSize() == E->get())
1714 break;
1715 auto J = I;
1716 if ((++J)->getOp() != dwarf::DW_OP_LLVM_fragment)
1717 return false;
1718 break;
1719 }
1720 case dwarf::DW_OP_swap: {
1721 // Must be more than one implicit element on the stack.
1722
1723 // FIXME: A better way to implement this would be to add a local variable
1724 // that keeps track of the stack depth and introduce something like a
1725 // DW_LLVM_OP_implicit_location as a placeholder for the location this
1726 // DIExpression is attached to, or else pass the number of implicit stack
1727 // elements into isValid.
1728 if (getNumElements() == 1)
1729 return false;
1730 break;
1731 }
1733 // An entry value operator must appear at the beginning or immediately
1734 // following `DW_OP_LLVM_arg 0`, and the number of operations it cover can
1735 // currently only be 1, because we support only entry values of a simple
1736 // register location. One reason for this is that we currently can't
1737 // calculate the size of the resulting DWARF block for other expressions.
1738 auto FirstOp = expr_op_begin();
1739 if (FirstOp->getOp() == dwarf::DW_OP_LLVM_arg && FirstOp->getArg(0) == 0)
1740 ++FirstOp;
1741 return I->get() == FirstOp->get() && I->getArg(0) == 1;
1742 }
1749 case dwarf::DW_OP_constu:
1750 case dwarf::DW_OP_plus_uconst:
1751 case dwarf::DW_OP_plus:
1752 case dwarf::DW_OP_minus:
1753 case dwarf::DW_OP_mul:
1754 case dwarf::DW_OP_div:
1755 case dwarf::DW_OP_mod:
1756 case dwarf::DW_OP_or:
1757 case dwarf::DW_OP_and:
1758 case dwarf::DW_OP_xor:
1759 case dwarf::DW_OP_shl:
1760 case dwarf::DW_OP_shr:
1761 case dwarf::DW_OP_shra:
1762 case dwarf::DW_OP_deref:
1763 case dwarf::DW_OP_deref_size:
1764 case dwarf::DW_OP_xderef:
1765 case dwarf::DW_OP_lit0:
1766 case dwarf::DW_OP_not:
1767 case dwarf::DW_OP_dup:
1768 case dwarf::DW_OP_regx:
1769 case dwarf::DW_OP_bregx:
1770 case dwarf::DW_OP_push_object_address:
1771 case dwarf::DW_OP_over:
1772 case dwarf::DW_OP_rot:
1773 case dwarf::DW_OP_consts:
1774 case dwarf::DW_OP_eq:
1775 case dwarf::DW_OP_ne:
1776 case dwarf::DW_OP_gt:
1777 case dwarf::DW_OP_ge:
1778 case dwarf::DW_OP_lt:
1779 case dwarf::DW_OP_le:
1780 case dwarf::DW_OP_neg:
1781 case dwarf::DW_OP_abs:
1782 break;
1783 }
1784 }
1785 return true;
1786}
1787
1789 if (!isValid())
1790 return false;
1791
1792 if (getNumElements() == 0)
1793 return false;
1794
1795 for (const auto &It : expr_ops()) {
1796 switch (It.getOp()) {
1797 default:
1798 break;
1799 case dwarf::DW_OP_stack_value:
1800 return true;
1801 }
1802 }
1803
1804 return false;
1805}
1806
1808 if (!isValid())
1809 return false;
1810
1811 if (getNumElements() == 0)
1812 return false;
1813
1814 // If there are any elements other than fragment or tag_offset, then some
1815 // kind of complex computation occurs.
1816 for (const auto &It : expr_ops()) {
1817 switch (It.getOp()) {
1821 continue;
1822 default:
1823 return true;
1824 }
1825 }
1826
1827 return false;
1828}
1829
1831 if (!isValid())
1832 return false;
1833
1834 if (getNumElements() == 0)
1835 return true;
1836
1837 auto ExprOpBegin = expr_ops().begin();
1838 auto ExprOpEnd = expr_ops().end();
1839 if (ExprOpBegin->getOp() == dwarf::DW_OP_LLVM_arg) {
1840 if (ExprOpBegin->getArg(0) != 0)
1841 return false;
1842 ++ExprOpBegin;
1843 }
1844
1845 return !std::any_of(ExprOpBegin, ExprOpEnd, [](auto Op) {
1846 return Op.getOp() == dwarf::DW_OP_LLVM_arg;
1847 });
1848}
1849
1850std::optional<ArrayRef<uint64_t>>
1852 // Check for `isValid` covered by `isSingleLocationExpression`.
1854 return std::nullopt;
1855
1856 // An empty expression is already non-variadic.
1857 if (!getNumElements())
1858 return ArrayRef<uint64_t>();
1859
1860 // If Expr does not have a leading DW_OP_LLVM_arg then we don't need to do
1861 // anything.
1863 return getElements().drop_front(2);
1864 return getElements();
1865}
1866
1867const DIExpression *
1869 SmallVector<uint64_t, 3> UndefOps;
1870 if (auto FragmentInfo = Expr->getFragmentInfo()) {
1871 UndefOps.append({dwarf::DW_OP_LLVM_fragment, FragmentInfo->OffsetInBits,
1872 FragmentInfo->SizeInBits});
1873 }
1874 return DIExpression::get(Expr->getContext(), UndefOps);
1875}
1876
1877const DIExpression *
1879 if (any_of(Expr->expr_ops(), [](auto ExprOp) {
1880 return ExprOp.getOp() == dwarf::DW_OP_LLVM_arg;
1881 }))
1882 return Expr;
1883 SmallVector<uint64_t> NewOps;
1884 NewOps.reserve(Expr->getNumElements() + 2);
1885 NewOps.append({dwarf::DW_OP_LLVM_arg, 0});
1886 NewOps.append(Expr->elements_begin(), Expr->elements_end());
1887 return DIExpression::get(Expr->getContext(), NewOps);
1888}
1889
1890std::optional<const DIExpression *>
1892 if (!Expr)
1893 return std::nullopt;
1894
1895 if (auto Elts = Expr->getSingleLocationExpressionElements())
1896 return DIExpression::get(Expr->getContext(), *Elts);
1897
1898 return std::nullopt;
1899}
1900
1902 const DIExpression *Expr,
1903 bool IsIndirect) {
1904 // If Expr is not already variadic, insert the implied `DW_OP_LLVM_arg 0`
1905 // to the existing expression ops.
1906 if (none_of(Expr->expr_ops(), [](auto ExprOp) {
1907 return ExprOp.getOp() == dwarf::DW_OP_LLVM_arg;
1908 }))
1909 Ops.append({dwarf::DW_OP_LLVM_arg, 0});
1910 // If Expr is not indirect, we only need to insert the expression elements and
1911 // we're done.
1912 if (!IsIndirect) {
1913 Ops.append(Expr->elements_begin(), Expr->elements_end());
1914 return;
1915 }
1916 // If Expr is indirect, insert the implied DW_OP_deref at the end of the
1917 // expression but before DW_OP_{stack_value, LLVM_fragment} if they are
1918 // present.
1919 for (auto Op : Expr->expr_ops()) {
1920 if (Op.getOp() == dwarf::DW_OP_stack_value ||
1921 Op.getOp() == dwarf::DW_OP_LLVM_fragment) {
1922 Ops.push_back(dwarf::DW_OP_deref);
1923 IsIndirect = false;
1924 }
1925 Op.appendToVector(Ops);
1926 }
1927 if (IsIndirect)
1928 Ops.push_back(dwarf::DW_OP_deref);
1929}
1930
1931bool DIExpression::isEqualExpression(const DIExpression *FirstExpr,
1932 bool FirstIndirect,
1933 const DIExpression *SecondExpr,
1934 bool SecondIndirect) {
1935 SmallVector<uint64_t> FirstOps;
1936 DIExpression::canonicalizeExpressionOps(FirstOps, FirstExpr, FirstIndirect);
1937 SmallVector<uint64_t> SecondOps;
1938 DIExpression::canonicalizeExpressionOps(SecondOps, SecondExpr,
1939 SecondIndirect);
1940 return FirstOps == SecondOps;
1941}
1942
1943std::optional<DIExpression::FragmentInfo>
1945 for (auto I = Start; I != End; ++I)
1946 if (I->getOp() == dwarf::DW_OP_LLVM_fragment) {
1947 DIExpression::FragmentInfo Info = {I->getArg(1), I->getArg(0)};
1948 return Info;
1949 }
1950 return std::nullopt;
1951}
1952
1953std::optional<uint64_t> DIExpression::getActiveBits(DIVariable *Var) {
1954 std::optional<uint64_t> InitialActiveBits = Var->getSizeInBits();
1955 std::optional<uint64_t> ActiveBits = InitialActiveBits;
1956 for (auto Op : expr_ops()) {
1957 switch (Op.getOp()) {
1958 default:
1959 // We assume the worst case for anything we don't currently handle and
1960 // revert to the initial active bits.
1961 ActiveBits = InitialActiveBits;
1962 break;
1965 // We can't handle an extract whose sign doesn't match that of the
1966 // variable.
1967 std::optional<DIBasicType::Signedness> VarSign = Var->getSignedness();
1968 bool VarSigned = (VarSign == DIBasicType::Signedness::Signed);
1969 bool OpSigned = (Op.getOp() == dwarf::DW_OP_LLVM_extract_bits_sext);
1970 if (!VarSign || VarSigned != OpSigned) {
1971 ActiveBits = InitialActiveBits;
1972 break;
1973 }
1974 [[fallthrough]];
1975 }
1977 // Extract or fragment narrows the active bits
1978 if (ActiveBits)
1979 ActiveBits = std::min(*ActiveBits, Op.getArg(1));
1980 else
1981 ActiveBits = Op.getArg(1);
1982 break;
1983 }
1984 }
1985 return ActiveBits;
1986}
1987
1989 int64_t Offset) {
1990 if (Offset > 0) {
1991 Ops.push_back(dwarf::DW_OP_plus_uconst);
1992 Ops.push_back(Offset);
1993 } else if (Offset < 0) {
1994 Ops.push_back(dwarf::DW_OP_constu);
1995 // Avoid UB when encountering LLONG_MIN, because in 2's complement
1996 // abs(LLONG_MIN) is LLONG_MAX+1.
1997 uint64_t AbsMinusOne = -(Offset+1);
1998 Ops.push_back(AbsMinusOne + 1);
1999 Ops.push_back(dwarf::DW_OP_minus);
2000 }
2001}
2002
2004 auto SingleLocEltsOpt = getSingleLocationExpressionElements();
2005 if (!SingleLocEltsOpt)
2006 return false;
2007 auto SingleLocElts = *SingleLocEltsOpt;
2008
2009 if (SingleLocElts.size() == 0) {
2010 Offset = 0;
2011 return true;
2012 }
2013
2014 if (SingleLocElts.size() == 2 &&
2015 SingleLocElts[0] == dwarf::DW_OP_plus_uconst) {
2016 Offset = SingleLocElts[1];
2017 return true;
2018 }
2019
2020 if (SingleLocElts.size() == 3 && SingleLocElts[0] == dwarf::DW_OP_constu) {
2021 if (SingleLocElts[2] == dwarf::DW_OP_plus) {
2022 Offset = SingleLocElts[1];
2023 return true;
2024 }
2025 if (SingleLocElts[2] == dwarf::DW_OP_minus) {
2026 Offset = -SingleLocElts[1];
2027 return true;
2028 }
2029 }
2030
2031 return false;
2032}
2033
2035 int64_t &OffsetInBytes, SmallVectorImpl<uint64_t> &RemainingOps) const {
2036 OffsetInBytes = 0;
2037 RemainingOps.clear();
2038
2039 auto SingleLocEltsOpt = getSingleLocationExpressionElements();
2040 if (!SingleLocEltsOpt)
2041 return false;
2042
2043 auto ExprOpEnd = expr_op_iterator(SingleLocEltsOpt->end());
2044 auto ExprOpIt = expr_op_iterator(SingleLocEltsOpt->begin());
2045 while (ExprOpIt != ExprOpEnd) {
2046 uint64_t Op = ExprOpIt->getOp();
2047 if (Op == dwarf::DW_OP_deref || Op == dwarf::DW_OP_deref_size ||
2048 Op == dwarf::DW_OP_deref_type || Op == dwarf::DW_OP_LLVM_fragment ||
2051 break;
2052 } else if (Op == dwarf::DW_OP_plus_uconst) {
2053 OffsetInBytes += ExprOpIt->getArg(0);
2054 } else if (Op == dwarf::DW_OP_constu) {
2055 uint64_t Value = ExprOpIt->getArg(0);
2056 ++ExprOpIt;
2057 if (ExprOpIt->getOp() == dwarf::DW_OP_plus)
2058 OffsetInBytes += Value;
2059 else if (ExprOpIt->getOp() == dwarf::DW_OP_minus)
2060 OffsetInBytes -= Value;
2061 else
2062 return false;
2063 } else {
2064 // Not a const plus/minus operation or deref.
2065 return false;
2066 }
2067 ++ExprOpIt;
2068 }
2069 RemainingOps.append(ExprOpIt.getBase(), ExprOpEnd.getBase());
2070 return true;
2071}
2072
2075 for (auto ExprOp : expr_ops())
2076 if (ExprOp.getOp() == dwarf::DW_OP_LLVM_arg)
2077 SeenOps.insert(ExprOp.getArg(0));
2078 for (uint64_t Idx = 0; Idx < N; ++Idx)
2079 if (!SeenOps.contains(Idx))
2080 return false;
2081 return true;
2082}
2083
2084const DIExpression *DIExpression::extractAddressClass(const DIExpression *Expr,
2085 unsigned &AddrClass) {
2086 // FIXME: This seems fragile. Nothing that verifies that these elements
2087 // actually map to ops and not operands.
2088 auto SingleLocEltsOpt = Expr->getSingleLocationExpressionElements();
2089 if (!SingleLocEltsOpt)
2090 return nullptr;
2091 auto SingleLocElts = *SingleLocEltsOpt;
2092
2093 const unsigned PatternSize = 4;
2094 if (SingleLocElts.size() >= PatternSize &&
2095 SingleLocElts[PatternSize - 4] == dwarf::DW_OP_constu &&
2096 SingleLocElts[PatternSize - 2] == dwarf::DW_OP_swap &&
2097 SingleLocElts[PatternSize - 1] == dwarf::DW_OP_xderef) {
2098 AddrClass = SingleLocElts[PatternSize - 3];
2099
2100 if (SingleLocElts.size() == PatternSize)
2101 return nullptr;
2102 return DIExpression::get(
2103 Expr->getContext(),
2104 ArrayRef(&*SingleLocElts.begin(), SingleLocElts.size() - PatternSize));
2105 }
2106 return Expr;
2107}
2108
2109DIExpression *DIExpression::prepend(const DIExpression *Expr, uint8_t Flags,
2110 int64_t Offset) {
2112 if (Flags & DIExpression::DerefBefore)
2113 Ops.push_back(dwarf::DW_OP_deref);
2114
2116 if (Flags & DIExpression::DerefAfter)
2117 Ops.push_back(dwarf::DW_OP_deref);
2118
2119 bool StackValue = Flags & DIExpression::StackValue;
2120 bool EntryValue = Flags & DIExpression::EntryValue;
2121
2122 return prependOpcodes(Expr, Ops, StackValue, EntryValue);
2123}
2124
2125DIExpression *DIExpression::appendOpsToArg(const DIExpression *Expr,
2127 unsigned ArgNo, bool StackValue) {
2128 assert(Expr && "Can't add ops to this expression");
2129
2130 // Handle non-variadic intrinsics by prepending the opcodes.
2131 if (!any_of(Expr->expr_ops(),
2132 [](auto Op) { return Op.getOp() == dwarf::DW_OP_LLVM_arg; })) {
2133 assert(ArgNo == 0 &&
2134 "Location Index must be 0 for a non-variadic expression.");
2136 return DIExpression::prependOpcodes(Expr, NewOps, StackValue);
2137 }
2138
2140 for (auto Op : Expr->expr_ops()) {
2141 // A DW_OP_stack_value comes at the end, but before a DW_OP_LLVM_fragment.
2142 if (StackValue) {
2143 if (Op.getOp() == dwarf::DW_OP_stack_value)
2144 StackValue = false;
2145 else if (Op.getOp() == dwarf::DW_OP_LLVM_fragment) {
2146 NewOps.push_back(dwarf::DW_OP_stack_value);
2147 StackValue = false;
2148 }
2149 }
2150 Op.appendToVector(NewOps);
2151 if (Op.getOp() == dwarf::DW_OP_LLVM_arg && Op.getArg(0) == ArgNo)
2152 llvm::append_range(NewOps, Ops);
2153 }
2154 if (StackValue)
2155 NewOps.push_back(dwarf::DW_OP_stack_value);
2156
2157 return DIExpression::get(Expr->getContext(), NewOps);
2158}
2159
2160DIExpression *DIExpression::replaceArg(const DIExpression *Expr,
2161 uint64_t OldArg, uint64_t NewArg) {
2162 assert(Expr && "Can't replace args in this expression");
2163
2165
2166 for (auto Op : Expr->expr_ops()) {
2167 if (Op.getOp() != dwarf::DW_OP_LLVM_arg || Op.getArg(0) < OldArg) {
2168 Op.appendToVector(NewOps);
2169 continue;
2170 }
2172 uint64_t Arg = Op.getArg(0) == OldArg ? NewArg : Op.getArg(0);
2173 // OldArg has been deleted from the Op list, so decrement all indices
2174 // greater than it.
2175 if (Arg > OldArg)
2176 --Arg;
2177 NewOps.push_back(Arg);
2178 }
2179 return DIExpression::get(Expr->getContext(), NewOps);
2180}
2181
2182DIExpression *DIExpression::prependOpcodes(const DIExpression *Expr,
2184 bool StackValue, bool EntryValue) {
2185 assert(Expr && "Can't prepend ops to this expression");
2186
2187 if (EntryValue) {
2189 // Use a block size of 1 for the target register operand. The
2190 // DWARF backend currently cannot emit entry values with a block
2191 // size > 1.
2192 Ops.push_back(1);
2193 }
2194
2195 // If there are no ops to prepend, do not even add the DW_OP_stack_value.
2196 if (Ops.empty())
2197 StackValue = false;
2198 for (auto Op : Expr->expr_ops()) {
2199 // A DW_OP_stack_value comes at the end, but before a DW_OP_LLVM_fragment.
2200 if (StackValue) {
2201 if (Op.getOp() == dwarf::DW_OP_stack_value)
2202 StackValue = false;
2203 else if (Op.getOp() == dwarf::DW_OP_LLVM_fragment) {
2204 Ops.push_back(dwarf::DW_OP_stack_value);
2205 StackValue = false;
2206 }
2207 }
2208 Op.appendToVector(Ops);
2209 }
2210 if (StackValue)
2211 Ops.push_back(dwarf::DW_OP_stack_value);
2212 return DIExpression::get(Expr->getContext(), Ops);
2213}
2214
2215DIExpression *DIExpression::append(const DIExpression *Expr,
2217 assert(Expr && !Ops.empty() && "Can't append ops to this expression");
2218
2219 // Copy Expr's current op list.
2221 for (auto Op : Expr->expr_ops()) {
2222 // Append new opcodes before DW_OP_{stack_value, LLVM_fragment}.
2223 if (Op.getOp() == dwarf::DW_OP_stack_value ||
2224 Op.getOp() == dwarf::DW_OP_LLVM_fragment) {
2225 NewOps.append(Ops.begin(), Ops.end());
2226
2227 // Ensure that the new opcodes are only appended once.
2228 Ops = {};
2229 }
2230 Op.appendToVector(NewOps);
2231 }
2232 NewOps.append(Ops.begin(), Ops.end());
2233 auto *result =
2234 DIExpression::get(Expr->getContext(), NewOps)->foldConstantMath();
2235 assert(result->isValid() && "concatenated expression is not valid");
2236 return result;
2237}
2238
2239DIExpression *DIExpression::appendToStack(const DIExpression *Expr,
2241 assert(Expr && !Ops.empty() && "Can't append ops to this expression");
2242 assert(std::none_of(expr_op_iterator(Ops.begin()),
2243 expr_op_iterator(Ops.end()),
2244 [](auto Op) {
2245 return Op.getOp() == dwarf::DW_OP_stack_value ||
2246 Op.getOp() == dwarf::DW_OP_LLVM_fragment;
2247 }) &&
2248 "Can't append this op");
2249
2250 // Append a DW_OP_deref after Expr's current op list if it's non-empty and
2251 // has no DW_OP_stack_value.
2252 //
2253 // Match .* DW_OP_stack_value (DW_OP_LLVM_fragment A B)?.
2254 std::optional<FragmentInfo> FI = Expr->getFragmentInfo();
2255 unsigned DropUntilStackValue = FI ? 3 : 0;
2256 ArrayRef<uint64_t> ExprOpsBeforeFragment =
2257 Expr->getElements().drop_back(DropUntilStackValue);
2258 bool NeedsDeref = (Expr->getNumElements() > DropUntilStackValue) &&
2259 (ExprOpsBeforeFragment.back() != dwarf::DW_OP_stack_value);
2260 bool NeedsStackValue = NeedsDeref || ExprOpsBeforeFragment.empty();
2261
2262 // Append a DW_OP_deref after Expr's current op list if needed, then append
2263 // the new ops, and finally ensure that a single DW_OP_stack_value is present.
2265 if (NeedsDeref)
2266 NewOps.push_back(dwarf::DW_OP_deref);
2267 NewOps.append(Ops.begin(), Ops.end());
2268 if (NeedsStackValue)
2269 NewOps.push_back(dwarf::DW_OP_stack_value);
2270 return DIExpression::append(Expr, NewOps);
2271}
2272
2273std::optional<DIExpression *> DIExpression::createFragmentExpression(
2274 const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits) {
2276 // Track whether it's safe to split the value at the top of the DWARF stack,
2277 // assuming that it'll be used as an implicit location value.
2278 bool CanSplitValue = true;
2279 // Track whether we need to add a fragment expression to the end of Expr.
2280 bool EmitFragment = true;
2281 // Copy over the expression, but leave off any trailing DW_OP_LLVM_fragment.
2282 if (Expr) {
2283 for (auto Op : Expr->expr_ops()) {
2284 switch (Op.getOp()) {
2285 default:
2286 break;
2287 case dwarf::DW_OP_shr:
2288 case dwarf::DW_OP_shra:
2289 case dwarf::DW_OP_shl:
2290 case dwarf::DW_OP_plus:
2291 case dwarf::DW_OP_plus_uconst:
2292 case dwarf::DW_OP_minus:
2293 // We can't safely split arithmetic or shift operations into multiple
2294 // fragments because we can't express carry-over between fragments.
2295 //
2296 // FIXME: We *could* preserve the lowest fragment of a constant offset
2297 // operation if the offset fits into SizeInBits.
2298 CanSplitValue = false;
2299 break;
2300 case dwarf::DW_OP_deref:
2301 case dwarf::DW_OP_deref_size:
2302 case dwarf::DW_OP_deref_type:
2303 case dwarf::DW_OP_xderef:
2304 case dwarf::DW_OP_xderef_size:
2305 case dwarf::DW_OP_xderef_type:
2306 // Preceeding arithmetic operations have been applied to compute an
2307 // address. It's okay to split the value loaded from that address.
2308 CanSplitValue = true;
2309 break;
2310 case dwarf::DW_OP_stack_value:
2311 // Bail if this expression computes a value that cannot be split.
2312 if (!CanSplitValue)
2313 return std::nullopt;
2314 break;
2316 // If we've decided we don't need a fragment then give up if we see that
2317 // there's already a fragment expression.
2318 // FIXME: We could probably do better here
2319 if (!EmitFragment)
2320 return std::nullopt;
2321 // Make the new offset point into the existing fragment.
2322 uint64_t FragmentOffsetInBits = Op.getArg(0);
2323 uint64_t FragmentSizeInBits = Op.getArg(1);
2324 (void)FragmentSizeInBits;
2325 assert((OffsetInBits + SizeInBits <= FragmentSizeInBits) &&
2326 "new fragment outside of original fragment");
2327 OffsetInBits += FragmentOffsetInBits;
2328 continue;
2329 }
2332 // If we're extracting bits from inside of the fragment that we're
2333 // creating then we don't have a fragment after all, and just need to
2334 // adjust the offset that we're extracting from.
2335 uint64_t ExtractOffsetInBits = Op.getArg(0);
2336 uint64_t ExtractSizeInBits = Op.getArg(1);
2337 if (ExtractOffsetInBits >= OffsetInBits &&
2338 ExtractOffsetInBits + ExtractSizeInBits <=
2339 OffsetInBits + SizeInBits) {
2340 Ops.push_back(Op.getOp());
2341 Ops.push_back(ExtractOffsetInBits - OffsetInBits);
2342 Ops.push_back(ExtractSizeInBits);
2343 EmitFragment = false;
2344 continue;
2345 }
2346 // If the extracted bits aren't fully contained within the fragment then
2347 // give up.
2348 // FIXME: We could probably do better here
2349 return std::nullopt;
2350 }
2351 }
2352 Op.appendToVector(Ops);
2353 }
2354 }
2355 assert((!Expr->isImplicit() || CanSplitValue) && "Expr can't be split");
2356 assert(Expr && "Unknown DIExpression");
2357 if (EmitFragment) {
2359 Ops.push_back(OffsetInBits);
2360 Ops.push_back(SizeInBits);
2361 }
2362 return DIExpression::get(Expr->getContext(), Ops);
2363}
2364
2365/// See declaration for more info.
2367 const DataLayout &DL, const Value *SliceStart, uint64_t SliceOffsetInBits,
2368 uint64_t SliceSizeInBits, const Value *DbgPtr, int64_t DbgPtrOffsetInBits,
2369 int64_t DbgExtractOffsetInBits, DIExpression::FragmentInfo VarFrag,
2370 std::optional<DIExpression::FragmentInfo> &Result,
2371 int64_t &OffsetFromLocationInBits) {
2372
2373 if (VarFrag.SizeInBits == 0)
2374 return false; // Variable size is unknown.
2375
2376 // Difference between mem slice start and the dbg location start.
2377 // 0 4 8 12 16 ...
2378 // | |
2379 // dbg location start
2380 // |
2381 // mem slice start
2382 // Here MemStartRelToDbgStartInBits is 8. Note this can be negative.
2383 int64_t MemStartRelToDbgStartInBits;
2384 {
2385 auto MemOffsetFromDbgInBytes = SliceStart->getPointerOffsetFrom(DbgPtr, DL);
2386 if (!MemOffsetFromDbgInBytes)
2387 return false; // Can't calculate difference in addresses.
2388 // Difference between the pointers.
2389 MemStartRelToDbgStartInBits = *MemOffsetFromDbgInBytes * 8;
2390 // Add the difference of the offsets.
2391 MemStartRelToDbgStartInBits +=
2392 SliceOffsetInBits - (DbgPtrOffsetInBits + DbgExtractOffsetInBits);
2393 }
2394
2395 // Out-param. Invert offset to get offset from debug location.
2396 OffsetFromLocationInBits = -MemStartRelToDbgStartInBits;
2397
2398 // Check if the variable fragment sits outside (before) this memory slice.
2399 int64_t MemEndRelToDbgStart = MemStartRelToDbgStartInBits + SliceSizeInBits;
2400 if (MemEndRelToDbgStart < 0) {
2401 Result = {0, 0}; // Out-param.
2402 return true;
2403 }
2404
2405 // Work towards creating SliceOfVariable which is the bits of the variable
2406 // that the memory region covers.
2407 // 0 4 8 12 16 ...
2408 // | |
2409 // dbg location start with VarFrag offset=32
2410 // |
2411 // mem slice start: SliceOfVariable offset=40
2412 int64_t MemStartRelToVarInBits =
2413 MemStartRelToDbgStartInBits + VarFrag.OffsetInBits;
2414 int64_t MemEndRelToVarInBits = MemStartRelToVarInBits + SliceSizeInBits;
2415 // If the memory region starts before the debug location the fragment
2416 // offset would be negative, which we can't encode. Limit those to 0. This
2417 // is fine because those bits necessarily don't overlap with the existing
2418 // variable fragment.
2419 int64_t MemFragStart = std::max<int64_t>(0, MemStartRelToVarInBits);
2420 int64_t MemFragSize =
2421 std::max<int64_t>(0, MemEndRelToVarInBits - MemFragStart);
2422 DIExpression::FragmentInfo SliceOfVariable(MemFragSize, MemFragStart);
2423
2424 // Intersect the memory region fragment with the variable location fragment.
2425 DIExpression::FragmentInfo TrimmedSliceOfVariable =
2426 DIExpression::FragmentInfo::intersect(SliceOfVariable, VarFrag);
2427 if (TrimmedSliceOfVariable == VarFrag)
2428 Result = std::nullopt; // Out-param.
2429 else
2430 Result = TrimmedSliceOfVariable; // Out-param.
2431 return true;
2432}
2433
2434std::pair<DIExpression *, const ConstantInt *>
2436 // Copy the APInt so we can modify it.
2437 APInt NewInt = CI->getValue();
2439
2440 // Fold operators only at the beginning of the expression.
2441 bool First = true;
2442 bool Changed = false;
2443 for (auto Op : expr_ops()) {
2444 switch (Op.getOp()) {
2445 default:
2446 // We fold only the leading part of the expression; if we get to a part
2447 // that we're going to copy unchanged, and haven't done any folding,
2448 // then the entire expression is unchanged and we can return early.
2449 if (!Changed)
2450 return {this, CI};
2451 First = false;
2452 break;
2454 if (!First)
2455 break;
2456 Changed = true;
2457 if (Op.getArg(1) == dwarf::DW_ATE_signed)
2458 NewInt = NewInt.sextOrTrunc(Op.getArg(0));
2459 else {
2460 assert(Op.getArg(1) == dwarf::DW_ATE_unsigned && "Unexpected operand");
2461 NewInt = NewInt.zextOrTrunc(Op.getArg(0));
2462 }
2463 continue;
2464 }
2465 Op.appendToVector(Ops);
2466 }
2467 if (!Changed)
2468 return {this, CI};
2469 return {DIExpression::get(getContext(), Ops),
2470 ConstantInt::get(getContext(), NewInt)};
2471}
2472
2474 uint64_t Result = 0;
2475 for (auto ExprOp : expr_ops())
2476 if (ExprOp.getOp() == dwarf::DW_OP_LLVM_arg)
2477 Result = std::max(Result, ExprOp.getArg(0) + 1);
2478 assert(hasAllLocationOps(Result) &&
2479 "Expression is missing one or more location operands.");
2480 return Result;
2481}
2482
2483std::optional<DIExpression::SignedOrUnsignedConstant>
2485
2486 // Recognize signed and unsigned constants.
2487 // An signed constants can be represented as DW_OP_consts C DW_OP_stack_value
2488 // (DW_OP_LLVM_fragment of Len).
2489 // An unsigned constant can be represented as
2490 // DW_OP_constu C DW_OP_stack_value (DW_OP_LLVM_fragment of Len).
2491
2492 if ((getNumElements() != 2 && getNumElements() != 3 &&
2493 getNumElements() != 6) ||
2494 (getElement(0) != dwarf::DW_OP_consts &&
2495 getElement(0) != dwarf::DW_OP_constu))
2496 return std::nullopt;
2497
2498 if (getNumElements() == 2 && getElement(0) == dwarf::DW_OP_consts)
2500
2501 if ((getNumElements() == 3 && getElement(2) != dwarf::DW_OP_stack_value) ||
2502 (getNumElements() == 6 && (getElement(2) != dwarf::DW_OP_stack_value ||
2504 return std::nullopt;
2505 return getElement(0) == dwarf::DW_OP_constu
2508}
2509
2510DIExpression::ExtOps DIExpression::getExtOps(unsigned FromSize, unsigned ToSize,
2511 bool Signed) {
2512 dwarf::TypeKind TK = Signed ? dwarf::DW_ATE_signed : dwarf::DW_ATE_unsigned;
2514 dwarf::DW_OP_LLVM_convert, ToSize, TK}};
2515 return Ops;
2516}
2517
2518DIExpression *DIExpression::appendExt(const DIExpression *Expr,
2519 unsigned FromSize, unsigned ToSize,
2520 bool Signed) {
2521 return appendToStack(Expr, getExtOps(FromSize, ToSize, Signed));
2522}
2523
2525DIGlobalVariableExpression::getImpl(LLVMContext &Context, Metadata *Variable,
2527 bool ShouldCreate) {
2529 Metadata *Ops[] = {Variable, Expression};
2531}
2532DIObjCProperty::DIObjCProperty(LLVMContext &C, StorageType Storage,
2533 unsigned Line, unsigned Attributes,
2535 : DINode(C, DIObjCPropertyKind, Storage, dwarf::DW_TAG_APPLE_property, Ops),
2537
2538DIObjCProperty *DIObjCProperty::getImpl(
2539 LLVMContext &Context, MDString *Name, Metadata *File, unsigned Line,
2540 MDString *GetterName, MDString *SetterName, unsigned Attributes,
2541 Metadata *Type, StorageType Storage, bool ShouldCreate) {
2542 assert(isCanonical(Name) && "Expected canonical MDString");
2543 assert(isCanonical(GetterName) && "Expected canonical MDString");
2544 assert(isCanonical(SetterName) && "Expected canonical MDString");
2545 DEFINE_GETIMPL_LOOKUP(DIObjCProperty, (Name, File, Line, GetterName,
2546 SetterName, Attributes, Type));
2548 DEFINE_GETIMPL_STORE(DIObjCProperty, (Line, Attributes), Ops);
2549}
2550
2551DIImportedEntity *DIImportedEntity::getImpl(LLVMContext &Context, unsigned Tag,
2552 Metadata *Scope, Metadata *Entity,
2553 Metadata *File, unsigned Line,
2554 MDString *Name, Metadata *Elements,
2555 StorageType Storage,
2556 bool ShouldCreate) {
2557 assert(isCanonical(Name) && "Expected canonical MDString");
2558 DEFINE_GETIMPL_LOOKUP(DIImportedEntity,
2559 (Tag, Scope, Entity, File, Line, Name, Elements));
2561 DEFINE_GETIMPL_STORE(DIImportedEntity, (Tag, Line), Ops);
2562}
2563
2564DIMacro *DIMacro::getImpl(LLVMContext &Context, unsigned MIType, unsigned Line,
2565 MDString *Name, MDString *Value, StorageType Storage,
2566 bool ShouldCreate) {
2567 assert(isCanonical(Name) && "Expected canonical MDString");
2569 Metadata *Ops[] = {Name, Value};
2570 DEFINE_GETIMPL_STORE(DIMacro, (MIType, Line), Ops);
2571}
2572
2573DIMacroFile *DIMacroFile::getImpl(LLVMContext &Context, unsigned MIType,
2574 unsigned Line, Metadata *File,
2575 Metadata *Elements, StorageType Storage,
2576 bool ShouldCreate) {
2577 DEFINE_GETIMPL_LOOKUP(DIMacroFile, (MIType, Line, File, Elements));
2578 Metadata *Ops[] = {File, Elements};
2579 DEFINE_GETIMPL_STORE(DIMacroFile, (MIType, Line), Ops);
2580}
2581
2582DIArgList *DIArgList::get(LLVMContext &Context,
2584 auto ExistingIt = Context.pImpl->DIArgLists.find_as(DIArgListKeyInfo(Args));
2585 if (ExistingIt != Context.pImpl->DIArgLists.end())
2586 return *ExistingIt;
2587 DIArgList *NewArgList = new DIArgList(Context, Args);
2588 Context.pImpl->DIArgLists.insert(NewArgList);
2589 return NewArgList;
2590}
2591
2593 ValueAsMetadata **OldVMPtr = static_cast<ValueAsMetadata **>(Ref);
2594 assert((!New || isa<ValueAsMetadata>(New)) &&
2595 "DIArgList must be passed a ValueAsMetadata");
2596 untrack();
2597 // We need to update the set storage once the Args are updated since they
2598 // form the key to the DIArgLists store.
2599 getContext().pImpl->DIArgLists.erase(this);
2601 for (ValueAsMetadata *&VM : Args) {
2602 if (&VM == OldVMPtr) {
2603 if (NewVM)
2604 VM = NewVM;
2605 else
2606 VM = ValueAsMetadata::get(PoisonValue::get(VM->getValue()->getType()));
2607 }
2608 }
2609 // We've changed the contents of this DIArgList, and the set storage may
2610 // already contain a DIArgList with our new set of args; if it does, then we
2611 // must RAUW this with the existing DIArgList, otherwise we simply insert this
2612 // back into the set storage.
2613 DIArgList *ExistingArgList = getUniqued(getContext().pImpl->DIArgLists, this);
2614 if (ExistingArgList) {
2615 replaceAllUsesWith(ExistingArgList);
2616 // Clear this here so we don't try to untrack in the destructor.
2617 Args.clear();
2618 delete this;
2619 return;
2620 }
2621 getContext().pImpl->DIArgLists.insert(this);
2622 track();
2623}
2624void DIArgList::track() {
2625 for (ValueAsMetadata *&VAM : Args)
2626 if (VAM)
2627 MetadataTracking::track(&VAM, *VAM, *this);
2628}
2629void DIArgList::untrack() {
2630 for (ValueAsMetadata *&VAM : Args)
2631 if (VAM)
2632 MetadataTracking::untrack(&VAM, *VAM);
2633}
2634void DIArgList::dropAllReferences(bool Untrack) {
2635 if (Untrack)
2636 untrack();
2637 Args.clear();
2638 ReplaceableMetadataImpl::resolveAllUses(/* ResolveUsers */ false);
2639}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
constexpr LLT S1
AMDGPU Kernel Attributes
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static cl::opt< ITMode > IT(cl::desc("IT block support"), cl::Hidden, cl::init(DefaultIT), cl::values(clEnumValN(DefaultIT, "arm-default-it", "Generate any type of IT block"), clEnumValN(RestrictedIT, "arm-restrict-it", "Disallow complex IT blocks")))
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< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_ABI
Definition Compiler.h:213
static const char * ChecksumKindName[DIFile::CSK_Last]
#define DEFINE_GETIMPL_STORE_NO_CONSTRUCTOR_ARGS(CLASS, OPS)
static void adjustColumn(unsigned &Column)
#define DEFINE_GETIMPL_STORE_N(CLASS, ARGS, OPS, NUM_OPS)
static std::pair< DIScope *, LineColumn > getNearestMatchingScope(const DILocation *L1, const DILocation *L2)
static LineColumn getLocalScopeLocationOr(DIScope *S, LineColumn Default)
Returns the location of DILocalScope, if present, or a default value.
std::pair< unsigned, unsigned > LineColumn
static bool isCanonical(const MDString *S)
#define DEFINE_GETIMPL_STORE(CLASS, ARGS, OPS)
#define DEFINE_GETIMPL_LOOKUP(CLASS, ARGS)
#define DEFINE_GETIMPL_STORE_NO_OPS(CLASS, ARGS)
static DILexicalBlockBase * cloneAndReplaceParentScope(DILexicalBlockBase *LBB, DIScope *NewParent)
static RegisterPass< DebugifyFunctionPass > DF("debugify-function", "Attach debug info to a function")
static unsigned encodingBits(unsigned C)
static unsigned encodeComponent(unsigned C)
static unsigned getNextComponentInDiscriminator(unsigned D)
Returns the next component stored in discriminator.
static unsigned getUnsignedFromPrefixEncoding(unsigned U)
Reverse transformation as getPrefixEncodingFromUnsigned.
@ Default
This file contains constants used for implementing Dwarf debug support.
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.
#define T
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file implements a set that has insertion order iteration characteristics.
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1033
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition APInt.cpp:1041
Annotations lets you mark points and ranges inside source code, for tests:
Definition Annotations.h:53
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
const T & back() const
back - Get the last element.
Definition ArrayRef.h:156
ArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
Definition ArrayRef.h:200
size_t size() const
size - Get the array size.
Definition ArrayRef.h:147
ArrayRef< T > drop_back(size_t N=1) const
Drop the last N elements of the array.
Definition ArrayRef.h:206
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:142
static ConstantAsMetadata * get(Constant *C)
Definition Metadata.h:536
This is the shared class of boolean and integer constants.
Definition Constants.h:87
static ConstantInt * getSigned(IntegerType *Ty, int64_t V)
Return a ConstantInt with the specified value for the specified type.
Definition Constants.h:131
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:154
This is an important base class in LLVM.
Definition Constant.h:43
LLVM_ABI void handleChangedOperand(void *Ref, Metadata *New)
static LLVM_ABI DIArgList * get(LLVMContext &Context, ArrayRef< ValueAsMetadata * > Args)
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t unsigned DIFlags Flags
DIBasicType(LLVMContext &C, StorageType Storage, unsigned Tag, uint32_t AlignInBits, unsigned Encoding, uint32_t NumExtraInhabitants, DIFlags Flags, ArrayRef< Metadata * > Ops)
static DIBasicType * getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding, uint32_t NumExtraInhabitants, DIFlags Flags, StorageType Storage, bool ShouldCreate=true)
unsigned StringRef uint64_t SizeInBits
LLVM_ABI std::optional< Signedness > getSignedness() const
Return the signedness of this type, or std::nullopt if this type is neither signed nor unsigned.
unsigned getEncoding() const
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t unsigned DIFlags Flags unsigned StringRef uint64_t uint32_t unsigned uint32_t NumExtraInhabitants
unsigned StringRef Name
unsigned StringRef uint64_t FlagZero unsigned StringRef uint64_t uint32_t AlignInBits
Debug common block.
Metadata Metadata * Decl
Metadata Metadata MDString Metadata unsigned LineNo
Metadata Metadata MDString * Name
Metadata Metadata MDString Metadata * File
static LLVM_ABI const char * nameTableKindString(DebugNameTableKind PK)
static LLVM_ABI const char * emissionKindString(DebugEmissionKind EK)
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata uint64_t bool bool unsigned bool MDString * SysRoot
DISourceLanguageName Metadata MDString bool MDString * Flags
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata uint64_t bool bool unsigned bool MDString MDString * SDK
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata * GlobalVariables
DebugEmissionKind getEmissionKind() const
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata * EnumTypes
DISourceLanguageName Metadata MDString * Producer
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata * RetainedTypes
DISourceLanguageName Metadata MDString bool MDString unsigned MDString * SplitDebugFilename
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata * ImportedEntities
DISourceLanguageName Metadata MDString bool MDString unsigned MDString unsigned Metadata Metadata Metadata Metadata Metadata * Macros
DebugNameTableKind getNameTableKind() const
DISourceLanguageName Metadata * File
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t AlignInBits
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > EnumKind
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata * DataLocation
static LLVM_ABI DICompositeType * buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, Metadata *SizeInBits, uint32_t AlignInBits, Metadata *OffsetInBits, Metadata *Specification, uint32_t NumExtraInhabitants, DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, std::optional< uint32_t > EnumKind, Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator, Metadata *DataLocation, Metadata *Associated, Metadata *Allocated, Metadata *Rank, Metadata *Annotations, Metadata *BitStride)
Build a DICompositeType with the given ODR identifier.
unsigned MDString Metadata unsigned Line
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata * Elements
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned RuntimeLang
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata Metadata Metadata * Annotations
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString * Identifier
static LLVM_ABI DICompositeType * getODRTypeIfExists(LLVMContext &Context, MDString &Identifier)
unsigned MDString * Name
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata * Discriminator
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata * TemplateParams
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t OffsetInBits
unsigned MDString Metadata unsigned Metadata * Scope
unsigned MDString Metadata * File
unsigned MDString Metadata unsigned Metadata Metadata * BaseType
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Flags
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata * Allocated
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata Metadata Metadata Metadata * Specification
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata * VTableHolder
unsigned MDString Metadata unsigned Metadata Metadata uint64_t SizeInBits
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata * Associated
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata Metadata Metadata Metadata uint32_t NumExtraInhabitants
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata Metadata * Rank
unsigned MDString Metadata unsigned Metadata Metadata uint64_t uint32_t uint64_t DIFlags Metadata unsigned std::optional< uint32_t > Metadata Metadata MDString Metadata Metadata Metadata Metadata Metadata Metadata Metadata uint32_t Metadata * BitStride
unsigned StringRef DIFile unsigned DIScope DIType Metadata uint32_t Metadata * OffsetInBits
unsigned StringRef DIFile unsigned DIScope DIType Metadata uint32_t AlignInBits
unsigned StringRef DIFile unsigned DIScope DIType Metadata uint32_t Metadata std::optional< unsigned > std::optional< PtrAuthData > PtrAuthData
Metadata * getExtraData() const
Get extra data associated with this derived type.
unsigned StringRef DIFile * File
unsigned StringRef DIFile unsigned DIScope DIType Metadata uint32_t Metadata std::optional< unsigned > DWARFAddressSpace
LLVM_ABI DIType * getClassType() const
Get casted version of extra data.
LLVM_ABI Constant * getConstant() const
unsigned StringRef DIFile unsigned DIScope DIType Metadata * SizeInBits
LLVM_ABI Constant * getStorageOffsetInBits() const
LLVM_ABI Constant * getDiscriminantValue() const
unsigned StringRef Name
LLVM_ABI uint32_t getVBPtrOffset() const
Enumeration value.
int64_t bool MDString * Name
LLVM_ABI unsigned getSize() const
Return the size of the operand.
uint64_t getOp() const
Get the operand code.
An iterator for expression operands.
DWARF expression.
element_iterator elements_end() const
LLVM_ABI bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
iterator_range< expr_op_iterator > expr_ops() const
static LLVM_ABI DIExpression * append(const DIExpression *Expr, ArrayRef< uint64_t > Ops)
Append the opcodes Ops to DIExpr.
std::array< uint64_t, 6 > ExtOps
unsigned getNumElements() const
static LLVM_ABI ExtOps getExtOps(unsigned FromSize, unsigned ToSize, bool Signed)
Returns the ops for a zero- or sign-extension in a DIExpression.
expr_op_iterator expr_op_begin() const
Visit the elements via ExprOperand wrappers.
LLVM_ABI bool extractIfOffset(int64_t &Offset) const
If this is a constant offset, extract it.
static LLVM_ABI void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
DbgVariableFragmentInfo FragmentInfo
LLVM_ABI bool startsWithDeref() const
Return whether the first element a DW_OP_deref.
static LLVM_ABI bool isEqualExpression(const DIExpression *FirstExpr, bool FirstIndirect, const DIExpression *SecondExpr, bool SecondIndirect)
Determines whether two debug values should produce equivalent DWARF expressions, using their DIExpres...
expr_op_iterator expr_op_end() const
LLVM_ABI bool isImplicit() const
Return whether this is an implicit location description.
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...
element_iterator elements_begin() const
LLVM_ABI bool hasAllLocationOps(unsigned N) const
Returns true iff this DIExpression contains at least one instance of DW_OP_LLVM_arg,...
std::optional< FragmentInfo > getFragmentInfo() const
Retrieve the details of this fragment expression.
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
LLVM_ABI bool isComplex() const
Return whether the location is computed on the expression stack, meaning it cannot be a simple regist...
static LLVM_ABI std::optional< FragmentInfo > getFragmentInfo(expr_op_iterator Start, expr_op_iterator End)
Retrieve the details of this fragment expression.
static LLVM_ABI std::optional< const DIExpression * > convertToNonVariadicExpression(const DIExpression *Expr)
If Expr is a valid single-location expression, i.e.
LLVM_ABI std::pair< DIExpression *, const ConstantInt * > constantFold(const ConstantInt *CI)
Try to shorten an expression with an initial constant operand.
LLVM_ABI bool isDeref() const
Return whether there is exactly one operator and it is a DW_OP_deref;.
static LLVM_ABI const DIExpression * convertToVariadicExpression(const DIExpression *Expr)
If Expr is a non-variadic expression (i.e.
LLVM_ABI uint64_t getNumLocationOperands() const
Return the number of unique location operands referred to (via DW_OP_LLVM_arg) in this expression; th...
ArrayRef< uint64_t > getElements() const
static LLVM_ABI DIExpression * replaceArg(const DIExpression *Expr, uint64_t OldArg, uint64_t NewArg)
Create a copy of Expr with each instance of DW_OP_LLVM_arg, \p OldArg replaced with DW_OP_LLVM_arg,...
LLVM_ABI std::optional< uint64_t > getActiveBits(DIVariable *Var)
Return the number of bits that have an active value, i.e.
static LLVM_ABI void canonicalizeExpressionOps(SmallVectorImpl< uint64_t > &Ops, const DIExpression *Expr, bool IsIndirect)
Inserts the elements of Expr into Ops modified to a canonical form, which uses DW_OP_LLVM_arg (i....
uint64_t getElement(unsigned I) const
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...
static LLVM_ABI const DIExpression * convertToUndefExpression(const DIExpression *Expr)
Removes all elements from Expr that do not apply to an undef debug value, which includes every operat...
static LLVM_ABI DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
static LLVM_ABI DIExpression * appendToStack(const DIExpression *Expr, ArrayRef< uint64_t > Ops)
Convert DIExpr into a stack value if it isn't one already by appending DW_OP_deref if needed,...
static LLVM_ABI DIExpression * appendExt(const DIExpression *Expr, unsigned FromSize, unsigned ToSize, bool Signed)
Append a zero- or sign-extension to Expr.
LLVM_ABI std::optional< ArrayRef< uint64_t > > getSingleLocationExpressionElements() const
Returns a reference to the elements contained in this expression, skipping past the leading DW_OP_LLV...
LLVM_ABI bool isSingleLocationExpression() const
Return whether the evaluated expression makes use of a single location at the start of the expression...
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...
LLVM_ABI std::optional< SignedOrUnsignedConstant > isConstant() const
Determine whether this represents a constant value, if so.
LLVM_ABI bool isValid() const
static LLVM_ABI const DIExpression * extractAddressClass(const DIExpression *Expr, unsigned &AddrClass)
Checks if the last 4 elements of the expression are DW_OP_constu <DWARFAddress Space> DW_OP_swap DW_O...
static LLVM_ABI DIExpression * prependOpcodes(const DIExpression *Expr, SmallVectorImpl< uint64_t > &Ops, bool StackValue=false, bool EntryValue=false)
Prepend DIExpr with the given opcodes and optionally turn it into a stack value.
MDString MDString * Directory
MDString MDString std::optional< ChecksumInfo< MDString * > > MDString * Source
MDString * Filename
static LLVM_ABI std::optional< ChecksumKind > getChecksumKind(StringRef CSKindStr)
MDString MDString std::optional< ChecksumInfo< MDString * > > CS
unsigned StringRef uint64_t uint32_t unsigned DIFlags unsigned int Factor
static LLVM_ABI std::optional< FixedPointKind > getFixedPointKind(StringRef Str)
static LLVM_ABI const char * fixedPointKindString(FixedPointKind)
unsigned StringRef uint64_t uint32_t unsigned Encoding
unsigned StringRef uint64_t uint32_t AlignInBits
LLVM_ABI bool isSigned() const
@ FixedPointBinary
Scale factor 2^Factor.
@ FixedPointDecimal
Scale factor 10^Factor.
@ FixedPointRational
Arbitrary rational scale factor.
unsigned StringRef uint64_t uint32_t unsigned DIFlags unsigned int APInt Numerator
unsigned StringRef uint64_t uint32_t unsigned DIFlags unsigned int APInt APInt Denominator
unsigned StringRef uint64_t SizeInBits
Metadata * getRawLowerBound() const
Metadata * getRawCountNode() const
Metadata * getRawStride() const
LLVM_ABI BoundType getLowerBound() const
Metadata * getRawUpperBound() const
LLVM_ABI BoundType getCount() const
LLVM_ABI BoundType getUpperBound() const
PointerUnion< DIVariable *, DIExpression * > BoundType
LLVM_ABI BoundType getStride() const
A pair of DIGlobalVariable and DIExpression.
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata Metadata * TemplateParams
Metadata MDString MDString Metadata unsigned Line
Metadata MDString MDString Metadata unsigned Metadata * Type
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata Metadata uint32_t Metadata * Annotations
Metadata MDString * Name
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata * StaticDataMemberDeclaration
Metadata MDString MDString * LinkageName
Metadata MDString MDString Metadata * File
Metadata MDString MDString Metadata unsigned Metadata bool bool Metadata Metadata uint32_t AlignInBits
An imported module (C++ using directive or similar).
unsigned Metadata Metadata * Entity
unsigned Metadata Metadata Metadata unsigned Line
unsigned Metadata Metadata Metadata unsigned MDString * Name
unsigned Metadata Metadata Metadata * File
unsigned Metadata * Scope
Metadata MDString Metadata unsigned unsigned bool std::optional< unsigned > CoroSuspendIdx
Metadata MDString Metadata unsigned unsigned Column
Metadata MDString Metadata unsigned unsigned bool IsArtificial
Metadata MDString Metadata unsigned Line
Metadata MDString * Name
Metadata MDString Metadata * File
LLVM_ABI DILexicalBlockBase(LLVMContext &C, unsigned ID, StorageType Storage, ArrayRef< Metadata * > Ops)
Metadata Metadata unsigned Discriminator
Debug lexical block.
Metadata Metadata unsigned unsigned Column
Metadata Metadata * File
A scope for locals.
LLVM_ABI DISubprogram * getSubprogram() const
Get the subprogram for this scope.
LLVM_ABI DILocalScope * getNonLexicalBlockFileScope() const
Get the first non DILexicalBlockFile scope of this scope.
DILocalScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops)
static LLVM_ABI DILocalScope * cloneScopeForSubprogram(DILocalScope &RootScope, DISubprogram &NewSP, LLVMContext &Ctx, DenseMap< const MDNode *, MDNode * > &Cache)
Traverses the scope chain rooted at RootScope until it hits a Subprogram, recreating the chain with "...
Metadata MDString Metadata unsigned Metadata * Type
Metadata MDString Metadata * File
Metadata MDString * Name
Metadata MDString Metadata unsigned Line
Metadata MDString Metadata unsigned Metadata unsigned DIFlags uint32_t Metadata * Annotations
Metadata MDString Metadata unsigned Metadata unsigned DIFlags uint32_t AlignInBits
unsigned unsigned DILocalScope * Scope
static LLVM_ABI DILocation * getMergedLocations(ArrayRef< DILocation * > Locs)
Try to combine the vector of locations passed as input in a single one.
static LLVM_ABI std::optional< unsigned > encodeDiscriminator(unsigned BD, unsigned DF, unsigned CI)
Raw encoding of the discriminator.
unsigned unsigned DILocalScope DILocation bool ImplicitCode
static LLVM_ABI void decodeDiscriminator(unsigned D, unsigned &BD, unsigned &DF, unsigned &CI)
Raw decoder for values in an encoded discriminator D.
static LLVM_ABI DILocation * getMergedLocation(DILocation *LocA, DILocation *LocB)
Attempts to merge LocA and LocB into a single location; see DebugLoc::getMergedLocation for more deta...
unsigned unsigned Column
unsigned unsigned DILocalScope DILocation * InlinedAt
unsigned unsigned Metadata * File
unsigned unsigned Line
unsigned unsigned Metadata Metadata * Elements
unsigned unsigned MDString MDString * Value
unsigned unsigned MDString * Name
unsigned unsigned Line
Represents a module in the programming language, for example, a Clang module, or a Fortran module.
Metadata Metadata * Scope
Metadata Metadata MDString * Name
Metadata Metadata MDString MDString MDString MDString * APINotesFile
Metadata Metadata MDString MDString MDString * IncludePath
Metadata Metadata MDString MDString * ConfigurationMacros
Metadata Metadata MDString MDString MDString MDString unsigned LineNo
Debug lexical block.
Metadata MDString bool ExportSymbols
Metadata MDString * Name
Tagged DWARF-like metadata node.
LLVM_ABI dwarf::Tag getTag() const
static LLVM_ABI DIFlags getFlag(StringRef Flag)
static LLVM_ABI DIFlags splitFlags(DIFlags Flags, SmallVectorImpl< DIFlags > &SplitFlags)
Split up a flags bitfield.
DINode(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops1, ArrayRef< Metadata * > Ops2={})
static LLVM_ABI StringRef getFlagString(DIFlags Flag)
DIFlags
Debug info flags.
MDString Metadata * File
MDString Metadata unsigned MDString MDString unsigned Metadata * Type
MDString Metadata unsigned MDString * GetterName
MDString Metadata unsigned MDString MDString * SetterName
Base class for scope-like contexts.
LLVM_ABI StringRef getName() const
DIFile * getFile() const
LLVM_ABI DIScope * getScope() const
DIScope(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops)
Wrapper structure that holds a language name and its version.
String type, Fortran CHARACTER(n)
unsigned MDString * Name
unsigned MDString Metadata Metadata Metadata uint64_t SizeInBits
unsigned MDString Metadata Metadata Metadata uint64_t uint32_t AlignInBits
unsigned MDString Metadata Metadata Metadata * StringLocationExp
unsigned MDString Metadata Metadata * StringLengthExp
unsigned MDString Metadata Metadata Metadata uint64_t uint32_t unsigned Encoding
unsigned MDString Metadata * StringLength
Subprogram description. Uses SubclassData1.
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata Metadata Metadata MDString bool UsesKeyInstructions
Metadata MDString MDString Metadata unsigned Metadata unsigned ScopeLine
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags SPFlags
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata * ContainingType
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata * TemplateParams
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata * Declaration
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata Metadata Metadata MDString * TargetFuncName
static LLVM_ABI DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized, unsigned Virtuality=SPFlagNonvirtual, bool IsMainSubprogram=false)
Metadata MDString * Name
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata Metadata * ThrownTypes
static LLVM_ABI DISPFlags getFlag(StringRef Flag)
Metadata MDString MDString Metadata * File
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned VirtualIndex
static LLVM_ABI DISPFlags splitFlags(DISPFlags Flags, SmallVectorImpl< DISPFlags > &SplitFlags)
Split up a flags bitfield for easier printing.
static LLVM_ABI StringRef getFlagString(DISPFlags Flag)
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata * RetainedNodes
DISPFlags
Debug info subprogram flags.
Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int ThisAdjustment
StringRef DIFile unsigned Line
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags DIType Metadata Metadata * UpperBound
PointerUnion< ConstantInt *, DIVariable *, DIExpression * > BoundType
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags DIType Metadata Metadata Metadata Metadata * Bias
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags DIType Metadata Metadata Metadata * Stride
StringRef DIFile unsigned DIScope uint64_t SizeInBits
StringRef DIFile * File
StringRef DIFile unsigned DIScope uint64_t uint32_t AlignInBits
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags DIType Metadata * LowerBound
StringRef DIFile unsigned DIScope uint64_t uint32_t DIFlags Flags
Array subrange.
LLVM_ABI BoundType getUpperBound() const
LLVM_ABI BoundType getStride() const
LLVM_ABI BoundType getLowerBound() const
LLVM_ABI BoundType getCount() const
Type array for a subprogram.
DIFlags uint8_t Metadata * TypeArray
Base class for template parameters.
unsigned MDString Metadata * Type
unsigned MDString Metadata bool Metadata * Value
Base class for types.
bool isBitField() const
bool isStaticMember() const
DIType(LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, unsigned Line, uint32_t AlignInBits, uint32_t NumExtraInhabitants, DIFlags Flags, ArrayRef< Metadata * > Ops)
LLVM_ABI uint32_t getAlignInBits() const
Base class for variables.
std::optional< DIBasicType::Signedness > getSignedness() const
Return the signedness of this variable's type, or std::nullopt if this type is neither signed nor uns...
LLVM_ABI std::optional< uint64_t > getSizeInBits() const
Determines the size of the variable's type.
Metadata * getRawType() const
LLVM_ABI DIVariable(LLVMContext &C, unsigned ID, StorageType Storage, signed Line, ArrayRef< Metadata * > Ops, uint32_t AlignInBits=0)
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LLVM_ABI DebugVariableAggregate(const DbgVariableRecord *DVR)
const DILocation * getInlinedAt() const
const DILocalVariable * getVariable() const
LLVM_ABI DebugVariable(const DbgVariableRecord *DVR)
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:167
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:237
iterator end()
Definition DenseMap.h:81
Class representing an expression and its matching format.
Generic tagged DWARF-like metadata node.
LLVM_ABI dwarf::Tag getTag() const
unsigned MDString * Header
unsigned MDString ArrayRef< Metadata * > DwarfOps
DenseSet< DIArgList *, DIArgListInfo > DIArgLists
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVMContextImpl *const pImpl
Definition LLVMContext.h:70
Metadata node.
Definition Metadata.h:1078
friend class DIAssignID
Definition Metadata.h:1081
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1577
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1569
LLVM_ABI TempMDNode clone() const
Create a (temporary) clone of this.
Definition Metadata.cpp:669
static T * storeImpl(T *N, StorageType Storage, StoreT &Store)
LLVMContext & getContext() const
Definition Metadata.h:1242
static std::enable_if_t< std::is_base_of< MDNode, T >::value, T * > replaceWithUniqued(std::unique_ptr< T, TempMDNodeDeleter > N)
Replace a temporary node with a uniqued one.
Definition Metadata.h:1317
A single uniqued string.
Definition Metadata.h:721
LLVM_ABI StringRef getString() const
Definition Metadata.cpp:618
static void untrack(Metadata *&MD)
Stop tracking a reference to metadata.
Definition Metadata.h:357
static bool track(Metadata *&MD)
Track the reference to metadata.
Definition Metadata.h:323
Root of the metadata hierarchy.
Definition Metadata.h:64
StorageType
Active type of storage.
Definition Metadata.h:72
unsigned short SubclassData16
Definition Metadata.h:78
unsigned SubclassData32
Definition Metadata.h:79
unsigned char Storage
Storage flag for non-uniqued, otherwise unowned, metadata.
Definition Metadata.h:75
unsigned char SubclassData1
Definition Metadata.h:77
Metadata(unsigned ID, StorageType Storage)
Definition Metadata.h:88
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
LLVM_ABI void replaceAllUsesWith(Metadata *MD)
Replace all uses of this with MD.
Definition Metadata.cpp:369
LLVMContext & getContext() const
Definition Metadata.h:408
LLVM_ABI void resolveAllUses(bool ResolveUsers=true)
Resolve all uses of this.
Definition Metadata.cpp:422
Implements a dense probed hash-table based set with some number of buckets stored inline.
Definition DenseSet.h:291
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:338
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
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:143
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:298
Value wrapper in the Metadata hierarchy.
Definition Metadata.h:458
static LLVM_ABI ValueAsMetadata * get(Value *V)
Definition Metadata.cpp:503
LLVM Value Representation.
Definition Value.h:75
LLVM_ABI std::optional< int64_t > getPointerOffsetFrom(const Value *Other, const DataLayout &DL) const
If this ptr is provably equal to Other plus a constant offset, return that offset in bytes.
Definition Value.cpp:1052
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:202
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:175
Changed
#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
initializer< Ty > init(const Ty &Val)
Calculates the starting offsets for various sections within the .debug_names section.
Definition Dwarf.h:35
@ DW_OP_LLVM_entry_value
Only used in LLVM metadata.
Definition Dwarf.h:147
@ DW_OP_LLVM_implicit_pointer
Only used in LLVM metadata.
Definition Dwarf.h:148
@ DW_OP_LLVM_extract_bits_zext
Only used in LLVM metadata.
Definition Dwarf.h:151
@ DW_OP_LLVM_tag_offset
Only used in LLVM metadata.
Definition Dwarf.h:146
@ DW_OP_LLVM_fragment
Only used in LLVM metadata.
Definition Dwarf.h:144
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
Definition Dwarf.h:149
@ DW_OP_LLVM_convert
Only used in LLVM metadata.
Definition Dwarf.h:145
@ DW_OP_LLVM_extract_bits_sext
Only used in LLVM metadata.
Definition Dwarf.h:150
@ DW_VIRTUALITY_max
Definition Dwarf.h:200
@ NameTableKind
Definition LLToken.h:503
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:318
@ Offset
Definition DWP.cpp:477
static T * getUniqued(DenseSet< T *, InfoT > &Store, const typename InfoT::KeyTy &Key)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:644
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2138
auto cast_or_null(const Y &Val)
Definition Casting.h:715
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:754
LLVM_ABI cl::opt< bool > EnableFSDiscriminator
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
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1741
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
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_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
@ Ref
The access may reference the value stored in memory.
Definition ModRef.h:32
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:71
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:560
LLVM_ABI cl::opt< bool > PickMergedSourceLocations("pick-merged-source-locations", cl::init(false), cl::Hidden, cl::desc("Preserve line and column number when merging locations."))
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:867
#define N
SmallPtrSet< DIScope *, 8 > Scopes
void insert(DIScope *S, LineColumn Loc)
DIScope * match(DIScope *S, LineColumn Loc)
void insert(DIScope *S, LineColumn Loc)
DIScope * match(DIScope *S, LineColumn Loc)
SmallMapVector< std::pair< DIFile *, LineColumn >, SmallSetVector< DIScope *, 8 >, 8 > Scopes
A single checksum, represented by a Kind and a Value (a string).
static DbgVariableFragmentInfo intersect(DbgVariableFragmentInfo A, DbgVariableFragmentInfo B)
Returns a zero-sized fragment if A and B don't intersect.
A MapVector that performs no allocations if smaller than a certain size.
Definition MapVector.h:257