xref: /freebsd/contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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"
24  #include "llvm/ADT/SmallPtrSet.h"
25  #include "llvm/ADT/SmallVector.h"
26  #include "llvm/ADT/StringMap.h"
27  #include "llvm/ADT/StringRef.h"
28  #include "llvm/BinaryFormat/Dwarf.h"
29  #include "llvm/CodeGen/AccelTable.h"
30  #include "llvm/CodeGen/DbgEntityHistoryCalculator.h"
31  #include "llvm/CodeGen/DebugHandlerBase.h"
32  #include "llvm/IR/DebugInfoMetadata.h"
33  #include "llvm/IR/DebugLoc.h"
34  #include "llvm/IR/Metadata.h"
35  #include "llvm/MC/MCDwarf.h"
36  #include "llvm/Support/Allocator.h"
37  #include "llvm/Target/TargetOptions.h"
38  #include <cassert>
39  #include <cstdint>
40  #include <limits>
41  #include <memory>
42  #include <utility>
43  #include <variant>
44  #include <vector>
45  
46  namespace llvm {
47  
48  class AsmPrinter;
49  class ByteStreamer;
50  class DIE;
51  class DwarfCompileUnit;
52  class DwarfExpression;
53  class DwarfTypeUnit;
54  class DwarfUnit;
55  class LexicalScope;
56  class MachineFunction;
57  class MCSection;
58  class MCSymbol;
59  class Module;
60  
61  //===----------------------------------------------------------------------===//
62  /// This class is defined as the common parent of DbgVariable and DbgLabel
63  /// such that it could levarage polymorphism to extract common code for
64  /// DbgVariable and DbgLabel.
65  class DbgEntity {
66  public:
67    enum DbgEntityKind {
68      DbgVariableKind,
69      DbgLabelKind
70    };
71  
72  private:
73    const DINode *Entity;
74    const DILocation *InlinedAt;
75    DIE *TheDIE = nullptr;
76    const DbgEntityKind SubclassID;
77  
78  public:
79    DbgEntity(const DINode *N, const DILocation *IA, DbgEntityKind ID)
80        : Entity(N), InlinedAt(IA), SubclassID(ID) {}
81    virtual ~DbgEntity() = default;
82  
83    /// Accessors.
84    /// @{
85    const DINode *getEntity() const { return Entity; }
86    const DILocation *getInlinedAt() const { return InlinedAt; }
87    DIE *getDIE() const { return TheDIE; }
88    DbgEntityKind getDbgEntityID() const { return SubclassID; }
89    /// @}
90  
91    void setDIE(DIE &D) { TheDIE = &D; }
92  
93    static bool classof(const DbgEntity *N) {
94      switch (N->getDbgEntityID()) {
95      case DbgVariableKind:
96      case DbgLabelKind:
97        return true;
98      }
99      llvm_unreachable("Invalid DbgEntityKind");
100    }
101  };
102  
103  class DbgVariable;
104  
105  bool operator<(const struct FrameIndexExpr &LHS,
106                 const struct FrameIndexExpr &RHS);
107  bool operator<(const struct EntryValueInfo &LHS,
108                 const struct EntryValueInfo &RHS);
109  
110  /// Proxy for one MMI entry.
111  struct FrameIndexExpr {
112    int FI;
113    const DIExpression *Expr;
114  
115    /// Operator enabling sorting based on fragment offset.
116    friend bool operator<(const FrameIndexExpr &LHS, const FrameIndexExpr &RHS);
117  };
118  
119  /// Represents an entry-value location, or a fragment of one.
120  struct EntryValueInfo {
121    MCRegister Reg;
122    const DIExpression &Expr;
123  
124    /// Operator enabling sorting based on fragment offset.
125    friend bool operator<(const EntryValueInfo &LHS, const EntryValueInfo &RHS);
126  };
127  
128  // Namespace for alternatives of a DbgVariable.
129  namespace Loc {
130  /// Single value location description.
131  class Single {
132    std::unique_ptr<DbgValueLoc> ValueLoc;
133    const DIExpression *Expr;
134  
135  public:
136    explicit Single(DbgValueLoc ValueLoc);
137    explicit Single(const MachineInstr *DbgValue);
138    const DbgValueLoc &getValueLoc() const { return *ValueLoc; }
139    const DIExpression *getExpr() const { return Expr; }
140  };
141  /// Multi-value location description.
142  class Multi {
143    /// Index of the entry list in DebugLocs.
144    unsigned DebugLocListIndex;
145    /// DW_OP_LLVM_tag_offset value from DebugLocs.
146    std::optional<uint8_t> DebugLocListTagOffset;
147  
148  public:
149    explicit Multi(unsigned DebugLocListIndex,
150                   std::optional<uint8_t> DebugLocListTagOffset)
151        : DebugLocListIndex(DebugLocListIndex),
152          DebugLocListTagOffset(DebugLocListTagOffset) {}
153    unsigned getDebugLocListIndex() const { return DebugLocListIndex; }
154    std::optional<uint8_t> getDebugLocListTagOffset() const {
155      return DebugLocListTagOffset;
156    }
157  };
158  /// Single location defined by (potentially multiple) MMI entries.
159  struct MMI {
160    std::set<FrameIndexExpr> FrameIndexExprs;
161  
162  public:
163    explicit MMI(const DIExpression *E, int FI) : FrameIndexExprs({{FI, E}}) {
164      assert((!E || E->isValid()) && "Expected valid expression");
165      assert(FI != std::numeric_limits<int>::max() && "Expected valid index");
166    }
167    void addFrameIndexExpr(const DIExpression *Expr, int FI);
168    /// Get the FI entries, sorted by fragment offset.
169    const std::set<FrameIndexExpr> &getFrameIndexExprs() const;
170  };
171  /// Single location defined by (potentially multiple) EntryValueInfo.
172  struct EntryValue {
173    std::set<EntryValueInfo> EntryValues;
174    explicit EntryValue(MCRegister Reg, const DIExpression &Expr) {
175      addExpr(Reg, Expr);
176    };
177    // Add the pair Reg, Expr to the list of entry values describing the variable.
178    // If multiple expressions are added, it is the callers responsibility to
179    // ensure they are all non-overlapping fragments.
180    void addExpr(MCRegister Reg, const DIExpression &Expr) {
181      std::optional<const DIExpression *> NonVariadicExpr =
182          DIExpression::convertToNonVariadicExpression(&Expr);
183      assert(NonVariadicExpr && *NonVariadicExpr);
184  
185      EntryValues.insert({Reg, **NonVariadicExpr});
186    }
187  };
188  /// Alias for the std::variant specialization base class of DbgVariable.
189  using Variant = std::variant<std::monostate, Loc::Single, Loc::Multi, Loc::MMI,
190                               Loc::EntryValue>;
191  } // namespace Loc
192  
193  //===----------------------------------------------------------------------===//
194  /// This class is used to track local variable information.
195  ///
196  /// Variables that have been optimized out hold the \c monostate alternative.
197  /// This is not distinguished from the case of a constructed \c DbgVariable
198  /// which has not be initialized yet.
199  ///
200  /// Variables can be created from allocas, in which case they're generated from
201  /// the MMI table. Such variables hold the \c Loc::MMI alternative which can
202  /// have multiple expressions and frame indices.
203  ///
204  /// Variables can be created from the entry value of registers, in which case
205  /// they're generated from the MMI table. Such variables hold the \c
206  /// EntryValueLoc alternative which can either have a single expression or
207  /// multiple *fragment* expressions.
208  ///
209  /// Variables can be created from \c DBG_VALUE instructions. Those whose
210  /// location changes over time hold a \c Loc::Multi alternative which uses \c
211  /// DebugLocListIndex and (optionally) \c DebugLocListTagOffset, while those
212  /// with a single location hold a \c Loc::Single alternative which use \c
213  /// ValueLoc and (optionally) a single \c Expr.
214  class DbgVariable : public DbgEntity, public Loc::Variant {
215  
216  public:
217    /// To workaround P2162R0 https://github.com/cplusplus/papers/issues/873 the
218    /// base class subobject needs to be passed directly to std::visit, so expose
219    /// it directly here.
220    Loc::Variant &asVariant() { return *static_cast<Loc::Variant *>(this); }
221    const Loc::Variant &asVariant() const {
222      return *static_cast<const Loc::Variant *>(this);
223    }
224    /// Member shorthand for std::holds_alternative
225    template <typename T> bool holds() const {
226      return std::holds_alternative<T>(*this);
227    }
228    /// Asserting, noexcept member alternative to std::get
229    template <typename T> auto &get() noexcept {
230      assert(holds<T>());
231      return *std::get_if<T>(this);
232    }
233    /// Asserting, noexcept member alternative to std::get
234    template <typename T> const auto &get() const noexcept {
235      assert(holds<T>());
236      return *std::get_if<T>(this);
237    }
238  
239    /// Construct a DbgVariable.
240    ///
241    /// Creates a variable without any DW_AT_location.
242    DbgVariable(const DILocalVariable *V, const DILocation *IA)
243        : DbgEntity(V, IA, DbgVariableKind) {}
244  
245    // Accessors.
246    const DILocalVariable *getVariable() const {
247      return cast<DILocalVariable>(getEntity());
248    }
249  
250    StringRef getName() const { return getVariable()->getName(); }
251  
252    // Translate tag to proper Dwarf tag.
253    dwarf::Tag getTag() const {
254      // FIXME: Why don't we just infer this tag and store it all along?
255      if (getVariable()->isParameter())
256        return dwarf::DW_TAG_formal_parameter;
257  
258      return dwarf::DW_TAG_variable;
259    }
260  
261    /// Return true if DbgVariable is artificial.
262    bool isArtificial() const {
263      if (getVariable()->isArtificial())
264        return true;
265      if (getType()->isArtificial())
266        return true;
267      return false;
268    }
269  
270    bool isObjectPointer() const {
271      if (getVariable()->isObjectPointer())
272        return true;
273      if (getType()->isObjectPointer())
274        return true;
275      return false;
276    }
277  
278    const DIType *getType() const;
279  
280    static bool classof(const DbgEntity *N) {
281      return N->getDbgEntityID() == DbgVariableKind;
282    }
283  };
284  
285  //===----------------------------------------------------------------------===//
286  /// This class is used to track label information.
287  ///
288  /// Labels are collected from \c DBG_LABEL instructions.
289  class DbgLabel : public DbgEntity {
290    const MCSymbol *Sym;                  /// Symbol before DBG_LABEL instruction.
291  
292  public:
293    /// We need MCSymbol information to generate DW_AT_low_pc.
294    DbgLabel(const DILabel *L, const DILocation *IA, const MCSymbol *Sym = nullptr)
295        : DbgEntity(L, IA, DbgLabelKind), Sym(Sym) {}
296  
297    /// Accessors.
298    /// @{
299    const DILabel *getLabel() const { return cast<DILabel>(getEntity()); }
300    const MCSymbol *getSymbol() const { return Sym; }
301  
302    StringRef getName() const { return getLabel()->getName(); }
303    /// @}
304  
305    /// Translate tag to proper Dwarf tag.
306    dwarf::Tag getTag() const {
307      return dwarf::DW_TAG_label;
308    }
309  
310    static bool classof(const DbgEntity *N) {
311      return N->getDbgEntityID() == DbgLabelKind;
312    }
313  };
314  
315  /// Used for tracking debug info about call site parameters.
316  class DbgCallSiteParam {
317  private:
318    unsigned Register; ///< Parameter register at the callee entry point.
319    DbgValueLoc Value; ///< Corresponding location for the parameter value at
320                       ///< the call site.
321  public:
322    DbgCallSiteParam(unsigned Reg, DbgValueLoc Val)
323        : Register(Reg), Value(Val) {
324      assert(Reg && "Parameter register cannot be undef");
325    }
326  
327    unsigned getRegister() const { return Register; }
328    DbgValueLoc getValue() const { return Value; }
329  };
330  
331  /// Collection used for storing debug call site parameters.
332  using ParamSet = SmallVector<DbgCallSiteParam, 4>;
333  
334  /// Helper used to pair up a symbol and its DWARF compile unit.
335  struct SymbolCU {
336    SymbolCU(DwarfCompileUnit *CU, const MCSymbol *Sym) : Sym(Sym), CU(CU) {}
337  
338    const MCSymbol *Sym;
339    DwarfCompileUnit *CU;
340  };
341  
342  /// The kind of accelerator tables we should emit.
343  enum class AccelTableKind {
344    Default, ///< Platform default.
345    None,    ///< None.
346    Apple,   ///< .apple_names, .apple_namespaces, .apple_types, .apple_objc.
347    Dwarf,   ///< DWARF v5 .debug_names.
348  };
349  
350  /// Collects and handles dwarf debug information.
351  class DwarfDebug : public DebugHandlerBase {
352    /// All DIEValues are allocated through this allocator.
353    BumpPtrAllocator DIEValueAllocator;
354  
355    /// Maps MDNode with its corresponding DwarfCompileUnit.
356    MapVector<const MDNode *, DwarfCompileUnit *> CUMap;
357  
358    /// Maps a CU DIE with its corresponding DwarfCompileUnit.
359    DenseMap<const DIE *, DwarfCompileUnit *> CUDieMap;
360  
361    /// List of all labels used in aranges generation.
362    std::vector<SymbolCU> ArangeLabels;
363  
364    /// Size of each symbol emitted (for those symbols that have a specific size).
365    DenseMap<const MCSymbol *, uint64_t> SymSize;
366  
367    /// Collection of abstract variables/labels.
368    SmallVector<std::unique_ptr<DbgEntity>, 64> ConcreteEntities;
369  
370    /// Collection of DebugLocEntry. Stored in a linked list so that DIELocLists
371    /// can refer to them in spite of insertions into this list.
372    DebugLocStream DebugLocs;
373  
374    /// This is a collection of subprogram MDNodes that are processed to
375    /// create DIEs.
376    SmallSetVector<const DISubprogram *, 16> ProcessedSPNodes;
377  
378    /// Map function-local imported entities to their parent local scope
379    /// (either DILexicalBlock or DISubprogram) for a processed function
380    /// (including inlined subprograms).
381    using MDNodeSet = SetVector<const MDNode *, SmallVector<const MDNode *, 2>,
382                                SmallPtrSet<const MDNode *, 2>>;
383    DenseMap<const DILocalScope *, MDNodeSet> LocalDeclsPerLS;
384  
385    /// If nonnull, stores the current machine function we're processing.
386    const MachineFunction *CurFn = nullptr;
387  
388    /// If nonnull, stores the CU in which the previous subprogram was contained.
389    const DwarfCompileUnit *PrevCU = nullptr;
390  
391    /// As an optimization, there is no need to emit an entry in the directory
392    /// table for the same directory as DW_AT_comp_dir.
393    StringRef CompilationDir;
394  
395    /// Holder for the file specific debug information.
396    DwarfFile InfoHolder;
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.
403    DenseMap<const MDNode *, uint64_t> TypeSignatures;
404  
405    DenseMap<const MCSection *, const MCSymbol *> SectionLabels;
406  
407    SmallVector<
408        std::pair<std::unique_ptr<DwarfTypeUnit>, const DICompositeType *>, 1>
409        TypeUnitsUnderConstruction;
410  
411    /// Used to set a uniqe ID for a Type Unit.
412    /// This counter represents number of DwarfTypeUnits created, not necessarily
413    /// number of type units that will be emitted.
414    unsigned NumTypeUnitsCreated = 0;
415  
416    /// Whether to use the GNU TLS opcode (instead of the standard opcode).
417    bool UseGNUTLSOpcode;
418  
419    /// Whether to use DWARF 2 bitfields (instead of the DWARF 4 format).
420    bool UseDWARF2Bitfields;
421  
422    /// Whether to emit all linkage names, or just abstract subprograms.
423    bool UseAllLinkageNames;
424  
425    /// Use inlined strings.
426    bool UseInlineStrings = false;
427  
428    /// Allow emission of .debug_ranges section.
429    bool UseRangesSection = true;
430  
431    /// True if the sections itself must be used as references and don't create
432    /// temp symbols inside DWARF sections.
433    bool UseSectionsAsReferences = false;
434  
435    ///Allow emission of the .debug_loc section.
436    bool UseLocSection = true;
437  
438    /// Generate DWARF v4 type units.
439    bool GenerateTypeUnits;
440  
441    /// Emit a .debug_macro section instead of .debug_macinfo.
442    bool UseDebugMacroSection;
443  
444    /// Avoid using DW_OP_convert due to consumer incompatibilities.
445    bool EnableOpConvert;
446  
447  public:
448    enum class MinimizeAddrInV5 {
449      Default,
450      Disabled,
451      Ranges,
452      Expressions,
453      Form,
454    };
455  
456    enum class DWARF5AccelTableKind {
457      CU = 0,
458      TU = 1,
459    };
460  
461  private:
462    /// Force the use of DW_AT_ranges even for single-entry range lists.
463    MinimizeAddrInV5 MinimizeAddr = MinimizeAddrInV5::Disabled;
464  
465    /// DWARF5 Experimental Options
466    /// @{
467    AccelTableKind TheAccelTableKind;
468    bool HasAppleExtensionAttributes;
469    bool HasSplitDwarf;
470  
471    /// Whether to generate the DWARF v5 string offsets table.
472    /// It consists of a series of contributions, each preceded by a header.
473    /// The pre-DWARF v5 string offsets table for split dwarf is, in contrast,
474    /// a monolithic sequence of string offsets.
475    bool UseSegmentedStringOffsetsTable;
476  
477    /// Enable production of call site parameters needed to print the debug entry
478    /// values. Useful for testing purposes when a debugger does not support the
479    /// feature yet.
480    bool EmitDebugEntryValues;
481  
482    /// Separated Dwarf Variables
483    /// In general these will all be for bits that are left in the
484    /// original object file, rather than things that are meant
485    /// to be in the .dwo sections.
486  
487    /// Holder for the skeleton information.
488    DwarfFile SkeletonHolder;
489  
490    /// Store file names for type units under fission in a line table
491    /// header that will be emitted into debug_line.dwo.
492    // FIXME: replace this with a map from comp_dir to table so that we
493    // can emit multiple tables during LTO each of which uses directory
494    // 0, referencing the comp_dir of all the type units that use it.
495    MCDwarfDwoLineTable SplitTypeUnitFileTable;
496    /// @}
497  
498    /// True iff there are multiple CUs in this module.
499    bool SingleCU;
500    bool IsDarwin;
501  
502    /// Map for tracking Fortran deferred CHARACTER lengths.
503    DenseMap<const DIStringType *, unsigned> StringTypeLocMap;
504  
505    AddressPool AddrPool;
506  
507    /// Accelerator tables.
508    DWARF5AccelTable AccelDebugNames;
509    DWARF5AccelTable AccelTypeUnitsDebugNames;
510    /// Used to hide which DWARF5AccelTable we are using now.
511    DWARF5AccelTable *CurrentDebugNames = &AccelDebugNames;
512    AccelTable<AppleAccelTableOffsetData> AccelNames;
513    AccelTable<AppleAccelTableOffsetData> AccelObjC;
514    AccelTable<AppleAccelTableOffsetData> AccelNamespace;
515    AccelTable<AppleAccelTableTypeData> AccelTypes;
516  
517    /// Identify a debugger for "tuning" the debug info.
518    ///
519    /// The "tuning" should be used to set defaults for individual feature flags
520    /// in DwarfDebug; if a given feature has a more specific command-line option,
521    /// that option should take precedence over the tuning.
522    DebuggerKind DebuggerTuning = DebuggerKind::Default;
523  
524    MCDwarfDwoLineTable *getDwoLineTable(const DwarfCompileUnit &);
525  
526    const SmallVectorImpl<std::unique_ptr<DwarfCompileUnit>> &getUnits() {
527      return InfoHolder.getUnits();
528    }
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    /// Create new DwarfCompileUnit for the given metadata node with tag
668    /// DW_TAG_compile_unit.
669    DwarfCompileUnit &getOrCreateDwarfCompileUnit(const DICompileUnit *DIUnit);
670    void finishUnitAttributes(const DICompileUnit *DIUnit,
671                              DwarfCompileUnit &NewCU);
672  
673    /// Register a source line with debug info. Returns the unique
674    /// label that was emitted and which provides correspondence to the
675    /// source line list.
676    void recordSourceLine(unsigned Line, unsigned Col, const MDNode *Scope,
677                          unsigned Flags);
678  
679    /// Populate LexicalScope entries with variables' info.
680    void collectEntityInfo(DwarfCompileUnit &TheCU, const DISubprogram *SP,
681                           DenseSet<InlinedEntity> &ProcessedVars);
682  
683    /// Build the location list for all DBG_VALUEs in the
684    /// function that describe the same variable. If the resulting
685    /// list has only one entry that is valid for entire variable's
686    /// scope return true.
687    bool buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
688                           const DbgValueHistoryMap::Entries &Entries);
689  
690    /// Collect variable information from the side table maintained by MF.
691    void collectVariableInfoFromMFTable(DwarfCompileUnit &TheCU,
692                                        DenseSet<InlinedEntity> &P);
693  
694    /// Emit the reference to the section.
695    void emitSectionReference(const DwarfCompileUnit &CU);
696  
697  protected:
698    /// Gather pre-function debug information.
699    void beginFunctionImpl(const MachineFunction *MF) override;
700  
701    /// Gather and emit post-function debug information.
702    void endFunctionImpl(const MachineFunction *MF) override;
703  
704    /// Get Dwarf compile unit ID for line table.
705    unsigned getDwarfCompileUnitIDForLineTable(const DwarfCompileUnit &CU);
706  
707    void skippedNonDebugFunction() override;
708  
709  public:
710    //===--------------------------------------------------------------------===//
711    // Main entry points.
712    //
713    DwarfDebug(AsmPrinter *A);
714  
715    ~DwarfDebug() override;
716  
717    /// Emit all Dwarf sections that should come prior to the
718    /// content.
719    void beginModule(Module *M) override;
720  
721    /// Emit all Dwarf sections that should come after the content.
722    void endModule() override;
723  
724    /// Emits inital debug location directive.
725    DebugLoc emitInitialLocDirective(const MachineFunction &MF, unsigned CUID);
726  
727    /// Process beginning of an instruction.
728    void beginInstruction(const MachineInstr *MI) override;
729  
730    /// Perform an MD5 checksum of \p Identifier and return the lower 64 bits.
731    static uint64_t makeTypeSignature(StringRef Identifier);
732  
733    /// Add a DIE to the set of types that we're going to pull into
734    /// type units.
735    void addDwarfTypeUnitType(DwarfCompileUnit &CU, StringRef Identifier,
736                              DIE &Die, const DICompositeType *CTy);
737  
738    /// Add a label so that arange data can be generated for it.
739    void addArangeLabel(SymbolCU SCU) { ArangeLabels.push_back(SCU); }
740  
741    /// For symbols that have a size designated (e.g. common symbols),
742    /// this tracks that size.
743    void setSymbolSize(const MCSymbol *Sym, uint64_t Size) override {
744      SymSize[Sym] = Size;
745    }
746  
747    /// Returns whether we should emit all DW_AT_[MIPS_]linkage_name.
748    /// If not, we still might emit certain cases.
749    bool useAllLinkageNames() const { return UseAllLinkageNames; }
750  
751    /// Returns whether to use DW_OP_GNU_push_tls_address, instead of the
752    /// standard DW_OP_form_tls_address opcode
753    bool useGNUTLSOpcode() const { return UseGNUTLSOpcode; }
754  
755    /// Returns whether to use the DWARF2 format for bitfields instyead of the
756    /// DWARF4 format.
757    bool useDWARF2Bitfields() const { return UseDWARF2Bitfields; }
758  
759    /// Returns whether to use inline strings.
760    bool useInlineStrings() const { return UseInlineStrings; }
761  
762    /// Returns whether ranges section should be emitted.
763    bool useRangesSection() const { return UseRangesSection; }
764  
765    /// Returns whether range encodings should be used for single entry range
766    /// lists.
767    bool alwaysUseRanges(const DwarfCompileUnit &) const;
768  
769    // Returns whether novel exprloc addrx+offset encodings should be used to
770    // reduce debug_addr size.
771    bool useAddrOffsetExpressions() const {
772      return MinimizeAddr == MinimizeAddrInV5::Expressions;
773    }
774  
775    // Returns whether addrx+offset LLVM extension form should be used to reduce
776    // debug_addr size.
777    bool useAddrOffsetForm() const {
778      return MinimizeAddr == MinimizeAddrInV5::Form;
779    }
780  
781    /// Returns whether to use sections as labels rather than temp symbols.
782    bool useSectionsAsReferences() const {
783      return UseSectionsAsReferences;
784    }
785  
786    /// Returns whether .debug_loc section should be emitted.
787    bool useLocSection() const { return UseLocSection; }
788  
789    /// Returns whether to generate DWARF v4 type units.
790    bool generateTypeUnits() const { return GenerateTypeUnits; }
791  
792    // Experimental DWARF5 features.
793  
794    /// Returns what kind (if any) of accelerator tables to emit.
795    AccelTableKind getAccelTableKind() const { return TheAccelTableKind; }
796  
797    /// Seet TheAccelTableKind
798    void setTheAccelTableKind(AccelTableKind K) { TheAccelTableKind = K; };
799  
800    bool useAppleExtensionAttributes() const {
801      return HasAppleExtensionAttributes;
802    }
803  
804    /// Returns whether or not to change the current debug info for the
805    /// split dwarf proposal support.
806    bool useSplitDwarf() const { return HasSplitDwarf; }
807  
808    /// Returns whether to generate a string offsets table with (possibly shared)
809    /// contributions from each CU and type unit. This implies the use of
810    /// DW_FORM_strx* indirect references with DWARF v5 and beyond. Note that
811    /// DW_FORM_GNU_str_index is also an indirect reference, but it is used with
812    /// a pre-DWARF v5 implementation of split DWARF sections, which uses a
813    /// monolithic string offsets table.
814    bool useSegmentedStringOffsetsTable() const {
815      return UseSegmentedStringOffsetsTable;
816    }
817  
818    bool emitDebugEntryValues() const {
819      return EmitDebugEntryValues;
820    }
821  
822    bool useOpConvert() const {
823      return EnableOpConvert;
824    }
825  
826    bool shareAcrossDWOCUs() const;
827  
828    /// Returns the Dwarf Version.
829    uint16_t getDwarfVersion() const;
830  
831    /// Returns a suitable DWARF form to represent a section offset, i.e.
832    /// * DW_FORM_sec_offset for DWARF version >= 4;
833    /// * DW_FORM_data8 for 64-bit DWARFv3;
834    /// * DW_FORM_data4 for 32-bit DWARFv3 and DWARFv2.
835    dwarf::Form getDwarfSectionOffsetForm() const;
836  
837    /// Returns the previous CU that was being updated
838    const DwarfCompileUnit *getPrevCU() const { return PrevCU; }
839    void setPrevCU(const DwarfCompileUnit *PrevCU) { this->PrevCU = PrevCU; }
840  
841    /// Terminate the line table by adding the last range label.
842    void terminateLineTable(const DwarfCompileUnit *CU);
843  
844    /// Returns the entries for the .debug_loc section.
845    const DebugLocStream &getDebugLocs() const { return DebugLocs; }
846  
847    /// Emit an entry for the debug loc section. This can be used to
848    /// handle an entry that's going to be emitted into the debug loc section.
849    void emitDebugLocEntry(ByteStreamer &Streamer,
850                           const DebugLocStream::Entry &Entry,
851                           const DwarfCompileUnit *CU);
852  
853    /// Emit the location for a debug loc entry, including the size header.
854    void emitDebugLocEntryLocation(const DebugLocStream::Entry &Entry,
855                                   const DwarfCompileUnit *CU);
856  
857    void addSubprogramNames(const DwarfUnit &Unit,
858                            const DICompileUnit::DebugNameTableKind NameTableKind,
859                            const DISubprogram *SP, DIE &Die);
860  
861    AddressPool &getAddressPool() { return AddrPool; }
862  
863    void addAccelName(const DwarfUnit &Unit,
864                      const DICompileUnit::DebugNameTableKind NameTableKind,
865                      StringRef Name, const DIE &Die);
866  
867    void addAccelObjC(const DwarfUnit &Unit,
868                      const DICompileUnit::DebugNameTableKind NameTableKind,
869                      StringRef Name, const DIE &Die);
870  
871    void addAccelNamespace(const DwarfUnit &Unit,
872                           const DICompileUnit::DebugNameTableKind NameTableKind,
873                           StringRef Name, const DIE &Die);
874  
875    void addAccelType(const DwarfUnit &Unit,
876                      const DICompileUnit::DebugNameTableKind NameTableKind,
877                      StringRef Name, const DIE &Die, char Flags);
878  
879    const MachineFunction *getCurrentFunction() const { return CurFn; }
880  
881    /// A helper function to check whether the DIE for a given Scope is
882    /// going to be null.
883    bool isLexicalScopeDIENull(LexicalScope *Scope);
884  
885    /// Find the matching DwarfCompileUnit for the given CU DIE.
886    DwarfCompileUnit *lookupCU(const DIE *Die) { return CUDieMap.lookup(Die); }
887    const DwarfCompileUnit *lookupCU(const DIE *Die) const {
888      return CUDieMap.lookup(Die);
889    }
890  
891    unsigned getStringTypeLoc(const DIStringType *ST) const {
892      return StringTypeLocMap.lookup(ST);
893    }
894  
895    void addStringTypeLoc(const DIStringType *ST, unsigned Loc) {
896      assert(ST);
897      if (Loc)
898        StringTypeLocMap[ST] = Loc;
899    }
900  
901    /// \defgroup DebuggerTuning Predicates to tune DWARF for a given debugger.
902    ///
903    /// Returns whether we are "tuning" for a given debugger.
904    /// @{
905    bool tuneForGDB() const { return DebuggerTuning == DebuggerKind::GDB; }
906    bool tuneForLLDB() const { return DebuggerTuning == DebuggerKind::LLDB; }
907    bool tuneForSCE() const { return DebuggerTuning == DebuggerKind::SCE; }
908    bool tuneForDBX() const { return DebuggerTuning == DebuggerKind::DBX; }
909    /// @}
910  
911    const MCSymbol *getSectionLabel(const MCSection *S);
912    void insertSectionLabel(const MCSymbol *S);
913  
914    static void emitDebugLocValue(const AsmPrinter &AP, const DIBasicType *BT,
915                                  const DbgValueLoc &Value,
916                                  DwarfExpression &DwarfExpr);
917  
918    /// If the \p File has an MD5 checksum, return it as an MD5Result
919    /// allocated in the MCContext.
920    std::optional<MD5::MD5Result> getMD5AsBytes(const DIFile *File) const;
921  
922    MDNodeSet &getLocalDeclsForScope(const DILocalScope *S) {
923      return LocalDeclsPerLS[S];
924    }
925  
926    /// Sets the current DWARF5AccelTable to use.
927    void setCurrentDWARF5AccelTable(const DWARF5AccelTableKind Kind) {
928      switch (Kind) {
929      case DWARF5AccelTableKind::CU:
930        CurrentDebugNames = &AccelDebugNames;
931        break;
932      case DWARF5AccelTableKind::TU:
933        CurrentDebugNames = &AccelTypeUnitsDebugNames;
934      }
935    }
936    /// Returns either CU or TU DWARF5AccelTable.
937    DWARF5AccelTable &getCurrentDWARF5AccelTable() { return *CurrentDebugNames; }
938  };
939  
940  } // end namespace llvm
941  
942  #endif // LLVM_LIB_CODEGEN_ASMPRINTER_DWARFDEBUG_H
943