[docs] Add LICENSE.txt to the root of the mono-repo
[llvm-project.git] / llvm / lib / CodeGen / AsmPrinter / DwarfDebug.h
blob31e4081b71413a41a8f36dff96c6c5e3d6c77885
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.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_LIB_CODEGEN_ASMPRINTER_DWARFDEBUG_H
14 #define LLVM_LIB_CODEGEN_ASMPRINTER_DWARFDEBUG_H
16 #include "AddressPool.h"
17 #include "DebugLocEntry.h"
18 #include "DebugLocStream.h"
19 #include "DwarfFile.h"
20 #include "llvm/ADT/ArrayRef.h"
21 #include "llvm/ADT/DenseMap.h"
22 #include "llvm/ADT/DenseSet.h"
23 #include "llvm/ADT/MapVector.h"
24 #include "llvm/ADT/SetVector.h"
25 #include "llvm/ADT/SmallPtrSet.h"
26 #include "llvm/ADT/SmallVector.h"
27 #include "llvm/ADT/StringMap.h"
28 #include "llvm/ADT/StringRef.h"
29 #include "llvm/BinaryFormat/Dwarf.h"
30 #include "llvm/CodeGen/AccelTable.h"
31 #include "llvm/CodeGen/DbgEntityHistoryCalculator.h"
32 #include "llvm/CodeGen/DebugHandlerBase.h"
33 #include "llvm/IR/DebugInfoMetadata.h"
34 #include "llvm/IR/DebugLoc.h"
35 #include "llvm/IR/Metadata.h"
36 #include "llvm/MC/MCDwarf.h"
37 #include "llvm/Support/Allocator.h"
38 #include "llvm/Target/TargetOptions.h"
39 #include <cassert>
40 #include <cstdint>
41 #include <limits>
42 #include <memory>
43 #include <utility>
44 #include <vector>
46 namespace llvm {
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;
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
72 private:
73 const DINode *Entity;
74 const DILocation *InlinedAt;
75 DIE *TheDIE = nullptr;
76 const DbgEntityKind SubclassID;
78 public:
79 DbgEntity(const DINode *N, const DILocation *IA, DbgEntityKind ID)
80 : Entity(N), InlinedAt(IA), SubclassID(ID) {}
81 virtual ~DbgEntity() = default;
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 /// @}
91 void setDIE(DIE &D) { TheDIE = &D; }
93 static bool classof(const DbgEntity *N) {
94 switch (N->getDbgEntityID()) {
95 case DbgVariableKind:
96 case DbgLabelKind:
97 return true;
99 llvm_unreachable("Invalid DbgEntityKind");
103 //===----------------------------------------------------------------------===//
104 /// This class is used to track local variable information.
106 /// Variables can be created from allocas, in which case they're generated from
107 /// the MMI table. Such variables can have multiple expressions and frame
108 /// indices.
110 /// Variables can be created from \c DBG_VALUE instructions. Those whose
111 /// location changes over time use \a DebugLocListIndex, while those with a
112 /// single location use \a ValueLoc and (optionally) a single entry of \a Expr.
114 /// Variables that have been optimized out use none of these fields.
115 class DbgVariable : public DbgEntity {
116 /// Index of the entry list in DebugLocs.
117 unsigned DebugLocListIndex = ~0u;
118 /// DW_OP_LLVM_tag_offset value from DebugLocs.
119 Optional<uint8_t> DebugLocListTagOffset;
121 /// Single value location description.
122 std::unique_ptr<DbgValueLoc> ValueLoc = nullptr;
124 struct FrameIndexExpr {
125 int FI;
126 const DIExpression *Expr;
128 mutable SmallVector<FrameIndexExpr, 1>
129 FrameIndexExprs; /// Frame index + expression.
131 public:
132 /// Construct a DbgVariable.
134 /// Creates a variable without any DW_AT_location. Call \a initializeMMI()
135 /// for MMI entries, or \a initializeDbgValue() for DBG_VALUE instructions.
136 DbgVariable(const DILocalVariable *V, const DILocation *IA)
137 : DbgEntity(V, IA, DbgVariableKind) {}
139 /// Initialize from the MMI table.
140 void initializeMMI(const DIExpression *E, int FI) {
141 assert(FrameIndexExprs.empty() && "Already initialized?");
142 assert(!ValueLoc.get() && "Already initialized?");
144 assert((!E || E->isValid()) && "Expected valid expression");
145 assert(FI != std::numeric_limits<int>::max() && "Expected valid index");
147 FrameIndexExprs.push_back({FI, E});
150 // Initialize variable's location.
151 void initializeDbgValue(DbgValueLoc Value) {
152 assert(FrameIndexExprs.empty() && "Already initialized?");
153 assert(!ValueLoc && "Already initialized?");
154 assert(!Value.getExpression()->isFragment() && "Fragments not supported.");
156 ValueLoc = std::make_unique<DbgValueLoc>(Value);
157 if (auto *E = ValueLoc->getExpression())
158 if (E->getNumElements())
159 FrameIndexExprs.push_back({0, E});
162 /// Initialize from a DBG_VALUE instruction.
163 void initializeDbgValue(const MachineInstr *DbgValue);
165 // Accessors.
166 const DILocalVariable *getVariable() const {
167 return cast<DILocalVariable>(getEntity());
170 const DIExpression *getSingleExpression() const {
171 assert(ValueLoc.get() && FrameIndexExprs.size() <= 1);
172 return FrameIndexExprs.size() ? FrameIndexExprs[0].Expr : nullptr;
175 void setDebugLocListIndex(unsigned O) { DebugLocListIndex = O; }
176 unsigned getDebugLocListIndex() const { return DebugLocListIndex; }
177 void setDebugLocListTagOffset(uint8_t O) { DebugLocListTagOffset = O; }
178 Optional<uint8_t> getDebugLocListTagOffset() const { return DebugLocListTagOffset; }
179 StringRef getName() const { return getVariable()->getName(); }
180 const DbgValueLoc *getValueLoc() const { return ValueLoc.get(); }
181 /// Get the FI entries, sorted by fragment offset.
182 ArrayRef<FrameIndexExpr> getFrameIndexExprs() const;
183 bool hasFrameIndexExprs() const { return !FrameIndexExprs.empty(); }
184 void addMMIEntry(const DbgVariable &V);
186 // Translate tag to proper Dwarf tag.
187 dwarf::Tag getTag() const {
188 // FIXME: Why don't we just infer this tag and store it all along?
189 if (getVariable()->isParameter())
190 return dwarf::DW_TAG_formal_parameter;
192 return dwarf::DW_TAG_variable;
195 /// Return true if DbgVariable is artificial.
196 bool isArtificial() const {
197 if (getVariable()->isArtificial())
198 return true;
199 if (getType()->isArtificial())
200 return true;
201 return false;
204 bool isObjectPointer() const {
205 if (getVariable()->isObjectPointer())
206 return true;
207 if (getType()->isObjectPointer())
208 return true;
209 return false;
212 bool hasComplexAddress() const {
213 assert(ValueLoc.get() && "Expected DBG_VALUE, not MMI variable");
214 assert((FrameIndexExprs.empty() ||
215 (FrameIndexExprs.size() == 1 &&
216 FrameIndexExprs[0].Expr->getNumElements())) &&
217 "Invalid Expr for DBG_VALUE");
218 return !FrameIndexExprs.empty();
221 const DIType *getType() const;
223 static bool classof(const DbgEntity *N) {
224 return N->getDbgEntityID() == DbgVariableKind;
228 //===----------------------------------------------------------------------===//
229 /// This class is used to track label information.
231 /// Labels are collected from \c DBG_LABEL instructions.
232 class DbgLabel : public DbgEntity {
233 const MCSymbol *Sym; /// Symbol before DBG_LABEL instruction.
235 public:
236 /// We need MCSymbol information to generate DW_AT_low_pc.
237 DbgLabel(const DILabel *L, const DILocation *IA, const MCSymbol *Sym = nullptr)
238 : DbgEntity(L, IA, DbgLabelKind), Sym(Sym) {}
240 /// Accessors.
241 /// @{
242 const DILabel *getLabel() const { return cast<DILabel>(getEntity()); }
243 const MCSymbol *getSymbol() const { return Sym; }
245 StringRef getName() const { return getLabel()->getName(); }
246 /// @}
248 /// Translate tag to proper Dwarf tag.
249 dwarf::Tag getTag() const {
250 return dwarf::DW_TAG_label;
253 static bool classof(const DbgEntity *N) {
254 return N->getDbgEntityID() == DbgLabelKind;
258 /// Used for tracking debug info about call site parameters.
259 class DbgCallSiteParam {
260 private:
261 unsigned Register; ///< Parameter register at the callee entry point.
262 DbgValueLoc Value; ///< Corresponding location for the parameter value at
263 ///< the call site.
264 public:
265 DbgCallSiteParam(unsigned Reg, DbgValueLoc Val)
266 : Register(Reg), Value(Val) {
267 assert(Reg && "Parameter register cannot be undef");
270 unsigned getRegister() const { return Register; }
271 DbgValueLoc getValue() const { return Value; }
274 /// Collection used for storing debug call site parameters.
275 using ParamSet = SmallVector<DbgCallSiteParam, 4>;
277 /// Helper used to pair up a symbol and its DWARF compile unit.
278 struct SymbolCU {
279 SymbolCU(DwarfCompileUnit *CU, const MCSymbol *Sym) : Sym(Sym), CU(CU) {}
281 const MCSymbol *Sym;
282 DwarfCompileUnit *CU;
285 /// The kind of accelerator tables we should emit.
286 enum class AccelTableKind {
287 Default, ///< Platform default.
288 None, ///< None.
289 Apple, ///< .apple_names, .apple_namespaces, .apple_types, .apple_objc.
290 Dwarf, ///< DWARF v5 .debug_names.
293 /// Collects and handles dwarf debug information.
294 class DwarfDebug : public DebugHandlerBase {
295 /// All DIEValues are allocated through this allocator.
296 BumpPtrAllocator DIEValueAllocator;
298 /// Maps MDNode with its corresponding DwarfCompileUnit.
299 MapVector<const MDNode *, DwarfCompileUnit *> CUMap;
301 /// Maps a CU DIE with its corresponding DwarfCompileUnit.
302 DenseMap<const DIE *, DwarfCompileUnit *> CUDieMap;
304 /// List of all labels used in aranges generation.
305 std::vector<SymbolCU> ArangeLabels;
307 /// Size of each symbol emitted (for those symbols that have a specific size).
308 DenseMap<const MCSymbol *, uint64_t> SymSize;
310 /// Collection of abstract variables/labels.
311 SmallVector<std::unique_ptr<DbgEntity>, 64> ConcreteEntities;
313 /// Collection of DebugLocEntry. Stored in a linked list so that DIELocLists
314 /// can refer to them in spite of insertions into this list.
315 DebugLocStream DebugLocs;
317 /// This is a collection of subprogram MDNodes that are processed to
318 /// create DIEs.
319 SetVector<const DISubprogram *, SmallVector<const DISubprogram *, 16>,
320 SmallPtrSet<const DISubprogram *, 16>>
321 ProcessedSPNodes;
323 /// If nonnull, stores the current machine function we're processing.
324 const MachineFunction *CurFn = nullptr;
326 /// If nonnull, stores the CU in which the previous subprogram was contained.
327 const DwarfCompileUnit *PrevCU = nullptr;
329 /// As an optimization, there is no need to emit an entry in the directory
330 /// table for the same directory as DW_AT_comp_dir.
331 StringRef CompilationDir;
333 /// Holder for the file specific debug information.
334 DwarfFile InfoHolder;
336 /// Holders for the various debug information flags that we might need to
337 /// have exposed. See accessor functions below for description.
339 /// Map from MDNodes for user-defined types to their type signatures. Also
340 /// used to keep track of which types we have emitted type units for.
341 DenseMap<const MDNode *, uint64_t> TypeSignatures;
343 DenseMap<const MCSection *, const MCSymbol *> SectionLabels;
345 SmallVector<
346 std::pair<std::unique_ptr<DwarfTypeUnit>, const DICompositeType *>, 1>
347 TypeUnitsUnderConstruction;
349 /// Whether to use the GNU TLS opcode (instead of the standard opcode).
350 bool UseGNUTLSOpcode;
352 /// Whether to use DWARF 2 bitfields (instead of the DWARF 4 format).
353 bool UseDWARF2Bitfields;
355 /// Whether to emit all linkage names, or just abstract subprograms.
356 bool UseAllLinkageNames;
358 /// Use inlined strings.
359 bool UseInlineStrings = false;
361 /// Allow emission of .debug_ranges section.
362 bool UseRangesSection = true;
364 /// True if the sections itself must be used as references and don't create
365 /// temp symbols inside DWARF sections.
366 bool UseSectionsAsReferences = false;
368 ///Allow emission of the .debug_loc section.
369 bool UseLocSection = true;
371 /// Generate DWARF v4 type units.
372 bool GenerateTypeUnits;
374 /// Emit a .debug_macro section instead of .debug_macinfo.
375 bool UseDebugMacroSection;
377 /// Avoid using DW_OP_convert due to consumer incompatibilities.
378 bool EnableOpConvert;
380 public:
381 enum class MinimizeAddrInV5 {
382 Default,
383 Disabled,
384 Ranges,
385 Expressions,
386 Form,
389 private:
390 /// Force the use of DW_AT_ranges even for single-entry range lists.
391 MinimizeAddrInV5 MinimizeAddr = MinimizeAddrInV5::Disabled;
393 /// DWARF5 Experimental Options
394 /// @{
395 AccelTableKind TheAccelTableKind;
396 bool HasAppleExtensionAttributes;
397 bool HasSplitDwarf;
399 /// Whether to generate the DWARF v5 string offsets table.
400 /// It consists of a series of contributions, each preceded by a header.
401 /// The pre-DWARF v5 string offsets table for split dwarf is, in contrast,
402 /// a monolithic sequence of string offsets.
403 bool UseSegmentedStringOffsetsTable;
405 /// Enable production of call site parameters needed to print the debug entry
406 /// values. Useful for testing purposes when a debugger does not support the
407 /// feature yet.
408 bool EmitDebugEntryValues;
410 /// Separated Dwarf Variables
411 /// In general these will all be for bits that are left in the
412 /// original object file, rather than things that are meant
413 /// to be in the .dwo sections.
415 /// Holder for the skeleton information.
416 DwarfFile SkeletonHolder;
418 /// Store file names for type units under fission in a line table
419 /// header that will be emitted into debug_line.dwo.
420 // FIXME: replace this with a map from comp_dir to table so that we
421 // can emit multiple tables during LTO each of which uses directory
422 // 0, referencing the comp_dir of all the type units that use it.
423 MCDwarfDwoLineTable SplitTypeUnitFileTable;
424 /// @}
426 /// True iff there are multiple CUs in this module.
427 bool SingleCU;
428 bool IsDarwin;
430 /// Map for tracking Fortran deferred CHARACTER lengths.
431 DenseMap<const DIStringType *, unsigned> StringTypeLocMap;
433 AddressPool AddrPool;
435 /// Accelerator tables.
436 AccelTable<DWARF5AccelTableData> AccelDebugNames;
437 AccelTable<AppleAccelTableOffsetData> AccelNames;
438 AccelTable<AppleAccelTableOffsetData> AccelObjC;
439 AccelTable<AppleAccelTableOffsetData> AccelNamespace;
440 AccelTable<AppleAccelTableTypeData> AccelTypes;
442 /// Identify a debugger for "tuning" the debug info.
444 /// The "tuning" should be used to set defaults for individual feature flags
445 /// in DwarfDebug; if a given feature has a more specific command-line option,
446 /// that option should take precedence over the tuning.
447 DebuggerKind DebuggerTuning = DebuggerKind::Default;
449 MCDwarfDwoLineTable *getDwoLineTable(const DwarfCompileUnit &);
451 const SmallVectorImpl<std::unique_ptr<DwarfCompileUnit>> &getUnits() {
452 return InfoHolder.getUnits();
455 using InlinedEntity = DbgValueHistoryMap::InlinedEntity;
457 void ensureAbstractEntityIsCreated(DwarfCompileUnit &CU,
458 const DINode *Node,
459 const MDNode *Scope);
460 void ensureAbstractEntityIsCreatedIfScoped(DwarfCompileUnit &CU,
461 const DINode *Node,
462 const MDNode *Scope);
464 DbgEntity *createConcreteEntity(DwarfCompileUnit &TheCU,
465 LexicalScope &Scope,
466 const DINode *Node,
467 const DILocation *Location,
468 const MCSymbol *Sym = nullptr);
470 /// Construct a DIE for this abstract scope.
471 void constructAbstractSubprogramScopeDIE(DwarfCompileUnit &SrcCU, LexicalScope *Scope);
473 /// Construct DIEs for call site entries describing the calls in \p MF.
474 void constructCallSiteEntryDIEs(const DISubprogram &SP, DwarfCompileUnit &CU,
475 DIE &ScopeDIE, const MachineFunction &MF);
477 template <typename DataT>
478 void addAccelNameImpl(const DICompileUnit &CU, AccelTable<DataT> &AppleAccel,
479 StringRef Name, const DIE &Die);
481 void finishEntityDefinitions();
483 void finishSubprogramDefinitions();
485 /// Finish off debug information after all functions have been
486 /// processed.
487 void finalizeModuleInfo();
489 /// Emit the debug info section.
490 void emitDebugInfo();
492 /// Emit the abbreviation section.
493 void emitAbbreviations();
495 /// Emit the string offsets table header.
496 void emitStringOffsetsTableHeader();
498 /// Emit a specified accelerator table.
499 template <typename AccelTableT>
500 void emitAccel(AccelTableT &Accel, MCSection *Section, StringRef TableName);
502 /// Emit DWARF v5 accelerator table.
503 void emitAccelDebugNames();
505 /// Emit visible names into a hashed accelerator table section.
506 void emitAccelNames();
508 /// Emit objective C classes and categories into a hashed
509 /// accelerator table section.
510 void emitAccelObjC();
512 /// Emit namespace dies into a hashed accelerator table.
513 void emitAccelNamespaces();
515 /// Emit type dies into a hashed accelerator table.
516 void emitAccelTypes();
518 /// Emit visible names and types into debug pubnames and pubtypes sections.
519 void emitDebugPubSections();
521 void emitDebugPubSection(bool GnuStyle, StringRef Name,
522 DwarfCompileUnit *TheU,
523 const StringMap<const DIE *> &Globals);
525 /// Emit null-terminated strings into a debug str section.
526 void emitDebugStr();
528 /// Emit variable locations into a debug loc section.
529 void emitDebugLoc();
531 /// Emit variable locations into a debug loc dwo section.
532 void emitDebugLocDWO();
534 void emitDebugLocImpl(MCSection *Sec);
536 /// Emit address ranges into a debug aranges section.
537 void emitDebugARanges();
539 /// Emit address ranges into a debug ranges section.
540 void emitDebugRanges();
541 void emitDebugRangesDWO();
542 void emitDebugRangesImpl(const DwarfFile &Holder, MCSection *Section);
544 /// Emit macros into a debug macinfo section.
545 void emitDebugMacinfo();
546 /// Emit macros into a debug macinfo.dwo section.
547 void emitDebugMacinfoDWO();
548 void emitDebugMacinfoImpl(MCSection *Section);
549 void emitMacro(DIMacro &M);
550 void emitMacroFile(DIMacroFile &F, DwarfCompileUnit &U);
551 void emitMacroFileImpl(DIMacroFile &F, DwarfCompileUnit &U,
552 unsigned StartFile, unsigned EndFile,
553 StringRef (*MacroFormToString)(unsigned Form));
554 void handleMacroNodes(DIMacroNodeArray Nodes, DwarfCompileUnit &U);
556 /// DWARF 5 Experimental Split Dwarf Emitters
558 /// Initialize common features of skeleton units.
559 void initSkeletonUnit(const DwarfUnit &U, DIE &Die,
560 std::unique_ptr<DwarfCompileUnit> NewU);
562 /// Construct the split debug info compile unit for the debug info section.
563 /// In DWARF v5, the skeleton unit DIE may have the following attributes:
564 /// DW_AT_addr_base, DW_AT_comp_dir, DW_AT_dwo_name, DW_AT_high_pc,
565 /// DW_AT_low_pc, DW_AT_ranges, DW_AT_stmt_list, and DW_AT_str_offsets_base.
566 /// Prior to DWARF v5 it may also have DW_AT_GNU_dwo_id. DW_AT_GNU_dwo_name
567 /// is used instead of DW_AT_dwo_name, Dw_AT_GNU_addr_base instead of
568 /// DW_AT_addr_base, and DW_AT_GNU_ranges_base instead of DW_AT_rnglists_base.
569 DwarfCompileUnit &constructSkeletonCU(const DwarfCompileUnit &CU);
571 /// Emit the debug info dwo section.
572 void emitDebugInfoDWO();
574 /// Emit the debug abbrev dwo section.
575 void emitDebugAbbrevDWO();
577 /// Emit the debug line dwo section.
578 void emitDebugLineDWO();
580 /// Emit the dwo stringoffsets table header.
581 void emitStringOffsetsTableHeaderDWO();
583 /// Emit the debug str dwo section.
584 void emitDebugStrDWO();
586 /// Emit DWO addresses.
587 void emitDebugAddr();
589 /// Flags to let the linker know we have emitted new style pubnames. Only
590 /// emit it here if we don't have a skeleton CU for split dwarf.
591 void addGnuPubAttributes(DwarfCompileUnit &U, DIE &D) const;
593 /// Create new DwarfCompileUnit for the given metadata node with tag
594 /// DW_TAG_compile_unit.
595 DwarfCompileUnit &getOrCreateDwarfCompileUnit(const DICompileUnit *DIUnit);
596 void finishUnitAttributes(const DICompileUnit *DIUnit,
597 DwarfCompileUnit &NewCU);
599 /// Construct imported_module or imported_declaration DIE.
600 void constructAndAddImportedEntityDIE(DwarfCompileUnit &TheCU,
601 const DIImportedEntity *N);
603 /// Register a source line with debug info. Returns the unique
604 /// label that was emitted and which provides correspondence to the
605 /// source line list.
606 void recordSourceLine(unsigned Line, unsigned Col, const MDNode *Scope,
607 unsigned Flags);
609 /// Populate LexicalScope entries with variables' info.
610 void collectEntityInfo(DwarfCompileUnit &TheCU, const DISubprogram *SP,
611 DenseSet<InlinedEntity> &ProcessedVars);
613 /// Build the location list for all DBG_VALUEs in the
614 /// function that describe the same variable. If the resulting
615 /// list has only one entry that is valid for entire variable's
616 /// scope return true.
617 bool buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
618 const DbgValueHistoryMap::Entries &Entries);
620 /// Collect variable information from the side table maintained by MF.
621 void collectVariableInfoFromMFTable(DwarfCompileUnit &TheCU,
622 DenseSet<InlinedEntity> &P);
624 /// Emit the reference to the section.
625 void emitSectionReference(const DwarfCompileUnit &CU);
627 protected:
628 /// Gather pre-function debug information.
629 void beginFunctionImpl(const MachineFunction *MF) override;
631 /// Gather and emit post-function debug information.
632 void endFunctionImpl(const MachineFunction *MF) override;
634 /// Get Dwarf compile unit ID for line table.
635 unsigned getDwarfCompileUnitIDForLineTable(const DwarfCompileUnit &CU);
637 void skippedNonDebugFunction() override;
639 public:
640 //===--------------------------------------------------------------------===//
641 // Main entry points.
643 DwarfDebug(AsmPrinter *A);
645 ~DwarfDebug() override;
647 /// Emit all Dwarf sections that should come prior to the
648 /// content.
649 void beginModule(Module *M) override;
651 /// Emit all Dwarf sections that should come after the content.
652 void endModule() override;
654 /// Emits inital debug location directive.
655 DebugLoc emitInitialLocDirective(const MachineFunction &MF, unsigned CUID);
657 /// Process beginning of an instruction.
658 void beginInstruction(const MachineInstr *MI) override;
660 /// Perform an MD5 checksum of \p Identifier and return the lower 64 bits.
661 static uint64_t makeTypeSignature(StringRef Identifier);
663 /// Add a DIE to the set of types that we're going to pull into
664 /// type units.
665 void addDwarfTypeUnitType(DwarfCompileUnit &CU, StringRef Identifier,
666 DIE &Die, const DICompositeType *CTy);
668 /// Add a label so that arange data can be generated for it.
669 void addArangeLabel(SymbolCU SCU) { ArangeLabels.push_back(SCU); }
671 /// For symbols that have a size designated (e.g. common symbols),
672 /// this tracks that size.
673 void setSymbolSize(const MCSymbol *Sym, uint64_t Size) override {
674 SymSize[Sym] = Size;
677 /// Returns whether we should emit all DW_AT_[MIPS_]linkage_name.
678 /// If not, we still might emit certain cases.
679 bool useAllLinkageNames() const { return UseAllLinkageNames; }
681 /// Returns whether to use DW_OP_GNU_push_tls_address, instead of the
682 /// standard DW_OP_form_tls_address opcode
683 bool useGNUTLSOpcode() const { return UseGNUTLSOpcode; }
685 /// Returns whether to use the DWARF2 format for bitfields instyead of the
686 /// DWARF4 format.
687 bool useDWARF2Bitfields() const { return UseDWARF2Bitfields; }
689 /// Returns whether to use inline strings.
690 bool useInlineStrings() const { return UseInlineStrings; }
692 /// Returns whether ranges section should be emitted.
693 bool useRangesSection() const { return UseRangesSection; }
695 /// Returns whether range encodings should be used for single entry range
696 /// lists.
697 bool alwaysUseRanges() const {
698 return MinimizeAddr == MinimizeAddrInV5::Ranges;
701 // Returns whether novel exprloc addrx+offset encodings should be used to
702 // reduce debug_addr size.
703 bool useAddrOffsetExpressions() const {
704 return MinimizeAddr == MinimizeAddrInV5::Expressions;
707 // Returns whether addrx+offset LLVM extension form should be used to reduce
708 // debug_addr size.
709 bool useAddrOffsetForm() const {
710 return MinimizeAddr == MinimizeAddrInV5::Form;
713 /// Returns whether to use sections as labels rather than temp symbols.
714 bool useSectionsAsReferences() const {
715 return UseSectionsAsReferences;
718 /// Returns whether .debug_loc section should be emitted.
719 bool useLocSection() const { return UseLocSection; }
721 /// Returns whether to generate DWARF v4 type units.
722 bool generateTypeUnits() const { return GenerateTypeUnits; }
724 // Experimental DWARF5 features.
726 /// Returns what kind (if any) of accelerator tables to emit.
727 AccelTableKind getAccelTableKind() const { return TheAccelTableKind; }
729 bool useAppleExtensionAttributes() const {
730 return HasAppleExtensionAttributes;
733 /// Returns whether or not to change the current debug info for the
734 /// split dwarf proposal support.
735 bool useSplitDwarf() const { return HasSplitDwarf; }
737 /// Returns whether to generate a string offsets table with (possibly shared)
738 /// contributions from each CU and type unit. This implies the use of
739 /// DW_FORM_strx* indirect references with DWARF v5 and beyond. Note that
740 /// DW_FORM_GNU_str_index is also an indirect reference, but it is used with
741 /// a pre-DWARF v5 implementation of split DWARF sections, which uses a
742 /// monolithic string offsets table.
743 bool useSegmentedStringOffsetsTable() const {
744 return UseSegmentedStringOffsetsTable;
747 bool emitDebugEntryValues() const {
748 return EmitDebugEntryValues;
751 bool useOpConvert() const {
752 return EnableOpConvert;
755 bool shareAcrossDWOCUs() const;
757 /// Returns the Dwarf Version.
758 uint16_t getDwarfVersion() const;
760 /// Returns a suitable DWARF form to represent a section offset, i.e.
761 /// * DW_FORM_sec_offset for DWARF version >= 4;
762 /// * DW_FORM_data8 for 64-bit DWARFv3;
763 /// * DW_FORM_data4 for 32-bit DWARFv3 and DWARFv2.
764 dwarf::Form getDwarfSectionOffsetForm() const;
766 /// Returns the previous CU that was being updated
767 const DwarfCompileUnit *getPrevCU() const { return PrevCU; }
768 void setPrevCU(const DwarfCompileUnit *PrevCU) { this->PrevCU = PrevCU; }
770 /// Terminate the line table by adding the last range label.
771 void terminateLineTable(const DwarfCompileUnit *CU);
773 /// Returns the entries for the .debug_loc section.
774 const DebugLocStream &getDebugLocs() const { return DebugLocs; }
776 /// Emit an entry for the debug loc section. This can be used to
777 /// handle an entry that's going to be emitted into the debug loc section.
778 void emitDebugLocEntry(ByteStreamer &Streamer,
779 const DebugLocStream::Entry &Entry,
780 const DwarfCompileUnit *CU);
782 /// Emit the location for a debug loc entry, including the size header.
783 void emitDebugLocEntryLocation(const DebugLocStream::Entry &Entry,
784 const DwarfCompileUnit *CU);
786 void addSubprogramNames(const DICompileUnit &CU, const DISubprogram *SP,
787 DIE &Die);
789 AddressPool &getAddressPool() { return AddrPool; }
791 void addAccelName(const DICompileUnit &CU, StringRef Name, const DIE &Die);
793 void addAccelObjC(const DICompileUnit &CU, StringRef Name, const DIE &Die);
795 void addAccelNamespace(const DICompileUnit &CU, StringRef Name,
796 const DIE &Die);
798 void addAccelType(const DICompileUnit &CU, StringRef Name, const DIE &Die,
799 char Flags);
801 const MachineFunction *getCurrentFunction() const { return CurFn; }
803 /// A helper function to check whether the DIE for a given Scope is
804 /// going to be null.
805 bool isLexicalScopeDIENull(LexicalScope *Scope);
807 /// Find the matching DwarfCompileUnit for the given CU DIE.
808 DwarfCompileUnit *lookupCU(const DIE *Die) { return CUDieMap.lookup(Die); }
809 const DwarfCompileUnit *lookupCU(const DIE *Die) const {
810 return CUDieMap.lookup(Die);
813 unsigned getStringTypeLoc(const DIStringType *ST) const {
814 return StringTypeLocMap.lookup(ST);
817 void addStringTypeLoc(const DIStringType *ST, unsigned Loc) {
818 assert(ST);
819 if (Loc)
820 StringTypeLocMap[ST] = Loc;
823 /// \defgroup DebuggerTuning Predicates to tune DWARF for a given debugger.
825 /// Returns whether we are "tuning" for a given debugger.
826 /// @{
827 bool tuneForGDB() const { return DebuggerTuning == DebuggerKind::GDB; }
828 bool tuneForLLDB() const { return DebuggerTuning == DebuggerKind::LLDB; }
829 bool tuneForSCE() const { return DebuggerTuning == DebuggerKind::SCE; }
830 bool tuneForDBX() const { return DebuggerTuning == DebuggerKind::DBX; }
831 /// @}
833 const MCSymbol *getSectionLabel(const MCSection *S);
834 void insertSectionLabel(const MCSymbol *S);
836 static void emitDebugLocValue(const AsmPrinter &AP, const DIBasicType *BT,
837 const DbgValueLoc &Value,
838 DwarfExpression &DwarfExpr);
840 /// If the \p File has an MD5 checksum, return it as an MD5Result
841 /// allocated in the MCContext.
842 Optional<MD5::MD5Result> getMD5AsBytes(const DIFile *File) const;
845 } // end namespace llvm
847 #endif // LLVM_LIB_CODEGEN_ASMPRINTER_DWARFDEBUG_H