blob: ac2f72aee513d836109b1e549ca3209dd64d61b0 [file] [log] [blame]
Bill Wendling0310d762009-05-15 09:23:25 +00001//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf debug info into asm files.
11//
12//===----------------------------------------------------------------------===//
Chris Lattner6cde3e62010-03-09 00:39:24 +000013
Devang Patele4b27562009-08-28 23:24:31 +000014#define DEBUG_TYPE "dwarfdebug"
Bill Wendling0310d762009-05-15 09:23:25 +000015#include "DwarfDebug.h"
Chris Lattner74e41f92010-04-05 05:24:55 +000016#include "DIE.h"
Devang Patel8b9df622011-04-12 17:40:32 +000017#include "DwarfCompileUnit.h"
Bill Wendling57fbba42010-04-05 22:59:21 +000018#include "llvm/Constants.h"
Bill Wendling0310d762009-05-15 09:23:25 +000019#include "llvm/Module.h"
Devang Patele449d1f2011-01-20 00:02:16 +000020#include "llvm/Instructions.h"
David Greeneb2c66fc2009-08-19 21:52:55 +000021#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling0310d762009-05-15 09:23:25 +000022#include "llvm/CodeGen/MachineModuleInfo.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000023#include "llvm/MC/MCAsmInfo.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000024#include "llvm/MC/MCSection.h"
Chris Lattner6c2f9e12009-08-19 05:49:37 +000025#include "llvm/MC/MCStreamer.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000026#include "llvm/MC/MCSymbol.h"
Chris Lattner45111d12010-01-16 21:57:06 +000027#include "llvm/Target/Mangler.h"
Bill Wendling0310d762009-05-15 09:23:25 +000028#include "llvm/Target/TargetData.h"
Anton Korobeynikov16c29b52011-01-10 12:39:04 +000029#include "llvm/Target/TargetFrameLowering.h"
Chris Lattnerf0144122009-07-28 03:13:23 +000030#include "llvm/Target/TargetLoweringObjectFile.h"
Chris Lattner9d1c1ad2010-04-04 18:06:11 +000031#include "llvm/Target/TargetMachine.h"
Chris Lattnerf0144122009-07-28 03:13:23 +000032#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel2a4a3b72010-04-19 19:14:02 +000033#include "llvm/Target/TargetOptions.h"
Chris Lattner74e41f92010-04-05 05:24:55 +000034#include "llvm/Analysis/DebugInfo.h"
Devang Patel0eea95d2011-02-24 18:49:30 +000035#include "llvm/Analysis/DIBuilder.h"
Devang Patel9a31f0f2010-10-25 20:45:32 +000036#include "llvm/ADT/Statistic.h"
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +000037#include "llvm/ADT/STLExtras.h"
Chris Lattner23132b12009-08-24 03:52:50 +000038#include "llvm/ADT/StringExtras.h"
Devang Pateleac9c072010-04-27 19:46:33 +000039#include "llvm/Support/CommandLine.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000040#include "llvm/Support/Debug.h"
41#include "llvm/Support/ErrorHandling.h"
Devang Patel3139fcf2010-01-26 21:39:14 +000042#include "llvm/Support/ValueHandle.h"
Chris Lattner0ad9c912010-01-22 22:09:00 +000043#include "llvm/Support/FormattedStream.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000044#include "llvm/Support/Timer.h"
Michael J. Spencer1f6efa32010-11-29 18:16:10 +000045#include "llvm/Support/Path.h"
Bill Wendling0310d762009-05-15 09:23:25 +000046using namespace llvm;
47
Devang Pateleac9c072010-04-27 19:46:33 +000048static cl::opt<bool> PrintDbgScope("print-dbgscope", cl::Hidden,
49 cl::desc("Print DbgScope information for each machine instruction"));
50
Jim Grosbach1e20b962010-07-21 21:21:52 +000051static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
Devang Patel61409622010-07-07 20:12:52 +000052 cl::Hidden,
Devang Pateleac9c072010-04-27 19:46:33 +000053 cl::desc("Disable debug info printing"));
54
Dan Gohman281d65d2010-05-07 01:08:53 +000055static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
Chris Lattner7a2bdde2011-04-15 05:18:47 +000056 cl::desc("Make an absence of debug location information explicit."),
Dan Gohman281d65d2010-05-07 01:08:53 +000057 cl::init(false));
58
Bill Wendling5f017e82010-04-07 09:28:04 +000059namespace {
60 const char *DWARFGroupName = "DWARF Emission";
61 const char *DbgTimerName = "DWARF Debug Writer";
62} // end anonymous namespace
63
Bill Wendling0310d762009-05-15 09:23:25 +000064//===----------------------------------------------------------------------===//
65
66/// Configuration values for initial hash set sizes (log2).
67///
Bill Wendling0310d762009-05-15 09:23:25 +000068static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling0310d762009-05-15 09:23:25 +000069
70namespace llvm {
71
Nick Lewycky3bbb6f72011-07-29 03:49:23 +000072DIType DbgVariable::getType() const {
Devang Patel3cbee302011-04-12 22:53:02 +000073 DIType Ty = Var.getType();
74 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
75 // addresses instead.
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.
83
84 However, as far as the original *programmer* is concerned, the
85 variable should still have type 'SomeType', as originally declared.
86
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.
92
93 The original type 'SomeType' will be the type of the field named
94 'VarName' inside the __Block_byref_x_VarName struct.
95
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. */
101 DIType subType = Ty;
102 unsigned tag = Ty.getTag();
103
104 if (tag == dwarf::DW_TAG_pointer_type) {
105 DIDerivedType DTy = DIDerivedType(Ty);
106 subType = DTy.getTypeDerivedFrom();
107 }
108
109 DICompositeType blockStruct = DICompositeType(subType);
110 DIArray Elements = blockStruct.getTypeArray();
111
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());
Devang Patel8bd11de2010-08-09 21:01:39 +0000117 }
118 return Ty;
119 }
Devang Patel3cbee302011-04-12 22:53:02 +0000120 return Ty;
121}
Bill Wendling0310d762009-05-15 09:23:25 +0000122
123//===----------------------------------------------------------------------===//
Devang Pateleac9c072010-04-27 19:46:33 +0000124/// DbgRange - This is used to track range of instructions with identical
125/// debug info scope.
126///
127typedef std::pair<const MachineInstr *, const MachineInstr *> DbgRange;
128
129//===----------------------------------------------------------------------===//
Bill Wendling0310d762009-05-15 09:23:25 +0000130/// DbgScope - This class is used to track scope information.
131///
Devang Patelf76a3d62009-11-16 21:53:40 +0000132class DbgScope {
Bill Wendling0310d762009-05-15 09:23:25 +0000133 DbgScope *Parent; // Parent to this scope.
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000134 DIDescriptor Desc; // Debug info descriptor for scope.
Devang Patel3139fcf2010-01-26 21:39:14 +0000135 // Location at which this scope is inlined.
Jim Grosbach1e20b962010-07-21 21:21:52 +0000136 AssertingVH<const MDNode> InlinedAtLocation;
Devang Patel53bb5c92009-11-10 23:06:00 +0000137 bool AbstractScope; // Abstract Scope
Devang Pateld38dd112009-10-01 18:25:23 +0000138 const MachineInstr *LastInsn; // Last instruction of this scope.
139 const MachineInstr *FirstInsn; // First instruction of this scope.
Devang Pateleac9c072010-04-27 19:46:33 +0000140 unsigned DFSIn, DFSOut;
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +0000141 // Scopes defined in scope. Contents not owned.
142 SmallVector<DbgScope *, 4> Scopes;
143 // Variables declared in scope. Contents owned.
144 SmallVector<DbgVariable *, 8> Variables;
Devang Pateleac9c072010-04-27 19:46:33 +0000145 SmallVector<DbgRange, 4> Ranges;
Owen Anderson04c05f72009-06-24 22:53:20 +0000146 // Private state for dump()
147 mutable unsigned IndentLevel;
Bill Wendling0310d762009-05-15 09:23:25 +0000148public:
Devang Patele9f8f5e2010-05-07 20:54:48 +0000149 DbgScope(DbgScope *P, DIDescriptor D, const MDNode *I = 0)
Devang Patel53bb5c92009-11-10 23:06:00 +0000150 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
Devang Pateleac9c072010-04-27 19:46:33 +0000151 LastInsn(0), FirstInsn(0),
152 DFSIn(0), DFSOut(0), IndentLevel(0) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000153 virtual ~DbgScope();
154
155 // Accessors.
156 DbgScope *getParent() const { return Parent; }
Devang Patel53bb5c92009-11-10 23:06:00 +0000157 void setParent(DbgScope *P) { Parent = P; }
Bill Wendling0310d762009-05-15 09:23:25 +0000158 DIDescriptor getDesc() const { return Desc; }
Devang Patele9f8f5e2010-05-07 20:54:48 +0000159 const MDNode *getInlinedAt() const { return InlinedAtLocation; }
160 const MDNode *getScopeNode() const { return Desc; }
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +0000161 const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
Devang Patele03161c2010-08-09 18:51:29 +0000162 const SmallVector<DbgVariable *, 8> &getDbgVariables() { return Variables; }
Devang Pateleac9c072010-04-27 19:46:33 +0000163 const SmallVector<DbgRange, 4> &getRanges() { return Ranges; }
164
165 /// openInsnRange - This scope covers instruction range starting from MI.
166 void openInsnRange(const MachineInstr *MI) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000167 if (!FirstInsn)
Devang Pateleac9c072010-04-27 19:46:33 +0000168 FirstInsn = MI;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000169
Devang Pateleac9c072010-04-27 19:46:33 +0000170 if (Parent)
171 Parent->openInsnRange(MI);
172 }
173
Jim Grosbach1e20b962010-07-21 21:21:52 +0000174 /// extendInsnRange - Extend the current instruction range covered by
Devang Pateleac9c072010-04-27 19:46:33 +0000175 /// this scope.
176 void extendInsnRange(const MachineInstr *MI) {
177 assert (FirstInsn && "MI Range is not open!");
178 LastInsn = MI;
179 if (Parent)
180 Parent->extendInsnRange(MI);
181 }
182
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));
Jim Grosbach1e20b962010-07-21 21:21:52 +0000189 FirstInsn = NULL;
Devang Pateleac9c072010-04-27 19:46:33 +0000190 LastInsn = NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000191 // If Parent dominates NewScope then do not close Parent's instruction
Devang Pateleac9c072010-04-27 19:46:33 +0000192 // range.
193 if (Parent && (!NewScope || !Parent->dominates(NewScope)))
194 Parent->closeInsnRange(NewScope);
195 }
196
Devang Patel53bb5c92009-11-10 23:06:00 +0000197 void setAbstractScope() { AbstractScope = true; }
198 bool isAbstractScope() const { return AbstractScope; }
Devang Pateleac9c072010-04-27 19:46:33 +0000199
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000200 // Depth First Search support to walk and manipulate DbgScope hierarchy.
Devang Pateleac9c072010-04-27 19:46:33 +0000201 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) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000206 if (S == this)
Devang Pateleac9c072010-04-27 19:46:33 +0000207 return true;
208 if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut())
209 return true;
210 return false;
211 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000212
Devang Patel2c4ceb12009-11-21 02:48:08 +0000213 /// addScope - Add a scope to the scope.
Bill Wendling0310d762009-05-15 09:23:25 +0000214 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000215 void addScope(DbgScope *S) { Scopes.push_back(S); }
Bill Wendling0310d762009-05-15 09:23:25 +0000216
Devang Patel2c4ceb12009-11-21 02:48:08 +0000217 /// addVariable - Add a variable to the scope.
Bill Wendling0310d762009-05-15 09:23:25 +0000218 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000219 void addVariable(DbgVariable *V) { Variables.push_back(V); }
Bill Wendling0310d762009-05-15 09:23:25 +0000220
Bill Wendling0310d762009-05-15 09:23:25 +0000221#ifndef NDEBUG
222 void dump() const;
223#endif
224};
Devang Pateleac9c072010-04-27 19:46:33 +0000225
Chris Lattnerea761862010-04-05 04:09:20 +0000226} // end llvm namespace
Bill Wendling0310d762009-05-15 09:23:25 +0000227
228#ifndef NDEBUG
229void DbgScope::dump() const {
David Greenef83adbc2009-12-24 00:31:35 +0000230 raw_ostream &err = dbgs();
Chris Lattnerc281de12009-08-23 00:51:00 +0000231 err.indent(IndentLevel);
Devang Patel4f455d62011-07-14 22:30:56 +0000232 err << "DFSIn: " << DFSIn << " DFSOut: " << DFSOut << "\n";
Devang Patele9f8f5e2010-05-07 20:54:48 +0000233 const MDNode *N = Desc;
Devang Patel53bb5c92009-11-10 23:06:00 +0000234 N->dump();
Devang Patel53bb5c92009-11-10 23:06:00 +0000235 if (AbstractScope)
236 err << "Abstract Scope\n";
Bill Wendling0310d762009-05-15 09:23:25 +0000237
238 IndentLevel += 2;
Devang Patel53bb5c92009-11-10 23:06:00 +0000239 if (!Scopes.empty())
240 err << "Children ...\n";
Bill Wendling0310d762009-05-15 09:23:25 +0000241 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
242 if (Scopes[i] != this)
243 Scopes[i]->dump();
244
245 IndentLevel -= 2;
246}
247#endif
248
Bill Wendling0310d762009-05-15 09:23:25 +0000249DbgScope::~DbgScope() {
Bill Wendling0310d762009-05-15 09:23:25 +0000250 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
251 delete Variables[j];
Bill Wendling0310d762009-05-15 09:23:25 +0000252}
253
Chris Lattner49cd6642010-04-05 05:11:15 +0000254DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Devang Patel163a9f72010-05-10 22:49:55 +0000255 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbach1e20b962010-07-21 21:21:52 +0000256 AbbreviationsSet(InitAbbreviationsSetSize),
Devang Patelf2548ca2010-04-16 23:33:45 +0000257 CurrentFnDbgScope(0), PrevLabel(NULL) {
Chris Lattnerbc733f52010-03-13 02:17:42 +0000258 NextStringPoolNumber = 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000259
Rafael Espindolaf2b04232011-05-06 14:56:22 +0000260 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
Chris Lattner4ad1efe2010-04-04 23:10:38 +0000261 DwarfStrSectionSym = TextSectionSym = 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000262 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
Devang Patelc3f5f782010-05-25 23:40:22 +0000263 FunctionBeginSym = FunctionEndSym = 0;
Dan Gohman03c3dc72010-06-18 15:56:31 +0000264 {
265 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
266 beginModule(M);
Torok Edwin9c421072010-04-07 10:44:46 +0000267 }
Bill Wendling0310d762009-05-15 09:23:25 +0000268}
269DwarfDebug::~DwarfDebug() {
Bill Wendling0310d762009-05-15 09:23:25 +0000270}
271
Chris Lattnerbc733f52010-03-13 02:17:42 +0000272MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
273 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
274 if (Entry.first) return Entry.first;
275
276 Entry.second = NextStringPoolNumber++;
Chris Lattnerc0215722010-04-04 19:25:43 +0000277 return Entry.first = Asm->GetTempSymbol("string", Entry.second);
Chris Lattnerbc733f52010-03-13 02:17:42 +0000278}
279
280
Devang Patel2c4ceb12009-11-21 02:48:08 +0000281/// assignAbbrevNumber - Define a unique number for the abbreviation.
Bill Wendling0310d762009-05-15 09:23:25 +0000282///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000283void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling0310d762009-05-15 09:23:25 +0000284 // Profile the node so that we can make it unique.
285 FoldingSetNodeID ID;
286 Abbrev.Profile(ID);
287
288 // Check the set for priors.
289 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
290
291 // If it's newly added.
292 if (InSet == &Abbrev) {
293 // Add to abbreviation list.
294 Abbreviations.push_back(&Abbrev);
295
296 // Assign the vector position + 1 as its number.
297 Abbrev.setNumber(Abbreviations.size());
298 } else {
299 // Assign existing abbreviation number.
300 Abbrev.setNumber(InSet->getNumber());
301 }
302}
303
Jim Grosbach1e20b962010-07-21 21:21:52 +0000304/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
Devang Patel351ca332010-01-05 01:46:14 +0000305/// printer to not emit usual symbol prefix before the symbol name is used then
306/// return linkage name after skipping this special LLVM prefix.
307static StringRef getRealLinkageName(StringRef LinkageName) {
308 char One = '\1';
309 if (LinkageName.startswith(StringRef(&One, 1)))
310 return LinkageName.substr(1);
311 return LinkageName;
312}
313
Devang Patelffe966c2009-12-14 16:18:45 +0000314/// createSubprogramDIE - Create new DIE using SP.
Devang Patelee70fa72010-09-27 23:15:27 +0000315DIE *DwarfDebug::createSubprogramDIE(DISubprogram SP) {
Devang Patel163a9f72010-05-10 22:49:55 +0000316 CompileUnit *SPCU = getCompileUnit(SP);
317 DIE *SPDie = SPCU->getDIE(SP);
Devang Patelffe966c2009-12-14 16:18:45 +0000318 if (SPDie)
319 return SPDie;
320
321 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Devang Patel5e06bb82011-04-22 23:10:17 +0000322
323 // DW_TAG_inlined_subroutine may refer to this DIE.
324 SPCU->insertDIE(SP, SPDie);
325
326 // Add to context owner.
327 SPCU->addToContextOwner(SPDie, SP.getContext());
328
329 // Add function template parameters.
330 SPCU->addTemplateParams(*SPDie, SP.getTemplateParams());
331
Devang Patelee4a3ab2011-05-03 21:50:34 +0000332 StringRef LinkageName = SP.getLinkageName();
333 if (!LinkageName.empty())
334 SPCU->addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
335 getRealLinkageName(LinkageName));
336
Devang Patel5e06bb82011-04-22 23:10:17 +0000337 // If this DIE is going to refer declaration info using AT_specification
338 // then there is no need to add other attributes.
339 if (SP.getFunctionDeclaration().isSubprogram())
340 return SPDie;
341
Devang Patel1eac3e72010-03-02 17:58:15 +0000342 // Constructors and operators for anonymous aggregates do not have names.
Devang Patel6b506cb2010-03-02 01:26:20 +0000343 if (!SP.getName().empty())
Devang Patel3cbee302011-04-12 22:53:02 +0000344 SPCU->addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
345 SP.getName());
Bill Wendling0310d762009-05-15 09:23:25 +0000346
Devang Patel3cbee302011-04-12 22:53:02 +0000347 SPCU->addSourceLine(SPDie, SP);
Bill Wendling0310d762009-05-15 09:23:25 +0000348
Devang Patel7b172c62010-10-07 22:03:01 +0000349 if (SP.isPrototyped())
Devang Patel3cbee302011-04-12 22:53:02 +0000350 SPCU->addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Devang Patel5e06bb82011-04-22 23:10:17 +0000351
Bill Wendling0310d762009-05-15 09:23:25 +0000352 // Add Return Type.
Devang Patel1d5cc1d2009-12-03 01:25:38 +0000353 DICompositeType SPTy = SP.getType();
354 DIArray Args = SPTy.getTypeArray();
Bill Wendling0310d762009-05-15 09:23:25 +0000355 unsigned SPTag = SPTy.getTag();
Devang Patel5d11eb02009-12-03 19:11:07 +0000356
Devang Patel3c91b052010-03-08 20:52:55 +0000357 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
Devang Patel3cbee302011-04-12 22:53:02 +0000358 SPCU->addType(SPDie, SPTy);
Devang Patel1d5cc1d2009-12-03 01:25:38 +0000359 else
Devang Patel3cbee302011-04-12 22:53:02 +0000360 SPCU->addType(SPDie, DIType(Args.getElement(0)));
Devang Patel1d5cc1d2009-12-03 01:25:38 +0000361
Devang Patel5d11eb02009-12-03 19:11:07 +0000362 unsigned VK = SP.getVirtuality();
363 if (VK) {
Devang Patel3cbee302011-04-12 22:53:02 +0000364 SPCU->addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
365 DIEBlock *Block = SPCU->getDIEBlock();
366 SPCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
367 SPCU->addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
368 SPCU->addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000369 ContainingTypeMap.insert(std::make_pair(SPDie,
Devang Patel2db49d72010-05-07 18:11:54 +0000370 SP.getContainingType()));
Devang Patel5d11eb02009-12-03 19:11:07 +0000371 }
372
Devang Patelee70fa72010-09-27 23:15:27 +0000373 if (!SP.isDefinition()) {
Devang Patel3cbee302011-04-12 22:53:02 +0000374 SPCU->addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
375
Bill Wendling0310d762009-05-15 09:23:25 +0000376 // Add arguments. Do not add arguments for subprogram definition. They will
Devang Patel1d5cc1d2009-12-03 01:25:38 +0000377 // be handled while processing variables.
378 DICompositeType SPTy = SP.getType();
379 DIArray Args = SPTy.getTypeArray();
380 unsigned SPTag = SPTy.getTag();
381
Bill Wendling0310d762009-05-15 09:23:25 +0000382 if (SPTag == dwarf::DW_TAG_subroutine_type)
383 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
384 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patel2db49d72010-05-07 18:11:54 +0000385 DIType ATy = DIType(DIType(Args.getElement(i)));
Devang Patel3cbee302011-04-12 22:53:02 +0000386 SPCU->addType(Arg, ATy);
Devang Patelb4645642010-02-06 01:02:37 +0000387 if (ATy.isArtificial())
Devang Patel3cbee302011-04-12 22:53:02 +0000388 SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000389 SPDie->addChild(Arg);
Bill Wendling0310d762009-05-15 09:23:25 +0000390 }
391 }
392
Devang Patel4e0d19d2010-02-03 19:57:19 +0000393 if (SP.isArtificial())
Devang Patel3cbee302011-04-12 22:53:02 +0000394 SPCU->addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
Devang Patel4e0d19d2010-02-03 19:57:19 +0000395
Devang Patelccff8122010-04-30 19:38:23 +0000396 if (!SP.isLocalToUnit())
Devang Patel3cbee302011-04-12 22:53:02 +0000397 SPCU->addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000398
Devang Patelccff8122010-04-30 19:38:23 +0000399 if (SP.isOptimized())
Devang Patel3cbee302011-04-12 22:53:02 +0000400 SPCU->addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
Devang Patelccff8122010-04-30 19:38:23 +0000401
Jim Grosbach91729002010-07-21 23:03:52 +0000402 if (unsigned isa = Asm->getISAEncoding()) {
Devang Patel3cbee302011-04-12 22:53:02 +0000403 SPCU->addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
Jim Grosbach91729002010-07-21 23:03:52 +0000404 }
405
Bill Wendling0310d762009-05-15 09:23:25 +0000406 return SPDie;
407}
408
Devang Patele9f8f5e2010-05-07 20:54:48 +0000409DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
Chris Lattnered7a77b2010-03-31 05:36:29 +0000410 assert(N && "Invalid Scope encoding!");
Devang Patel53bb5c92009-11-10 23:06:00 +0000411
412 DbgScope *AScope = AbstractScopes.lookup(N);
413 if (AScope)
414 return AScope;
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000415
Devang Patel53bb5c92009-11-10 23:06:00 +0000416 DbgScope *Parent = NULL;
417
418 DIDescriptor Scope(N);
419 if (Scope.isLexicalBlock()) {
420 DILexicalBlock DB(N);
421 DIDescriptor ParentDesc = DB.getContext();
Devang Patel2db49d72010-05-07 18:11:54 +0000422 Parent = getOrCreateAbstractScope(ParentDesc);
Devang Patel53bb5c92009-11-10 23:06:00 +0000423 }
424
425 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
426
427 if (Parent)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000428 Parent->addScope(AScope);
Devang Patel53bb5c92009-11-10 23:06:00 +0000429 AScope->setAbstractScope();
430 AbstractScopes[N] = AScope;
431 if (DIDescriptor(N).isSubprogram())
432 AbstractScopesList.push_back(AScope);
433 return AScope;
434}
Devang Patelaf9e8472009-10-01 20:31:14 +0000435
Devang Patel5f094002010-04-06 23:53:48 +0000436/// isSubprogramContext - Return true if Context is either a subprogram
437/// or another context nested inside a subprogram.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000438static bool isSubprogramContext(const MDNode *Context) {
Devang Patel5f094002010-04-06 23:53:48 +0000439 if (!Context)
440 return false;
441 DIDescriptor D(Context);
442 if (D.isSubprogram())
443 return true;
444 if (D.isType())
Devang Patel2db49d72010-05-07 18:11:54 +0000445 return isSubprogramContext(DIType(Context).getContext());
Devang Patel5f094002010-04-06 23:53:48 +0000446 return false;
447}
448
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000449/// updateSubprogramScopeDIE - Find DIE for the given subprogram and
Devang Patel2c4ceb12009-11-21 02:48:08 +0000450/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
451/// If there are global variables in this scope then create and insert
452/// DIEs for these variables.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000453DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
Devang Patel163a9f72010-05-10 22:49:55 +0000454 CompileUnit *SPCU = getCompileUnit(SPNode);
455 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patel8aa61472010-07-07 22:20:57 +0000456
Chris Lattnerd38fee82010-04-05 00:13:49 +0000457 assert(SPDie && "Unable to find subprogram DIE!");
458 DISubprogram SP(SPNode);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000459
Devang Patel5e06bb82011-04-22 23:10:17 +0000460 DISubprogram SPDecl = SP.getFunctionDeclaration();
461 if (SPDecl.isSubprogram())
462 // Refer function declaration directly.
Devang Patel3cbee302011-04-12 22:53:02 +0000463 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
Devang Patel5e06bb82011-04-22 23:10:17 +0000464 createSubprogramDIE(SPDecl));
465 else {
466 // There is not any need to generate specification DIE for a function
467 // defined at compile unit level. If a function is defined inside another
468 // function then gdb prefers the definition at top level and but does not
469 // expect specification DIE in parent function. So avoid creating
470 // specification DIE for a function defined inside a function.
471 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
472 !SP.getContext().isFile() &&
473 !isSubprogramContext(SP.getContext())) {
474 SPCU-> addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
475
476 // Add arguments.
477 DICompositeType SPTy = SP.getType();
478 DIArray Args = SPTy.getTypeArray();
479 unsigned SPTag = SPTy.getTag();
480 if (SPTag == dwarf::DW_TAG_subroutine_type)
481 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
482 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
483 DIType ATy = DIType(DIType(Args.getElement(i)));
484 SPCU->addType(Arg, ATy);
485 if (ATy.isArtificial())
486 SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
487 SPDie->addChild(Arg);
488 }
489 DIE *SPDeclDie = SPDie;
490 SPDie = new DIE(dwarf::DW_TAG_subprogram);
491 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
492 SPDeclDie);
493 SPCU->addDie(SPDie);
494 }
Chris Lattnerd38fee82010-04-05 00:13:49 +0000495 }
Devang Patel8aa61472010-07-07 22:20:57 +0000496 // Pick up abstract subprogram DIE.
497 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
498 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Devang Patel3cbee302011-04-12 22:53:02 +0000499 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
500 dwarf::DW_FORM_ref4, AbsSPDIE);
Devang Patel8aa61472010-07-07 22:20:57 +0000501 SPCU->addDie(SPDie);
502 }
503
Devang Patel3cbee302011-04-12 22:53:02 +0000504 SPCU->addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
505 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
506 SPCU->addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
507 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
Chris Lattnerd38fee82010-04-05 00:13:49 +0000508 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
509 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Devang Patel3cbee302011-04-12 22:53:02 +0000510 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patelb4645642010-02-06 01:02:37 +0000511
Chris Lattnerd38fee82010-04-05 00:13:49 +0000512 return SPDie;
Devang Patel53bb5c92009-11-10 23:06:00 +0000513}
514
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000515/// constructLexicalScope - Construct new DW_TAG_lexical_block
Devang Patel2c4ceb12009-11-21 02:48:08 +0000516/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
517DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
Devang Pateleac9c072010-04-27 19:46:33 +0000518
519 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
520 if (Scope->isAbstractScope())
521 return ScopeDIE;
522
523 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
524 if (Ranges.empty())
525 return 0;
526
Devang Patel3cbee302011-04-12 22:53:02 +0000527 CompileUnit *TheCU = getCompileUnit(Scope->getScopeNode());
Devang Pateleac9c072010-04-27 19:46:33 +0000528 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
529 if (Ranges.size() > 1) {
530 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbach1e20b962010-07-21 21:21:52 +0000531 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Pateleac9c072010-04-27 19:46:33 +0000532 // DW_AT_ranges appropriately.
Devang Patel3cbee302011-04-12 22:53:02 +0000533 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
534 DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
Devang Pateleac9c072010-04-27 19:46:33 +0000535 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
536 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelc3f5f782010-05-25 23:40:22 +0000537 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
538 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Pateleac9c072010-04-27 19:46:33 +0000539 }
540 DebugRangeSymbols.push_back(NULL);
541 DebugRangeSymbols.push_back(NULL);
542 return ScopeDIE;
543 }
544
Devang Patelc3f5f782010-05-25 23:40:22 +0000545 const MCSymbol *Start = getLabelBeforeInsn(RI->first);
546 const MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000547
Devang Patelc3f5f782010-05-25 23:40:22 +0000548 if (End == 0) return 0;
Devang Patel53bb5c92009-11-10 23:06:00 +0000549
Chris Lattnerb7db7332010-03-09 01:58:53 +0000550 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
551 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbach1e20b962010-07-21 21:21:52 +0000552
Devang Patel3cbee302011-04-12 22:53:02 +0000553 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
554 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
Devang Patel53bb5c92009-11-10 23:06:00 +0000555
556 return ScopeDIE;
557}
558
Devang Patel2c4ceb12009-11-21 02:48:08 +0000559/// constructInlinedScopeDIE - This scope represents inlined body of
560/// a function. Construct DIE to represent this concrete inlined copy
561/// of the function.
562DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
Devang Pateleac9c072010-04-27 19:46:33 +0000563
564 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
Jim Grosbach1e20b962010-07-21 21:21:52 +0000565 assert (Ranges.empty() == false
Devang Pateleac9c072010-04-27 19:46:33 +0000566 && "DbgScope does not have instruction markers!");
567
Devang Patel26a92002011-07-27 00:34:13 +0000568 if (!Scope->getScopeNode())
569 return NULL;
570 DIScope DS(Scope->getScopeNode());
571 DISubprogram InlinedSP = getDISubprogram(DS);
572 CompileUnit *TheCU = getCompileUnit(InlinedSP);
573 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
574 if (!OriginDIE) {
575 DEBUG(dbgs() << "Unable to find original DIE for inlined subprogram.");
576 return NULL;
577 }
578
Devang Pateleac9c072010-04-27 19:46:33 +0000579 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
Devang Patelc3f5f782010-05-25 23:40:22 +0000580 const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
581 const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000582
Devang Patel0afbf232010-07-08 22:39:20 +0000583 if (StartLabel == 0 || EndLabel == 0) {
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000584 assert (0 && "Unexpected Start and End labels for a inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +0000585 return 0;
586 }
Chris Lattnerb7db7332010-03-09 01:58:53 +0000587 assert(StartLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +0000588 "Invalid starting label for an inlined scope!");
Chris Lattnerb7db7332010-03-09 01:58:53 +0000589 assert(EndLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +0000590 "Invalid end label for an inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +0000591
Devang Pateld96efb82011-05-05 17:54:26 +0000592 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patel3cbee302011-04-12 22:53:02 +0000593 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
594 dwarf::DW_FORM_ref4, OriginDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +0000595
Devang Patel26a92002011-07-27 00:34:13 +0000596 if (Ranges.size() > 1) {
597 // .debug_range section has not been laid out yet. Emit offset in
598 // .debug_range as a uint, size 4, for now. emitDIE will handle
599 // DW_AT_ranges appropriately.
600 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
601 DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
602 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
603 RE = Ranges.end(); RI != RE; ++RI) {
604 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
605 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
606 }
607 DebugRangeSymbols.push_back(NULL);
608 DebugRangeSymbols.push_back(NULL);
609 } else {
610 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
611 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
612 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000613
614 InlinedSubprogramDIEs.insert(OriginDIE);
615
616 // Track the start label for this inlined function.
Devang Patel26a92002011-07-27 00:34:13 +0000617 //.debug_inlined section specification does not clearly state how
618 // to emit inlined scope that is split into multiple instruction ranges.
619 // For now, use first instruction range and emit low_pc/high_pc pair and
620 // corresponding .debug_inlined section entry for this pair.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000621 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
Devang Patel2db49d72010-05-07 18:11:54 +0000622 I = InlineInfo.find(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +0000623
624 if (I == InlineInfo.end()) {
Devang Patel2db49d72010-05-07 18:11:54 +0000625 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
Jim Grosbach7ab38df2009-11-22 19:20:36 +0000626 ScopeDIE));
Devang Patel2db49d72010-05-07 18:11:54 +0000627 InlinedSPNodes.push_back(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +0000628 } else
Chris Lattner6ed0f902010-03-09 00:31:02 +0000629 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patel53bb5c92009-11-10 23:06:00 +0000630
Devang Patel53bb5c92009-11-10 23:06:00 +0000631 DILocation DL(Scope->getInlinedAt());
Devang Patel3cbee302011-04-12 22:53:02 +0000632 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
633 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patel53bb5c92009-11-10 23:06:00 +0000634
635 return ScopeDIE;
636}
637
Devang Patel8594d422011-06-24 20:46:11 +0000638/// isUnsignedDIType - Return true if type encoding is unsigned.
639static bool isUnsignedDIType(DIType Ty) {
640 DIDerivedType DTy(Ty);
641 if (DTy.Verify())
642 return isUnsignedDIType(DTy.getTypeDerivedFrom());
643
644 DIBasicType BTy(Ty);
645 if (BTy.Verify()) {
646 unsigned Encoding = BTy.getEncoding();
647 if (Encoding == dwarf::DW_ATE_unsigned ||
648 Encoding == dwarf::DW_ATE_unsigned_char)
649 return true;
650 }
651 return false;
652}
Devang Patel2c4ceb12009-11-21 02:48:08 +0000653
654/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Devang Patel8a241142009-12-09 18:24:21 +0000655DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
Devang Patel8bd11de2010-08-09 21:01:39 +0000656 StringRef Name = DV->getName();
Devang Patel65dbc902009-11-25 17:36:49 +0000657 if (Name.empty())
Devang Patel3fb6bd62009-11-13 02:25:26 +0000658 return NULL;
Devang Patel53bb5c92009-11-10 23:06:00 +0000659
660 // Translate tag to proper Dwarf tag. The result variable is dropped for
661 // now.
662 unsigned Tag;
Devang Patel8bd11de2010-08-09 21:01:39 +0000663 switch (DV->getTag()) {
Devang Patel53bb5c92009-11-10 23:06:00 +0000664 case dwarf::DW_TAG_return_variable:
665 return NULL;
666 case dwarf::DW_TAG_arg_variable:
667 Tag = dwarf::DW_TAG_formal_parameter;
668 break;
669 case dwarf::DW_TAG_auto_variable: // fall thru
670 default:
671 Tag = dwarf::DW_TAG_variable;
672 break;
673 }
674
675 // Define variable debug information entry.
676 DIE *VariableDie = new DIE(Tag);
Devang Patel9341d102011-04-25 23:05:21 +0000677 CompileUnit *VariableCU = getCompileUnit(DV->getVariable());
Devang Patel53bb5c92009-11-10 23:06:00 +0000678 DIE *AbsDIE = NULL;
Devang Patel26c1e562010-05-20 16:36:41 +0000679 DenseMap<const DbgVariable *, const DbgVariable *>::iterator
680 V2AVI = VarToAbstractVarMap.find(DV);
681 if (V2AVI != VarToAbstractVarMap.end())
682 AbsDIE = V2AVI->second->getDIE();
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000683
Devang Patel26c1e562010-05-20 16:36:41 +0000684 if (AbsDIE)
Devang Patel9341d102011-04-25 23:05:21 +0000685 VariableCU->addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Devang Patel3cbee302011-04-12 22:53:02 +0000686 dwarf::DW_FORM_ref4, AbsDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +0000687 else {
Devang Patel9341d102011-04-25 23:05:21 +0000688 VariableCU->addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
689 Name);
690 VariableCU->addSourceLine(VariableDie, DV->getVariable());
Devang Patel53bb5c92009-11-10 23:06:00 +0000691
692 // Add variable type.
Devang Patel9341d102011-04-25 23:05:21 +0000693 VariableCU->addType(VariableDie, DV->getType());
Devang Patel53bb5c92009-11-10 23:06:00 +0000694 }
695
Devang Patel8bd11de2010-08-09 21:01:39 +0000696 if (Tag == dwarf::DW_TAG_formal_parameter && DV->getType().isArtificial())
Devang Patel9341d102011-04-25 23:05:21 +0000697 VariableCU->addUInt(VariableDie, dwarf::DW_AT_artificial,
698 dwarf::DW_FORM_flag, 1);
Devang Patel3cf763d2010-09-29 23:07:21 +0000699 else if (DIVariable(DV->getVariable()).isArtificial())
Devang Patel9341d102011-04-25 23:05:21 +0000700 VariableCU->addUInt(VariableDie, dwarf::DW_AT_artificial,
701 dwarf::DW_FORM_flag, 1);
Devang Patelc3f5f782010-05-25 23:40:22 +0000702
703 if (Scope->isAbstractScope()) {
704 DV->setDIE(VariableDie);
705 return VariableDie;
706 }
707
708 // Add variable address.
709
710 unsigned Offset = DV->getDotDebugLocOffset();
711 if (Offset != ~0U) {
Devang Patel9341d102011-04-25 23:05:21 +0000712 VariableCU->addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
Devang Patelc3f5f782010-05-25 23:40:22 +0000713 Asm->GetTempSymbol("debug_loc", Offset));
714 DV->setDIE(VariableDie);
715 UseDotDebugLocEntry.insert(VariableDie);
716 return VariableDie;
717 }
718
719 // Check if variable is described by a DBG_VALUE instruction.
720 DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
721 DbgVariableToDbgInstMap.find(DV);
722 if (DVI != DbgVariableToDbgInstMap.end()) {
723 const MachineInstr *DVInsn = DVI->second;
Devang Patelc3f5f782010-05-25 23:40:22 +0000724 bool updated = false;
Devang Patelc3f5f782010-05-25 23:40:22 +0000725 if (DVInsn->getNumOperands() == 3) {
Devang Patel0b48ead2010-08-31 22:22:42 +0000726 if (DVInsn->getOperand(0).isReg()) {
727 const MachineOperand RegOp = DVInsn->getOperand(0);
728 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
729 if (DVInsn->getOperand(1).isImm() &&
730 TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
Devang Patele1cdf842011-04-27 22:45:24 +0000731 unsigned FrameReg = 0;
732 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
733 int Offset =
734 TFI->getFrameIndexReference(*Asm->MF,
735 DVInsn->getOperand(1).getImm(),
736 FrameReg);
737 MachineLocation Location(FrameReg, Offset);
738 VariableCU->addVariableAddress(DV, VariableDie, Location);
739
740 } else if (RegOp.getReg())
741 VariableCU->addVariableAddress(DV, VariableDie,
742 MachineLocation(RegOp.getReg()));
743 updated = true;
Devang Patel0b48ead2010-08-31 22:22:42 +0000744 }
Devang Patelc3f5f782010-05-25 23:40:22 +0000745 else if (DVInsn->getOperand(0).isImm())
Devang Patelb58128e2011-05-27 16:45:18 +0000746 updated =
747 VariableCU->addConstantValue(VariableDie, DVInsn->getOperand(0),
748 DV->getType());
Jim Grosbach1e20b962010-07-21 21:21:52 +0000749 else if (DVInsn->getOperand(0).isFPImm())
750 updated =
Devang Patel9341d102011-04-25 23:05:21 +0000751 VariableCU->addConstantFPValue(VariableDie, DVInsn->getOperand(0));
Devang Patel8594d422011-06-24 20:46:11 +0000752 else if (DVInsn->getOperand(0).isCImm())
753 updated =
754 VariableCU->addConstantValue(VariableDie,
755 DVInsn->getOperand(0).getCImm(),
756 isUnsignedDIType(DV->getType()));
Devang Patelc3f5f782010-05-25 23:40:22 +0000757 } else {
Devang Patele1cdf842011-04-27 22:45:24 +0000758 VariableCU->addVariableAddress(DV, VariableDie,
759 Asm->getDebugValueLocation(DVInsn));
760 updated = true;
Devang Patelc3f5f782010-05-25 23:40:22 +0000761 }
762 if (!updated) {
763 // If variableDie is not updated then DBG_VALUE instruction does not
764 // have valid variable info.
765 delete VariableDie;
766 return NULL;
767 }
768 DV->setDIE(VariableDie);
769 return VariableDie;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000770 }
Devang Patelc3f5f782010-05-25 23:40:22 +0000771
772 // .. else use frame index, if available.
Devang Patelc3f5f782010-05-25 23:40:22 +0000773 int FI = 0;
Devang Patele1cdf842011-04-27 22:45:24 +0000774 if (findVariableFrameIndex(DV, &FI)) {
775 unsigned FrameReg = 0;
776 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
777 int Offset =
778 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
779 MachineLocation Location(FrameReg, Offset);
780 VariableCU->addVariableAddress(DV, VariableDie, Location);
781 }
782
Devang Patel53bb5c92009-11-10 23:06:00 +0000783 DV->setDIE(VariableDie);
784 return VariableDie;
785
786}
Devang Patel2c4ceb12009-11-21 02:48:08 +0000787
788/// constructScopeDIE - Construct a DIE for this scope.
789DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
Devang Patel3c91b052010-03-08 20:52:55 +0000790 if (!Scope || !Scope->getScopeNode())
791 return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000792
Devang Patel5bc9fec2011-02-19 01:31:27 +0000793 SmallVector <DIE *, 8> Children;
Devang Patel0478c152011-03-01 22:58:55 +0000794
795 // Collect arguments for current function.
796 if (Scope == CurrentFnDbgScope)
797 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
798 if (DbgVariable *ArgDV = CurrentFnArguments[i])
799 if (DIE *Arg = constructVariableDIE(ArgDV, Scope))
800 Children.push_back(Arg);
801
Devang Patel5bc9fec2011-02-19 01:31:27 +0000802 // Collect lexical scope childrens first.
803 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
804 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
805 if (DIE *Variable = constructVariableDIE(Variables[i], Scope))
806 Children.push_back(Variable);
807 const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
808 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
809 if (DIE *Nested = constructScopeDIE(Scopes[j]))
810 Children.push_back(Nested);
Devang Patel3c91b052010-03-08 20:52:55 +0000811 DIScope DS(Scope->getScopeNode());
812 DIE *ScopeDIE = NULL;
813 if (Scope->getInlinedAt())
814 ScopeDIE = constructInlinedScopeDIE(Scope);
815 else if (DS.isSubprogram()) {
Devang Patel0dd45582010-06-28 20:53:04 +0000816 ProcessedSPNodes.insert(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000817 if (Scope->isAbstractScope()) {
Devang Patel163a9f72010-05-10 22:49:55 +0000818 ScopeDIE = getCompileUnit(DS)->getDIE(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000819 // Note down abstract DIE.
820 if (ScopeDIE)
821 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
822 }
Devang Patel3c91b052010-03-08 20:52:55 +0000823 else
Devang Patel2db49d72010-05-07 18:11:54 +0000824 ScopeDIE = updateSubprogramScopeDIE(DS);
Devang Patel3c91b052010-03-08 20:52:55 +0000825 }
Devang Patel5bc9fec2011-02-19 01:31:27 +0000826 else {
827 // There is no need to emit empty lexical block DIE.
828 if (Children.empty())
829 return NULL;
Devang Patel3c91b052010-03-08 20:52:55 +0000830 ScopeDIE = constructLexicalScopeDIE(Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000831 }
832
Devang Patelaead63c2010-03-29 22:59:58 +0000833 if (!ScopeDIE) return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000834
Devang Patel5bc9fec2011-02-19 01:31:27 +0000835 // Add children
836 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
837 E = Children.end(); I != E; ++I)
838 ScopeDIE->addChild(*I);
Devang Patel193f7202009-11-24 01:14:22 +0000839
Jim Grosbach1e20b962010-07-21 21:21:52 +0000840 if (DS.isSubprogram())
Devang Patel3cbee302011-04-12 22:53:02 +0000841 getCompileUnit(DS)->addPubTypes(DISubprogram(DS));
Jim Grosbach1e20b962010-07-21 21:21:52 +0000842
Devang Patel193f7202009-11-24 01:14:22 +0000843 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +0000844}
845
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000846/// GetOrCreateSourceID - Look up the source id with the given directory and
847/// source file names. If none currently exists, create a new id and insert it
848/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
849/// maps as well.
Devang Patel2f584852010-07-24 00:53:22 +0000850
Devang Patel23670e52011-03-24 20:30:50 +0000851unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName,
852 StringRef DirName) {
Devang Patel1905a182010-09-16 20:57:49 +0000853 // If FE did not provide a file name, then assume stdin.
854 if (FileName.empty())
Devang Patel23670e52011-03-24 20:30:50 +0000855 return GetOrCreateSourceID("<stdin>", StringRef());
856
857 // MCStream expects full path name as filename.
Benjamin Kramerab5f7882011-06-05 14:36:47 +0000858 if (!DirName.empty() && !sys::path::is_absolute(FileName)) {
859 SmallString<128> FullPathName = DirName;
860 sys::path::append(FullPathName, FileName);
Devang Patel23670e52011-03-24 20:30:50 +0000861 // Here FullPathName will be copied into StringMap by GetOrCreateSourceID.
862 return GetOrCreateSourceID(StringRef(FullPathName), StringRef());
863 }
Devang Patel1905a182010-09-16 20:57:49 +0000864
Rafael Espindola5c055632010-11-18 02:04:25 +0000865 StringMapEntry<unsigned> &Entry = SourceIdMap.GetOrCreateValue(FileName);
866 if (Entry.getValue())
867 return Entry.getValue();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000868
Rafael Espindola5c055632010-11-18 02:04:25 +0000869 unsigned SrcId = SourceIdMap.size();
870 Entry.setValue(SrcId);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000871
Rafael Espindola5c055632010-11-18 02:04:25 +0000872 // Print out a .file directive to specify files for .loc directives.
Devang Patel23670e52011-03-24 20:30:50 +0000873 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, Entry.getKey());
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000874
875 return SrcId;
876}
877
Jim Grosbach1e20b962010-07-21 21:21:52 +0000878/// constructCompileUnit - Create new CompileUnit for the given
Devang Patel163a9f72010-05-10 22:49:55 +0000879/// metadata node with tag DW_TAG_compile_unit.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000880void DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +0000881 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +0000882 StringRef FN = DIUnit.getFilename();
883 StringRef Dir = DIUnit.getDirectory();
Devang Patel23670e52011-03-24 20:30:50 +0000884 unsigned ID = GetOrCreateSourceID(FN, Dir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000885
886 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Devang Patel3cbee302011-04-12 22:53:02 +0000887 CompileUnit *NewCU = new CompileUnit(ID, Die, Asm, this);
888 NewCU->addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
889 DIUnit.getProducer());
890 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
891 DIUnit.getLanguage());
892 NewCU->addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
Devang Patel5098da02010-04-26 22:54:28 +0000893 // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
894 // simplifies debug range entries.
Devang Patel3cbee302011-04-12 22:53:02 +0000895 NewCU->addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
Devang Patel4a602ca2010-03-22 23:11:36 +0000896 // DW_AT_stmt_list is a offset of line number information for this
Devang Patelaf608bd2010-08-24 00:06:12 +0000897 // compile unit in debug_line section.
Rafael Espindoladc52ecf2011-05-10 20:35:05 +0000898 if(Asm->MAI->doesDwarfRequireRelocationForSectionOffset())
Rafael Espindola597a7662011-05-04 17:44:06 +0000899 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
Devang Patel3cbee302011-04-12 22:53:02 +0000900 Asm->GetTempSymbol("section_line"));
Devang Patelae84d5b2010-08-31 23:50:19 +0000901 else
Devang Patel3cbee302011-04-12 22:53:02 +0000902 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000903
Devang Patel65dbc902009-11-25 17:36:49 +0000904 if (!Dir.empty())
Devang Patel3cbee302011-04-12 22:53:02 +0000905 NewCU->addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000906 if (DIUnit.isOptimized())
Devang Patel3cbee302011-04-12 22:53:02 +0000907 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000908
Devang Patel65dbc902009-11-25 17:36:49 +0000909 StringRef Flags = DIUnit.getFlags();
910 if (!Flags.empty())
Devang Patel3cbee302011-04-12 22:53:02 +0000911 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
912
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000913 unsigned RVer = DIUnit.getRunTimeVersion();
914 if (RVer)
Devang Patel3cbee302011-04-12 22:53:02 +0000915 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000916 dwarf::DW_FORM_data1, RVer);
917
Devang Patel163a9f72010-05-10 22:49:55 +0000918 if (!FirstCU)
919 FirstCU = NewCU;
920 CUMap.insert(std::make_pair(N, NewCU));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000921}
922
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000923/// getCompileUnit - Get CompileUnit DIE.
Devang Patel163a9f72010-05-10 22:49:55 +0000924CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
925 assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
926 DIDescriptor D(N);
927 const MDNode *CUNode = NULL;
928 if (D.isCompileUnit())
929 CUNode = N;
930 else if (D.isSubprogram())
931 CUNode = DISubprogram(N).getCompileUnit();
932 else if (D.isType())
933 CUNode = DIType(N).getCompileUnit();
934 else if (D.isGlobalVariable())
935 CUNode = DIGlobalVariable(N).getCompileUnit();
936 else if (D.isVariable())
937 CUNode = DIVariable(N).getCompileUnit();
938 else if (D.isNameSpace())
939 CUNode = DINameSpace(N).getCompileUnit();
940 else if (D.isFile())
941 CUNode = DIFile(N).getCompileUnit();
942 else
943 return FirstCU;
944
945 DenseMap<const MDNode *, CompileUnit *>::const_iterator I
946 = CUMap.find(CUNode);
947 if (I == CUMap.end())
948 return FirstCU;
949 return I->second;
950}
951
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000952// Return const expression if value is a GEP to access merged global
Devang Patele449d1f2011-01-20 00:02:16 +0000953// constant. e.g.
954// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
955static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
956 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
957 if (!CE || CE->getNumOperands() != 3 ||
958 CE->getOpcode() != Instruction::GetElementPtr)
959 return NULL;
960
961 // First operand points to a global value.
962 if (!isa<GlobalValue>(CE->getOperand(0)))
963 return NULL;
964
965 // Second operand is zero.
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000966 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
Devang Patele449d1f2011-01-20 00:02:16 +0000967 if (!CI || !CI->isZero())
968 return NULL;
969
970 // Third operand is offset.
971 if (!isa<ConstantInt>(CE->getOperand(2)))
972 return NULL;
973
974 return CE;
975}
976
Devang Patel163a9f72010-05-10 22:49:55 +0000977/// constructGlobalVariableDIE - Construct global variable DIE.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000978void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
Devang Patel9fa539c2010-08-10 01:37:23 +0000979 DIGlobalVariable GV(N);
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000980
Devang Patel905cf5e2009-09-04 23:59:07 +0000981 // If debug information is malformed then ignore it.
Devang Patel9fa539c2010-08-10 01:37:23 +0000982 if (GV.Verify() == false)
Devang Patel905cf5e2009-09-04 23:59:07 +0000983 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000984
985 // Check for pre-existence.
Devang Patel163a9f72010-05-10 22:49:55 +0000986 CompileUnit *TheCU = getCompileUnit(N);
Devang Patel9fa539c2010-08-10 01:37:23 +0000987 if (TheCU->getDIE(GV))
Devang Patel13e16b62009-06-26 01:49:18 +0000988 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000989
Devang Patel9fa539c2010-08-10 01:37:23 +0000990 DIType GTy = GV.getType();
Devang Patel29368072010-08-10 07:11:13 +0000991 DIE *VariableDIE = new DIE(GV.getTag());
992
993 bool isGlobalVariable = GV.getGlobal() != NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000994
Devang Patel9fa539c2010-08-10 01:37:23 +0000995 // Add name.
Devang Patel3cbee302011-04-12 22:53:02 +0000996 TheCU->addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
997 GV.getDisplayName());
Devang Patel9fa539c2010-08-10 01:37:23 +0000998 StringRef LinkageName = GV.getLinkageName();
Devang Patel29368072010-08-10 07:11:13 +0000999 if (!LinkageName.empty() && isGlobalVariable)
Devang Patel3cbee302011-04-12 22:53:02 +00001000 TheCU->addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
1001 dwarf::DW_FORM_string,
1002 getRealLinkageName(LinkageName));
Devang Patel9fa539c2010-08-10 01:37:23 +00001003 // Add type.
Devang Patel3cbee302011-04-12 22:53:02 +00001004 TheCU->addType(VariableDIE, GTy);
Devang Patele9ae06c2011-05-31 22:56:51 +00001005
Devang Patel9fa539c2010-08-10 01:37:23 +00001006 // Add scoping info.
1007 if (!GV.isLocalToUnit()) {
Devang Patel3cbee302011-04-12 22:53:02 +00001008 TheCU->addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Devang Patel9fa539c2010-08-10 01:37:23 +00001009 // Expose as global.
1010 TheCU->addGlobal(GV.getName(), VariableDIE);
1011 }
1012 // Add line number info.
Devang Patel3cbee302011-04-12 22:53:02 +00001013 TheCU->addSourceLine(VariableDIE, GV);
Devang Patel9fa539c2010-08-10 01:37:23 +00001014 // Add to map.
1015 TheCU->insertDIE(N, VariableDIE);
1016 // Add to context owner.
1017 DIDescriptor GVContext = GV.getContext();
Devang Patel3cbee302011-04-12 22:53:02 +00001018 TheCU->addToContextOwner(VariableDIE, GVContext);
Devang Patel9fa539c2010-08-10 01:37:23 +00001019 // Add location.
Devang Patel29368072010-08-10 07:11:13 +00001020 if (isGlobalVariable) {
1021 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel3cbee302011-04-12 22:53:02 +00001022 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1023 TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata,
Devang Patel29368072010-08-10 07:11:13 +00001024 Asm->Mang->getSymbol(GV.getGlobal()));
1025 // Do not create specification DIE if context is either compile unit
1026 // or a subprogram.
1027 if (GV.isDefinition() && !GVContext.isCompileUnit() &&
1028 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1029 // Create specification DIE.
1030 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel3cbee302011-04-12 22:53:02 +00001031 TheCU->addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
Devang Patel29368072010-08-10 07:11:13 +00001032 dwarf::DW_FORM_ref4, VariableDIE);
Devang Patel3cbee302011-04-12 22:53:02 +00001033 TheCU->addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1034 TheCU->addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Devang Patel29368072010-08-10 07:11:13 +00001035 TheCU->addDie(VariableSpecDIE);
1036 } else {
Devang Patel3cbee302011-04-12 22:53:02 +00001037 TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Devang Patel29368072010-08-10 07:11:13 +00001038 }
Devang Patel8594d422011-06-24 20:46:11 +00001039 } else if (const ConstantInt *CI =
Devang Patel76a788c2011-01-06 21:39:25 +00001040 dyn_cast_or_null<ConstantInt>(GV.getConstant()))
Devang Patel3cbee302011-04-12 22:53:02 +00001041 TheCU->addConstantValue(VariableDIE, CI, isUnsignedDIType(GTy));
Devang Patele449d1f2011-01-20 00:02:16 +00001042 else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
1043 // GV is a merged global.
1044 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel3cbee302011-04-12 22:53:02 +00001045 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1046 TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata,
1047 Asm->Mang->getSymbol(cast<GlobalValue>(CE->getOperand(0))));
Devang Patele449d1f2011-01-20 00:02:16 +00001048 ConstantInt *CII = cast<ConstantInt>(CE->getOperand(2));
Devang Patel3cbee302011-04-12 22:53:02 +00001049 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1050 TheCU->addUInt(Block, 0, dwarf::DW_FORM_udata, CII->getZExtValue());
1051 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1052 TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Devang Patele449d1f2011-01-20 00:02:16 +00001053 }
Devang Patel76a788c2011-01-06 21:39:25 +00001054
Devang Patel13e16b62009-06-26 01:49:18 +00001055 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001056}
1057
Devang Patel163a9f72010-05-10 22:49:55 +00001058/// construct SubprogramDIE - Construct subprogram DIE.
Devang Patele9f8f5e2010-05-07 20:54:48 +00001059void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +00001060 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001061
Stuart Hastings639336e2010-04-06 21:38:29 +00001062 // Check for pre-existence.
Devang Patel163a9f72010-05-10 22:49:55 +00001063 CompileUnit *TheCU = getCompileUnit(N);
1064 if (TheCU->getDIE(N))
Stuart Hastings639336e2010-04-06 21:38:29 +00001065 return;
1066
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001067 if (!SP.isDefinition())
1068 // This is a method declaration which will be handled while constructing
1069 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +00001070 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001071
Stuart Hastings639336e2010-04-06 21:38:29 +00001072 DIE *SubprogramDie = createSubprogramDIE(SP);
1073
1074 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +00001075 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001076
1077 // Add to context owner.
Devang Patel3cbee302011-04-12 22:53:02 +00001078 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +00001079
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001080 // Expose as global.
Devang Patel163a9f72010-05-10 22:49:55 +00001081 TheCU->addGlobal(SP.getName(), SubprogramDie);
Devang Patel193f7202009-11-24 01:14:22 +00001082
Devang Patel13e16b62009-06-26 01:49:18 +00001083 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001084}
1085
Devang Patel2c4ceb12009-11-21 02:48:08 +00001086/// beginModule - Emit all Dwarf sections that should come prior to the
Daniel Dunbar00564992009-09-19 20:40:14 +00001087/// content. Create global DIEs and emit initial debug info sections.
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001088/// This is invoked by the target AsmPrinter.
Chris Lattner75f50722010-04-04 07:48:20 +00001089void DwarfDebug::beginModule(Module *M) {
Devang Pateleac9c072010-04-27 19:46:33 +00001090 if (DisableDebugInfoPrinting)
1091 return;
1092
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001093 // If module has named metadata anchors then use them, otherwise scan the
1094 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +00001095 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
1096 if (CU_Nodes) {
Devang Patela938dd02011-05-04 16:34:02 +00001097
1098 NamedMDNode *GV_Nodes = M->getNamedMetadata("llvm.dbg.gv");
1099 NamedMDNode *SP_Nodes = M->getNamedMetadata("llvm.dbg.sp");
1100 if (!GV_Nodes && !SP_Nodes)
1101 // If there are not any global variables or any functions then
1102 // there is not any debug info in this module.
Devang Patel30692ab2011-05-03 16:45:22 +00001103 return;
1104
Devang Patela938dd02011-05-04 16:34:02 +00001105 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i)
1106 constructCompileUnit(CU_Nodes->getOperand(i));
Devang Patel30692ab2011-05-03 16:45:22 +00001107
Devang Patela938dd02011-05-04 16:34:02 +00001108 if (GV_Nodes)
1109 for (unsigned i = 0, e = GV_Nodes->getNumOperands(); i != e; ++i)
1110 constructGlobalVariableDIE(GV_Nodes->getOperand(i));
1111
1112 if (SP_Nodes)
1113 for (unsigned i = 0, e = SP_Nodes->getNumOperands(); i != e; ++i)
1114 constructSubprogramDIE(SP_Nodes->getOperand(i));
Devang Patel30692ab2011-05-03 16:45:22 +00001115
1116 } else {
1117
1118 DebugInfoFinder DbgFinder;
1119 DbgFinder.processModule(*M);
1120
Devang Patela938dd02011-05-04 16:34:02 +00001121 bool HasDebugInfo = false;
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001122 // Scan all the compile-units to see if there are any marked as the main
1123 // unit. If not, we do not generate debug info.
Devang Patel30692ab2011-05-03 16:45:22 +00001124 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1125 E = DbgFinder.compile_unit_end(); I != E; ++I) {
1126 if (DICompileUnit(*I).isMain()) {
1127 HasDebugInfo = true;
1128 break;
1129 }
1130 }
Devang Patela938dd02011-05-04 16:34:02 +00001131 if (!HasDebugInfo) return;
Devang Patel30692ab2011-05-03 16:45:22 +00001132
1133 // Create all the compile unit DIEs.
1134 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1135 E = DbgFinder.compile_unit_end(); I != E; ++I)
1136 constructCompileUnit(*I);
1137
1138 // Create DIEs for each global variable.
1139 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1140 E = DbgFinder.global_variable_end(); I != E; ++I)
1141 constructGlobalVariableDIE(*I);
1142
1143 // Create DIEs for each subprogram.
1144 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1145 E = DbgFinder.subprogram_end(); I != E; ++I)
1146 constructSubprogramDIE(*I);
Chris Lattnerd850ac72010-04-05 02:19:28 +00001147 }
Devang Patel30692ab2011-05-03 16:45:22 +00001148
Chris Lattnerd850ac72010-04-05 02:19:28 +00001149 // Tell MMI that we have debug info.
1150 MMI->setDebugInfoAvailability(true);
Devang Patel30692ab2011-05-03 16:45:22 +00001151
Chris Lattnerbe15beb2010-04-04 23:17:54 +00001152 // Emit initial sections.
Chris Lattnerd850ac72010-04-05 02:19:28 +00001153 EmitSectionLabels();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001154
Devang Patele7e5a0f2010-08-10 20:01:20 +00001155 //getOrCreateTypeDIE
1156 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
Devang Patel3cbee302011-04-12 22:53:02 +00001157 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1158 DIType Ty(NMD->getOperand(i));
1159 getCompileUnit(Ty)->getOrCreateTypeDIE(Ty);
1160 }
Devang Patele7e5a0f2010-08-10 20:01:20 +00001161
Devang Patel1a7ca032010-09-28 18:08:20 +00001162 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
Devang Patel3cbee302011-04-12 22:53:02 +00001163 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1164 DIType Ty(NMD->getOperand(i));
1165 getCompileUnit(Ty)->getOrCreateTypeDIE(Ty);
1166 }
Devang Patel1a7ca032010-09-28 18:08:20 +00001167
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001168 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +00001169 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001170}
1171
Devang Patel2c4ceb12009-11-21 02:48:08 +00001172/// endModule - Emit all Dwarf sections that should come after the content.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001173///
Devang Patel2c4ceb12009-11-21 02:48:08 +00001174void DwarfDebug::endModule() {
Devang Patel163a9f72010-05-10 22:49:55 +00001175 if (!FirstCU) return;
Devang Patel4a1cad62010-06-28 18:25:03 +00001176 const Module *M = MMI->getModule();
Devang Patele9a1cca2010-08-02 17:32:15 +00001177 DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
Devang Patel4a1cad62010-06-28 18:25:03 +00001178 if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
1179 for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
1180 if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
1181 DISubprogram SP(AllSPs->getOperand(SI));
1182 if (!SP.Verify()) continue;
1183
1184 // Collect info for variables that were optimized out.
Devang Patel8b3a6b62010-07-19 17:53:55 +00001185 if (!SP.isDefinition()) continue;
Devang Patel4a1cad62010-06-28 18:25:03 +00001186 StringRef FName = SP.getLinkageName();
1187 if (FName.empty())
1188 FName = SP.getName();
Devang Patel62367042010-11-10 22:19:21 +00001189 NamedMDNode *NMD = getFnSpecificMDNode(*(MMI->getModule()), FName);
Devang Patel4a1cad62010-06-28 18:25:03 +00001190 if (!NMD) continue;
1191 unsigned E = NMD->getNumOperands();
1192 if (!E) continue;
1193 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
Devang Patele9a1cca2010-08-02 17:32:15 +00001194 DeadFnScopeMap[SP] = Scope;
Devang Patel4a1cad62010-06-28 18:25:03 +00001195 for (unsigned I = 0; I != E; ++I) {
1196 DIVariable DV(NMD->getOperand(I));
1197 if (!DV.Verify()) continue;
1198 Scope->addVariable(new DbgVariable(DV));
1199 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001200
Devang Patel4a1cad62010-06-28 18:25:03 +00001201 // Construct subprogram DIE and add variables DIEs.
1202 constructSubprogramDIE(SP);
1203 DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
Devang Patele03161c2010-08-09 18:51:29 +00001204 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
Devang Patel4a1cad62010-06-28 18:25:03 +00001205 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1206 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1207 if (VariableDIE)
1208 ScopeDIE->addChild(VariableDIE);
1209 }
1210 }
1211 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001212
Devang Patel53bb5c92009-11-10 23:06:00 +00001213 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1214 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1215 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1216 DIE *ISP = *AI;
Devang Patel3cbee302011-04-12 22:53:02 +00001217 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +00001218 }
1219
Devang Patele9f8f5e2010-05-07 20:54:48 +00001220 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Devang Patel5d11eb02009-12-03 19:11:07 +00001221 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1222 DIE *SPDie = CI->first;
Devang Patele9f8f5e2010-05-07 20:54:48 +00001223 const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
Devang Patel5d11eb02009-12-03 19:11:07 +00001224 if (!N) continue;
Devang Patel163a9f72010-05-10 22:49:55 +00001225 DIE *NDie = getCompileUnit(N)->getDIE(N);
Devang Patel5d11eb02009-12-03 19:11:07 +00001226 if (!NDie) continue;
Devang Patel3cbee302011-04-12 22:53:02 +00001227 getCompileUnit(N)->addDIEEntry(SPDie, dwarf::DW_AT_containing_type,
1228 dwarf::DW_FORM_ref4, NDie);
Devang Patel5d11eb02009-12-03 19:11:07 +00001229 }
1230
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001231 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001232 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00001233 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001234 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00001235 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001236
1237 // End text sections.
1238 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001239 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Chris Lattnerc0215722010-04-04 19:25:43 +00001240 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001241 }
1242
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001243 // Compute DIE offsets and sizes.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001244 computeSizeAndOffsets();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001245
1246 // Emit all the DIEs into a debug info section
Devang Patel2c4ceb12009-11-21 02:48:08 +00001247 emitDebugInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001248
1249 // Corresponding abbreviations into a abbrev section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001250 emitAbbreviations();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001251
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001252 // Emit info into a debug pubnames section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001253 emitDebugPubNames();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001254
Devang Patel193f7202009-11-24 01:14:22 +00001255 // Emit info into a debug pubtypes section.
1256 emitDebugPubTypes();
1257
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001258 // Emit info into a debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001259 emitDebugLoc();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001260
1261 // Emit info into a debug aranges section.
1262 EmitDebugARanges();
1263
1264 // Emit info into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001265 emitDebugRanges();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001266
1267 // Emit info into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001268 emitDebugMacInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001269
1270 // Emit inline info.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001271 emitDebugInlineInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001272
Chris Lattnerbc733f52010-03-13 02:17:42 +00001273 // Emit info into a debug str section.
1274 emitDebugStr();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001275
Devang Patele9a1cca2010-08-02 17:32:15 +00001276 // clean up.
1277 DeleteContainerSeconds(DeadFnScopeMap);
Devang Patel163a9f72010-05-10 22:49:55 +00001278 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1279 E = CUMap.end(); I != E; ++I)
1280 delete I->second;
1281 FirstCU = NULL; // Reset for the next Module, if any.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001282}
1283
Devang Patel53bb5c92009-11-10 23:06:00 +00001284/// findAbstractVariable - Find abstract variable, if any, associated with Var.
Devang Patelc8fcfc92011-07-19 22:31:15 +00001285DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattnerde4845c2010-04-02 19:42:39 +00001286 DebugLoc ScopeLoc) {
Devang Patelc8fcfc92011-07-19 22:31:15 +00001287 LLVMContext &Ctx = DV->getContext();
1288
1289 // More then one inlined variable corresponds to one abstract variable.
1290 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patel53bb5c92009-11-10 23:06:00 +00001291
Devang Patel2db49d72010-05-07 18:11:54 +00001292 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00001293 if (AbsDbgVariable)
1294 return AbsDbgVariable;
1295
Devang Patelc8fcfc92011-07-19 22:31:15 +00001296
Chris Lattnerde4845c2010-04-02 19:42:39 +00001297 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00001298 if (!Scope)
1299 return NULL;
1300
Devang Patel26c1e562010-05-20 16:36:41 +00001301 AbsDbgVariable = new DbgVariable(Var);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001302 Scope->addVariable(AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00001303 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00001304 return AbsDbgVariable;
1305}
1306
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001307/// addCurrentFnArgument - If Var is a current function argument then add
1308/// it to CurrentFnArguments list.
Devang Patel0478c152011-03-01 22:58:55 +00001309bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
1310 DbgVariable *Var, DbgScope *Scope) {
1311 if (Scope != CurrentFnDbgScope)
1312 return false;
1313 DIVariable DV = Var->getVariable();
1314 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1315 return false;
1316 unsigned ArgNo = DV.getArgNumber();
1317 if (ArgNo == 0)
1318 return false;
1319
Devang Patelcb3a6572011-03-03 20:02:02 +00001320 size_t Size = CurrentFnArguments.size();
1321 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001322 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00001323 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00001324 // arguments does the function have at source level.
1325 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00001326 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00001327 CurrentFnArguments[ArgNo - 1] = Var;
1328 return true;
1329}
1330
Devang Patelee432862010-05-20 19:57:06 +00001331/// collectVariableInfoFromMMITable - Collect variable information from
1332/// side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001333void
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001334DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patelee432862010-05-20 19:57:06 +00001335 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patele717faa2009-10-06 01:26:37 +00001336 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1337 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1338 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00001339 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00001340 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00001341 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00001342 DIVariable DV(Var);
1343 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00001344
Devang Patel9b4a1722011-07-14 23:17:49 +00001345 DbgScope *Scope = findDbgScope(VP.second);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001346
Devang Patelfb0ee432009-11-10 23:20:04 +00001347 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00001348 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00001349 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001350
Devang Patel26c1e562010-05-20 16:36:41 +00001351 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
1352 DbgVariable *RegVar = new DbgVariable(DV);
1353 recordVariableFrameIndex(RegVar, VP.first);
Devang Patel0478c152011-03-01 22:58:55 +00001354 if (!addCurrentFnArgument(MF, RegVar, Scope))
1355 Scope->addVariable(RegVar);
Devang Patel26c1e562010-05-20 16:36:41 +00001356 if (AbsDbgVariable) {
1357 recordVariableFrameIndex(AbsDbgVariable, VP.first);
1358 VarToAbstractVarMap[RegVar] = AbsDbgVariable;
1359 }
Devang Patele717faa2009-10-06 01:26:37 +00001360 }
Devang Patelee432862010-05-20 19:57:06 +00001361}
Devang Patel90a48ad2010-03-15 18:33:46 +00001362
Jim Grosbach1e20b962010-07-21 21:21:52 +00001363/// isDbgValueInDefinedReg - Return true if debug value, encoded by
Devang Patelc3f5f782010-05-25 23:40:22 +00001364/// DBG_VALUE instruction, is in a defined reg.
1365static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
1366 assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001367 return MI->getNumOperands() == 3 &&
1368 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1369 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
Devang Patelc3f5f782010-05-25 23:40:22 +00001370}
1371
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001372/// getDebugLocEntry - Get .debug_loc entry for the instruction range starting
Devang Patel90b40412011-07-08 17:09:57 +00001373/// at MI.
1374static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1375 const MCSymbol *FLabel,
1376 const MCSymbol *SLabel,
1377 const MachineInstr *MI) {
1378 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1379
1380 if (MI->getNumOperands() != 3) {
1381 MachineLocation MLoc = Asm->getDebugValueLocation(MI);
1382 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1383 }
1384 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
1385 MachineLocation MLoc;
1386 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
1387 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1388 }
1389 if (MI->getOperand(0).isImm())
1390 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1391 if (MI->getOperand(0).isFPImm())
1392 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1393 if (MI->getOperand(0).isCImm())
1394 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1395
1396 assert (0 && "Unexpected 3 operand DBG_VALUE instruction!");
1397 return DotDebugLocEntry();
1398}
1399
Devang Patelee432862010-05-20 19:57:06 +00001400/// collectVariableInfo - Populate DbgScope entries with variables' info.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001401void
Devang Patel78e127d2010-06-25 22:07:34 +00001402DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1403 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001404
Devang Patelee432862010-05-20 19:57:06 +00001405 /// collection info from MMI table.
1406 collectVariableInfoFromMMITable(MF, Processed);
1407
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001408 for (SmallVectorImpl<const MDNode*>::const_iterator
1409 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1410 ++UVI) {
1411 const MDNode *Var = *UVI;
1412 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00001413 continue;
1414
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001415 // History contains relevant DBG_VALUE instructions for Var and instructions
1416 // clobbering it.
1417 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1418 if (History.empty())
1419 continue;
1420 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00001421
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001422 DIVariable DV(Var);
Devang Patela36478f2011-01-11 21:42:10 +00001423 DbgScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00001424 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1425 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelc0c5a262010-05-21 00:10:20 +00001426 Scope = CurrentFnDbgScope;
Devang Patel40c7e412011-07-20 22:18:50 +00001427 else {
1428 if (DV.getVersion() <= LLVMDebugVersion9)
1429 Scope = findDbgScope(MInsn->getDebugLoc());
1430 else {
1431 if (MDNode *IA = DV.getInlinedAt())
1432 Scope = InlinedDbgScopeMap.lookup(DebugLoc::getFromDILocation(IA));
1433 else
1434 Scope = DbgScopeMap.lookup(cast<MDNode>(DV->getOperand(1)));
1435 }
1436 }
Devang Patelee432862010-05-20 19:57:06 +00001437 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00001438 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001439 continue;
1440
1441 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001442 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patelee432862010-05-20 19:57:06 +00001443 DbgVariable *RegVar = new DbgVariable(DV);
Devang Patel0478c152011-03-01 22:58:55 +00001444 if (!addCurrentFnArgument(MF, RegVar, Scope))
1445 Scope->addVariable(RegVar);
Devang Patelc0c5a262010-05-21 00:10:20 +00001446 if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
1447 DbgVariableToDbgInstMap[AbsVar] = MInsn;
1448 VarToAbstractVarMap[RegVar] = AbsVar;
Devang Patel90a48ad2010-03-15 18:33:46 +00001449 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001450
1451 // Simple ranges that are fully coalesced.
1452 if (History.size() <= 1 || (History.size() == 2 &&
1453 MInsn->isIdenticalTo(History.back()))) {
Devang Patelc3f5f782010-05-25 23:40:22 +00001454 DbgVariableToDbgInstMap[RegVar] = MInsn;
1455 continue;
1456 }
1457
1458 // handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001459 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001460
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001461 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1462 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1463 const MachineInstr *Begin = *HI;
1464 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001465
Devang Patel4ada1d72011-06-01 23:00:17 +00001466 // Check if DBG_VALUE is truncating a range.
1467 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1468 && !Begin->getOperand(0).getReg())
1469 continue;
1470
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001471 // Compute the range for a register location.
1472 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1473 const MCSymbol *SLabel = 0;
1474
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001475 if (HI + 1 == HE)
1476 // If Begin is the last instruction in History then its value is valid
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001477 // until the end of the function.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001478 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001479 else {
1480 const MachineInstr *End = HI[1];
Devang Patel476df5f2011-07-07 21:44:42 +00001481 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
1482 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001483 if (End->isDebugValue())
1484 SLabel = getLabelBeforeInsn(End);
1485 else {
1486 // End is a normal instruction clobbering the range.
1487 SLabel = getLabelAfterInsn(End);
1488 assert(SLabel && "Forgot label after clobber instruction");
1489 ++HI;
1490 }
1491 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001492
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001493 // The value is valid until the next DBG_VALUE or clobber.
Devang Patel90b40412011-07-08 17:09:57 +00001494 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel, Begin));
Devang Patelc3f5f782010-05-25 23:40:22 +00001495 }
1496 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00001497 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001498
1499 // Collect info for variables that were optimized out.
Devang Pateld1bbc6b2010-06-22 01:01:58 +00001500 const Function *F = MF->getFunction();
Devang Patel62367042010-11-10 22:19:21 +00001501 if (NamedMDNode *NMD = getFnSpecificMDNode(*(F->getParent()), F->getName())) {
Devang Patel98e1cac2010-05-14 21:01:35 +00001502 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
Dan Gohman872814a2010-07-21 18:54:18 +00001503 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
Devang Patelee432862010-05-20 19:57:06 +00001504 if (!DV || !Processed.insert(DV))
Devang Patel98e1cac2010-05-14 21:01:35 +00001505 continue;
1506 DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
1507 if (Scope)
Devang Patel26c1e562010-05-20 16:36:41 +00001508 Scope->addVariable(new DbgVariable(DV));
Devang Patel98e1cac2010-05-14 21:01:35 +00001509 }
1510 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001511}
Devang Patel98e1cac2010-05-14 21:01:35 +00001512
Devang Patelc3f5f782010-05-25 23:40:22 +00001513/// getLabelBeforeInsn - Return Label preceding the instruction.
1514const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001515 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1516 assert(Label && "Didn't insert label before instruction");
1517 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001518}
1519
1520/// getLabelAfterInsn - Return Label immediately following the instruction.
1521const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001522 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001523}
1524
Devang Patelcbbe2872010-10-26 17:49:02 +00001525/// beginInstruction - Process beginning of an instruction.
1526void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001527 // Check if source location changes, but ignore DBG_VALUE locations.
1528 if (!MI->isDebugValue()) {
1529 DebugLoc DL = MI->getDebugLoc();
1530 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Devang Patel4243e672011-05-11 19:22:19 +00001531 unsigned Flags = DWARF2_FLAG_IS_STMT;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001532 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001533 if (DL == PrologEndLoc) {
1534 Flags |= DWARF2_FLAG_PROLOGUE_END;
1535 PrologEndLoc = DebugLoc();
1536 }
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001537 if (!DL.isUnknown()) {
1538 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001539 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001540 } else
Devang Patel4243e672011-05-11 19:22:19 +00001541 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001542 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001543 }
Devang Patelaead63c2010-03-29 22:59:58 +00001544
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001545 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001546 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1547 LabelsBeforeInsn.find(MI);
1548
1549 // No label needed.
1550 if (I == LabelsBeforeInsn.end())
1551 return;
1552
1553 // Label already assigned.
1554 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001555 return;
Devang Patel553881b2010-03-29 17:20:31 +00001556
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001557 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001558 PrevLabel = MMI->getContext().CreateTempSymbol();
1559 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001560 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001561 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001562}
1563
Devang Patelcbbe2872010-10-26 17:49:02 +00001564/// endInstruction - Process end of an instruction.
1565void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001566 // Don't create a new label after DBG_VALUE instructions.
1567 // They don't generate code.
1568 if (!MI->isDebugValue())
1569 PrevLabel = 0;
1570
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001571 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1572 LabelsAfterInsn.find(MI);
1573
1574 // No label needed.
1575 if (I == LabelsAfterInsn.end())
1576 return;
1577
1578 // Label already assigned.
1579 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001580 return;
1581
1582 // We need a label after this instruction.
1583 if (!PrevLabel) {
1584 PrevLabel = MMI->getContext().CreateTempSymbol();
1585 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001586 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001587 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001588}
1589
Devang Patel3737b892011-07-20 23:00:27 +00001590/// getOrCreateRegularScope - Create regular DbgScope.
1591DbgScope *DwarfDebug::getOrCreateRegularScope(MDNode *Scope) {
1592 DbgScope *WScope = DbgScopeMap.lookup(Scope);
1593 if (WScope)
1594 return WScope;
1595 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
1596 DbgScopeMap.insert(std::make_pair(Scope, WScope));
1597 if (DIDescriptor(Scope).isLexicalBlock()) {
1598 DbgScope *Parent =
1599 getOrCreateDbgScope(DebugLoc::getFromDILexicalBlock(Scope));
1600 WScope->setParent(Parent);
1601 Parent->addScope(WScope);
1602 } else if (DIDescriptor(Scope).isSubprogram()
1603 && DISubprogram(Scope).describes(Asm->MF->getFunction()))
1604 CurrentFnDbgScope = WScope;
1605
1606 return WScope;
1607}
1608
1609/// getOrCreateInlinedScope - Create inlined scope.
1610DbgScope *DwarfDebug::getOrCreateInlinedScope(MDNode *Scope, MDNode *InlinedAt){
1611 DbgScope *InlinedScope = DbgScopeMap.lookup(InlinedAt);
1612 if (InlinedScope)
1613 return InlinedScope;
1614
1615 InlinedScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
1616 DebugLoc InlinedLoc = DebugLoc::getFromDILocation(InlinedAt);
1617 InlinedDbgScopeMap[InlinedLoc] = InlinedScope;
1618 DbgScopeMap[InlinedAt] = InlinedScope;
1619 DbgScope *Parent = getOrCreateDbgScope(InlinedLoc);
1620 InlinedScope->setParent(Parent);
1621 Parent->addScope(InlinedScope);
1622 return InlinedScope;
1623}
1624
Devang Pateleac9c072010-04-27 19:46:33 +00001625/// getOrCreateDbgScope - Create DbgScope for the scope.
Devang Patel4f455d62011-07-14 22:30:56 +00001626DbgScope *DwarfDebug::getOrCreateDbgScope(DebugLoc DL) {
1627 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
Devang Pateld77ec622011-07-14 01:14:57 +00001628 MDNode *Scope = NULL;
1629 MDNode *InlinedAt = NULL;
1630 DL.getScopeAndInlinedAt(Scope, InlinedAt, Ctx);
Devang Patel3737b892011-07-20 23:00:27 +00001631 if (!InlinedAt)
1632 return getOrCreateRegularScope(Scope);
Devang Pateld77ec622011-07-14 01:14:57 +00001633
Devang Patel3737b892011-07-20 23:00:27 +00001634 // Create an abstract scope for inlined function.
Devang Patel78e127d2010-06-25 22:07:34 +00001635 getOrCreateAbstractScope(Scope);
Devang Patel3737b892011-07-20 23:00:27 +00001636 // Create an inlined scope for inlined function.
1637 return getOrCreateInlinedScope(Scope, InlinedAt);
Devang Patel0d20ac82009-10-06 01:50:42 +00001638}
1639
Devang Pateleac9c072010-04-27 19:46:33 +00001640/// calculateDominanceGraph - Calculate dominance graph for DbgScope
1641/// hierarchy.
1642static void calculateDominanceGraph(DbgScope *Scope) {
1643 assert (Scope && "Unable to calculate scop edominance graph!");
1644 SmallVector<DbgScope *, 4> WorkStack;
1645 WorkStack.push_back(Scope);
1646 unsigned Counter = 0;
1647 while (!WorkStack.empty()) {
1648 DbgScope *WS = WorkStack.back();
1649 const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
1650 bool visitedChildren = false;
1651 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
1652 SE = Children.end(); SI != SE; ++SI) {
1653 DbgScope *ChildScope = *SI;
1654 if (!ChildScope->getDFSOut()) {
1655 WorkStack.push_back(ChildScope);
1656 visitedChildren = true;
1657 ChildScope->setDFSIn(++Counter);
Devang Patel26a92002011-07-27 00:34:13 +00001658#ifndef NDEBUG
1659 if (PrintDbgScope)
1660 dbgs() << "calculate dbgscope dom: In " << Counter << "\n";
1661#endif
Devang Pateleac9c072010-04-27 19:46:33 +00001662 break;
1663 }
1664 }
1665 if (!visitedChildren) {
1666 WorkStack.pop_back();
1667 WS->setDFSOut(++Counter);
Devang Patel26a92002011-07-27 00:34:13 +00001668#ifndef NDEBUG
1669 if (PrintDbgScope)
1670 dbgs() << "calculate dbgscope dom: In " << WS->getDFSIn()
1671 << " Out " << Counter << "\n";
1672#endif
Devang Pateleac9c072010-04-27 19:46:33 +00001673 }
1674 }
1675}
1676
1677/// printDbgScopeInfo - Print DbgScope info for each machine instruction.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001678static
Devang Patel4f455d62011-07-14 22:30:56 +00001679void printDbgScopeInfo(const MachineFunction *MF,
Devang Pateleac9c072010-04-27 19:46:33 +00001680 DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
1681{
1682#ifndef NDEBUG
Devang Patel4f455d62011-07-14 22:30:56 +00001683 LLVMContext &Ctx = MF->getFunction()->getContext();
Devang Pateleac9c072010-04-27 19:46:33 +00001684 unsigned PrevDFSIn = 0;
1685 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1686 I != E; ++I) {
1687 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1688 II != IE; ++II) {
1689 const MachineInstr *MInsn = II;
Devang Patel0cd0c242011-07-14 00:20:24 +00001690 MDNode *Scope = NULL;
1691 MDNode *InlinedAt = NULL;
Devang Pateleac9c072010-04-27 19:46:33 +00001692
1693 // Check if instruction has valid location information.
Devang Patel0cd0c242011-07-14 00:20:24 +00001694 DebugLoc MIDL = MInsn->getDebugLoc();
1695 if (!MIDL.isUnknown()) {
1696 MIDL.getScopeAndInlinedAt(Scope, InlinedAt, Ctx);
Devang Pateleac9c072010-04-27 19:46:33 +00001697 dbgs() << " [ ";
Jim Grosbach1e20b962010-07-21 21:21:52 +00001698 if (InlinedAt)
Devang Pateleac9c072010-04-27 19:46:33 +00001699 dbgs() << "*";
Jim Grosbach1e20b962010-07-21 21:21:52 +00001700 DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
Devang Pateleac9c072010-04-27 19:46:33 +00001701 MI2ScopeMap.find(MInsn);
1702 if (DI != MI2ScopeMap.end()) {
1703 DbgScope *S = DI->second;
1704 dbgs() << S->getDFSIn();
1705 PrevDFSIn = S->getDFSIn();
1706 } else
1707 dbgs() << PrevDFSIn;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001708 } else
Devang Pateleac9c072010-04-27 19:46:33 +00001709 dbgs() << " [ x" << PrevDFSIn;
1710 dbgs() << " ]";
1711 MInsn->dump();
1712 }
1713 dbgs() << "\n";
1714 }
1715#endif
1716}
Devang Patel2c4ceb12009-11-21 02:48:08 +00001717/// extractScopeInformation - Scan machine instructions in this function
Chris Lattner14d750d2010-03-31 05:39:57 +00001718/// and collect DbgScopes. Return true, if at least one scope was found.
Chris Lattnereec791a2010-01-26 23:18:02 +00001719bool DwarfDebug::extractScopeInformation() {
Devang Patelaf9e8472009-10-01 20:31:14 +00001720 // If scope information was extracted using .dbg intrinsics then there is not
1721 // any need to extract these information by scanning each instruction.
1722 if (!DbgScopeMap.empty())
1723 return false;
1724
Dan Gohman314bf7c2010-04-23 01:18:53 +00001725 // Scan each instruction and create scopes. First build working set of scopes.
Devang Pateleac9c072010-04-27 19:46:33 +00001726 SmallVector<DbgRange, 4> MIRanges;
1727 DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
Chris Lattnerd38fee82010-04-05 00:13:49 +00001728 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
Devang Patelaf9e8472009-10-01 20:31:14 +00001729 I != E; ++I) {
Devang Patela671a302011-07-26 18:09:53 +00001730 const MachineInstr *RangeBeginMI = NULL;
1731 const MachineInstr *PrevMI = NULL;
1732 DebugLoc PrevDL;
Devang Patelaf9e8472009-10-01 20:31:14 +00001733 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1734 II != IE; ++II) {
1735 const MachineInstr *MInsn = II;
Devang Pateleac9c072010-04-27 19:46:33 +00001736
1737 // Check if instruction has valid location information.
Devang Patel0cd0c242011-07-14 00:20:24 +00001738 const DebugLoc MIDL = MInsn->getDebugLoc();
1739 if (MIDL.isUnknown()) {
Devang Pateleac9c072010-04-27 19:46:33 +00001740 PrevMI = MInsn;
1741 continue;
1742 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001743
Devang Pateleac9c072010-04-27 19:46:33 +00001744 // If scope has not changed then skip this instruction.
Devang Pateld77ec622011-07-14 01:14:57 +00001745 if (MIDL == PrevDL) {
Devang Pateleac9c072010-04-27 19:46:33 +00001746 PrevMI = MInsn;
1747 continue;
1748 }
1749
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001750 // Ignore DBG_VALUE. It does not contribute to any instruction in output.
Devang Pateld3526ea2011-02-15 17:56:09 +00001751 if (MInsn->isDebugValue())
1752 continue;
1753
Jim Grosbach1e20b962010-07-21 21:21:52 +00001754 if (RangeBeginMI) {
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001755 // If we have already seen a beginning of an instruction range and
Devang Pateleac9c072010-04-27 19:46:33 +00001756 // current instruction scope does not match scope of first instruction
1757 // in this range then create a new instruction range.
Devang Patel0f16a4e2011-07-14 00:04:53 +00001758 DEBUG(dbgs() << "Creating new instruction range :\n");
Devang Patel5fc0d882011-07-14 00:03:58 +00001759 DEBUG(dbgs() << "Begin Range at " << *RangeBeginMI);
1760 DEBUG(dbgs() << "End Range at " << *PrevMI);
Devang Patel0f16a4e2011-07-14 00:04:53 +00001761 DEBUG(dbgs() << "Next Range starting at " << *MInsn);
Devang Patel5fc0d882011-07-14 00:03:58 +00001762 DEBUG(dbgs() << "------------------------\n");
Devang Pateleac9c072010-04-27 19:46:33 +00001763 DbgRange R(RangeBeginMI, PrevMI);
Devang Patel4f455d62011-07-14 22:30:56 +00001764 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevDL);
Devang Pateleac9c072010-04-27 19:46:33 +00001765 MIRanges.push_back(R);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001766 }
Devang Pateleac9c072010-04-27 19:46:33 +00001767
1768 // This is a beginning of a new instruction range.
1769 RangeBeginMI = MInsn;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001770
Devang Pateleac9c072010-04-27 19:46:33 +00001771 // Reset previous markers.
1772 PrevMI = MInsn;
Devang Pateld77ec622011-07-14 01:14:57 +00001773 PrevDL = MIDL;
Devang Patel53bb5c92009-11-10 23:06:00 +00001774 }
Devang Patel53bb5c92009-11-10 23:06:00 +00001775
Devang Patela671a302011-07-26 18:09:53 +00001776 // Create last instruction range.
1777 if (RangeBeginMI && PrevMI && !PrevDL.isUnknown()) {
1778 DbgRange R(RangeBeginMI, PrevMI);
1779 MIRanges.push_back(R);
1780 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevDL);
1781 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001782 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001783
Devang Patel344130e2010-01-04 20:44:00 +00001784 if (!CurrentFnDbgScope)
1785 return false;
1786
Devang Pateleac9c072010-04-27 19:46:33 +00001787 calculateDominanceGraph(CurrentFnDbgScope);
1788 if (PrintDbgScope)
Devang Patel4f455d62011-07-14 22:30:56 +00001789 printDbgScopeInfo(Asm->MF, MI2ScopeMap);
Devang Pateleac9c072010-04-27 19:46:33 +00001790
1791 // Find ranges of instructions covered by each DbgScope;
1792 DbgScope *PrevDbgScope = NULL;
1793 for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
1794 RE = MIRanges.end(); RI != RE; ++RI) {
1795 const DbgRange &R = *RI;
1796 DbgScope *S = MI2ScopeMap.lookup(R.first);
1797 assert (S && "Lost DbgScope for a machine instruction!");
1798 if (PrevDbgScope && !PrevDbgScope->dominates(S))
1799 PrevDbgScope->closeInsnRange(S);
1800 S->openInsnRange(R.first);
1801 S->extendInsnRange(R.second);
1802 PrevDbgScope = S;
1803 }
1804
1805 if (PrevDbgScope)
1806 PrevDbgScope->closeInsnRange();
Devang Patelaf9e8472009-10-01 20:31:14 +00001807
Devang Patele37b0c62010-04-08 18:43:56 +00001808 identifyScopeMarkers();
Devang Patel6122a4d2010-04-08 15:37:09 +00001809
1810 return !DbgScopeMap.empty();
1811}
1812
Jim Grosbach1e20b962010-07-21 21:21:52 +00001813/// identifyScopeMarkers() -
Devang Pateleac9c072010-04-27 19:46:33 +00001814/// Each DbgScope has first instruction and last instruction to mark beginning
1815/// and end of a scope respectively. Create an inverse map that list scopes
1816/// starts (and ends) with an instruction. One instruction may start (or end)
1817/// multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001818void DwarfDebug::identifyScopeMarkers() {
Devang Patel42aafd72010-01-20 02:05:23 +00001819 SmallVector<DbgScope *, 4> WorkList;
1820 WorkList.push_back(CurrentFnDbgScope);
1821 while (!WorkList.empty()) {
Chris Lattner14d750d2010-03-31 05:39:57 +00001822 DbgScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001823
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001824 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001825 if (!Children.empty())
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001826 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00001827 SE = Children.end(); SI != SE; ++SI)
1828 WorkList.push_back(*SI);
1829
Devang Patel53bb5c92009-11-10 23:06:00 +00001830 if (S->isAbstractScope())
1831 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001832
Devang Pateleac9c072010-04-27 19:46:33 +00001833 const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
1834 if (Ranges.empty())
1835 continue;
1836 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1837 RE = Ranges.end(); RI != RE; ++RI) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001838 assert(RI->first && "DbgRange does not have first instruction!");
1839 assert(RI->second && "DbgRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001840 requestLabelBeforeInsn(RI->first);
1841 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001842 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001843 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001844}
1845
Devang Patela3f48672011-05-09 22:14:49 +00001846/// getScopeNode - Get MDNode for DebugLoc's scope.
1847static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1848 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1849 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1850 return DL.getScope(Ctx);
1851}
1852
Devang Patel4243e672011-05-11 19:22:19 +00001853/// getFnDebugLoc - Walk up the scope chain of given debug loc and find
1854/// line number info for the function.
1855static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1856 const MDNode *Scope = getScopeNode(DL, Ctx);
1857 DISubprogram SP = getDISubprogram(Scope);
1858 if (SP.Verify())
1859 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1860 return DebugLoc();
1861}
1862
Devang Patel2c4ceb12009-11-21 02:48:08 +00001863/// beginFunction - Gather pre-function debug information. Assumes being
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001864/// emitted immediately after the function entry point.
Chris Lattnereec791a2010-01-26 23:18:02 +00001865void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00001866 if (!MMI->hasDebugInfo()) return;
Bill Wendling5f017e82010-04-07 09:28:04 +00001867 if (!extractScopeInformation()) return;
Devang Patel60b35bd2009-10-06 18:37:31 +00001868
Devang Pateleac9c072010-04-27 19:46:33 +00001869 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1870 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001871 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001872 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001873
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001874 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1875
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001876 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001877 /// LiveUserVar - Map physreg numbers to the MDNode they contain.
1878 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1879
Devang Patelb2b31a62010-05-26 19:37:24 +00001880 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001881 I != E; ++I) {
1882 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00001883 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1884 II != IE; ++II) {
1885 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001886
Devang Patelb2b31a62010-05-26 19:37:24 +00001887 if (MI->isDebugValue()) {
Devang Patelb2b31a62010-05-26 19:37:24 +00001888 assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001889
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001890 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001891 const MDNode *Var =
1892 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001893
1894 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001895 if (isDbgValueInDefinedReg(MI))
1896 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1897
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001898 // Check the history of this variable.
1899 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1900 if (History.empty()) {
1901 UserVariables.push_back(Var);
1902 // The first mention of a function argument gets the FunctionBeginSym
1903 // label, so arguments are visible when breaking at function entry.
1904 DIVariable DV(Var);
1905 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1906 DISubprogram(getDISubprogram(DV.getContext()))
1907 .describes(MF->getFunction()))
1908 LabelsBeforeInsn[MI] = FunctionBeginSym;
1909 } else {
1910 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1911 const MachineInstr *Prev = History.back();
1912 if (Prev->isDebugValue()) {
1913 // Coalesce identical entries at the end of History.
1914 if (History.size() >= 2 &&
Devang Patel79862892011-07-07 00:14:27 +00001915 Prev->isIdenticalTo(History[History.size() - 2])) {
1916 DEBUG(dbgs() << "Coalesce identical DBG_VALUE entries:\n"
1917 << "\t" << *Prev
1918 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001919 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001920 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001921
1922 // Terminate old register assignments that don't reach MI;
1923 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1924 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1925 isDbgValueInDefinedReg(Prev)) {
1926 // Previous register assignment needs to terminate at the end of
1927 // its basic block.
1928 MachineBasicBlock::const_iterator LastMI =
1929 PrevMBB->getLastNonDebugInstr();
Devang Patel79862892011-07-07 00:14:27 +00001930 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001931 // Drop DBG_VALUE for empty range.
Devang Patel79862892011-07-07 00:14:27 +00001932 DEBUG(dbgs() << "Drop DBG_VALUE for empty range:\n"
1933 << "\t" << *Prev << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001934 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001935 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001936 else {
1937 // Terminate after LastMI.
1938 History.push_back(LastMI);
1939 }
1940 }
1941 }
1942 }
1943 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00001944 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001945 // Not a DBG_VALUE instruction.
1946 if (!MI->isLabel())
1947 AtBlockEntry = false;
1948
Devang Patel4243e672011-05-11 19:22:19 +00001949 // First known non DBG_VALUE location marks beginning of function
1950 // body.
1951 if (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown())
1952 PrologEndLoc = MI->getDebugLoc();
1953
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001954 // Check if the instruction clobbers any registers with debug vars.
1955 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1956 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1957 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1958 continue;
1959 for (const unsigned *AI = TRI->getOverlaps(MOI->getReg());
1960 unsigned Reg = *AI; ++AI) {
1961 const MDNode *Var = LiveUserVar[Reg];
1962 if (!Var)
1963 continue;
1964 // Reg is now clobbered.
1965 LiveUserVar[Reg] = 0;
1966
1967 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001968 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1969 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001970 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001971 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1972 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001973 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001974 const MachineInstr *Prev = History.back();
1975 // Sanity-check: Register assignments are terminated at the end of
1976 // their block.
1977 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1978 continue;
1979 // Is the variable still in Reg?
1980 if (!isDbgValueInDefinedReg(Prev) ||
1981 Prev->getOperand(0).getReg() != Reg)
1982 continue;
1983 // Var is clobbered. Make sure the next instruction gets a label.
1984 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001985 }
1986 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001987 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001988 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001989 }
1990
1991 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1992 I != E; ++I) {
1993 SmallVectorImpl<const MachineInstr*> &History = I->second;
1994 if (History.empty())
1995 continue;
1996
1997 // Make sure the final register assignments are terminated.
1998 const MachineInstr *Prev = History.back();
1999 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
2000 const MachineBasicBlock *PrevMBB = Prev->getParent();
2001 MachineBasicBlock::const_iterator LastMI = PrevMBB->getLastNonDebugInstr();
2002 if (LastMI == PrevMBB->end())
2003 // Drop DBG_VALUE for empty range.
2004 History.pop_back();
2005 else {
2006 // Terminate after LastMI.
2007 History.push_back(LastMI);
2008 }
2009 }
2010 // Request labels for the full history.
2011 for (unsigned i = 0, e = History.size(); i != e; ++i) {
2012 const MachineInstr *MI = History[i];
2013 if (MI->isDebugValue())
2014 requestLabelBeforeInsn(MI);
2015 else
2016 requestLabelAfterInsn(MI);
2017 }
2018 }
Devang Patelb2b31a62010-05-26 19:37:24 +00002019
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00002020 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00002021 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00002022
2023 // Record beginning of function.
2024 if (!PrologEndLoc.isUnknown()) {
2025 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
2026 MF->getFunction()->getContext());
2027 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
2028 FnStartDL.getScope(MF->getFunction()->getContext()),
2029 DWARF2_FLAG_IS_STMT);
2030 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002031}
2032
Devang Patel2c4ceb12009-11-21 02:48:08 +00002033/// endFunction - Gather and emit post-function debug information.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002034///
Chris Lattnereec791a2010-01-26 23:18:02 +00002035void DwarfDebug::endFunction(const MachineFunction *MF) {
Bill Wendling5f017e82010-04-07 09:28:04 +00002036 if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00002037
Devang Patel344130e2010-01-04 20:44:00 +00002038 if (CurrentFnDbgScope) {
Devang Patel65eb4822010-05-22 00:04:14 +00002039
Devang Patelc3f5f782010-05-25 23:40:22 +00002040 // Define end label for subprogram.
2041 FunctionEndSym = Asm->GetTempSymbol("func_end",
2042 Asm->getFunctionNumber());
2043 // Assumes in correct section after the entry point.
2044 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002045
Devang Patel78e127d2010-06-25 22:07:34 +00002046 SmallPtrSet<const MDNode *, 16> ProcessedVars;
2047 collectVariableInfo(MF, ProcessedVars);
Devang Patel65eb4822010-05-22 00:04:14 +00002048
Devang Patel344130e2010-01-04 20:44:00 +00002049 // Construct abstract scopes.
2050 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
Devang Patel78e127d2010-06-25 22:07:34 +00002051 AE = AbstractScopesList.end(); AI != AE; ++AI) {
Devang Patel78e127d2010-06-25 22:07:34 +00002052 DISubprogram SP((*AI)->getScopeNode());
2053 if (SP.Verify()) {
2054 // Collect info for variables that were optimized out.
2055 StringRef FName = SP.getLinkageName();
2056 if (FName.empty())
2057 FName = SP.getName();
Devang Patel62367042010-11-10 22:19:21 +00002058 if (NamedMDNode *NMD =
2059 getFnSpecificMDNode(*(MF->getFunction()->getParent()), FName)) {
Devang Patel78e127d2010-06-25 22:07:34 +00002060 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
Dan Gohman872814a2010-07-21 18:54:18 +00002061 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
Devang Patel78e127d2010-06-25 22:07:34 +00002062 if (!DV || !ProcessedVars.insert(DV))
2063 continue;
Devang Patel1d68d212010-06-30 00:11:08 +00002064 DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
Devang Patel78e127d2010-06-25 22:07:34 +00002065 if (Scope)
2066 Scope->addVariable(new DbgVariable(DV));
2067 }
2068 }
2069 }
Devang Patel90e19aa2010-06-30 01:40:11 +00002070 if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
2071 constructScopeDIE(*AI);
Devang Patel78e127d2010-06-25 22:07:34 +00002072 }
Devang Patel61409622010-07-07 20:12:52 +00002073
Devang Patel9c488372010-05-04 06:15:30 +00002074 DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002075
Devang Patel9c488372010-05-04 06:15:30 +00002076 if (!DisableFramePointerElim(*MF))
Devang Patel3cbee302011-04-12 22:53:02 +00002077 getCompileUnit(CurrentFnDbgScope->getScopeNode())->addUInt(CurFnDIE,
2078 dwarf::DW_AT_APPLE_omit_frame_ptr,
2079 dwarf::DW_FORM_flag, 1);
Devang Patel9c488372010-05-04 06:15:30 +00002080
2081
Chris Lattnerd38fee82010-04-05 00:13:49 +00002082 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
Devang Patel344130e2010-01-04 20:44:00 +00002083 MMI->getFrameMoves()));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002084 }
2085
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002086 // Clear debug info
Devang Patelf54b8522010-01-19 01:26:02 +00002087 CurrentFnDbgScope = NULL;
Devang Pateleac0c9d2011-04-22 18:09:57 +00002088 DeleteContainerPointers(CurrentFnArguments);
Devang Patel26c1e562010-05-20 16:36:41 +00002089 DbgVariableToFrameIndexMap.clear();
2090 VarToAbstractVarMap.clear();
2091 DbgVariableToDbgInstMap.clear();
Devang Patel133b0992011-07-15 21:25:44 +00002092 InlinedDbgScopeMap.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002093 DeleteContainerSeconds(DbgScopeMap);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002094 UserVariables.clear();
2095 DbgValues.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002096 DeleteContainerSeconds(AbstractScopes);
Devang Patelf54b8522010-01-19 01:26:02 +00002097 AbstractScopesList.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002098 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00002099 LabelsBeforeInsn.clear();
2100 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00002101 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002102}
2103
Devang Patel26c1e562010-05-20 16:36:41 +00002104/// recordVariableFrameIndex - Record a variable's index.
2105void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2106 assert (V && "Invalid DbgVariable!");
2107 DbgVariableToFrameIndexMap[V] = Index;
2108}
2109
2110/// findVariableFrameIndex - Return true if frame index for the variable
2111/// is found. Update FI to hold value of the index.
2112bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2113 assert (V && "Invalid DbgVariable!");
2114 DenseMap<const DbgVariable *, int>::iterator I =
2115 DbgVariableToFrameIndexMap.find(V);
2116 if (I == DbgVariableToFrameIndexMap.end())
2117 return false;
2118 *FI = I->second;
2119 return true;
2120}
2121
Devang Patel9b4a1722011-07-14 23:17:49 +00002122/// findDbgScope - Find DbgScope for the debug loc.
2123DbgScope *DwarfDebug::findDbgScope(DebugLoc DL) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00002124 if (DL.isUnknown())
Devang Patel9b4a1722011-07-14 23:17:49 +00002125 return NULL;
Devang Patelee432862010-05-20 19:57:06 +00002126
Devang Patel9b4a1722011-07-14 23:17:49 +00002127 DbgScope *Scope = NULL;
2128 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
Devang Patel133b0992011-07-15 21:25:44 +00002129 if (MDNode *IA = DL.getInlinedAt(Ctx))
2130 Scope = InlinedDbgScopeMap.lookup(DebugLoc::getFromDILocation(IA));
2131 else
2132 Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
Devang Patelee432862010-05-20 19:57:06 +00002133 return Scope;
2134}
2135
2136
Chris Lattnerc6087842010-03-09 04:54:43 +00002137/// recordSourceLine - Register a source line with debug info. Returns the
2138/// unique label that was emitted and which provides correspondence to
2139/// the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00002140void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
2141 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00002142 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00002143 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00002144 unsigned Src = 1;
2145 if (S) {
2146 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00002147
Dan Gohman1cc0d622010-05-05 23:41:32 +00002148 if (Scope.isCompileUnit()) {
2149 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00002150 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00002151 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00002152 } else if (Scope.isFile()) {
2153 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00002154 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00002155 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00002156 } else if (Scope.isSubprogram()) {
2157 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00002158 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00002159 Dir = SP.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00002160 } else if (Scope.isLexicalBlock()) {
2161 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00002162 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00002163 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00002164 } else
2165 assert(0 && "Unexpected scope info");
2166
Devang Patel23670e52011-03-24 20:30:50 +00002167 Src = GetOrCreateSourceID(Fn, Dir);
Dan Gohman1cc0d622010-05-05 23:41:32 +00002168 }
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002169 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002170}
2171
Bill Wendling829e67b2009-05-20 23:22:40 +00002172//===----------------------------------------------------------------------===//
2173// Emit Methods
2174//===----------------------------------------------------------------------===//
2175
Devang Patel2c4ceb12009-11-21 02:48:08 +00002176/// computeSizeAndOffset - Compute the size and offset of a DIE.
Bill Wendling94d04b82009-05-20 23:21:38 +00002177///
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002178unsigned
2179DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002180 // Get the children.
2181 const std::vector<DIE *> &Children = Die->getChildren();
2182
2183 // If not last sibling and has children then add sibling offset attribute.
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00002184 if (!Last && !Children.empty())
Benjamin Kramer345ef342010-03-31 19:34:01 +00002185 Die->addSiblingOffset(DIEValueAllocator);
Bill Wendling94d04b82009-05-20 23:21:38 +00002186
2187 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002188 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00002189
2190 // Get the abbreviation for this DIE.
2191 unsigned AbbrevNumber = Die->getAbbrevNumber();
2192 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2193
2194 // Set DIE offset
2195 Die->setOffset(Offset);
2196
2197 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00002198 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00002199
2200 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2201 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2202
2203 // Size the DIE attribute values.
2204 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2205 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00002206 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00002207
2208 // Size the DIE children if any.
2209 if (!Children.empty()) {
2210 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2211 "Children flag not set");
2212
2213 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002214 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
Bill Wendling94d04b82009-05-20 23:21:38 +00002215
2216 // End of children marker.
2217 Offset += sizeof(int8_t);
2218 }
2219
2220 Die->setSize(Offset - Die->getOffset());
2221 return Offset;
2222}
2223
Devang Patel2c4ceb12009-11-21 02:48:08 +00002224/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
Bill Wendling94d04b82009-05-20 23:21:38 +00002225///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002226void DwarfDebug::computeSizeAndOffsets() {
Devang Patel163a9f72010-05-10 22:49:55 +00002227 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2228 E = CUMap.end(); I != E; ++I) {
2229 // Compute size of compile unit header.
Devang Patel513edf62011-04-12 23:10:47 +00002230 unsigned Offset =
Devang Patel163a9f72010-05-10 22:49:55 +00002231 sizeof(int32_t) + // Length of Compilation Unit Info
2232 sizeof(int16_t) + // DWARF version number
2233 sizeof(int32_t) + // Offset Into Abbrev. Section
2234 sizeof(int8_t); // Pointer Size (in bytes)
2235 computeSizeAndOffset(I->second->getCUDie(), Offset, true);
Devang Patel163a9f72010-05-10 22:49:55 +00002236 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002237}
2238
Chris Lattner11b8f302010-04-04 23:02:02 +00002239/// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2240/// temporary label to it if SymbolStem is specified.
Chris Lattner9c69e285532010-04-04 22:59:04 +00002241static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Chris Lattner11b8f302010-04-04 23:02:02 +00002242 const char *SymbolStem = 0) {
Chris Lattner9c69e285532010-04-04 22:59:04 +00002243 Asm->OutStreamer.SwitchSection(Section);
Chris Lattner11b8f302010-04-04 23:02:02 +00002244 if (!SymbolStem) return 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002245
Chris Lattner9c69e285532010-04-04 22:59:04 +00002246 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2247 Asm->OutStreamer.EmitLabel(TmpSym);
2248 return TmpSym;
2249}
2250
2251/// EmitSectionLabels - Emit initial Dwarf sections with a label at
2252/// the start of each one.
Chris Lattnerfa070b02010-04-04 22:33:59 +00002253void DwarfDebug::EmitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002254 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002255
Bill Wendling94d04b82009-05-20 23:21:38 +00002256 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002257 DwarfInfoSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00002258 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002259 DwarfAbbrevSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00002260 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Chris Lattner11b8f302010-04-04 23:02:02 +00002261 EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002262
Chris Lattner9c69e285532010-04-04 22:59:04 +00002263 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Chris Lattner11b8f302010-04-04 23:02:02 +00002264 EmitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002265
Devang Patelaf608bd2010-08-24 00:06:12 +00002266 EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Chris Lattner11b8f302010-04-04 23:02:02 +00002267 EmitSectionSym(Asm, TLOF.getDwarfLocSection());
2268 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
2269 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002270 DwarfStrSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00002271 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
Devang Patelf2548ca2010-04-16 23:33:45 +00002272 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
2273 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00002274
Devang Patelc3f5f782010-05-25 23:40:22 +00002275 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
2276 "section_debug_loc");
2277
Chris Lattner9c69e285532010-04-04 22:59:04 +00002278 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
Chris Lattner4ad1efe2010-04-04 23:10:38 +00002279 EmitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002280}
2281
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002282/// emitDIE - Recursively emits a debug information entry.
Bill Wendling94d04b82009-05-20 23:21:38 +00002283///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002284void DwarfDebug::emitDIE(DIE *Die) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002285 // Get the abbreviation for this DIE.
2286 unsigned AbbrevNumber = Die->getAbbrevNumber();
2287 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2288
Bill Wendling94d04b82009-05-20 23:21:38 +00002289 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00002290 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00002291 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2292 Twine::utohexstr(Die->getOffset()) + ":0x" +
2293 Twine::utohexstr(Die->getSize()) + " " +
2294 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002295 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00002296
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00002297 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
Bill Wendling94d04b82009-05-20 23:21:38 +00002298 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2299
2300 // Emit the DIE attribute values.
2301 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2302 unsigned Attr = AbbrevData[i].getAttribute();
2303 unsigned Form = AbbrevData[i].getForm();
2304 assert(Form && "Too many attributes for DIE (check abbreviation)");
2305
Chris Lattner3f53c832010-04-04 18:52:31 +00002306 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00002307 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002308
Bill Wendling94d04b82009-05-20 23:21:38 +00002309 switch (Attr) {
2310 case dwarf::DW_AT_sibling:
Devang Patel2c4ceb12009-11-21 02:48:08 +00002311 Asm->EmitInt32(Die->getSiblingOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00002312 break;
2313 case dwarf::DW_AT_abstract_origin: {
2314 DIEEntry *E = cast<DIEEntry>(Values[i]);
2315 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00002316 unsigned Addr = Origin->getOffset();
Bill Wendling94d04b82009-05-20 23:21:38 +00002317 Asm->EmitInt32(Addr);
2318 break;
2319 }
Devang Patelf2548ca2010-04-16 23:33:45 +00002320 case dwarf::DW_AT_ranges: {
2321 // DW_AT_range Value encodes offset in debug_range section.
2322 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00002323
2324 if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
2325 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
2326 V->getValue(),
2327 4);
2328 } else {
2329 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
2330 V->getValue(),
2331 DwarfDebugRangeSectionSym,
2332 4);
2333 }
Devang Patelf2548ca2010-04-16 23:33:45 +00002334 break;
2335 }
Devang Patelc3f5f782010-05-25 23:40:22 +00002336 case dwarf::DW_AT_location: {
2337 if (UseDotDebugLocEntry.count(Die) != 0) {
2338 DIELabel *L = cast<DIELabel>(Values[i]);
Daniel Dunbar83320a02011-03-16 22:16:39 +00002339 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
Devang Patelc3f5f782010-05-25 23:40:22 +00002340 } else
2341 Values[i]->EmitValue(Asm, Form);
2342 break;
2343 }
Devang Patel2a361602010-09-29 19:08:08 +00002344 case dwarf::DW_AT_accessibility: {
2345 if (Asm->isVerbose()) {
2346 DIEInteger *V = cast<DIEInteger>(Values[i]);
2347 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
2348 }
2349 Values[i]->EmitValue(Asm, Form);
2350 break;
2351 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002352 default:
2353 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00002354 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00002355 break;
2356 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002357 }
2358
2359 // Emit the DIE children if any.
2360 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2361 const std::vector<DIE *> &Children = Die->getChildren();
2362
2363 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002364 emitDIE(Children[j]);
Bill Wendling94d04b82009-05-20 23:21:38 +00002365
Chris Lattner3f53c832010-04-04 18:52:31 +00002366 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00002367 Asm->OutStreamer.AddComment("End Of Children Mark");
2368 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00002369 }
2370}
2371
Devang Patel8a241142009-12-09 18:24:21 +00002372/// emitDebugInfo - Emit the debug info section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002373///
Devang Patel8a241142009-12-09 18:24:21 +00002374void DwarfDebug::emitDebugInfo() {
2375 // Start debug info section.
2376 Asm->OutStreamer.SwitchSection(
2377 Asm->getObjFileLowering().getDwarfInfoSection());
Devang Patel163a9f72010-05-10 22:49:55 +00002378 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2379 E = CUMap.end(); I != E; ++I) {
2380 CompileUnit *TheCU = I->second;
2381 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002382
Devang Patel163a9f72010-05-10 22:49:55 +00002383 // Emit the compile units header.
2384 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
2385 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002386
Devang Patel163a9f72010-05-10 22:49:55 +00002387 // Emit size of content not including length itself
2388 unsigned ContentSize = Die->getSize() +
2389 sizeof(int16_t) + // DWARF version number
2390 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patel65705d52011-04-13 19:41:17 +00002391 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbach1e20b962010-07-21 21:21:52 +00002392
Devang Patel163a9f72010-05-10 22:49:55 +00002393 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2394 Asm->EmitInt32(ContentSize);
2395 Asm->OutStreamer.AddComment("DWARF version number");
2396 Asm->EmitInt16(dwarf::DWARF_VERSION);
2397 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2398 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
2399 DwarfAbbrevSectionSym);
2400 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2401 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002402
Devang Patel163a9f72010-05-10 22:49:55 +00002403 emitDIE(Die);
Devang Patel163a9f72010-05-10 22:49:55 +00002404 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
2405 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002406}
2407
Devang Patel2c4ceb12009-11-21 02:48:08 +00002408/// emitAbbreviations - Emit the abbreviation section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002409///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002410void DwarfDebug::emitAbbreviations() const {
Bill Wendling94d04b82009-05-20 23:21:38 +00002411 // Check to see if it is worth the effort.
2412 if (!Abbreviations.empty()) {
2413 // Start the debug abbrev section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002414 Asm->OutStreamer.SwitchSection(
2415 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002416
Chris Lattnerc0215722010-04-04 19:25:43 +00002417 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
Bill Wendling94d04b82009-05-20 23:21:38 +00002418
2419 // For each abbrevation.
2420 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2421 // Get abbreviation data
2422 const DIEAbbrev *Abbrev = Abbreviations[i];
2423
2424 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002425 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00002426
2427 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00002428 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00002429 }
2430
2431 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002432 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00002433
Chris Lattnerc0215722010-04-04 19:25:43 +00002434 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
Bill Wendling94d04b82009-05-20 23:21:38 +00002435 }
2436}
2437
Devang Patel2c4ceb12009-11-21 02:48:08 +00002438/// emitEndOfLineMatrix - Emit the last address of the section and the end of
Bill Wendling94d04b82009-05-20 23:21:38 +00002439/// the line matrix.
2440///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002441void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002442 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00002443 Asm->OutStreamer.AddComment("Extended Op");
2444 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002445
Chris Lattner233f52b2010-03-09 23:52:58 +00002446 Asm->OutStreamer.AddComment("Op size");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002447 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00002448 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2449 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2450
2451 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00002452
Chris Lattnerc0215722010-04-04 19:25:43 +00002453 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Chris Lattnerd38fee82010-04-05 00:13:49 +00002454 Asm->getTargetData().getPointerSize(),
2455 0/*AddrSpace*/);
Bill Wendling94d04b82009-05-20 23:21:38 +00002456
2457 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00002458 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2459 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00002460 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00002461 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00002462}
2463
Devang Patel8a241142009-12-09 18:24:21 +00002464/// emitDebugPubNames - Emit visible names into a debug pubnames section.
2465///
2466void DwarfDebug::emitDebugPubNames() {
Devang Patel163a9f72010-05-10 22:49:55 +00002467 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2468 E = CUMap.end(); I != E; ++I) {
2469 CompileUnit *TheCU = I->second;
2470 // Start the dwarf pubnames section.
2471 Asm->OutStreamer.SwitchSection(
2472 Asm->getObjFileLowering().getDwarfPubNamesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002473
Devang Patel163a9f72010-05-10 22:49:55 +00002474 Asm->OutStreamer.AddComment("Length of Public Names Info");
2475 Asm->EmitLabelDifference(
2476 Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
2477 Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002478
Devang Patel163a9f72010-05-10 22:49:55 +00002479 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
2480 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002481
Devang Patel163a9f72010-05-10 22:49:55 +00002482 Asm->OutStreamer.AddComment("DWARF Version");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002483 Asm->EmitInt16(dwarf::DWARF_VERSION);
2484
Devang Patel163a9f72010-05-10 22:49:55 +00002485 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002486 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002487 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002488
Devang Patel163a9f72010-05-10 22:49:55 +00002489 Asm->OutStreamer.AddComment("Compilation Unit Length");
2490 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
2491 Asm->GetTempSymbol("info_begin", TheCU->getID()),
2492 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002493
Devang Patel163a9f72010-05-10 22:49:55 +00002494 const StringMap<DIE*> &Globals = TheCU->getGlobals();
2495 for (StringMap<DIE*>::const_iterator
2496 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2497 const char *Name = GI->getKeyData();
2498 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002499
Devang Patel163a9f72010-05-10 22:49:55 +00002500 Asm->OutStreamer.AddComment("DIE offset");
2501 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002502
Devang Patel163a9f72010-05-10 22:49:55 +00002503 if (Asm->isVerbose())
2504 Asm->OutStreamer.AddComment("External Name");
2505 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2506 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002507
Devang Patel163a9f72010-05-10 22:49:55 +00002508 Asm->OutStreamer.AddComment("End Mark");
2509 Asm->EmitInt32(0);
2510 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002511 TheCU->getID()));
Bill Wendling94d04b82009-05-20 23:21:38 +00002512 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002513}
2514
Devang Patel193f7202009-11-24 01:14:22 +00002515void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00002516 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2517 E = CUMap.end(); I != E; ++I) {
2518 CompileUnit *TheCU = I->second;
2519 // Start the dwarf pubnames section.
2520 Asm->OutStreamer.SwitchSection(
2521 Asm->getObjFileLowering().getDwarfPubTypesSection());
2522 Asm->OutStreamer.AddComment("Length of Public Types Info");
2523 Asm->EmitLabelDifference(
2524 Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
2525 Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002526
Devang Patel163a9f72010-05-10 22:49:55 +00002527 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
2528 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002529
Devang Patel163a9f72010-05-10 22:49:55 +00002530 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2531 Asm->EmitInt16(dwarf::DWARF_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002532
Devang Patel163a9f72010-05-10 22:49:55 +00002533 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2534 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
2535 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002536
Devang Patel163a9f72010-05-10 22:49:55 +00002537 Asm->OutStreamer.AddComment("Compilation Unit Length");
2538 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
2539 Asm->GetTempSymbol("info_begin", TheCU->getID()),
2540 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002541
Devang Patel163a9f72010-05-10 22:49:55 +00002542 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2543 for (StringMap<DIE*>::const_iterator
2544 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2545 const char *Name = GI->getKeyData();
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002546 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002547
Devang Patel163a9f72010-05-10 22:49:55 +00002548 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2549 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002550
Devang Patel163a9f72010-05-10 22:49:55 +00002551 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
2552 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2553 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002554
Devang Patel163a9f72010-05-10 22:49:55 +00002555 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002556 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00002557 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
2558 TheCU->getID()));
Devang Patel193f7202009-11-24 01:14:22 +00002559 }
Devang Patel193f7202009-11-24 01:14:22 +00002560}
2561
Devang Patel2c4ceb12009-11-21 02:48:08 +00002562/// emitDebugStr - Emit visible names into a debug str section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002563///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002564void DwarfDebug::emitDebugStr() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002565 // Check to see if it is worth the effort.
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002566 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002567
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002568 // Start the dwarf str section.
2569 Asm->OutStreamer.SwitchSection(
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002570 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002571
Chris Lattnerbc733f52010-03-13 02:17:42 +00002572 // Get all of the string pool entries and put them in an array by their ID so
2573 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002574 SmallVector<std::pair<unsigned,
Chris Lattnerbc733f52010-03-13 02:17:42 +00002575 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002576
Chris Lattnerbc733f52010-03-13 02:17:42 +00002577 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2578 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
2579 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002580
Chris Lattnerbc733f52010-03-13 02:17:42 +00002581 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002582
Chris Lattnerbc733f52010-03-13 02:17:42 +00002583 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002584 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002585 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002586
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002587 // Emit the string itself.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002588 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
Bill Wendling94d04b82009-05-20 23:21:38 +00002589 }
2590}
2591
Devang Patel2c4ceb12009-11-21 02:48:08 +00002592/// emitDebugLoc - Emit visible names into a debug loc section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002593///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002594void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00002595 if (DotDebugLocEntries.empty())
2596 return;
2597
Devang Patel6c3ea902011-02-04 22:57:18 +00002598 for (SmallVector<DotDebugLocEntry, 4>::iterator
2599 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2600 I != E; ++I) {
2601 DotDebugLocEntry &Entry = *I;
2602 if (I + 1 != DotDebugLocEntries.end())
2603 Entry.Merge(I+1);
2604 }
2605
Daniel Dunbar83320a02011-03-16 22:16:39 +00002606 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002607 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00002608 Asm->getObjFileLowering().getDwarfLocSection());
2609 unsigned char Size = Asm->getTargetData().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00002610 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2611 unsigned index = 1;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002612 for (SmallVector<DotDebugLocEntry, 4>::iterator
2613 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00002614 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00002615 DotDebugLocEntry &Entry = *I;
2616 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00002617 if (Entry.isEmpty()) {
2618 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2619 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patel80250682010-05-26 23:55:23 +00002620 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00002621 } else {
2622 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
2623 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
Devang Patelc26f5442011-04-28 02:22:40 +00002624 DIVariable DV(Entry.Variable);
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002625 Asm->OutStreamer.AddComment("Loc expr size");
2626 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2627 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2628 Asm->EmitLabelDifference(end, begin, 2);
2629 Asm->OutStreamer.EmitLabel(begin);
Devang Patel80efd4e2011-07-08 16:49:43 +00002630 if (Entry.isInt()) {
Devang Patelc4329072011-06-01 22:03:25 +00002631 DIBasicType BTy(DV.getType());
2632 if (BTy.Verify() &&
2633 (BTy.getEncoding() == dwarf::DW_ATE_signed
2634 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2635 Asm->OutStreamer.AddComment("DW_OP_consts");
2636 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Patel80efd4e2011-07-08 16:49:43 +00002637 Asm->EmitSLEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002638 } else {
2639 Asm->OutStreamer.AddComment("DW_OP_constu");
2640 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Patel80efd4e2011-07-08 16:49:43 +00002641 Asm->EmitULEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002642 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002643 } else if (Entry.isLocation()) {
2644 if (!DV.hasComplexAddress())
2645 // Regular entry.
Devang Patelc26f5442011-04-28 02:22:40 +00002646 Asm->EmitDwarfRegOp(Entry.Loc);
Devang Patel80efd4e2011-07-08 16:49:43 +00002647 else {
2648 // Complex address entry.
2649 unsigned N = DV.getNumAddrElements();
2650 unsigned i = 0;
2651 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2652 if (Entry.Loc.getOffset()) {
2653 i = 2;
2654 Asm->EmitDwarfRegOp(Entry.Loc);
2655 Asm->OutStreamer.AddComment("DW_OP_deref");
2656 Asm->EmitInt8(dwarf::DW_OP_deref);
2657 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2658 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2659 Asm->EmitSLEB128(DV.getAddrElement(1));
2660 } else {
2661 // If first address element is OpPlus then emit
2662 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2663 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2664 Asm->EmitDwarfRegOp(Loc);
2665 i = 2;
2666 }
2667 } else {
2668 Asm->EmitDwarfRegOp(Entry.Loc);
2669 }
2670
2671 // Emit remaining complex address elements.
2672 for (; i < N; ++i) {
2673 uint64_t Element = DV.getAddrElement(i);
2674 if (Element == DIBuilder::OpPlus) {
2675 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2676 Asm->EmitULEB128(DV.getAddrElement(++i));
2677 } else if (Element == DIBuilder::OpDeref)
2678 Asm->EmitInt8(dwarf::DW_OP_deref);
2679 else llvm_unreachable("unknown Opcode found in complex address");
2680 }
Devang Patelc26f5442011-04-28 02:22:40 +00002681 }
Devang Patelc26f5442011-04-28 02:22:40 +00002682 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002683 // else ... ignore constant fp. There is not any good way to
2684 // to represent them here in dwarf.
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002685 Asm->OutStreamer.EmitLabel(end);
Devang Patelc3f5f782010-05-25 23:40:22 +00002686 }
2687 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002688}
2689
2690/// EmitDebugARanges - Emit visible names into a debug aranges section.
2691///
2692void DwarfDebug::EmitDebugARanges() {
2693 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002694 Asm->OutStreamer.SwitchSection(
2695 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002696}
2697
Devang Patel2c4ceb12009-11-21 02:48:08 +00002698/// emitDebugRanges - Emit visible names into a debug ranges section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002699///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002700void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002701 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002702 Asm->OutStreamer.SwitchSection(
Devang Patelf2548ca2010-04-16 23:33:45 +00002703 Asm->getObjFileLowering().getDwarfRangesSection());
Devang Pateleac9c072010-04-27 19:46:33 +00002704 unsigned char Size = Asm->getTargetData().getPointerSize();
2705 for (SmallVector<const MCSymbol *, 8>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002706 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00002707 I != E; ++I) {
2708 if (*I)
2709 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
Devang Patelf2548ca2010-04-16 23:33:45 +00002710 else
Devang Pateleac9c072010-04-27 19:46:33 +00002711 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patelf2548ca2010-04-16 23:33:45 +00002712 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002713}
2714
Devang Patel2c4ceb12009-11-21 02:48:08 +00002715/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002716///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002717void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002718 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002719 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002720 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002721 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002722 }
2723}
2724
Devang Patel2c4ceb12009-11-21 02:48:08 +00002725/// emitDebugInlineInfo - Emit inline info using following format.
Bill Wendling94d04b82009-05-20 23:21:38 +00002726/// Section Header:
2727/// 1. length of section
2728/// 2. Dwarf version number
2729/// 3. address size.
2730///
2731/// Entries (one "entry" for each function that was inlined):
2732///
2733/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2734/// otherwise offset into __debug_str for regular function name.
2735/// 2. offset into __debug_str section for regular function name.
2736/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2737/// instances for the function.
2738///
2739/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2740/// inlined instance; the die_offset points to the inlined_subroutine die in the
2741/// __debug_info section, and the low_pc is the starting address for the
2742/// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002743void DwarfDebug::emitDebugInlineInfo() {
Chris Lattnerd38fee82010-04-05 00:13:49 +00002744 if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002745 return;
2746
Devang Patel163a9f72010-05-10 22:49:55 +00002747 if (!FirstCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002748 return;
2749
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002750 Asm->OutStreamer.SwitchSection(
2751 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattner0ad9c912010-01-22 22:09:00 +00002752
Chris Lattner233f52b2010-03-09 23:52:58 +00002753 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00002754 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2755 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00002756
Chris Lattnerc0215722010-04-04 19:25:43 +00002757 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002758
Chris Lattner233f52b2010-03-09 23:52:58 +00002759 Asm->OutStreamer.AddComment("Dwarf Version");
2760 Asm->EmitInt16(dwarf::DWARF_VERSION);
2761 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002762 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002763
Devang Patele9f8f5e2010-05-07 20:54:48 +00002764 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
Devang Patel53bb5c92009-11-10 23:06:00 +00002765 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002766
Devang Patele9f8f5e2010-05-07 20:54:48 +00002767 const MDNode *Node = *I;
2768 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002769 = InlineInfo.find(Node);
Devang Patel53bb5c92009-11-10 23:06:00 +00002770 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00002771 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00002772 StringRef LName = SP.getLinkageName();
2773 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00002774
Chris Lattner233f52b2010-03-09 23:52:58 +00002775 Asm->OutStreamer.AddComment("MIPS linkage name");
Chris Lattner4cf202b2010-01-23 03:11:46 +00002776 if (LName.empty()) {
2777 Asm->OutStreamer.EmitBytes(Name, 0);
2778 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002779 } else
Chris Lattner6189ed12010-04-04 23:25:33 +00002780 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
2781 DwarfStrSectionSym);
Devang Patel53bb5c92009-11-10 23:06:00 +00002782
Chris Lattner233f52b2010-03-09 23:52:58 +00002783 Asm->OutStreamer.AddComment("Function name");
Chris Lattner6189ed12010-04-04 23:25:33 +00002784 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002785 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling94d04b82009-05-20 23:21:38 +00002786
Devang Patel53bb5c92009-11-10 23:06:00 +00002787 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00002788 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner3f53c832010-04-04 18:52:31 +00002789 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner6ed0f902010-03-09 00:31:02 +00002790 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00002791
Chris Lattner3f53c832010-04-04 18:52:31 +00002792 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002793 Asm->OutStreamer.EmitSymbolValue(LI->first,
2794 Asm->getTargetData().getPointerSize(),0);
Bill Wendling94d04b82009-05-20 23:21:38 +00002795 }
2796 }
2797
Chris Lattnerc0215722010-04-04 19:25:43 +00002798 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002799}