LLVM 24.0.0git
DwarfDebug.h
Go to the documentation of this file.
1//===- llvm/CodeGen/DwarfDebug.h - Dwarf Debug Framework --------*- C++ -*-===//
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 contains support for writing dwarf debug info into asm files.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_CODEGEN_ASMPRINTER_DWARFDEBUG_H
14#define LLVM_LIB_CODEGEN_ASMPRINTER_DWARFDEBUG_H
15
16#include "AddressPool.h"
17#include "DebugLocEntry.h"
18#include "DebugLocStream.h"
19#include "DwarfFile.h"
20#include "llvm/ADT/DenseMap.h"
21#include "llvm/ADT/DenseSet.h"
22#include "llvm/ADT/MapVector.h"
23#include "llvm/ADT/SetVector.h"
26#include "llvm/ADT/StringMap.h"
27#include "llvm/ADT/StringRef.h"
33#include "llvm/IR/DebugLoc.h"
34#include "llvm/IR/Metadata.h"
35#include "llvm/MC/MCDwarf.h"
38#include <cassert>
39#include <cstdint>
40#include <limits>
41#include <memory>
42#include <utility>
43#include <variant>
44#include <vector>
45
46namespace llvm {
47
48class AsmPrinter;
49class ByteStreamer;
50class DIE;
52class DwarfExpression;
53class DwarfTypeUnit;
54class DwarfUnit;
55class GlobalVariable;
56class LexicalScope;
57class MachineFunction;
58class MCSection;
59class MCSymbol;
60class Module;
61
62//===----------------------------------------------------------------------===//
63/// This class is defined as the common parent of DbgVariable and DbgLabel
64/// such that it could levarage polymorphism to extract common code for
65/// DbgVariable and DbgLabel.
66class DbgEntity {
67public:
72
73private:
74 const DINode *Entity;
75 const DILocation *InlinedAt;
76 DIE *TheDIE = nullptr;
77 const DbgEntityKind SubclassID;
78
79public:
80 DbgEntity(const DINode *N, const DILocation *IA, DbgEntityKind ID)
81 : Entity(N), InlinedAt(IA), SubclassID(ID) {}
82 virtual ~DbgEntity() = default;
83
84 /// Accessors.
85 /// @{
86 const DINode *getEntity() const { return Entity; }
87 const DILocation *getInlinedAt() const { return InlinedAt; }
88 DIE *getDIE() const { return TheDIE; }
89 DbgEntityKind getDbgEntityID() const { return SubclassID; }
90 /// @}
91
92 void setDIE(DIE &D) { TheDIE = &D; }
93
94 static bool classof(const DbgEntity *N) {
95 switch (N->getDbgEntityID()) {
96 case DbgVariableKind:
97 case DbgLabelKind:
98 return true;
99 }
100 llvm_unreachable("Invalid DbgEntityKind");
101 }
102};
103
104class DbgVariable;
105
106bool operator<(const struct FrameIndexExpr &LHS,
107 const struct FrameIndexExpr &RHS);
108bool operator<(const struct EntryValueInfo &LHS,
109 const struct EntryValueInfo &RHS);
110
111/// Proxy for one MMI entry.
113 int FI;
115
116 /// Operator enabling sorting based on fragment offset.
117 friend bool operator<(const FrameIndexExpr &LHS, const FrameIndexExpr &RHS);
118};
119
120/// Represents an entry-value location, or a fragment of one.
124
125 /// Operator enabling sorting based on fragment offset.
126 friend bool operator<(const EntryValueInfo &LHS, const EntryValueInfo &RHS);
127};
128
129// Namespace for alternatives of a DbgVariable.
130namespace Loc {
131/// Single value location description.
132class Single {
133 std::unique_ptr<DbgValueLoc> ValueLoc;
134 const DIExpression *Expr;
135
136public:
137 explicit Single(DbgValueLoc ValueLoc);
138 explicit Single(const MachineInstr *DbgValue);
139 const DbgValueLoc &getValueLoc() const { return *ValueLoc; }
140 const DIExpression *getExpr() const { return Expr; }
141};
142/// Multi-value location description.
143class Multi {
144 /// Index of the entry list in DebugLocs.
145 unsigned DebugLocListIndex;
146 /// DW_OP_LLVM_tag_offset value from DebugLocs.
147 std::optional<uint8_t> DebugLocListTagOffset;
148
149public:
150 explicit Multi(unsigned DebugLocListIndex,
151 std::optional<uint8_t> DebugLocListTagOffset)
152 : DebugLocListIndex(DebugLocListIndex),
153 DebugLocListTagOffset(DebugLocListTagOffset) {}
154 unsigned getDebugLocListIndex() const { return DebugLocListIndex; }
155 std::optional<uint8_t> getDebugLocListTagOffset() const {
156 return DebugLocListTagOffset;
157 }
158};
159/// Single location defined by (potentially multiple) MMI entries.
160struct MMI {
161 std::set<FrameIndexExpr> FrameIndexExprs;
162
163public:
164 explicit MMI(const DIExpression *E, int FI) : FrameIndexExprs({{FI, E}}) {
165 assert((!E || E->isValid()) && "Expected valid expression");
166 assert(FI != std::numeric_limits<int>::max() && "Expected valid index");
167 }
168 void addFrameIndexExpr(const DIExpression *Expr, int FI);
169 /// Get the FI entries, sorted by fragment offset.
170 const std::set<FrameIndexExpr> &getFrameIndexExprs() const;
171};
172/// Single location defined by (potentially multiple) EntryValueInfo.
174 std::set<EntryValueInfo> EntryValues;
175 explicit EntryValue(MCRegister Reg, const DIExpression &Expr) {
176 addExpr(Reg, Expr);
177 };
178 // Add the pair Reg, Expr to the list of entry values describing the variable.
179 // If multiple expressions are added, it is the callers responsibility to
180 // ensure they are all non-overlapping fragments.
181 void addExpr(MCRegister Reg, const DIExpression &Expr) {
182 std::optional<const DIExpression *> NonVariadicExpr =
184 assert(NonVariadicExpr && *NonVariadicExpr);
185
186 EntryValues.insert({Reg, **NonVariadicExpr});
187 }
188};
189/// Alias for the std::variant specialization base class of DbgVariable.
190using Variant = std::variant<std::monostate, Loc::Single, Loc::Multi, Loc::MMI,
192} // namespace Loc
193
194//===----------------------------------------------------------------------===//
195/// This class is used to track local variable information.
196///
197/// Variables that have been optimized out hold the \c monostate alternative.
198/// This is not distinguished from the case of a constructed \c DbgVariable
199/// which has not be initialized yet.
200///
201/// Variables can be created from allocas, in which case they're generated from
202/// the MMI table. Such variables hold the \c Loc::MMI alternative which can
203/// have multiple expressions and frame indices.
204///
205/// Variables can be created from the entry value of registers, in which case
206/// they're generated from the MMI table. Such variables hold the \c
207/// EntryValueLoc alternative which can either have a single expression or
208/// multiple *fragment* expressions.
209///
210/// Variables can be created from \c DBG_VALUE instructions. Those whose
211/// location changes over time hold a \c Loc::Multi alternative which uses \c
212/// DebugLocListIndex and (optionally) \c DebugLocListTagOffset, while those
213/// with a single location hold a \c Loc::Single alternative which use \c
214/// ValueLoc and (optionally) a single \c Expr.
215class DbgVariable : public DbgEntity, public Loc::Variant {
216
217public:
218 /// To workaround P2162R0 https://github.com/cplusplus/papers/issues/873 the
219 /// base class subobject needs to be passed directly to std::visit, so expose
220 /// it directly here.
221 Loc::Variant &asVariant() { return *static_cast<Loc::Variant *>(this); }
222 const Loc::Variant &asVariant() const {
223 return *static_cast<const Loc::Variant *>(this);
224 }
225 /// Member shorthand for std::holds_alternative
226 template <typename T> bool holds() const {
227 return std::holds_alternative<T>(*this);
228 }
229 /// Asserting, noexcept member alternative to std::get
230 template <typename T> auto &get() noexcept {
231 assert(holds<T>());
232 return *std::get_if<T>(this);
233 }
234 /// Asserting, noexcept member alternative to std::get
235 template <typename T> const auto &get() const noexcept {
236 assert(holds<T>());
237 return *std::get_if<T>(this);
238 }
239
240 /// Construct a DbgVariable.
241 ///
242 /// Creates a variable without any DW_AT_location.
244 : DbgEntity(V, IA, DbgVariableKind) {}
245
246 // Accessors.
249 }
250
251 StringRef getName() const { return getVariable()->getName(); }
252
253 // Translate tag to proper Dwarf tag.
255 // FIXME: Why don't we just infer this tag and store it all along?
256 if (getVariable()->isParameter())
257 return dwarf::DW_TAG_formal_parameter;
258
259 return dwarf::DW_TAG_variable;
260 }
261
262 /// Return true if DbgVariable is artificial.
263 bool isArtificial() const {
264 if (getVariable()->isArtificial())
265 return true;
266 if (getType()->isArtificial())
267 return true;
268 return false;
269 }
270
271 bool isObjectPointer() const {
273 return true;
274 if (getType()->isObjectPointer())
275 return true;
276 return false;
277 }
278
279 const DIType *getType() const;
280
281 static bool classof(const DbgEntity *N) {
282 return N->getDbgEntityID() == DbgVariableKind;
283 }
284};
285
286//===----------------------------------------------------------------------===//
287/// This class is used to track label information.
288///
289/// Labels are collected from \c DBG_LABEL instructions.
290class DbgLabel : public DbgEntity {
291 const MCSymbol *Sym; /// Symbol before DBG_LABEL instruction.
292
293public:
294 /// We need MCSymbol information to generate DW_AT_low_pc.
295 DbgLabel(const DILabel *L, const DILocation *IA, const MCSymbol *Sym = nullptr)
296 : DbgEntity(L, IA, DbgLabelKind), Sym(Sym) {}
297
298 /// Accessors.
299 /// @{
300 const DILabel *getLabel() const { return cast<DILabel>(getEntity()); }
301 const MCSymbol *getSymbol() const { return Sym; }
302
303 StringRef getName() const { return getLabel()->getName(); }
304 /// @}
305
306 /// Translate tag to proper Dwarf tag.
308 return dwarf::DW_TAG_label;
309 }
310
311 static bool classof(const DbgEntity *N) {
312 return N->getDbgEntityID() == DbgLabelKind;
313 }
314};
315
316/// Used for tracking debug info about call site parameters.
318private:
319 unsigned Register; ///< Parameter register at the callee entry point.
320 DbgValueLoc Value; ///< Corresponding location for the parameter value at
321 ///< the call site.
322public:
324 : Register(Reg), Value(Val) {
325 assert(Reg && "Parameter register cannot be undef");
326 }
327
328 unsigned getRegister() const { return Register; }
329 DbgValueLoc getValue() const { return Value; }
330};
331
332/// Collection used for storing debug call site parameters.
334
335/// Helper used to pair up a symbol and its DWARF compile unit.
342
343/// The kind of accelerator tables we should emit.
344enum class AccelTableKind {
345 Default, ///< Platform default.
346 None, ///< None.
347 Apple, ///< .apple_names, .apple_namespaces, .apple_types, .apple_objc.
348 Dwarf, ///< DWARF v5 .debug_names.
349};
350
351/// Collects and handles dwarf debug information.
353 /// All DIEValues are allocated through this allocator.
354 BumpPtrAllocator DIEValueAllocator;
355
356 /// Maps MDNode with its corresponding DwarfCompileUnit.
358
359 /// Maps a CU DIE with its corresponding DwarfCompileUnit.
361
362 /// List of all labels used in aranges generation.
363 std::vector<SymbolCU> ArangeLabels;
364
365 /// Size of each symbol emitted (for those symbols that have a specific size).
367
368 /// Collection of abstract variables/labels.
369 SmallVector<std::unique_ptr<DbgEntity>, 64> ConcreteEntities;
370
371 /// Collection of DebugLocEntry. Stored in a linked list so that DIELocLists
372 /// can refer to them in spite of insertions into this list.
373 DebugLocStream DebugLocs;
374
375 /// This is a collection of subprogram MDNodes that are processed to
376 /// create DIEs.
378
379 /// Map function-local imported entities to their parent local scope
380 /// (either DILexicalBlock or DISubprogram) for a processed function
381 /// (including inlined subprograms).
385
386 SmallDenseSet<const MachineInstr *> ForceIsStmtInstrs;
387
388 /// If nonnull, stores the current machine function we're processing.
389 const MachineFunction *CurFn = nullptr;
390
391 /// If nonnull, stores the CU in which the previous subprogram was contained.
392 const DwarfCompileUnit *PrevCU = nullptr;
393
394 /// As an optimization, there is no need to emit an entry in the directory
395 /// table for the same directory as DW_AT_comp_dir.
396 StringRef CompilationDir;
397
398 /// Holders for the various debug information flags that we might need to
399 /// have exposed. See accessor functions below for description.
400
401 /// Map from MDNodes for user-defined types to their type signatures. Also
402 /// used to keep track of which types we have emitted type units for.
404
406
408 std::pair<std::unique_ptr<DwarfTypeUnit>, const DICompositeType *>, 1>
409 TypeUnitsUnderConstruction;
410
411 /// Symbol pointing to the current function's DWARF line table entries.
412 MCSymbol *FunctionLineTableLabel;
413
414 /// Used to set a uniqe ID for a Type Unit.
415 /// This counter represents number of DwarfTypeUnits created, not necessarily
416 /// number of type units that will be emitted.
417 unsigned NumTypeUnitsCreated = 0;
418
419 /// Whether to use the GNU TLS opcode (instead of the standard opcode).
420 bool UseGNUTLSOpcode;
421
422 /// Whether to use DWARF 2 bitfields (instead of the DWARF 4 format).
423 bool UseDWARF2Bitfields;
424
425 /// Whether to emit all linkage names, or just abstract subprograms.
426 bool UseAllLinkageNames;
427
428 /// Use inlined strings.
429 bool UseInlineStrings = false;
430
431 /// Allow emission of .debug_ranges section.
432 bool UseRangesSection = true;
433
434 /// True if the sections itself must be used as references and don't create
435 /// temp symbols inside DWARF sections.
436 bool UseSectionsAsReferences = false;
437
438 /// Allow emission of .debug_aranges section
439 bool UseARangesSection = false;
440
441 /// Generate DWARF v4 type units.
442 bool GenerateTypeUnits;
443
444 /// Emit a .debug_macro section instead of .debug_macinfo.
445 bool UseDebugMacroSection;
446
447 /// Avoid using DW_OP_convert due to consumer incompatibilities.
448 bool EnableOpConvert;
449
450public:
458
460 CU = 0,
461 TU = 1,
462 };
463
464private:
465 /// Instructions which should get is_stmt applied because they implement key
466 /// functionality for a source atom.
468
469 /// Force the use of DW_AT_ranges even for single-entry range lists.
470 MinimizeAddrInV5 MinimizeAddr = MinimizeAddrInV5::Disabled;
471
472 /// DWARF5 Experimental Options
473 /// @{
474 AccelTableKind TheAccelTableKind;
475 bool HasAppleExtensionAttributes;
476 bool HasSplitDwarf;
477
478 /// Whether to generate the DWARF v5 string offsets table.
479 /// It consists of a series of contributions, each preceded by a header.
480 /// The pre-DWARF v5 string offsets table for split dwarf is, in contrast,
481 /// a monolithic sequence of string offsets.
482 bool UseSegmentedStringOffsetsTable;
483
484 /// Enable production of call site parameters needed to print the debug entry
485 /// values. Useful for testing purposes when a debugger does not support the
486 /// feature yet.
487 bool EmitDebugEntryValues;
488
489 /// Separated Dwarf Variables
490 /// In general these will all be for bits that are left in the
491 /// original object file, rather than things that are meant
492 /// to be in the .dwo sections.
493
494 /// Holder for the skeleton information.
495 DwarfFile SkeletonHolder;
496
497 /// Store file names for type units under fission in a line table
498 /// header that will be emitted into debug_line.dwo.
499 // FIXME: replace this with a map from comp_dir to table so that we
500 // can emit multiple tables during LTO each of which uses directory
501 // 0, referencing the comp_dir of all the type units that use it.
502 MCDwarfDwoLineTable SplitTypeUnitFileTable;
503 /// @}
504
505 /// True iff there are multiple CUs in this module.
506 bool SingleCU;
507 bool IsDarwin;
508
509 AddressPool AddrPool;
510
511 /// Accelerator tables.
512 DWARF5AccelTable AccelDebugNames;
513 DWARF5AccelTable AccelTypeUnitsDebugNames;
514 /// Used to hide which DWARF5AccelTable we are using now.
515 DWARF5AccelTable *CurrentDebugNames = &AccelDebugNames;
520
521 /// Identify a debugger for "tuning" the debug info.
522 ///
523 /// The "tuning" should be used to set defaults for individual feature flags
524 /// in DwarfDebug; if a given feature has a more specific command-line option,
525 /// that option should take precedence over the tuning.
526 DebuggerKind DebuggerTuning = DebuggerKind::Default;
527
528 MCDwarfDwoLineTable *getDwoLineTable(const DwarfCompileUnit &);
529
530 using InlinedEntity = DbgValueHistoryMap::InlinedEntity;
531
532 void ensureAbstractEntityIsCreatedIfScoped(DwarfCompileUnit &CU,
533 const DINode *Node,
534 const MDNode *Scope);
535
536 DbgEntity *createConcreteEntity(DwarfCompileUnit &TheCU,
537 LexicalScope &Scope,
538 const DINode *Node,
539 const DILocation *Location,
540 const MCSymbol *Sym = nullptr);
541
542 /// Construct a DIE for this abstract scope.
543 void constructAbstractSubprogramScopeDIE(DwarfCompileUnit &SrcCU, LexicalScope *Scope);
544
545 /// Construct DIEs for call site entries describing the calls in \p MF.
546 void constructCallSiteEntryDIEs(const DISubprogram &SP, DwarfCompileUnit &CU,
547 DIE &ScopeDIE, const MachineFunction &MF);
548
549 template <typename DataT>
550 void addAccelNameImpl(const DwarfUnit &Unit,
551 const DICompileUnit::DebugNameTableKind NameTableKind,
552 AccelTable<DataT> &AppleAccel, StringRef Name,
553 const DIE &Die);
554
555 void finishEntityDefinitions();
556
557 void finishSubprogramDefinitions();
558
559 /// Finish off debug information after all functions have been
560 /// processed.
561 void finalizeModuleInfo();
562
563 /// Emit the debug info section.
564 void emitDebugInfo();
565
566 /// Emit the abbreviation section.
567 void emitAbbreviations();
568
569 /// Emit the string offsets table header.
570 void emitStringOffsetsTableHeader();
571
572 /// Emit a specified accelerator table.
573 template <typename AccelTableT>
574 void emitAccel(AccelTableT &Accel, MCSection *Section, StringRef TableName);
575
576 /// Emit DWARF v5 accelerator table.
577 void emitAccelDebugNames();
578
579 /// Emit visible names into a hashed accelerator table section.
580 void emitAccelNames();
581
582 /// Emit objective C classes and categories into a hashed
583 /// accelerator table section.
584 void emitAccelObjC();
585
586 /// Emit namespace dies into a hashed accelerator table.
587 void emitAccelNamespaces();
588
589 /// Emit type dies into a hashed accelerator table.
590 void emitAccelTypes();
591
592 /// Emit visible names and types into debug pubnames and pubtypes sections.
593 void emitDebugPubSections();
594
595 void emitDebugPubSection(bool GnuStyle, StringRef Name,
596 DwarfCompileUnit *TheU,
597 const StringMap<const DIE *> &Globals);
598
599 /// Emit null-terminated strings into a debug str section.
600 void emitDebugStr();
601
602 /// Emit variable locations into a debug loc section.
603 void emitDebugLoc();
604
605 /// Emit variable locations into a debug loc dwo section.
606 void emitDebugLocDWO();
607
608 void emitDebugLocImpl(MCSection *Sec);
609
610 /// Emit address ranges into a debug aranges section.
611 void emitDebugARanges();
612
613 /// Emit address ranges into a debug ranges section.
614 void emitDebugRanges();
615 void emitDebugRangesDWO();
616 void emitDebugRangesImpl(const DwarfFile &Holder, MCSection *Section);
617
618 /// Emit macros into a debug macinfo section.
619 void emitDebugMacinfo();
620 /// Emit macros into a debug macinfo.dwo section.
621 void emitDebugMacinfoDWO();
622 void emitDebugMacinfoImpl(MCSection *Section);
623 void emitMacro(DIMacro &M);
624 void emitMacroFile(DIMacroFile &F, DwarfCompileUnit &U);
625 void emitMacroFileImpl(DIMacroFile &F, DwarfCompileUnit &U,
626 unsigned StartFile, unsigned EndFile,
627 StringRef (*MacroFormToString)(unsigned Form));
628 void handleMacroNodes(DIMacroNodeArray Nodes, DwarfCompileUnit &U);
629
630 /// DWARF 5 Experimental Split Dwarf Emitters
631
632 /// Initialize common features of skeleton units.
633 void initSkeletonUnit(const DwarfUnit &U, DIE &Die,
634 std::unique_ptr<DwarfCompileUnit> NewU);
635
636 /// Construct the split debug info compile unit for the debug info section.
637 /// In DWARF v5, the skeleton unit DIE may have the following attributes:
638 /// DW_AT_addr_base, DW_AT_comp_dir, DW_AT_dwo_name, DW_AT_high_pc,
639 /// DW_AT_low_pc, DW_AT_ranges, DW_AT_stmt_list, and DW_AT_str_offsets_base.
640 /// Prior to DWARF v5 it may also have DW_AT_GNU_dwo_id. DW_AT_GNU_dwo_name
641 /// is used instead of DW_AT_dwo_name, Dw_AT_GNU_addr_base instead of
642 /// DW_AT_addr_base, and DW_AT_GNU_ranges_base instead of DW_AT_rnglists_base.
643 DwarfCompileUnit &constructSkeletonCU(const DwarfCompileUnit &CU);
644
645 /// Emit the debug info dwo section.
646 void emitDebugInfoDWO();
647
648 /// Emit the debug abbrev dwo section.
649 void emitDebugAbbrevDWO();
650
651 /// Emit the debug line dwo section.
652 void emitDebugLineDWO();
653
654 /// Emit the dwo stringoffsets table header.
655 void emitStringOffsetsTableHeaderDWO();
656
657 /// Emit the debug str dwo section.
658 void emitDebugStrDWO();
659
660 /// Emit DWO addresses.
661 void emitDebugAddr();
662
663 /// Flags to let the linker know we have emitted new style pubnames. Only
664 /// emit it here if we don't have a skeleton CU for split dwarf.
665 void addGnuPubAttributes(DwarfCompileUnit &U, DIE &D) const;
666
667 DwarfCompileUnit *getDwarfCompileUnit(const DICompileUnit *DIUnit);
668 /// Create new DwarfCompileUnit for the given metadata node with tag
669 /// DW_TAG_compile_unit.
670 DwarfCompileUnit &getOrCreateDwarfCompileUnit(const DICompileUnit *DIUnit);
671 void finishUnitAttributes(const DICompileUnit *DIUnit,
672 DwarfCompileUnit &NewCU);
673
674 /// Register a source line with debug info. Returns the unique
675 /// label that was emitted and which provides correspondence to the
676 /// source line list.
677 void recordSourceLine(unsigned Line, unsigned Col, const MDNode *Scope,
678 unsigned Flags, StringRef Location = {});
679
680 /// Populate LexicalScope entries with variables' info.
681 void collectEntityInfo(DwarfCompileUnit &TheCU, const DISubprogram *SP,
682 DenseSet<InlinedEntity> &ProcessedVars);
683
684 /// Build the location list for all DBG_VALUEs in the
685 /// function that describe the same variable. If the resulting
686 /// list has only one entry that is valid for entire variable's
687 /// scope return true.
688 bool buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
689 const DbgValueHistoryMap::Entries &Entries);
690
691 /// Collect variable information from the side table maintained by MF.
692 void collectVariableInfoFromMFTable(DwarfCompileUnit &TheCU,
693 DenseSet<InlinedEntity> &P);
694
695 /// Emit the reference to the section.
696 void emitSectionReference(const DwarfCompileUnit &CU);
697
698 void findForceIsStmtInstrs(const MachineFunction *MF);
699
700 /// Compute instructions which should get is_stmt applied because they
701 /// implement key functionality for a source location atom, store results in
702 /// DwarfDebug::KeyInstructions.
703 void computeKeyInstructions(const MachineFunction *MF);
704
705protected:
706 /// Holder for the file specific debug information.
708 /// Gather pre-function debug information.
709 void beginFunctionImpl(const MachineFunction *MF) override;
710
711 /// Gather and emit post-function debug information.
712 void endFunctionImpl(const MachineFunction *MF) override;
713
714 /// Get Dwarf compile unit ID for line table.
716
717 void skippedNonDebugFunction() override;
718
719 /// Target-specific debug info initialization at function start.
721
722 /// Setters for target-specific DWARF configuration overrides.
723 /// Called from target DwarfDebug subclass constructors.
724 void setUseInlineStrings(bool V) { UseInlineStrings = V; }
725 void setUseRangesSection(bool V) { UseRangesSection = V; }
726 void setUseSectionsAsReferences(bool V) { UseSectionsAsReferences = V; }
727
728 /// Whether to attach ranges/low_pc to the compile unit DIE in endModule.
729 virtual bool shouldAttachCompileUnitRanges() const { return true; }
730
731 /// Target-specific source line recording.
732 virtual void recordTargetSourceLine(const DebugLoc &DL, unsigned Flags);
733
734 /// Target-specific compile unit attribute finalization.
735 virtual void finishTargetUnitAttributes(const DICompileUnit &DIUnit,
736 DwarfCompileUnit &NewCU) {}
737
741
742public:
743 //===--------------------------------------------------------------------===//
744 // Target hooks for debug info customization.
745 //
746
747 /// Whether the target requires resetting the base address in range/loc lists.
748 virtual bool shouldResetBaseAddress(const MCSection &Section) const {
749 return false;
750 }
751
752 /// Describes the storage kind of a debug variable for target hooks.
754
755 /// Extract target-specific address space information from a DIExpression.
756 /// Targets may strip address-space-encoding ops from the expression and
757 /// return the address space via \p TargetAddrSpace.
758 virtual const DIExpression *
760 std::optional<unsigned> &TargetAddrSpace) const {
761 return Expr;
762 }
763
764 /// Add target-specific attributes to a variable DIE (e.g.
765 /// DW_AT_address_class).
766 virtual void
768 std::optional<unsigned> TargetAddrSpace,
769 VariableLocationKind VarLocKind,
770 const GlobalVariable *GV = nullptr) const {}
771
772 //===--------------------------------------------------------------------===//
773 // Main entry points.
774 //
776
777 ~DwarfDebug() override;
778
779 /// Emit all Dwarf sections that should come prior to the
780 /// content.
781 void beginModule(Module *M) override;
782
783 /// Emit all Dwarf sections that should come after the content.
784 void endModule() override;
785
786 /// Emits inital debug location directive. Returns instruction at which
787 /// the function prologue ends.
789 unsigned CUID);
790
791 /// Process beginning of an instruction.
792 void beginInstruction(const MachineInstr *MI) override;
793
794 /// Process beginning of code alignment.
795 void beginCodeAlignment(const MachineBasicBlock &MBB) override;
796
797 /// Perform an MD5 checksum of \p Identifier and return the lower 64 bits.
798 static uint64_t makeTypeSignature(StringRef Identifier);
799
800 /// Add a DIE to the set of types that we're going to pull into
801 /// type units.
803 DIE &Die, const DICompositeType *CTy);
804
805 /// Add a label so that arange data can be generated for it.
806 void addArangeLabel(SymbolCU SCU) { ArangeLabels.push_back(SCU); }
807
808 /// For symbols that have a size designated (e.g. common symbols),
809 /// this tracks that size.
810 void setSymbolSize(const MCSymbol *Sym, uint64_t Size) override {
811 SymSize[Sym] = Size;
812 }
813
814 /// Whether to emit .debug_pubnames / .debug_pubtypes. Default true;
815 virtual bool shouldEmitDwarfPubSections() const { return true; }
816
817 /// Returns whether we should emit all DW_AT_[MIPS_]linkage_name.
818 /// If not, we still might emit certain cases.
819 bool useAllLinkageNames() const { return UseAllLinkageNames; }
820
821 /// Returns whether to use DW_OP_GNU_push_tls_address, instead of the
822 /// standard DW_OP_form_tls_address opcode
823 bool useGNUTLSOpcode() const { return UseGNUTLSOpcode; }
824
825 /// Returns whether to use the DWARF2 format for bitfields instyead of the
826 /// DWARF4 format.
827 bool useDWARF2Bitfields() const { return UseDWARF2Bitfields; }
828
829 /// Returns whether to use inline strings.
830 bool useInlineStrings() const { return UseInlineStrings; }
831
832 /// Returns whether ranges section should be emitted.
833 bool useRangesSection() const { return UseRangesSection; }
834
835 /// Returns whether range encodings should be used for single entry range
836 /// lists.
837 bool alwaysUseRanges(const DwarfCompileUnit &) const;
838
839 // Returns whether novel exprloc addrx+offset encodings should be used to
840 // reduce debug_addr size.
842 return MinimizeAddr == MinimizeAddrInV5::Expressions;
843 }
844
845 // Returns whether addrx+offset LLVM extension form should be used to reduce
846 // debug_addr size.
847 bool useAddrOffsetForm() const {
848 return MinimizeAddr == MinimizeAddrInV5::Form;
849 }
850
851 /// Returns whether to use sections as labels rather than temp symbols.
853 return UseSectionsAsReferences;
854 }
855
856 /// Returns whether to generate DWARF v4 type units.
857 bool generateTypeUnits() const { return GenerateTypeUnits; }
858
859 // Experimental DWARF5 features.
860
861 /// Returns what kind (if any) of accelerator tables to emit.
862 AccelTableKind getAccelTableKind() const { return TheAccelTableKind; }
863
864 /// Seet TheAccelTableKind
865 void setTheAccelTableKind(AccelTableKind K) { TheAccelTableKind = K; };
866
868 return HasAppleExtensionAttributes;
869 }
870
871 /// Returns whether or not to change the current debug info for split DWARF.
872 bool useSplitDwarf() const { return HasSplitDwarf; }
873
874 /// Returns whether to generate a string offsets table with (possibly shared)
875 /// contributions from each CU and type unit. This implies the use of
876 /// DW_FORM_strx* indirect references with DWARF v5 and beyond. Note that
877 /// DW_FORM_GNU_str_index is also an indirect reference, but it is used with
878 /// a pre-DWARF v5 implementation of split DWARF sections, which uses a
879 /// monolithic string offsets table.
881 return UseSegmentedStringOffsetsTable;
882 }
883
884 bool emitDebugEntryValues() const {
885 return EmitDebugEntryValues;
886 }
887
888 bool useOpConvert() const {
889 return EnableOpConvert;
890 }
891
892 bool shareAcrossDWOCUs() const;
893
894 /// Returns the Dwarf Version.
896
897 /// Returns a suitable DWARF form to represent a section offset, i.e.
898 /// * DW_FORM_sec_offset for DWARF version >= 4;
899 /// * DW_FORM_data8 for 64-bit DWARFv3;
900 /// * DW_FORM_data4 for 32-bit DWARFv3 and DWARFv2.
902
903 /// Returns the previous CU that was being updated
904 const DwarfCompileUnit *getPrevCU() const { return PrevCU; }
905 void setPrevCU(const DwarfCompileUnit *PrevCU) { this->PrevCU = PrevCU; }
906
907 /// Terminate the line table by adding the last range label.
909
910 /// Returns the entries for the .debug_loc section.
911 const DebugLocStream &getDebugLocs() const { return DebugLocs; }
912
913 /// Emit an entry for the debug loc section. This can be used to
914 /// handle an entry that's going to be emitted into the debug loc section.
916 const DebugLocStream::Entry &Entry,
917 const DwarfCompileUnit *CU);
918
919 /// Emit the location for a debug loc entry, including the size header.
921 const DwarfCompileUnit *CU);
922
923 void addSubprogramNames(const DwarfUnit &Unit,
924 const DICompileUnit::DebugNameTableKind NameTableKind,
925 const DISubprogram *SP, DIE &Die);
926
927 AddressPool &getAddressPool() { return AddrPool; }
928
929 void addAccelName(const DwarfUnit &Unit,
930 const DICompileUnit::DebugNameTableKind NameTableKind,
931 StringRef Name, const DIE &Die);
932
933 void addAccelObjC(const DwarfUnit &Unit,
934 const DICompileUnit::DebugNameTableKind NameTableKind,
935 StringRef Name, const DIE &Die);
936
937 void addAccelNamespace(const DwarfUnit &Unit,
938 const DICompileUnit::DebugNameTableKind NameTableKind,
939 StringRef Name, const DIE &Die);
940
941 void addAccelType(const DwarfUnit &Unit,
942 const DICompileUnit::DebugNameTableKind NameTableKind,
943 StringRef Name, const DIE &Die, char Flags);
944
945 const MachineFunction *getCurrentFunction() const { return CurFn; }
946
947 /// A helper function to check whether the DIE for a given Scope is
948 /// going to be null.
950
951 /// Find the matching DwarfCompileUnit for the given CU DIE.
952 DwarfCompileUnit *lookupCU(const DIE *Die) { return CUDieMap.lookup(Die); }
953 const DwarfCompileUnit *lookupCU(const DIE *Die) const {
954 return CUDieMap.lookup(Die);
955 }
956
957 /// Find the matching DwarfCompileUnit for the given SP referenced from SrcCU.
959 DwarfCompileUnit &SrcCU);
960
961 /// \defgroup DebuggerTuning Predicates to tune DWARF for a given debugger.
962 ///
963 /// Returns whether we are "tuning" for a given debugger.
964 /// @{
965 bool tuneForGDB() const { return DebuggerTuning == DebuggerKind::GDB; }
966 bool tuneForLLDB() const { return DebuggerTuning == DebuggerKind::LLDB; }
967 bool tuneForSCE() const { return DebuggerTuning == DebuggerKind::SCE; }
968 bool tuneForDBX() const { return DebuggerTuning == DebuggerKind::DBX; }
969 /// @}
970
971 const MCSymbol *getSectionLabel(const MCSection *S);
972 void insertSectionLabel(const MCSymbol *S);
973
974 static void emitDebugLocValue(const AsmPrinter &AP, const DIBasicType *BT,
975 const DbgValueLoc &Value,
976 DwarfExpression &DwarfExpr);
977
978 /// If the \p File has an MD5 checksum, return it as an MD5Result
979 /// allocated in the MCContext.
980 std::optional<MD5::MD5Result> getMD5AsBytes(const DIFile *File) const;
981
982 MDNodeSet &getLocalDeclsForScope(const DILocalScope *S) {
983 return LocalDeclsPerLS[S];
984 }
985
986 /// Sets the current DWARF5AccelTable to use.
988 switch (Kind) {
990 CurrentDebugNames = &AccelDebugNames;
991 break;
993 CurrentDebugNames = &AccelTypeUnitsDebugNames;
994 }
995 }
996 /// Returns either CU or TU DWARF5AccelTable.
997 DWARF5AccelTable &getCurrentDWARF5AccelTable() { return *CurrentDebugNames; }
998};
999
1000} // end namespace llvm
1001
1002#endif // LLVM_LIB_CODEGEN_ASMPRINTER_DWARFDEBUG_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
This file defines the StringMap class.
unsigned uint64_t
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file contains support for writing accelerator tables.
This file defines the BumpPtrAllocator interface.
BitTracker BT
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
static void recordSourceLine(AsmPrinter &Asm, unsigned Line, unsigned Col, const MDNode *S, unsigned Flags, unsigned CUID, uint16_t DwarfVersion, ArrayRef< std::unique_ptr< DwarfCompileUnit > > DCUs, StringRef Comment={})
Register a source line with debug info.
This file contains constants used for implementing Dwarf debug support.
IRTranslator LLVM IR MI
#define F(x, y, z)
Definition MD5.cpp:54
Register Reg
This file implements a map that provides insertion order iteration.
This file contains the declarations for metadata subclasses.
#define P(N)
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
std::unique_ptr< MCStreamer > && Streamer
Value * RHS
Value * LHS
Class recording the (high level) value of a variable.
This class holds an abstract representation of an Accelerator Table, consisting of a sequence of buck...
Definition AccelTable.h:203
This class is intended to be used as a driving class for all asm writers.
Definition AsmPrinter.h:91
Basic type, like 'int' or 'float'.
A structured debug information entry.
Definition DIE.h:835
DWARF expression.
static LLVM_ABI std::optional< const DIExpression * > convertToNonVariadicExpression(const DIExpression *Expr)
If Expr is a valid single-location expression, i.e.
StringRef getName() const
A scope for locals.
Tagged DWARF-like metadata node.
Subprogram description. Uses SubclassData1.
Base class for types.
StringRef getName() const
unsigned getRegister() const
Definition DwarfDebug.h:328
DbgCallSiteParam(unsigned Reg, DbgValueLoc Val)
Definition DwarfDebug.h:323
DbgValueLoc getValue() const
Definition DwarfDebug.h:329
This class is defined as the common parent of DbgVariable and DbgLabel such that it could levarage po...
Definition DwarfDebug.h:66
virtual ~DbgEntity()=default
static bool classof(const DbgEntity *N)
Definition DwarfDebug.h:94
const DINode * getEntity() const
Accessors.
Definition DwarfDebug.h:86
DbgEntityKind getDbgEntityID() const
Definition DwarfDebug.h:89
void setDIE(DIE &D)
Definition DwarfDebug.h:92
DIE * getDIE() const
Definition DwarfDebug.h:88
DbgEntity(const DINode *N, const DILocation *IA, DbgEntityKind ID)
Definition DwarfDebug.h:80
const DILocation * getInlinedAt() const
Definition DwarfDebug.h:87
dwarf::Tag getTag() const
Translate tag to proper Dwarf tag.
Definition DwarfDebug.h:307
static bool classof(const DbgEntity *N)
Definition DwarfDebug.h:311
DbgLabel(const DILabel *L, const DILocation *IA, const MCSymbol *Sym=nullptr)
Symbol before DBG_LABEL instruction.
Definition DwarfDebug.h:295
StringRef getName() const
Definition DwarfDebug.h:303
const MCSymbol * getSymbol() const
Definition DwarfDebug.h:301
const DILabel * getLabel() const
Accessors.
Definition DwarfDebug.h:300
std::pair< const DINode *, const DILocation * > InlinedEntity
The location of a single variable, composed of an expression and 0 or more DbgValueLocEntries.
const Loc::Variant & asVariant() const
Definition DwarfDebug.h:222
bool isArtificial() const
Return true if DbgVariable is artificial.
Definition DwarfDebug.h:263
dwarf::Tag getTag() const
Definition DwarfDebug.h:254
bool isObjectPointer() const
Definition DwarfDebug.h:271
const DILocalVariable * getVariable() const
Definition DwarfDebug.h:247
DbgVariable(const DILocalVariable *V, const DILocation *IA)
Construct a DbgVariable.
Definition DwarfDebug.h:243
auto & get() noexcept
Asserting, noexcept member alternative to std::get.
Definition DwarfDebug.h:230
StringRef getName() const
Definition DwarfDebug.h:251
const DIType * getType() const
const auto & get() const noexcept
Asserting, noexcept member alternative to std::get.
Definition DwarfDebug.h:235
Loc::Variant & asVariant()
To workaround P2162R0 https://github.com/cplusplus/papers/issues/873 the base class subobject needs t...
Definition DwarfDebug.h:221
static bool classof(const DbgEntity *N)
Definition DwarfDebug.h:281
bool holds() const
Member shorthand for std::holds_alternative.
Definition DwarfDebug.h:226
Byte stream of .debug_loc entries.
A debug info location.
Definition DebugLoc.h:126
virtual const DIExpression * adjustExpressionForTarget(const DIExpression *Expr, std::optional< unsigned > &TargetAddrSpace) const
Extract target-specific address space information from a DIExpression.
Definition DwarfDebug.h:759
bool useSegmentedStringOffsetsTable() const
Returns whether to generate a string offsets table with (possibly shared) contributions from each CU ...
Definition DwarfDebug.h:880
virtual bool shouldResetBaseAddress(const MCSection &Section) const
Whether the target requires resetting the base address in range/loc lists.
Definition DwarfDebug.h:748
MDNodeSet & getLocalDeclsForScope(const DILocalScope *S)
Definition DwarfDebug.h:982
std::optional< MD5::MD5Result > getMD5AsBytes(const DIFile *File) const
If the File has an MD5 checksum, return it as an MD5Result allocated in the MCContext.
bool useGNUTLSOpcode() const
Returns whether to use DW_OP_GNU_push_tls_address, instead of the standard DW_OP_form_tls_address opc...
Definition DwarfDebug.h:823
bool useAddrOffsetForm() const
Definition DwarfDebug.h:847
const DwarfCompileUnit * getPrevCU() const
Returns the previous CU that was being updated.
Definition DwarfDebug.h:904
void setSymbolSize(const MCSymbol *Sym, uint64_t Size) override
For symbols that have a size designated (e.g.
Definition DwarfDebug.h:810
virtual bool shouldAttachCompileUnitRanges() const
Whether to attach ranges/low_pc to the compile unit DIE in endModule.
Definition DwarfDebug.h:729
bool emitDebugEntryValues() const
Definition DwarfDebug.h:884
const DwarfCompileUnit * lookupCU(const DIE *Die) const
Definition DwarfDebug.h:953
uint16_t getDwarfVersion() const
Returns the Dwarf Version.
void emitDebugLocEntry(ByteStreamer &Streamer, const DebugLocStream::Entry &Entry, const DwarfCompileUnit *CU)
Emit an entry for the debug loc section.
void addAccelNamespace(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name, const DIE &Die)
void setCurrentDWARF5AccelTable(const DWARF5AccelTableKind Kind)
Sets the current DWARF5AccelTable to use.
Definition DwarfDebug.h:987
bool alwaysUseRanges(const DwarfCompileUnit &) const
Returns whether range encodings should be used for single entry range lists.
void beginModule(Module *M) override
Emit all Dwarf sections that should come prior to the content.
void addSubprogramNames(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, const DISubprogram *SP, DIE &Die)
bool useAllLinkageNames() const
Returns whether we should emit all DW_AT_[MIPS_]linkage_name.
Definition DwarfDebug.h:819
void insertSectionLabel(const MCSymbol *S)
void addAccelObjC(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name, const DIE &Die)
VariableLocationKind
Describes the storage kind of a debug variable for target hooks.
Definition DwarfDebug.h:753
dwarf::Form getDwarfSectionOffsetForm() const
Returns a suitable DWARF form to represent a section offset, i.e.
bool useAppleExtensionAttributes() const
Definition DwarfDebug.h:867
void setPrevCU(const DwarfCompileUnit *PrevCU)
Definition DwarfDebug.h:905
const MachineFunction * getCurrentFunction() const
Definition DwarfDebug.h:945
void skippedNonDebugFunction() override
bool useInlineStrings() const
Returns whether to use inline strings.
Definition DwarfDebug.h:830
void addArangeLabel(SymbolCU SCU)
Add a label so that arange data can be generated for it.
Definition DwarfDebug.h:806
bool generateTypeUnits() const
Returns whether to generate DWARF v4 type units.
Definition DwarfDebug.h:857
virtual void finishTargetUnitAttributes(const DICompileUnit &DIUnit, DwarfCompileUnit &NewCU)
Target-specific compile unit attribute finalization.
Definition DwarfDebug.h:735
void beginInstruction(const MachineInstr *MI) override
Process beginning of an instruction.
AddressPool & getAddressPool()
Definition DwarfDebug.h:927
DWARF5AccelTable & getCurrentDWARF5AccelTable()
Returns either CU or TU DWARF5AccelTable.
Definition DwarfDebug.h:997
void setUseSectionsAsReferences(bool V)
Definition DwarfDebug.h:726
bool useSectionsAsReferences() const
Returns whether to use sections as labels rather than temp symbols.
Definition DwarfDebug.h:852
const DebugLocStream & getDebugLocs() const
Returns the entries for the .debug_loc section.
Definition DwarfDebug.h:911
void setUseRangesSection(bool V)
Definition DwarfDebug.h:725
bool shareAcrossDWOCUs() const
bool useOpConvert() const
Definition DwarfDebug.h:888
void terminateLineTable(const DwarfCompileUnit *CU)
Terminate the line table by adding the last range label.
~DwarfDebug() override
void endFunctionImpl(const MachineFunction *MF) override
Gather and emit post-function debug information.
DwarfCompileUnit & getOrCreateAbstractSubprogramCU(const DISubprogram *SP, DwarfCompileUnit &SrcCU)
Find the matching DwarfCompileUnit for the given SP referenced from SrcCU.
void emitDebugLocEntryLocation(const DebugLocStream::Entry &Entry, const DwarfCompileUnit *CU)
Emit the location for a debug loc entry, including the size header.
const SmallVectorImpl< std::unique_ptr< DwarfCompileUnit > > & getUnits()
Definition DwarfDebug.h:738
DwarfCompileUnit * lookupCU(const DIE *Die)
Find the matching DwarfCompileUnit for the given CU DIE.
Definition DwarfDebug.h:952
const MCSymbol * getSectionLabel(const MCSection *S)
static void emitDebugLocValue(const AsmPrinter &AP, const DIBasicType *BT, const DbgValueLoc &Value, DwarfExpression &DwarfExpr)
bool useSplitDwarf() const
Returns whether or not to change the current debug info for split DWARF.
Definition DwarfDebug.h:872
virtual void addTargetVariableAttributes(DwarfCompileUnit &CU, DIE &Die, std::optional< unsigned > TargetAddrSpace, VariableLocationKind VarLocKind, const GlobalVariable *GV=nullptr) const
Add target-specific attributes to a variable DIE (e.g.
Definition DwarfDebug.h:767
virtual void initializeTargetDebugInfo(const MachineFunction &MF)
Target-specific debug info initialization at function start.
Definition DwarfDebug.h:720
unsigned getDwarfCompileUnitIDForLineTable(const DwarfCompileUnit &CU)
Get Dwarf compile unit ID for line table.
virtual bool shouldEmitDwarfPubSections() const
Whether to emit .debug_pubnames / .debug_pubtypes. Default true;.
Definition DwarfDebug.h:815
const MachineInstr * emitInitialLocDirective(const MachineFunction &MF, unsigned CUID)
Emits inital debug location directive.
void setTheAccelTableKind(AccelTableKind K)
Seet TheAccelTableKind.
Definition DwarfDebug.h:865
bool useDWARF2Bitfields() const
Returns whether to use the DWARF2 format for bitfields instyead of the DWARF4 format.
Definition DwarfDebug.h:827
bool useAddrOffsetExpressions() const
Definition DwarfDebug.h:841
bool useRangesSection() const
Returns whether ranges section should be emitted.
Definition DwarfDebug.h:833
void addAccelName(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name, const DIE &Die)
virtual void recordTargetSourceLine(const DebugLoc &DL, unsigned Flags)
Target-specific source line recording.
bool isLexicalScopeDIENull(LexicalScope *Scope)
A helper function to check whether the DIE for a given Scope is going to be null.
void addDwarfTypeUnitType(DwarfCompileUnit &CU, StringRef Identifier, DIE &Die, const DICompositeType *CTy)
Add a DIE to the set of types that we're going to pull into type units.
DwarfFile InfoHolder
Holder for the file specific debug information.
Definition DwarfDebug.h:707
void endModule() override
Emit all Dwarf sections that should come after the content.
void setUseInlineStrings(bool V)
Setters for target-specific DWARF configuration overrides.
Definition DwarfDebug.h:724
void addAccelType(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name, const DIE &Die, char Flags)
void beginCodeAlignment(const MachineBasicBlock &MBB) override
Process beginning of code alignment.
DwarfDebug(AsmPrinter *A)
void beginFunctionImpl(const MachineFunction *MF) override
Gather pre-function debug information.
AccelTableKind getAccelTableKind() const
Returns what kind (if any) of accelerator tables to emit.
Definition DwarfDebug.h:862
static uint64_t makeTypeSignature(StringRef Identifier)
Perform an MD5 checksum of Identifier and return the lower 64 bits.
Base class containing the logic for constructing DWARF expressions independently of whether they are ...
This dwarf writer support class manages information associated with a source file.
Definition DwarfUnit.h:36
This class is used to track scope information.
Multi-value location description.
Definition DwarfDebug.h:143
Multi(unsigned DebugLocListIndex, std::optional< uint8_t > DebugLocListTagOffset)
Definition DwarfDebug.h:150
unsigned getDebugLocListIndex() const
Definition DwarfDebug.h:154
std::optional< uint8_t > getDebugLocListTagOffset() const
Definition DwarfDebug.h:155
Single value location description.
Definition DwarfDebug.h:132
Single(DbgValueLoc ValueLoc)
const DbgValueLoc & getValueLoc() const
Definition DwarfDebug.h:139
const DIExpression * getExpr() const
Definition DwarfDebug.h:140
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition MCSection.h:580
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1081
Representation of each machine instruction.
This class implements a map that also provides access to all stored values in a deterministic order.
Definition MapVector.h:38
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
A vector that has set insertion semantics.
Definition SetVector.h:57
Implements a dense probed hash-table based set with some number of buckets stored inline.
Definition DenseSet.h:293
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:345
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition StringMap.h:129
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
LLVM Value Representation.
Definition Value.h:75
bool tuneForSCE() const
Definition DwarfDebug.h:967
bool tuneForDBX() const
Definition DwarfDebug.h:968
bool tuneForGDB() const
Definition DwarfDebug.h:965
bool tuneForLLDB() const
Definition DwarfDebug.h:966
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
std::variant< std::monostate, Loc::Single, Loc::Multi, Loc::MMI, Loc::EntryValue > Variant
Alias for the std::variant specialization base class of DbgVariable.
Definition DwarfDebug.h:190
This is an optimization pass for GlobalISel generic memory operations.
bool operator<(int64_t V1, const APSInt &V2)
Definition APSInt.h:360
SmallVector< DbgCallSiteParam, 4 > ParamSet
Collection used for storing debug call site parameters.
Definition DwarfDebug.h:333
AccelTableKind
The kind of accelerator tables we should emit.
Definition DwarfDebug.h:344
@ Apple
.apple_names, .apple_namespaces, .apple_types, .apple_objc.
Definition DwarfDebug.h:347
@ Dwarf
DWARF v5 .debug_names.
Definition DwarfDebug.h:348
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
DebuggerKind
Identify a debugger for "tuning" the debug info.
@ SCE
Tune debug info for SCE targets (e.g. PS4).
@ DBX
Tune debug info for dbx.
@ Default
No specific tuning requested.
@ GDB
Tune debug info for gdb.
@ LLDB
Tune debug info for lldb.
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:390
@ Default
The result value is uniform if and only if all operands are uniform.
Definition Uniformity.h:20
#define N
Represents an entry-value location, or a fragment of one.
Definition DwarfDebug.h:121
friend bool operator<(const EntryValueInfo &LHS, const EntryValueInfo &RHS)
Operator enabling sorting based on fragment offset.
const DIExpression & Expr
Definition DwarfDebug.h:123
Proxy for one MMI entry.
Definition DwarfDebug.h:112
const DIExpression * Expr
Definition DwarfDebug.h:114
friend bool operator<(const FrameIndexExpr &LHS, const FrameIndexExpr &RHS)
Operator enabling sorting based on fragment offset.
Single location defined by (potentially multiple) EntryValueInfo.
Definition DwarfDebug.h:173
void addExpr(MCRegister Reg, const DIExpression &Expr)
Definition DwarfDebug.h:181
std::set< EntryValueInfo > EntryValues
Definition DwarfDebug.h:174
EntryValue(MCRegister Reg, const DIExpression &Expr)
Definition DwarfDebug.h:175
Single location defined by (potentially multiple) MMI entries.
Definition DwarfDebug.h:160
void addFrameIndexExpr(const DIExpression *Expr, int FI)
std::set< FrameIndexExpr > FrameIndexExprs
Definition DwarfDebug.h:161
const std::set< FrameIndexExpr > & getFrameIndexExprs() const
Get the FI entries, sorted by fragment offset.
MMI(const DIExpression *E, int FI)
Definition DwarfDebug.h:164
Helper used to pair up a symbol and its DWARF compile unit.
Definition DwarfDebug.h:336
const MCSymbol * Sym
Definition DwarfDebug.h:339
SymbolCU(DwarfCompileUnit *CU, const MCSymbol *Sym)
Definition DwarfDebug.h:337