blob: 20507f56163c705c3a0c84ede88c03553a439987 [file] [log] [blame]
Bill Wendling2f921f82009-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 Lattnerb14490d2010-03-09 00:39:24 +000013
Devang Patel80ae3492009-08-28 23:24:31 +000014#define DEBUG_TYPE "dwarfdebug"
Bill Wendling2f921f82009-05-15 09:23:25 +000015#include "DwarfDebug.h"
Chris Lattner3f3fb972010-04-05 05:24:55 +000016#include "DIE.h"
Devang Patel5eb43192011-04-12 17:40:32 +000017#include "DwarfCompileUnit.h"
Bill Wendling30346342010-04-05 22:59:21 +000018#include "llvm/Constants.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000019#include "llvm/Module.h"
Devang Patel2d9e5322011-01-20 00:02:16 +000020#include "llvm/Instructions.h"
David Greene829b3e82009-08-19 21:52:55 +000021#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000022#include "llvm/CodeGen/MachineModuleInfo.h"
Chris Lattnere13c3722010-03-09 01:58:53 +000023#include "llvm/MC/MCAsmInfo.h"
Chris Lattner4d2c0f92009-07-31 18:48:30 +000024#include "llvm/MC/MCSection.h"
Chris Lattner4b7dadb2009-08-19 05:49:37 +000025#include "llvm/MC/MCStreamer.h"
Chris Lattnere13c3722010-03-09 01:58:53 +000026#include "llvm/MC/MCSymbol.h"
Chris Lattnerf62e3ee2010-01-16 21:57:06 +000027#include "llvm/Target/Mangler.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000028#include "llvm/Target/TargetData.h"
Anton Korobeynikov2f931282011-01-10 12:39:04 +000029#include "llvm/Target/TargetFrameLowering.h"
Chris Lattner5e693ed2009-07-28 03:13:23 +000030#include "llvm/Target/TargetLoweringObjectFile.h"
Chris Lattner21dc46e2010-04-04 18:06:11 +000031#include "llvm/Target/TargetMachine.h"
Chris Lattner5e693ed2009-07-28 03:13:23 +000032#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel61880932010-04-19 19:14:02 +000033#include "llvm/Target/TargetOptions.h"
Chris Lattner3f3fb972010-04-05 05:24:55 +000034#include "llvm/Analysis/DebugInfo.h"
Devang Patela5d93242011-02-24 18:49:30 +000035#include "llvm/Analysis/DIBuilder.h"
Devang Patela86114b2010-10-25 20:45:32 +000036#include "llvm/ADT/Statistic.h"
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +000037#include "llvm/ADT/STLExtras.h"
Chris Lattner06fa1762009-08-24 03:52:50 +000038#include "llvm/ADT/StringExtras.h"
Devang Patel6c74a872010-04-27 19:46:33 +000039#include "llvm/Support/CommandLine.h"
Daniel Dunbarcdf01b52009-10-13 06:47:08 +000040#include "llvm/Support/Debug.h"
41#include "llvm/Support/ErrorHandling.h"
Devang Patel1973df22010-01-26 21:39:14 +000042#include "llvm/Support/ValueHandle.h"
Chris Lattnerf5c834f2010-01-22 22:09:00 +000043#include "llvm/Support/FormattedStream.h"
Chris Lattner4d2c0f92009-07-31 18:48:30 +000044#include "llvm/Support/Timer.h"
Michael J. Spencer447762d2010-11-29 18:16:10 +000045#include "llvm/Support/Path.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000046using namespace llvm;
47
Devang Patel6c74a872010-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 Grosbacha8683bb2010-07-21 21:21:52 +000051static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
Devang Patel30265c42010-07-07 20:12:52 +000052 cl::Hidden,
Devang Patel6c74a872010-04-27 19:46:33 +000053 cl::desc("Disable debug info printing"));
54
Dan Gohman7421ae42010-05-07 01:08:53 +000055static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
Chris Lattner0ab5e2c2011-04-15 05:18:47 +000056 cl::desc("Make an absence of debug location information explicit."),
Dan Gohman7421ae42010-05-07 01:08:53 +000057 cl::init(false));
58
Bill Wendlingfcc14142010-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 Wendling2f921f82009-05-15 09:23:25 +000064//===----------------------------------------------------------------------===//
65
66/// Configuration values for initial hash set sizes (log2).
67///
Bill Wendling2f921f82009-05-15 09:23:25 +000068static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling2f921f82009-05-15 09:23:25 +000069
70namespace llvm {
71
Nick Lewycky019d2552011-07-29 03:49:23 +000072DIType DbgVariable::getType() const {
Devang Patelf20c4f72011-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 Patel6d9f9fe2010-08-09 21:01:39 +0000117 }
118 return Ty;
119 }
Devang Patelf20c4f72011-04-12 22:53:02 +0000120 return Ty;
121}
Bill Wendling2f921f82009-05-15 09:23:25 +0000122
123//===----------------------------------------------------------------------===//
Devang Patel6c74a872010-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 Wendling2f921f82009-05-15 09:23:25 +0000130/// DbgScope - This class is used to track scope information.
131///
Devang Patelf3d7c082009-11-16 21:53:40 +0000132class DbgScope {
Bill Wendling2f921f82009-05-15 09:23:25 +0000133 DbgScope *Parent; // Parent to this scope.
Jim Grosbach042483e2009-11-21 23:12:12 +0000134 DIDescriptor Desc; // Debug info descriptor for scope.
Devang Patel1973df22010-01-26 21:39:14 +0000135 // Location at which this scope is inlined.
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000136 AssertingVH<const MDNode> InlinedAtLocation;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000137 bool AbstractScope; // Abstract Scope
Devang Patel787f94c2009-10-01 18:25:23 +0000138 const MachineInstr *LastInsn; // Last instruction of this scope.
139 const MachineInstr *FirstInsn; // First instruction of this scope.
Devang Patel6c74a872010-04-27 19:46:33 +0000140 unsigned DFSIn, DFSOut;
Jeffrey Yasskin35b4e4f2010-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 Patel6c74a872010-04-27 19:46:33 +0000145 SmallVector<DbgRange, 4> Ranges;
Owen Anderson9becc182009-06-24 22:53:20 +0000146 // Private state for dump()
147 mutable unsigned IndentLevel;
Bill Wendling2f921f82009-05-15 09:23:25 +0000148public:
Devang Patel32cc43c2010-05-07 20:54:48 +0000149 DbgScope(DbgScope *P, DIDescriptor D, const MDNode *I = 0)
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000150 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
Devang Patel6c74a872010-04-27 19:46:33 +0000151 LastInsn(0), FirstInsn(0),
Devang Patelfee7ced2011-08-08 18:22:10 +0000152 DFSIn(0), DFSOut(0), IndentLevel(0) {
153 if (Parent)
154 Parent->addScope(this);
155 }
Bill Wendling2f921f82009-05-15 09:23:25 +0000156 virtual ~DbgScope();
157
158 // Accessors.
159 DbgScope *getParent() const { return Parent; }
160 DIDescriptor getDesc() const { return Desc; }
Devang Patel32cc43c2010-05-07 20:54:48 +0000161 const MDNode *getInlinedAt() const { return InlinedAtLocation; }
162 const MDNode *getScopeNode() const { return Desc; }
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +0000163 const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
Devang Patel406798a2010-08-09 18:51:29 +0000164 const SmallVector<DbgVariable *, 8> &getDbgVariables() { return Variables; }
Devang Patel6c74a872010-04-27 19:46:33 +0000165 const SmallVector<DbgRange, 4> &getRanges() { return Ranges; }
166
167 /// openInsnRange - This scope covers instruction range starting from MI.
168 void openInsnRange(const MachineInstr *MI) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000169 if (!FirstInsn)
Devang Patel6c74a872010-04-27 19:46:33 +0000170 FirstInsn = MI;
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000171
Devang Patel6c74a872010-04-27 19:46:33 +0000172 if (Parent)
173 Parent->openInsnRange(MI);
174 }
175
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000176 /// extendInsnRange - Extend the current instruction range covered by
Devang Patel6c74a872010-04-27 19:46:33 +0000177 /// this scope.
178 void extendInsnRange(const MachineInstr *MI) {
179 assert (FirstInsn && "MI Range is not open!");
180 LastInsn = MI;
181 if (Parent)
182 Parent->extendInsnRange(MI);
183 }
184
185 /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected
186 /// until now. This is used when a new scope is encountered while walking
187 /// machine instructions.
188 void closeInsnRange(DbgScope *NewScope = NULL) {
189 assert (LastInsn && "Last insn missing!");
190 Ranges.push_back(DbgRange(FirstInsn, LastInsn));
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000191 FirstInsn = NULL;
Devang Patel6c74a872010-04-27 19:46:33 +0000192 LastInsn = NULL;
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000193 // If Parent dominates NewScope then do not close Parent's instruction
Devang Patel6c74a872010-04-27 19:46:33 +0000194 // range.
195 if (Parent && (!NewScope || !Parent->dominates(NewScope)))
196 Parent->closeInsnRange(NewScope);
197 }
198
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000199 void setAbstractScope() { AbstractScope = true; }
200 bool isAbstractScope() const { return AbstractScope; }
Devang Patel6c74a872010-04-27 19:46:33 +0000201
Nick Lewycky019d2552011-07-29 03:49:23 +0000202 // Depth First Search support to walk and manipulate DbgScope hierarchy.
Devang Patel6c74a872010-04-27 19:46:33 +0000203 unsigned getDFSOut() const { return DFSOut; }
204 void setDFSOut(unsigned O) { DFSOut = O; }
205 unsigned getDFSIn() const { return DFSIn; }
206 void setDFSIn(unsigned I) { DFSIn = I; }
207 bool dominates(const DbgScope *S) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000208 if (S == this)
Devang Patel6c74a872010-04-27 19:46:33 +0000209 return true;
210 if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut())
211 return true;
212 return false;
213 }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000214
Devang Patel930143b2009-11-21 02:48:08 +0000215 /// addScope - Add a scope to the scope.
Bill Wendling2f921f82009-05-15 09:23:25 +0000216 ///
Devang Patel930143b2009-11-21 02:48:08 +0000217 void addScope(DbgScope *S) { Scopes.push_back(S); }
Bill Wendling2f921f82009-05-15 09:23:25 +0000218
Devang Patel930143b2009-11-21 02:48:08 +0000219 /// addVariable - Add a variable to the scope.
Bill Wendling2f921f82009-05-15 09:23:25 +0000220 ///
Devang Patel930143b2009-11-21 02:48:08 +0000221 void addVariable(DbgVariable *V) { Variables.push_back(V); }
Bill Wendling2f921f82009-05-15 09:23:25 +0000222
Bill Wendling2f921f82009-05-15 09:23:25 +0000223#ifndef NDEBUG
224 void dump() const;
225#endif
226};
Devang Patel6c74a872010-04-27 19:46:33 +0000227
Chris Lattnerf5d06362010-04-05 04:09:20 +0000228} // end llvm namespace
Bill Wendling2f921f82009-05-15 09:23:25 +0000229
230#ifndef NDEBUG
231void DbgScope::dump() const {
David Greenec230cb92009-12-24 00:31:35 +0000232 raw_ostream &err = dbgs();
Chris Lattner81e8e022009-08-23 00:51:00 +0000233 err.indent(IndentLevel);
Devang Patel1f9913f2011-07-14 22:30:56 +0000234 err << "DFSIn: " << DFSIn << " DFSOut: " << DFSOut << "\n";
Devang Patel32cc43c2010-05-07 20:54:48 +0000235 const MDNode *N = Desc;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000236 N->dump();
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000237 if (AbstractScope)
238 err << "Abstract Scope\n";
Bill Wendling2f921f82009-05-15 09:23:25 +0000239
240 IndentLevel += 2;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000241 if (!Scopes.empty())
242 err << "Children ...\n";
Bill Wendling2f921f82009-05-15 09:23:25 +0000243 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
244 if (Scopes[i] != this)
245 Scopes[i]->dump();
246
247 IndentLevel -= 2;
248}
249#endif
250
Bill Wendling2f921f82009-05-15 09:23:25 +0000251DbgScope::~DbgScope() {
Bill Wendling2f921f82009-05-15 09:23:25 +0000252 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
253 delete Variables[j];
Bill Wendling2f921f82009-05-15 09:23:25 +0000254}
255
Chris Lattnerf0d6bd32010-04-05 05:11:15 +0000256DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Devang Patel1a0df9a2010-05-10 22:49:55 +0000257 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000258 AbbreviationsSet(InitAbbreviationsSetSize),
Devang Patel12563b32010-04-16 23:33:45 +0000259 CurrentFnDbgScope(0), PrevLabel(NULL) {
Chris Lattnerb7aa9522010-03-13 02:17:42 +0000260 NextStringPoolNumber = 0;
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000261
Rafael Espindolaa7160962011-05-06 14:56:22 +0000262 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
Chris Lattnere58b5472010-04-04 23:10:38 +0000263 DwarfStrSectionSym = TextSectionSym = 0;
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000264 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
Devang Patel9fc11702010-05-25 23:40:22 +0000265 FunctionBeginSym = FunctionEndSym = 0;
Dan Gohman6e681a52010-06-18 15:56:31 +0000266 {
267 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
268 beginModule(M);
Torok Edwinf8dba242010-04-07 10:44:46 +0000269 }
Bill Wendling2f921f82009-05-15 09:23:25 +0000270}
271DwarfDebug::~DwarfDebug() {
Bill Wendling2f921f82009-05-15 09:23:25 +0000272}
273
Chris Lattnerb7aa9522010-03-13 02:17:42 +0000274MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
275 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
276 if (Entry.first) return Entry.first;
277
278 Entry.second = NextStringPoolNumber++;
Chris Lattnera179b522010-04-04 19:25:43 +0000279 return Entry.first = Asm->GetTempSymbol("string", Entry.second);
Chris Lattnerb7aa9522010-03-13 02:17:42 +0000280}
281
282
Devang Patel930143b2009-11-21 02:48:08 +0000283/// assignAbbrevNumber - Define a unique number for the abbreviation.
Bill Wendling2f921f82009-05-15 09:23:25 +0000284///
Devang Patel930143b2009-11-21 02:48:08 +0000285void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000286 // Profile the node so that we can make it unique.
287 FoldingSetNodeID ID;
288 Abbrev.Profile(ID);
289
290 // Check the set for priors.
291 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
292
293 // If it's newly added.
294 if (InSet == &Abbrev) {
295 // Add to abbreviation list.
296 Abbreviations.push_back(&Abbrev);
297
298 // Assign the vector position + 1 as its number.
299 Abbrev.setNumber(Abbreviations.size());
300 } else {
301 // Assign existing abbreviation number.
302 Abbrev.setNumber(InSet->getNumber());
303 }
304}
305
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000306/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
Devang Patel43ef34d2010-01-05 01:46:14 +0000307/// printer to not emit usual symbol prefix before the symbol name is used then
308/// return linkage name after skipping this special LLVM prefix.
309static StringRef getRealLinkageName(StringRef LinkageName) {
310 char One = '\1';
311 if (LinkageName.startswith(StringRef(&One, 1)))
312 return LinkageName.substr(1);
313 return LinkageName;
314}
315
Devang Patel525dda02009-12-14 16:18:45 +0000316/// createSubprogramDIE - Create new DIE using SP.
Devang Patel185051c2010-09-27 23:15:27 +0000317DIE *DwarfDebug::createSubprogramDIE(DISubprogram SP) {
Devang Patel1a0df9a2010-05-10 22:49:55 +0000318 CompileUnit *SPCU = getCompileUnit(SP);
319 DIE *SPDie = SPCU->getDIE(SP);
Devang Patel525dda02009-12-14 16:18:45 +0000320 if (SPDie)
321 return SPDie;
322
323 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Devang Patel1d6bbd42011-04-22 23:10:17 +0000324
325 // DW_TAG_inlined_subroutine may refer to this DIE.
326 SPCU->insertDIE(SP, SPDie);
327
328 // Add to context owner.
329 SPCU->addToContextOwner(SPDie, SP.getContext());
330
331 // Add function template parameters.
332 SPCU->addTemplateParams(*SPDie, SP.getTemplateParams());
333
Devang Patel543596d2011-05-03 21:50:34 +0000334 StringRef LinkageName = SP.getLinkageName();
335 if (!LinkageName.empty())
336 SPCU->addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
337 getRealLinkageName(LinkageName));
338
Devang Patel1d6bbd42011-04-22 23:10:17 +0000339 // If this DIE is going to refer declaration info using AT_specification
340 // then there is no need to add other attributes.
341 if (SP.getFunctionDeclaration().isSubprogram())
342 return SPDie;
343
Devang Patelf200b392010-03-02 17:58:15 +0000344 // Constructors and operators for anonymous aggregates do not have names.
Devang Pateld0fa3042010-03-02 01:26:20 +0000345 if (!SP.getName().empty())
Devang Patelf20c4f72011-04-12 22:53:02 +0000346 SPCU->addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
347 SP.getName());
Bill Wendling2f921f82009-05-15 09:23:25 +0000348
Devang Patelf20c4f72011-04-12 22:53:02 +0000349 SPCU->addSourceLine(SPDie, SP);
Bill Wendling2f921f82009-05-15 09:23:25 +0000350
Devang Patel3a24f922010-10-07 22:03:01 +0000351 if (SP.isPrototyped())
Devang Patelf20c4f72011-04-12 22:53:02 +0000352 SPCU->addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Devang Patel1d6bbd42011-04-22 23:10:17 +0000353
Bill Wendling2f921f82009-05-15 09:23:25 +0000354 // Add Return Type.
Devang Patel236526d2009-12-03 01:25:38 +0000355 DICompositeType SPTy = SP.getType();
356 DIArray Args = SPTy.getTypeArray();
Bill Wendling2f921f82009-05-15 09:23:25 +0000357 unsigned SPTag = SPTy.getTag();
Devang Pateleb57c592009-12-03 19:11:07 +0000358
Devang Patel3b548aa2010-03-08 20:52:55 +0000359 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
Devang Patelf20c4f72011-04-12 22:53:02 +0000360 SPCU->addType(SPDie, SPTy);
Devang Patel236526d2009-12-03 01:25:38 +0000361 else
Devang Patelf20c4f72011-04-12 22:53:02 +0000362 SPCU->addType(SPDie, DIType(Args.getElement(0)));
Devang Patel236526d2009-12-03 01:25:38 +0000363
Devang Pateleb57c592009-12-03 19:11:07 +0000364 unsigned VK = SP.getVirtuality();
365 if (VK) {
Devang Patelf20c4f72011-04-12 22:53:02 +0000366 SPCU->addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
367 DIEBlock *Block = SPCU->getDIEBlock();
368 SPCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
369 SPCU->addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
370 SPCU->addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000371 ContainingTypeMap.insert(std::make_pair(SPDie,
Devang Patelcfa8e9d2010-05-07 18:11:54 +0000372 SP.getContainingType()));
Devang Pateleb57c592009-12-03 19:11:07 +0000373 }
374
Devang Patel185051c2010-09-27 23:15:27 +0000375 if (!SP.isDefinition()) {
Devang Patelf20c4f72011-04-12 22:53:02 +0000376 SPCU->addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
377
Bill Wendling2f921f82009-05-15 09:23:25 +0000378 // Add arguments. Do not add arguments for subprogram definition. They will
Devang Patel236526d2009-12-03 01:25:38 +0000379 // be handled while processing variables.
380 DICompositeType SPTy = SP.getType();
381 DIArray Args = SPTy.getTypeArray();
382 unsigned SPTag = SPTy.getTag();
383
Bill Wendling2f921f82009-05-15 09:23:25 +0000384 if (SPTag == dwarf::DW_TAG_subroutine_type)
385 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
386 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patelcfa8e9d2010-05-07 18:11:54 +0000387 DIType ATy = DIType(DIType(Args.getElement(i)));
Devang Patelf20c4f72011-04-12 22:53:02 +0000388 SPCU->addType(Arg, ATy);
Devang Patel6efc8e52010-02-06 01:02:37 +0000389 if (ATy.isArtificial())
Devang Patelf20c4f72011-04-12 22:53:02 +0000390 SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
Devang Patel930143b2009-11-21 02:48:08 +0000391 SPDie->addChild(Arg);
Bill Wendling2f921f82009-05-15 09:23:25 +0000392 }
393 }
394
Devang Patel999b4992010-02-03 19:57:19 +0000395 if (SP.isArtificial())
Devang Patelf20c4f72011-04-12 22:53:02 +0000396 SPCU->addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
Devang Patel999b4992010-02-03 19:57:19 +0000397
Devang Patelb4e3b902010-04-30 19:38:23 +0000398 if (!SP.isLocalToUnit())
Devang Patelf20c4f72011-04-12 22:53:02 +0000399 SPCU->addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000400
Devang Patelb4e3b902010-04-30 19:38:23 +0000401 if (SP.isOptimized())
Devang Patelf20c4f72011-04-12 22:53:02 +0000402 SPCU->addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
Devang Patelb4e3b902010-04-30 19:38:23 +0000403
Jim Grosbach965a73a2010-07-21 23:03:52 +0000404 if (unsigned isa = Asm->getISAEncoding()) {
Devang Patelf20c4f72011-04-12 22:53:02 +0000405 SPCU->addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
Jim Grosbach965a73a2010-07-21 23:03:52 +0000406 }
407
Bill Wendling2f921f82009-05-15 09:23:25 +0000408 return SPDie;
409}
410
Devang Patel32cc43c2010-05-07 20:54:48 +0000411DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
Chris Lattner8d2fe282010-03-31 05:36:29 +0000412 assert(N && "Invalid Scope encoding!");
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000413
414 DbgScope *AScope = AbstractScopes.lookup(N);
415 if (AScope)
416 return AScope;
Jim Grosbach042483e2009-11-21 23:12:12 +0000417
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000418 DbgScope *Parent = NULL;
419
420 DIDescriptor Scope(N);
421 if (Scope.isLexicalBlock()) {
422 DILexicalBlock DB(N);
423 DIDescriptor ParentDesc = DB.getContext();
Devang Patelcfa8e9d2010-05-07 18:11:54 +0000424 Parent = getOrCreateAbstractScope(ParentDesc);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000425 }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000426 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000427 AScope->setAbstractScope();
428 AbstractScopes[N] = AScope;
429 if (DIDescriptor(N).isSubprogram())
430 AbstractScopesList.push_back(AScope);
431 return AScope;
432}
Devang Patel75cc16c2009-10-01 20:31:14 +0000433
Devang Patel019922d2010-04-06 23:53:48 +0000434/// isSubprogramContext - Return true if Context is either a subprogram
435/// or another context nested inside a subprogram.
Devang Patel32cc43c2010-05-07 20:54:48 +0000436static bool isSubprogramContext(const MDNode *Context) {
Devang Patel019922d2010-04-06 23:53:48 +0000437 if (!Context)
438 return false;
439 DIDescriptor D(Context);
440 if (D.isSubprogram())
441 return true;
442 if (D.isType())
Devang Patelcfa8e9d2010-05-07 18:11:54 +0000443 return isSubprogramContext(DIType(Context).getContext());
Devang Patel019922d2010-04-06 23:53:48 +0000444 return false;
445}
446
Jim Grosbach042483e2009-11-21 23:12:12 +0000447/// updateSubprogramScopeDIE - Find DIE for the given subprogram and
Devang Patel930143b2009-11-21 02:48:08 +0000448/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
449/// If there are global variables in this scope then create and insert
450/// DIEs for these variables.
Devang Patel32cc43c2010-05-07 20:54:48 +0000451DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
Devang Patel1a0df9a2010-05-10 22:49:55 +0000452 CompileUnit *SPCU = getCompileUnit(SPNode);
453 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patela37a95e2010-07-07 22:20:57 +0000454
Chris Lattner3a383cb2010-04-05 00:13:49 +0000455 assert(SPDie && "Unable to find subprogram DIE!");
456 DISubprogram SP(SPNode);
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000457
Devang Patel1d6bbd42011-04-22 23:10:17 +0000458 DISubprogram SPDecl = SP.getFunctionDeclaration();
459 if (SPDecl.isSubprogram())
460 // Refer function declaration directly.
Devang Patelf20c4f72011-04-12 22:53:02 +0000461 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
Devang Patel1d6bbd42011-04-22 23:10:17 +0000462 createSubprogramDIE(SPDecl));
463 else {
464 // There is not any need to generate specification DIE for a function
465 // defined at compile unit level. If a function is defined inside another
466 // function then gdb prefers the definition at top level and but does not
467 // expect specification DIE in parent function. So avoid creating
468 // specification DIE for a function defined inside a function.
469 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
470 !SP.getContext().isFile() &&
471 !isSubprogramContext(SP.getContext())) {
472 SPCU-> addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
473
474 // Add arguments.
475 DICompositeType SPTy = SP.getType();
476 DIArray Args = SPTy.getTypeArray();
477 unsigned SPTag = SPTy.getTag();
478 if (SPTag == dwarf::DW_TAG_subroutine_type)
479 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
480 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
481 DIType ATy = DIType(DIType(Args.getElement(i)));
482 SPCU->addType(Arg, ATy);
483 if (ATy.isArtificial())
484 SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
485 SPDie->addChild(Arg);
486 }
487 DIE *SPDeclDie = SPDie;
488 SPDie = new DIE(dwarf::DW_TAG_subprogram);
489 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
490 SPDeclDie);
491 SPCU->addDie(SPDie);
492 }
Chris Lattner3a383cb2010-04-05 00:13:49 +0000493 }
Devang Patela37a95e2010-07-07 22:20:57 +0000494 // Pick up abstract subprogram DIE.
495 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
496 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Devang Patelf20c4f72011-04-12 22:53:02 +0000497 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
498 dwarf::DW_FORM_ref4, AbsSPDIE);
Devang Patela37a95e2010-07-07 22:20:57 +0000499 SPCU->addDie(SPDie);
500 }
501
Devang Patelf20c4f72011-04-12 22:53:02 +0000502 SPCU->addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
503 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
504 SPCU->addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
505 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
Chris Lattner3a383cb2010-04-05 00:13:49 +0000506 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
507 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Devang Patelf20c4f72011-04-12 22:53:02 +0000508 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patel6efc8e52010-02-06 01:02:37 +0000509
Chris Lattner3a383cb2010-04-05 00:13:49 +0000510 return SPDie;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000511}
512
Jim Grosbach042483e2009-11-21 23:12:12 +0000513/// constructLexicalScope - Construct new DW_TAG_lexical_block
Devang Patel930143b2009-11-21 02:48:08 +0000514/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
515DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
Devang Patel6c74a872010-04-27 19:46:33 +0000516
517 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
518 if (Scope->isAbstractScope())
519 return ScopeDIE;
520
521 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
522 if (Ranges.empty())
523 return 0;
524
Devang Patelf20c4f72011-04-12 22:53:02 +0000525 CompileUnit *TheCU = getCompileUnit(Scope->getScopeNode());
Devang Patel6c74a872010-04-27 19:46:33 +0000526 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
527 if (Ranges.size() > 1) {
528 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000529 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Patel6c74a872010-04-27 19:46:33 +0000530 // DW_AT_ranges appropriately.
Devang Patelf20c4f72011-04-12 22:53:02 +0000531 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
532 DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
Devang Patel6c74a872010-04-27 19:46:33 +0000533 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
534 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patel9fc11702010-05-25 23:40:22 +0000535 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
536 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Patel6c74a872010-04-27 19:46:33 +0000537 }
538 DebugRangeSymbols.push_back(NULL);
539 DebugRangeSymbols.push_back(NULL);
540 return ScopeDIE;
541 }
542
Devang Patel9fc11702010-05-25 23:40:22 +0000543 const MCSymbol *Start = getLabelBeforeInsn(RI->first);
544 const MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Patel6c74a872010-04-27 19:46:33 +0000545
Devang Patel9fc11702010-05-25 23:40:22 +0000546 if (End == 0) return 0;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000547
Chris Lattnere13c3722010-03-09 01:58:53 +0000548 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
549 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000550
Devang Patelf20c4f72011-04-12 22:53:02 +0000551 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
552 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000553
554 return ScopeDIE;
555}
556
Devang Patel930143b2009-11-21 02:48:08 +0000557/// constructInlinedScopeDIE - This scope represents inlined body of
558/// a function. Construct DIE to represent this concrete inlined copy
559/// of the function.
560DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
Devang Patel6c74a872010-04-27 19:46:33 +0000561
562 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000563 assert (Ranges.empty() == false
Devang Patel6c74a872010-04-27 19:46:33 +0000564 && "DbgScope does not have instruction markers!");
565
Devang Patelf098ce22011-07-27 00:34:13 +0000566 if (!Scope->getScopeNode())
567 return NULL;
568 DIScope DS(Scope->getScopeNode());
569 DISubprogram InlinedSP = getDISubprogram(DS);
570 CompileUnit *TheCU = getCompileUnit(InlinedSP);
571 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
572 if (!OriginDIE) {
573 DEBUG(dbgs() << "Unable to find original DIE for inlined subprogram.");
574 return NULL;
575 }
576
Devang Patel6c74a872010-04-27 19:46:33 +0000577 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
Devang Patel9fc11702010-05-25 23:40:22 +0000578 const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
579 const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
Devang Patel6c74a872010-04-27 19:46:33 +0000580
Devang Patel4c6bd662010-07-08 22:39:20 +0000581 if (StartLabel == 0 || EndLabel == 0) {
Nick Lewycky019d2552011-07-29 03:49:23 +0000582 assert (0 && "Unexpected Start and End labels for a inlined scope!");
Devang Patel6c74a872010-04-27 19:46:33 +0000583 return 0;
584 }
Chris Lattnere13c3722010-03-09 01:58:53 +0000585 assert(StartLabel->isDefined() &&
Chris Lattnerc3b70f62010-03-09 01:51:43 +0000586 "Invalid starting label for an inlined scope!");
Chris Lattnere13c3722010-03-09 01:58:53 +0000587 assert(EndLabel->isDefined() &&
Chris Lattnerc3b70f62010-03-09 01:51:43 +0000588 "Invalid end label for an inlined scope!");
Devang Patel6c74a872010-04-27 19:46:33 +0000589
Devang Patel73bc1722011-05-05 17:54:26 +0000590 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patelf20c4f72011-04-12 22:53:02 +0000591 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
592 dwarf::DW_FORM_ref4, OriginDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000593
Devang Patelf098ce22011-07-27 00:34:13 +0000594 if (Ranges.size() > 1) {
595 // .debug_range section has not been laid out yet. Emit offset in
596 // .debug_range as a uint, size 4, for now. emitDIE will handle
597 // DW_AT_ranges appropriately.
598 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
599 DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
600 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
601 RE = Ranges.end(); RI != RE; ++RI) {
602 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
603 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
604 }
605 DebugRangeSymbols.push_back(NULL);
606 DebugRangeSymbols.push_back(NULL);
607 } else {
608 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
609 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
610 }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000611
612 InlinedSubprogramDIEs.insert(OriginDIE);
613
614 // Track the start label for this inlined function.
Devang Patelf098ce22011-07-27 00:34:13 +0000615 //.debug_inlined section specification does not clearly state how
616 // to emit inlined scope that is split into multiple instruction ranges.
617 // For now, use first instruction range and emit low_pc/high_pc pair and
618 // corresponding .debug_inlined section entry for this pair.
Devang Patel32cc43c2010-05-07 20:54:48 +0000619 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
Devang Patelcfa8e9d2010-05-07 18:11:54 +0000620 I = InlineInfo.find(InlinedSP);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000621
622 if (I == InlineInfo.end()) {
Devang Patelcfa8e9d2010-05-07 18:11:54 +0000623 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
Jim Grosbach00e9c612009-11-22 19:20:36 +0000624 ScopeDIE));
Devang Patelcfa8e9d2010-05-07 18:11:54 +0000625 InlinedSPNodes.push_back(InlinedSP);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000626 } else
Chris Lattner085b6522010-03-09 00:31:02 +0000627 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000628
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000629 DILocation DL(Scope->getInlinedAt());
Devang Patelf20c4f72011-04-12 22:53:02 +0000630 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
631 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000632
633 return ScopeDIE;
634}
635
Devang Patelf071d722011-06-24 20:46:11 +0000636/// isUnsignedDIType - Return true if type encoding is unsigned.
637static bool isUnsignedDIType(DIType Ty) {
638 DIDerivedType DTy(Ty);
639 if (DTy.Verify())
640 return isUnsignedDIType(DTy.getTypeDerivedFrom());
641
642 DIBasicType BTy(Ty);
643 if (BTy.Verify()) {
644 unsigned Encoding = BTy.getEncoding();
645 if (Encoding == dwarf::DW_ATE_unsigned ||
646 Encoding == dwarf::DW_ATE_unsigned_char)
647 return true;
648 }
649 return false;
650}
Devang Patel930143b2009-11-21 02:48:08 +0000651
652/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Devang Patel9ccfb642009-12-09 18:24:21 +0000653DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000654 StringRef Name = DV->getName();
Devang Patel2d9caf92009-11-25 17:36:49 +0000655 if (Name.empty())
Devang Patel97f99fa2009-11-13 02:25:26 +0000656 return NULL;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000657
658 // Translate tag to proper Dwarf tag. The result variable is dropped for
659 // now.
660 unsigned Tag;
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000661 switch (DV->getTag()) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000662 case dwarf::DW_TAG_return_variable:
663 return NULL;
664 case dwarf::DW_TAG_arg_variable:
665 Tag = dwarf::DW_TAG_formal_parameter;
666 break;
667 case dwarf::DW_TAG_auto_variable: // fall thru
668 default:
669 Tag = dwarf::DW_TAG_variable;
670 break;
671 }
672
673 // Define variable debug information entry.
674 DIE *VariableDie = new DIE(Tag);
Devang Patel2606f4d2011-04-25 23:05:21 +0000675 CompileUnit *VariableCU = getCompileUnit(DV->getVariable());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000676 DIE *AbsDIE = NULL;
Devang Patele1c53f22010-05-20 16:36:41 +0000677 DenseMap<const DbgVariable *, const DbgVariable *>::iterator
678 V2AVI = VarToAbstractVarMap.find(DV);
679 if (V2AVI != VarToAbstractVarMap.end())
680 AbsDIE = V2AVI->second->getDIE();
Jim Grosbach042483e2009-11-21 23:12:12 +0000681
Devang Patele1c53f22010-05-20 16:36:41 +0000682 if (AbsDIE)
Devang Patel2606f4d2011-04-25 23:05:21 +0000683 VariableCU->addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Devang Patelf20c4f72011-04-12 22:53:02 +0000684 dwarf::DW_FORM_ref4, AbsDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000685 else {
Devang Patel2606f4d2011-04-25 23:05:21 +0000686 VariableCU->addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
687 Name);
688 VariableCU->addSourceLine(VariableDie, DV->getVariable());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000689
690 // Add variable type.
Devang Patel2606f4d2011-04-25 23:05:21 +0000691 VariableCU->addType(VariableDie, DV->getType());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000692 }
693
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000694 if (Tag == dwarf::DW_TAG_formal_parameter && DV->getType().isArtificial())
Devang Patel2606f4d2011-04-25 23:05:21 +0000695 VariableCU->addUInt(VariableDie, dwarf::DW_AT_artificial,
696 dwarf::DW_FORM_flag, 1);
Devang Patelbea08d12010-09-29 23:07:21 +0000697 else if (DIVariable(DV->getVariable()).isArtificial())
Devang Patel2606f4d2011-04-25 23:05:21 +0000698 VariableCU->addUInt(VariableDie, dwarf::DW_AT_artificial,
699 dwarf::DW_FORM_flag, 1);
Devang Patel9fc11702010-05-25 23:40:22 +0000700
701 if (Scope->isAbstractScope()) {
702 DV->setDIE(VariableDie);
703 return VariableDie;
704 }
705
706 // Add variable address.
707
708 unsigned Offset = DV->getDotDebugLocOffset();
709 if (Offset != ~0U) {
Devang Patel2606f4d2011-04-25 23:05:21 +0000710 VariableCU->addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
Devang Patel9fc11702010-05-25 23:40:22 +0000711 Asm->GetTempSymbol("debug_loc", Offset));
712 DV->setDIE(VariableDie);
713 UseDotDebugLocEntry.insert(VariableDie);
714 return VariableDie;
715 }
716
717 // Check if variable is described by a DBG_VALUE instruction.
718 DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
719 DbgVariableToDbgInstMap.find(DV);
720 if (DVI != DbgVariableToDbgInstMap.end()) {
721 const MachineInstr *DVInsn = DVI->second;
Devang Patel9fc11702010-05-25 23:40:22 +0000722 bool updated = false;
Devang Patel9fc11702010-05-25 23:40:22 +0000723 if (DVInsn->getNumOperands() == 3) {
Devang Patel86ec8b32010-08-31 22:22:42 +0000724 if (DVInsn->getOperand(0).isReg()) {
725 const MachineOperand RegOp = DVInsn->getOperand(0);
726 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
727 if (DVInsn->getOperand(1).isImm() &&
728 TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
Devang Patel77dc5412011-04-27 22:45:24 +0000729 unsigned FrameReg = 0;
730 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
731 int Offset =
732 TFI->getFrameIndexReference(*Asm->MF,
733 DVInsn->getOperand(1).getImm(),
734 FrameReg);
735 MachineLocation Location(FrameReg, Offset);
736 VariableCU->addVariableAddress(DV, VariableDie, Location);
737
738 } else if (RegOp.getReg())
739 VariableCU->addVariableAddress(DV, VariableDie,
740 MachineLocation(RegOp.getReg()));
741 updated = true;
Devang Patel86ec8b32010-08-31 22:22:42 +0000742 }
Devang Patel9fc11702010-05-25 23:40:22 +0000743 else if (DVInsn->getOperand(0).isImm())
Devang Patel3c6aed22011-05-27 16:45:18 +0000744 updated =
745 VariableCU->addConstantValue(VariableDie, DVInsn->getOperand(0),
746 DV->getType());
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000747 else if (DVInsn->getOperand(0).isFPImm())
748 updated =
Devang Patel2606f4d2011-04-25 23:05:21 +0000749 VariableCU->addConstantFPValue(VariableDie, DVInsn->getOperand(0));
Devang Patelf071d722011-06-24 20:46:11 +0000750 else if (DVInsn->getOperand(0).isCImm())
751 updated =
752 VariableCU->addConstantValue(VariableDie,
753 DVInsn->getOperand(0).getCImm(),
754 isUnsignedDIType(DV->getType()));
Devang Patel9fc11702010-05-25 23:40:22 +0000755 } else {
Devang Patel77dc5412011-04-27 22:45:24 +0000756 VariableCU->addVariableAddress(DV, VariableDie,
757 Asm->getDebugValueLocation(DVInsn));
758 updated = true;
Devang Patel9fc11702010-05-25 23:40:22 +0000759 }
760 if (!updated) {
761 // If variableDie is not updated then DBG_VALUE instruction does not
762 // have valid variable info.
763 delete VariableDie;
764 return NULL;
765 }
766 DV->setDIE(VariableDie);
767 return VariableDie;
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000768 }
Devang Patel9fc11702010-05-25 23:40:22 +0000769
770 // .. else use frame index, if available.
Devang Patel9fc11702010-05-25 23:40:22 +0000771 int FI = 0;
Devang Patel77dc5412011-04-27 22:45:24 +0000772 if (findVariableFrameIndex(DV, &FI)) {
773 unsigned FrameReg = 0;
774 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
775 int Offset =
776 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
777 MachineLocation Location(FrameReg, Offset);
778 VariableCU->addVariableAddress(DV, VariableDie, Location);
779 }
780
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000781 DV->setDIE(VariableDie);
782 return VariableDie;
783
784}
Devang Patel930143b2009-11-21 02:48:08 +0000785
786/// constructScopeDIE - Construct a DIE for this scope.
787DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
Devang Patel3b548aa2010-03-08 20:52:55 +0000788 if (!Scope || !Scope->getScopeNode())
789 return NULL;
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000790
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000791 SmallVector <DIE *, 8> Children;
Devang Patel6c622ef2011-03-01 22:58:55 +0000792
793 // Collect arguments for current function.
794 if (Scope == CurrentFnDbgScope)
795 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
796 if (DbgVariable *ArgDV = CurrentFnArguments[i])
797 if (DIE *Arg = constructVariableDIE(ArgDV, Scope))
798 Children.push_back(Arg);
799
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000800 // Collect lexical scope childrens first.
801 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
802 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
803 if (DIE *Variable = constructVariableDIE(Variables[i], Scope))
804 Children.push_back(Variable);
805 const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
806 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
807 if (DIE *Nested = constructScopeDIE(Scopes[j]))
808 Children.push_back(Nested);
Devang Patel3b548aa2010-03-08 20:52:55 +0000809 DIScope DS(Scope->getScopeNode());
810 DIE *ScopeDIE = NULL;
811 if (Scope->getInlinedAt())
812 ScopeDIE = constructInlinedScopeDIE(Scope);
813 else if (DS.isSubprogram()) {
Devang Pateld10b2af2010-06-28 20:53:04 +0000814 ProcessedSPNodes.insert(DS);
Devang Patela37a95e2010-07-07 22:20:57 +0000815 if (Scope->isAbstractScope()) {
Devang Patel1a0df9a2010-05-10 22:49:55 +0000816 ScopeDIE = getCompileUnit(DS)->getDIE(DS);
Devang Patela37a95e2010-07-07 22:20:57 +0000817 // Note down abstract DIE.
818 if (ScopeDIE)
819 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
820 }
Devang Patel3b548aa2010-03-08 20:52:55 +0000821 else
Devang Patelcfa8e9d2010-05-07 18:11:54 +0000822 ScopeDIE = updateSubprogramScopeDIE(DS);
Devang Patel3b548aa2010-03-08 20:52:55 +0000823 }
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000824 else {
825 // There is no need to emit empty lexical block DIE.
826 if (Children.empty())
827 return NULL;
Devang Patel3b548aa2010-03-08 20:52:55 +0000828 ScopeDIE = constructLexicalScopeDIE(Scope);
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000829 }
830
Devang Patel23b2ae62010-03-29 22:59:58 +0000831 if (!ScopeDIE) return NULL;
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000832
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000833 // Add children
834 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
835 E = Children.end(); I != E; ++I)
836 ScopeDIE->addChild(*I);
Devang Patel04d2f2d2009-11-24 01:14:22 +0000837
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000838 if (DS.isSubprogram())
Devang Patelf20c4f72011-04-12 22:53:02 +0000839 getCompileUnit(DS)->addPubTypes(DISubprogram(DS));
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000840
Devang Patel04d2f2d2009-11-24 01:14:22 +0000841 return ScopeDIE;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000842}
843
Bill Wendling2b128d72009-05-20 23:19:06 +0000844/// GetOrCreateSourceID - Look up the source id with the given directory and
845/// source file names. If none currently exists, create a new id and insert it
846/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
847/// maps as well.
Devang Patel498877d2010-07-24 00:53:22 +0000848
Devang Patele01b75c2011-03-24 20:30:50 +0000849unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName,
850 StringRef DirName) {
Devang Patel871d0b12010-09-16 20:57:49 +0000851 // If FE did not provide a file name, then assume stdin.
852 if (FileName.empty())
Devang Patele01b75c2011-03-24 20:30:50 +0000853 return GetOrCreateSourceID("<stdin>", StringRef());
854
855 // MCStream expects full path name as filename.
Benjamin Kramer440c3b72011-06-05 14:36:47 +0000856 if (!DirName.empty() && !sys::path::is_absolute(FileName)) {
857 SmallString<128> FullPathName = DirName;
858 sys::path::append(FullPathName, FileName);
Devang Patele01b75c2011-03-24 20:30:50 +0000859 // Here FullPathName will be copied into StringMap by GetOrCreateSourceID.
860 return GetOrCreateSourceID(StringRef(FullPathName), StringRef());
861 }
Devang Patel871d0b12010-09-16 20:57:49 +0000862
Rafael Espindola67c6ab82010-11-18 02:04:25 +0000863 StringMapEntry<unsigned> &Entry = SourceIdMap.GetOrCreateValue(FileName);
864 if (Entry.getValue())
865 return Entry.getValue();
Bill Wendling2b128d72009-05-20 23:19:06 +0000866
Rafael Espindola67c6ab82010-11-18 02:04:25 +0000867 unsigned SrcId = SourceIdMap.size();
868 Entry.setValue(SrcId);
Bill Wendling2b128d72009-05-20 23:19:06 +0000869
Rafael Espindola67c6ab82010-11-18 02:04:25 +0000870 // Print out a .file directive to specify files for .loc directives.
Devang Patele01b75c2011-03-24 20:30:50 +0000871 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, Entry.getKey());
Bill Wendling2b128d72009-05-20 23:19:06 +0000872
873 return SrcId;
874}
875
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000876/// constructCompileUnit - Create new CompileUnit for the given
Devang Patel1a0df9a2010-05-10 22:49:55 +0000877/// metadata node with tag DW_TAG_compile_unit.
Devang Patel32cc43c2010-05-07 20:54:48 +0000878void DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patel80ae3492009-08-28 23:24:31 +0000879 DICompileUnit DIUnit(N);
Devang Patel2d9caf92009-11-25 17:36:49 +0000880 StringRef FN = DIUnit.getFilename();
881 StringRef Dir = DIUnit.getDirectory();
Devang Patele01b75c2011-03-24 20:30:50 +0000882 unsigned ID = GetOrCreateSourceID(FN, Dir);
Bill Wendling2b128d72009-05-20 23:19:06 +0000883
884 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Devang Patelf20c4f72011-04-12 22:53:02 +0000885 CompileUnit *NewCU = new CompileUnit(ID, Die, Asm, this);
886 NewCU->addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
887 DIUnit.getProducer());
888 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
889 DIUnit.getLanguage());
890 NewCU->addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
Devang Patelbd798ce2010-04-26 22:54:28 +0000891 // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
892 // simplifies debug range entries.
Devang Patelf20c4f72011-04-12 22:53:02 +0000893 NewCU->addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
Devang Pateld22ed622010-03-22 23:11:36 +0000894 // DW_AT_stmt_list is a offset of line number information for this
Devang Patel4a213872010-08-24 00:06:12 +0000895 // compile unit in debug_line section.
Rafael Espindola2fe0ee12011-05-10 20:35:05 +0000896 if(Asm->MAI->doesDwarfRequireRelocationForSectionOffset())
Rafael Espindolaa7558912011-05-04 17:44:06 +0000897 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
Devang Patelf20c4f72011-04-12 22:53:02 +0000898 Asm->GetTempSymbol("section_line"));
Devang Patelea636392010-08-31 23:50:19 +0000899 else
Devang Patelf20c4f72011-04-12 22:53:02 +0000900 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
Bill Wendling2b128d72009-05-20 23:19:06 +0000901
Devang Patel2d9caf92009-11-25 17:36:49 +0000902 if (!Dir.empty())
Devang Patelf20c4f72011-04-12 22:53:02 +0000903 NewCU->addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
Bill Wendling2b128d72009-05-20 23:19:06 +0000904 if (DIUnit.isOptimized())
Devang Patelf20c4f72011-04-12 22:53:02 +0000905 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
Bill Wendling2b128d72009-05-20 23:19:06 +0000906
Devang Patel2d9caf92009-11-25 17:36:49 +0000907 StringRef Flags = DIUnit.getFlags();
908 if (!Flags.empty())
Devang Patelf20c4f72011-04-12 22:53:02 +0000909 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
910
Bill Wendling2b128d72009-05-20 23:19:06 +0000911 unsigned RVer = DIUnit.getRunTimeVersion();
912 if (RVer)
Devang Patelf20c4f72011-04-12 22:53:02 +0000913 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendling2b128d72009-05-20 23:19:06 +0000914 dwarf::DW_FORM_data1, RVer);
915
Devang Patel1a0df9a2010-05-10 22:49:55 +0000916 if (!FirstCU)
917 FirstCU = NewCU;
918 CUMap.insert(std::make_pair(N, NewCU));
Bill Wendling2b128d72009-05-20 23:19:06 +0000919}
920
Nick Lewycky019d2552011-07-29 03:49:23 +0000921/// getCompileUnit - Get CompileUnit DIE.
Devang Patel1a0df9a2010-05-10 22:49:55 +0000922CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
923 assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
924 DIDescriptor D(N);
925 const MDNode *CUNode = NULL;
926 if (D.isCompileUnit())
927 CUNode = N;
928 else if (D.isSubprogram())
929 CUNode = DISubprogram(N).getCompileUnit();
930 else if (D.isType())
931 CUNode = DIType(N).getCompileUnit();
932 else if (D.isGlobalVariable())
933 CUNode = DIGlobalVariable(N).getCompileUnit();
934 else if (D.isVariable())
935 CUNode = DIVariable(N).getCompileUnit();
936 else if (D.isNameSpace())
937 CUNode = DINameSpace(N).getCompileUnit();
938 else if (D.isFile())
939 CUNode = DIFile(N).getCompileUnit();
940 else
941 return FirstCU;
942
943 DenseMap<const MDNode *, CompileUnit *>::const_iterator I
944 = CUMap.find(CUNode);
945 if (I == CUMap.end())
946 return FirstCU;
947 return I->second;
948}
949
Nick Lewycky019d2552011-07-29 03:49:23 +0000950// Return const expression if value is a GEP to access merged global
Devang Patel2d9e5322011-01-20 00:02:16 +0000951// constant. e.g.
952// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
953static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
954 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
955 if (!CE || CE->getNumOperands() != 3 ||
Bob Wilson0a8d5c62011-08-03 19:42:51 +0000956 CE->getOpcode() != Instruction::GetElementPtr)
Devang Patel2d9e5322011-01-20 00:02:16 +0000957 return NULL;
958
Bob Wilson0a8d5c62011-08-03 19:42:51 +0000959 // First operand points to a global struct.
960 Value *Ptr = CE->getOperand(0);
961 if (!isa<GlobalValue>(Ptr) ||
962 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
Devang Patel2d9e5322011-01-20 00:02:16 +0000963 return NULL;
964
965 // Second operand is zero.
Nick Lewycky019d2552011-07-29 03:49:23 +0000966 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
Devang Patel2d9e5322011-01-20 00:02:16 +0000967 if (!CI || !CI->isZero())
968 return NULL;
969
970 // Third operand is offset.
971 if (!isa<ConstantInt>(CE->getOperand(2)))
972 return NULL;
973
974 return CE;
975}
976
Devang Patel1a0df9a2010-05-10 22:49:55 +0000977/// constructGlobalVariableDIE - Construct global variable DIE.
Devang Patel32cc43c2010-05-07 20:54:48 +0000978void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
Devang Patel469c12d22010-08-10 01:37:23 +0000979 DIGlobalVariable GV(N);
Daniel Dunbarc418d6b2009-09-19 20:40:05 +0000980
Devang Patelf5d53602009-09-04 23:59:07 +0000981 // If debug information is malformed then ignore it.
Devang Patel469c12d22010-08-10 01:37:23 +0000982 if (GV.Verify() == false)
Devang Patelf5d53602009-09-04 23:59:07 +0000983 return;
Bill Wendling2b128d72009-05-20 23:19:06 +0000984
985 // Check for pre-existence.
Devang Patel1a0df9a2010-05-10 22:49:55 +0000986 CompileUnit *TheCU = getCompileUnit(N);
Devang Patel469c12d22010-08-10 01:37:23 +0000987 if (TheCU->getDIE(GV))
Devang Patel0751a282009-06-26 01:49:18 +0000988 return;
Bill Wendling2b128d72009-05-20 23:19:06 +0000989
Devang Patel469c12d22010-08-10 01:37:23 +0000990 DIType GTy = GV.getType();
Devang Patelb2197462010-08-10 07:11:13 +0000991 DIE *VariableDIE = new DIE(GV.getTag());
992
993 bool isGlobalVariable = GV.getGlobal() != NULL;
Bill Wendling2b128d72009-05-20 23:19:06 +0000994
Devang Patel469c12d22010-08-10 01:37:23 +0000995 // Add name.
Devang Patelf20c4f72011-04-12 22:53:02 +0000996 TheCU->addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
997 GV.getDisplayName());
Devang Patel469c12d22010-08-10 01:37:23 +0000998 StringRef LinkageName = GV.getLinkageName();
Devang Patelb2197462010-08-10 07:11:13 +0000999 if (!LinkageName.empty() && isGlobalVariable)
Devang Patelf20c4f72011-04-12 22:53:02 +00001000 TheCU->addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
1001 dwarf::DW_FORM_string,
1002 getRealLinkageName(LinkageName));
Devang Patel469c12d22010-08-10 01:37:23 +00001003 // Add type.
Devang Patelf20c4f72011-04-12 22:53:02 +00001004 TheCU->addType(VariableDIE, GTy);
Devang Patele9853f22011-05-31 22:56:51 +00001005
Devang Patel469c12d22010-08-10 01:37:23 +00001006 // Add scoping info.
1007 if (!GV.isLocalToUnit()) {
Devang Patelf20c4f72011-04-12 22:53:02 +00001008 TheCU->addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Devang Patel469c12d22010-08-10 01:37:23 +00001009 // Expose as global.
1010 TheCU->addGlobal(GV.getName(), VariableDIE);
1011 }
1012 // Add line number info.
Devang Patelf20c4f72011-04-12 22:53:02 +00001013 TheCU->addSourceLine(VariableDIE, GV);
Devang Patel469c12d22010-08-10 01:37:23 +00001014 // Add to map.
1015 TheCU->insertDIE(N, VariableDIE);
1016 // Add to context owner.
1017 DIDescriptor GVContext = GV.getContext();
Devang Patelf20c4f72011-04-12 22:53:02 +00001018 TheCU->addToContextOwner(VariableDIE, GVContext);
Devang Patel469c12d22010-08-10 01:37:23 +00001019 // Add location.
Devang Patelb2197462010-08-10 07:11:13 +00001020 if (isGlobalVariable) {
1021 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patelf20c4f72011-04-12 22:53:02 +00001022 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1023 TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata,
Devang Patelb2197462010-08-10 07:11:13 +00001024 Asm->Mang->getSymbol(GV.getGlobal()));
1025 // Do not create specification DIE if context is either compile unit
1026 // or a subprogram.
1027 if (GV.isDefinition() && !GVContext.isCompileUnit() &&
1028 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1029 // Create specification DIE.
1030 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patelf20c4f72011-04-12 22:53:02 +00001031 TheCU->addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
Devang Patelb2197462010-08-10 07:11:13 +00001032 dwarf::DW_FORM_ref4, VariableDIE);
Devang Patelf20c4f72011-04-12 22:53:02 +00001033 TheCU->addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1034 TheCU->addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Devang Patelb2197462010-08-10 07:11:13 +00001035 TheCU->addDie(VariableSpecDIE);
1036 } else {
Devang Patelf20c4f72011-04-12 22:53:02 +00001037 TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Devang Patelb2197462010-08-10 07:11:13 +00001038 }
Devang Patelf071d722011-06-24 20:46:11 +00001039 } else if (const ConstantInt *CI =
Devang Patel70eb9822011-01-06 21:39:25 +00001040 dyn_cast_or_null<ConstantInt>(GV.getConstant()))
Devang Patelf20c4f72011-04-12 22:53:02 +00001041 TheCU->addConstantValue(VariableDIE, CI, isUnsignedDIType(GTy));
Devang Patel2d9e5322011-01-20 00:02:16 +00001042 else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
1043 // GV is a merged global.
1044 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Bob Wilson0a8d5c62011-08-03 19:42:51 +00001045 Value *Ptr = CE->getOperand(0);
Devang Patelf20c4f72011-04-12 22:53:02 +00001046 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1047 TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata,
Bob Wilson0a8d5c62011-08-03 19:42:51 +00001048 Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Patelf20c4f72011-04-12 22:53:02 +00001049 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
Bob Wilson0a8d5c62011-08-03 19:42:51 +00001050 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
Devang Pateldc9cbaa2011-08-03 01:25:46 +00001051 TheCU->addUInt(Block, 0, dwarf::DW_FORM_udata,
Bob Wilson0a8d5c62011-08-03 19:42:51 +00001052 Asm->getTargetData().getIndexedOffset(Ptr->getType(), Idx));
Devang Patelf20c4f72011-04-12 22:53:02 +00001053 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1054 TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Devang Patel2d9e5322011-01-20 00:02:16 +00001055 }
Devang Patel70eb9822011-01-06 21:39:25 +00001056
Devang Patel0751a282009-06-26 01:49:18 +00001057 return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001058}
1059
Devang Patel1a0df9a2010-05-10 22:49:55 +00001060/// construct SubprogramDIE - Construct subprogram DIE.
Devang Patel32cc43c2010-05-07 20:54:48 +00001061void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
Devang Patel80ae3492009-08-28 23:24:31 +00001062 DISubprogram SP(N);
Bill Wendling2b128d72009-05-20 23:19:06 +00001063
Stuart Hastings4bd3dd92010-04-06 21:38:29 +00001064 // Check for pre-existence.
Devang Patel1a0df9a2010-05-10 22:49:55 +00001065 CompileUnit *TheCU = getCompileUnit(N);
1066 if (TheCU->getDIE(N))
Stuart Hastings4bd3dd92010-04-06 21:38:29 +00001067 return;
1068
Bill Wendling2b128d72009-05-20 23:19:06 +00001069 if (!SP.isDefinition())
1070 // This is a method declaration which will be handled while constructing
1071 // class type.
Devang Patel0751a282009-06-26 01:49:18 +00001072 return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001073
Stuart Hastings4bd3dd92010-04-06 21:38:29 +00001074 DIE *SubprogramDie = createSubprogramDIE(SP);
1075
1076 // Add to map.
Devang Patel1a0df9a2010-05-10 22:49:55 +00001077 TheCU->insertDIE(N, SubprogramDie);
Bill Wendling2b128d72009-05-20 23:19:06 +00001078
1079 // Add to context owner.
Devang Patelf20c4f72011-04-12 22:53:02 +00001080 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel512001a2009-12-08 23:21:45 +00001081
Bill Wendling2b128d72009-05-20 23:19:06 +00001082 // Expose as global.
Devang Patel1a0df9a2010-05-10 22:49:55 +00001083 TheCU->addGlobal(SP.getName(), SubprogramDie);
Devang Patel04d2f2d2009-11-24 01:14:22 +00001084
Devang Patel0751a282009-06-26 01:49:18 +00001085 return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001086}
1087
Devang Patel930143b2009-11-21 02:48:08 +00001088/// beginModule - Emit all Dwarf sections that should come prior to the
Daniel Dunbarbe22ec42009-09-19 20:40:14 +00001089/// content. Create global DIEs and emit initial debug info sections.
Nick Lewycky019d2552011-07-29 03:49:23 +00001090/// This is invoked by the target AsmPrinter.
Chris Lattner11980022010-04-04 07:48:20 +00001091void DwarfDebug::beginModule(Module *M) {
Devang Patel6c74a872010-04-27 19:46:33 +00001092 if (DisableDebugInfoPrinting)
1093 return;
1094
Nick Lewycky019d2552011-07-29 03:49:23 +00001095 // If module has named metadata anchors then use them, otherwise scan the
1096 // module using debug info finder to collect debug info.
Devang Patele02e5852011-05-03 16:45:22 +00001097 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
1098 if (CU_Nodes) {
Devang Patelc981f622011-05-04 16:34:02 +00001099
1100 NamedMDNode *GV_Nodes = M->getNamedMetadata("llvm.dbg.gv");
1101 NamedMDNode *SP_Nodes = M->getNamedMetadata("llvm.dbg.sp");
1102 if (!GV_Nodes && !SP_Nodes)
1103 // If there are not any global variables or any functions then
1104 // there is not any debug info in this module.
Devang Patele02e5852011-05-03 16:45:22 +00001105 return;
1106
Devang Patelc981f622011-05-04 16:34:02 +00001107 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i)
1108 constructCompileUnit(CU_Nodes->getOperand(i));
Devang Patele02e5852011-05-03 16:45:22 +00001109
Devang Patelc981f622011-05-04 16:34:02 +00001110 if (GV_Nodes)
1111 for (unsigned i = 0, e = GV_Nodes->getNumOperands(); i != e; ++i)
1112 constructGlobalVariableDIE(GV_Nodes->getOperand(i));
1113
1114 if (SP_Nodes)
1115 for (unsigned i = 0, e = SP_Nodes->getNumOperands(); i != e; ++i)
1116 constructSubprogramDIE(SP_Nodes->getOperand(i));
Devang Patele02e5852011-05-03 16:45:22 +00001117
1118 } else {
1119
1120 DebugInfoFinder DbgFinder;
1121 DbgFinder.processModule(*M);
1122
Devang Patelc981f622011-05-04 16:34:02 +00001123 bool HasDebugInfo = false;
Nick Lewycky019d2552011-07-29 03:49:23 +00001124 // Scan all the compile-units to see if there are any marked as the main
1125 // unit. If not, we do not generate debug info.
Devang Patele02e5852011-05-03 16:45:22 +00001126 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1127 E = DbgFinder.compile_unit_end(); I != E; ++I) {
1128 if (DICompileUnit(*I).isMain()) {
1129 HasDebugInfo = true;
1130 break;
1131 }
1132 }
Devang Patelc981f622011-05-04 16:34:02 +00001133 if (!HasDebugInfo) return;
Devang Patele02e5852011-05-03 16:45:22 +00001134
1135 // Create all the compile unit DIEs.
1136 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1137 E = DbgFinder.compile_unit_end(); I != E; ++I)
1138 constructCompileUnit(*I);
1139
1140 // Create DIEs for each global variable.
1141 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1142 E = DbgFinder.global_variable_end(); I != E; ++I)
1143 constructGlobalVariableDIE(*I);
1144
1145 // Create DIEs for each subprogram.
1146 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1147 E = DbgFinder.subprogram_end(); I != E; ++I)
1148 constructSubprogramDIE(*I);
Chris Lattner7cfa70e2010-04-05 02:19:28 +00001149 }
Devang Patele02e5852011-05-03 16:45:22 +00001150
Chris Lattner7cfa70e2010-04-05 02:19:28 +00001151 // Tell MMI that we have debug info.
1152 MMI->setDebugInfoAvailability(true);
Devang Patele02e5852011-05-03 16:45:22 +00001153
Chris Lattnerd442aa32010-04-04 23:17:54 +00001154 // Emit initial sections.
Chris Lattner7cfa70e2010-04-05 02:19:28 +00001155 EmitSectionLabels();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001156
Devang Patel8e06a5e2010-08-10 20:01:20 +00001157 //getOrCreateTypeDIE
1158 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
Devang Patelf20c4f72011-04-12 22:53:02 +00001159 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1160 DIType Ty(NMD->getOperand(i));
1161 getCompileUnit(Ty)->getOrCreateTypeDIE(Ty);
1162 }
Devang Patel8e06a5e2010-08-10 20:01:20 +00001163
Devang Patel7a554812010-09-28 18:08:20 +00001164 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
Devang Patelf20c4f72011-04-12 22:53:02 +00001165 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1166 DIType Ty(NMD->getOperand(i));
1167 getCompileUnit(Ty)->getOrCreateTypeDIE(Ty);
1168 }
Devang Patel7a554812010-09-28 18:08:20 +00001169
Bill Wendling2b128d72009-05-20 23:19:06 +00001170 // Prime section data.
Chris Lattner5e693ed2009-07-28 03:13:23 +00001171 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendling2b128d72009-05-20 23:19:06 +00001172}
1173
Devang Patel930143b2009-11-21 02:48:08 +00001174/// endModule - Emit all Dwarf sections that should come after the content.
Bill Wendling2b128d72009-05-20 23:19:06 +00001175///
Devang Patel930143b2009-11-21 02:48:08 +00001176void DwarfDebug::endModule() {
Devang Patel1a0df9a2010-05-10 22:49:55 +00001177 if (!FirstCU) return;
Devang Patelf3b2db62010-06-28 18:25:03 +00001178 const Module *M = MMI->getModule();
Devang Pateld0701282010-08-02 17:32:15 +00001179 DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
Devang Patelf3b2db62010-06-28 18:25:03 +00001180 if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
1181 for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
1182 if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
1183 DISubprogram SP(AllSPs->getOperand(SI));
1184 if (!SP.Verify()) continue;
1185
1186 // Collect info for variables that were optimized out.
Devang Patel18efced2010-07-19 17:53:55 +00001187 if (!SP.isDefinition()) continue;
Devang Patelf3b2db62010-06-28 18:25:03 +00001188 StringRef FName = SP.getLinkageName();
1189 if (FName.empty())
1190 FName = SP.getName();
Devang Patel364bf042010-11-10 22:19:21 +00001191 NamedMDNode *NMD = getFnSpecificMDNode(*(MMI->getModule()), FName);
Devang Patelf3b2db62010-06-28 18:25:03 +00001192 if (!NMD) continue;
1193 unsigned E = NMD->getNumOperands();
1194 if (!E) continue;
1195 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
Devang Pateld0701282010-08-02 17:32:15 +00001196 DeadFnScopeMap[SP] = Scope;
Devang Patelf3b2db62010-06-28 18:25:03 +00001197 for (unsigned I = 0; I != E; ++I) {
1198 DIVariable DV(NMD->getOperand(I));
1199 if (!DV.Verify()) continue;
1200 Scope->addVariable(new DbgVariable(DV));
1201 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001202
Devang Patelf3b2db62010-06-28 18:25:03 +00001203 // Construct subprogram DIE and add variables DIEs.
1204 constructSubprogramDIE(SP);
1205 DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
Devang Patel406798a2010-08-09 18:51:29 +00001206 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
Devang Patelf3b2db62010-06-28 18:25:03 +00001207 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1208 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1209 if (VariableDIE)
1210 ScopeDIE->addChild(VariableDIE);
1211 }
1212 }
1213 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001214
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001215 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1216 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1217 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1218 DIE *ISP = *AI;
Devang Patelf20c4f72011-04-12 22:53:02 +00001219 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001220 }
1221
Devang Patel32cc43c2010-05-07 20:54:48 +00001222 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Devang Pateleb57c592009-12-03 19:11:07 +00001223 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1224 DIE *SPDie = CI->first;
Devang Patel32cc43c2010-05-07 20:54:48 +00001225 const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
Devang Pateleb57c592009-12-03 19:11:07 +00001226 if (!N) continue;
Devang Patel1a0df9a2010-05-10 22:49:55 +00001227 DIE *NDie = getCompileUnit(N)->getDIE(N);
Devang Pateleb57c592009-12-03 19:11:07 +00001228 if (!NDie) continue;
Devang Patelf20c4f72011-04-12 22:53:02 +00001229 getCompileUnit(N)->addDIEEntry(SPDie, dwarf::DW_AT_containing_type,
1230 dwarf::DW_FORM_ref4, NDie);
Devang Pateleb57c592009-12-03 19:11:07 +00001231 }
1232
Bill Wendling2b128d72009-05-20 23:19:06 +00001233 // Standard sections final addresses.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001234 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnera179b522010-04-04 19:25:43 +00001235 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001236 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnera179b522010-04-04 19:25:43 +00001237 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendling2b128d72009-05-20 23:19:06 +00001238
1239 // End text sections.
1240 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001241 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Chris Lattnera179b522010-04-04 19:25:43 +00001242 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
Bill Wendling2b128d72009-05-20 23:19:06 +00001243 }
1244
Bill Wendling2b128d72009-05-20 23:19:06 +00001245 // Compute DIE offsets and sizes.
Devang Patel930143b2009-11-21 02:48:08 +00001246 computeSizeAndOffsets();
Bill Wendling2b128d72009-05-20 23:19:06 +00001247
1248 // Emit all the DIEs into a debug info section
Devang Patel930143b2009-11-21 02:48:08 +00001249 emitDebugInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001250
1251 // Corresponding abbreviations into a abbrev section.
Devang Patel930143b2009-11-21 02:48:08 +00001252 emitAbbreviations();
Bill Wendling2b128d72009-05-20 23:19:06 +00001253
Bill Wendling2b128d72009-05-20 23:19:06 +00001254 // Emit info into a debug pubnames section.
Devang Patel930143b2009-11-21 02:48:08 +00001255 emitDebugPubNames();
Bill Wendling2b128d72009-05-20 23:19:06 +00001256
Devang Patel04d2f2d2009-11-24 01:14:22 +00001257 // Emit info into a debug pubtypes section.
1258 emitDebugPubTypes();
1259
Bill Wendling2b128d72009-05-20 23:19:06 +00001260 // Emit info into a debug loc section.
Devang Patel930143b2009-11-21 02:48:08 +00001261 emitDebugLoc();
Bill Wendling2b128d72009-05-20 23:19:06 +00001262
1263 // Emit info into a debug aranges section.
1264 EmitDebugARanges();
1265
1266 // Emit info into a debug ranges section.
Devang Patel930143b2009-11-21 02:48:08 +00001267 emitDebugRanges();
Bill Wendling2b128d72009-05-20 23:19:06 +00001268
1269 // Emit info into a debug macinfo section.
Devang Patel930143b2009-11-21 02:48:08 +00001270 emitDebugMacInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001271
1272 // Emit inline info.
Devang Patel930143b2009-11-21 02:48:08 +00001273 emitDebugInlineInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001274
Chris Lattnerb7aa9522010-03-13 02:17:42 +00001275 // Emit info into a debug str section.
1276 emitDebugStr();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001277
Devang Pateld0701282010-08-02 17:32:15 +00001278 // clean up.
1279 DeleteContainerSeconds(DeadFnScopeMap);
Devang Patel1a0df9a2010-05-10 22:49:55 +00001280 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1281 E = CUMap.end(); I != E; ++I)
1282 delete I->second;
1283 FirstCU = NULL; // Reset for the next Module, if any.
Bill Wendling2b128d72009-05-20 23:19:06 +00001284}
1285
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001286/// findAbstractVariable - Find abstract variable, if any, associated with Var.
Chandler Carruth81b7e112011-08-05 00:51:31 +00001287DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
Chris Lattner915c5f92010-04-02 19:42:39 +00001288 DebugLoc ScopeLoc) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001289
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001290 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001291 if (AbsDbgVariable)
1292 return AbsDbgVariable;
1293
Chandler Carruth81b7e112011-08-05 00:51:31 +00001294 LLVMContext &Ctx = Var->getContext();
Chris Lattner915c5f92010-04-02 19:42:39 +00001295 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001296 if (!Scope)
1297 return NULL;
1298
Devang Patele1c53f22010-05-20 16:36:41 +00001299 AbsDbgVariable = new DbgVariable(Var);
Devang Patel930143b2009-11-21 02:48:08 +00001300 Scope->addVariable(AbsDbgVariable);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001301 AbstractVariables[Var] = AbsDbgVariable;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001302 return AbsDbgVariable;
1303}
1304
Nick Lewycky019d2552011-07-29 03:49:23 +00001305/// addCurrentFnArgument - If Var is a current function argument then add
1306/// it to CurrentFnArguments list.
Devang Patel6c622ef2011-03-01 22:58:55 +00001307bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
1308 DbgVariable *Var, DbgScope *Scope) {
1309 if (Scope != CurrentFnDbgScope)
1310 return false;
1311 DIVariable DV = Var->getVariable();
1312 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1313 return false;
1314 unsigned ArgNo = DV.getArgNumber();
1315 if (ArgNo == 0)
1316 return false;
1317
Devang Patel4ab660b2011-03-03 20:02:02 +00001318 size_t Size = CurrentFnArguments.size();
1319 if (Size == 0)
Devang Patel6c622ef2011-03-01 22:58:55 +00001320 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patel63b3e762011-03-03 21:49:41 +00001321 // llvm::Function argument size is not good indicator of how many
Devang Patel34a7ab42011-03-03 20:08:10 +00001322 // arguments does the function have at source level.
1323 if (ArgNo > Size)
Devang Patel4ab660b2011-03-03 20:02:02 +00001324 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel6c622ef2011-03-01 22:58:55 +00001325 CurrentFnArguments[ArgNo - 1] = Var;
1326 return true;
1327}
1328
Devang Patel490c8ab2010-05-20 19:57:06 +00001329/// collectVariableInfoFromMMITable - Collect variable information from
1330/// side table maintained by MMI.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001331void
Nick Lewycky019d2552011-07-29 03:49:23 +00001332DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patel490c8ab2010-05-20 19:57:06 +00001333 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patel475d32a2009-10-06 01:26:37 +00001334 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1335 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1336 VE = VMap.end(); VI != VE; ++VI) {
Devang Patel32cc43c2010-05-07 20:54:48 +00001337 const MDNode *Var = VI->first;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001338 if (!Var) continue;
Devang Patele0a94bf2010-05-14 21:01:35 +00001339 Processed.insert(Var);
Chris Lattner915c5f92010-04-02 19:42:39 +00001340 DIVariable DV(Var);
1341 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001342
Devang Patel47711592011-07-14 23:17:49 +00001343 DbgScope *Scope = findDbgScope(VP.second);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001344
Devang Patelcdb7d442009-11-10 23:20:04 +00001345 // If variable scope is not found then skip this variable.
Chris Lattner915c5f92010-04-02 19:42:39 +00001346 if (Scope == 0)
Devang Patelcdb7d442009-11-10 23:20:04 +00001347 continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001348
Devang Patele1c53f22010-05-20 16:36:41 +00001349 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
1350 DbgVariable *RegVar = new DbgVariable(DV);
1351 recordVariableFrameIndex(RegVar, VP.first);
Devang Patel6c622ef2011-03-01 22:58:55 +00001352 if (!addCurrentFnArgument(MF, RegVar, Scope))
1353 Scope->addVariable(RegVar);
Devang Patele1c53f22010-05-20 16:36:41 +00001354 if (AbsDbgVariable) {
1355 recordVariableFrameIndex(AbsDbgVariable, VP.first);
1356 VarToAbstractVarMap[RegVar] = AbsDbgVariable;
1357 }
Devang Patel475d32a2009-10-06 01:26:37 +00001358 }
Devang Patel490c8ab2010-05-20 19:57:06 +00001359}
Devang Patela3e9c9c2010-03-15 18:33:46 +00001360
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001361/// isDbgValueInDefinedReg - Return true if debug value, encoded by
Devang Patel9fc11702010-05-25 23:40:22 +00001362/// DBG_VALUE instruction, is in a defined reg.
1363static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
1364 assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001365 return MI->getNumOperands() == 3 &&
1366 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1367 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
Devang Patel9fc11702010-05-25 23:40:22 +00001368}
1369
Nick Lewycky019d2552011-07-29 03:49:23 +00001370/// getDebugLocEntry - Get .debug_loc entry for the instruction range starting
Devang Patel2442a892011-07-08 17:09:57 +00001371/// at MI.
1372static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1373 const MCSymbol *FLabel,
1374 const MCSymbol *SLabel,
1375 const MachineInstr *MI) {
1376 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1377
1378 if (MI->getNumOperands() != 3) {
1379 MachineLocation MLoc = Asm->getDebugValueLocation(MI);
1380 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1381 }
1382 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
1383 MachineLocation MLoc;
1384 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
1385 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1386 }
1387 if (MI->getOperand(0).isImm())
1388 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1389 if (MI->getOperand(0).isFPImm())
1390 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1391 if (MI->getOperand(0).isCImm())
1392 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1393
1394 assert (0 && "Unexpected 3 operand DBG_VALUE instruction!");
1395 return DotDebugLocEntry();
1396}
1397
Devang Patel490c8ab2010-05-20 19:57:06 +00001398/// collectVariableInfo - Populate DbgScope entries with variables' info.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001399void
Devang Patel5c0f85c2010-06-25 22:07:34 +00001400DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1401 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001402
Devang Patel490c8ab2010-05-20 19:57:06 +00001403 /// collection info from MMI table.
1404 collectVariableInfoFromMMITable(MF, Processed);
1405
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001406 for (SmallVectorImpl<const MDNode*>::const_iterator
1407 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1408 ++UVI) {
1409 const MDNode *Var = *UVI;
1410 if (Processed.count(Var))
Devang Patel490c8ab2010-05-20 19:57:06 +00001411 continue;
1412
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001413 // History contains relevant DBG_VALUE instructions for Var and instructions
1414 // clobbering it.
1415 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1416 if (History.empty())
1417 continue;
1418 const MachineInstr *MInsn = History.front();
Devang Patel9fc11702010-05-25 23:40:22 +00001419
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001420 DIVariable DV(Var);
Devang Patel447cb382011-01-11 21:42:10 +00001421 DbgScope *Scope = NULL;
Devang Patel7a9dedf2010-05-27 20:25:04 +00001422 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1423 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelfbd6c452010-05-21 00:10:20 +00001424 Scope = CurrentFnDbgScope;
Devang Patel8fb9fd62011-07-20 22:18:50 +00001425 else {
1426 if (DV.getVersion() <= LLVMDebugVersion9)
1427 Scope = findDbgScope(MInsn->getDebugLoc());
1428 else {
1429 if (MDNode *IA = DV.getInlinedAt())
1430 Scope = InlinedDbgScopeMap.lookup(DebugLoc::getFromDILocation(IA));
1431 else
1432 Scope = DbgScopeMap.lookup(cast<MDNode>(DV->getOperand(1)));
1433 }
1434 }
Devang Patel490c8ab2010-05-20 19:57:06 +00001435 // If variable scope is not found then skip this variable.
Devang Patelfbd6c452010-05-21 00:10:20 +00001436 if (!Scope)
Devang Patel490c8ab2010-05-20 19:57:06 +00001437 continue;
1438
1439 Processed.insert(DV);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001440 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel490c8ab2010-05-20 19:57:06 +00001441 DbgVariable *RegVar = new DbgVariable(DV);
Devang Patel6c622ef2011-03-01 22:58:55 +00001442 if (!addCurrentFnArgument(MF, RegVar, Scope))
1443 Scope->addVariable(RegVar);
Devang Patelfbd6c452010-05-21 00:10:20 +00001444 if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
1445 DbgVariableToDbgInstMap[AbsVar] = MInsn;
1446 VarToAbstractVarMap[RegVar] = AbsVar;
Devang Patela3e9c9c2010-03-15 18:33:46 +00001447 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001448
1449 // Simple ranges that are fully coalesced.
1450 if (History.size() <= 1 || (History.size() == 2 &&
1451 MInsn->isIdenticalTo(History.back()))) {
Devang Patel9fc11702010-05-25 23:40:22 +00001452 DbgVariableToDbgInstMap[RegVar] = MInsn;
1453 continue;
1454 }
1455
1456 // handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001457 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001458
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001459 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1460 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1461 const MachineInstr *Begin = *HI;
1462 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesen9c057ee2011-03-22 00:21:41 +00001463
Devang Patele7181b52011-06-01 23:00:17 +00001464 // Check if DBG_VALUE is truncating a range.
1465 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1466 && !Begin->getOperand(0).getReg())
1467 continue;
1468
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001469 // Compute the range for a register location.
1470 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1471 const MCSymbol *SLabel = 0;
1472
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001473 if (HI + 1 == HE)
1474 // If Begin is the last instruction in History then its value is valid
Chris Lattner0ab5e2c2011-04-15 05:18:47 +00001475 // until the end of the function.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001476 SLabel = FunctionEndSym;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001477 else {
1478 const MachineInstr *End = HI[1];
Devang Patel53b050a2011-07-07 21:44:42 +00001479 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
1480 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001481 if (End->isDebugValue())
1482 SLabel = getLabelBeforeInsn(End);
1483 else {
1484 // End is a normal instruction clobbering the range.
1485 SLabel = getLabelAfterInsn(End);
1486 assert(SLabel && "Forgot label after clobber instruction");
1487 ++HI;
1488 }
1489 }
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001490
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001491 // The value is valid until the next DBG_VALUE or clobber.
Devang Patel2442a892011-07-08 17:09:57 +00001492 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel, Begin));
Devang Patel9fc11702010-05-25 23:40:22 +00001493 }
1494 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patela3e9c9c2010-03-15 18:33:46 +00001495 }
Devang Patele0a94bf2010-05-14 21:01:35 +00001496
1497 // Collect info for variables that were optimized out.
Devang Patelad517352010-06-22 01:01:58 +00001498 const Function *F = MF->getFunction();
Devang Patel364bf042010-11-10 22:19:21 +00001499 if (NamedMDNode *NMD = getFnSpecificMDNode(*(F->getParent()), F->getName())) {
Devang Patele0a94bf2010-05-14 21:01:35 +00001500 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
Dan Gohman093cb792010-07-21 18:54:18 +00001501 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
Devang Patel490c8ab2010-05-20 19:57:06 +00001502 if (!DV || !Processed.insert(DV))
Devang Patele0a94bf2010-05-14 21:01:35 +00001503 continue;
1504 DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
1505 if (Scope)
Devang Patele1c53f22010-05-20 16:36:41 +00001506 Scope->addVariable(new DbgVariable(DV));
Devang Patele0a94bf2010-05-14 21:01:35 +00001507 }
1508 }
Devang Patel9fc11702010-05-25 23:40:22 +00001509}
Devang Patele0a94bf2010-05-14 21:01:35 +00001510
Devang Patel9fc11702010-05-25 23:40:22 +00001511/// getLabelBeforeInsn - Return Label preceding the instruction.
1512const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001513 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1514 assert(Label && "Didn't insert label before instruction");
1515 return Label;
Devang Patel9fc11702010-05-25 23:40:22 +00001516}
1517
1518/// getLabelAfterInsn - Return Label immediately following the instruction.
1519const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001520 return LabelsAfterInsn.lookup(MI);
Devang Patel475d32a2009-10-06 01:26:37 +00001521}
1522
Devang Patelb5694e72010-10-26 17:49:02 +00001523/// beginInstruction - Process beginning of an instruction.
1524void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001525 // Check if source location changes, but ignore DBG_VALUE locations.
1526 if (!MI->isDebugValue()) {
1527 DebugLoc DL = MI->getDebugLoc();
1528 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Devang Patel34a66202011-05-11 19:22:19 +00001529 unsigned Flags = DWARF2_FLAG_IS_STMT;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001530 PrevInstLoc = DL;
Devang Patel34a66202011-05-11 19:22:19 +00001531 if (DL == PrologEndLoc) {
1532 Flags |= DWARF2_FLAG_PROLOGUE_END;
1533 PrologEndLoc = DebugLoc();
1534 }
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001535 if (!DL.isUnknown()) {
1536 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel34a66202011-05-11 19:22:19 +00001537 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001538 } else
Devang Patel34a66202011-05-11 19:22:19 +00001539 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001540 }
Devang Patel9fc11702010-05-25 23:40:22 +00001541 }
Devang Patel23b2ae62010-03-29 22:59:58 +00001542
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001543 // Insert labels where requested.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001544 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1545 LabelsBeforeInsn.find(MI);
1546
1547 // No label needed.
1548 if (I == LabelsBeforeInsn.end())
1549 return;
1550
1551 // Label already assigned.
1552 if (I->second)
Devang Patel002d54d2010-05-26 19:37:24 +00001553 return;
Devang Patelbd477be2010-03-29 17:20:31 +00001554
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001555 if (!PrevLabel) {
Devang Patelacc32a52010-05-26 21:23:46 +00001556 PrevLabel = MMI->getContext().CreateTempSymbol();
1557 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel002d54d2010-05-26 19:37:24 +00001558 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001559 I->second = PrevLabel;
Devang Patel8db360d2009-10-06 01:50:42 +00001560}
1561
Devang Patelb5694e72010-10-26 17:49:02 +00001562/// endInstruction - Process end of an instruction.
1563void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001564 // Don't create a new label after DBG_VALUE instructions.
1565 // They don't generate code.
1566 if (!MI->isDebugValue())
1567 PrevLabel = 0;
1568
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001569 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1570 LabelsAfterInsn.find(MI);
1571
1572 // No label needed.
1573 if (I == LabelsAfterInsn.end())
1574 return;
1575
1576 // Label already assigned.
1577 if (I->second)
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001578 return;
1579
1580 // We need a label after this instruction.
1581 if (!PrevLabel) {
1582 PrevLabel = MMI->getContext().CreateTempSymbol();
1583 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel3ebd8932010-04-08 16:50:29 +00001584 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001585 I->second = PrevLabel;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001586}
1587
Devang Patelddfe66e2011-07-20 23:00:27 +00001588/// getOrCreateRegularScope - Create regular DbgScope.
1589DbgScope *DwarfDebug::getOrCreateRegularScope(MDNode *Scope) {
1590 DbgScope *WScope = DbgScopeMap.lookup(Scope);
Devang Patelfee7ced2011-08-08 18:22:10 +00001591 if (WScope)
Devang Patelddfe66e2011-07-20 23:00:27 +00001592 return WScope;
Devang Patelfee7ced2011-08-08 18:22:10 +00001593
1594 DbgScope *Parent = NULL;
1595 if (DIDescriptor(Scope).isLexicalBlock())
1596 Parent = getOrCreateDbgScope(DebugLoc::getFromDILexicalBlock(Scope));
1597 WScope = new DbgScope(Parent, DIDescriptor(Scope), NULL);
Devang Patelddfe66e2011-07-20 23:00:27 +00001598 DbgScopeMap.insert(std::make_pair(Scope, WScope));
Devang Patelfee7ced2011-08-08 18:22:10 +00001599 if (!Parent && DIDescriptor(Scope).isSubprogram()
1600 && DISubprogram(Scope).describes(Asm->MF->getFunction()))
Devang Patelddfe66e2011-07-20 23:00:27 +00001601 CurrentFnDbgScope = WScope;
1602
1603 return WScope;
1604}
1605
1606/// getOrCreateInlinedScope - Create inlined scope.
1607DbgScope *DwarfDebug::getOrCreateInlinedScope(MDNode *Scope, MDNode *InlinedAt){
1608 DbgScope *InlinedScope = DbgScopeMap.lookup(InlinedAt);
1609 if (InlinedScope)
1610 return InlinedScope;
1611
Devang Patelddfe66e2011-07-20 23:00:27 +00001612 DebugLoc InlinedLoc = DebugLoc::getFromDILocation(InlinedAt);
Devang Patelfee7ced2011-08-08 18:22:10 +00001613 InlinedScope = new DbgScope(getOrCreateDbgScope(InlinedLoc),
1614 DIDescriptor(Scope), InlinedAt);
Devang Patelddfe66e2011-07-20 23:00:27 +00001615 InlinedDbgScopeMap[InlinedLoc] = InlinedScope;
1616 DbgScopeMap[InlinedAt] = InlinedScope;
Devang Patelddfe66e2011-07-20 23:00:27 +00001617 return InlinedScope;
1618}
1619
Devang Patel6c74a872010-04-27 19:46:33 +00001620/// getOrCreateDbgScope - Create DbgScope for the scope.
Devang Patel1f9913f2011-07-14 22:30:56 +00001621DbgScope *DwarfDebug::getOrCreateDbgScope(DebugLoc DL) {
1622 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
Devang Patel07d61ed2011-07-14 01:14:57 +00001623 MDNode *Scope = NULL;
1624 MDNode *InlinedAt = NULL;
1625 DL.getScopeAndInlinedAt(Scope, InlinedAt, Ctx);
Devang Patelddfe66e2011-07-20 23:00:27 +00001626 if (!InlinedAt)
1627 return getOrCreateRegularScope(Scope);
Devang Patel07d61ed2011-07-14 01:14:57 +00001628
Devang Patelddfe66e2011-07-20 23:00:27 +00001629 // Create an abstract scope for inlined function.
Devang Patel5c0f85c2010-06-25 22:07:34 +00001630 getOrCreateAbstractScope(Scope);
Devang Patelddfe66e2011-07-20 23:00:27 +00001631 // Create an inlined scope for inlined function.
1632 return getOrCreateInlinedScope(Scope, InlinedAt);
Devang Patel8db360d2009-10-06 01:50:42 +00001633}
1634
Devang Patel6c74a872010-04-27 19:46:33 +00001635/// calculateDominanceGraph - Calculate dominance graph for DbgScope
1636/// hierarchy.
1637static void calculateDominanceGraph(DbgScope *Scope) {
1638 assert (Scope && "Unable to calculate scop edominance graph!");
1639 SmallVector<DbgScope *, 4> WorkStack;
1640 WorkStack.push_back(Scope);
1641 unsigned Counter = 0;
1642 while (!WorkStack.empty()) {
1643 DbgScope *WS = WorkStack.back();
1644 const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
1645 bool visitedChildren = false;
1646 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
1647 SE = Children.end(); SI != SE; ++SI) {
1648 DbgScope *ChildScope = *SI;
1649 if (!ChildScope->getDFSOut()) {
1650 WorkStack.push_back(ChildScope);
1651 visitedChildren = true;
1652 ChildScope->setDFSIn(++Counter);
Devang Patelf098ce22011-07-27 00:34:13 +00001653#ifndef NDEBUG
1654 if (PrintDbgScope)
1655 dbgs() << "calculate dbgscope dom: In " << Counter << "\n";
1656#endif
Devang Patel6c74a872010-04-27 19:46:33 +00001657 break;
1658 }
1659 }
1660 if (!visitedChildren) {
1661 WorkStack.pop_back();
1662 WS->setDFSOut(++Counter);
Devang Patelf098ce22011-07-27 00:34:13 +00001663#ifndef NDEBUG
1664 if (PrintDbgScope)
1665 dbgs() << "calculate dbgscope dom: In " << WS->getDFSIn()
1666 << " Out " << Counter << "\n";
1667#endif
Devang Patel6c74a872010-04-27 19:46:33 +00001668 }
1669 }
1670}
1671
1672/// printDbgScopeInfo - Print DbgScope info for each machine instruction.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001673static
Devang Patel1f9913f2011-07-14 22:30:56 +00001674void printDbgScopeInfo(const MachineFunction *MF,
Devang Patel6c74a872010-04-27 19:46:33 +00001675 DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
1676{
1677#ifndef NDEBUG
Devang Patel1f9913f2011-07-14 22:30:56 +00001678 LLVMContext &Ctx = MF->getFunction()->getContext();
Devang Patel6c74a872010-04-27 19:46:33 +00001679 unsigned PrevDFSIn = 0;
1680 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1681 I != E; ++I) {
1682 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1683 II != IE; ++II) {
1684 const MachineInstr *MInsn = II;
Devang Patele07ebe32011-07-14 00:20:24 +00001685 MDNode *Scope = NULL;
1686 MDNode *InlinedAt = NULL;
Devang Patel6c74a872010-04-27 19:46:33 +00001687
1688 // Check if instruction has valid location information.
Devang Patele07ebe32011-07-14 00:20:24 +00001689 DebugLoc MIDL = MInsn->getDebugLoc();
1690 if (!MIDL.isUnknown()) {
1691 MIDL.getScopeAndInlinedAt(Scope, InlinedAt, Ctx);
Devang Patel6c74a872010-04-27 19:46:33 +00001692 dbgs() << " [ ";
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001693 if (InlinedAt)
Devang Patel6c74a872010-04-27 19:46:33 +00001694 dbgs() << "*";
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001695 DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
Devang Patel6c74a872010-04-27 19:46:33 +00001696 MI2ScopeMap.find(MInsn);
1697 if (DI != MI2ScopeMap.end()) {
1698 DbgScope *S = DI->second;
1699 dbgs() << S->getDFSIn();
1700 PrevDFSIn = S->getDFSIn();
1701 } else
1702 dbgs() << PrevDFSIn;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001703 } else
Devang Patel6c74a872010-04-27 19:46:33 +00001704 dbgs() << " [ x" << PrevDFSIn;
1705 dbgs() << " ]";
1706 MInsn->dump();
1707 }
1708 dbgs() << "\n";
1709 }
1710#endif
1711}
Devang Patel930143b2009-11-21 02:48:08 +00001712/// extractScopeInformation - Scan machine instructions in this function
Chris Lattner848c7d22010-03-31 05:39:57 +00001713/// and collect DbgScopes. Return true, if at least one scope was found.
Chris Lattner76555b52010-01-26 23:18:02 +00001714bool DwarfDebug::extractScopeInformation() {
Devang Patel75cc16c2009-10-01 20:31:14 +00001715 // If scope information was extracted using .dbg intrinsics then there is not
1716 // any need to extract these information by scanning each instruction.
1717 if (!DbgScopeMap.empty())
1718 return false;
1719
Dan Gohmane9135cb2010-04-23 01:18:53 +00001720 // Scan each instruction and create scopes. First build working set of scopes.
Devang Patel6c74a872010-04-27 19:46:33 +00001721 SmallVector<DbgRange, 4> MIRanges;
1722 DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
Chris Lattner3a383cb2010-04-05 00:13:49 +00001723 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
Devang Patel75cc16c2009-10-01 20:31:14 +00001724 I != E; ++I) {
Devang Patel613958c2011-07-26 18:09:53 +00001725 const MachineInstr *RangeBeginMI = NULL;
1726 const MachineInstr *PrevMI = NULL;
1727 DebugLoc PrevDL;
Devang Patel75cc16c2009-10-01 20:31:14 +00001728 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1729 II != IE; ++II) {
1730 const MachineInstr *MInsn = II;
Devang Patel6c74a872010-04-27 19:46:33 +00001731
1732 // Check if instruction has valid location information.
Devang Patele07ebe32011-07-14 00:20:24 +00001733 const DebugLoc MIDL = MInsn->getDebugLoc();
1734 if (MIDL.isUnknown()) {
Devang Patel6c74a872010-04-27 19:46:33 +00001735 PrevMI = MInsn;
1736 continue;
1737 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001738
Devang Patel6c74a872010-04-27 19:46:33 +00001739 // If scope has not changed then skip this instruction.
Devang Patel07d61ed2011-07-14 01:14:57 +00001740 if (MIDL == PrevDL) {
Devang Patel6c74a872010-04-27 19:46:33 +00001741 PrevMI = MInsn;
1742 continue;
1743 }
1744
Nick Lewycky019d2552011-07-29 03:49:23 +00001745 // Ignore DBG_VALUE. It does not contribute to any instruction in output.
Devang Pateld12c0a22011-02-15 17:56:09 +00001746 if (MInsn->isDebugValue())
1747 continue;
1748
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001749 if (RangeBeginMI) {
Nick Lewycky019d2552011-07-29 03:49:23 +00001750 // If we have already seen a beginning of an instruction range and
Devang Patel6c74a872010-04-27 19:46:33 +00001751 // current instruction scope does not match scope of first instruction
1752 // in this range then create a new instruction range.
Devang Patela9195bc2011-07-14 00:04:53 +00001753 DEBUG(dbgs() << "Creating new instruction range :\n");
Devang Patel2cce0d12011-07-14 00:03:58 +00001754 DEBUG(dbgs() << "Begin Range at " << *RangeBeginMI);
1755 DEBUG(dbgs() << "End Range at " << *PrevMI);
Devang Patela9195bc2011-07-14 00:04:53 +00001756 DEBUG(dbgs() << "Next Range starting at " << *MInsn);
Devang Patel2cce0d12011-07-14 00:03:58 +00001757 DEBUG(dbgs() << "------------------------\n");
Devang Patel6c74a872010-04-27 19:46:33 +00001758 DbgRange R(RangeBeginMI, PrevMI);
Devang Patel1f9913f2011-07-14 22:30:56 +00001759 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevDL);
Devang Patel6c74a872010-04-27 19:46:33 +00001760 MIRanges.push_back(R);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001761 }
Devang Patel6c74a872010-04-27 19:46:33 +00001762
1763 // This is a beginning of a new instruction range.
1764 RangeBeginMI = MInsn;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001765
Devang Patel6c74a872010-04-27 19:46:33 +00001766 // Reset previous markers.
1767 PrevMI = MInsn;
Devang Patel07d61ed2011-07-14 01:14:57 +00001768 PrevDL = MIDL;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001769 }
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001770
Devang Patel613958c2011-07-26 18:09:53 +00001771 // Create last instruction range.
1772 if (RangeBeginMI && PrevMI && !PrevDL.isUnknown()) {
1773 DbgRange R(RangeBeginMI, PrevMI);
1774 MIRanges.push_back(R);
1775 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevDL);
1776 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001777 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001778
Devang Patel530a0752010-01-04 20:44:00 +00001779 if (!CurrentFnDbgScope)
1780 return false;
1781
Devang Patel6c74a872010-04-27 19:46:33 +00001782 calculateDominanceGraph(CurrentFnDbgScope);
1783 if (PrintDbgScope)
Devang Patel1f9913f2011-07-14 22:30:56 +00001784 printDbgScopeInfo(Asm->MF, MI2ScopeMap);
Devang Patel6c74a872010-04-27 19:46:33 +00001785
1786 // Find ranges of instructions covered by each DbgScope;
1787 DbgScope *PrevDbgScope = NULL;
1788 for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
1789 RE = MIRanges.end(); RI != RE; ++RI) {
1790 const DbgRange &R = *RI;
1791 DbgScope *S = MI2ScopeMap.lookup(R.first);
1792 assert (S && "Lost DbgScope for a machine instruction!");
1793 if (PrevDbgScope && !PrevDbgScope->dominates(S))
1794 PrevDbgScope->closeInsnRange(S);
1795 S->openInsnRange(R.first);
1796 S->extendInsnRange(R.second);
1797 PrevDbgScope = S;
1798 }
1799
1800 if (PrevDbgScope)
1801 PrevDbgScope->closeInsnRange();
Devang Patel75cc16c2009-10-01 20:31:14 +00001802
Devang Patel359b0132010-04-08 18:43:56 +00001803 identifyScopeMarkers();
Devang Patelf1d5a1e2010-04-08 15:37:09 +00001804
1805 return !DbgScopeMap.empty();
1806}
1807
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001808/// identifyScopeMarkers() -
Devang Patel6c74a872010-04-27 19:46:33 +00001809/// Each DbgScope has first instruction and last instruction to mark beginning
1810/// and end of a scope respectively. Create an inverse map that list scopes
1811/// starts (and ends) with an instruction. One instruction may start (or end)
1812/// multiple scopes. Ignore scopes that are not reachable.
Devang Patel359b0132010-04-08 18:43:56 +00001813void DwarfDebug::identifyScopeMarkers() {
Devang Patel7771b7c2010-01-20 02:05:23 +00001814 SmallVector<DbgScope *, 4> WorkList;
1815 WorkList.push_back(CurrentFnDbgScope);
1816 while (!WorkList.empty()) {
Chris Lattner848c7d22010-03-31 05:39:57 +00001817 DbgScope *S = WorkList.pop_back_val();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001818
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00001819 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001820 if (!Children.empty())
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00001821 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel7771b7c2010-01-20 02:05:23 +00001822 SE = Children.end(); SI != SE; ++SI)
1823 WorkList.push_back(*SI);
1824
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001825 if (S->isAbstractScope())
1826 continue;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001827
Devang Patel6c74a872010-04-27 19:46:33 +00001828 const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
1829 if (Ranges.empty())
1830 continue;
1831 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1832 RE = Ranges.end(); RI != RE; ++RI) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001833 assert(RI->first && "DbgRange does not have first instruction!");
1834 assert(RI->second && "DbgRange does not have second instruction!");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001835 requestLabelBeforeInsn(RI->first);
1836 requestLabelAfterInsn(RI->second);
Devang Patel6c74a872010-04-27 19:46:33 +00001837 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001838 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001839}
1840
Devang Patel589845d2011-05-09 22:14:49 +00001841/// getScopeNode - Get MDNode for DebugLoc's scope.
1842static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1843 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1844 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1845 return DL.getScope(Ctx);
1846}
1847
Devang Patel34a66202011-05-11 19:22:19 +00001848/// getFnDebugLoc - Walk up the scope chain of given debug loc and find
1849/// line number info for the function.
1850static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1851 const MDNode *Scope = getScopeNode(DL, Ctx);
1852 DISubprogram SP = getDISubprogram(Scope);
1853 if (SP.Verify())
1854 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1855 return DebugLoc();
1856}
1857
Devang Patel930143b2009-11-21 02:48:08 +00001858/// beginFunction - Gather pre-function debug information. Assumes being
Bill Wendling2b128d72009-05-20 23:19:06 +00001859/// emitted immediately after the function entry point.
Chris Lattner76555b52010-01-26 23:18:02 +00001860void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner196dbdc2010-04-05 03:52:55 +00001861 if (!MMI->hasDebugInfo()) return;
Bill Wendlingfcc14142010-04-07 09:28:04 +00001862 if (!extractScopeInformation()) return;
Devang Patel4598eb62009-10-06 18:37:31 +00001863
Devang Patel6c74a872010-04-27 19:46:33 +00001864 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1865 Asm->getFunctionNumber());
Bill Wendling2b128d72009-05-20 23:19:06 +00001866 // Assumes in correct section after the entry point.
Devang Patel6c74a872010-04-27 19:46:33 +00001867 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendling2b128d72009-05-20 23:19:06 +00001868
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001869 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1870
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001871 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001872 /// LiveUserVar - Map physreg numbers to the MDNode they contain.
1873 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1874
Devang Patel002d54d2010-05-26 19:37:24 +00001875 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001876 I != E; ++I) {
1877 bool AtBlockEntry = true;
Devang Patel002d54d2010-05-26 19:37:24 +00001878 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1879 II != IE; ++II) {
1880 const MachineInstr *MI = II;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001881
Devang Patel002d54d2010-05-26 19:37:24 +00001882 if (MI->isDebugValue()) {
Devang Patel002d54d2010-05-26 19:37:24 +00001883 assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001884
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001885 // Keep track of user variables.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001886 const MDNode *Var =
1887 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001888
1889 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001890 if (isDbgValueInDefinedReg(MI))
1891 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1892
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001893 // Check the history of this variable.
1894 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1895 if (History.empty()) {
1896 UserVariables.push_back(Var);
1897 // The first mention of a function argument gets the FunctionBeginSym
1898 // label, so arguments are visible when breaking at function entry.
1899 DIVariable DV(Var);
1900 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1901 DISubprogram(getDISubprogram(DV.getContext()))
1902 .describes(MF->getFunction()))
1903 LabelsBeforeInsn[MI] = FunctionBeginSym;
1904 } else {
1905 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1906 const MachineInstr *Prev = History.back();
1907 if (Prev->isDebugValue()) {
1908 // Coalesce identical entries at the end of History.
1909 if (History.size() >= 2 &&
Devang Patelb7a328e2011-07-07 00:14:27 +00001910 Prev->isIdenticalTo(History[History.size() - 2])) {
1911 DEBUG(dbgs() << "Coalesce identical DBG_VALUE entries:\n"
1912 << "\t" << *Prev
1913 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001914 History.pop_back();
Devang Patelb7a328e2011-07-07 00:14:27 +00001915 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001916
1917 // Terminate old register assignments that don't reach MI;
1918 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1919 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1920 isDbgValueInDefinedReg(Prev)) {
1921 // Previous register assignment needs to terminate at the end of
1922 // its basic block.
1923 MachineBasicBlock::const_iterator LastMI =
1924 PrevMBB->getLastNonDebugInstr();
Devang Patelb7a328e2011-07-07 00:14:27 +00001925 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001926 // Drop DBG_VALUE for empty range.
Devang Patelb7a328e2011-07-07 00:14:27 +00001927 DEBUG(dbgs() << "Drop DBG_VALUE for empty range:\n"
1928 << "\t" << *Prev << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001929 History.pop_back();
Devang Patelb7a328e2011-07-07 00:14:27 +00001930 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001931 else {
1932 // Terminate after LastMI.
1933 History.push_back(LastMI);
1934 }
1935 }
1936 }
1937 }
1938 History.push_back(MI);
Devang Patel002d54d2010-05-26 19:37:24 +00001939 } else {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001940 // Not a DBG_VALUE instruction.
1941 if (!MI->isLabel())
1942 AtBlockEntry = false;
1943
Devang Patel34a66202011-05-11 19:22:19 +00001944 // First known non DBG_VALUE location marks beginning of function
1945 // body.
1946 if (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown())
1947 PrologEndLoc = MI->getDebugLoc();
1948
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001949 // Check if the instruction clobbers any registers with debug vars.
1950 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1951 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1952 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1953 continue;
1954 for (const unsigned *AI = TRI->getOverlaps(MOI->getReg());
1955 unsigned Reg = *AI; ++AI) {
1956 const MDNode *Var = LiveUserVar[Reg];
1957 if (!Var)
1958 continue;
1959 // Reg is now clobbered.
1960 LiveUserVar[Reg] = 0;
1961
1962 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001963 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1964 if (HistI == DbgValues.end())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001965 continue;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001966 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1967 if (History.empty())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001968 continue;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001969 const MachineInstr *Prev = History.back();
1970 // Sanity-check: Register assignments are terminated at the end of
1971 // their block.
1972 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1973 continue;
1974 // Is the variable still in Reg?
1975 if (!isDbgValueInDefinedReg(Prev) ||
1976 Prev->getOperand(0).getReg() != Reg)
1977 continue;
1978 // Var is clobbered. Make sure the next instruction gets a label.
1979 History.push_back(MI);
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001980 }
1981 }
Devang Patel002d54d2010-05-26 19:37:24 +00001982 }
Devang Patel002d54d2010-05-26 19:37:24 +00001983 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001984 }
1985
1986 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1987 I != E; ++I) {
1988 SmallVectorImpl<const MachineInstr*> &History = I->second;
1989 if (History.empty())
1990 continue;
1991
1992 // Make sure the final register assignments are terminated.
1993 const MachineInstr *Prev = History.back();
1994 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1995 const MachineBasicBlock *PrevMBB = Prev->getParent();
1996 MachineBasicBlock::const_iterator LastMI = PrevMBB->getLastNonDebugInstr();
1997 if (LastMI == PrevMBB->end())
1998 // Drop DBG_VALUE for empty range.
1999 History.pop_back();
2000 else {
2001 // Terminate after LastMI.
2002 History.push_back(LastMI);
2003 }
2004 }
2005 // Request labels for the full history.
2006 for (unsigned i = 0, e = History.size(); i != e; ++i) {
2007 const MachineInstr *MI = History[i];
2008 if (MI->isDebugValue())
2009 requestLabelBeforeInsn(MI);
2010 else
2011 requestLabelAfterInsn(MI);
2012 }
2013 }
Devang Patel002d54d2010-05-26 19:37:24 +00002014
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00002015 PrevInstLoc = DebugLoc();
Devang Patel002d54d2010-05-26 19:37:24 +00002016 PrevLabel = FunctionBeginSym;
Devang Patel34a66202011-05-11 19:22:19 +00002017
2018 // Record beginning of function.
2019 if (!PrologEndLoc.isUnknown()) {
2020 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
2021 MF->getFunction()->getContext());
2022 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
2023 FnStartDL.getScope(MF->getFunction()->getContext()),
2024 DWARF2_FLAG_IS_STMT);
2025 }
Bill Wendling2b128d72009-05-20 23:19:06 +00002026}
2027
Devang Patel930143b2009-11-21 02:48:08 +00002028/// endFunction - Gather and emit post-function debug information.
Bill Wendling2b128d72009-05-20 23:19:06 +00002029///
Chris Lattner76555b52010-01-26 23:18:02 +00002030void DwarfDebug::endFunction(const MachineFunction *MF) {
Bill Wendlingfcc14142010-04-07 09:28:04 +00002031 if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
Devang Patel2904aa92009-11-12 19:02:56 +00002032
Devang Patel530a0752010-01-04 20:44:00 +00002033 if (CurrentFnDbgScope) {
Devang Patel4a8e6e82010-05-22 00:04:14 +00002034
Devang Patel9fc11702010-05-25 23:40:22 +00002035 // Define end label for subprogram.
2036 FunctionEndSym = Asm->GetTempSymbol("func_end",
2037 Asm->getFunctionNumber());
2038 // Assumes in correct section after the entry point.
2039 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002040
Devang Patel5c0f85c2010-06-25 22:07:34 +00002041 SmallPtrSet<const MDNode *, 16> ProcessedVars;
2042 collectVariableInfo(MF, ProcessedVars);
Devang Patel4a8e6e82010-05-22 00:04:14 +00002043
Devang Patel530a0752010-01-04 20:44:00 +00002044 // Construct abstract scopes.
2045 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
Devang Patel5c0f85c2010-06-25 22:07:34 +00002046 AE = AbstractScopesList.end(); AI != AE; ++AI) {
Devang Patel5c0f85c2010-06-25 22:07:34 +00002047 DISubprogram SP((*AI)->getScopeNode());
2048 if (SP.Verify()) {
2049 // Collect info for variables that were optimized out.
2050 StringRef FName = SP.getLinkageName();
2051 if (FName.empty())
2052 FName = SP.getName();
Devang Patel364bf042010-11-10 22:19:21 +00002053 if (NamedMDNode *NMD =
2054 getFnSpecificMDNode(*(MF->getFunction()->getParent()), FName)) {
Devang Patel5c0f85c2010-06-25 22:07:34 +00002055 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
Dan Gohman093cb792010-07-21 18:54:18 +00002056 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
Devang Patel5c0f85c2010-06-25 22:07:34 +00002057 if (!DV || !ProcessedVars.insert(DV))
2058 continue;
Devang Patel648df7b2010-06-30 00:11:08 +00002059 DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
Devang Patel5c0f85c2010-06-25 22:07:34 +00002060 if (Scope)
2061 Scope->addVariable(new DbgVariable(DV));
2062 }
2063 }
2064 }
Devang Patelc5b31092010-06-30 01:40:11 +00002065 if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
2066 constructScopeDIE(*AI);
Devang Patel5c0f85c2010-06-25 22:07:34 +00002067 }
Devang Patel30265c42010-07-07 20:12:52 +00002068
Devang Patel075e9b52010-05-04 06:15:30 +00002069 DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002070
Devang Patel075e9b52010-05-04 06:15:30 +00002071 if (!DisableFramePointerElim(*MF))
Devang Patelf20c4f72011-04-12 22:53:02 +00002072 getCompileUnit(CurrentFnDbgScope->getScopeNode())->addUInt(CurFnDIE,
2073 dwarf::DW_AT_APPLE_omit_frame_ptr,
2074 dwarf::DW_FORM_flag, 1);
Devang Patel075e9b52010-05-04 06:15:30 +00002075
2076
Chris Lattner3a383cb2010-04-05 00:13:49 +00002077 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
Devang Patel530a0752010-01-04 20:44:00 +00002078 MMI->getFrameMoves()));
Bill Wendling2b128d72009-05-20 23:19:06 +00002079 }
2080
Bill Wendling2b128d72009-05-20 23:19:06 +00002081 // Clear debug info
Devang Patelfe189e62010-01-19 01:26:02 +00002082 CurrentFnDbgScope = NULL;
Devang Patelad45d912011-04-22 18:09:57 +00002083 DeleteContainerPointers(CurrentFnArguments);
Devang Patele1c53f22010-05-20 16:36:41 +00002084 DbgVariableToFrameIndexMap.clear();
2085 VarToAbstractVarMap.clear();
2086 DbgVariableToDbgInstMap.clear();
Devang Patelb7cc0632011-07-15 21:25:44 +00002087 InlinedDbgScopeMap.clear();
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00002088 DeleteContainerSeconds(DbgScopeMap);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00002089 UserVariables.clear();
2090 DbgValues.clear();
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00002091 DeleteContainerSeconds(AbstractScopes);
Devang Patelfe189e62010-01-19 01:26:02 +00002092 AbstractScopesList.clear();
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00002093 AbstractVariables.clear();
Devang Patel6c74a872010-04-27 19:46:33 +00002094 LabelsBeforeInsn.clear();
2095 LabelsAfterInsn.clear();
Devang Patel12563b32010-04-16 23:33:45 +00002096 PrevLabel = NULL;
Bill Wendling2b128d72009-05-20 23:19:06 +00002097}
2098
Devang Patele1c53f22010-05-20 16:36:41 +00002099/// recordVariableFrameIndex - Record a variable's index.
2100void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2101 assert (V && "Invalid DbgVariable!");
2102 DbgVariableToFrameIndexMap[V] = Index;
2103}
2104
2105/// findVariableFrameIndex - Return true if frame index for the variable
2106/// is found. Update FI to hold value of the index.
2107bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2108 assert (V && "Invalid DbgVariable!");
2109 DenseMap<const DbgVariable *, int>::iterator I =
2110 DbgVariableToFrameIndexMap.find(V);
2111 if (I == DbgVariableToFrameIndexMap.end())
2112 return false;
2113 *FI = I->second;
2114 return true;
2115}
2116
Devang Patel47711592011-07-14 23:17:49 +00002117/// findDbgScope - Find DbgScope for the debug loc.
2118DbgScope *DwarfDebug::findDbgScope(DebugLoc DL) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002119 if (DL.isUnknown())
Devang Patel47711592011-07-14 23:17:49 +00002120 return NULL;
Devang Patel490c8ab2010-05-20 19:57:06 +00002121
Devang Patel47711592011-07-14 23:17:49 +00002122 DbgScope *Scope = NULL;
2123 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
Devang Patelb7cc0632011-07-15 21:25:44 +00002124 if (MDNode *IA = DL.getInlinedAt(Ctx))
2125 Scope = InlinedDbgScopeMap.lookup(DebugLoc::getFromDILocation(IA));
2126 else
2127 Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
Devang Patel490c8ab2010-05-20 19:57:06 +00002128 return Scope;
2129}
2130
2131
Chris Lattnerba35a672010-03-09 04:54:43 +00002132/// recordSourceLine - Register a source line with debug info. Returns the
2133/// unique label that was emitted and which provides correspondence to
2134/// the source line list.
Devang Patel34a66202011-05-11 19:22:19 +00002135void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
2136 unsigned Flags) {
Devang Patel2d9caf92009-11-25 17:36:49 +00002137 StringRef Fn;
Devang Patele01b75c2011-03-24 20:30:50 +00002138 StringRef Dir;
Dan Gohman50849c62010-05-05 23:41:32 +00002139 unsigned Src = 1;
2140 if (S) {
2141 DIDescriptor Scope(S);
Devang Patel2089d162009-10-05 18:03:19 +00002142
Dan Gohman50849c62010-05-05 23:41:32 +00002143 if (Scope.isCompileUnit()) {
2144 DICompileUnit CU(S);
Dan Gohman50849c62010-05-05 23:41:32 +00002145 Fn = CU.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00002146 Dir = CU.getDirectory();
Devang Patelc4b69052010-10-28 17:30:52 +00002147 } else if (Scope.isFile()) {
2148 DIFile F(S);
Devang Patelc4b69052010-10-28 17:30:52 +00002149 Fn = F.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00002150 Dir = F.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00002151 } else if (Scope.isSubprogram()) {
2152 DISubprogram SP(S);
Dan Gohman50849c62010-05-05 23:41:32 +00002153 Fn = SP.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00002154 Dir = SP.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00002155 } else if (Scope.isLexicalBlock()) {
2156 DILexicalBlock DB(S);
Dan Gohman50849c62010-05-05 23:41:32 +00002157 Fn = DB.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00002158 Dir = DB.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00002159 } else
2160 assert(0 && "Unexpected scope info");
2161
Devang Patele01b75c2011-03-24 20:30:50 +00002162 Src = GetOrCreateSourceID(Fn, Dir);
Dan Gohman50849c62010-05-05 23:41:32 +00002163 }
Nick Lewycky019d2552011-07-29 03:49:23 +00002164 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendling2b128d72009-05-20 23:19:06 +00002165}
2166
Bill Wendling806535f2009-05-20 23:22:40 +00002167//===----------------------------------------------------------------------===//
2168// Emit Methods
2169//===----------------------------------------------------------------------===//
2170
Devang Patel930143b2009-11-21 02:48:08 +00002171/// computeSizeAndOffset - Compute the size and offset of a DIE.
Bill Wendling480ff322009-05-20 23:21:38 +00002172///
Jim Grosbach00e9c612009-11-22 19:20:36 +00002173unsigned
2174DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
Bill Wendling480ff322009-05-20 23:21:38 +00002175 // Get the children.
2176 const std::vector<DIE *> &Children = Die->getChildren();
2177
2178 // If not last sibling and has children then add sibling offset attribute.
Jeffrey Yasskin54ebc982010-03-22 18:47:14 +00002179 if (!Last && !Children.empty())
Benjamin Kramer74729ae2010-03-31 19:34:01 +00002180 Die->addSiblingOffset(DIEValueAllocator);
Bill Wendling480ff322009-05-20 23:21:38 +00002181
2182 // Record the abbreviation.
Devang Patel930143b2009-11-21 02:48:08 +00002183 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling480ff322009-05-20 23:21:38 +00002184
2185 // Get the abbreviation for this DIE.
2186 unsigned AbbrevNumber = Die->getAbbrevNumber();
2187 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2188
2189 // Set DIE offset
2190 Die->setOffset(Offset);
2191
2192 // Start the size with the size of abbreviation code.
Chris Lattner7b26fce2009-08-22 20:48:53 +00002193 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling480ff322009-05-20 23:21:38 +00002194
2195 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2196 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2197
2198 // Size the DIE attribute values.
2199 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2200 // Size attribute value.
Chris Lattner5a00dea2010-04-05 00:18:22 +00002201 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling480ff322009-05-20 23:21:38 +00002202
2203 // Size the DIE children if any.
2204 if (!Children.empty()) {
2205 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2206 "Children flag not set");
2207
2208 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel930143b2009-11-21 02:48:08 +00002209 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
Bill Wendling480ff322009-05-20 23:21:38 +00002210
2211 // End of children marker.
2212 Offset += sizeof(int8_t);
2213 }
2214
2215 Die->setSize(Offset - Die->getOffset());
2216 return Offset;
2217}
2218
Devang Patel930143b2009-11-21 02:48:08 +00002219/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
Bill Wendling480ff322009-05-20 23:21:38 +00002220///
Devang Patel930143b2009-11-21 02:48:08 +00002221void DwarfDebug::computeSizeAndOffsets() {
Devang Patel1a0df9a2010-05-10 22:49:55 +00002222 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2223 E = CUMap.end(); I != E; ++I) {
2224 // Compute size of compile unit header.
Devang Patel28dce702011-04-12 23:10:47 +00002225 unsigned Offset =
Devang Patel1a0df9a2010-05-10 22:49:55 +00002226 sizeof(int32_t) + // Length of Compilation Unit Info
2227 sizeof(int16_t) + // DWARF version number
2228 sizeof(int32_t) + // Offset Into Abbrev. Section
2229 sizeof(int8_t); // Pointer Size (in bytes)
2230 computeSizeAndOffset(I->second->getCUDie(), Offset, true);
Devang Patel1a0df9a2010-05-10 22:49:55 +00002231 }
Bill Wendling480ff322009-05-20 23:21:38 +00002232}
2233
Chris Lattner1fbf53b2010-04-04 23:02:02 +00002234/// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2235/// temporary label to it if SymbolStem is specified.
Chris Lattner6629ca92010-04-04 22:59:04 +00002236static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Chris Lattner1fbf53b2010-04-04 23:02:02 +00002237 const char *SymbolStem = 0) {
Chris Lattner6629ca92010-04-04 22:59:04 +00002238 Asm->OutStreamer.SwitchSection(Section);
Chris Lattner1fbf53b2010-04-04 23:02:02 +00002239 if (!SymbolStem) return 0;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002240
Chris Lattner6629ca92010-04-04 22:59:04 +00002241 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2242 Asm->OutStreamer.EmitLabel(TmpSym);
2243 return TmpSym;
2244}
2245
2246/// EmitSectionLabels - Emit initial Dwarf sections with a label at
2247/// the start of each one.
Chris Lattner46355d82010-04-04 22:33:59 +00002248void DwarfDebug::EmitSectionLabels() {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002249 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00002250
Bill Wendling480ff322009-05-20 23:21:38 +00002251 // Dwarf sections base addresses.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002252 DwarfInfoSectionSym =
Chris Lattner6629ca92010-04-04 22:59:04 +00002253 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002254 DwarfAbbrevSectionSym =
Chris Lattner6629ca92010-04-04 22:59:04 +00002255 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Chris Lattner1fbf53b2010-04-04 23:02:02 +00002256 EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002257
Chris Lattner6629ca92010-04-04 22:59:04 +00002258 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Chris Lattner1fbf53b2010-04-04 23:02:02 +00002259 EmitSectionSym(Asm, MacroInfo);
Bill Wendling480ff322009-05-20 23:21:38 +00002260
Devang Patel4a213872010-08-24 00:06:12 +00002261 EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Chris Lattner1fbf53b2010-04-04 23:02:02 +00002262 EmitSectionSym(Asm, TLOF.getDwarfLocSection());
2263 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
2264 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002265 DwarfStrSectionSym =
Chris Lattner6629ca92010-04-04 22:59:04 +00002266 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
Devang Patel12563b32010-04-16 23:33:45 +00002267 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
2268 "debug_range");
Bill Wendling480ff322009-05-20 23:21:38 +00002269
Devang Patel9fc11702010-05-25 23:40:22 +00002270 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
2271 "section_debug_loc");
2272
Chris Lattner6629ca92010-04-04 22:59:04 +00002273 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
Chris Lattnere58b5472010-04-04 23:10:38 +00002274 EmitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002275}
2276
Nick Lewycky019d2552011-07-29 03:49:23 +00002277/// emitDIE - Recursively emits a debug information entry.
Bill Wendling480ff322009-05-20 23:21:38 +00002278///
Devang Patel930143b2009-11-21 02:48:08 +00002279void DwarfDebug::emitDIE(DIE *Die) {
Bill Wendling480ff322009-05-20 23:21:38 +00002280 // Get the abbreviation for this DIE.
2281 unsigned AbbrevNumber = Die->getAbbrevNumber();
2282 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2283
Bill Wendling480ff322009-05-20 23:21:38 +00002284 // Emit the code (index) for the abbreviation.
Chris Lattner7bde8c02010-04-04 18:52:31 +00002285 if (Asm->isVerbose())
Chris Lattnerfa823552010-01-22 23:18:42 +00002286 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2287 Twine::utohexstr(Die->getOffset()) + ":0x" +
2288 Twine::utohexstr(Die->getSize()) + " " +
2289 dwarf::TagString(Abbrev->getTag()));
Chris Lattner9efd1182010-04-04 19:09:29 +00002290 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling480ff322009-05-20 23:21:38 +00002291
Jeffrey Yasskin54ebc982010-03-22 18:47:14 +00002292 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
Bill Wendling480ff322009-05-20 23:21:38 +00002293 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2294
2295 // Emit the DIE attribute values.
2296 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2297 unsigned Attr = AbbrevData[i].getAttribute();
2298 unsigned Form = AbbrevData[i].getForm();
2299 assert(Form && "Too many attributes for DIE (check abbreviation)");
2300
Chris Lattner7bde8c02010-04-04 18:52:31 +00002301 if (Asm->isVerbose())
Chris Lattner5adf9872010-01-24 18:54:17 +00002302 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002303
Bill Wendling480ff322009-05-20 23:21:38 +00002304 switch (Attr) {
2305 case dwarf::DW_AT_sibling:
Devang Patel930143b2009-11-21 02:48:08 +00002306 Asm->EmitInt32(Die->getSiblingOffset());
Bill Wendling480ff322009-05-20 23:21:38 +00002307 break;
2308 case dwarf::DW_AT_abstract_origin: {
2309 DIEEntry *E = cast<DIEEntry>(Values[i]);
2310 DIE *Origin = E->getEntry();
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002311 unsigned Addr = Origin->getOffset();
Bill Wendling480ff322009-05-20 23:21:38 +00002312 Asm->EmitInt32(Addr);
2313 break;
2314 }
Devang Patel12563b32010-04-16 23:33:45 +00002315 case dwarf::DW_AT_ranges: {
2316 // DW_AT_range Value encodes offset in debug_range section.
2317 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelda3ef852010-09-02 16:43:44 +00002318
2319 if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
2320 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
2321 V->getValue(),
2322 4);
2323 } else {
2324 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
2325 V->getValue(),
2326 DwarfDebugRangeSectionSym,
2327 4);
2328 }
Devang Patel12563b32010-04-16 23:33:45 +00002329 break;
2330 }
Devang Patel9fc11702010-05-25 23:40:22 +00002331 case dwarf::DW_AT_location: {
2332 if (UseDotDebugLocEntry.count(Die) != 0) {
2333 DIELabel *L = cast<DIELabel>(Values[i]);
Daniel Dunbarfd95b012011-03-16 22:16:39 +00002334 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
Devang Patel9fc11702010-05-25 23:40:22 +00002335 } else
2336 Values[i]->EmitValue(Asm, Form);
2337 break;
2338 }
Devang Patela1bd5a12010-09-29 19:08:08 +00002339 case dwarf::DW_AT_accessibility: {
2340 if (Asm->isVerbose()) {
2341 DIEInteger *V = cast<DIEInteger>(Values[i]);
2342 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
2343 }
2344 Values[i]->EmitValue(Asm, Form);
2345 break;
2346 }
Bill Wendling480ff322009-05-20 23:21:38 +00002347 default:
2348 // Emit an attribute using the defined form.
Chris Lattner3a383cb2010-04-05 00:13:49 +00002349 Values[i]->EmitValue(Asm, Form);
Bill Wendling480ff322009-05-20 23:21:38 +00002350 break;
2351 }
Bill Wendling480ff322009-05-20 23:21:38 +00002352 }
2353
2354 // Emit the DIE children if any.
2355 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2356 const std::vector<DIE *> &Children = Die->getChildren();
2357
2358 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel930143b2009-11-21 02:48:08 +00002359 emitDIE(Children[j]);
Bill Wendling480ff322009-05-20 23:21:38 +00002360
Chris Lattner7bde8c02010-04-04 18:52:31 +00002361 if (Asm->isVerbose())
Chris Lattner566cae92010-03-09 23:52:58 +00002362 Asm->OutStreamer.AddComment("End Of Children Mark");
2363 Asm->EmitInt8(0);
Bill Wendling480ff322009-05-20 23:21:38 +00002364 }
2365}
2366
Devang Patel9ccfb642009-12-09 18:24:21 +00002367/// emitDebugInfo - Emit the debug info section.
Bill Wendling480ff322009-05-20 23:21:38 +00002368///
Devang Patel9ccfb642009-12-09 18:24:21 +00002369void DwarfDebug::emitDebugInfo() {
2370 // Start debug info section.
2371 Asm->OutStreamer.SwitchSection(
2372 Asm->getObjFileLowering().getDwarfInfoSection());
Devang Patel1a0df9a2010-05-10 22:49:55 +00002373 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2374 E = CUMap.end(); I != E; ++I) {
2375 CompileUnit *TheCU = I->second;
2376 DIE *Die = TheCU->getCUDie();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002377
Devang Patel1a0df9a2010-05-10 22:49:55 +00002378 // Emit the compile units header.
2379 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
2380 TheCU->getID()));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002381
Devang Patel1a0df9a2010-05-10 22:49:55 +00002382 // Emit size of content not including length itself
2383 unsigned ContentSize = Die->getSize() +
2384 sizeof(int16_t) + // DWARF version number
2385 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patele141234942011-04-13 19:41:17 +00002386 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002387
Devang Patel1a0df9a2010-05-10 22:49:55 +00002388 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2389 Asm->EmitInt32(ContentSize);
2390 Asm->OutStreamer.AddComment("DWARF version number");
2391 Asm->EmitInt16(dwarf::DWARF_VERSION);
2392 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2393 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
2394 DwarfAbbrevSectionSym);
2395 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2396 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002397
Devang Patel1a0df9a2010-05-10 22:49:55 +00002398 emitDIE(Die);
Devang Patel1a0df9a2010-05-10 22:49:55 +00002399 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
2400 }
Bill Wendling480ff322009-05-20 23:21:38 +00002401}
2402
Devang Patel930143b2009-11-21 02:48:08 +00002403/// emitAbbreviations - Emit the abbreviation section.
Bill Wendling480ff322009-05-20 23:21:38 +00002404///
Devang Patel930143b2009-11-21 02:48:08 +00002405void DwarfDebug::emitAbbreviations() const {
Bill Wendling480ff322009-05-20 23:21:38 +00002406 // Check to see if it is worth the effort.
2407 if (!Abbreviations.empty()) {
2408 // Start the debug abbrev section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002409 Asm->OutStreamer.SwitchSection(
2410 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002411
Chris Lattnera179b522010-04-04 19:25:43 +00002412 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
Bill Wendling480ff322009-05-20 23:21:38 +00002413
2414 // For each abbrevation.
2415 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2416 // Get abbreviation data
2417 const DIEAbbrev *Abbrev = Abbreviations[i];
2418
2419 // Emit the abbrevations code (base 1 index.)
Chris Lattner9efd1182010-04-04 19:09:29 +00002420 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling480ff322009-05-20 23:21:38 +00002421
2422 // Emit the abbreviations data.
Chris Lattner3a383cb2010-04-05 00:13:49 +00002423 Abbrev->Emit(Asm);
Bill Wendling480ff322009-05-20 23:21:38 +00002424 }
2425
2426 // Mark end of abbreviations.
Chris Lattner9efd1182010-04-04 19:09:29 +00002427 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling480ff322009-05-20 23:21:38 +00002428
Chris Lattnera179b522010-04-04 19:25:43 +00002429 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
Bill Wendling480ff322009-05-20 23:21:38 +00002430 }
2431}
2432
Devang Patel930143b2009-11-21 02:48:08 +00002433/// emitEndOfLineMatrix - Emit the last address of the section and the end of
Bill Wendling480ff322009-05-20 23:21:38 +00002434/// the line matrix.
2435///
Devang Patel930143b2009-11-21 02:48:08 +00002436void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling480ff322009-05-20 23:21:38 +00002437 // Define last address of section.
Chris Lattner566cae92010-03-09 23:52:58 +00002438 Asm->OutStreamer.AddComment("Extended Op");
2439 Asm->EmitInt8(0);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002440
Chris Lattner566cae92010-03-09 23:52:58 +00002441 Asm->OutStreamer.AddComment("Op size");
Chris Lattner3a383cb2010-04-05 00:13:49 +00002442 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
Chris Lattner566cae92010-03-09 23:52:58 +00002443 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2444 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2445
2446 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerb245dfb2010-03-10 01:17:49 +00002447
Chris Lattnera179b522010-04-04 19:25:43 +00002448 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Chris Lattner3a383cb2010-04-05 00:13:49 +00002449 Asm->getTargetData().getPointerSize(),
2450 0/*AddrSpace*/);
Bill Wendling480ff322009-05-20 23:21:38 +00002451
2452 // Mark end of matrix.
Chris Lattner566cae92010-03-09 23:52:58 +00002453 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2454 Asm->EmitInt8(0);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002455 Asm->EmitInt8(1);
Chris Lattnerfa823552010-01-22 23:18:42 +00002456 Asm->EmitInt8(1);
Bill Wendling480ff322009-05-20 23:21:38 +00002457}
2458
Devang Patel9ccfb642009-12-09 18:24:21 +00002459/// emitDebugPubNames - Emit visible names into a debug pubnames section.
2460///
2461void DwarfDebug::emitDebugPubNames() {
Devang Patel1a0df9a2010-05-10 22:49:55 +00002462 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2463 E = CUMap.end(); I != E; ++I) {
2464 CompileUnit *TheCU = I->second;
2465 // Start the dwarf pubnames section.
2466 Asm->OutStreamer.SwitchSection(
2467 Asm->getObjFileLowering().getDwarfPubNamesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002468
Devang Patel1a0df9a2010-05-10 22:49:55 +00002469 Asm->OutStreamer.AddComment("Length of Public Names Info");
2470 Asm->EmitLabelDifference(
2471 Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
2472 Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002473
Devang Patel1a0df9a2010-05-10 22:49:55 +00002474 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
2475 TheCU->getID()));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002476
Devang Patel1a0df9a2010-05-10 22:49:55 +00002477 Asm->OutStreamer.AddComment("DWARF Version");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002478 Asm->EmitInt16(dwarf::DWARF_VERSION);
2479
Devang Patel1a0df9a2010-05-10 22:49:55 +00002480 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002481 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
Devang Patel1a0df9a2010-05-10 22:49:55 +00002482 DwarfInfoSectionSym);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002483
Devang Patel1a0df9a2010-05-10 22:49:55 +00002484 Asm->OutStreamer.AddComment("Compilation Unit Length");
2485 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
2486 Asm->GetTempSymbol("info_begin", TheCU->getID()),
2487 4);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002488
Devang Patel1a0df9a2010-05-10 22:49:55 +00002489 const StringMap<DIE*> &Globals = TheCU->getGlobals();
2490 for (StringMap<DIE*>::const_iterator
2491 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2492 const char *Name = GI->getKeyData();
2493 DIE *Entity = GI->second;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002494
Devang Patel1a0df9a2010-05-10 22:49:55 +00002495 Asm->OutStreamer.AddComment("DIE offset");
2496 Asm->EmitInt32(Entity->getOffset());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002497
Devang Patel1a0df9a2010-05-10 22:49:55 +00002498 if (Asm->isVerbose())
2499 Asm->OutStreamer.AddComment("External Name");
2500 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2501 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002502
Devang Patel1a0df9a2010-05-10 22:49:55 +00002503 Asm->OutStreamer.AddComment("End Mark");
2504 Asm->EmitInt32(0);
2505 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
Nick Lewycky019d2552011-07-29 03:49:23 +00002506 TheCU->getID()));
Bill Wendling480ff322009-05-20 23:21:38 +00002507 }
Bill Wendling480ff322009-05-20 23:21:38 +00002508}
2509
Devang Patel04d2f2d2009-11-24 01:14:22 +00002510void DwarfDebug::emitDebugPubTypes() {
Devang Patel1a0df9a2010-05-10 22:49:55 +00002511 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2512 E = CUMap.end(); I != E; ++I) {
2513 CompileUnit *TheCU = I->second;
2514 // Start the dwarf pubnames section.
2515 Asm->OutStreamer.SwitchSection(
2516 Asm->getObjFileLowering().getDwarfPubTypesSection());
2517 Asm->OutStreamer.AddComment("Length of Public Types Info");
2518 Asm->EmitLabelDifference(
2519 Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
2520 Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002521
Devang Patel1a0df9a2010-05-10 22:49:55 +00002522 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
2523 TheCU->getID()));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002524
Devang Patel1a0df9a2010-05-10 22:49:55 +00002525 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2526 Asm->EmitInt16(dwarf::DWARF_VERSION);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002527
Devang Patel1a0df9a2010-05-10 22:49:55 +00002528 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2529 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
2530 DwarfInfoSectionSym);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002531
Devang Patel1a0df9a2010-05-10 22:49:55 +00002532 Asm->OutStreamer.AddComment("Compilation Unit Length");
2533 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
2534 Asm->GetTempSymbol("info_begin", TheCU->getID()),
2535 4);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002536
Devang Patel1a0df9a2010-05-10 22:49:55 +00002537 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2538 for (StringMap<DIE*>::const_iterator
2539 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2540 const char *Name = GI->getKeyData();
Nick Lewycky019d2552011-07-29 03:49:23 +00002541 DIE *Entity = GI->second;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002542
Devang Patel1a0df9a2010-05-10 22:49:55 +00002543 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2544 Asm->EmitInt32(Entity->getOffset());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002545
Devang Patel1a0df9a2010-05-10 22:49:55 +00002546 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
2547 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2548 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002549
Devang Patel1a0df9a2010-05-10 22:49:55 +00002550 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002551 Asm->EmitInt32(0);
Devang Patel1a0df9a2010-05-10 22:49:55 +00002552 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
2553 TheCU->getID()));
Devang Patel04d2f2d2009-11-24 01:14:22 +00002554 }
Devang Patel04d2f2d2009-11-24 01:14:22 +00002555}
2556
Devang Patel930143b2009-11-21 02:48:08 +00002557/// emitDebugStr - Emit visible names into a debug str section.
Bill Wendling480ff322009-05-20 23:21:38 +00002558///
Devang Patel930143b2009-11-21 02:48:08 +00002559void DwarfDebug::emitDebugStr() {
Bill Wendling480ff322009-05-20 23:21:38 +00002560 // Check to see if it is worth the effort.
Chris Lattner3d72a672010-03-09 23:38:23 +00002561 if (StringPool.empty()) return;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002562
Chris Lattner3d72a672010-03-09 23:38:23 +00002563 // Start the dwarf str section.
2564 Asm->OutStreamer.SwitchSection(
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002565 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002566
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002567 // Get all of the string pool entries and put them in an array by their ID so
2568 // we can sort them.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002569 SmallVector<std::pair<unsigned,
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002570 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002571
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002572 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2573 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
2574 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002575
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002576 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002577
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002578 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner3d72a672010-03-09 23:38:23 +00002579 // Emit a label for reference from debug information entries.
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002580 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002581
Chris Lattner3d72a672010-03-09 23:38:23 +00002582 // Emit the string itself.
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002583 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
Bill Wendling480ff322009-05-20 23:21:38 +00002584 }
2585}
2586
Devang Patel930143b2009-11-21 02:48:08 +00002587/// emitDebugLoc - Emit visible names into a debug loc section.
Bill Wendling480ff322009-05-20 23:21:38 +00002588///
Devang Patel930143b2009-11-21 02:48:08 +00002589void DwarfDebug::emitDebugLoc() {
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002590 if (DotDebugLocEntries.empty())
2591 return;
2592
Devang Patel116a9d72011-02-04 22:57:18 +00002593 for (SmallVector<DotDebugLocEntry, 4>::iterator
2594 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2595 I != E; ++I) {
2596 DotDebugLocEntry &Entry = *I;
2597 if (I + 1 != DotDebugLocEntries.end())
2598 Entry.Merge(I+1);
2599 }
2600
Daniel Dunbarfd95b012011-03-16 22:16:39 +00002601 // Start the dwarf loc section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002602 Asm->OutStreamer.SwitchSection(
Devang Patel9fc11702010-05-25 23:40:22 +00002603 Asm->getObjFileLowering().getDwarfLocSection());
2604 unsigned char Size = Asm->getTargetData().getPointerSize();
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002605 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2606 unsigned index = 1;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002607 for (SmallVector<DotDebugLocEntry, 4>::iterator
2608 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel30265c42010-07-07 20:12:52 +00002609 I != E; ++I, ++index) {
Devang Patel116a9d72011-02-04 22:57:18 +00002610 DotDebugLocEntry &Entry = *I;
2611 if (Entry.isMerged()) continue;
Devang Patel9fc11702010-05-25 23:40:22 +00002612 if (Entry.isEmpty()) {
2613 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2614 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002615 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patel9fc11702010-05-25 23:40:22 +00002616 } else {
2617 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
2618 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
Devang Patel3e021532011-04-28 02:22:40 +00002619 DIVariable DV(Entry.Variable);
Rafael Espindolad23bfb82011-05-27 22:05:41 +00002620 Asm->OutStreamer.AddComment("Loc expr size");
2621 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2622 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2623 Asm->EmitLabelDifference(end, begin, 2);
2624 Asm->OutStreamer.EmitLabel(begin);
Devang Pateled9fd452011-07-08 16:49:43 +00002625 if (Entry.isInt()) {
Devang Patel324f8432011-06-01 22:03:25 +00002626 DIBasicType BTy(DV.getType());
2627 if (BTy.Verify() &&
2628 (BTy.getEncoding() == dwarf::DW_ATE_signed
2629 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2630 Asm->OutStreamer.AddComment("DW_OP_consts");
2631 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Pateled9fd452011-07-08 16:49:43 +00002632 Asm->EmitSLEB128(Entry.getInt());
Devang Patel324f8432011-06-01 22:03:25 +00002633 } else {
2634 Asm->OutStreamer.AddComment("DW_OP_constu");
2635 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Pateled9fd452011-07-08 16:49:43 +00002636 Asm->EmitULEB128(Entry.getInt());
Devang Patel324f8432011-06-01 22:03:25 +00002637 }
Devang Pateled9fd452011-07-08 16:49:43 +00002638 } else if (Entry.isLocation()) {
2639 if (!DV.hasComplexAddress())
2640 // Regular entry.
Devang Patel3e021532011-04-28 02:22:40 +00002641 Asm->EmitDwarfRegOp(Entry.Loc);
Devang Pateled9fd452011-07-08 16:49:43 +00002642 else {
2643 // Complex address entry.
2644 unsigned N = DV.getNumAddrElements();
2645 unsigned i = 0;
2646 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2647 if (Entry.Loc.getOffset()) {
2648 i = 2;
2649 Asm->EmitDwarfRegOp(Entry.Loc);
2650 Asm->OutStreamer.AddComment("DW_OP_deref");
2651 Asm->EmitInt8(dwarf::DW_OP_deref);
2652 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2653 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2654 Asm->EmitSLEB128(DV.getAddrElement(1));
2655 } else {
2656 // If first address element is OpPlus then emit
2657 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2658 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2659 Asm->EmitDwarfRegOp(Loc);
2660 i = 2;
2661 }
2662 } else {
2663 Asm->EmitDwarfRegOp(Entry.Loc);
2664 }
2665
2666 // Emit remaining complex address elements.
2667 for (; i < N; ++i) {
2668 uint64_t Element = DV.getAddrElement(i);
2669 if (Element == DIBuilder::OpPlus) {
2670 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2671 Asm->EmitULEB128(DV.getAddrElement(++i));
2672 } else if (Element == DIBuilder::OpDeref)
2673 Asm->EmitInt8(dwarf::DW_OP_deref);
2674 else llvm_unreachable("unknown Opcode found in complex address");
2675 }
Devang Patel3e021532011-04-28 02:22:40 +00002676 }
Devang Patel3e021532011-04-28 02:22:40 +00002677 }
Devang Pateled9fd452011-07-08 16:49:43 +00002678 // else ... ignore constant fp. There is not any good way to
2679 // to represent them here in dwarf.
Rafael Espindolad23bfb82011-05-27 22:05:41 +00002680 Asm->OutStreamer.EmitLabel(end);
Devang Patel9fc11702010-05-25 23:40:22 +00002681 }
2682 }
Bill Wendling480ff322009-05-20 23:21:38 +00002683}
2684
2685/// EmitDebugARanges - Emit visible names into a debug aranges section.
2686///
2687void DwarfDebug::EmitDebugARanges() {
2688 // Start the dwarf aranges section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002689 Asm->OutStreamer.SwitchSection(
2690 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002691}
2692
Devang Patel930143b2009-11-21 02:48:08 +00002693/// emitDebugRanges - Emit visible names into a debug ranges section.
Bill Wendling480ff322009-05-20 23:21:38 +00002694///
Devang Patel930143b2009-11-21 02:48:08 +00002695void DwarfDebug::emitDebugRanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002696 // Start the dwarf ranges section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002697 Asm->OutStreamer.SwitchSection(
Devang Patel12563b32010-04-16 23:33:45 +00002698 Asm->getObjFileLowering().getDwarfRangesSection());
Devang Patel6c74a872010-04-27 19:46:33 +00002699 unsigned char Size = Asm->getTargetData().getPointerSize();
2700 for (SmallVector<const MCSymbol *, 8>::iterator
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002701 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Patel6c74a872010-04-27 19:46:33 +00002702 I != E; ++I) {
2703 if (*I)
2704 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
Devang Patel12563b32010-04-16 23:33:45 +00002705 else
Devang Patel6c74a872010-04-27 19:46:33 +00002706 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patel12563b32010-04-16 23:33:45 +00002707 }
Bill Wendling480ff322009-05-20 23:21:38 +00002708}
2709
Devang Patel930143b2009-11-21 02:48:08 +00002710/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
Bill Wendling480ff322009-05-20 23:21:38 +00002711///
Devang Patel930143b2009-11-21 02:48:08 +00002712void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00002713 if (const MCSection *LineInfo =
Chris Lattner1472cf52009-08-02 07:24:22 +00002714 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling480ff322009-05-20 23:21:38 +00002715 // Start the dwarf macinfo section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002716 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling480ff322009-05-20 23:21:38 +00002717 }
2718}
2719
Devang Patel930143b2009-11-21 02:48:08 +00002720/// emitDebugInlineInfo - Emit inline info using following format.
Bill Wendling480ff322009-05-20 23:21:38 +00002721/// Section Header:
2722/// 1. length of section
2723/// 2. Dwarf version number
2724/// 3. address size.
2725///
2726/// Entries (one "entry" for each function that was inlined):
2727///
2728/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2729/// otherwise offset into __debug_str for regular function name.
2730/// 2. offset into __debug_str section for regular function name.
2731/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2732/// instances for the function.
2733///
2734/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2735/// inlined instance; the die_offset points to the inlined_subroutine die in the
2736/// __debug_info section, and the low_pc is the starting address for the
2737/// inlining instance.
Devang Patel930143b2009-11-21 02:48:08 +00002738void DwarfDebug::emitDebugInlineInfo() {
Chris Lattner3a383cb2010-04-05 00:13:49 +00002739 if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling480ff322009-05-20 23:21:38 +00002740 return;
2741
Devang Patel1a0df9a2010-05-10 22:49:55 +00002742 if (!FirstCU)
Bill Wendling480ff322009-05-20 23:21:38 +00002743 return;
2744
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002745 Asm->OutStreamer.SwitchSection(
2746 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002747
Chris Lattner566cae92010-03-09 23:52:58 +00002748 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnerf1429f12010-04-04 19:58:12 +00002749 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2750 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling480ff322009-05-20 23:21:38 +00002751
Chris Lattnera179b522010-04-04 19:25:43 +00002752 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling480ff322009-05-20 23:21:38 +00002753
Chris Lattner566cae92010-03-09 23:52:58 +00002754 Asm->OutStreamer.AddComment("Dwarf Version");
2755 Asm->EmitInt16(dwarf::DWARF_VERSION);
2756 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chris Lattner3a383cb2010-04-05 00:13:49 +00002757 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00002758
Devang Patel32cc43c2010-05-07 20:54:48 +00002759 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002760 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach042483e2009-11-21 23:12:12 +00002761
Devang Patel32cc43c2010-05-07 20:54:48 +00002762 const MDNode *Node = *I;
2763 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach00e9c612009-11-22 19:20:36 +00002764 = InlineInfo.find(Node);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002765 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patel80ae3492009-08-28 23:24:31 +00002766 DISubprogram SP(Node);
Devang Patel2d9caf92009-11-25 17:36:49 +00002767 StringRef LName = SP.getLinkageName();
2768 StringRef Name = SP.getName();
Bill Wendling480ff322009-05-20 23:21:38 +00002769
Chris Lattner566cae92010-03-09 23:52:58 +00002770 Asm->OutStreamer.AddComment("MIPS linkage name");
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002771 if (LName.empty()) {
2772 Asm->OutStreamer.EmitBytes(Name, 0);
2773 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002774 } else
Chris Lattner70a4fce2010-04-04 23:25:33 +00002775 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
2776 DwarfStrSectionSym);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002777
Chris Lattner566cae92010-03-09 23:52:58 +00002778 Asm->OutStreamer.AddComment("Function name");
Chris Lattner70a4fce2010-04-04 23:25:33 +00002779 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
Chris Lattner9efd1182010-04-04 19:09:29 +00002780 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling480ff322009-05-20 23:21:38 +00002781
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002782 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling480ff322009-05-20 23:21:38 +00002783 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner7bde8c02010-04-04 18:52:31 +00002784 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner085b6522010-03-09 00:31:02 +00002785 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling480ff322009-05-20 23:21:38 +00002786
Chris Lattner7bde8c02010-04-04 18:52:31 +00002787 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattner3a383cb2010-04-05 00:13:49 +00002788 Asm->OutStreamer.EmitSymbolValue(LI->first,
2789 Asm->getTargetData().getPointerSize(),0);
Bill Wendling480ff322009-05-20 23:21:38 +00002790 }
2791 }
2792
Chris Lattnera179b522010-04-04 19:25:43 +00002793 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling480ff322009-05-20 23:21:38 +00002794}