blob: ffd6c80008154ad7cdc1a3d4e1f6e74513263c22 [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 ||
Devang Patel027cbf92011-08-03 01:25:46 +0000958 CE->getOpcode() != Instruction::GetElementPtr ||
959 !isa<PointerType>(CE->getOperand(0)->getType()))
Devang Patele449d1f2011-01-20 00:02:16 +0000960 return NULL;
961
962 // First operand points to a global value.
963 if (!isa<GlobalValue>(CE->getOperand(0)))
964 return NULL;
965
966 // Second operand is zero.
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000967 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
Devang Patele449d1f2011-01-20 00:02:16 +0000968 if (!CI || !CI->isZero())
969 return NULL;
970
971 // Third operand is offset.
972 if (!isa<ConstantInt>(CE->getOperand(2)))
973 return NULL;
974
975 return CE;
976}
977
Devang Patel027cbf92011-08-03 01:25:46 +0000978// getMergedGlobalElementOffset - If CE is accessing a merged global
979// then find byte offset of the element accessed by CE. This must be
980// used only CE returned by getMergedGlobalExpr(). See above.
981static uint64_t getMergedGlobalElementOffset(const TargetData &TD,
982 const ConstantExpr *CE) {
983 assert (getMergedGlobalExpr(CE) && "This is not a merged global!");
984 uint64_t e = cast<ConstantInt>(CE->getOperand(2))->getZExtValue();
985 if (e == 0) return 0;
986
987 uint64_t Offset = 0;
988 const PointerType *PTy = dyn_cast<PointerType>(CE->getOperand(0)->getType());
989 const StructType *STy = dyn_cast<StructType>(PTy->getElementType());
990 for (uint64_t i = 0; i != e; ++i)
991 Offset += TD.getTypeAllocSize(STy->getElementType(i));
992 return Offset;
993}
994
Devang Patel163a9f72010-05-10 22:49:55 +0000995/// constructGlobalVariableDIE - Construct global variable DIE.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000996void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
Devang Patel9fa539c2010-08-10 01:37:23 +0000997 DIGlobalVariable GV(N);
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000998
Devang Patel905cf5e2009-09-04 23:59:07 +0000999 // If debug information is malformed then ignore it.
Devang Patel9fa539c2010-08-10 01:37:23 +00001000 if (GV.Verify() == false)
Devang Patel905cf5e2009-09-04 23:59:07 +00001001 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001002
1003 // Check for pre-existence.
Devang Patel163a9f72010-05-10 22:49:55 +00001004 CompileUnit *TheCU = getCompileUnit(N);
Devang Patel9fa539c2010-08-10 01:37:23 +00001005 if (TheCU->getDIE(GV))
Devang Patel13e16b62009-06-26 01:49:18 +00001006 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001007
Devang Patel9fa539c2010-08-10 01:37:23 +00001008 DIType GTy = GV.getType();
Devang Patel29368072010-08-10 07:11:13 +00001009 DIE *VariableDIE = new DIE(GV.getTag());
1010
1011 bool isGlobalVariable = GV.getGlobal() != NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001012
Devang Patel9fa539c2010-08-10 01:37:23 +00001013 // Add name.
Devang Patel3cbee302011-04-12 22:53:02 +00001014 TheCU->addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1015 GV.getDisplayName());
Devang Patel9fa539c2010-08-10 01:37:23 +00001016 StringRef LinkageName = GV.getLinkageName();
Devang Patel29368072010-08-10 07:11:13 +00001017 if (!LinkageName.empty() && isGlobalVariable)
Devang Patel3cbee302011-04-12 22:53:02 +00001018 TheCU->addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
1019 dwarf::DW_FORM_string,
1020 getRealLinkageName(LinkageName));
Devang Patel9fa539c2010-08-10 01:37:23 +00001021 // Add type.
Devang Patel3cbee302011-04-12 22:53:02 +00001022 TheCU->addType(VariableDIE, GTy);
Devang Patele9ae06c2011-05-31 22:56:51 +00001023
Devang Patel9fa539c2010-08-10 01:37:23 +00001024 // Add scoping info.
1025 if (!GV.isLocalToUnit()) {
Devang Patel3cbee302011-04-12 22:53:02 +00001026 TheCU->addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Devang Patel9fa539c2010-08-10 01:37:23 +00001027 // Expose as global.
1028 TheCU->addGlobal(GV.getName(), VariableDIE);
1029 }
1030 // Add line number info.
Devang Patel3cbee302011-04-12 22:53:02 +00001031 TheCU->addSourceLine(VariableDIE, GV);
Devang Patel9fa539c2010-08-10 01:37:23 +00001032 // Add to map.
1033 TheCU->insertDIE(N, VariableDIE);
1034 // Add to context owner.
1035 DIDescriptor GVContext = GV.getContext();
Devang Patel3cbee302011-04-12 22:53:02 +00001036 TheCU->addToContextOwner(VariableDIE, GVContext);
Devang Patel9fa539c2010-08-10 01:37:23 +00001037 // Add location.
Devang Patel29368072010-08-10 07:11:13 +00001038 if (isGlobalVariable) {
1039 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel3cbee302011-04-12 22:53:02 +00001040 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1041 TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata,
Devang Patel29368072010-08-10 07:11:13 +00001042 Asm->Mang->getSymbol(GV.getGlobal()));
1043 // Do not create specification DIE if context is either compile unit
1044 // or a subprogram.
1045 if (GV.isDefinition() && !GVContext.isCompileUnit() &&
1046 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1047 // Create specification DIE.
1048 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel3cbee302011-04-12 22:53:02 +00001049 TheCU->addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
Devang Patel29368072010-08-10 07:11:13 +00001050 dwarf::DW_FORM_ref4, VariableDIE);
Devang Patel3cbee302011-04-12 22:53:02 +00001051 TheCU->addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1052 TheCU->addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Devang Patel29368072010-08-10 07:11:13 +00001053 TheCU->addDie(VariableSpecDIE);
1054 } else {
Devang Patel3cbee302011-04-12 22:53:02 +00001055 TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Devang Patel29368072010-08-10 07:11:13 +00001056 }
Devang Patel8594d422011-06-24 20:46:11 +00001057 } else if (const ConstantInt *CI =
Devang Patel76a788c2011-01-06 21:39:25 +00001058 dyn_cast_or_null<ConstantInt>(GV.getConstant()))
Devang Patel3cbee302011-04-12 22:53:02 +00001059 TheCU->addConstantValue(VariableDIE, CI, isUnsignedDIType(GTy));
Devang Patele449d1f2011-01-20 00:02:16 +00001060 else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
1061 // GV is a merged global.
1062 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel3cbee302011-04-12 22:53:02 +00001063 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1064 TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata,
1065 Asm->Mang->getSymbol(cast<GlobalValue>(CE->getOperand(0))));
Devang Patel3cbee302011-04-12 22:53:02 +00001066 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
Devang Patel027cbf92011-08-03 01:25:46 +00001067 TheCU->addUInt(Block, 0, dwarf::DW_FORM_udata,
1068 getMergedGlobalElementOffset(Asm->getTargetData(), CE));
Devang Patel3cbee302011-04-12 22:53:02 +00001069 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1070 TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Devang Patele449d1f2011-01-20 00:02:16 +00001071 }
Devang Patel76a788c2011-01-06 21:39:25 +00001072
Devang Patel13e16b62009-06-26 01:49:18 +00001073 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001074}
1075
Devang Patel163a9f72010-05-10 22:49:55 +00001076/// construct SubprogramDIE - Construct subprogram DIE.
Devang Patele9f8f5e2010-05-07 20:54:48 +00001077void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +00001078 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001079
Stuart Hastings639336e2010-04-06 21:38:29 +00001080 // Check for pre-existence.
Devang Patel163a9f72010-05-10 22:49:55 +00001081 CompileUnit *TheCU = getCompileUnit(N);
1082 if (TheCU->getDIE(N))
Stuart Hastings639336e2010-04-06 21:38:29 +00001083 return;
1084
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001085 if (!SP.isDefinition())
1086 // This is a method declaration which will be handled while constructing
1087 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +00001088 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001089
Stuart Hastings639336e2010-04-06 21:38:29 +00001090 DIE *SubprogramDie = createSubprogramDIE(SP);
1091
1092 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +00001093 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001094
1095 // Add to context owner.
Devang Patel3cbee302011-04-12 22:53:02 +00001096 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +00001097
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001098 // Expose as global.
Devang Patel163a9f72010-05-10 22:49:55 +00001099 TheCU->addGlobal(SP.getName(), SubprogramDie);
Devang Patel193f7202009-11-24 01:14:22 +00001100
Devang Patel13e16b62009-06-26 01:49:18 +00001101 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001102}
1103
Devang Patel2c4ceb12009-11-21 02:48:08 +00001104/// beginModule - Emit all Dwarf sections that should come prior to the
Daniel Dunbar00564992009-09-19 20:40:14 +00001105/// content. Create global DIEs and emit initial debug info sections.
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001106/// This is invoked by the target AsmPrinter.
Chris Lattner75f50722010-04-04 07:48:20 +00001107void DwarfDebug::beginModule(Module *M) {
Devang Pateleac9c072010-04-27 19:46:33 +00001108 if (DisableDebugInfoPrinting)
1109 return;
1110
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001111 // If module has named metadata anchors then use them, otherwise scan the
1112 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +00001113 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
1114 if (CU_Nodes) {
Devang Patela938dd02011-05-04 16:34:02 +00001115
1116 NamedMDNode *GV_Nodes = M->getNamedMetadata("llvm.dbg.gv");
1117 NamedMDNode *SP_Nodes = M->getNamedMetadata("llvm.dbg.sp");
1118 if (!GV_Nodes && !SP_Nodes)
1119 // If there are not any global variables or any functions then
1120 // there is not any debug info in this module.
Devang Patel30692ab2011-05-03 16:45:22 +00001121 return;
1122
Devang Patela938dd02011-05-04 16:34:02 +00001123 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i)
1124 constructCompileUnit(CU_Nodes->getOperand(i));
Devang Patel30692ab2011-05-03 16:45:22 +00001125
Devang Patela938dd02011-05-04 16:34:02 +00001126 if (GV_Nodes)
1127 for (unsigned i = 0, e = GV_Nodes->getNumOperands(); i != e; ++i)
1128 constructGlobalVariableDIE(GV_Nodes->getOperand(i));
1129
1130 if (SP_Nodes)
1131 for (unsigned i = 0, e = SP_Nodes->getNumOperands(); i != e; ++i)
1132 constructSubprogramDIE(SP_Nodes->getOperand(i));
Devang Patel30692ab2011-05-03 16:45:22 +00001133
1134 } else {
1135
1136 DebugInfoFinder DbgFinder;
1137 DbgFinder.processModule(*M);
1138
Devang Patela938dd02011-05-04 16:34:02 +00001139 bool HasDebugInfo = false;
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001140 // Scan all the compile-units to see if there are any marked as the main
1141 // unit. If not, we do not generate debug info.
Devang Patel30692ab2011-05-03 16:45:22 +00001142 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1143 E = DbgFinder.compile_unit_end(); I != E; ++I) {
1144 if (DICompileUnit(*I).isMain()) {
1145 HasDebugInfo = true;
1146 break;
1147 }
1148 }
Devang Patela938dd02011-05-04 16:34:02 +00001149 if (!HasDebugInfo) return;
Devang Patel30692ab2011-05-03 16:45:22 +00001150
1151 // Create all the compile unit DIEs.
1152 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1153 E = DbgFinder.compile_unit_end(); I != E; ++I)
1154 constructCompileUnit(*I);
1155
1156 // Create DIEs for each global variable.
1157 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1158 E = DbgFinder.global_variable_end(); I != E; ++I)
1159 constructGlobalVariableDIE(*I);
1160
1161 // Create DIEs for each subprogram.
1162 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1163 E = DbgFinder.subprogram_end(); I != E; ++I)
1164 constructSubprogramDIE(*I);
Chris Lattnerd850ac72010-04-05 02:19:28 +00001165 }
Devang Patel30692ab2011-05-03 16:45:22 +00001166
Chris Lattnerd850ac72010-04-05 02:19:28 +00001167 // Tell MMI that we have debug info.
1168 MMI->setDebugInfoAvailability(true);
Devang Patel30692ab2011-05-03 16:45:22 +00001169
Chris Lattnerbe15beb2010-04-04 23:17:54 +00001170 // Emit initial sections.
Chris Lattnerd850ac72010-04-05 02:19:28 +00001171 EmitSectionLabels();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001172
Devang Patele7e5a0f2010-08-10 20:01:20 +00001173 //getOrCreateTypeDIE
1174 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
Devang Patel3cbee302011-04-12 22:53:02 +00001175 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1176 DIType Ty(NMD->getOperand(i));
1177 getCompileUnit(Ty)->getOrCreateTypeDIE(Ty);
1178 }
Devang Patele7e5a0f2010-08-10 20:01:20 +00001179
Devang Patel1a7ca032010-09-28 18:08:20 +00001180 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
Devang Patel3cbee302011-04-12 22:53:02 +00001181 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1182 DIType Ty(NMD->getOperand(i));
1183 getCompileUnit(Ty)->getOrCreateTypeDIE(Ty);
1184 }
Devang Patel1a7ca032010-09-28 18:08:20 +00001185
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001186 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +00001187 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001188}
1189
Devang Patel2c4ceb12009-11-21 02:48:08 +00001190/// endModule - Emit all Dwarf sections that should come after the content.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001191///
Devang Patel2c4ceb12009-11-21 02:48:08 +00001192void DwarfDebug::endModule() {
Devang Patel163a9f72010-05-10 22:49:55 +00001193 if (!FirstCU) return;
Devang Patel4a1cad62010-06-28 18:25:03 +00001194 const Module *M = MMI->getModule();
Devang Patele9a1cca2010-08-02 17:32:15 +00001195 DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
Devang Patel4a1cad62010-06-28 18:25:03 +00001196 if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
1197 for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
1198 if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
1199 DISubprogram SP(AllSPs->getOperand(SI));
1200 if (!SP.Verify()) continue;
1201
1202 // Collect info for variables that were optimized out.
Devang Patel8b3a6b62010-07-19 17:53:55 +00001203 if (!SP.isDefinition()) continue;
Devang Patel4a1cad62010-06-28 18:25:03 +00001204 StringRef FName = SP.getLinkageName();
1205 if (FName.empty())
1206 FName = SP.getName();
Devang Patel62367042010-11-10 22:19:21 +00001207 NamedMDNode *NMD = getFnSpecificMDNode(*(MMI->getModule()), FName);
Devang Patel4a1cad62010-06-28 18:25:03 +00001208 if (!NMD) continue;
1209 unsigned E = NMD->getNumOperands();
1210 if (!E) continue;
1211 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
Devang Patele9a1cca2010-08-02 17:32:15 +00001212 DeadFnScopeMap[SP] = Scope;
Devang Patel4a1cad62010-06-28 18:25:03 +00001213 for (unsigned I = 0; I != E; ++I) {
1214 DIVariable DV(NMD->getOperand(I));
1215 if (!DV.Verify()) continue;
1216 Scope->addVariable(new DbgVariable(DV));
1217 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001218
Devang Patel4a1cad62010-06-28 18:25:03 +00001219 // Construct subprogram DIE and add variables DIEs.
1220 constructSubprogramDIE(SP);
1221 DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
Devang Patele03161c2010-08-09 18:51:29 +00001222 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
Devang Patel4a1cad62010-06-28 18:25:03 +00001223 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1224 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1225 if (VariableDIE)
1226 ScopeDIE->addChild(VariableDIE);
1227 }
1228 }
1229 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001230
Devang Patel53bb5c92009-11-10 23:06:00 +00001231 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1232 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1233 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1234 DIE *ISP = *AI;
Devang Patel3cbee302011-04-12 22:53:02 +00001235 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +00001236 }
1237
Devang Patele9f8f5e2010-05-07 20:54:48 +00001238 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Devang Patel5d11eb02009-12-03 19:11:07 +00001239 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1240 DIE *SPDie = CI->first;
Devang Patele9f8f5e2010-05-07 20:54:48 +00001241 const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
Devang Patel5d11eb02009-12-03 19:11:07 +00001242 if (!N) continue;
Devang Patel163a9f72010-05-10 22:49:55 +00001243 DIE *NDie = getCompileUnit(N)->getDIE(N);
Devang Patel5d11eb02009-12-03 19:11:07 +00001244 if (!NDie) continue;
Devang Patel3cbee302011-04-12 22:53:02 +00001245 getCompileUnit(N)->addDIEEntry(SPDie, dwarf::DW_AT_containing_type,
1246 dwarf::DW_FORM_ref4, NDie);
Devang Patel5d11eb02009-12-03 19:11:07 +00001247 }
1248
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001249 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001250 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00001251 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001252 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00001253 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001254
1255 // End text sections.
1256 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001257 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Chris Lattnerc0215722010-04-04 19:25:43 +00001258 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001259 }
1260
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001261 // Compute DIE offsets and sizes.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001262 computeSizeAndOffsets();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001263
1264 // Emit all the DIEs into a debug info section
Devang Patel2c4ceb12009-11-21 02:48:08 +00001265 emitDebugInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001266
1267 // Corresponding abbreviations into a abbrev section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001268 emitAbbreviations();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001269
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001270 // Emit info into a debug pubnames section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001271 emitDebugPubNames();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001272
Devang Patel193f7202009-11-24 01:14:22 +00001273 // Emit info into a debug pubtypes section.
1274 emitDebugPubTypes();
1275
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001276 // Emit info into a debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001277 emitDebugLoc();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001278
1279 // Emit info into a debug aranges section.
1280 EmitDebugARanges();
1281
1282 // Emit info into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001283 emitDebugRanges();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001284
1285 // Emit info into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001286 emitDebugMacInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001287
1288 // Emit inline info.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001289 emitDebugInlineInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001290
Chris Lattnerbc733f52010-03-13 02:17:42 +00001291 // Emit info into a debug str section.
1292 emitDebugStr();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001293
Devang Patele9a1cca2010-08-02 17:32:15 +00001294 // clean up.
1295 DeleteContainerSeconds(DeadFnScopeMap);
Devang Patel163a9f72010-05-10 22:49:55 +00001296 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1297 E = CUMap.end(); I != E; ++I)
1298 delete I->second;
1299 FirstCU = NULL; // Reset for the next Module, if any.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001300}
1301
Devang Patel53bb5c92009-11-10 23:06:00 +00001302/// findAbstractVariable - Find abstract variable, if any, associated with Var.
Devang Patelc8fcfc92011-07-19 22:31:15 +00001303DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattnerde4845c2010-04-02 19:42:39 +00001304 DebugLoc ScopeLoc) {
Devang Patelc8fcfc92011-07-19 22:31:15 +00001305 LLVMContext &Ctx = DV->getContext();
1306
1307 // More then one inlined variable corresponds to one abstract variable.
1308 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patel53bb5c92009-11-10 23:06:00 +00001309
Devang Patel2db49d72010-05-07 18:11:54 +00001310 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00001311 if (AbsDbgVariable)
1312 return AbsDbgVariable;
1313
Devang Patelc8fcfc92011-07-19 22:31:15 +00001314
Chris Lattnerde4845c2010-04-02 19:42:39 +00001315 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00001316 if (!Scope)
1317 return NULL;
1318
Devang Patel26c1e562010-05-20 16:36:41 +00001319 AbsDbgVariable = new DbgVariable(Var);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001320 Scope->addVariable(AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00001321 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00001322 return AbsDbgVariable;
1323}
1324
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001325/// addCurrentFnArgument - If Var is a current function argument then add
1326/// it to CurrentFnArguments list.
Devang Patel0478c152011-03-01 22:58:55 +00001327bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
1328 DbgVariable *Var, DbgScope *Scope) {
1329 if (Scope != CurrentFnDbgScope)
1330 return false;
1331 DIVariable DV = Var->getVariable();
1332 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1333 return false;
1334 unsigned ArgNo = DV.getArgNumber();
1335 if (ArgNo == 0)
1336 return false;
1337
Devang Patelcb3a6572011-03-03 20:02:02 +00001338 size_t Size = CurrentFnArguments.size();
1339 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001340 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00001341 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00001342 // arguments does the function have at source level.
1343 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00001344 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00001345 CurrentFnArguments[ArgNo - 1] = Var;
1346 return true;
1347}
1348
Devang Patelee432862010-05-20 19:57:06 +00001349/// collectVariableInfoFromMMITable - Collect variable information from
1350/// side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001351void
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001352DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patelee432862010-05-20 19:57:06 +00001353 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patele717faa2009-10-06 01:26:37 +00001354 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1355 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1356 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00001357 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00001358 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00001359 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00001360 DIVariable DV(Var);
1361 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00001362
Devang Patel9b4a1722011-07-14 23:17:49 +00001363 DbgScope *Scope = findDbgScope(VP.second);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001364
Devang Patelfb0ee432009-11-10 23:20:04 +00001365 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00001366 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00001367 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001368
Devang Patel26c1e562010-05-20 16:36:41 +00001369 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
1370 DbgVariable *RegVar = new DbgVariable(DV);
1371 recordVariableFrameIndex(RegVar, VP.first);
Devang Patel0478c152011-03-01 22:58:55 +00001372 if (!addCurrentFnArgument(MF, RegVar, Scope))
1373 Scope->addVariable(RegVar);
Devang Patel26c1e562010-05-20 16:36:41 +00001374 if (AbsDbgVariable) {
1375 recordVariableFrameIndex(AbsDbgVariable, VP.first);
1376 VarToAbstractVarMap[RegVar] = AbsDbgVariable;
1377 }
Devang Patele717faa2009-10-06 01:26:37 +00001378 }
Devang Patelee432862010-05-20 19:57:06 +00001379}
Devang Patel90a48ad2010-03-15 18:33:46 +00001380
Jim Grosbach1e20b962010-07-21 21:21:52 +00001381/// isDbgValueInDefinedReg - Return true if debug value, encoded by
Devang Patelc3f5f782010-05-25 23:40:22 +00001382/// DBG_VALUE instruction, is in a defined reg.
1383static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
1384 assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001385 return MI->getNumOperands() == 3 &&
1386 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1387 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
Devang Patelc3f5f782010-05-25 23:40:22 +00001388}
1389
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001390/// getDebugLocEntry - Get .debug_loc entry for the instruction range starting
Devang Patel90b40412011-07-08 17:09:57 +00001391/// at MI.
1392static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1393 const MCSymbol *FLabel,
1394 const MCSymbol *SLabel,
1395 const MachineInstr *MI) {
1396 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1397
1398 if (MI->getNumOperands() != 3) {
1399 MachineLocation MLoc = Asm->getDebugValueLocation(MI);
1400 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1401 }
1402 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
1403 MachineLocation MLoc;
1404 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
1405 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1406 }
1407 if (MI->getOperand(0).isImm())
1408 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1409 if (MI->getOperand(0).isFPImm())
1410 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1411 if (MI->getOperand(0).isCImm())
1412 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1413
1414 assert (0 && "Unexpected 3 operand DBG_VALUE instruction!");
1415 return DotDebugLocEntry();
1416}
1417
Devang Patelee432862010-05-20 19:57:06 +00001418/// collectVariableInfo - Populate DbgScope entries with variables' info.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001419void
Devang Patel78e127d2010-06-25 22:07:34 +00001420DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1421 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001422
Devang Patelee432862010-05-20 19:57:06 +00001423 /// collection info from MMI table.
1424 collectVariableInfoFromMMITable(MF, Processed);
1425
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001426 for (SmallVectorImpl<const MDNode*>::const_iterator
1427 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1428 ++UVI) {
1429 const MDNode *Var = *UVI;
1430 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00001431 continue;
1432
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001433 // History contains relevant DBG_VALUE instructions for Var and instructions
1434 // clobbering it.
1435 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1436 if (History.empty())
1437 continue;
1438 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00001439
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001440 DIVariable DV(Var);
Devang Patela36478f2011-01-11 21:42:10 +00001441 DbgScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00001442 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1443 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelc0c5a262010-05-21 00:10:20 +00001444 Scope = CurrentFnDbgScope;
Devang Patel40c7e412011-07-20 22:18:50 +00001445 else {
1446 if (DV.getVersion() <= LLVMDebugVersion9)
1447 Scope = findDbgScope(MInsn->getDebugLoc());
1448 else {
1449 if (MDNode *IA = DV.getInlinedAt())
1450 Scope = InlinedDbgScopeMap.lookup(DebugLoc::getFromDILocation(IA));
1451 else
1452 Scope = DbgScopeMap.lookup(cast<MDNode>(DV->getOperand(1)));
1453 }
1454 }
Devang Patelee432862010-05-20 19:57:06 +00001455 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00001456 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001457 continue;
1458
1459 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001460 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patelee432862010-05-20 19:57:06 +00001461 DbgVariable *RegVar = new DbgVariable(DV);
Devang Patel0478c152011-03-01 22:58:55 +00001462 if (!addCurrentFnArgument(MF, RegVar, Scope))
1463 Scope->addVariable(RegVar);
Devang Patelc0c5a262010-05-21 00:10:20 +00001464 if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
1465 DbgVariableToDbgInstMap[AbsVar] = MInsn;
1466 VarToAbstractVarMap[RegVar] = AbsVar;
Devang Patel90a48ad2010-03-15 18:33:46 +00001467 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001468
1469 // Simple ranges that are fully coalesced.
1470 if (History.size() <= 1 || (History.size() == 2 &&
1471 MInsn->isIdenticalTo(History.back()))) {
Devang Patelc3f5f782010-05-25 23:40:22 +00001472 DbgVariableToDbgInstMap[RegVar] = MInsn;
1473 continue;
1474 }
1475
1476 // handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001477 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001478
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001479 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1480 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1481 const MachineInstr *Begin = *HI;
1482 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001483
Devang Patel4ada1d72011-06-01 23:00:17 +00001484 // Check if DBG_VALUE is truncating a range.
1485 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1486 && !Begin->getOperand(0).getReg())
1487 continue;
1488
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001489 // Compute the range for a register location.
1490 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1491 const MCSymbol *SLabel = 0;
1492
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001493 if (HI + 1 == HE)
1494 // If Begin is the last instruction in History then its value is valid
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001495 // until the end of the function.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001496 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001497 else {
1498 const MachineInstr *End = HI[1];
Devang Patel476df5f2011-07-07 21:44:42 +00001499 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
1500 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001501 if (End->isDebugValue())
1502 SLabel = getLabelBeforeInsn(End);
1503 else {
1504 // End is a normal instruction clobbering the range.
1505 SLabel = getLabelAfterInsn(End);
1506 assert(SLabel && "Forgot label after clobber instruction");
1507 ++HI;
1508 }
1509 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001510
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001511 // The value is valid until the next DBG_VALUE or clobber.
Devang Patel90b40412011-07-08 17:09:57 +00001512 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel, Begin));
Devang Patelc3f5f782010-05-25 23:40:22 +00001513 }
1514 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00001515 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001516
1517 // Collect info for variables that were optimized out.
Devang Pateld1bbc6b2010-06-22 01:01:58 +00001518 const Function *F = MF->getFunction();
Devang Patel62367042010-11-10 22:19:21 +00001519 if (NamedMDNode *NMD = getFnSpecificMDNode(*(F->getParent()), F->getName())) {
Devang Patel98e1cac2010-05-14 21:01:35 +00001520 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
Dan Gohman872814a2010-07-21 18:54:18 +00001521 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
Devang Patelee432862010-05-20 19:57:06 +00001522 if (!DV || !Processed.insert(DV))
Devang Patel98e1cac2010-05-14 21:01:35 +00001523 continue;
1524 DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
1525 if (Scope)
Devang Patel26c1e562010-05-20 16:36:41 +00001526 Scope->addVariable(new DbgVariable(DV));
Devang Patel98e1cac2010-05-14 21:01:35 +00001527 }
1528 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001529}
Devang Patel98e1cac2010-05-14 21:01:35 +00001530
Devang Patelc3f5f782010-05-25 23:40:22 +00001531/// getLabelBeforeInsn - Return Label preceding the instruction.
1532const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001533 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1534 assert(Label && "Didn't insert label before instruction");
1535 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001536}
1537
1538/// getLabelAfterInsn - Return Label immediately following the instruction.
1539const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001540 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001541}
1542
Devang Patelcbbe2872010-10-26 17:49:02 +00001543/// beginInstruction - Process beginning of an instruction.
1544void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001545 // Check if source location changes, but ignore DBG_VALUE locations.
1546 if (!MI->isDebugValue()) {
1547 DebugLoc DL = MI->getDebugLoc();
1548 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Devang Patel4243e672011-05-11 19:22:19 +00001549 unsigned Flags = DWARF2_FLAG_IS_STMT;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001550 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001551 if (DL == PrologEndLoc) {
1552 Flags |= DWARF2_FLAG_PROLOGUE_END;
1553 PrologEndLoc = DebugLoc();
1554 }
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001555 if (!DL.isUnknown()) {
1556 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001557 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001558 } else
Devang Patel4243e672011-05-11 19:22:19 +00001559 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001560 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001561 }
Devang Patelaead63c2010-03-29 22:59:58 +00001562
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001563 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001564 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1565 LabelsBeforeInsn.find(MI);
1566
1567 // No label needed.
1568 if (I == LabelsBeforeInsn.end())
1569 return;
1570
1571 // Label already assigned.
1572 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001573 return;
Devang Patel553881b2010-03-29 17:20:31 +00001574
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001575 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001576 PrevLabel = MMI->getContext().CreateTempSymbol();
1577 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001578 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001579 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001580}
1581
Devang Patelcbbe2872010-10-26 17:49:02 +00001582/// endInstruction - Process end of an instruction.
1583void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001584 // Don't create a new label after DBG_VALUE instructions.
1585 // They don't generate code.
1586 if (!MI->isDebugValue())
1587 PrevLabel = 0;
1588
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001589 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1590 LabelsAfterInsn.find(MI);
1591
1592 // No label needed.
1593 if (I == LabelsAfterInsn.end())
1594 return;
1595
1596 // Label already assigned.
1597 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001598 return;
1599
1600 // We need a label after this instruction.
1601 if (!PrevLabel) {
1602 PrevLabel = MMI->getContext().CreateTempSymbol();
1603 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001604 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001605 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001606}
1607
Devang Patel3737b892011-07-20 23:00:27 +00001608/// getOrCreateRegularScope - Create regular DbgScope.
1609DbgScope *DwarfDebug::getOrCreateRegularScope(MDNode *Scope) {
1610 DbgScope *WScope = DbgScopeMap.lookup(Scope);
1611 if (WScope)
1612 return WScope;
1613 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
1614 DbgScopeMap.insert(std::make_pair(Scope, WScope));
1615 if (DIDescriptor(Scope).isLexicalBlock()) {
1616 DbgScope *Parent =
1617 getOrCreateDbgScope(DebugLoc::getFromDILexicalBlock(Scope));
1618 WScope->setParent(Parent);
1619 Parent->addScope(WScope);
1620 } else if (DIDescriptor(Scope).isSubprogram()
1621 && DISubprogram(Scope).describes(Asm->MF->getFunction()))
1622 CurrentFnDbgScope = WScope;
1623
1624 return WScope;
1625}
1626
1627/// getOrCreateInlinedScope - Create inlined scope.
1628DbgScope *DwarfDebug::getOrCreateInlinedScope(MDNode *Scope, MDNode *InlinedAt){
1629 DbgScope *InlinedScope = DbgScopeMap.lookup(InlinedAt);
1630 if (InlinedScope)
1631 return InlinedScope;
1632
1633 InlinedScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
1634 DebugLoc InlinedLoc = DebugLoc::getFromDILocation(InlinedAt);
1635 InlinedDbgScopeMap[InlinedLoc] = InlinedScope;
1636 DbgScopeMap[InlinedAt] = InlinedScope;
1637 DbgScope *Parent = getOrCreateDbgScope(InlinedLoc);
1638 InlinedScope->setParent(Parent);
1639 Parent->addScope(InlinedScope);
1640 return InlinedScope;
1641}
1642
Devang Pateleac9c072010-04-27 19:46:33 +00001643/// getOrCreateDbgScope - Create DbgScope for the scope.
Devang Patel4f455d62011-07-14 22:30:56 +00001644DbgScope *DwarfDebug::getOrCreateDbgScope(DebugLoc DL) {
1645 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
Devang Pateld77ec622011-07-14 01:14:57 +00001646 MDNode *Scope = NULL;
1647 MDNode *InlinedAt = NULL;
1648 DL.getScopeAndInlinedAt(Scope, InlinedAt, Ctx);
Devang Patel3737b892011-07-20 23:00:27 +00001649 if (!InlinedAt)
1650 return getOrCreateRegularScope(Scope);
Devang Pateld77ec622011-07-14 01:14:57 +00001651
Devang Patel3737b892011-07-20 23:00:27 +00001652 // Create an abstract scope for inlined function.
Devang Patel78e127d2010-06-25 22:07:34 +00001653 getOrCreateAbstractScope(Scope);
Devang Patel3737b892011-07-20 23:00:27 +00001654 // Create an inlined scope for inlined function.
1655 return getOrCreateInlinedScope(Scope, InlinedAt);
Devang Patel0d20ac82009-10-06 01:50:42 +00001656}
1657
Devang Pateleac9c072010-04-27 19:46:33 +00001658/// calculateDominanceGraph - Calculate dominance graph for DbgScope
1659/// hierarchy.
1660static void calculateDominanceGraph(DbgScope *Scope) {
1661 assert (Scope && "Unable to calculate scop edominance graph!");
1662 SmallVector<DbgScope *, 4> WorkStack;
1663 WorkStack.push_back(Scope);
1664 unsigned Counter = 0;
1665 while (!WorkStack.empty()) {
1666 DbgScope *WS = WorkStack.back();
1667 const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
1668 bool visitedChildren = false;
1669 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
1670 SE = Children.end(); SI != SE; ++SI) {
1671 DbgScope *ChildScope = *SI;
1672 if (!ChildScope->getDFSOut()) {
1673 WorkStack.push_back(ChildScope);
1674 visitedChildren = true;
1675 ChildScope->setDFSIn(++Counter);
Devang Patel26a92002011-07-27 00:34:13 +00001676#ifndef NDEBUG
1677 if (PrintDbgScope)
1678 dbgs() << "calculate dbgscope dom: In " << Counter << "\n";
1679#endif
Devang Pateleac9c072010-04-27 19:46:33 +00001680 break;
1681 }
1682 }
1683 if (!visitedChildren) {
1684 WorkStack.pop_back();
1685 WS->setDFSOut(++Counter);
Devang Patel26a92002011-07-27 00:34:13 +00001686#ifndef NDEBUG
1687 if (PrintDbgScope)
1688 dbgs() << "calculate dbgscope dom: In " << WS->getDFSIn()
1689 << " Out " << Counter << "\n";
1690#endif
Devang Pateleac9c072010-04-27 19:46:33 +00001691 }
1692 }
1693}
1694
1695/// printDbgScopeInfo - Print DbgScope info for each machine instruction.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001696static
Devang Patel4f455d62011-07-14 22:30:56 +00001697void printDbgScopeInfo(const MachineFunction *MF,
Devang Pateleac9c072010-04-27 19:46:33 +00001698 DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
1699{
1700#ifndef NDEBUG
Devang Patel4f455d62011-07-14 22:30:56 +00001701 LLVMContext &Ctx = MF->getFunction()->getContext();
Devang Pateleac9c072010-04-27 19:46:33 +00001702 unsigned PrevDFSIn = 0;
1703 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1704 I != E; ++I) {
1705 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1706 II != IE; ++II) {
1707 const MachineInstr *MInsn = II;
Devang Patel0cd0c242011-07-14 00:20:24 +00001708 MDNode *Scope = NULL;
1709 MDNode *InlinedAt = NULL;
Devang Pateleac9c072010-04-27 19:46:33 +00001710
1711 // Check if instruction has valid location information.
Devang Patel0cd0c242011-07-14 00:20:24 +00001712 DebugLoc MIDL = MInsn->getDebugLoc();
1713 if (!MIDL.isUnknown()) {
1714 MIDL.getScopeAndInlinedAt(Scope, InlinedAt, Ctx);
Devang Pateleac9c072010-04-27 19:46:33 +00001715 dbgs() << " [ ";
Jim Grosbach1e20b962010-07-21 21:21:52 +00001716 if (InlinedAt)
Devang Pateleac9c072010-04-27 19:46:33 +00001717 dbgs() << "*";
Jim Grosbach1e20b962010-07-21 21:21:52 +00001718 DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
Devang Pateleac9c072010-04-27 19:46:33 +00001719 MI2ScopeMap.find(MInsn);
1720 if (DI != MI2ScopeMap.end()) {
1721 DbgScope *S = DI->second;
1722 dbgs() << S->getDFSIn();
1723 PrevDFSIn = S->getDFSIn();
1724 } else
1725 dbgs() << PrevDFSIn;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001726 } else
Devang Pateleac9c072010-04-27 19:46:33 +00001727 dbgs() << " [ x" << PrevDFSIn;
1728 dbgs() << " ]";
1729 MInsn->dump();
1730 }
1731 dbgs() << "\n";
1732 }
1733#endif
1734}
Devang Patel2c4ceb12009-11-21 02:48:08 +00001735/// extractScopeInformation - Scan machine instructions in this function
Chris Lattner14d750d2010-03-31 05:39:57 +00001736/// and collect DbgScopes. Return true, if at least one scope was found.
Chris Lattnereec791a2010-01-26 23:18:02 +00001737bool DwarfDebug::extractScopeInformation() {
Devang Patelaf9e8472009-10-01 20:31:14 +00001738 // If scope information was extracted using .dbg intrinsics then there is not
1739 // any need to extract these information by scanning each instruction.
1740 if (!DbgScopeMap.empty())
1741 return false;
1742
Dan Gohman314bf7c2010-04-23 01:18:53 +00001743 // Scan each instruction and create scopes. First build working set of scopes.
Devang Pateleac9c072010-04-27 19:46:33 +00001744 SmallVector<DbgRange, 4> MIRanges;
1745 DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
Chris Lattnerd38fee82010-04-05 00:13:49 +00001746 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
Devang Patelaf9e8472009-10-01 20:31:14 +00001747 I != E; ++I) {
Devang Patela671a302011-07-26 18:09:53 +00001748 const MachineInstr *RangeBeginMI = NULL;
1749 const MachineInstr *PrevMI = NULL;
1750 DebugLoc PrevDL;
Devang Patelaf9e8472009-10-01 20:31:14 +00001751 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1752 II != IE; ++II) {
1753 const MachineInstr *MInsn = II;
Devang Pateleac9c072010-04-27 19:46:33 +00001754
1755 // Check if instruction has valid location information.
Devang Patel0cd0c242011-07-14 00:20:24 +00001756 const DebugLoc MIDL = MInsn->getDebugLoc();
1757 if (MIDL.isUnknown()) {
Devang Pateleac9c072010-04-27 19:46:33 +00001758 PrevMI = MInsn;
1759 continue;
1760 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001761
Devang Pateleac9c072010-04-27 19:46:33 +00001762 // If scope has not changed then skip this instruction.
Devang Pateld77ec622011-07-14 01:14:57 +00001763 if (MIDL == PrevDL) {
Devang Pateleac9c072010-04-27 19:46:33 +00001764 PrevMI = MInsn;
1765 continue;
1766 }
1767
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001768 // Ignore DBG_VALUE. It does not contribute to any instruction in output.
Devang Pateld3526ea2011-02-15 17:56:09 +00001769 if (MInsn->isDebugValue())
1770 continue;
1771
Jim Grosbach1e20b962010-07-21 21:21:52 +00001772 if (RangeBeginMI) {
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001773 // If we have already seen a beginning of an instruction range and
Devang Pateleac9c072010-04-27 19:46:33 +00001774 // current instruction scope does not match scope of first instruction
1775 // in this range then create a new instruction range.
Devang Patel0f16a4e2011-07-14 00:04:53 +00001776 DEBUG(dbgs() << "Creating new instruction range :\n");
Devang Patel5fc0d882011-07-14 00:03:58 +00001777 DEBUG(dbgs() << "Begin Range at " << *RangeBeginMI);
1778 DEBUG(dbgs() << "End Range at " << *PrevMI);
Devang Patel0f16a4e2011-07-14 00:04:53 +00001779 DEBUG(dbgs() << "Next Range starting at " << *MInsn);
Devang Patel5fc0d882011-07-14 00:03:58 +00001780 DEBUG(dbgs() << "------------------------\n");
Devang Pateleac9c072010-04-27 19:46:33 +00001781 DbgRange R(RangeBeginMI, PrevMI);
Devang Patel4f455d62011-07-14 22:30:56 +00001782 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevDL);
Devang Pateleac9c072010-04-27 19:46:33 +00001783 MIRanges.push_back(R);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001784 }
Devang Pateleac9c072010-04-27 19:46:33 +00001785
1786 // This is a beginning of a new instruction range.
1787 RangeBeginMI = MInsn;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001788
Devang Pateleac9c072010-04-27 19:46:33 +00001789 // Reset previous markers.
1790 PrevMI = MInsn;
Devang Pateld77ec622011-07-14 01:14:57 +00001791 PrevDL = MIDL;
Devang Patel53bb5c92009-11-10 23:06:00 +00001792 }
Devang Patel53bb5c92009-11-10 23:06:00 +00001793
Devang Patela671a302011-07-26 18:09:53 +00001794 // Create last instruction range.
1795 if (RangeBeginMI && PrevMI && !PrevDL.isUnknown()) {
1796 DbgRange R(RangeBeginMI, PrevMI);
1797 MIRanges.push_back(R);
1798 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevDL);
1799 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001800 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001801
Devang Patel344130e2010-01-04 20:44:00 +00001802 if (!CurrentFnDbgScope)
1803 return false;
1804
Devang Pateleac9c072010-04-27 19:46:33 +00001805 calculateDominanceGraph(CurrentFnDbgScope);
1806 if (PrintDbgScope)
Devang Patel4f455d62011-07-14 22:30:56 +00001807 printDbgScopeInfo(Asm->MF, MI2ScopeMap);
Devang Pateleac9c072010-04-27 19:46:33 +00001808
1809 // Find ranges of instructions covered by each DbgScope;
1810 DbgScope *PrevDbgScope = NULL;
1811 for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
1812 RE = MIRanges.end(); RI != RE; ++RI) {
1813 const DbgRange &R = *RI;
1814 DbgScope *S = MI2ScopeMap.lookup(R.first);
1815 assert (S && "Lost DbgScope for a machine instruction!");
1816 if (PrevDbgScope && !PrevDbgScope->dominates(S))
1817 PrevDbgScope->closeInsnRange(S);
1818 S->openInsnRange(R.first);
1819 S->extendInsnRange(R.second);
1820 PrevDbgScope = S;
1821 }
1822
1823 if (PrevDbgScope)
1824 PrevDbgScope->closeInsnRange();
Devang Patelaf9e8472009-10-01 20:31:14 +00001825
Devang Patele37b0c62010-04-08 18:43:56 +00001826 identifyScopeMarkers();
Devang Patel6122a4d2010-04-08 15:37:09 +00001827
1828 return !DbgScopeMap.empty();
1829}
1830
Jim Grosbach1e20b962010-07-21 21:21:52 +00001831/// identifyScopeMarkers() -
Devang Pateleac9c072010-04-27 19:46:33 +00001832/// Each DbgScope has first instruction and last instruction to mark beginning
1833/// and end of a scope respectively. Create an inverse map that list scopes
1834/// starts (and ends) with an instruction. One instruction may start (or end)
1835/// multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001836void DwarfDebug::identifyScopeMarkers() {
Devang Patel42aafd72010-01-20 02:05:23 +00001837 SmallVector<DbgScope *, 4> WorkList;
1838 WorkList.push_back(CurrentFnDbgScope);
1839 while (!WorkList.empty()) {
Chris Lattner14d750d2010-03-31 05:39:57 +00001840 DbgScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001841
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001842 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001843 if (!Children.empty())
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001844 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00001845 SE = Children.end(); SI != SE; ++SI)
1846 WorkList.push_back(*SI);
1847
Devang Patel53bb5c92009-11-10 23:06:00 +00001848 if (S->isAbstractScope())
1849 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001850
Devang Pateleac9c072010-04-27 19:46:33 +00001851 const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
1852 if (Ranges.empty())
1853 continue;
1854 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1855 RE = Ranges.end(); RI != RE; ++RI) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001856 assert(RI->first && "DbgRange does not have first instruction!");
1857 assert(RI->second && "DbgRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001858 requestLabelBeforeInsn(RI->first);
1859 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001860 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001861 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001862}
1863
Devang Patela3f48672011-05-09 22:14:49 +00001864/// getScopeNode - Get MDNode for DebugLoc's scope.
1865static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1866 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1867 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1868 return DL.getScope(Ctx);
1869}
1870
Devang Patel4243e672011-05-11 19:22:19 +00001871/// getFnDebugLoc - Walk up the scope chain of given debug loc and find
1872/// line number info for the function.
1873static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1874 const MDNode *Scope = getScopeNode(DL, Ctx);
1875 DISubprogram SP = getDISubprogram(Scope);
1876 if (SP.Verify())
1877 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1878 return DebugLoc();
1879}
1880
Devang Patel2c4ceb12009-11-21 02:48:08 +00001881/// beginFunction - Gather pre-function debug information. Assumes being
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001882/// emitted immediately after the function entry point.
Chris Lattnereec791a2010-01-26 23:18:02 +00001883void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00001884 if (!MMI->hasDebugInfo()) return;
Bill Wendling5f017e82010-04-07 09:28:04 +00001885 if (!extractScopeInformation()) return;
Devang Patel60b35bd2009-10-06 18:37:31 +00001886
Devang Pateleac9c072010-04-27 19:46:33 +00001887 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1888 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001889 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001890 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001891
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001892 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1893
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001894 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001895 /// LiveUserVar - Map physreg numbers to the MDNode they contain.
1896 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1897
Devang Patelb2b31a62010-05-26 19:37:24 +00001898 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001899 I != E; ++I) {
1900 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00001901 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1902 II != IE; ++II) {
1903 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001904
Devang Patelb2b31a62010-05-26 19:37:24 +00001905 if (MI->isDebugValue()) {
Devang Patelb2b31a62010-05-26 19:37:24 +00001906 assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001907
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001908 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001909 const MDNode *Var =
1910 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001911
1912 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001913 if (isDbgValueInDefinedReg(MI))
1914 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1915
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001916 // Check the history of this variable.
1917 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1918 if (History.empty()) {
1919 UserVariables.push_back(Var);
1920 // The first mention of a function argument gets the FunctionBeginSym
1921 // label, so arguments are visible when breaking at function entry.
1922 DIVariable DV(Var);
1923 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1924 DISubprogram(getDISubprogram(DV.getContext()))
1925 .describes(MF->getFunction()))
1926 LabelsBeforeInsn[MI] = FunctionBeginSym;
1927 } else {
1928 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1929 const MachineInstr *Prev = History.back();
1930 if (Prev->isDebugValue()) {
1931 // Coalesce identical entries at the end of History.
1932 if (History.size() >= 2 &&
Devang Patel79862892011-07-07 00:14:27 +00001933 Prev->isIdenticalTo(History[History.size() - 2])) {
1934 DEBUG(dbgs() << "Coalesce identical DBG_VALUE entries:\n"
1935 << "\t" << *Prev
1936 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001937 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001938 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001939
1940 // Terminate old register assignments that don't reach MI;
1941 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1942 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1943 isDbgValueInDefinedReg(Prev)) {
1944 // Previous register assignment needs to terminate at the end of
1945 // its basic block.
1946 MachineBasicBlock::const_iterator LastMI =
1947 PrevMBB->getLastNonDebugInstr();
Devang Patel79862892011-07-07 00:14:27 +00001948 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001949 // Drop DBG_VALUE for empty range.
Devang Patel79862892011-07-07 00:14:27 +00001950 DEBUG(dbgs() << "Drop DBG_VALUE for empty range:\n"
1951 << "\t" << *Prev << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001952 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001953 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001954 else {
1955 // Terminate after LastMI.
1956 History.push_back(LastMI);
1957 }
1958 }
1959 }
1960 }
1961 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00001962 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001963 // Not a DBG_VALUE instruction.
1964 if (!MI->isLabel())
1965 AtBlockEntry = false;
1966
Devang Patel4243e672011-05-11 19:22:19 +00001967 // First known non DBG_VALUE location marks beginning of function
1968 // body.
1969 if (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown())
1970 PrologEndLoc = MI->getDebugLoc();
1971
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001972 // Check if the instruction clobbers any registers with debug vars.
1973 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1974 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1975 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1976 continue;
1977 for (const unsigned *AI = TRI->getOverlaps(MOI->getReg());
1978 unsigned Reg = *AI; ++AI) {
1979 const MDNode *Var = LiveUserVar[Reg];
1980 if (!Var)
1981 continue;
1982 // Reg is now clobbered.
1983 LiveUserVar[Reg] = 0;
1984
1985 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001986 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1987 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001988 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001989 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1990 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001991 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001992 const MachineInstr *Prev = History.back();
1993 // Sanity-check: Register assignments are terminated at the end of
1994 // their block.
1995 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1996 continue;
1997 // Is the variable still in Reg?
1998 if (!isDbgValueInDefinedReg(Prev) ||
1999 Prev->getOperand(0).getReg() != Reg)
2000 continue;
2001 // Var is clobbered. Make sure the next instruction gets a label.
2002 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002003 }
2004 }
Devang Patelb2b31a62010-05-26 19:37:24 +00002005 }
Devang Patelb2b31a62010-05-26 19:37:24 +00002006 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002007 }
2008
2009 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
2010 I != E; ++I) {
2011 SmallVectorImpl<const MachineInstr*> &History = I->second;
2012 if (History.empty())
2013 continue;
2014
2015 // Make sure the final register assignments are terminated.
2016 const MachineInstr *Prev = History.back();
2017 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
2018 const MachineBasicBlock *PrevMBB = Prev->getParent();
2019 MachineBasicBlock::const_iterator LastMI = PrevMBB->getLastNonDebugInstr();
2020 if (LastMI == PrevMBB->end())
2021 // Drop DBG_VALUE for empty range.
2022 History.pop_back();
2023 else {
2024 // Terminate after LastMI.
2025 History.push_back(LastMI);
2026 }
2027 }
2028 // Request labels for the full history.
2029 for (unsigned i = 0, e = History.size(); i != e; ++i) {
2030 const MachineInstr *MI = History[i];
2031 if (MI->isDebugValue())
2032 requestLabelBeforeInsn(MI);
2033 else
2034 requestLabelAfterInsn(MI);
2035 }
2036 }
Devang Patelb2b31a62010-05-26 19:37:24 +00002037
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00002038 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00002039 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00002040
2041 // Record beginning of function.
2042 if (!PrologEndLoc.isUnknown()) {
2043 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
2044 MF->getFunction()->getContext());
2045 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
2046 FnStartDL.getScope(MF->getFunction()->getContext()),
2047 DWARF2_FLAG_IS_STMT);
2048 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002049}
2050
Devang Patel2c4ceb12009-11-21 02:48:08 +00002051/// endFunction - Gather and emit post-function debug information.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002052///
Chris Lattnereec791a2010-01-26 23:18:02 +00002053void DwarfDebug::endFunction(const MachineFunction *MF) {
Bill Wendling5f017e82010-04-07 09:28:04 +00002054 if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00002055
Devang Patel344130e2010-01-04 20:44:00 +00002056 if (CurrentFnDbgScope) {
Devang Patel65eb4822010-05-22 00:04:14 +00002057
Devang Patelc3f5f782010-05-25 23:40:22 +00002058 // Define end label for subprogram.
2059 FunctionEndSym = Asm->GetTempSymbol("func_end",
2060 Asm->getFunctionNumber());
2061 // Assumes in correct section after the entry point.
2062 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002063
Devang Patel78e127d2010-06-25 22:07:34 +00002064 SmallPtrSet<const MDNode *, 16> ProcessedVars;
2065 collectVariableInfo(MF, ProcessedVars);
Devang Patel65eb4822010-05-22 00:04:14 +00002066
Devang Patel344130e2010-01-04 20:44:00 +00002067 // Construct abstract scopes.
2068 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
Devang Patel78e127d2010-06-25 22:07:34 +00002069 AE = AbstractScopesList.end(); AI != AE; ++AI) {
Devang Patel78e127d2010-06-25 22:07:34 +00002070 DISubprogram SP((*AI)->getScopeNode());
2071 if (SP.Verify()) {
2072 // Collect info for variables that were optimized out.
2073 StringRef FName = SP.getLinkageName();
2074 if (FName.empty())
2075 FName = SP.getName();
Devang Patel62367042010-11-10 22:19:21 +00002076 if (NamedMDNode *NMD =
2077 getFnSpecificMDNode(*(MF->getFunction()->getParent()), FName)) {
Devang Patel78e127d2010-06-25 22:07:34 +00002078 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
Dan Gohman872814a2010-07-21 18:54:18 +00002079 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
Devang Patel78e127d2010-06-25 22:07:34 +00002080 if (!DV || !ProcessedVars.insert(DV))
2081 continue;
Devang Patel1d68d212010-06-30 00:11:08 +00002082 DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
Devang Patel78e127d2010-06-25 22:07:34 +00002083 if (Scope)
2084 Scope->addVariable(new DbgVariable(DV));
2085 }
2086 }
2087 }
Devang Patel90e19aa2010-06-30 01:40:11 +00002088 if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
2089 constructScopeDIE(*AI);
Devang Patel78e127d2010-06-25 22:07:34 +00002090 }
Devang Patel61409622010-07-07 20:12:52 +00002091
Devang Patel9c488372010-05-04 06:15:30 +00002092 DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002093
Devang Patel9c488372010-05-04 06:15:30 +00002094 if (!DisableFramePointerElim(*MF))
Devang Patel3cbee302011-04-12 22:53:02 +00002095 getCompileUnit(CurrentFnDbgScope->getScopeNode())->addUInt(CurFnDIE,
2096 dwarf::DW_AT_APPLE_omit_frame_ptr,
2097 dwarf::DW_FORM_flag, 1);
Devang Patel9c488372010-05-04 06:15:30 +00002098
2099
Chris Lattnerd38fee82010-04-05 00:13:49 +00002100 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
Devang Patel344130e2010-01-04 20:44:00 +00002101 MMI->getFrameMoves()));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002102 }
2103
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002104 // Clear debug info
Devang Patelf54b8522010-01-19 01:26:02 +00002105 CurrentFnDbgScope = NULL;
Devang Pateleac0c9d2011-04-22 18:09:57 +00002106 DeleteContainerPointers(CurrentFnArguments);
Devang Patel26c1e562010-05-20 16:36:41 +00002107 DbgVariableToFrameIndexMap.clear();
2108 VarToAbstractVarMap.clear();
2109 DbgVariableToDbgInstMap.clear();
Devang Patel133b0992011-07-15 21:25:44 +00002110 InlinedDbgScopeMap.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002111 DeleteContainerSeconds(DbgScopeMap);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002112 UserVariables.clear();
2113 DbgValues.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002114 DeleteContainerSeconds(AbstractScopes);
Devang Patelf54b8522010-01-19 01:26:02 +00002115 AbstractScopesList.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002116 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00002117 LabelsBeforeInsn.clear();
2118 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00002119 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002120}
2121
Devang Patel26c1e562010-05-20 16:36:41 +00002122/// recordVariableFrameIndex - Record a variable's index.
2123void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2124 assert (V && "Invalid DbgVariable!");
2125 DbgVariableToFrameIndexMap[V] = Index;
2126}
2127
2128/// findVariableFrameIndex - Return true if frame index for the variable
2129/// is found. Update FI to hold value of the index.
2130bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2131 assert (V && "Invalid DbgVariable!");
2132 DenseMap<const DbgVariable *, int>::iterator I =
2133 DbgVariableToFrameIndexMap.find(V);
2134 if (I == DbgVariableToFrameIndexMap.end())
2135 return false;
2136 *FI = I->second;
2137 return true;
2138}
2139
Devang Patel9b4a1722011-07-14 23:17:49 +00002140/// findDbgScope - Find DbgScope for the debug loc.
2141DbgScope *DwarfDebug::findDbgScope(DebugLoc DL) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00002142 if (DL.isUnknown())
Devang Patel9b4a1722011-07-14 23:17:49 +00002143 return NULL;
Devang Patelee432862010-05-20 19:57:06 +00002144
Devang Patel9b4a1722011-07-14 23:17:49 +00002145 DbgScope *Scope = NULL;
2146 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
Devang Patel133b0992011-07-15 21:25:44 +00002147 if (MDNode *IA = DL.getInlinedAt(Ctx))
2148 Scope = InlinedDbgScopeMap.lookup(DebugLoc::getFromDILocation(IA));
2149 else
2150 Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
Devang Patelee432862010-05-20 19:57:06 +00002151 return Scope;
2152}
2153
2154
Chris Lattnerc6087842010-03-09 04:54:43 +00002155/// recordSourceLine - Register a source line with debug info. Returns the
2156/// unique label that was emitted and which provides correspondence to
2157/// the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00002158void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
2159 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00002160 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00002161 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00002162 unsigned Src = 1;
2163 if (S) {
2164 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00002165
Dan Gohman1cc0d622010-05-05 23:41:32 +00002166 if (Scope.isCompileUnit()) {
2167 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00002168 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00002169 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00002170 } else if (Scope.isFile()) {
2171 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00002172 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00002173 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00002174 } else if (Scope.isSubprogram()) {
2175 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00002176 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00002177 Dir = SP.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00002178 } else if (Scope.isLexicalBlock()) {
2179 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00002180 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00002181 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00002182 } else
2183 assert(0 && "Unexpected scope info");
2184
Devang Patel23670e52011-03-24 20:30:50 +00002185 Src = GetOrCreateSourceID(Fn, Dir);
Dan Gohman1cc0d622010-05-05 23:41:32 +00002186 }
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002187 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002188}
2189
Bill Wendling829e67b2009-05-20 23:22:40 +00002190//===----------------------------------------------------------------------===//
2191// Emit Methods
2192//===----------------------------------------------------------------------===//
2193
Devang Patel2c4ceb12009-11-21 02:48:08 +00002194/// computeSizeAndOffset - Compute the size and offset of a DIE.
Bill Wendling94d04b82009-05-20 23:21:38 +00002195///
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002196unsigned
2197DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002198 // Get the children.
2199 const std::vector<DIE *> &Children = Die->getChildren();
2200
2201 // If not last sibling and has children then add sibling offset attribute.
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00002202 if (!Last && !Children.empty())
Benjamin Kramer345ef342010-03-31 19:34:01 +00002203 Die->addSiblingOffset(DIEValueAllocator);
Bill Wendling94d04b82009-05-20 23:21:38 +00002204
2205 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002206 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00002207
2208 // Get the abbreviation for this DIE.
2209 unsigned AbbrevNumber = Die->getAbbrevNumber();
2210 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2211
2212 // Set DIE offset
2213 Die->setOffset(Offset);
2214
2215 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00002216 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00002217
2218 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2219 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2220
2221 // Size the DIE attribute values.
2222 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2223 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00002224 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00002225
2226 // Size the DIE children if any.
2227 if (!Children.empty()) {
2228 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2229 "Children flag not set");
2230
2231 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002232 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
Bill Wendling94d04b82009-05-20 23:21:38 +00002233
2234 // End of children marker.
2235 Offset += sizeof(int8_t);
2236 }
2237
2238 Die->setSize(Offset - Die->getOffset());
2239 return Offset;
2240}
2241
Devang Patel2c4ceb12009-11-21 02:48:08 +00002242/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
Bill Wendling94d04b82009-05-20 23:21:38 +00002243///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002244void DwarfDebug::computeSizeAndOffsets() {
Devang Patel163a9f72010-05-10 22:49:55 +00002245 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2246 E = CUMap.end(); I != E; ++I) {
2247 // Compute size of compile unit header.
Devang Patel513edf62011-04-12 23:10:47 +00002248 unsigned Offset =
Devang Patel163a9f72010-05-10 22:49:55 +00002249 sizeof(int32_t) + // Length of Compilation Unit Info
2250 sizeof(int16_t) + // DWARF version number
2251 sizeof(int32_t) + // Offset Into Abbrev. Section
2252 sizeof(int8_t); // Pointer Size (in bytes)
2253 computeSizeAndOffset(I->second->getCUDie(), Offset, true);
Devang Patel163a9f72010-05-10 22:49:55 +00002254 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002255}
2256
Chris Lattner11b8f302010-04-04 23:02:02 +00002257/// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2258/// temporary label to it if SymbolStem is specified.
Chris Lattner9c69e285532010-04-04 22:59:04 +00002259static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Chris Lattner11b8f302010-04-04 23:02:02 +00002260 const char *SymbolStem = 0) {
Chris Lattner9c69e285532010-04-04 22:59:04 +00002261 Asm->OutStreamer.SwitchSection(Section);
Chris Lattner11b8f302010-04-04 23:02:02 +00002262 if (!SymbolStem) return 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002263
Chris Lattner9c69e285532010-04-04 22:59:04 +00002264 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2265 Asm->OutStreamer.EmitLabel(TmpSym);
2266 return TmpSym;
2267}
2268
2269/// EmitSectionLabels - Emit initial Dwarf sections with a label at
2270/// the start of each one.
Chris Lattnerfa070b02010-04-04 22:33:59 +00002271void DwarfDebug::EmitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002272 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002273
Bill Wendling94d04b82009-05-20 23:21:38 +00002274 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002275 DwarfInfoSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00002276 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002277 DwarfAbbrevSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00002278 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Chris Lattner11b8f302010-04-04 23:02:02 +00002279 EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002280
Chris Lattner9c69e285532010-04-04 22:59:04 +00002281 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Chris Lattner11b8f302010-04-04 23:02:02 +00002282 EmitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002283
Devang Patelaf608bd2010-08-24 00:06:12 +00002284 EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Chris Lattner11b8f302010-04-04 23:02:02 +00002285 EmitSectionSym(Asm, TLOF.getDwarfLocSection());
2286 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
2287 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002288 DwarfStrSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00002289 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
Devang Patelf2548ca2010-04-16 23:33:45 +00002290 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
2291 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00002292
Devang Patelc3f5f782010-05-25 23:40:22 +00002293 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
2294 "section_debug_loc");
2295
Chris Lattner9c69e285532010-04-04 22:59:04 +00002296 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
Chris Lattner4ad1efe2010-04-04 23:10:38 +00002297 EmitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002298}
2299
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002300/// emitDIE - Recursively emits a debug information entry.
Bill Wendling94d04b82009-05-20 23:21:38 +00002301///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002302void DwarfDebug::emitDIE(DIE *Die) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002303 // Get the abbreviation for this DIE.
2304 unsigned AbbrevNumber = Die->getAbbrevNumber();
2305 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2306
Bill Wendling94d04b82009-05-20 23:21:38 +00002307 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00002308 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00002309 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2310 Twine::utohexstr(Die->getOffset()) + ":0x" +
2311 Twine::utohexstr(Die->getSize()) + " " +
2312 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002313 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00002314
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00002315 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
Bill Wendling94d04b82009-05-20 23:21:38 +00002316 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2317
2318 // Emit the DIE attribute values.
2319 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2320 unsigned Attr = AbbrevData[i].getAttribute();
2321 unsigned Form = AbbrevData[i].getForm();
2322 assert(Form && "Too many attributes for DIE (check abbreviation)");
2323
Chris Lattner3f53c832010-04-04 18:52:31 +00002324 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00002325 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002326
Bill Wendling94d04b82009-05-20 23:21:38 +00002327 switch (Attr) {
2328 case dwarf::DW_AT_sibling:
Devang Patel2c4ceb12009-11-21 02:48:08 +00002329 Asm->EmitInt32(Die->getSiblingOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00002330 break;
2331 case dwarf::DW_AT_abstract_origin: {
2332 DIEEntry *E = cast<DIEEntry>(Values[i]);
2333 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00002334 unsigned Addr = Origin->getOffset();
Bill Wendling94d04b82009-05-20 23:21:38 +00002335 Asm->EmitInt32(Addr);
2336 break;
2337 }
Devang Patelf2548ca2010-04-16 23:33:45 +00002338 case dwarf::DW_AT_ranges: {
2339 // DW_AT_range Value encodes offset in debug_range section.
2340 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00002341
2342 if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
2343 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
2344 V->getValue(),
2345 4);
2346 } else {
2347 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
2348 V->getValue(),
2349 DwarfDebugRangeSectionSym,
2350 4);
2351 }
Devang Patelf2548ca2010-04-16 23:33:45 +00002352 break;
2353 }
Devang Patelc3f5f782010-05-25 23:40:22 +00002354 case dwarf::DW_AT_location: {
2355 if (UseDotDebugLocEntry.count(Die) != 0) {
2356 DIELabel *L = cast<DIELabel>(Values[i]);
Daniel Dunbar83320a02011-03-16 22:16:39 +00002357 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
Devang Patelc3f5f782010-05-25 23:40:22 +00002358 } else
2359 Values[i]->EmitValue(Asm, Form);
2360 break;
2361 }
Devang Patel2a361602010-09-29 19:08:08 +00002362 case dwarf::DW_AT_accessibility: {
2363 if (Asm->isVerbose()) {
2364 DIEInteger *V = cast<DIEInteger>(Values[i]);
2365 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
2366 }
2367 Values[i]->EmitValue(Asm, Form);
2368 break;
2369 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002370 default:
2371 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00002372 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00002373 break;
2374 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002375 }
2376
2377 // Emit the DIE children if any.
2378 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2379 const std::vector<DIE *> &Children = Die->getChildren();
2380
2381 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002382 emitDIE(Children[j]);
Bill Wendling94d04b82009-05-20 23:21:38 +00002383
Chris Lattner3f53c832010-04-04 18:52:31 +00002384 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00002385 Asm->OutStreamer.AddComment("End Of Children Mark");
2386 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00002387 }
2388}
2389
Devang Patel8a241142009-12-09 18:24:21 +00002390/// emitDebugInfo - Emit the debug info section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002391///
Devang Patel8a241142009-12-09 18:24:21 +00002392void DwarfDebug::emitDebugInfo() {
2393 // Start debug info section.
2394 Asm->OutStreamer.SwitchSection(
2395 Asm->getObjFileLowering().getDwarfInfoSection());
Devang Patel163a9f72010-05-10 22:49:55 +00002396 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2397 E = CUMap.end(); I != E; ++I) {
2398 CompileUnit *TheCU = I->second;
2399 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002400
Devang Patel163a9f72010-05-10 22:49:55 +00002401 // Emit the compile units header.
2402 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
2403 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002404
Devang Patel163a9f72010-05-10 22:49:55 +00002405 // Emit size of content not including length itself
2406 unsigned ContentSize = Die->getSize() +
2407 sizeof(int16_t) + // DWARF version number
2408 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patel65705d52011-04-13 19:41:17 +00002409 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbach1e20b962010-07-21 21:21:52 +00002410
Devang Patel163a9f72010-05-10 22:49:55 +00002411 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2412 Asm->EmitInt32(ContentSize);
2413 Asm->OutStreamer.AddComment("DWARF version number");
2414 Asm->EmitInt16(dwarf::DWARF_VERSION);
2415 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2416 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
2417 DwarfAbbrevSectionSym);
2418 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2419 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002420
Devang Patel163a9f72010-05-10 22:49:55 +00002421 emitDIE(Die);
Devang Patel163a9f72010-05-10 22:49:55 +00002422 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
2423 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002424}
2425
Devang Patel2c4ceb12009-11-21 02:48:08 +00002426/// emitAbbreviations - Emit the abbreviation section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002427///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002428void DwarfDebug::emitAbbreviations() const {
Bill Wendling94d04b82009-05-20 23:21:38 +00002429 // Check to see if it is worth the effort.
2430 if (!Abbreviations.empty()) {
2431 // Start the debug abbrev section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002432 Asm->OutStreamer.SwitchSection(
2433 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002434
Chris Lattnerc0215722010-04-04 19:25:43 +00002435 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
Bill Wendling94d04b82009-05-20 23:21:38 +00002436
2437 // For each abbrevation.
2438 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2439 // Get abbreviation data
2440 const DIEAbbrev *Abbrev = Abbreviations[i];
2441
2442 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002443 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00002444
2445 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00002446 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00002447 }
2448
2449 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002450 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00002451
Chris Lattnerc0215722010-04-04 19:25:43 +00002452 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
Bill Wendling94d04b82009-05-20 23:21:38 +00002453 }
2454}
2455
Devang Patel2c4ceb12009-11-21 02:48:08 +00002456/// emitEndOfLineMatrix - Emit the last address of the section and the end of
Bill Wendling94d04b82009-05-20 23:21:38 +00002457/// the line matrix.
2458///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002459void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002460 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00002461 Asm->OutStreamer.AddComment("Extended Op");
2462 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002463
Chris Lattner233f52b2010-03-09 23:52:58 +00002464 Asm->OutStreamer.AddComment("Op size");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002465 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00002466 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2467 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2468
2469 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00002470
Chris Lattnerc0215722010-04-04 19:25:43 +00002471 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Chris Lattnerd38fee82010-04-05 00:13:49 +00002472 Asm->getTargetData().getPointerSize(),
2473 0/*AddrSpace*/);
Bill Wendling94d04b82009-05-20 23:21:38 +00002474
2475 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00002476 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2477 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00002478 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00002479 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00002480}
2481
Devang Patel8a241142009-12-09 18:24:21 +00002482/// emitDebugPubNames - Emit visible names into a debug pubnames section.
2483///
2484void DwarfDebug::emitDebugPubNames() {
Devang Patel163a9f72010-05-10 22:49:55 +00002485 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2486 E = CUMap.end(); I != E; ++I) {
2487 CompileUnit *TheCU = I->second;
2488 // Start the dwarf pubnames section.
2489 Asm->OutStreamer.SwitchSection(
2490 Asm->getObjFileLowering().getDwarfPubNamesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002491
Devang Patel163a9f72010-05-10 22:49:55 +00002492 Asm->OutStreamer.AddComment("Length of Public Names Info");
2493 Asm->EmitLabelDifference(
2494 Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
2495 Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002496
Devang Patel163a9f72010-05-10 22:49:55 +00002497 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
2498 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002499
Devang Patel163a9f72010-05-10 22:49:55 +00002500 Asm->OutStreamer.AddComment("DWARF Version");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002501 Asm->EmitInt16(dwarf::DWARF_VERSION);
2502
Devang Patel163a9f72010-05-10 22:49:55 +00002503 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002504 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002505 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002506
Devang Patel163a9f72010-05-10 22:49:55 +00002507 Asm->OutStreamer.AddComment("Compilation Unit Length");
2508 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
2509 Asm->GetTempSymbol("info_begin", TheCU->getID()),
2510 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002511
Devang Patel163a9f72010-05-10 22:49:55 +00002512 const StringMap<DIE*> &Globals = TheCU->getGlobals();
2513 for (StringMap<DIE*>::const_iterator
2514 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2515 const char *Name = GI->getKeyData();
2516 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002517
Devang Patel163a9f72010-05-10 22:49:55 +00002518 Asm->OutStreamer.AddComment("DIE offset");
2519 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002520
Devang Patel163a9f72010-05-10 22:49:55 +00002521 if (Asm->isVerbose())
2522 Asm->OutStreamer.AddComment("External Name");
2523 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2524 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002525
Devang Patel163a9f72010-05-10 22:49:55 +00002526 Asm->OutStreamer.AddComment("End Mark");
2527 Asm->EmitInt32(0);
2528 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002529 TheCU->getID()));
Bill Wendling94d04b82009-05-20 23:21:38 +00002530 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002531}
2532
Devang Patel193f7202009-11-24 01:14:22 +00002533void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00002534 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2535 E = CUMap.end(); I != E; ++I) {
2536 CompileUnit *TheCU = I->second;
2537 // Start the dwarf pubnames section.
2538 Asm->OutStreamer.SwitchSection(
2539 Asm->getObjFileLowering().getDwarfPubTypesSection());
2540 Asm->OutStreamer.AddComment("Length of Public Types Info");
2541 Asm->EmitLabelDifference(
2542 Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
2543 Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002544
Devang Patel163a9f72010-05-10 22:49:55 +00002545 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
2546 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002547
Devang Patel163a9f72010-05-10 22:49:55 +00002548 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2549 Asm->EmitInt16(dwarf::DWARF_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002550
Devang Patel163a9f72010-05-10 22:49:55 +00002551 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2552 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
2553 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002554
Devang Patel163a9f72010-05-10 22:49:55 +00002555 Asm->OutStreamer.AddComment("Compilation Unit Length");
2556 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
2557 Asm->GetTempSymbol("info_begin", TheCU->getID()),
2558 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002559
Devang Patel163a9f72010-05-10 22:49:55 +00002560 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2561 for (StringMap<DIE*>::const_iterator
2562 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2563 const char *Name = GI->getKeyData();
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002564 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002565
Devang Patel163a9f72010-05-10 22:49:55 +00002566 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2567 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002568
Devang Patel163a9f72010-05-10 22:49:55 +00002569 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
2570 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2571 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002572
Devang Patel163a9f72010-05-10 22:49:55 +00002573 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002574 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00002575 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
2576 TheCU->getID()));
Devang Patel193f7202009-11-24 01:14:22 +00002577 }
Devang Patel193f7202009-11-24 01:14:22 +00002578}
2579
Devang Patel2c4ceb12009-11-21 02:48:08 +00002580/// emitDebugStr - Emit visible names into a debug str section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002581///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002582void DwarfDebug::emitDebugStr() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002583 // Check to see if it is worth the effort.
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002584 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002585
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002586 // Start the dwarf str section.
2587 Asm->OutStreamer.SwitchSection(
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002588 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002589
Chris Lattnerbc733f52010-03-13 02:17:42 +00002590 // Get all of the string pool entries and put them in an array by their ID so
2591 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002592 SmallVector<std::pair<unsigned,
Chris Lattnerbc733f52010-03-13 02:17:42 +00002593 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002594
Chris Lattnerbc733f52010-03-13 02:17:42 +00002595 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2596 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
2597 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002598
Chris Lattnerbc733f52010-03-13 02:17:42 +00002599 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002600
Chris Lattnerbc733f52010-03-13 02:17:42 +00002601 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002602 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002603 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002604
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002605 // Emit the string itself.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002606 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
Bill Wendling94d04b82009-05-20 23:21:38 +00002607 }
2608}
2609
Devang Patel2c4ceb12009-11-21 02:48:08 +00002610/// emitDebugLoc - Emit visible names into a debug loc section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002611///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002612void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00002613 if (DotDebugLocEntries.empty())
2614 return;
2615
Devang Patel6c3ea902011-02-04 22:57:18 +00002616 for (SmallVector<DotDebugLocEntry, 4>::iterator
2617 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2618 I != E; ++I) {
2619 DotDebugLocEntry &Entry = *I;
2620 if (I + 1 != DotDebugLocEntries.end())
2621 Entry.Merge(I+1);
2622 }
2623
Daniel Dunbar83320a02011-03-16 22:16:39 +00002624 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002625 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00002626 Asm->getObjFileLowering().getDwarfLocSection());
2627 unsigned char Size = Asm->getTargetData().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00002628 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2629 unsigned index = 1;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002630 for (SmallVector<DotDebugLocEntry, 4>::iterator
2631 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00002632 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00002633 DotDebugLocEntry &Entry = *I;
2634 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00002635 if (Entry.isEmpty()) {
2636 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2637 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patel80250682010-05-26 23:55:23 +00002638 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00002639 } else {
2640 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
2641 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
Devang Patelc26f5442011-04-28 02:22:40 +00002642 DIVariable DV(Entry.Variable);
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002643 Asm->OutStreamer.AddComment("Loc expr size");
2644 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2645 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2646 Asm->EmitLabelDifference(end, begin, 2);
2647 Asm->OutStreamer.EmitLabel(begin);
Devang Patel80efd4e2011-07-08 16:49:43 +00002648 if (Entry.isInt()) {
Devang Patelc4329072011-06-01 22:03:25 +00002649 DIBasicType BTy(DV.getType());
2650 if (BTy.Verify() &&
2651 (BTy.getEncoding() == dwarf::DW_ATE_signed
2652 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2653 Asm->OutStreamer.AddComment("DW_OP_consts");
2654 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Patel80efd4e2011-07-08 16:49:43 +00002655 Asm->EmitSLEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002656 } else {
2657 Asm->OutStreamer.AddComment("DW_OP_constu");
2658 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Patel80efd4e2011-07-08 16:49:43 +00002659 Asm->EmitULEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002660 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002661 } else if (Entry.isLocation()) {
2662 if (!DV.hasComplexAddress())
2663 // Regular entry.
Devang Patelc26f5442011-04-28 02:22:40 +00002664 Asm->EmitDwarfRegOp(Entry.Loc);
Devang Patel80efd4e2011-07-08 16:49:43 +00002665 else {
2666 // Complex address entry.
2667 unsigned N = DV.getNumAddrElements();
2668 unsigned i = 0;
2669 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2670 if (Entry.Loc.getOffset()) {
2671 i = 2;
2672 Asm->EmitDwarfRegOp(Entry.Loc);
2673 Asm->OutStreamer.AddComment("DW_OP_deref");
2674 Asm->EmitInt8(dwarf::DW_OP_deref);
2675 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2676 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2677 Asm->EmitSLEB128(DV.getAddrElement(1));
2678 } else {
2679 // If first address element is OpPlus then emit
2680 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2681 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2682 Asm->EmitDwarfRegOp(Loc);
2683 i = 2;
2684 }
2685 } else {
2686 Asm->EmitDwarfRegOp(Entry.Loc);
2687 }
2688
2689 // Emit remaining complex address elements.
2690 for (; i < N; ++i) {
2691 uint64_t Element = DV.getAddrElement(i);
2692 if (Element == DIBuilder::OpPlus) {
2693 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2694 Asm->EmitULEB128(DV.getAddrElement(++i));
2695 } else if (Element == DIBuilder::OpDeref)
2696 Asm->EmitInt8(dwarf::DW_OP_deref);
2697 else llvm_unreachable("unknown Opcode found in complex address");
2698 }
Devang Patelc26f5442011-04-28 02:22:40 +00002699 }
Devang Patelc26f5442011-04-28 02:22:40 +00002700 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002701 // else ... ignore constant fp. There is not any good way to
2702 // to represent them here in dwarf.
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002703 Asm->OutStreamer.EmitLabel(end);
Devang Patelc3f5f782010-05-25 23:40:22 +00002704 }
2705 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002706}
2707
2708/// EmitDebugARanges - Emit visible names into a debug aranges section.
2709///
2710void DwarfDebug::EmitDebugARanges() {
2711 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002712 Asm->OutStreamer.SwitchSection(
2713 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002714}
2715
Devang Patel2c4ceb12009-11-21 02:48:08 +00002716/// emitDebugRanges - Emit visible names into a debug ranges section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002717///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002718void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002719 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002720 Asm->OutStreamer.SwitchSection(
Devang Patelf2548ca2010-04-16 23:33:45 +00002721 Asm->getObjFileLowering().getDwarfRangesSection());
Devang Pateleac9c072010-04-27 19:46:33 +00002722 unsigned char Size = Asm->getTargetData().getPointerSize();
2723 for (SmallVector<const MCSymbol *, 8>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002724 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00002725 I != E; ++I) {
2726 if (*I)
2727 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
Devang Patelf2548ca2010-04-16 23:33:45 +00002728 else
Devang Pateleac9c072010-04-27 19:46:33 +00002729 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patelf2548ca2010-04-16 23:33:45 +00002730 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002731}
2732
Devang Patel2c4ceb12009-11-21 02:48:08 +00002733/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002734///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002735void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002736 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002737 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002738 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002739 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002740 }
2741}
2742
Devang Patel2c4ceb12009-11-21 02:48:08 +00002743/// emitDebugInlineInfo - Emit inline info using following format.
Bill Wendling94d04b82009-05-20 23:21:38 +00002744/// Section Header:
2745/// 1. length of section
2746/// 2. Dwarf version number
2747/// 3. address size.
2748///
2749/// Entries (one "entry" for each function that was inlined):
2750///
2751/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2752/// otherwise offset into __debug_str for regular function name.
2753/// 2. offset into __debug_str section for regular function name.
2754/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2755/// instances for the function.
2756///
2757/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2758/// inlined instance; the die_offset points to the inlined_subroutine die in the
2759/// __debug_info section, and the low_pc is the starting address for the
2760/// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002761void DwarfDebug::emitDebugInlineInfo() {
Chris Lattnerd38fee82010-04-05 00:13:49 +00002762 if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002763 return;
2764
Devang Patel163a9f72010-05-10 22:49:55 +00002765 if (!FirstCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002766 return;
2767
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002768 Asm->OutStreamer.SwitchSection(
2769 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattner0ad9c912010-01-22 22:09:00 +00002770
Chris Lattner233f52b2010-03-09 23:52:58 +00002771 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00002772 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2773 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00002774
Chris Lattnerc0215722010-04-04 19:25:43 +00002775 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002776
Chris Lattner233f52b2010-03-09 23:52:58 +00002777 Asm->OutStreamer.AddComment("Dwarf Version");
2778 Asm->EmitInt16(dwarf::DWARF_VERSION);
2779 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002780 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002781
Devang Patele9f8f5e2010-05-07 20:54:48 +00002782 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
Devang Patel53bb5c92009-11-10 23:06:00 +00002783 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002784
Devang Patele9f8f5e2010-05-07 20:54:48 +00002785 const MDNode *Node = *I;
2786 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002787 = InlineInfo.find(Node);
Devang Patel53bb5c92009-11-10 23:06:00 +00002788 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00002789 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00002790 StringRef LName = SP.getLinkageName();
2791 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00002792
Chris Lattner233f52b2010-03-09 23:52:58 +00002793 Asm->OutStreamer.AddComment("MIPS linkage name");
Chris Lattner4cf202b2010-01-23 03:11:46 +00002794 if (LName.empty()) {
2795 Asm->OutStreamer.EmitBytes(Name, 0);
2796 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002797 } else
Chris Lattner6189ed12010-04-04 23:25:33 +00002798 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
2799 DwarfStrSectionSym);
Devang Patel53bb5c92009-11-10 23:06:00 +00002800
Chris Lattner233f52b2010-03-09 23:52:58 +00002801 Asm->OutStreamer.AddComment("Function name");
Chris Lattner6189ed12010-04-04 23:25:33 +00002802 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002803 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling94d04b82009-05-20 23:21:38 +00002804
Devang Patel53bb5c92009-11-10 23:06:00 +00002805 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00002806 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner3f53c832010-04-04 18:52:31 +00002807 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner6ed0f902010-03-09 00:31:02 +00002808 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00002809
Chris Lattner3f53c832010-04-04 18:52:31 +00002810 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002811 Asm->OutStreamer.EmitSymbolValue(LI->first,
2812 Asm->getTargetData().getPointerSize(),0);
Bill Wendling94d04b82009-05-20 23:21:38 +00002813 }
2814 }
2815
Chris Lattnerc0215722010-04-04 19:25:43 +00002816 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002817}