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