1 //===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
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 #define DEBUG_TYPE "dwarfdebug"
15 #include "DwarfDebug.h"
17 #include "DwarfCompileUnit.h"
18 #include "llvm/Constants.h"
19 #include "llvm/Module.h"
20 #include "llvm/Instructions.h"
21 #include "llvm/CodeGen/MachineFunction.h"
22 #include "llvm/CodeGen/MachineModuleInfo.h"
23 #include "llvm/MC/MCAsmInfo.h"
24 #include "llvm/MC/MCSection.h"
25 #include "llvm/MC/MCStreamer.h"
26 #include "llvm/MC/MCSymbol.h"
27 #include "llvm/Target/Mangler.h"
28 #include "llvm/Target/TargetData.h"
29 #include "llvm/Target/TargetFrameLowering.h"
30 #include "llvm/Target/TargetLoweringObjectFile.h"
31 #include "llvm/Target/TargetMachine.h"
32 #include "llvm/Target/TargetRegisterInfo.h"
33 #include "llvm/Target/TargetOptions.h"
34 #include "llvm/Analysis/DebugInfo.h"
35 #include "llvm/Analysis/DIBuilder.h"
36 #include "llvm/ADT/Statistic.h"
37 #include "llvm/ADT/STLExtras.h"
38 #include "llvm/ADT/StringExtras.h"
39 #include "llvm/Support/CommandLine.h"
40 #include "llvm/Support/Debug.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include "llvm/Support/ValueHandle.h"
43 #include "llvm/Support/FormattedStream.h"
44 #include "llvm/Support/Timer.h"
45 #include "llvm/Support/Path.h"
48 static cl::opt<bool> PrintDbgScope("print-dbgscope", cl::Hidden,
49 cl::desc("Print DbgScope information for each machine instruction"));
51 static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
53 cl::desc("Disable debug info printing"));
55 static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
56 cl::desc("Make an absence of debug location information explicit."),
60 const char *DWARFGroupName = "DWARF Emission";
61 const char *DbgTimerName = "DWARF Debug Writer";
62 } // end anonymous namespace
64 //===----------------------------------------------------------------------===//
66 /// Configuration values for initial hash set sizes (log2).
68 static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
72 DIType DbgVariable::getType() const {
73 DIType Ty = Var.getType();
74 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
76 if (Var.isBlockByrefVariable()) {
77 /* Byref variables, in Blocks, are declared by the programmer as
78 "SomeType VarName;", but the compiler creates a
79 __Block_byref_x_VarName struct, and gives the variable VarName
80 either the struct, or a pointer to the struct, as its type. This
81 is necessary for various behind-the-scenes things the compiler
82 needs to do with by-reference variables in blocks.
84 However, as far as the original *programmer* is concerned, the
85 variable should still have type 'SomeType', as originally declared.
87 The following function dives into the __Block_byref_x_VarName
88 struct to find the original type of the variable. This will be
89 passed back to the code generating the type for the Debug
90 Information Entry for the variable 'VarName'. 'VarName' will then
91 have the original type 'SomeType' in its debug information.
93 The original type 'SomeType' will be the type of the field named
94 'VarName' inside the __Block_byref_x_VarName struct.
96 NOTE: In order for this to not completely fail on the debugger
97 side, the Debug Information Entry for the variable VarName needs to
98 have a DW_AT_location that tells the debugger how to unwind through
99 the pointers and __Block_byref_x_VarName struct to find the actual
100 value of the variable. The function addBlockByrefType does this. */
102 unsigned tag = Ty.getTag();
104 if (tag == dwarf::DW_TAG_pointer_type) {
105 DIDerivedType DTy = DIDerivedType(Ty);
106 subType = DTy.getTypeDerivedFrom();
109 DICompositeType blockStruct = DICompositeType(subType);
110 DIArray Elements = blockStruct.getTypeArray();
112 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
113 DIDescriptor Element = Elements.getElement(i);
114 DIDerivedType DT = DIDerivedType(Element);
115 if (getName() == DT.getName())
116 return (DT.getTypeDerivedFrom());
123 //===----------------------------------------------------------------------===//
124 /// DbgRange - This is used to track range of instructions with identical
125 /// debug info scope.
127 typedef std::pair<const MachineInstr *, const MachineInstr *> DbgRange;
129 //===----------------------------------------------------------------------===//
130 /// DbgScope - This class is used to track scope information.
133 DbgScope *Parent; // Parent to this scope.
134 DIDescriptor Desc; // Debug info descriptor for scope.
135 // Location at which this scope is inlined.
136 AssertingVH<const MDNode> InlinedAtLocation;
137 bool AbstractScope; // Abstract Scope
138 const MachineInstr *LastInsn; // Last instruction of this scope.
139 const MachineInstr *FirstInsn; // First instruction of this scope.
140 unsigned DFSIn, DFSOut;
141 // Scopes defined in scope. Contents not owned.
142 SmallVector<DbgScope *, 4> Scopes;
143 // Variables declared in scope. Contents owned.
144 SmallVector<DbgVariable *, 8> Variables;
145 SmallVector<DbgRange, 4> Ranges;
146 // Private state for dump()
147 mutable unsigned IndentLevel;
149 DbgScope(DbgScope *P, DIDescriptor D, const MDNode *I = 0)
150 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
151 LastInsn(0), FirstInsn(0),
152 DFSIn(0), DFSOut(0), IndentLevel(0) {}
156 DbgScope *getParent() const { return Parent; }
157 void setParent(DbgScope *P) { Parent = P; }
158 DIDescriptor getDesc() const { return Desc; }
159 const MDNode *getInlinedAt() const { return InlinedAtLocation; }
160 const MDNode *getScopeNode() const { return Desc; }
161 const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
162 const SmallVector<DbgVariable *, 8> &getDbgVariables() { return Variables; }
163 const SmallVector<DbgRange, 4> &getRanges() { return Ranges; }
165 /// openInsnRange - This scope covers instruction range starting from MI.
166 void openInsnRange(const MachineInstr *MI) {
171 Parent->openInsnRange(MI);
174 /// extendInsnRange - Extend the current instruction range covered by
176 void extendInsnRange(const MachineInstr *MI) {
177 assert (FirstInsn && "MI Range is not open!");
180 Parent->extendInsnRange(MI);
183 /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected
184 /// until now. This is used when a new scope is encountered while walking
185 /// machine instructions.
186 void closeInsnRange(DbgScope *NewScope = NULL) {
187 assert (LastInsn && "Last insn missing!");
188 Ranges.push_back(DbgRange(FirstInsn, LastInsn));
191 // If Parent dominates NewScope then do not close Parent's instruction
193 if (Parent && (!NewScope || !Parent->dominates(NewScope)))
194 Parent->closeInsnRange(NewScope);
197 void setAbstractScope() { AbstractScope = true; }
198 bool isAbstractScope() const { return AbstractScope; }
200 // Depth First Search support to walk and mainpluate DbgScope hierarchy.
201 unsigned getDFSOut() const { return DFSOut; }
202 void setDFSOut(unsigned O) { DFSOut = O; }
203 unsigned getDFSIn() const { return DFSIn; }
204 void setDFSIn(unsigned I) { DFSIn = I; }
205 bool dominates(const DbgScope *S) {
208 if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut())
213 /// addScope - Add a scope to the scope.
215 void addScope(DbgScope *S) { Scopes.push_back(S); }
217 /// addVariable - Add a variable to the scope.
219 void addVariable(DbgVariable *V) { Variables.push_back(V); }
226 } // end llvm namespace
229 void DbgScope::dump() const {
230 raw_ostream &err = dbgs();
231 err.indent(IndentLevel);
232 const MDNode *N = Desc;
235 err << "Abstract Scope\n";
239 err << "Children ...\n";
240 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
241 if (Scopes[i] != this)
248 DbgScope::~DbgScope() {
249 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
253 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
254 : Asm(A), MMI(Asm->MMI), FirstCU(0),
255 AbbreviationsSet(InitAbbreviationsSetSize),
256 CurrentFnDbgScope(0), PrevLabel(NULL) {
257 NextStringPoolNumber = 0;
259 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
260 DwarfStrSectionSym = TextSectionSym = 0;
261 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
262 FunctionBeginSym = FunctionEndSym = 0;
264 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
268 DwarfDebug::~DwarfDebug() {
271 MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
272 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
273 if (Entry.first) return Entry.first;
275 Entry.second = NextStringPoolNumber++;
276 return Entry.first = Asm->GetTempSymbol("string", Entry.second);
280 /// assignAbbrevNumber - Define a unique number for the abbreviation.
282 void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
283 // Profile the node so that we can make it unique.
287 // Check the set for priors.
288 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
290 // If it's newly added.
291 if (InSet == &Abbrev) {
292 // Add to abbreviation list.
293 Abbreviations.push_back(&Abbrev);
295 // Assign the vector position + 1 as its number.
296 Abbrev.setNumber(Abbreviations.size());
298 // Assign existing abbreviation number.
299 Abbrev.setNumber(InSet->getNumber());
303 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm
304 /// printer to not emit usual symbol prefix before the symbol name is used then
305 /// return linkage name after skipping this special LLVM prefix.
306 static StringRef getRealLinkageName(StringRef LinkageName) {
308 if (LinkageName.startswith(StringRef(&One, 1)))
309 return LinkageName.substr(1);
313 /// createSubprogramDIE - Create new DIE using SP.
314 DIE *DwarfDebug::createSubprogramDIE(DISubprogram SP) {
315 CompileUnit *SPCU = getCompileUnit(SP);
316 DIE *SPDie = SPCU->getDIE(SP);
320 SPDie = new DIE(dwarf::DW_TAG_subprogram);
322 // DW_TAG_inlined_subroutine may refer to this DIE.
323 SPCU->insertDIE(SP, SPDie);
325 // Add to context owner.
326 SPCU->addToContextOwner(SPDie, SP.getContext());
328 // Add function template parameters.
329 SPCU->addTemplateParams(*SPDie, SP.getTemplateParams());
331 StringRef LinkageName = SP.getLinkageName();
332 if (!LinkageName.empty())
333 SPCU->addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
334 getRealLinkageName(LinkageName));
336 // If this DIE is going to refer declaration info using AT_specification
337 // then there is no need to add other attributes.
338 if (SP.getFunctionDeclaration().isSubprogram())
341 // Constructors and operators for anonymous aggregates do not have names.
342 if (!SP.getName().empty())
343 SPCU->addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
346 SPCU->addSourceLine(SPDie, SP);
348 if (SP.isPrototyped())
349 SPCU->addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
352 DICompositeType SPTy = SP.getType();
353 DIArray Args = SPTy.getTypeArray();
354 unsigned SPTag = SPTy.getTag();
356 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
357 SPCU->addType(SPDie, SPTy);
359 SPCU->addType(SPDie, DIType(Args.getElement(0)));
361 unsigned VK = SP.getVirtuality();
363 SPCU->addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
364 DIEBlock *Block = SPCU->getDIEBlock();
365 SPCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
366 SPCU->addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
367 SPCU->addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
368 ContainingTypeMap.insert(std::make_pair(SPDie,
369 SP.getContainingType()));
372 if (!SP.isDefinition()) {
373 SPCU->addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
375 // Add arguments. Do not add arguments for subprogram definition. They will
376 // be handled while processing variables.
377 DICompositeType SPTy = SP.getType();
378 DIArray Args = SPTy.getTypeArray();
379 unsigned SPTag = SPTy.getTag();
381 if (SPTag == dwarf::DW_TAG_subroutine_type)
382 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
383 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
384 DIType ATy = DIType(DIType(Args.getElement(i)));
385 SPCU->addType(Arg, ATy);
386 if (ATy.isArtificial())
387 SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
388 SPDie->addChild(Arg);
392 if (SP.isArtificial())
393 SPCU->addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
395 if (!SP.isLocalToUnit())
396 SPCU->addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
398 if (SP.isOptimized())
399 SPCU->addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
401 if (unsigned isa = Asm->getISAEncoding()) {
402 SPCU->addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
408 DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
409 assert(N && "Invalid Scope encoding!");
411 DbgScope *AScope = AbstractScopes.lookup(N);
415 DbgScope *Parent = NULL;
417 DIDescriptor Scope(N);
418 if (Scope.isLexicalBlock()) {
419 DILexicalBlock DB(N);
420 DIDescriptor ParentDesc = DB.getContext();
421 Parent = getOrCreateAbstractScope(ParentDesc);
424 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
427 Parent->addScope(AScope);
428 AScope->setAbstractScope();
429 AbstractScopes[N] = AScope;
430 if (DIDescriptor(N).isSubprogram())
431 AbstractScopesList.push_back(AScope);
435 /// isSubprogramContext - Return true if Context is either a subprogram
436 /// or another context nested inside a subprogram.
437 static bool isSubprogramContext(const MDNode *Context) {
440 DIDescriptor D(Context);
441 if (D.isSubprogram())
444 return isSubprogramContext(DIType(Context).getContext());
448 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and
449 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
450 /// If there are global variables in this scope then create and insert
451 /// DIEs for these variables.
452 DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
453 CompileUnit *SPCU = getCompileUnit(SPNode);
454 DIE *SPDie = SPCU->getDIE(SPNode);
456 assert(SPDie && "Unable to find subprogram DIE!");
457 DISubprogram SP(SPNode);
459 DISubprogram SPDecl = SP.getFunctionDeclaration();
460 if (SPDecl.isSubprogram())
461 // Refer function declaration directly.
462 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
463 createSubprogramDIE(SPDecl));
465 // There is not any need to generate specification DIE for a function
466 // defined at compile unit level. If a function is defined inside another
467 // function then gdb prefers the definition at top level and but does not
468 // expect specification DIE in parent function. So avoid creating
469 // specification DIE for a function defined inside a function.
470 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
471 !SP.getContext().isFile() &&
472 !isSubprogramContext(SP.getContext())) {
473 SPCU-> addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
476 DICompositeType SPTy = SP.getType();
477 DIArray Args = SPTy.getTypeArray();
478 unsigned SPTag = SPTy.getTag();
479 if (SPTag == dwarf::DW_TAG_subroutine_type)
480 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
481 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
482 DIType ATy = DIType(DIType(Args.getElement(i)));
483 SPCU->addType(Arg, ATy);
484 if (ATy.isArtificial())
485 SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
486 SPDie->addChild(Arg);
488 DIE *SPDeclDie = SPDie;
489 SPDie = new DIE(dwarf::DW_TAG_subprogram);
490 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
495 // Pick up abstract subprogram DIE.
496 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
497 SPDie = new DIE(dwarf::DW_TAG_subprogram);
498 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
499 dwarf::DW_FORM_ref4, AbsSPDIE);
503 SPCU->addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
504 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
505 SPCU->addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
506 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
507 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
508 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
509 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
514 /// constructLexicalScope - Construct new DW_TAG_lexical_block
515 /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
516 DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
518 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
519 if (Scope->isAbstractScope())
522 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
526 CompileUnit *TheCU = getCompileUnit(Scope->getScopeNode());
527 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
528 if (Ranges.size() > 1) {
529 // .debug_range section has not been laid out yet. Emit offset in
530 // .debug_range as a uint, size 4, for now. emitDIE will handle
531 // DW_AT_ranges appropriately.
532 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
533 DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
534 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
535 RE = Ranges.end(); RI != RE; ++RI) {
536 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
537 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
539 DebugRangeSymbols.push_back(NULL);
540 DebugRangeSymbols.push_back(NULL);
544 const MCSymbol *Start = getLabelBeforeInsn(RI->first);
545 const MCSymbol *End = getLabelAfterInsn(RI->second);
547 if (End == 0) return 0;
549 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
550 assert(End->isDefined() && "Invalid end label for an inlined scope!");
552 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
553 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
558 /// constructInlinedScopeDIE - This scope represents inlined body of
559 /// a function. Construct DIE to represent this concrete inlined copy
561 DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
563 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
564 assert (Ranges.empty() == false
565 && "DbgScope does not have instruction markers!");
567 // FIXME : .debug_inlined section specification does not clearly state how
568 // to emit inlined scope that is split into multiple instruction ranges.
569 // For now, use first instruction range and emit low_pc/high_pc pair and
570 // corresponding .debug_inlined section entry for this pair.
571 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
572 const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
573 const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
575 if (StartLabel == 0 || EndLabel == 0) {
576 assert (0 && "Unexpected Start and End labels for a inlined scope!");
579 assert(StartLabel->isDefined() &&
580 "Invalid starting label for an inlined scope!");
581 assert(EndLabel->isDefined() &&
582 "Invalid end label for an inlined scope!");
584 if (!Scope->getScopeNode())
586 DIScope DS(Scope->getScopeNode());
587 DISubprogram InlinedSP = getDISubprogram(DS);
588 CompileUnit *TheCU = getCompileUnit(InlinedSP);
589 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
591 DEBUG(dbgs() << "Unable to find original DIE for inlined subprogram.");
594 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
595 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
596 dwarf::DW_FORM_ref4, OriginDIE);
598 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
599 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
601 InlinedSubprogramDIEs.insert(OriginDIE);
603 // Track the start label for this inlined function.
604 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
605 I = InlineInfo.find(InlinedSP);
607 if (I == InlineInfo.end()) {
608 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
610 InlinedSPNodes.push_back(InlinedSP);
612 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
614 DILocation DL(Scope->getInlinedAt());
615 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
616 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
622 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
623 DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
624 StringRef Name = DV->getName();
628 // Translate tag to proper Dwarf tag. The result variable is dropped for
631 switch (DV->getTag()) {
632 case dwarf::DW_TAG_return_variable:
634 case dwarf::DW_TAG_arg_variable:
635 Tag = dwarf::DW_TAG_formal_parameter;
637 case dwarf::DW_TAG_auto_variable: // fall thru
639 Tag = dwarf::DW_TAG_variable;
643 // Define variable debug information entry.
644 DIE *VariableDie = new DIE(Tag);
645 CompileUnit *VariableCU = getCompileUnit(DV->getVariable());
647 DenseMap<const DbgVariable *, const DbgVariable *>::iterator
648 V2AVI = VarToAbstractVarMap.find(DV);
649 if (V2AVI != VarToAbstractVarMap.end())
650 AbsDIE = V2AVI->second->getDIE();
653 VariableCU->addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
654 dwarf::DW_FORM_ref4, AbsDIE);
656 VariableCU->addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
658 VariableCU->addSourceLine(VariableDie, DV->getVariable());
660 // Add variable type.
661 VariableCU->addType(VariableDie, DV->getType());
664 if (Tag == dwarf::DW_TAG_formal_parameter && DV->getType().isArtificial())
665 VariableCU->addUInt(VariableDie, dwarf::DW_AT_artificial,
666 dwarf::DW_FORM_flag, 1);
667 else if (DIVariable(DV->getVariable()).isArtificial())
668 VariableCU->addUInt(VariableDie, dwarf::DW_AT_artificial,
669 dwarf::DW_FORM_flag, 1);
671 if (Scope->isAbstractScope()) {
672 DV->setDIE(VariableDie);
676 // Add variable address.
678 unsigned Offset = DV->getDotDebugLocOffset();
680 VariableCU->addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
681 Asm->GetTempSymbol("debug_loc", Offset));
682 DV->setDIE(VariableDie);
683 UseDotDebugLocEntry.insert(VariableDie);
687 // Check if variable is described by a DBG_VALUE instruction.
688 DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
689 DbgVariableToDbgInstMap.find(DV);
690 if (DVI != DbgVariableToDbgInstMap.end()) {
691 const MachineInstr *DVInsn = DVI->second;
692 bool updated = false;
693 // FIXME : Handle getNumOperands != 3
694 if (DVInsn->getNumOperands() == 3) {
695 if (DVInsn->getOperand(0).isReg()) {
696 const MachineOperand RegOp = DVInsn->getOperand(0);
697 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
698 if (DVInsn->getOperand(1).isImm() &&
699 TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
700 unsigned FrameReg = 0;
701 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
703 TFI->getFrameIndexReference(*Asm->MF,
704 DVInsn->getOperand(1).getImm(),
706 MachineLocation Location(FrameReg, Offset);
707 VariableCU->addVariableAddress(DV, VariableDie, Location);
709 } else if (RegOp.getReg())
710 VariableCU->addVariableAddress(DV, VariableDie,
711 MachineLocation(RegOp.getReg()));
714 else if (DVInsn->getOperand(0).isImm())
716 VariableCU->addConstantValue(VariableDie, DVInsn->getOperand(0),
718 else if (DVInsn->getOperand(0).isFPImm())
720 VariableCU->addConstantFPValue(VariableDie, DVInsn->getOperand(0));
722 VariableCU->addVariableAddress(DV, VariableDie,
723 Asm->getDebugValueLocation(DVInsn));
727 // If variableDie is not updated then DBG_VALUE instruction does not
728 // have valid variable info.
732 DV->setDIE(VariableDie);
736 // .. else use frame index, if available.
738 if (findVariableFrameIndex(DV, &FI)) {
739 unsigned FrameReg = 0;
740 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
742 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
743 MachineLocation Location(FrameReg, Offset);
744 VariableCU->addVariableAddress(DV, VariableDie, Location);
747 DV->setDIE(VariableDie);
752 /// constructScopeDIE - Construct a DIE for this scope.
753 DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
754 if (!Scope || !Scope->getScopeNode())
757 SmallVector <DIE *, 8> Children;
759 // Collect arguments for current function.
760 if (Scope == CurrentFnDbgScope)
761 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
762 if (DbgVariable *ArgDV = CurrentFnArguments[i])
763 if (DIE *Arg = constructVariableDIE(ArgDV, Scope))
764 Children.push_back(Arg);
766 // Collect lexical scope childrens first.
767 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
768 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
769 if (DIE *Variable = constructVariableDIE(Variables[i], Scope))
770 Children.push_back(Variable);
771 const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
772 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
773 if (DIE *Nested = constructScopeDIE(Scopes[j]))
774 Children.push_back(Nested);
775 DIScope DS(Scope->getScopeNode());
776 DIE *ScopeDIE = NULL;
777 if (Scope->getInlinedAt())
778 ScopeDIE = constructInlinedScopeDIE(Scope);
779 else if (DS.isSubprogram()) {
780 ProcessedSPNodes.insert(DS);
781 if (Scope->isAbstractScope()) {
782 ScopeDIE = getCompileUnit(DS)->getDIE(DS);
783 // Note down abstract DIE.
785 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
788 ScopeDIE = updateSubprogramScopeDIE(DS);
791 // There is no need to emit empty lexical block DIE.
792 if (Children.empty())
794 ScopeDIE = constructLexicalScopeDIE(Scope);
797 if (!ScopeDIE) return NULL;
800 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
801 E = Children.end(); I != E; ++I)
802 ScopeDIE->addChild(*I);
804 if (DS.isSubprogram())
805 getCompileUnit(DS)->addPubTypes(DISubprogram(DS));
810 /// GetOrCreateSourceID - Look up the source id with the given directory and
811 /// source file names. If none currently exists, create a new id and insert it
812 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
815 unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName,
817 // If FE did not provide a file name, then assume stdin.
818 if (FileName.empty())
819 return GetOrCreateSourceID("<stdin>", StringRef());
821 // MCStream expects full path name as filename.
822 if (!DirName.empty() && !FileName.startswith("/")) {
823 std::string FullPathName(DirName.data());
824 if (!DirName.endswith("/"))
826 FullPathName += FileName.data();
827 // Here FullPathName will be copied into StringMap by GetOrCreateSourceID.
828 return GetOrCreateSourceID(StringRef(FullPathName), StringRef());
831 StringMapEntry<unsigned> &Entry = SourceIdMap.GetOrCreateValue(FileName);
832 if (Entry.getValue())
833 return Entry.getValue();
835 unsigned SrcId = SourceIdMap.size();
836 Entry.setValue(SrcId);
838 // Print out a .file directive to specify files for .loc directives.
839 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, Entry.getKey());
844 /// constructCompileUnit - Create new CompileUnit for the given
845 /// metadata node with tag DW_TAG_compile_unit.
846 void DwarfDebug::constructCompileUnit(const MDNode *N) {
847 DICompileUnit DIUnit(N);
848 StringRef FN = DIUnit.getFilename();
849 StringRef Dir = DIUnit.getDirectory();
850 unsigned ID = GetOrCreateSourceID(FN, Dir);
852 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
853 CompileUnit *NewCU = new CompileUnit(ID, Die, Asm, this);
854 NewCU->addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
855 DIUnit.getProducer());
856 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
857 DIUnit.getLanguage());
858 NewCU->addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
859 // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
860 // simplifies debug range entries.
861 NewCU->addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
862 // DW_AT_stmt_list is a offset of line number information for this
863 // compile unit in debug_line section.
864 if(Asm->MAI->doesDwarfRequireRelocationForSectionOffset())
865 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
866 Asm->GetTempSymbol("section_line"));
868 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
871 NewCU->addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
872 if (DIUnit.isOptimized())
873 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
875 StringRef Flags = DIUnit.getFlags();
877 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
879 unsigned RVer = DIUnit.getRunTimeVersion();
881 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
882 dwarf::DW_FORM_data1, RVer);
886 CUMap.insert(std::make_pair(N, NewCU));
889 /// getCompielUnit - Get CompileUnit DIE.
890 CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
891 assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
893 const MDNode *CUNode = NULL;
894 if (D.isCompileUnit())
896 else if (D.isSubprogram())
897 CUNode = DISubprogram(N).getCompileUnit();
899 CUNode = DIType(N).getCompileUnit();
900 else if (D.isGlobalVariable())
901 CUNode = DIGlobalVariable(N).getCompileUnit();
902 else if (D.isVariable())
903 CUNode = DIVariable(N).getCompileUnit();
904 else if (D.isNameSpace())
905 CUNode = DINameSpace(N).getCompileUnit();
907 CUNode = DIFile(N).getCompileUnit();
911 DenseMap<const MDNode *, CompileUnit *>::const_iterator I
912 = CUMap.find(CUNode);
913 if (I == CUMap.end())
918 /// isUnsignedDIType - Return true if type encoding is unsigned.
919 static bool isUnsignedDIType(DIType Ty) {
920 DIDerivedType DTy(Ty);
922 return isUnsignedDIType(DTy.getTypeDerivedFrom());
926 unsigned Encoding = BTy.getEncoding();
927 if (Encoding == dwarf::DW_ATE_unsigned ||
928 Encoding == dwarf::DW_ATE_unsigned_char)
934 // Return const exprssion if value is a GEP to access merged global
936 // i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
937 static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
938 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
939 if (!CE || CE->getNumOperands() != 3 ||
940 CE->getOpcode() != Instruction::GetElementPtr)
943 // First operand points to a global value.
944 if (!isa<GlobalValue>(CE->getOperand(0)))
947 // Second operand is zero.
948 const ConstantInt *CI =
949 dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
950 if (!CI || !CI->isZero())
953 // Third operand is offset.
954 if (!isa<ConstantInt>(CE->getOperand(2)))
960 /// constructGlobalVariableDIE - Construct global variable DIE.
961 void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
962 DIGlobalVariable GV(N);
964 // If debug information is malformed then ignore it.
965 if (GV.Verify() == false)
968 // Check for pre-existence.
969 CompileUnit *TheCU = getCompileUnit(N);
970 if (TheCU->getDIE(GV))
973 DIType GTy = GV.getType();
974 DIE *VariableDIE = new DIE(GV.getTag());
976 bool isGlobalVariable = GV.getGlobal() != NULL;
979 TheCU->addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
980 GV.getDisplayName());
981 StringRef LinkageName = GV.getLinkageName();
982 if (!LinkageName.empty() && isGlobalVariable)
983 TheCU->addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
984 dwarf::DW_FORM_string,
985 getRealLinkageName(LinkageName));
987 TheCU->addType(VariableDIE, GTy);
988 if (GTy.isCompositeType() && !GTy.getName().empty()
989 && !GTy.isForwardDecl()) {
990 DIEEntry *Entry = TheCU->getDIEEntry(GTy);
991 assert(Entry && "Missing global type!");
992 TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
995 if (!GV.isLocalToUnit()) {
996 TheCU->addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
998 TheCU->addGlobal(GV.getName(), VariableDIE);
1000 // Add line number info.
1001 TheCU->addSourceLine(VariableDIE, GV);
1003 TheCU->insertDIE(N, VariableDIE);
1004 // Add to context owner.
1005 DIDescriptor GVContext = GV.getContext();
1006 TheCU->addToContextOwner(VariableDIE, GVContext);
1008 if (isGlobalVariable) {
1009 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1010 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1011 TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata,
1012 Asm->Mang->getSymbol(GV.getGlobal()));
1013 // Do not create specification DIE if context is either compile unit
1015 if (GV.isDefinition() && !GVContext.isCompileUnit() &&
1016 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1017 // Create specification DIE.
1018 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1019 TheCU->addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1020 dwarf::DW_FORM_ref4, VariableDIE);
1021 TheCU->addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1022 TheCU->addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1023 TheCU->addDie(VariableSpecDIE);
1025 TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1027 } else if (ConstantInt *CI =
1028 dyn_cast_or_null<ConstantInt>(GV.getConstant()))
1029 TheCU->addConstantValue(VariableDIE, CI, isUnsignedDIType(GTy));
1030 else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
1031 // GV is a merged global.
1032 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1033 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1034 TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata,
1035 Asm->Mang->getSymbol(cast<GlobalValue>(CE->getOperand(0))));
1036 ConstantInt *CII = cast<ConstantInt>(CE->getOperand(2));
1037 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1038 TheCU->addUInt(Block, 0, dwarf::DW_FORM_udata, CII->getZExtValue());
1039 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1040 TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1046 /// construct SubprogramDIE - Construct subprogram DIE.
1047 void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
1050 // Check for pre-existence.
1051 CompileUnit *TheCU = getCompileUnit(N);
1052 if (TheCU->getDIE(N))
1055 if (!SP.isDefinition())
1056 // This is a method declaration which will be handled while constructing
1060 DIE *SubprogramDie = createSubprogramDIE(SP);
1063 TheCU->insertDIE(N, SubprogramDie);
1065 // Add to context owner.
1066 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
1068 // Expose as global.
1069 TheCU->addGlobal(SP.getName(), SubprogramDie);
1074 /// beginModule - Emit all Dwarf sections that should come prior to the
1075 /// content. Create global DIEs and emit initial debug info sections.
1076 /// This is inovked by the target AsmPrinter.
1077 void DwarfDebug::beginModule(Module *M) {
1078 if (DisableDebugInfoPrinting)
1081 // If module has named metadata anchors then use them, otherwise scan the module
1082 // using debug info finder to collect debug info.
1083 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
1086 NamedMDNode *GV_Nodes = M->getNamedMetadata("llvm.dbg.gv");
1087 NamedMDNode *SP_Nodes = M->getNamedMetadata("llvm.dbg.sp");
1088 if (!GV_Nodes && !SP_Nodes)
1089 // If there are not any global variables or any functions then
1090 // there is not any debug info in this module.
1093 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i)
1094 constructCompileUnit(CU_Nodes->getOperand(i));
1097 for (unsigned i = 0, e = GV_Nodes->getNumOperands(); i != e; ++i)
1098 constructGlobalVariableDIE(GV_Nodes->getOperand(i));
1101 for (unsigned i = 0, e = SP_Nodes->getNumOperands(); i != e; ++i)
1102 constructSubprogramDIE(SP_Nodes->getOperand(i));
1106 DebugInfoFinder DbgFinder;
1107 DbgFinder.processModule(*M);
1109 bool HasDebugInfo = false;
1110 // Scan all the compile-units to see if there are any marked as the main unit.
1111 // if not, we do not generate debug info.
1112 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1113 E = DbgFinder.compile_unit_end(); I != E; ++I) {
1114 if (DICompileUnit(*I).isMain()) {
1115 HasDebugInfo = true;
1119 if (!HasDebugInfo) return;
1121 // Create all the compile unit DIEs.
1122 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1123 E = DbgFinder.compile_unit_end(); I != E; ++I)
1124 constructCompileUnit(*I);
1126 // Create DIEs for each global variable.
1127 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1128 E = DbgFinder.global_variable_end(); I != E; ++I)
1129 constructGlobalVariableDIE(*I);
1131 // Create DIEs for each subprogram.
1132 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1133 E = DbgFinder.subprogram_end(); I != E; ++I)
1134 constructSubprogramDIE(*I);
1137 // Tell MMI that we have debug info.
1138 MMI->setDebugInfoAvailability(true);
1140 // Emit initial sections.
1141 EmitSectionLabels();
1143 //getOrCreateTypeDIE
1144 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
1145 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1146 DIType Ty(NMD->getOperand(i));
1147 getCompileUnit(Ty)->getOrCreateTypeDIE(Ty);
1150 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
1151 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1152 DIType Ty(NMD->getOperand(i));
1153 getCompileUnit(Ty)->getOrCreateTypeDIE(Ty);
1156 // Prime section data.
1157 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1160 /// endModule - Emit all Dwarf sections that should come after the content.
1162 void DwarfDebug::endModule() {
1163 if (!FirstCU) return;
1164 const Module *M = MMI->getModule();
1165 DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
1166 if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
1167 for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
1168 if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
1169 DISubprogram SP(AllSPs->getOperand(SI));
1170 if (!SP.Verify()) continue;
1172 // Collect info for variables that were optimized out.
1173 if (!SP.isDefinition()) continue;
1174 StringRef FName = SP.getLinkageName();
1176 FName = SP.getName();
1177 NamedMDNode *NMD = getFnSpecificMDNode(*(MMI->getModule()), FName);
1179 unsigned E = NMD->getNumOperands();
1181 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
1182 DeadFnScopeMap[SP] = Scope;
1183 for (unsigned I = 0; I != E; ++I) {
1184 DIVariable DV(NMD->getOperand(I));
1185 if (!DV.Verify()) continue;
1186 Scope->addVariable(new DbgVariable(DV));
1189 // Construct subprogram DIE and add variables DIEs.
1190 constructSubprogramDIE(SP);
1191 DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
1192 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
1193 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1194 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1196 ScopeDIE->addChild(VariableDIE);
1201 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1202 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1203 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1205 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
1208 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1209 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1210 DIE *SPDie = CI->first;
1211 const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1213 DIE *NDie = getCompileUnit(N)->getDIE(N);
1214 if (!NDie) continue;
1215 getCompileUnit(N)->addDIEEntry(SPDie, dwarf::DW_AT_containing_type,
1216 dwarf::DW_FORM_ref4, NDie);
1219 // Standard sections final addresses.
1220 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
1221 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
1222 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
1223 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
1225 // End text sections.
1226 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
1227 Asm->OutStreamer.SwitchSection(SectionMap[i]);
1228 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
1231 // Compute DIE offsets and sizes.
1232 computeSizeAndOffsets();
1234 // Emit all the DIEs into a debug info section
1237 // Corresponding abbreviations into a abbrev section.
1238 emitAbbreviations();
1240 // Emit info into a debug pubnames section.
1241 emitDebugPubNames();
1243 // Emit info into a debug pubtypes section.
1244 emitDebugPubTypes();
1246 // Emit info into a debug loc section.
1249 // Emit info into a debug aranges section.
1252 // Emit info into a debug ranges section.
1255 // Emit info into a debug macinfo section.
1258 // Emit inline info.
1259 emitDebugInlineInfo();
1261 // Emit info into a debug str section.
1265 DeleteContainerSeconds(DeadFnScopeMap);
1266 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1267 E = CUMap.end(); I != E; ++I)
1269 FirstCU = NULL; // Reset for the next Module, if any.
1272 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
1273 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1274 DebugLoc ScopeLoc) {
1276 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
1278 return AbsDbgVariable;
1280 LLVMContext &Ctx = Var->getContext();
1281 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
1285 AbsDbgVariable = new DbgVariable(Var);
1286 Scope->addVariable(AbsDbgVariable);
1287 AbstractVariables[Var] = AbsDbgVariable;
1288 return AbsDbgVariable;
1291 /// addCurrentFnArgument - If Var is an current function argument that add
1292 /// it in CurrentFnArguments list.
1293 bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
1294 DbgVariable *Var, DbgScope *Scope) {
1295 if (Scope != CurrentFnDbgScope)
1297 DIVariable DV = Var->getVariable();
1298 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1300 unsigned ArgNo = DV.getArgNumber();
1304 size_t Size = CurrentFnArguments.size();
1306 CurrentFnArguments.resize(MF->getFunction()->arg_size());
1307 // llvm::Function argument size is not good indicator of how many
1308 // arguments does the function have at source level.
1310 CurrentFnArguments.resize(ArgNo * 2);
1311 CurrentFnArguments[ArgNo - 1] = Var;
1315 /// collectVariableInfoFromMMITable - Collect variable information from
1316 /// side table maintained by MMI.
1318 DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
1319 SmallPtrSet<const MDNode *, 16> &Processed) {
1320 const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
1321 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1322 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1323 VE = VMap.end(); VI != VE; ++VI) {
1324 const MDNode *Var = VI->first;
1326 Processed.insert(Var);
1328 const std::pair<unsigned, DebugLoc> &VP = VI->second;
1330 DbgScope *Scope = 0;
1331 if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
1332 Scope = ConcreteScopes.lookup(IA);
1334 Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
1336 // If variable scope is not found then skip this variable.
1340 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
1341 DbgVariable *RegVar = new DbgVariable(DV);
1342 recordVariableFrameIndex(RegVar, VP.first);
1343 if (!addCurrentFnArgument(MF, RegVar, Scope))
1344 Scope->addVariable(RegVar);
1345 if (AbsDbgVariable) {
1346 recordVariableFrameIndex(AbsDbgVariable, VP.first);
1347 VarToAbstractVarMap[RegVar] = AbsDbgVariable;
1352 /// isDbgValueInDefinedReg - Return true if debug value, encoded by
1353 /// DBG_VALUE instruction, is in a defined reg.
1354 static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
1355 assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
1356 return MI->getNumOperands() == 3 &&
1357 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1358 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
1361 /// collectVariableInfo - Populate DbgScope entries with variables' info.
1363 DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1364 SmallPtrSet<const MDNode *, 16> &Processed) {
1366 /// collection info from MMI table.
1367 collectVariableInfoFromMMITable(MF, Processed);
1369 for (SmallVectorImpl<const MDNode*>::const_iterator
1370 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1372 const MDNode *Var = *UVI;
1373 if (Processed.count(Var))
1376 // History contains relevant DBG_VALUE instructions for Var and instructions
1378 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1379 if (History.empty())
1381 const MachineInstr *MInsn = History.front();
1384 DbgScope *Scope = NULL;
1385 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1386 DISubprogram(DV.getContext()).describes(MF->getFunction()))
1387 Scope = CurrentFnDbgScope;
1389 Scope = findDbgScope(MInsn);
1390 // If variable scope is not found then skip this variable.
1394 Processed.insert(DV);
1395 assert(MInsn->isDebugValue() && "History must begin with debug value");
1396 DbgVariable *RegVar = new DbgVariable(DV);
1397 if (!addCurrentFnArgument(MF, RegVar, Scope))
1398 Scope->addVariable(RegVar);
1399 if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
1400 DbgVariableToDbgInstMap[AbsVar] = MInsn;
1401 VarToAbstractVarMap[RegVar] = AbsVar;
1404 // Simple ranges that are fully coalesced.
1405 if (History.size() <= 1 || (History.size() == 2 &&
1406 MInsn->isIdenticalTo(History.back()))) {
1407 DbgVariableToDbgInstMap[RegVar] = MInsn;
1411 // handle multiple DBG_VALUE instructions describing one variable.
1412 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
1414 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1415 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1416 const MachineInstr *Begin = *HI;
1417 assert(Begin->isDebugValue() && "Invalid History entry");
1418 MachineLocation MLoc;
1419 if (Begin->getNumOperands() == 3) {
1420 if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm())
1421 MLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
1423 MLoc = Asm->getDebugValueLocation(Begin);
1425 // FIXME: emitDebugLoc only understands registers.
1429 // Compute the range for a register location.
1430 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1431 const MCSymbol *SLabel = 0;
1434 // If Begin is the last instruction in History then its value is valid
1435 // until the end of the function.
1436 SLabel = FunctionEndSym;
1438 const MachineInstr *End = HI[1];
1439 if (End->isDebugValue())
1440 SLabel = getLabelBeforeInsn(End);
1442 // End is a normal instruction clobbering the range.
1443 SLabel = getLabelAfterInsn(End);
1444 assert(SLabel && "Forgot label after clobber instruction");
1449 // The value is valid until the next DBG_VALUE or clobber.
1450 DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc, Var));
1452 DotDebugLocEntries.push_back(DotDebugLocEntry());
1455 // Collect info for variables that were optimized out.
1456 const Function *F = MF->getFunction();
1457 if (NamedMDNode *NMD = getFnSpecificMDNode(*(F->getParent()), F->getName())) {
1458 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1459 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
1460 if (!DV || !Processed.insert(DV))
1462 DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
1464 Scope->addVariable(new DbgVariable(DV));
1469 /// getLabelBeforeInsn - Return Label preceding the instruction.
1470 const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
1471 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1472 assert(Label && "Didn't insert label before instruction");
1476 /// getLabelAfterInsn - Return Label immediately following the instruction.
1477 const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
1478 return LabelsAfterInsn.lookup(MI);
1481 /// beginInstruction - Process beginning of an instruction.
1482 void DwarfDebug::beginInstruction(const MachineInstr *MI) {
1483 // Check if source location changes, but ignore DBG_VALUE locations.
1484 if (!MI->isDebugValue()) {
1485 DebugLoc DL = MI->getDebugLoc();
1486 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
1487 unsigned Flags = DWARF2_FLAG_IS_STMT;
1489 if (DL == PrologEndLoc) {
1490 Flags |= DWARF2_FLAG_PROLOGUE_END;
1491 PrologEndLoc = DebugLoc();
1493 if (!DL.isUnknown()) {
1494 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
1495 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
1497 recordSourceLine(0, 0, 0, 0);
1501 // Insert labels where requested.
1502 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1503 LabelsBeforeInsn.find(MI);
1506 if (I == LabelsBeforeInsn.end())
1509 // Label already assigned.
1514 PrevLabel = MMI->getContext().CreateTempSymbol();
1515 Asm->OutStreamer.EmitLabel(PrevLabel);
1517 I->second = PrevLabel;
1520 /// endInstruction - Process end of an instruction.
1521 void DwarfDebug::endInstruction(const MachineInstr *MI) {
1522 // Don't create a new label after DBG_VALUE instructions.
1523 // They don't generate code.
1524 if (!MI->isDebugValue())
1527 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1528 LabelsAfterInsn.find(MI);
1531 if (I == LabelsAfterInsn.end())
1534 // Label already assigned.
1538 // We need a label after this instruction.
1540 PrevLabel = MMI->getContext().CreateTempSymbol();
1541 Asm->OutStreamer.EmitLabel(PrevLabel);
1543 I->second = PrevLabel;
1546 /// getOrCreateDbgScope - Create DbgScope for the scope.
1547 DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope,
1548 const MDNode *InlinedAt) {
1550 DbgScope *WScope = DbgScopeMap.lookup(Scope);
1553 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
1554 DbgScopeMap.insert(std::make_pair(Scope, WScope));
1555 if (DIDescriptor(Scope).isLexicalBlock()) {
1557 getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
1558 WScope->setParent(Parent);
1559 Parent->addScope(WScope);
1562 if (!WScope->getParent()) {
1563 StringRef SPName = DISubprogram(Scope).getLinkageName();
1564 // We used to check only for a linkage name, but that fails
1565 // since we began omitting the linkage name for private
1566 // functions. The new way is to check for the name in metadata,
1567 // but that's not supported in old .ll test cases. Ergo, we
1569 if (SPName == Asm->MF->getFunction()->getName() ||
1570 DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
1571 CurrentFnDbgScope = WScope;
1577 getOrCreateAbstractScope(Scope);
1578 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
1582 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
1583 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
1584 DILocation DL(InlinedAt);
1586 getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
1587 WScope->setParent(Parent);
1588 Parent->addScope(WScope);
1590 ConcreteScopes[InlinedAt] = WScope;
1595 /// hasValidLocation - Return true if debug location entry attached with
1596 /// machine instruction encodes valid location info.
1597 static bool hasValidLocation(LLVMContext &Ctx,
1598 const MachineInstr *MInsn,
1599 const MDNode *&Scope, const MDNode *&InlinedAt) {
1600 DebugLoc DL = MInsn->getDebugLoc();
1601 if (DL.isUnknown()) return false;
1603 const MDNode *S = DL.getScope(Ctx);
1605 // There is no need to create another DIE for compile unit. For all
1606 // other scopes, create one DbgScope now. This will be translated
1607 // into a scope DIE at the end.
1608 if (DIScope(S).isCompileUnit()) return false;
1611 InlinedAt = DL.getInlinedAt(Ctx);
1615 /// calculateDominanceGraph - Calculate dominance graph for DbgScope
1617 static void calculateDominanceGraph(DbgScope *Scope) {
1618 assert (Scope && "Unable to calculate scop edominance graph!");
1619 SmallVector<DbgScope *, 4> WorkStack;
1620 WorkStack.push_back(Scope);
1621 unsigned Counter = 0;
1622 while (!WorkStack.empty()) {
1623 DbgScope *WS = WorkStack.back();
1624 const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
1625 bool visitedChildren = false;
1626 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
1627 SE = Children.end(); SI != SE; ++SI) {
1628 DbgScope *ChildScope = *SI;
1629 if (!ChildScope->getDFSOut()) {
1630 WorkStack.push_back(ChildScope);
1631 visitedChildren = true;
1632 ChildScope->setDFSIn(++Counter);
1636 if (!visitedChildren) {
1637 WorkStack.pop_back();
1638 WS->setDFSOut(++Counter);
1643 /// printDbgScopeInfo - Print DbgScope info for each machine instruction.
1645 void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
1646 DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
1649 unsigned PrevDFSIn = 0;
1650 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1652 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1654 const MachineInstr *MInsn = II;
1655 const MDNode *Scope = NULL;
1656 const MDNode *InlinedAt = NULL;
1658 // Check if instruction has valid location information.
1659 if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
1663 DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
1664 MI2ScopeMap.find(MInsn);
1665 if (DI != MI2ScopeMap.end()) {
1666 DbgScope *S = DI->second;
1667 dbgs() << S->getDFSIn();
1668 PrevDFSIn = S->getDFSIn();
1670 dbgs() << PrevDFSIn;
1672 dbgs() << " [ x" << PrevDFSIn;
1680 /// extractScopeInformation - Scan machine instructions in this function
1681 /// and collect DbgScopes. Return true, if at least one scope was found.
1682 bool DwarfDebug::extractScopeInformation() {
1683 // If scope information was extracted using .dbg intrinsics then there is not
1684 // any need to extract these information by scanning each instruction.
1685 if (!DbgScopeMap.empty())
1688 // Scan each instruction and create scopes. First build working set of scopes.
1689 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
1690 SmallVector<DbgRange, 4> MIRanges;
1691 DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
1692 const MDNode *PrevScope = NULL;
1693 const MDNode *PrevInlinedAt = NULL;
1694 const MachineInstr *RangeBeginMI = NULL;
1695 const MachineInstr *PrevMI = NULL;
1696 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
1698 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1700 const MachineInstr *MInsn = II;
1701 const MDNode *Scope = NULL;
1702 const MDNode *InlinedAt = NULL;
1704 // Check if instruction has valid location information.
1705 if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
1710 // If scope has not changed then skip this instruction.
1711 if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
1716 // Ignore DBG_VALUE. It does not contribute any instruction in output.
1717 if (MInsn->isDebugValue())
1721 // If we have alread seen a beginning of a instruction range and
1722 // current instruction scope does not match scope of first instruction
1723 // in this range then create a new instruction range.
1724 DbgRange R(RangeBeginMI, PrevMI);
1725 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope,
1727 MIRanges.push_back(R);
1730 // This is a beginning of a new instruction range.
1731 RangeBeginMI = MInsn;
1733 // Reset previous markers.
1736 PrevInlinedAt = InlinedAt;
1740 // Create last instruction range.
1741 if (RangeBeginMI && PrevMI && PrevScope) {
1742 DbgRange R(RangeBeginMI, PrevMI);
1743 MIRanges.push_back(R);
1744 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
1747 if (!CurrentFnDbgScope)
1750 calculateDominanceGraph(CurrentFnDbgScope);
1752 printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
1754 // Find ranges of instructions covered by each DbgScope;
1755 DbgScope *PrevDbgScope = NULL;
1756 for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
1757 RE = MIRanges.end(); RI != RE; ++RI) {
1758 const DbgRange &R = *RI;
1759 DbgScope *S = MI2ScopeMap.lookup(R.first);
1760 assert (S && "Lost DbgScope for a machine instruction!");
1761 if (PrevDbgScope && !PrevDbgScope->dominates(S))
1762 PrevDbgScope->closeInsnRange(S);
1763 S->openInsnRange(R.first);
1764 S->extendInsnRange(R.second);
1769 PrevDbgScope->closeInsnRange();
1771 identifyScopeMarkers();
1773 return !DbgScopeMap.empty();
1776 /// identifyScopeMarkers() -
1777 /// Each DbgScope has first instruction and last instruction to mark beginning
1778 /// and end of a scope respectively. Create an inverse map that list scopes
1779 /// starts (and ends) with an instruction. One instruction may start (or end)
1780 /// multiple scopes. Ignore scopes that are not reachable.
1781 void DwarfDebug::identifyScopeMarkers() {
1782 SmallVector<DbgScope *, 4> WorkList;
1783 WorkList.push_back(CurrentFnDbgScope);
1784 while (!WorkList.empty()) {
1785 DbgScope *S = WorkList.pop_back_val();
1787 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
1788 if (!Children.empty())
1789 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
1790 SE = Children.end(); SI != SE; ++SI)
1791 WorkList.push_back(*SI);
1793 if (S->isAbstractScope())
1796 const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
1799 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1800 RE = Ranges.end(); RI != RE; ++RI) {
1801 assert(RI->first && "DbgRange does not have first instruction!");
1802 assert(RI->second && "DbgRange does not have second instruction!");
1803 requestLabelBeforeInsn(RI->first);
1804 requestLabelAfterInsn(RI->second);
1809 /// getScopeNode - Get MDNode for DebugLoc's scope.
1810 static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1811 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1812 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1813 return DL.getScope(Ctx);
1816 /// getFnDebugLoc - Walk up the scope chain of given debug loc and find
1817 /// line number info for the function.
1818 static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1819 const MDNode *Scope = getScopeNode(DL, Ctx);
1820 DISubprogram SP = getDISubprogram(Scope);
1822 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1826 /// beginFunction - Gather pre-function debug information. Assumes being
1827 /// emitted immediately after the function entry point.
1828 void DwarfDebug::beginFunction(const MachineFunction *MF) {
1829 if (!MMI->hasDebugInfo()) return;
1830 if (!extractScopeInformation()) return;
1832 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1833 Asm->getFunctionNumber());
1834 // Assumes in correct section after the entry point.
1835 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
1837 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1839 /// ProcessedArgs - Collection of arguments already processed.
1840 SmallPtrSet<const MDNode *, 8> ProcessedArgs;
1841 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1842 /// LiveUserVar - Map physreg numbers to the MDNode they contain.
1843 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1845 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1847 bool AtBlockEntry = true;
1848 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1850 const MachineInstr *MI = II;
1852 if (MI->isDebugValue()) {
1853 assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
1855 // Keep track of user variables.
1857 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1859 // Variable is in a register, we need to check for clobbers.
1860 if (isDbgValueInDefinedReg(MI))
1861 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1863 // Check the history of this variable.
1864 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1865 if (History.empty()) {
1866 UserVariables.push_back(Var);
1867 // The first mention of a function argument gets the FunctionBeginSym
1868 // label, so arguments are visible when breaking at function entry.
1870 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1871 DISubprogram(getDISubprogram(DV.getContext()))
1872 .describes(MF->getFunction()))
1873 LabelsBeforeInsn[MI] = FunctionBeginSym;
1875 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1876 const MachineInstr *Prev = History.back();
1877 if (Prev->isDebugValue()) {
1878 // Coalesce identical entries at the end of History.
1879 if (History.size() >= 2 &&
1880 Prev->isIdenticalTo(History[History.size() - 2]))
1883 // Terminate old register assignments that don't reach MI;
1884 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1885 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1886 isDbgValueInDefinedReg(Prev)) {
1887 // Previous register assignment needs to terminate at the end of
1889 MachineBasicBlock::const_iterator LastMI =
1890 PrevMBB->getLastNonDebugInstr();
1891 if (LastMI == PrevMBB->end())
1892 // Drop DBG_VALUE for empty range.
1895 // Terminate after LastMI.
1896 History.push_back(LastMI);
1901 History.push_back(MI);
1903 // Not a DBG_VALUE instruction.
1905 AtBlockEntry = false;
1907 // First known non DBG_VALUE location marks beginning of function
1909 if (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown())
1910 PrologEndLoc = MI->getDebugLoc();
1912 // Check if the instruction clobbers any registers with debug vars.
1913 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1914 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1915 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1917 for (const unsigned *AI = TRI->getOverlaps(MOI->getReg());
1918 unsigned Reg = *AI; ++AI) {
1919 const MDNode *Var = LiveUserVar[Reg];
1922 // Reg is now clobbered.
1923 LiveUserVar[Reg] = 0;
1925 // Was MD last defined by a DBG_VALUE referring to Reg?
1926 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1927 if (HistI == DbgValues.end())
1929 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1930 if (History.empty())
1932 const MachineInstr *Prev = History.back();
1933 // Sanity-check: Register assignments are terminated at the end of
1935 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1937 // Is the variable still in Reg?
1938 if (!isDbgValueInDefinedReg(Prev) ||
1939 Prev->getOperand(0).getReg() != Reg)
1941 // Var is clobbered. Make sure the next instruction gets a label.
1942 History.push_back(MI);
1949 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1951 SmallVectorImpl<const MachineInstr*> &History = I->second;
1952 if (History.empty())
1955 // Make sure the final register assignments are terminated.
1956 const MachineInstr *Prev = History.back();
1957 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1958 const MachineBasicBlock *PrevMBB = Prev->getParent();
1959 MachineBasicBlock::const_iterator LastMI = PrevMBB->getLastNonDebugInstr();
1960 if (LastMI == PrevMBB->end())
1961 // Drop DBG_VALUE for empty range.
1964 // Terminate after LastMI.
1965 History.push_back(LastMI);
1968 // Request labels for the full history.
1969 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1970 const MachineInstr *MI = History[i];
1971 if (MI->isDebugValue())
1972 requestLabelBeforeInsn(MI);
1974 requestLabelAfterInsn(MI);
1978 PrevInstLoc = DebugLoc();
1979 PrevLabel = FunctionBeginSym;
1981 // Record beginning of function.
1982 if (!PrologEndLoc.isUnknown()) {
1983 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1984 MF->getFunction()->getContext());
1985 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1986 FnStartDL.getScope(MF->getFunction()->getContext()),
1987 DWARF2_FLAG_IS_STMT);
1991 /// endFunction - Gather and emit post-function debug information.
1993 void DwarfDebug::endFunction(const MachineFunction *MF) {
1994 if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
1996 if (CurrentFnDbgScope) {
1998 // Define end label for subprogram.
1999 FunctionEndSym = Asm->GetTempSymbol("func_end",
2000 Asm->getFunctionNumber());
2001 // Assumes in correct section after the entry point.
2002 Asm->OutStreamer.EmitLabel(FunctionEndSym);
2004 SmallPtrSet<const MDNode *, 16> ProcessedVars;
2005 collectVariableInfo(MF, ProcessedVars);
2007 // Construct abstract scopes.
2008 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2009 AE = AbstractScopesList.end(); AI != AE; ++AI) {
2010 DISubprogram SP((*AI)->getScopeNode());
2012 // Collect info for variables that were optimized out.
2013 StringRef FName = SP.getLinkageName();
2015 FName = SP.getName();
2016 if (NamedMDNode *NMD =
2017 getFnSpecificMDNode(*(MF->getFunction()->getParent()), FName)) {
2018 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2019 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2020 if (!DV || !ProcessedVars.insert(DV))
2022 DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
2024 Scope->addVariable(new DbgVariable(DV));
2028 if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
2029 constructScopeDIE(*AI);
2032 DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
2034 if (!DisableFramePointerElim(*MF))
2035 getCompileUnit(CurrentFnDbgScope->getScopeNode())->addUInt(CurFnDIE,
2036 dwarf::DW_AT_APPLE_omit_frame_ptr,
2037 dwarf::DW_FORM_flag, 1);
2040 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
2041 MMI->getFrameMoves()));
2045 CurrentFnDbgScope = NULL;
2046 DeleteContainerPointers(CurrentFnArguments);
2047 DbgVariableToFrameIndexMap.clear();
2048 VarToAbstractVarMap.clear();
2049 DbgVariableToDbgInstMap.clear();
2050 DeleteContainerSeconds(DbgScopeMap);
2051 UserVariables.clear();
2053 ConcreteScopes.clear();
2054 DeleteContainerSeconds(AbstractScopes);
2055 AbstractScopesList.clear();
2056 AbstractVariables.clear();
2057 LabelsBeforeInsn.clear();
2058 LabelsAfterInsn.clear();
2062 /// recordVariableFrameIndex - Record a variable's index.
2063 void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2064 assert (V && "Invalid DbgVariable!");
2065 DbgVariableToFrameIndexMap[V] = Index;
2068 /// findVariableFrameIndex - Return true if frame index for the variable
2069 /// is found. Update FI to hold value of the index.
2070 bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2071 assert (V && "Invalid DbgVariable!");
2072 DenseMap<const DbgVariable *, int>::iterator I =
2073 DbgVariableToFrameIndexMap.find(V);
2074 if (I == DbgVariableToFrameIndexMap.end())
2080 /// findDbgScope - Find DbgScope for the debug loc attached with an
2082 DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
2083 DbgScope *Scope = NULL;
2085 MInsn->getParent()->getParent()->getFunction()->getContext();
2086 DebugLoc DL = MInsn->getDebugLoc();
2091 if (const MDNode *IA = DL.getInlinedAt(Ctx))
2092 Scope = ConcreteScopes.lookup(IA);
2094 Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2100 /// recordSourceLine - Register a source line with debug info. Returns the
2101 /// unique label that was emitted and which provides correspondence to
2102 /// the source line list.
2103 void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
2109 DIDescriptor Scope(S);
2111 if (Scope.isCompileUnit()) {
2112 DICompileUnit CU(S);
2113 Fn = CU.getFilename();
2114 Dir = CU.getDirectory();
2115 } else if (Scope.isFile()) {
2117 Fn = F.getFilename();
2118 Dir = F.getDirectory();
2119 } else if (Scope.isSubprogram()) {
2121 Fn = SP.getFilename();
2122 Dir = SP.getDirectory();
2123 } else if (Scope.isLexicalBlock()) {
2124 DILexicalBlock DB(S);
2125 Fn = DB.getFilename();
2126 Dir = DB.getDirectory();
2128 assert(0 && "Unexpected scope info");
2130 Src = GetOrCreateSourceID(Fn, Dir);
2132 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags,
2136 //===----------------------------------------------------------------------===//
2138 //===----------------------------------------------------------------------===//
2140 /// computeSizeAndOffset - Compute the size and offset of a DIE.
2143 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2144 // Get the children.
2145 const std::vector<DIE *> &Children = Die->getChildren();
2147 // If not last sibling and has children then add sibling offset attribute.
2148 if (!Last && !Children.empty())
2149 Die->addSiblingOffset(DIEValueAllocator);
2151 // Record the abbreviation.
2152 assignAbbrevNumber(Die->getAbbrev());
2154 // Get the abbreviation for this DIE.
2155 unsigned AbbrevNumber = Die->getAbbrevNumber();
2156 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2159 Die->setOffset(Offset);
2161 // Start the size with the size of abbreviation code.
2162 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2164 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2165 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2167 // Size the DIE attribute values.
2168 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2169 // Size attribute value.
2170 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
2172 // Size the DIE children if any.
2173 if (!Children.empty()) {
2174 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2175 "Children flag not set");
2177 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2178 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2180 // End of children marker.
2181 Offset += sizeof(int8_t);
2184 Die->setSize(Offset - Die->getOffset());
2188 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2190 void DwarfDebug::computeSizeAndOffsets() {
2191 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2192 E = CUMap.end(); I != E; ++I) {
2193 // Compute size of compile unit header.
2195 sizeof(int32_t) + // Length of Compilation Unit Info
2196 sizeof(int16_t) + // DWARF version number
2197 sizeof(int32_t) + // Offset Into Abbrev. Section
2198 sizeof(int8_t); // Pointer Size (in bytes)
2199 computeSizeAndOffset(I->second->getCUDie(), Offset, true);
2203 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2204 /// temporary label to it if SymbolStem is specified.
2205 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
2206 const char *SymbolStem = 0) {
2207 Asm->OutStreamer.SwitchSection(Section);
2208 if (!SymbolStem) return 0;
2210 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2211 Asm->OutStreamer.EmitLabel(TmpSym);
2215 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
2216 /// the start of each one.
2217 void DwarfDebug::EmitSectionLabels() {
2218 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2220 // Dwarf sections base addresses.
2221 DwarfInfoSectionSym =
2222 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
2223 DwarfAbbrevSectionSym =
2224 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
2225 EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
2227 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
2228 EmitSectionSym(Asm, MacroInfo);
2230 EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
2231 EmitSectionSym(Asm, TLOF.getDwarfLocSection());
2232 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
2233 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
2234 DwarfStrSectionSym =
2235 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
2236 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
2239 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
2240 "section_debug_loc");
2242 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
2243 EmitSectionSym(Asm, TLOF.getDataSection());
2246 /// emitDIE - Recusively Emits a debug information entry.
2248 void DwarfDebug::emitDIE(DIE *Die) {
2249 // Get the abbreviation for this DIE.
2250 unsigned AbbrevNumber = Die->getAbbrevNumber();
2251 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2253 // Emit the code (index) for the abbreviation.
2254 if (Asm->isVerbose())
2255 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2256 Twine::utohexstr(Die->getOffset()) + ":0x" +
2257 Twine::utohexstr(Die->getSize()) + " " +
2258 dwarf::TagString(Abbrev->getTag()));
2259 Asm->EmitULEB128(AbbrevNumber);
2261 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2262 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2264 // Emit the DIE attribute values.
2265 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2266 unsigned Attr = AbbrevData[i].getAttribute();
2267 unsigned Form = AbbrevData[i].getForm();
2268 assert(Form && "Too many attributes for DIE (check abbreviation)");
2270 if (Asm->isVerbose())
2271 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2274 case dwarf::DW_AT_sibling:
2275 Asm->EmitInt32(Die->getSiblingOffset());
2277 case dwarf::DW_AT_abstract_origin: {
2278 DIEEntry *E = cast<DIEEntry>(Values[i]);
2279 DIE *Origin = E->getEntry();
2280 unsigned Addr = Origin->getOffset();
2281 Asm->EmitInt32(Addr);
2284 case dwarf::DW_AT_ranges: {
2285 // DW_AT_range Value encodes offset in debug_range section.
2286 DIEInteger *V = cast<DIEInteger>(Values[i]);
2288 if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
2289 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
2293 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
2295 DwarfDebugRangeSectionSym,
2300 case dwarf::DW_AT_location: {
2301 if (UseDotDebugLocEntry.count(Die) != 0) {
2302 DIELabel *L = cast<DIELabel>(Values[i]);
2303 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
2305 Values[i]->EmitValue(Asm, Form);
2308 case dwarf::DW_AT_accessibility: {
2309 if (Asm->isVerbose()) {
2310 DIEInteger *V = cast<DIEInteger>(Values[i]);
2311 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
2313 Values[i]->EmitValue(Asm, Form);
2317 // Emit an attribute using the defined form.
2318 Values[i]->EmitValue(Asm, Form);
2323 // Emit the DIE children if any.
2324 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2325 const std::vector<DIE *> &Children = Die->getChildren();
2327 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2328 emitDIE(Children[j]);
2330 if (Asm->isVerbose())
2331 Asm->OutStreamer.AddComment("End Of Children Mark");
2336 /// emitDebugInfo - Emit the debug info section.
2338 void DwarfDebug::emitDebugInfo() {
2339 // Start debug info section.
2340 Asm->OutStreamer.SwitchSection(
2341 Asm->getObjFileLowering().getDwarfInfoSection());
2342 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2343 E = CUMap.end(); I != E; ++I) {
2344 CompileUnit *TheCU = I->second;
2345 DIE *Die = TheCU->getCUDie();
2347 // Emit the compile units header.
2348 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
2351 // Emit size of content not including length itself
2352 unsigned ContentSize = Die->getSize() +
2353 sizeof(int16_t) + // DWARF version number
2354 sizeof(int32_t) + // Offset Into Abbrev. Section
2355 sizeof(int8_t); // Pointer Size (in bytes)
2357 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2358 Asm->EmitInt32(ContentSize);
2359 Asm->OutStreamer.AddComment("DWARF version number");
2360 Asm->EmitInt16(dwarf::DWARF_VERSION);
2361 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2362 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
2363 DwarfAbbrevSectionSym);
2364 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2365 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
2368 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
2372 /// emitAbbreviations - Emit the abbreviation section.
2374 void DwarfDebug::emitAbbreviations() const {
2375 // Check to see if it is worth the effort.
2376 if (!Abbreviations.empty()) {
2377 // Start the debug abbrev section.
2378 Asm->OutStreamer.SwitchSection(
2379 Asm->getObjFileLowering().getDwarfAbbrevSection());
2381 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
2383 // For each abbrevation.
2384 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2385 // Get abbreviation data
2386 const DIEAbbrev *Abbrev = Abbreviations[i];
2388 // Emit the abbrevations code (base 1 index.)
2389 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2391 // Emit the abbreviations data.
2395 // Mark end of abbreviations.
2396 Asm->EmitULEB128(0, "EOM(3)");
2398 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
2402 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
2403 /// the line matrix.
2405 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2406 // Define last address of section.
2407 Asm->OutStreamer.AddComment("Extended Op");
2410 Asm->OutStreamer.AddComment("Op size");
2411 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
2412 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2413 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2415 Asm->OutStreamer.AddComment("Section end label");
2417 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
2418 Asm->getTargetData().getPointerSize(),
2421 // Mark end of matrix.
2422 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2428 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
2430 void DwarfDebug::emitDebugPubNames() {
2431 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2432 E = CUMap.end(); I != E; ++I) {
2433 CompileUnit *TheCU = I->second;
2434 // Start the dwarf pubnames section.
2435 Asm->OutStreamer.SwitchSection(
2436 Asm->getObjFileLowering().getDwarfPubNamesSection());
2438 Asm->OutStreamer.AddComment("Length of Public Names Info");
2439 Asm->EmitLabelDifference(
2440 Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
2441 Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
2443 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
2446 Asm->OutStreamer.AddComment("DWARF Version");
2447 Asm->EmitInt16(dwarf::DWARF_VERSION);
2449 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2450 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
2451 DwarfInfoSectionSym);
2453 Asm->OutStreamer.AddComment("Compilation Unit Length");
2454 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
2455 Asm->GetTempSymbol("info_begin", TheCU->getID()),
2458 const StringMap<DIE*> &Globals = TheCU->getGlobals();
2459 for (StringMap<DIE*>::const_iterator
2460 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2461 const char *Name = GI->getKeyData();
2462 DIE *Entity = GI->second;
2464 Asm->OutStreamer.AddComment("DIE offset");
2465 Asm->EmitInt32(Entity->getOffset());
2467 if (Asm->isVerbose())
2468 Asm->OutStreamer.AddComment("External Name");
2469 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2472 Asm->OutStreamer.AddComment("End Mark");
2474 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
2479 void DwarfDebug::emitDebugPubTypes() {
2480 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2481 E = CUMap.end(); I != E; ++I) {
2482 CompileUnit *TheCU = I->second;
2483 // Start the dwarf pubnames section.
2484 Asm->OutStreamer.SwitchSection(
2485 Asm->getObjFileLowering().getDwarfPubTypesSection());
2486 Asm->OutStreamer.AddComment("Length of Public Types Info");
2487 Asm->EmitLabelDifference(
2488 Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
2489 Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
2491 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
2494 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2495 Asm->EmitInt16(dwarf::DWARF_VERSION);
2497 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2498 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
2499 DwarfInfoSectionSym);
2501 Asm->OutStreamer.AddComment("Compilation Unit Length");
2502 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
2503 Asm->GetTempSymbol("info_begin", TheCU->getID()),
2506 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2507 for (StringMap<DIE*>::const_iterator
2508 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2509 const char *Name = GI->getKeyData();
2510 DIE * Entity = GI->second;
2512 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2513 Asm->EmitInt32(Entity->getOffset());
2515 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
2516 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2519 Asm->OutStreamer.AddComment("End Mark");
2521 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
2526 /// emitDebugStr - Emit visible names into a debug str section.
2528 void DwarfDebug::emitDebugStr() {
2529 // Check to see if it is worth the effort.
2530 if (StringPool.empty()) return;
2532 // Start the dwarf str section.
2533 Asm->OutStreamer.SwitchSection(
2534 Asm->getObjFileLowering().getDwarfStrSection());
2536 // Get all of the string pool entries and put them in an array by their ID so
2537 // we can sort them.
2538 SmallVector<std::pair<unsigned,
2539 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
2541 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2542 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
2543 Entries.push_back(std::make_pair(I->second.second, &*I));
2545 array_pod_sort(Entries.begin(), Entries.end());
2547 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2548 // Emit a label for reference from debug information entries.
2549 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
2551 // Emit the string itself.
2552 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
2556 /// emitDebugLoc - Emit visible names into a debug loc section.
2558 void DwarfDebug::emitDebugLoc() {
2559 if (DotDebugLocEntries.empty())
2562 for (SmallVector<DotDebugLocEntry, 4>::iterator
2563 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2565 DotDebugLocEntry &Entry = *I;
2566 if (I + 1 != DotDebugLocEntries.end())
2570 // Start the dwarf loc section.
2571 Asm->OutStreamer.SwitchSection(
2572 Asm->getObjFileLowering().getDwarfLocSection());
2573 unsigned char Size = Asm->getTargetData().getPointerSize();
2574 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2576 for (SmallVector<DotDebugLocEntry, 4>::iterator
2577 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2578 I != E; ++I, ++index) {
2579 DotDebugLocEntry &Entry = *I;
2580 if (Entry.isMerged()) continue;
2581 if (Entry.isEmpty()) {
2582 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2583 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2584 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
2586 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
2587 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
2588 DIVariable DV(Entry.Variable);
2589 Asm->OutStreamer.AddComment("Loc expr size");
2590 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2591 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2592 Asm->EmitLabelDifference(end, begin, 2);
2593 Asm->OutStreamer.EmitLabel(begin);
2594 if (DV.hasComplexAddress()) {
2595 unsigned N = DV.getNumAddrElements();
2597 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2598 if (Entry.Loc.getOffset()) {
2600 Asm->EmitDwarfRegOp(Entry.Loc);
2601 Asm->OutStreamer.AddComment("DW_OP_deref");
2602 Asm->EmitInt8(dwarf::DW_OP_deref);
2603 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2604 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2605 Asm->EmitSLEB128(DV.getAddrElement(1));
2607 // If first address element is OpPlus then emit
2608 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2609 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2610 Asm->EmitDwarfRegOp(Loc);
2614 Asm->EmitDwarfRegOp(Entry.Loc);
2617 // Emit remaining complex address elements.
2618 for (; i < N; ++i) {
2619 uint64_t Element = DV.getAddrElement(i);
2620 if (Element == DIBuilder::OpPlus) {
2621 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2622 Asm->EmitULEB128(DV.getAddrElement(++i));
2623 } else if (Element == DIBuilder::OpDeref)
2624 Asm->EmitInt8(dwarf::DW_OP_deref);
2625 else llvm_unreachable("unknown Opcode found in complex address");
2628 Asm->EmitDwarfRegOp(Entry.Loc);
2630 Asm->OutStreamer.EmitLabel(end);
2635 /// EmitDebugARanges - Emit visible names into a debug aranges section.
2637 void DwarfDebug::EmitDebugARanges() {
2638 // Start the dwarf aranges section.
2639 Asm->OutStreamer.SwitchSection(
2640 Asm->getObjFileLowering().getDwarfARangesSection());
2643 /// emitDebugRanges - Emit visible names into a debug ranges section.
2645 void DwarfDebug::emitDebugRanges() {
2646 // Start the dwarf ranges section.
2647 Asm->OutStreamer.SwitchSection(
2648 Asm->getObjFileLowering().getDwarfRangesSection());
2649 unsigned char Size = Asm->getTargetData().getPointerSize();
2650 for (SmallVector<const MCSymbol *, 8>::iterator
2651 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
2654 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
2656 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2660 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
2662 void DwarfDebug::emitDebugMacInfo() {
2663 if (const MCSection *LineInfo =
2664 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
2665 // Start the dwarf macinfo section.
2666 Asm->OutStreamer.SwitchSection(LineInfo);
2670 /// emitDebugInlineInfo - Emit inline info using following format.
2672 /// 1. length of section
2673 /// 2. Dwarf version number
2674 /// 3. address size.
2676 /// Entries (one "entry" for each function that was inlined):
2678 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
2679 /// otherwise offset into __debug_str for regular function name.
2680 /// 2. offset into __debug_str section for regular function name.
2681 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
2682 /// instances for the function.
2684 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
2685 /// inlined instance; the die_offset points to the inlined_subroutine die in the
2686 /// __debug_info section, and the low_pc is the starting address for the
2687 /// inlining instance.
2688 void DwarfDebug::emitDebugInlineInfo() {
2689 if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
2695 Asm->OutStreamer.SwitchSection(
2696 Asm->getObjFileLowering().getDwarfDebugInlineSection());
2698 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
2699 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2700 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
2702 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
2704 Asm->OutStreamer.AddComment("Dwarf Version");
2705 Asm->EmitInt16(dwarf::DWARF_VERSION);
2706 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2707 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
2709 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
2710 E = InlinedSPNodes.end(); I != E; ++I) {
2712 const MDNode *Node = *I;
2713 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
2714 = InlineInfo.find(Node);
2715 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
2716 DISubprogram SP(Node);
2717 StringRef LName = SP.getLinkageName();
2718 StringRef Name = SP.getName();
2720 Asm->OutStreamer.AddComment("MIPS linkage name");
2721 if (LName.empty()) {
2722 Asm->OutStreamer.EmitBytes(Name, 0);
2723 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
2725 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
2726 DwarfStrSectionSym);
2728 Asm->OutStreamer.AddComment("Function name");
2729 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
2730 Asm->EmitULEB128(Labels.size(), "Inline count");
2732 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
2733 LE = Labels.end(); LI != LE; ++LI) {
2734 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2735 Asm->EmitInt32(LI->second->getOffset());
2737 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
2738 Asm->OutStreamer.EmitSymbolValue(LI->first,
2739 Asm->getTargetData().getPointerSize(),0);
2743 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));