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