1 //===-- llvm/CodeGen/DwarfDebug.h - Dwarf Debug Framework ------*- C++ -*--===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains support for writing dwarf debug info into asm files.
12 //===----------------------------------------------------------------------===//
14 #ifndef CODEGEN_ASMPRINTER_DWARFDEBUG_H__
15 #define CODEGEN_ASMPRINTER_DWARFDEBUG_H__
17 #include "llvm/CodeGen/AsmPrinter.h"
18 #include "llvm/CodeGen/MachineLocation.h"
19 #include "llvm/Analysis/DebugInfo.h"
21 #include "llvm/ADT/DenseMap.h"
22 #include "llvm/ADT/FoldingSet.h"
23 #include "llvm/ADT/SmallPtrSet.h"
24 #include "llvm/ADT/StringMap.h"
25 #include "llvm/ADT/UniqueVector.h"
26 #include "llvm/Support/Allocator.h"
27 #include "llvm/Support/DebugLoc.h"
32 class DbgConcreteScope
;
35 class MachineFrameInfo
;
36 class MachineModuleInfo
;
44 //===----------------------------------------------------------------------===//
45 /// SrcLineInfo - This class is used to record source line correspondence.
48 unsigned Line
; // Source line number.
49 unsigned Column
; // Source column.
50 unsigned SourceID
; // Source ID number.
51 MCSymbol
*Label
; // Label in code ID number.
53 SrcLineInfo(unsigned L
, unsigned C
, unsigned S
, MCSymbol
*label
)
54 : Line(L
), Column(C
), SourceID(S
), Label(label
) {}
57 unsigned getLine() const { return Line
; }
58 unsigned getColumn() const { return Column
; }
59 unsigned getSourceID() const { return SourceID
; }
60 MCSymbol
*getLabel() const { return Label
; }
63 /// DotDebugLocEntry - This struct describes location entries emitted in
64 /// .debug_loc section.
65 typedef struct DotDebugLocEntry
{
66 const MCSymbol
*Begin
;
69 const MDNode
*Variable
;
78 enum EntryType EntryKind
;
82 const ConstantFP
*CFP
;
83 const ConstantInt
*CIP
;
86 : Begin(0), End(0), Variable(0), Merged(false),
87 Constant(false) { Constants
.Int
= 0;}
88 DotDebugLocEntry(const MCSymbol
*B
, const MCSymbol
*E
, MachineLocation
&L
,
90 : Begin(B
), End(E
), Loc(L
), Variable(V
), Merged(false),
91 Constant(false) { Constants
.Int
= 0; EntryKind
= E_Location
; }
92 DotDebugLocEntry(const MCSymbol
*B
, const MCSymbol
*E
, int64_t i
)
93 : Begin(B
), End(E
), Variable(0), Merged(false),
94 Constant(true) { Constants
.Int
= i
; EntryKind
= E_Integer
; }
95 DotDebugLocEntry(const MCSymbol
*B
, const MCSymbol
*E
, const ConstantFP
*FPtr
)
96 : Begin(B
), End(E
), Variable(0), Merged(false),
97 Constant(true) { Constants
.CFP
= FPtr
; EntryKind
= E_ConstantFP
; }
98 DotDebugLocEntry(const MCSymbol
*B
, const MCSymbol
*E
, const ConstantInt
*IPtr
)
99 : Begin(B
), End(E
), Variable(0), Merged(false),
100 Constant(true) { Constants
.CIP
= IPtr
; EntryKind
= E_ConstantInt
; }
102 /// Empty entries are also used as a trigger to emit temp label. Such
103 /// labels are referenced is used to find debug_loc offset for a given DIE.
104 bool isEmpty() { return Begin
== 0 && End
== 0; }
105 bool isMerged() { return Merged
; }
106 void Merge(DotDebugLocEntry
*Next
) {
107 if (!(Begin
&& Loc
== Next
->Loc
&& End
== Next
->Begin
))
112 bool isLocation() const { return EntryKind
== E_Location
; }
113 bool isInt() const { return EntryKind
== E_Integer
; }
114 bool isConstantFP() const { return EntryKind
== E_ConstantFP
; }
115 bool isConstantInt() const { return EntryKind
== E_ConstantInt
; }
116 int64_t getInt() { return Constants
.Int
; }
117 const ConstantFP
*getConstantFP() { return Constants
.CFP
; }
118 const ConstantInt
*getConstantInt() { return Constants
.CIP
; }
121 //===----------------------------------------------------------------------===//
122 /// DbgVariable - This class is used to track local variable information.
125 DIVariable Var
; // Variable Descriptor.
126 DIE
*TheDIE
; // Variable DIE.
127 unsigned DotDebugLocOffset
; // Offset in DotDebugLocEntries.
129 // AbsVar may be NULL.
130 DbgVariable(DIVariable V
) : Var(V
), TheDIE(0), DotDebugLocOffset(~0U) {}
133 DIVariable
getVariable() const { return Var
; }
134 void setDIE(DIE
*D
) { TheDIE
= D
; }
135 DIE
*getDIE() const { return TheDIE
; }
136 void setDotDebugLocOffset(unsigned O
) { DotDebugLocOffset
= O
; }
137 unsigned getDotDebugLocOffset() const { return DotDebugLocOffset
; }
138 StringRef
getName() const { return Var
.getName(); }
139 unsigned getTag() const { return Var
.getTag(); }
140 bool variableHasComplexAddress() const {
141 assert(Var
.Verify() && "Invalid complex DbgVariable!");
142 return Var
.hasComplexAddress();
144 bool isBlockByrefVariable() const {
145 assert(Var
.Verify() && "Invalid complex DbgVariable!");
146 return Var
.isBlockByrefVariable();
148 unsigned getNumAddrElements() const {
149 assert(Var
.Verify() && "Invalid complex DbgVariable!");
150 return Var
.getNumAddrElements();
152 uint64_t getAddrElement(unsigned i
) const {
153 return Var
.getAddrElement(i
);
155 DIType
getType() const;
159 /// Asm - Target of Dwarf emission.
162 /// MMI - Collected machine module information.
163 MachineModuleInfo
*MMI
;
165 //===--------------------------------------------------------------------===//
166 // Attributes used to construct specific Dwarf sections.
169 CompileUnit
*FirstCU
;
170 DenseMap
<const MDNode
*, CompileUnit
*> CUMap
;
172 /// AbbreviationsSet - Used to uniquely define abbreviations.
174 FoldingSet
<DIEAbbrev
> AbbreviationsSet
;
176 /// Abbreviations - A list of all the unique abbreviations in use.
178 std::vector
<DIEAbbrev
*> Abbreviations
;
180 /// SourceIdMap - Source id map, i.e. pair of directory id and source file
181 /// id mapped to a unique id.
182 StringMap
<unsigned> SourceIdMap
;
184 /// StringPool - A String->Symbol mapping of strings used by indirect
186 StringMap
<std::pair
<MCSymbol
*, unsigned> > StringPool
;
187 unsigned NextStringPoolNumber
;
189 MCSymbol
*getStringPoolEntry(StringRef Str
);
191 /// SectionMap - Provides a unique id per text section.
193 UniqueVector
<const MCSection
*> SectionMap
;
195 /// CurrentFnDbgScope - Top level scope for the current function.
197 DbgScope
*CurrentFnDbgScope
;
199 /// CurrentFnArguments - List of Arguments (DbgValues) for current function.
200 SmallVector
<DbgVariable
*, 8> CurrentFnArguments
;
202 /// DbgScopeMap - Tracks the scopes in the current function. Owns the
203 /// contained DbgScope*s.
205 DenseMap
<const MDNode
*, DbgScope
*> DbgScopeMap
;
207 /// ConcreteScopes - Tracks the concrete scopees in the current function.
208 /// These scopes are also included in DbgScopeMap.
209 DenseMap
<const MDNode
*, DbgScope
*> ConcreteScopes
;
211 /// AbstractScopes - Tracks the abstract scopes a module. These scopes are
212 /// not included DbgScopeMap. AbstractScopes owns its DbgScope*s.
213 DenseMap
<const MDNode
*, DbgScope
*> AbstractScopes
;
215 /// AbstractSPDies - Collection of abstract subprogram DIEs.
216 DenseMap
<const MDNode
*, DIE
*> AbstractSPDies
;
218 /// AbstractScopesList - Tracks abstract scopes constructed while processing
219 /// a function. This list is cleared during endFunction().
220 SmallVector
<DbgScope
*, 4>AbstractScopesList
;
222 /// AbstractVariables - Collection on abstract variables. Owned by the
223 /// DbgScopes in AbstractScopes.
224 DenseMap
<const MDNode
*, DbgVariable
*> AbstractVariables
;
226 /// DbgVariableToFrameIndexMap - Tracks frame index used to find
227 /// variable's value.
228 DenseMap
<const DbgVariable
*, int> DbgVariableToFrameIndexMap
;
230 /// DbgVariableToDbgInstMap - Maps DbgVariable to corresponding DBG_VALUE
231 /// machine instruction.
232 DenseMap
<const DbgVariable
*, const MachineInstr
*> DbgVariableToDbgInstMap
;
234 /// DotDebugLocEntries - Collection of DotDebugLocEntry.
235 SmallVector
<DotDebugLocEntry
, 4> DotDebugLocEntries
;
237 /// UseDotDebugLocEntry - DW_AT_location attributes for the DIEs in this set
238 /// idetifies corresponding .debug_loc entry offset.
239 SmallPtrSet
<const DIE
*, 4> UseDotDebugLocEntry
;
241 /// VarToAbstractVarMap - Maps DbgVariable with corresponding Abstract
242 /// DbgVariable, if any.
243 DenseMap
<const DbgVariable
*, const DbgVariable
*> VarToAbstractVarMap
;
245 /// InliendSubprogramDIEs - Collection of subprgram DIEs that are marked
246 /// (at the end of the module) as DW_AT_inline.
247 SmallPtrSet
<DIE
*, 4> InlinedSubprogramDIEs
;
249 /// ContainingTypeMap - This map is used to keep track of subprogram DIEs that
250 /// need DW_AT_containing_type attribute. This attribute points to a DIE that
251 /// corresponds to the MDNode mapped with the subprogram DIE.
252 DenseMap
<DIE
*, const MDNode
*> ContainingTypeMap
;
254 /// InlineInfo - Keep track of inlined functions and their location. This
255 /// information is used to populate debug_inlined section.
256 typedef std::pair
<const MCSymbol
*, DIE
*> InlineInfoLabels
;
257 DenseMap
<const MDNode
*, SmallVector
<InlineInfoLabels
, 4> > InlineInfo
;
258 SmallVector
<const MDNode
*, 4> InlinedSPNodes
;
260 // ProcessedSPNodes - This is a collection of subprogram MDNodes that
261 // are processed to create DIEs.
262 SmallPtrSet
<const MDNode
*, 16> ProcessedSPNodes
;
264 /// LabelsBeforeInsn - Maps instruction with label emitted before
266 DenseMap
<const MachineInstr
*, MCSymbol
*> LabelsBeforeInsn
;
268 /// LabelsAfterInsn - Maps instruction with label emitted after
270 DenseMap
<const MachineInstr
*, MCSymbol
*> LabelsAfterInsn
;
272 /// UserVariables - Every user variable mentioned by a DBG_VALUE instruction
273 /// in order of appearance.
274 SmallVector
<const MDNode
*, 8> UserVariables
;
276 /// DbgValues - For each user variable, keep a list of DBG_VALUE
277 /// instructions in order. The list can also contain normal instructions that
278 /// clobber the previous DBG_VALUE.
279 typedef DenseMap
<const MDNode
*, SmallVector
<const MachineInstr
*, 4> >
281 DbgValueHistoryMap DbgValues
;
283 SmallVector
<const MCSymbol
*, 8> DebugRangeSymbols
;
285 /// Previous instruction's location information. This is used to determine
286 /// label location to indicate scope boundries in dwarf debug info.
287 DebugLoc PrevInstLoc
;
290 /// PrologEndLoc - This location indicates end of function prologue and
291 /// beginning of function body.
292 DebugLoc PrologEndLoc
;
294 struct FunctionDebugFrameInfo
{
296 std::vector
<MachineMove
> Moves
;
298 FunctionDebugFrameInfo(unsigned Num
, const std::vector
<MachineMove
> &M
)
299 : Number(Num
), Moves(M
) {}
302 std::vector
<FunctionDebugFrameInfo
> DebugFrames
;
304 // DIEValueAllocator - All DIEValues are allocated through this allocator.
305 BumpPtrAllocator DIEValueAllocator
;
307 // Section Symbols: these are assembler temporary labels that are emitted at
308 // the beginning of each supported dwarf section. These are used to form
309 // section offsets and are created by EmitSectionLabels.
310 MCSymbol
*DwarfInfoSectionSym
, *DwarfAbbrevSectionSym
;
311 MCSymbol
*DwarfStrSectionSym
, *TextSectionSym
, *DwarfDebugRangeSectionSym
;
312 MCSymbol
*DwarfDebugLocSectionSym
;
313 MCSymbol
*FunctionBeginSym
, *FunctionEndSym
;
317 /// assignAbbrevNumber - Define a unique number for the abbreviation.
319 void assignAbbrevNumber(DIEAbbrev
&Abbrev
);
321 /// getOrCreateDbgScope - Create DbgScope for the scope.
322 DbgScope
*getOrCreateDbgScope(const MDNode
*Scope
, const MDNode
*InlinedAt
);
324 DbgScope
*getOrCreateAbstractScope(const MDNode
*N
);
326 /// findAbstractVariable - Find abstract variable associated with Var.
327 DbgVariable
*findAbstractVariable(DIVariable
&Var
, DebugLoc Loc
);
329 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and
330 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
331 /// If there are global variables in this scope then create and insert
332 /// DIEs for these variables.
333 DIE
*updateSubprogramScopeDIE(const MDNode
*SPNode
);
335 /// constructLexicalScope - Construct new DW_TAG_lexical_block
336 /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
337 DIE
*constructLexicalScopeDIE(DbgScope
*Scope
);
339 /// constructInlinedScopeDIE - This scope represents inlined body of
340 /// a function. Construct DIE to represent this concrete inlined copy
342 DIE
*constructInlinedScopeDIE(DbgScope
*Scope
);
344 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
345 DIE
*constructVariableDIE(DbgVariable
*DV
, DbgScope
*S
);
347 /// constructScopeDIE - Construct a DIE for this scope.
348 DIE
*constructScopeDIE(DbgScope
*Scope
);
350 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
351 /// the start of each one.
352 void EmitSectionLabels();
354 /// emitDIE - Recusively Emits a debug information entry.
356 void emitDIE(DIE
*Die
);
358 /// computeSizeAndOffset - Compute the size and offset of a DIE.
360 unsigned computeSizeAndOffset(DIE
*Die
, unsigned Offset
, bool Last
);
362 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
364 void computeSizeAndOffsets();
366 /// EmitDebugInfo - Emit the debug info section.
368 void emitDebugInfo();
370 /// emitAbbreviations - Emit the abbreviation section.
372 void emitAbbreviations() const;
374 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
377 void emitEndOfLineMatrix(unsigned SectionEnd
);
379 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
381 void emitDebugPubNames();
383 /// emitDebugPubTypes - Emit visible types into a debug pubtypes section.
385 void emitDebugPubTypes();
387 /// emitDebugStr - Emit visible names into a debug str section.
391 /// emitDebugLoc - Emit visible names into a debug loc section.
395 /// EmitDebugARanges - Emit visible names into a debug aranges section.
397 void EmitDebugARanges();
399 /// emitDebugRanges - Emit visible names into a debug ranges section.
401 void emitDebugRanges();
403 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
405 void emitDebugMacInfo();
407 /// emitDebugInlineInfo - Emit inline info using following format.
409 /// 1. length of section
410 /// 2. Dwarf version number
413 /// Entries (one "entry" for each function that was inlined):
415 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
416 /// otherwise offset into __debug_str for regular function name.
417 /// 2. offset into __debug_str section for regular function name.
418 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
419 /// instances for the function.
421 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
422 /// inlined instance; the die_offset points to the inlined_subroutine die in
423 /// the __debug_info section, and the low_pc is the starting address for the
424 /// inlining instance.
425 void emitDebugInlineInfo();
427 /// constructCompileUnit - Create new CompileUnit for the given
428 /// metadata node with tag DW_TAG_compile_unit.
429 void constructCompileUnit(const MDNode
*N
);
431 /// getCompielUnit - Get CompileUnit DIE.
432 CompileUnit
*getCompileUnit(const MDNode
*N
) const;
434 /// constructGlobalVariableDIE - Construct global variable DIE.
435 void constructGlobalVariableDIE(const MDNode
*N
);
437 /// construct SubprogramDIE - Construct subprogram DIE.
438 void constructSubprogramDIE(const MDNode
*N
);
440 /// recordSourceLine - Register a source line with debug info. Returns the
441 /// unique label that was emitted and which provides correspondence to
442 /// the source line list.
443 void recordSourceLine(unsigned Line
, unsigned Col
, const MDNode
*Scope
,
446 /// recordVariableFrameIndex - Record a variable's index.
447 void recordVariableFrameIndex(const DbgVariable
*V
, int Index
);
449 /// findVariableFrameIndex - Return true if frame index for the variable
450 /// is found. Update FI to hold value of the index.
451 bool findVariableFrameIndex(const DbgVariable
*V
, int *FI
);
453 /// findDbgScope - Find DbgScope for the debug loc attached with an
455 DbgScope
*findDbgScope(const MachineInstr
*MI
);
457 /// identifyScopeMarkers() - Indentify instructions that are marking
458 /// beginning of or end of a scope.
459 void identifyScopeMarkers();
461 /// extractScopeInformation - Scan machine instructions in this function
462 /// and collect DbgScopes. Return true, if atleast one scope was found.
463 bool extractScopeInformation();
465 /// addCurrentFnArgument - If Var is an current function argument that add
466 /// it in CurrentFnArguments list.
467 bool addCurrentFnArgument(const MachineFunction
*MF
,
468 DbgVariable
*Var
, DbgScope
*Scope
);
470 /// collectVariableInfo - Populate DbgScope entries with variables' info.
471 void collectVariableInfo(const MachineFunction
*,
472 SmallPtrSet
<const MDNode
*, 16> &ProcessedVars
);
474 /// collectVariableInfoFromMMITable - Collect variable information from
475 /// side table maintained by MMI.
476 void collectVariableInfoFromMMITable(const MachineFunction
* MF
,
477 SmallPtrSet
<const MDNode
*, 16> &P
);
479 /// requestLabelBeforeInsn - Ensure that a label will be emitted before MI.
480 void requestLabelBeforeInsn(const MachineInstr
*MI
) {
481 LabelsBeforeInsn
.insert(std::make_pair(MI
, (MCSymbol
*)0));
484 /// getLabelBeforeInsn - Return Label preceding the instruction.
485 const MCSymbol
*getLabelBeforeInsn(const MachineInstr
*MI
);
487 /// requestLabelAfterInsn - Ensure that a label will be emitted after MI.
488 void requestLabelAfterInsn(const MachineInstr
*MI
) {
489 LabelsAfterInsn
.insert(std::make_pair(MI
, (MCSymbol
*)0));
492 /// getLabelAfterInsn - Return Label immediately following the instruction.
493 const MCSymbol
*getLabelAfterInsn(const MachineInstr
*MI
);
496 //===--------------------------------------------------------------------===//
497 // Main entry points.
499 DwarfDebug(AsmPrinter
*A
, Module
*M
);
502 /// beginModule - Emit all Dwarf sections that should come prior to the
504 void beginModule(Module
*M
);
506 /// endModule - Emit all Dwarf sections that should come after the content.
510 /// beginFunction - Gather pre-function debug information. Assumes being
511 /// emitted immediately after the function entry point.
512 void beginFunction(const MachineFunction
*MF
);
514 /// endFunction - Gather and emit post-function debug information.
516 void endFunction(const MachineFunction
*MF
);
518 /// beginInstruction - Process beginning of an instruction.
519 void beginInstruction(const MachineInstr
*MI
);
521 /// endInstruction - Prcess end of an instruction.
522 void endInstruction(const MachineInstr
*MI
);
524 /// GetOrCreateSourceID - Look up the source id with the given directory and
525 /// source file names. If none currently exists, create a new id and insert it
526 /// in the SourceIds map.
527 unsigned GetOrCreateSourceID(StringRef DirName
, StringRef FullName
);
529 /// createSubprogramDIE - Create new DIE using SP.
530 DIE
*createSubprogramDIE(DISubprogram SP
);
532 } // End of namespace llvm