blob: a8936bad2be2a358da8edddab570b303ee7270c3 [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
Eric Christopher29e874d2014-03-07 22:40:37 +000014#include "ByteStreamer.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000015#include "DwarfDebug.h"
Chris Lattner3f3fb972010-04-05 05:24:55 +000016#include "DIE.h"
Eric Christopher45731982013-08-08 23:45:55 +000017#include "DIEHash.h"
David Blaikie2c86a722013-12-02 19:33:15 +000018#include "DwarfUnit.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000019#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/Statistic.h"
21#include "llvm/ADT/StringExtras.h"
22#include "llvm/ADT/Triple.h"
David Greene829b3e82009-08-19 21:52:55 +000023#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000024#include "llvm/CodeGen/MachineModuleInfo.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000025#include "llvm/IR/Constants.h"
Chandler Carruth12664a02014-03-06 00:22:06 +000026#include "llvm/IR/DIBuilder.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000027#include "llvm/IR/DataLayout.h"
Chandler Carruth9a4c9e52014-03-06 00:46:21 +000028#include "llvm/IR/DebugInfo.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000029#include "llvm/IR/Instructions.h"
30#include "llvm/IR/Module.h"
Chandler Carruth4220e9c2014-03-04 11:17:44 +000031#include "llvm/IR/ValueHandle.h"
Chris Lattnere13c3722010-03-09 01:58:53 +000032#include "llvm/MC/MCAsmInfo.h"
Chris Lattner4d2c0f92009-07-31 18:48:30 +000033#include "llvm/MC/MCSection.h"
Chris Lattner4b7dadb2009-08-19 05:49:37 +000034#include "llvm/MC/MCStreamer.h"
Chris Lattnere13c3722010-03-09 01:58:53 +000035#include "llvm/MC/MCSymbol.h"
Devang Patel6c74a872010-04-27 19:46:33 +000036#include "llvm/Support/CommandLine.h"
Daniel Dunbarcdf01b52009-10-13 06:47:08 +000037#include "llvm/Support/Debug.h"
David Majnemered89b5c2013-08-21 06:13:34 +000038#include "llvm/Support/Dwarf.h"
Daniel Dunbarcdf01b52009-10-13 06:47:08 +000039#include "llvm/Support/ErrorHandling.h"
Chris Lattnerf5c834f2010-01-22 22:09:00 +000040#include "llvm/Support/FormattedStream.h"
Logan Chien5b776b72014-02-22 14:00:39 +000041#include "llvm/Support/LEB128.h"
Eric Christopher67646432013-07-26 17:02:41 +000042#include "llvm/Support/MD5.h"
Michael J. Spencer447762d2010-11-29 18:16:10 +000043#include "llvm/Support/Path.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000044#include "llvm/Support/Timer.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000045#include "llvm/Target/TargetFrameLowering.h"
46#include "llvm/Target/TargetLoweringObjectFile.h"
47#include "llvm/Target/TargetMachine.h"
48#include "llvm/Target/TargetOptions.h"
49#include "llvm/Target/TargetRegisterInfo.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000050using namespace llvm;
51
Chandler Carruth1b9dde02014-04-22 02:02:50 +000052#define DEBUG_TYPE "dwarfdebug"
53
Eric Christopher7f2b5512013-07-23 22:16:41 +000054static cl::opt<bool>
55DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden,
56 cl::desc("Disable debug info printing"));
Devang Patel6c74a872010-04-27 19:46:33 +000057
Eric Christopher7f2b5512013-07-23 22:16:41 +000058static cl::opt<bool> UnknownLocations(
59 "use-unknown-locations", cl::Hidden,
60 cl::desc("Make an absence of debug location information explicit."),
61 cl::init(false));
Dan Gohman7421ae42010-05-07 01:08:53 +000062
Eric Christopherdd1a0122013-09-13 00:35:05 +000063static cl::opt<bool>
64GenerateGnuPubSections("generate-gnu-dwarf-pub-sections", cl::Hidden,
65 cl::desc("Generate GNU-style pubnames and pubtypes"),
66 cl::init(false));
67
Eric Christopher02dbadb2014-02-14 01:26:55 +000068static cl::opt<bool> GenerateARangeSection("generate-arange-section",
69 cl::Hidden,
70 cl::desc("Generate dwarf aranges"),
71 cl::init(false));
72
Eric Christopher20b76a72012-08-23 22:36:40 +000073namespace {
Eric Christopherf07ee3a2014-01-27 23:50:03 +000074enum DefaultOnOff { Default, Enable, Disable };
Eric Christopher20b76a72012-08-23 22:36:40 +000075}
Eric Christopher4996c702011-11-07 09:24:32 +000076
Eric Christopher7f2b5512013-07-23 22:16:41 +000077static cl::opt<DefaultOnOff>
78DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
79 cl::desc("Output prototype dwarf accelerator tables."),
80 cl::values(clEnumVal(Default, "Default for platform"),
81 clEnumVal(Enable, "Enabled"),
82 clEnumVal(Disable, "Disabled"), clEnumValEnd),
83 cl::init(Default));
Eric Christopher20b76a72012-08-23 22:36:40 +000084
Eric Christopher7f2b5512013-07-23 22:16:41 +000085static cl::opt<DefaultOnOff>
Eric Christopher7f2b5512013-07-23 22:16:41 +000086SplitDwarf("split-dwarf", cl::Hidden,
Eric Christopher5d008fe2013-12-04 23:24:28 +000087 cl::desc("Output DWARF5 split debug info."),
Eric Christopher7f2b5512013-07-23 22:16:41 +000088 cl::values(clEnumVal(Default, "Default for platform"),
89 clEnumVal(Enable, "Enabled"),
90 clEnumVal(Disable, "Disabled"), clEnumValEnd),
91 cl::init(Default));
Eric Christopher29424312012-11-12 22:22:20 +000092
Eric Christopher7da24882013-08-19 21:07:38 +000093static cl::opt<DefaultOnOff>
Eric Christopher4d36ca02013-08-26 23:24:35 +000094DwarfPubSections("generate-dwarf-pub-sections", cl::Hidden,
95 cl::desc("Generate DWARF pubnames and pubtypes sections"),
96 cl::values(clEnumVal(Default, "Default for platform"),
97 clEnumVal(Enable, "Enabled"),
98 clEnumVal(Disable, "Disabled"), clEnumValEnd),
99 cl::init(Default));
Eric Christopher7da24882013-08-19 21:07:38 +0000100
Eric Christopher33ff6972013-11-21 23:46:41 +0000101static cl::opt<unsigned>
102DwarfVersionNumber("dwarf-version", cl::Hidden,
Eric Christophera5a79422013-12-09 23:32:48 +0000103 cl::desc("Generate DWARF for dwarf version."), cl::init(0));
Eric Christopher33ff6972013-11-21 23:46:41 +0000104
Benjamin Kramerb12cf012013-08-24 12:54:27 +0000105static const char *const DWARFGroupName = "DWARF Emission";
106static const char *const DbgTimerName = "DWARF Debug Writer";
Bill Wendlingfcc14142010-04-07 09:28:04 +0000107
Bill Wendling2f921f82009-05-15 09:23:25 +0000108//===----------------------------------------------------------------------===//
109
Manman Renbe5576f2013-10-08 19:07:44 +0000110/// resolve - Look in the DwarfDebug map for the MDNode that
111/// corresponds to the reference.
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000112template <typename T> T DbgVariable::resolve(DIRef<T> Ref) const {
Manman Renbe5576f2013-10-08 19:07:44 +0000113 return DD->resolve(Ref);
114}
115
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000116bool DbgVariable::isBlockByrefVariable() const {
117 assert(Var.isVariable() && "Invalid complex DbgVariable!");
118 return Var.isBlockByrefVariable(DD->getTypeIdentifierMap());
119}
120
121
Nick Lewycky019d2552011-07-29 03:49:23 +0000122DIType DbgVariable::getType() const {
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000123 DIType Ty = Var.getType().resolve(DD->getTypeIdentifierMap());
Devang Patelf20c4f72011-04-12 22:53:02 +0000124 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
125 // addresses instead.
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000126 if (Var.isBlockByrefVariable(DD->getTypeIdentifierMap())) {
Devang Patelf20c4f72011-04-12 22:53:02 +0000127 /* Byref variables, in Blocks, are declared by the programmer as
128 "SomeType VarName;", but the compiler creates a
129 __Block_byref_x_VarName struct, and gives the variable VarName
130 either the struct, or a pointer to the struct, as its type. This
131 is necessary for various behind-the-scenes things the compiler
132 needs to do with by-reference variables in blocks.
Eric Christopher6a841382012-11-19 22:42:10 +0000133
Devang Patelf20c4f72011-04-12 22:53:02 +0000134 However, as far as the original *programmer* is concerned, the
135 variable should still have type 'SomeType', as originally declared.
Eric Christopher6a841382012-11-19 22:42:10 +0000136
Devang Patelf20c4f72011-04-12 22:53:02 +0000137 The following function dives into the __Block_byref_x_VarName
138 struct to find the original type of the variable. This will be
139 passed back to the code generating the type for the Debug
140 Information Entry for the variable 'VarName'. 'VarName' will then
141 have the original type 'SomeType' in its debug information.
Eric Christopher6a841382012-11-19 22:42:10 +0000142
Devang Patelf20c4f72011-04-12 22:53:02 +0000143 The original type 'SomeType' will be the type of the field named
144 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher6a841382012-11-19 22:42:10 +0000145
Devang Patelf20c4f72011-04-12 22:53:02 +0000146 NOTE: In order for this to not completely fail on the debugger
147 side, the Debug Information Entry for the variable VarName needs to
148 have a DW_AT_location that tells the debugger how to unwind through
149 the pointers and __Block_byref_x_VarName struct to find the actual
150 value of the variable. The function addBlockByrefType does this. */
151 DIType subType = Ty;
Eric Christopher31b05762013-08-08 01:41:00 +0000152 uint16_t tag = Ty.getTag();
Eric Christopher6a841382012-11-19 22:42:10 +0000153
Eric Christopher9adc55f2013-09-04 19:53:21 +0000154 if (tag == dwarf::DW_TAG_pointer_type)
Manman Renbe5576f2013-10-08 19:07:44 +0000155 subType = resolve(DIDerivedType(Ty).getTypeDerivedFrom());
Eric Christopher6a841382012-11-19 22:42:10 +0000156
Eric Christopher9adc55f2013-09-04 19:53:21 +0000157 DIArray Elements = DICompositeType(subType).getTypeArray();
Devang Patelf20c4f72011-04-12 22:53:02 +0000158 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
David Blaikie5af2aca2013-11-18 23:57:26 +0000159 DIDerivedType DT(Elements.getElement(i));
Devang Patelf20c4f72011-04-12 22:53:02 +0000160 if (getName() == DT.getName())
Manman Renbe5576f2013-10-08 19:07:44 +0000161 return (resolve(DT.getTypeDerivedFrom()));
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000162 }
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000163 }
Devang Patelf20c4f72011-04-12 22:53:02 +0000164 return Ty;
165}
Bill Wendling2f921f82009-05-15 09:23:25 +0000166
David Blaikie18d33752014-04-24 01:23:49 +0000167static LLVM_CONSTEXPR DwarfAccelTable::Atom TypeAtoms[] = {
168 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4),
169 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag, dwarf::DW_FORM_data2),
170 DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags, dwarf::DW_FORM_data1)};
171
Chris Lattnerf0d6bd32010-04-05 05:11:15 +0000172DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Craig Topper353eda42014-04-24 06:44:33 +0000173 : Asm(A), MMI(Asm->MMI), FirstCU(nullptr), PrevLabel(nullptr),
174 GlobalRangeCount(0), InfoHolder(A, "info_string", DIEValueAllocator),
Eric Christopher2037caf2014-01-28 00:49:26 +0000175 UsedNonDefaultText(false),
David Blaikie2406a0622014-04-23 23:37:35 +0000176 SkeletonHolder(A, "skel_string", DIEValueAllocator),
177 AccelNames(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
David Blaikie0ee82b92014-04-24 00:53:32 +0000178 dwarf::DW_FORM_data4)),
179 AccelObjC(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
David Blaikieecf04152014-04-24 01:02:42 +0000180 dwarf::DW_FORM_data4)),
181 AccelNamespace(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
David Blaikie18d33752014-04-24 01:23:49 +0000182 dwarf::DW_FORM_data4)),
183 AccelTypes(TypeAtoms) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000184
Craig Topper353eda42014-04-24 06:44:33 +0000185 DwarfInfoSectionSym = DwarfAbbrevSectionSym = DwarfStrSectionSym = nullptr;
186 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = nullptr;
187 DwarfLineSectionSym = nullptr;
188 DwarfAddrSectionSym = nullptr;
189 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = nullptr;
190 FunctionBeginSym = FunctionEndSym = nullptr;
191 CurFn = nullptr;
192 CurMI = nullptr;
Eric Christopherad9fe892012-04-02 17:58:52 +0000193
Adrian Prantl5bf1d002013-10-15 20:26:37 +0000194 // Turn on accelerator tables for Darwin by default, pubnames by
195 // default for non-Darwin, and handle split dwarf.
Eric Christopher203e12b2013-04-27 01:07:52 +0000196 bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin();
Eric Christopher4977f212012-08-23 22:36:36 +0000197
Eric Christopher574b5c82013-08-19 21:41:38 +0000198 if (DwarfAccelTables == Default)
199 HasDwarfAccelTables = IsDarwin;
200 else
Eric Christopher5297df02013-08-26 20:58:35 +0000201 HasDwarfAccelTables = DwarfAccelTables == Enable;
Eric Christopher20b76a72012-08-23 22:36:40 +0000202
Eric Christophercdf218d2012-12-10 19:51:21 +0000203 if (SplitDwarf == Default)
204 HasSplitDwarf = false;
Eric Christopher29424312012-11-12 22:22:20 +0000205 else
Eric Christopher574b5c82013-08-19 21:41:38 +0000206 HasSplitDwarf = SplitDwarf == Enable;
Eric Christopher29424312012-11-12 22:22:20 +0000207
Eric Christopher4d36ca02013-08-26 23:24:35 +0000208 if (DwarfPubSections == Default)
209 HasDwarfPubSections = !IsDarwin;
Eric Christopher574b5c82013-08-19 21:41:38 +0000210 else
Eric Christopher4d36ca02013-08-26 23:24:35 +0000211 HasDwarfPubSections = DwarfPubSections == Enable;
Eric Christopher7da24882013-08-19 21:07:38 +0000212
Eric Christopher942f22c2014-01-11 00:28:12 +0000213 DwarfVersion = DwarfVersionNumber
214 ? DwarfVersionNumber
Diego Novillo0915c042014-04-17 22:33:50 +0000215 : MMI->getModule()->getDwarfVersion();
Manman Renac8062b2013-07-02 23:40:10 +0000216
Dan Gohman6e681a52010-06-18 15:56:31 +0000217 {
218 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopher58f41952012-11-19 22:42:15 +0000219 beginModule();
Torok Edwinf8dba242010-04-07 10:44:46 +0000220 }
Bill Wendling2f921f82009-05-15 09:23:25 +0000221}
Bill Wendling2f921f82009-05-15 09:23:25 +0000222
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000223// Switch to the specified MCSection and emit an assembler
224// temporary label to it if SymbolStem is specified.
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000225static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Craig Topper353eda42014-04-24 06:44:33 +0000226 const char *SymbolStem = nullptr) {
Eric Christophera7b61892011-11-07 09:18:38 +0000227 Asm->OutStreamer.SwitchSection(Section);
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000228 if (!SymbolStem)
Craig Topper353eda42014-04-24 06:44:33 +0000229 return nullptr;
Eric Christophera7b61892011-11-07 09:18:38 +0000230
231 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
232 Asm->OutStreamer.EmitLabel(TmpSym);
233 return TmpSym;
234}
235
Eric Christopherd9843b32011-11-10 19:25:34 +0000236static bool isObjCClass(StringRef Name) {
237 return Name.startswith("+") || Name.startswith("-");
238}
239
240static bool hasObjCCategory(StringRef Name) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000241 if (!isObjCClass(Name))
242 return false;
Eric Christopherd9843b32011-11-10 19:25:34 +0000243
Benjamin Kramer260de742013-08-24 12:15:54 +0000244 return Name.find(") ") != StringRef::npos;
Eric Christopherd9843b32011-11-10 19:25:34 +0000245}
246
247static void getObjCClassCategory(StringRef In, StringRef &Class,
248 StringRef &Category) {
249 if (!hasObjCCategory(In)) {
250 Class = In.slice(In.find('[') + 1, In.find(' '));
251 Category = "";
252 return;
253 }
254
255 Class = In.slice(In.find('[') + 1, In.find('('));
256 Category = In.slice(In.find('[') + 1, In.find(' '));
257 return;
258}
259
260static StringRef getObjCMethodName(StringRef In) {
261 return In.slice(In.find(' ') + 1, In.find(']'));
262}
263
Richard Mittonc2508242013-10-03 22:07:08 +0000264// Helper for sorting sections into a stable output order.
265static bool SectionSort(const MCSection *A, const MCSection *B) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000266 std::string LA = (A ? A->getLabelBeginName() : "");
267 std::string LB = (B ? B->getLabelBeginName() : "");
268 return LA < LB;
Richard Mittonc2508242013-10-03 22:07:08 +0000269}
270
Eric Christopherd9843b32011-11-10 19:25:34 +0000271// Add the various names to the Dwarf accelerator table names.
Eric Christopher9cd26af2013-09-20 23:22:52 +0000272// TODO: Determine whether or not we should add names for programs
273// that do not have a DW_AT_name or DW_AT_linkage_name field - this
274// is only slightly different than the lookup of non-standard ObjC names.
David Blaikie31f29002014-04-24 01:25:10 +0000275void DwarfDebug::addSubprogramNames(DISubprogram SP, DIE *Die) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000276 if (!SP.isDefinition())
277 return;
David Blaikie2406a0622014-04-23 23:37:35 +0000278 addAccelName(SP.getName(), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000279
280 // If the linkage name is different than the name, go ahead and output
281 // that as well into the name table.
282 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
David Blaikie2406a0622014-04-23 23:37:35 +0000283 addAccelName(SP.getLinkageName(), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000284
285 // If this is an Objective-C selector name add it to the ObjC accelerator
286 // too.
287 if (isObjCClass(SP.getName())) {
288 StringRef Class, Category;
289 getObjCClassCategory(SP.getName(), Class, Category);
David Blaikie0ee82b92014-04-24 00:53:32 +0000290 addAccelObjC(Class, Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000291 if (Category != "")
David Blaikie0ee82b92014-04-24 00:53:32 +0000292 addAccelObjC(Category, Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000293 // Also add the base method name to the name table.
David Blaikie2406a0622014-04-23 23:37:35 +0000294 addAccelName(getObjCMethodName(SP.getName()), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000295 }
296}
297
Manman Ren3eb9dff2013-09-09 19:05:21 +0000298/// isSubprogramContext - Return true if Context is either a subprogram
299/// or another context nested inside a subprogram.
300bool DwarfDebug::isSubprogramContext(const MDNode *Context) {
301 if (!Context)
302 return false;
303 DIDescriptor D(Context);
304 if (D.isSubprogram())
305 return true;
306 if (D.isType())
Manman Ren116868e2013-09-09 19:47:11 +0000307 return isSubprogramContext(resolve(DIType(Context).getContext()));
Manman Ren3eb9dff2013-09-09 19:05:21 +0000308 return false;
309}
310
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000311// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
312// and DW_AT_high_pc attributes. If there are global variables in this
313// scope then create and insert DIEs for these variables.
David Blaikief9b6a552014-04-22 22:39:41 +0000314DIE *DwarfDebug::updateSubprogramScopeDIE(DwarfCompileUnit &SPCU,
Eric Christopher4287a492013-12-09 23:57:44 +0000315 DISubprogram SP) {
David Blaikief9b6a552014-04-22 22:39:41 +0000316 DIE *SPDie = SPCU.getDIE(SP);
Devang Patela37a95e2010-07-07 22:20:57 +0000317
Chris Lattner3a383cb2010-04-05 00:13:49 +0000318 assert(SPDie && "Unable to find subprogram DIE!");
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000319
Bill Wendlingf720bf62012-11-07 05:19:04 +0000320 // If we're updating an abstract DIE, then we will be adding the children and
321 // object pointer later on. But what we don't want to do is process the
322 // concrete DIE twice.
David Blaikie25bc7192013-11-15 23:13:08 +0000323 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SP)) {
Bill Wendlingf720bf62012-11-07 05:19:04 +0000324 // Pick up abstract subprogram DIE.
David Blaikieadcde362014-04-25 18:35:57 +0000325 SPDie = SPCU.createAndAddDIE(dwarf::DW_TAG_subprogram, SPCU.getUnitDie());
David Blaikie65a74662014-04-25 18:26:14 +0000326 SPCU.addDIEEntry(*SPDie, dwarf::DW_AT_abstract_origin, AbsSPDIE);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000327 } else {
328 DISubprogram SPDecl = SP.getFunctionDeclaration();
329 if (!SPDecl.isSubprogram()) {
330 // There is not any need to generate specification DIE for a function
331 // defined at compile unit level. If a function is defined inside another
332 // function then gdb prefers the definition at top level and but does not
333 // expect specification DIE in parent function. So avoid creating
334 // specification DIE for a function defined inside a function.
Manman Renc50fa112013-10-10 18:40:01 +0000335 DIScope SPContext = resolve(SP.getContext());
336 if (SP.isDefinition() && !SPContext.isCompileUnit() &&
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000337 !SPContext.isFile() && !isSubprogramContext(SPContext)) {
David Blaikie65a74662014-04-25 18:26:14 +0000338 SPCU.addFlag(*SPDie, dwarf::DW_AT_declaration);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000339
340 // Add arguments.
341 DICompositeType SPTy = SP.getType();
342 DIArray Args = SPTy.getTypeArray();
Eric Christopher31b05762013-08-08 01:41:00 +0000343 uint16_t SPTag = SPTy.getTag();
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000344 if (SPTag == dwarf::DW_TAG_subroutine_type)
David Blaikief9b6a552014-04-22 22:39:41 +0000345 SPCU.constructSubprogramArguments(*SPDie, Args);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000346 DIE *SPDeclDie = SPDie;
David Blaikie637cac42014-04-22 23:09:36 +0000347 SPDie =
David Blaikieadcde362014-04-25 18:35:57 +0000348 SPCU.createAndAddDIE(dwarf::DW_TAG_subprogram, SPCU.getUnitDie());
David Blaikie65a74662014-04-25 18:26:14 +0000349 SPCU.addDIEEntry(*SPDie, dwarf::DW_AT_specification, SPDeclDie);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000350 }
351 }
Devang Patela37a95e2010-07-07 22:20:57 +0000352 }
353
David Blaikie65a74662014-04-25 18:26:14 +0000354 attachLowHighPC(SPCU, *SPDie, FunctionBeginSym, FunctionEndSym);
Eric Christopher0f63d062013-12-03 00:45:45 +0000355
Chris Lattner3a383cb2010-04-05 00:13:49 +0000356 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
357 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
David Blaikie65a74662014-04-25 18:26:14 +0000358 SPCU.addAddress(*SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patel6efc8e52010-02-06 01:02:37 +0000359
Eric Christopherd9843b32011-11-10 19:25:34 +0000360 // Add name to the name table, we do this here because we're guaranteed
361 // to have concrete versions of our DW_TAG_subprogram nodes.
David Blaikie31f29002014-04-24 01:25:10 +0000362 addSubprogramNames(SP, SPDie);
Eric Christopher6a841382012-11-19 22:42:10 +0000363
Chris Lattner3a383cb2010-04-05 00:13:49 +0000364 return SPDie;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000365}
366
Manman Ren5b2f4b02013-09-11 19:40:28 +0000367/// Check whether we should create a DIE for the given Scope, return true
368/// if we don't create a DIE (the corresponding DIE is null).
Manman Ren2312ed32013-09-10 18:40:41 +0000369bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
370 if (Scope->isAbstractScope())
371 return false;
372
Manman Ren5b2f4b02013-09-11 19:40:28 +0000373 // We don't create a DIE if there is no Range.
Manman Ren2312ed32013-09-10 18:40:41 +0000374 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
375 if (Ranges.empty())
376 return true;
377
378 if (Ranges.size() > 1)
379 return false;
380
Manman Ren5b2f4b02013-09-11 19:40:28 +0000381 // We don't create a DIE if we have a single Range and the end label
382 // is null.
Manman Ren2312ed32013-09-10 18:40:41 +0000383 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
384 MCSymbol *End = getLabelAfterInsn(RI->second);
385 return !End;
386}
387
David Blaikie65a74662014-04-25 18:26:14 +0000388static void addSectionLabel(AsmPrinter &Asm, DwarfUnit &U, DIE &D,
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000389 dwarf::Attribute A, const MCSymbol *L,
390 const MCSymbol *Sec) {
David Blaikief9b6a552014-04-22 22:39:41 +0000391 if (Asm.MAI->doesDwarfUseRelocationsAcrossSections())
392 U.addSectionLabel(D, A, L);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000393 else
David Blaikief9b6a552014-04-22 22:39:41 +0000394 U.addSectionDelta(D, A, L, Sec);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000395}
396
David Blaikie65a74662014-04-25 18:26:14 +0000397void DwarfDebug::addScopeRangeList(DwarfCompileUnit &TheCU, DIE &ScopeDIE,
Eric Christopherbe2513e2013-12-03 00:45:59 +0000398 const SmallVectorImpl<InsnRange> &Range) {
399 // Emit offset in .debug_range as a relocatable label. emitDIE will handle
400 // emitting it appropriately.
Eric Christopherf8790642013-12-04 22:04:50 +0000401 MCSymbol *RangeSym = Asm->GetTempSymbol("debug_ranges", GlobalRangeCount++);
David Blaikie26b2bd02014-03-24 21:07:27 +0000402
403 // Under fission, ranges are specified by constant offsets relative to the
404 // CU's DW_AT_GNU_ranges_base.
405 if (useSplitDwarf())
David Blaikief9b6a552014-04-22 22:39:41 +0000406 TheCU.addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
David Blaikie637cac42014-04-22 23:09:36 +0000407 DwarfDebugRangeSectionSym);
David Blaikie26b2bd02014-03-24 21:07:27 +0000408 else
David Blaikief9b6a552014-04-22 22:39:41 +0000409 addSectionLabel(*Asm, TheCU, ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
David Blaikie26b2bd02014-03-24 21:07:27 +0000410 DwarfDebugRangeSectionSym);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000411
Eric Christopherf8790642013-12-04 22:04:50 +0000412 RangeSpanList List(RangeSym);
Benjamin Kramer15596c72014-03-07 19:09:39 +0000413 for (const InsnRange &R : Range) {
414 RangeSpan Span(getLabelBeforeInsn(R.first), getLabelAfterInsn(R.second));
Chandler Carruth002da5d2014-03-02 04:08:41 +0000415 List.addRange(std::move(Span));
Eric Christopherbe2513e2013-12-03 00:45:59 +0000416 }
417
418 // Add the range list to the set of ranges to be emitted.
David Blaikief9b6a552014-04-22 22:39:41 +0000419 TheCU.addRangeList(std::move(List));
Eric Christopherbe2513e2013-12-03 00:45:59 +0000420}
421
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000422// Construct new DW_TAG_lexical_block for this scope and attach
423// DW_AT_low_pc/DW_AT_high_pc labels.
David Blaikief9b6a552014-04-22 22:39:41 +0000424DIE *DwarfDebug::constructLexicalScopeDIE(DwarfCompileUnit &TheCU,
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000425 LexicalScope *Scope) {
Manman Ren2312ed32013-09-10 18:40:41 +0000426 if (isLexicalScopeDIENull(Scope))
Craig Topper353eda42014-04-24 06:44:33 +0000427 return nullptr;
Manman Ren2312ed32013-09-10 18:40:41 +0000428
Devang Patel6c74a872010-04-27 19:46:33 +0000429 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
430 if (Scope->isAbstractScope())
431 return ScopeDIE;
432
Eric Christopher0f63d062013-12-03 00:45:45 +0000433 const SmallVectorImpl<InsnRange> &ScopeRanges = Scope->getRanges();
Eric Christopherbe2513e2013-12-03 00:45:59 +0000434
Eric Christopherdc42ea82013-07-03 01:57:28 +0000435 // If we have multiple ranges, emit them into the range section.
Eric Christopher0f63d062013-12-03 00:45:45 +0000436 if (ScopeRanges.size() > 1) {
David Blaikie65a74662014-04-25 18:26:14 +0000437 addScopeRangeList(TheCU, *ScopeDIE, ScopeRanges);
Devang Patel6c74a872010-04-27 19:46:33 +0000438 return ScopeDIE;
439 }
440
Eric Christopherdc42ea82013-07-03 01:57:28 +0000441 // Construct the address range for this DIE.
Eric Christopher0f63d062013-12-03 00:45:45 +0000442 SmallVectorImpl<InsnRange>::const_iterator RI = ScopeRanges.begin();
Eric Christopher962c9082013-01-15 23:56:56 +0000443 MCSymbol *Start = getLabelBeforeInsn(RI->first);
444 MCSymbol *End = getLabelAfterInsn(RI->second);
Manman Ren2312ed32013-09-10 18:40:41 +0000445 assert(End && "End label should not be null!");
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000446
Chris Lattnere13c3722010-03-09 01:58:53 +0000447 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
448 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000449
David Blaikie65a74662014-04-25 18:26:14 +0000450 attachLowHighPC(TheCU, *ScopeDIE, Start, End);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000451
452 return ScopeDIE;
453}
454
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000455// This scope represents inlined body of a function. Construct DIE to
456// represent this concrete inlined copy of the function.
David Blaikief9b6a552014-04-22 22:39:41 +0000457DIE *DwarfDebug::constructInlinedScopeDIE(DwarfCompileUnit &TheCU,
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000458 LexicalScope *Scope) {
Eric Christopher0f63d062013-12-03 00:45:45 +0000459 const SmallVectorImpl<InsnRange> &ScopeRanges = Scope->getRanges();
Eric Christopher1cdb63d2013-12-04 21:20:15 +0000460 assert(!ScopeRanges.empty() &&
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000461 "LexicalScope does not have instruction markers!");
Devang Patel6c74a872010-04-27 19:46:33 +0000462
Devang Patelf098ce22011-07-27 00:34:13 +0000463 if (!Scope->getScopeNode())
Craig Topper353eda42014-04-24 06:44:33 +0000464 return nullptr;
Devang Patelf098ce22011-07-27 00:34:13 +0000465 DIScope DS(Scope->getScopeNode());
466 DISubprogram InlinedSP = getDISubprogram(DS);
David Blaikief9b6a552014-04-22 22:39:41 +0000467 DIE *OriginDIE = TheCU.getDIE(InlinedSP);
Devang Patelf098ce22011-07-27 00:34:13 +0000468 if (!OriginDIE) {
Bill Wendling10e0e2e2012-10-30 17:51:02 +0000469 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Craig Topper353eda42014-04-24 06:44:33 +0000470 return nullptr;
Devang Patelf098ce22011-07-27 00:34:13 +0000471 }
472
Devang Patel73bc1722011-05-05 17:54:26 +0000473 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
David Blaikie65a74662014-04-25 18:26:14 +0000474 TheCU.addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, OriginDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000475
Eric Christopherbe2513e2013-12-03 00:45:59 +0000476 // If we have multiple ranges, emit them into the range section.
477 if (ScopeRanges.size() > 1)
David Blaikie65a74662014-04-25 18:26:14 +0000478 addScopeRangeList(TheCU, *ScopeDIE, ScopeRanges);
Eric Christopherbe2513e2013-12-03 00:45:59 +0000479 else {
Eric Christopher0f63d062013-12-03 00:45:45 +0000480 SmallVectorImpl<InsnRange>::const_iterator RI = ScopeRanges.begin();
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000481 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
482 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
483
Craig Topper353eda42014-04-24 06:44:33 +0000484 if (!StartLabel || !EndLabel)
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000485 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
486
487 assert(StartLabel->isDefined() &&
488 "Invalid starting label for an inlined scope!");
489 assert(EndLabel->isDefined() && "Invalid end label for an inlined scope!");
490
David Blaikie65a74662014-04-25 18:26:14 +0000491 attachLowHighPC(TheCU, *ScopeDIE, StartLabel, EndLabel);
Devang Patelf098ce22011-07-27 00:34:13 +0000492 }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000493
494 InlinedSubprogramDIEs.insert(OriginDIE);
495
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000496 // Add the call site information to the DIE.
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000497 DILocation DL(Scope->getInlinedAt());
David Blaikie65a74662014-04-25 18:26:14 +0000498 TheCU.addUInt(*ScopeDIE, dwarf::DW_AT_call_file, None,
David Blaikie637cac42014-04-22 23:09:36 +0000499 TheCU.getOrCreateSourceID(DL.getFilename(), DL.getDirectory()));
David Blaikie65a74662014-04-25 18:26:14 +0000500 TheCU.addUInt(*ScopeDIE, dwarf::DW_AT_call_line, None, DL.getLineNumber());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000501
Eric Christopher8dda5d02011-12-04 06:02:38 +0000502 // Add name to the name table, we do this here because we're guaranteed
503 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
David Blaikie31f29002014-04-24 01:25:10 +0000504 addSubprogramNames(InlinedSP, ScopeDIE);
Eric Christopher6a841382012-11-19 22:42:10 +0000505
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000506 return ScopeDIE;
507}
508
David Blaikief9b6a552014-04-22 22:39:41 +0000509DIE *DwarfDebug::createScopeChildrenDIE(DwarfCompileUnit &TheCU,
Eric Christopher4287a492013-12-09 23:57:44 +0000510 LexicalScope *Scope,
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000511 SmallVectorImpl<DIE *> &Children) {
Craig Topper353eda42014-04-24 06:44:33 +0000512 DIE *ObjectPointer = nullptr;
Devang Patel6c622ef2011-03-01 22:58:55 +0000513
514 // Collect arguments for current function.
Adrian Prantl3f49c892014-02-25 19:57:42 +0000515 if (LScopes.isCurrentFunctionScope(Scope)) {
David Blaikieafd2c6b2014-04-22 05:41:06 +0000516 for (DbgVariable *ArgDV : CurrentFnArguments)
517 if (ArgDV)
518 if (DIE *Arg =
David Blaikief9b6a552014-04-22 22:39:41 +0000519 TheCU.constructVariableDIE(*ArgDV, Scope->isAbstractScope())) {
David Blaikieafd2c6b2014-04-22 05:41:06 +0000520 Children.push_back(Arg);
521 if (ArgDV->isObjectPointer())
522 ObjectPointer = Arg;
523 }
Devang Patel6c622ef2011-03-01 22:58:55 +0000524
Adrian Prantl69140d22014-02-25 22:27:14 +0000525 // If this is a variadic function, add an unspecified parameter.
Adrian Prantl3f49c892014-02-25 19:57:42 +0000526 DISubprogram SP(Scope->getScopeNode());
Adrian Prantl3f49c892014-02-25 19:57:42 +0000527 DIArray FnArgs = SP.getType().getTypeArray();
Eric Christopher73ffdb82014-02-26 02:50:56 +0000528 if (FnArgs.getElement(FnArgs.getNumElements() - 1)
529 .isUnspecifiedParameter()) {
Adrian Prantl3f49c892014-02-25 19:57:42 +0000530 DIE *Ellipsis = new DIE(dwarf::DW_TAG_unspecified_parameters);
531 Children.push_back(Ellipsis);
532 }
533 }
534
Eric Christopherf84354b2011-10-03 15:49:16 +0000535 // Collect lexical scope children first.
David Blaikieafd2c6b2014-04-22 05:41:06 +0000536 for (DbgVariable *DV : ScopeVariables.lookup(Scope))
David Blaikie637cac42014-04-22 23:09:36 +0000537 if (DIE *Variable =
538 TheCU.constructVariableDIE(*DV, Scope->isAbstractScope())) {
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000539 Children.push_back(Variable);
David Blaikieafd2c6b2014-04-22 05:41:06 +0000540 if (DV->isObjectPointer())
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000541 ObjectPointer = Variable;
Eric Christopherc1c8a1b2012-09-21 22:18:52 +0000542 }
Benjamin Kramer15596c72014-03-07 19:09:39 +0000543 for (LexicalScope *LS : Scope->getChildren())
544 if (DIE *Nested = constructScopeDIE(TheCU, LS))
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000545 Children.push_back(Nested);
Manman Ren2312ed32013-09-10 18:40:41 +0000546 return ObjectPointer;
547}
548
549// Construct a DIE for this scope.
David Blaikief9b6a552014-04-22 22:39:41 +0000550DIE *DwarfDebug::constructScopeDIE(DwarfCompileUnit &TheCU,
Eric Christopher4287a492013-12-09 23:57:44 +0000551 LexicalScope *Scope) {
Manman Ren2312ed32013-09-10 18:40:41 +0000552 if (!Scope || !Scope->getScopeNode())
Craig Topper353eda42014-04-24 06:44:33 +0000553 return nullptr;
Manman Ren2312ed32013-09-10 18:40:41 +0000554
Adrian Prantl78619f72014-03-21 22:16:32 +0000555 DIScope DS(Scope->getScopeNode());
Manman Ren2312ed32013-09-10 18:40:41 +0000556
557 SmallVector<DIE *, 8> Children;
Craig Topper353eda42014-04-24 06:44:33 +0000558 DIE *ObjectPointer = nullptr;
Manman Ren2312ed32013-09-10 18:40:41 +0000559 bool ChildrenCreated = false;
560
Manman Ren5b2f4b02013-09-11 19:40:28 +0000561 // We try to create the scope DIE first, then the children DIEs. This will
562 // avoid creating un-used children then removing them later when we find out
563 // the scope DIE is null.
Craig Topper353eda42014-04-24 06:44:33 +0000564 DIE *ScopeDIE = nullptr;
Devang Patel3b548aa2010-03-08 20:52:55 +0000565 if (Scope->getInlinedAt())
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000566 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3b548aa2010-03-08 20:52:55 +0000567 else if (DS.isSubprogram()) {
Devang Pateld10b2af2010-06-28 20:53:04 +0000568 ProcessedSPNodes.insert(DS);
Devang Patela37a95e2010-07-07 22:20:57 +0000569 if (Scope->isAbstractScope()) {
David Blaikief9b6a552014-04-22 22:39:41 +0000570 ScopeDIE = TheCU.getDIE(DS);
Devang Patela37a95e2010-07-07 22:20:57 +0000571 // Note down abstract DIE.
572 if (ScopeDIE)
573 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
David Blaikiee26a3772013-11-18 23:59:04 +0000574 } else
David Blaikie25bc7192013-11-15 23:13:08 +0000575 ScopeDIE = updateSubprogramScopeDIE(TheCU, DISubprogram(DS));
David Blaikiee26a3772013-11-18 23:59:04 +0000576 } else {
Manman Ren5b2f4b02013-09-11 19:40:28 +0000577 // Early exit when we know the scope DIE is going to be null.
Manman Ren2312ed32013-09-10 18:40:41 +0000578 if (isLexicalScopeDIENull(Scope))
Craig Topper353eda42014-04-24 06:44:33 +0000579 return nullptr;
Manman Ren5b2f4b02013-09-11 19:40:28 +0000580
581 // We create children here when we know the scope DIE is not going to be
582 // null and the children will be added to the scope DIE.
Manman Ren2312ed32013-09-10 18:40:41 +0000583 ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children);
584 ChildrenCreated = true;
Manman Ren5b2f4b02013-09-11 19:40:28 +0000585
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000586 // There is no need to emit empty lexical block DIE.
David Blaikie684fc532013-05-06 23:33:07 +0000587 std::pair<ImportedEntityMap::const_iterator,
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000588 ImportedEntityMap::const_iterator> Range =
589 std::equal_range(
590 ScopesWithImportedEntities.begin(),
591 ScopesWithImportedEntities.end(),
Craig Topper353eda42014-04-24 06:44:33 +0000592 std::pair<const MDNode *, const MDNode *>(DS, nullptr),
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000593 less_first());
David Blaikie684fc532013-05-06 23:33:07 +0000594 if (Children.empty() && Range.first == Range.second)
Craig Topper353eda42014-04-24 06:44:33 +0000595 return nullptr;
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000596 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Manman Ren2312ed32013-09-10 18:40:41 +0000597 assert(ScopeDIE && "Scope DIE should not be null.");
Eric Christopher5fdd68e2013-06-24 23:20:02 +0000598 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
599 ++i)
David Blaikie4dd2de72013-05-08 06:01:38 +0000600 constructImportedEntityDIE(TheCU, i->second, ScopeDIE);
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000601 }
Eric Christopher6a841382012-11-19 22:42:10 +0000602
Benjamin Kramer892daba2013-08-24 11:55:49 +0000603 if (!ScopeDIE) {
Manman Ren2312ed32013-09-10 18:40:41 +0000604 assert(Children.empty() &&
605 "We create children only when the scope DIE is not null.");
Craig Topper353eda42014-04-24 06:44:33 +0000606 return nullptr;
Benjamin Kramer892daba2013-08-24 11:55:49 +0000607 }
Manman Ren2312ed32013-09-10 18:40:41 +0000608 if (!ChildrenCreated)
Manman Ren5b2f4b02013-09-11 19:40:28 +0000609 // We create children when the scope DIE is not null.
Manman Ren2312ed32013-09-10 18:40:41 +0000610 ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children);
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000611
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000612 // Add children
Benjamin Kramer15596c72014-03-07 19:09:39 +0000613 for (DIE *I : Children)
614 ScopeDIE->addChild(I);
Devang Patel04d2f2d2009-11-24 01:14:22 +0000615
Craig Topper353eda42014-04-24 06:44:33 +0000616 if (DS.isSubprogram() && ObjectPointer != nullptr)
David Blaikie65a74662014-04-25 18:26:14 +0000617 TheCU.addDIEEntry(*ScopeDIE, dwarf::DW_AT_object_pointer, ObjectPointer);
Eric Christophere3417762012-09-12 23:36:19 +0000618
Eric Christopherd9843b32011-11-10 19:25:34 +0000619 return ScopeDIE;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000620}
621
David Blaikie65a74662014-04-25 18:26:14 +0000622void DwarfDebug::addGnuPubAttributes(DwarfUnit &U, DIE &D) const {
David Blaikie3c842622013-12-04 21:31:26 +0000623 if (!GenerateGnuPubSections)
624 return;
625
David Blaikief9b6a552014-04-22 22:39:41 +0000626 U.addFlag(D, dwarf::DW_AT_GNU_pubnames);
David Blaikie3c842622013-12-04 21:31:26 +0000627}
628
Eric Christopher4287a492013-12-09 23:57:44 +0000629// Create new DwarfCompileUnit for the given metadata node with tag
Eric Christopher48fef592012-12-20 21:58:40 +0000630// DW_TAG_compile_unit.
David Blaikief9b6a552014-04-22 22:39:41 +0000631DwarfCompileUnit &DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) {
Devang Patel2d9caf92009-11-25 17:36:49 +0000632 StringRef FN = DIUnit.getFilename();
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000633 CompilationDir = DIUnit.getDirectory();
Bill Wendling2b128d72009-05-20 23:19:06 +0000634
635 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
David Blaikief9b6a552014-04-22 22:39:41 +0000636 auto OwnedUnit = make_unique<DwarfCompileUnit>(
Eric Christopher4287a492013-12-09 23:57:44 +0000637 InfoHolder.getUnits().size(), Die, DIUnit, Asm, this, &InfoHolder);
David Blaikief9b6a552014-04-22 22:39:41 +0000638 DwarfCompileUnit &NewCU = *OwnedUnit;
639 InfoHolder.addUnit(std::move(OwnedUnit));
640
David Blaikie7ac51492014-03-20 17:05:45 +0000641 // LTO with assembly output shares a single line table amongst multiple CUs.
642 // To avoid the compilation directory being ambiguous, let the line table
643 // explicitly describe the directory of all files, never relying on the
644 // compilation directory.
David Blaikie47f4b822014-03-19 00:11:28 +0000645 if (!Asm->OutStreamer.hasRawTextSupport() || SingleCU)
David Blaikiee05274d2014-03-18 00:11:48 +0000646 Asm->OutStreamer.getContext().setMCLineTableCompilationDir(
David Blaikief9b6a552014-04-22 22:39:41 +0000647 NewCU.getUniqueID(), CompilationDir);
David Blaikie2666e242013-12-06 19:38:46 +0000648
David Blaikie65a74662014-04-25 18:26:14 +0000649 NewCU.addString(*Die, dwarf::DW_AT_producer, DIUnit.getProducer());
650 NewCU.addUInt(*Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
David Blaikie637cac42014-04-22 23:09:36 +0000651 DIUnit.getLanguage());
David Blaikie65a74662014-04-25 18:26:14 +0000652 NewCU.addString(*Die, dwarf::DW_AT_name, FN);
Eric Christopher52ce7182013-04-09 19:23:15 +0000653
Eric Christopher52ce7182013-04-09 19:23:15 +0000654 if (!useSplitDwarf()) {
David Blaikief9b6a552014-04-22 22:39:41 +0000655 NewCU.initStmtList(DwarfLineSectionSym);
Eric Christophera51d3fc2013-09-27 22:50:48 +0000656
657 // If we're using split dwarf the compilation dir is going to be in the
658 // skeleton CU and so we don't need to duplicate it here.
659 if (!CompilationDir.empty())
David Blaikie65a74662014-04-25 18:26:14 +0000660 NewCU.addString(*Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christophera51d3fc2013-09-27 22:50:48 +0000661
David Blaikie65a74662014-04-25 18:26:14 +0000662 addGnuPubAttributes(NewCU, *Die);
Eric Christopher52ce7182013-04-09 19:23:15 +0000663 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000664
Bill Wendling2b128d72009-05-20 23:19:06 +0000665 if (DIUnit.isOptimized())
David Blaikie65a74662014-04-25 18:26:14 +0000666 NewCU.addFlag(*Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendling2b128d72009-05-20 23:19:06 +0000667
Devang Patel2d9caf92009-11-25 17:36:49 +0000668 StringRef Flags = DIUnit.getFlags();
669 if (!Flags.empty())
David Blaikie65a74662014-04-25 18:26:14 +0000670 NewCU.addString(*Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher6a841382012-11-19 22:42:10 +0000671
Nick Lewycky479a8fe2011-10-17 23:27:36 +0000672 if (unsigned RVer = DIUnit.getRunTimeVersion())
David Blaikie65a74662014-04-25 18:26:14 +0000673 NewCU.addUInt(*Die, dwarf::DW_AT_APPLE_major_runtime_vers,
David Blaikie637cac42014-04-22 23:09:36 +0000674 dwarf::DW_FORM_data1, RVer);
Bill Wendling2b128d72009-05-20 23:19:06 +0000675
Devang Patel1a0df9a2010-05-10 22:49:55 +0000676 if (!FirstCU)
David Blaikief9b6a552014-04-22 22:39:41 +0000677 FirstCU = &NewCU;
Eric Christopher7a2cdf72013-02-05 07:31:55 +0000678
Eric Christopherd4368fd2014-01-02 21:03:28 +0000679 if (useSplitDwarf()) {
David Blaikief9b6a552014-04-22 22:39:41 +0000680 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoDWOSection(),
David Blaikie637cac42014-04-22 23:09:36 +0000681 DwarfInfoDWOSectionSym);
David Blaikief9b6a552014-04-22 22:39:41 +0000682 NewCU.setSkeleton(constructSkeletonCU(NewCU));
Eric Christopherd4368fd2014-01-02 21:03:28 +0000683 } else
David Blaikief9b6a552014-04-22 22:39:41 +0000684 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
David Blaikie637cac42014-04-22 23:09:36 +0000685 DwarfInfoSectionSym);
Eric Christopherd039baa2013-12-30 03:40:32 +0000686
David Blaikief9b6a552014-04-22 22:39:41 +0000687 CUMap.insert(std::make_pair(DIUnit, &NewCU));
688 CUDieMap.insert(std::make_pair(Die, &NewCU));
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000689 return NewCU;
Devang Patel1a0df9a2010-05-10 22:49:55 +0000690}
691
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000692// Construct subprogram DIE.
David Blaikief9b6a552014-04-22 22:39:41 +0000693void DwarfDebug::constructSubprogramDIE(DwarfCompileUnit &TheCU,
Eric Christopher4287a492013-12-09 23:57:44 +0000694 const MDNode *N) {
Eric Christopherffbc4de2013-10-18 01:57:30 +0000695 // FIXME: We should only call this routine once, however, during LTO if a
696 // program is defined in multiple CUs we could end up calling it out of
697 // beginModule as we walk the CUs.
698
Eric Christopher4287a492013-12-09 23:57:44 +0000699 DwarfCompileUnit *&CURef = SPMap[N];
Eric Christopherffbc4de2013-10-18 01:57:30 +0000700 if (CURef)
701 return;
David Blaikief9b6a552014-04-22 22:39:41 +0000702 CURef = &TheCU;
Rafael Espindola6cf4e832011-11-04 19:00:29 +0000703
Devang Patel80ae3492009-08-28 23:24:31 +0000704 DISubprogram SP(N);
Bill Wendling2b128d72009-05-20 23:19:06 +0000705 if (!SP.isDefinition())
706 // This is a method declaration which will be handled while constructing
707 // class type.
Devang Patel0751a282009-06-26 01:49:18 +0000708 return;
Bill Wendling2b128d72009-05-20 23:19:06 +0000709
David Blaikie65a74662014-04-25 18:26:14 +0000710 DIE &SubprogramDie = *TheCU.getOrCreateSubprogramDIE(SP);
Stuart Hastings4bd3dd92010-04-06 21:38:29 +0000711
Eric Christopherba506db2013-09-09 20:03:20 +0000712 // Expose as a global name.
David Blaikief9b6a552014-04-22 22:39:41 +0000713 TheCU.addGlobalName(SP.getName(), SubprogramDie, resolve(SP.getContext()));
Bill Wendling2b128d72009-05-20 23:19:06 +0000714}
715
David Blaikief9b6a552014-04-22 22:39:41 +0000716void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
David Blaikief55abea2013-04-22 06:12:31 +0000717 const MDNode *N) {
David Blaikie1fd43652013-05-07 21:35:53 +0000718 DIImportedEntity Module(N);
David Blaikie5e390e42014-02-04 01:23:52 +0000719 assert(Module.Verify());
David Blaikief9b6a552014-04-22 22:39:41 +0000720 if (DIE *D = TheCU.getOrCreateContextDIE(Module.getContext()))
David Blaikie4dd2de72013-05-08 06:01:38 +0000721 constructImportedEntityDIE(TheCU, Module, D);
David Blaikie684fc532013-05-06 23:33:07 +0000722}
723
David Blaikief9b6a552014-04-22 22:39:41 +0000724void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
Eric Christopher4287a492013-12-09 23:57:44 +0000725 const MDNode *N, DIE *Context) {
David Blaikie1fd43652013-05-07 21:35:53 +0000726 DIImportedEntity Module(N);
David Blaikie5e390e42014-02-04 01:23:52 +0000727 assert(Module.Verify());
David Blaikie4dd2de72013-05-08 06:01:38 +0000728 return constructImportedEntityDIE(TheCU, Module, Context);
David Blaikie684fc532013-05-06 23:33:07 +0000729}
730
David Blaikief9b6a552014-04-22 22:39:41 +0000731void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
David Blaikie1fd43652013-05-07 21:35:53 +0000732 const DIImportedEntity &Module,
David Blaikie684fc532013-05-06 23:33:07 +0000733 DIE *Context) {
734 assert(Module.Verify() &&
735 "Use one of the MDNode * overloads to handle invalid metadata");
736 assert(Context && "Should always have a context for an imported_module");
David Blaikie65a74662014-04-25 18:26:14 +0000737 DIE &IMDie = *TheCU.createAndAddDIE(Module.getTag(), *Context, Module);
David Blaikie1fd43652013-05-07 21:35:53 +0000738 DIE *EntityDie;
Adrian Prantld09ba232014-04-01 03:41:04 +0000739 DIDescriptor Entity = resolve(Module.getEntity());
David Blaikie1fd43652013-05-07 21:35:53 +0000740 if (Entity.isNameSpace())
David Blaikief9b6a552014-04-22 22:39:41 +0000741 EntityDie = TheCU.getOrCreateNameSpace(DINameSpace(Entity));
David Blaikie1fd43652013-05-07 21:35:53 +0000742 else if (Entity.isSubprogram())
David Blaikief9b6a552014-04-22 22:39:41 +0000743 EntityDie = TheCU.getOrCreateSubprogramDIE(DISubprogram(Entity));
David Blaikie3b6038b2013-05-08 06:01:41 +0000744 else if (Entity.isType())
David Blaikief9b6a552014-04-22 22:39:41 +0000745 EntityDie = TheCU.getOrCreateTypeDIE(DIType(Entity));
David Blaikie1fd43652013-05-07 21:35:53 +0000746 else
David Blaikief9b6a552014-04-22 22:39:41 +0000747 EntityDie = TheCU.getDIE(Entity);
748 TheCU.addSourceLine(IMDie, Module.getLineNumber(),
David Blaikie637cac42014-04-22 23:09:36 +0000749 Module.getContext().getFilename(),
750 Module.getContext().getDirectory());
David Blaikief9b6a552014-04-22 22:39:41 +0000751 TheCU.addDIEEntry(IMDie, dwarf::DW_AT_import, EntityDie);
David Blaikiee63d5d12013-05-20 22:50:35 +0000752 StringRef Name = Module.getName();
753 if (!Name.empty())
David Blaikief9b6a552014-04-22 22:39:41 +0000754 TheCU.addString(IMDie, dwarf::DW_AT_name, Name);
David Blaikief55abea2013-04-22 06:12:31 +0000755}
756
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000757// Emit all Dwarf sections that should come prior to the content. Create
758// global DIEs and emit initial debug info sections. This is invoked by
759// the target AsmPrinter.
Eric Christopher58f41952012-11-19 22:42:15 +0000760void DwarfDebug::beginModule() {
Devang Patel6c74a872010-04-27 19:46:33 +0000761 if (DisableDebugInfoPrinting)
762 return;
763
Eric Christopher58f41952012-11-19 22:42:15 +0000764 const Module *M = MMI->getModule();
765
Nick Lewycky019d2552011-07-29 03:49:23 +0000766 // If module has named metadata anchors then use them, otherwise scan the
767 // module using debug info finder to collect debug info.
Devang Patele02e5852011-05-03 16:45:22 +0000768 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiedc69ebb2013-03-11 23:39:23 +0000769 if (!CU_Nodes)
Devang Patel07bb9ee2011-08-15 23:47:24 +0000770 return;
Manman Ren60352032013-09-05 18:48:31 +0000771 TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
Devang Patele02e5852011-05-03 16:45:22 +0000772
David Blaikiedc69ebb2013-03-11 23:39:23 +0000773 // Emit initial sections so we can reference labels later.
774 emitSectionLabels();
775
David Blaikie47f4b822014-03-19 00:11:28 +0000776 SingleCU = CU_Nodes->getNumOperands() == 1;
David Blaikiee05274d2014-03-18 00:11:48 +0000777
David Blaikie47f4b822014-03-19 00:11:28 +0000778 for (MDNode *N : CU_Nodes->operands()) {
Benjamin Kramer15596c72014-03-07 19:09:39 +0000779 DICompileUnit CUNode(N);
David Blaikief9b6a552014-04-22 22:39:41 +0000780 DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode);
David Blaikie1fd43652013-05-07 21:35:53 +0000781 DIArray ImportedEntities = CUNode.getImportedEntities();
782 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikie684fc532013-05-06 23:33:07 +0000783 ScopesWithImportedEntities.push_back(std::make_pair(
David Blaikie1fd43652013-05-07 21:35:53 +0000784 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
785 ImportedEntities.getElement(i)));
David Blaikie684fc532013-05-06 23:33:07 +0000786 std::sort(ScopesWithImportedEntities.begin(),
Benjamin Kramerb12cf012013-08-24 12:54:27 +0000787 ScopesWithImportedEntities.end(), less_first());
David Blaikiedc69ebb2013-03-11 23:39:23 +0000788 DIArray GVs = CUNode.getGlobalVariables();
789 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
David Blaikief9b6a552014-04-22 22:39:41 +0000790 CU.createGlobalVariableDIE(DIGlobalVariable(GVs.getElement(i)));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000791 DIArray SPs = CUNode.getSubprograms();
792 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
793 constructSubprogramDIE(CU, SPs.getElement(i));
794 DIArray EnumTypes = CUNode.getEnumTypes();
795 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
David Blaikief9b6a552014-04-22 22:39:41 +0000796 CU.getOrCreateTypeDIE(EnumTypes.getElement(i));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000797 DIArray RetainedTypes = CUNode.getRetainedTypes();
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000798 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i) {
799 DIType Ty(RetainedTypes.getElement(i));
800 // The retained types array by design contains pointers to
801 // MDNodes rather than DIRefs. Unique them here.
802 DIType UniqueTy(resolve(Ty.getRef()));
David Blaikief9b6a552014-04-22 22:39:41 +0000803 CU.getOrCreateTypeDIE(UniqueTy);
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000804 }
David Blaikief55abea2013-04-22 06:12:31 +0000805 // Emit imported_modules last so that the relevant context is already
806 // available.
David Blaikie1fd43652013-05-07 21:35:53 +0000807 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
808 constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000809 }
Eric Christopher6a841382012-11-19 22:42:10 +0000810
Chris Lattner7cfa70e2010-04-05 02:19:28 +0000811 // Tell MMI that we have debug info.
812 MMI->setDebugInfoAvailability(true);
Eric Christopher6a841382012-11-19 22:42:10 +0000813
Bill Wendling2b128d72009-05-20 23:19:06 +0000814 // Prime section data.
Richard Mitton21101b32013-09-19 23:21:01 +0000815 SectionMap[Asm->getObjFileLowering().getTextSection()];
Bill Wendling2b128d72009-05-20 23:19:06 +0000816}
817
Eric Christopher960ac372012-11-22 00:59:49 +0000818// Attach DW_AT_inline attribute with inlined subprogram DIEs.
819void DwarfDebug::computeInlinedDIEs() {
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000820 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
Benjamin Kramer15596c72014-03-07 19:09:39 +0000821 for (DIE *ISP : InlinedSubprogramDIEs)
David Blaikie65a74662014-04-25 18:26:14 +0000822 FirstCU->addUInt(*ISP, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
Benjamin Kramer15596c72014-03-07 19:09:39 +0000823
824 for (const auto &AI : AbstractSPDies) {
David Blaikie65a74662014-04-25 18:26:14 +0000825 DIE &ISP = *AI.second;
826 if (InlinedSubprogramDIEs.count(&ISP))
Rafael Espindolae7cc8bf2011-11-12 01:57:54 +0000827 continue;
David Blaikief2443192013-10-21 17:28:37 +0000828 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
Rafael Espindolae7cc8bf2011-11-12 01:57:54 +0000829 }
Eric Christopher960ac372012-11-22 00:59:49 +0000830}
831
832// Collect info for variables that were optimized out.
833void DwarfDebug::collectDeadVariables() {
834 const Module *M = MMI->getModule();
Eric Christopher960ac372012-11-22 00:59:49 +0000835
836 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
Benjamin Kramer15596c72014-03-07 19:09:39 +0000837 for (MDNode *N : CU_Nodes->operands()) {
838 DICompileUnit TheCU(N);
Eric Christopher960ac372012-11-22 00:59:49 +0000839 DIArray Subprograms = TheCU.getSubprograms();
840 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopher735401c2012-11-27 00:13:51 +0000841 DISubprogram SP(Subprograms.getElement(i));
Eric Christophera6c38a32013-10-15 23:31:38 +0000842 if (ProcessedSPNodes.count(SP) != 0)
843 continue;
844 if (!SP.isSubprogram())
845 continue;
846 if (!SP.isDefinition())
847 continue;
Eric Christopher735401c2012-11-27 00:13:51 +0000848 DIArray Variables = SP.getVariables();
Eric Christophera6c38a32013-10-15 23:31:38 +0000849 if (Variables.getNumElements() == 0)
850 continue;
Eric Christopher960ac372012-11-22 00:59:49 +0000851
Eric Christopher735401c2012-11-27 00:13:51 +0000852 // Construct subprogram DIE and add variables DIEs.
Eric Christopher4287a492013-12-09 23:57:44 +0000853 DwarfCompileUnit *SPCU =
854 static_cast<DwarfCompileUnit *>(CUMap.lookup(TheCU));
Eric Christopher735401c2012-11-27 00:13:51 +0000855 assert(SPCU && "Unable to find Compile Unit!");
Eric Christopherc798d8a2013-10-22 00:22:39 +0000856 // FIXME: See the comment in constructSubprogramDIE about duplicate
857 // subprogram DIEs.
David Blaikief9b6a552014-04-22 22:39:41 +0000858 constructSubprogramDIE(*SPCU, SP);
Eric Christopherc798d8a2013-10-22 00:22:39 +0000859 DIE *SPDIE = SPCU->getDIE(SP);
Eric Christopher735401c2012-11-27 00:13:51 +0000860 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
861 DIVariable DV(Variables.getElement(vi));
Eric Christophera6c38a32013-10-15 23:31:38 +0000862 if (!DV.isVariable())
863 continue;
Craig Topper353eda42014-04-24 06:44:33 +0000864 DbgVariable NewVar(DV, nullptr, this);
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000865 if (DIE *VariableDIE = SPCU->constructVariableDIE(NewVar, false))
Eric Christophera6c38a32013-10-15 23:31:38 +0000866 SPDIE->addChild(VariableDIE);
Eric Christopher735401c2012-11-27 00:13:51 +0000867 }
Eric Christopher960ac372012-11-22 00:59:49 +0000868 }
869 }
870 }
Eric Christopher960ac372012-11-22 00:59:49 +0000871}
872
873void DwarfDebug::finalizeModuleInfo() {
874 // Collect info for variables that were optimized out.
875 collectDeadVariables();
876
877 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
878 computeInlinedDIEs();
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000879
Eric Christopherad10cb52013-12-04 23:24:38 +0000880 // Handle anything that needs to be done on a per-unit basis after
881 // all other generation.
David Blaikiec33b3cd2014-04-22 21:27:37 +0000882 for (const auto &TheU : getUnits()) {
Eric Christopher60eb7692013-08-12 20:27:48 +0000883 // Emit DW_AT_containing_type attribute to connect types with their
884 // vtable holding type.
David Blaikie2a80e442013-12-02 22:09:48 +0000885 TheU->constructContainingTypeDIEs();
Eric Christopher60eb7692013-08-12 20:27:48 +0000886
Eric Christopher46e23432013-12-20 04:16:18 +0000887 // Add CU specific attributes if we need to add any.
David Blaikieadcde362014-04-25 18:35:57 +0000888 if (TheU->getUnitDie().getTag() == dwarf::DW_TAG_compile_unit) {
Eric Christopher46e23432013-12-20 04:16:18 +0000889 // If we're splitting the dwarf out now that we've got the entire
Eric Christopherd8667202013-12-30 17:22:27 +0000890 // CU then add the dwo id to it.
891 DwarfCompileUnit *SkCU =
892 static_cast<DwarfCompileUnit *>(TheU->getSkeleton());
Eric Christopher46e23432013-12-20 04:16:18 +0000893 if (useSplitDwarf()) {
Eric Christopher09d1c0f2014-03-14 21:20:07 +0000894 // Emit a unique identifier for this CU.
David Blaikieadcde362014-04-25 18:35:57 +0000895 uint64_t ID = DIEHash(Asm).computeCUSignature(TheU->getUnitDie());
896 TheU->addUInt(TheU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher46e23432013-12-20 04:16:18 +0000897 dwarf::DW_FORM_data8, ID);
David Blaikieadcde362014-04-25 18:35:57 +0000898 SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher46e23432013-12-20 04:16:18 +0000899 dwarf::DW_FORM_data8, ID);
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000900
901 // We don't keep track of which addresses are used in which CU so this
902 // is a bit pessimistic under LTO.
David Blaikied75fb282014-04-23 21:20:10 +0000903 if (!AddrPool.isEmpty())
David Blaikieadcde362014-04-25 18:35:57 +0000904 addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000905 dwarf::DW_AT_GNU_addr_base, DwarfAddrSectionSym,
906 DwarfAddrSectionSym);
907 if (!TheU->getRangeLists().empty())
David Blaikieadcde362014-04-25 18:35:57 +0000908 addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000909 dwarf::DW_AT_GNU_ranges_base,
910 DwarfDebugRangeSectionSym, DwarfDebugRangeSectionSym);
Eric Christopherd29614f2013-08-13 01:21:55 +0000911 }
Eric Christopherd8667202013-12-30 17:22:27 +0000912
Eric Christopher384f3fe2014-03-20 19:16:16 +0000913 // If we have code split among multiple sections or non-contiguous
914 // ranges of code then emit a DW_AT_ranges attribute on the unit that will
915 // remain in the .o file, otherwise add a DW_AT_low_pc.
916 // FIXME: We should use ranges allow reordering of code ala
917 // .subsections_via_symbols in mach-o. This would mean turning on
918 // ranges for all subprogram DIEs for mach-o.
David Blaikiec33b3cd2014-04-22 21:27:37 +0000919 DwarfCompileUnit &U =
920 SkCU ? *SkCU : static_cast<DwarfCompileUnit &>(*TheU);
Eric Christopher384f3fe2014-03-20 19:16:16 +0000921 unsigned NumRanges = TheU->getRanges().size();
922 if (NumRanges) {
923 if (NumRanges > 1) {
David Blaikieadcde362014-04-25 18:35:57 +0000924 addSectionLabel(*Asm, U, U.getUnitDie(), dwarf::DW_AT_ranges,
David Blaikiec33b3cd2014-04-22 21:27:37 +0000925 Asm->GetTempSymbol("cu_ranges", U.getUniqueID()),
Eric Christopher384f3fe2014-03-20 19:16:16 +0000926 DwarfDebugRangeSectionSym);
Eric Christopher8873ada2014-01-29 22:22:56 +0000927
Eric Christopher384f3fe2014-03-20 19:16:16 +0000928 // A DW_AT_low_pc attribute may also be specified in combination with
929 // DW_AT_ranges to specify the default base address for use in
930 // location lists (see Section 2.6.2) and range lists (see Section
931 // 2.17.3).
David Blaikieadcde362014-04-25 18:35:57 +0000932 U.addUInt(U.getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
David Blaikiec33b3cd2014-04-22 21:27:37 +0000933 0);
Eric Christopher384f3fe2014-03-20 19:16:16 +0000934 } else {
935 RangeSpan &Range = TheU->getRanges().back();
David Blaikieadcde362014-04-25 18:35:57 +0000936 U.addLocalLabelAddress(U.getUnitDie(), dwarf::DW_AT_low_pc,
David Blaikiec33b3cd2014-04-22 21:27:37 +0000937 Range.getStart());
David Blaikieadcde362014-04-25 18:35:57 +0000938 U.addLabelDelta(U.getUnitDie(), dwarf::DW_AT_high_pc, Range.getEnd(),
David Blaikiec33b3cd2014-04-22 21:27:37 +0000939 Range.getStart());
Eric Christopher384f3fe2014-03-20 19:16:16 +0000940 }
941 }
Eric Christopher60eb7692013-08-12 20:27:48 +0000942 }
943 }
944
945 // Compute DIE offsets and sizes.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000946 InfoHolder.computeSizeAndOffsets();
947 if (useSplitDwarf())
948 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher960ac372012-11-22 00:59:49 +0000949}
950
951void DwarfDebug::endSections() {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000952 // Filter labels by section.
Benjamin Kramer15596c72014-03-07 19:09:39 +0000953 for (const SymbolCU &SCU : ArangeLabels) {
Richard Mitton21101b32013-09-19 23:21:01 +0000954 if (SCU.Sym->isInSection()) {
955 // Make a note of this symbol and it's section.
956 const MCSection *Section = &SCU.Sym->getSection();
957 if (!Section->getKind().isMetadata())
958 SectionMap[Section].push_back(SCU);
959 } else {
960 // Some symbols (e.g. common/bss on mach-o) can have no section but still
961 // appear in the output. This sucks as we rely on sections to build
962 // arange spans. We can do it without, but it's icky.
Craig Topper353eda42014-04-24 06:44:33 +0000963 SectionMap[nullptr].push_back(SCU);
Richard Mitton21101b32013-09-19 23:21:01 +0000964 }
965 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000966
Richard Mittonc2508242013-10-03 22:07:08 +0000967 // Build a list of sections used.
968 std::vector<const MCSection *> Sections;
Benjamin Kramer15596c72014-03-07 19:09:39 +0000969 for (const auto &it : SectionMap) {
970 const MCSection *Section = it.first;
Richard Mittonc2508242013-10-03 22:07:08 +0000971 Sections.push_back(Section);
972 }
973
974 // Sort the sections into order.
975 // This is only done to ensure consistent output order across different runs.
976 std::sort(Sections.begin(), Sections.end(), SectionSort);
977
978 // Add terminating symbols for each section.
Benjamin Kramer15596c72014-03-07 19:09:39 +0000979 for (unsigned ID = 0, E = Sections.size(); ID != E; ID++) {
Richard Mittonc2508242013-10-03 22:07:08 +0000980 const MCSection *Section = Sections[ID];
Craig Topper353eda42014-04-24 06:44:33 +0000981 MCSymbol *Sym = nullptr;
Richard Mitton21101b32013-09-19 23:21:01 +0000982
983 if (Section) {
Richard Mittonc2508242013-10-03 22:07:08 +0000984 // We can't call MCSection::getLabelEndName, as it's only safe to do so
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000985 // if we know the section name up-front. For user-created sections, the
Eric Christopher95531b62014-01-29 22:06:21 +0000986 // resulting label may not be valid to use as a label. (section names can
987 // use a greater set of characters on some systems)
Richard Mittonc2508242013-10-03 22:07:08 +0000988 Sym = Asm->GetTempSymbol("debug_end", ID);
Richard Mitton21101b32013-09-19 23:21:01 +0000989 Asm->OutStreamer.SwitchSection(Section);
990 Asm->OutStreamer.EmitLabel(Sym);
991 }
992
993 // Insert a final terminator.
Craig Topper353eda42014-04-24 06:44:33 +0000994 SectionMap[Section].push_back(SymbolCU(nullptr, Sym));
Bill Wendling2b128d72009-05-20 23:19:06 +0000995 }
Eric Christopher960ac372012-11-22 00:59:49 +0000996}
Bill Wendling2b128d72009-05-20 23:19:06 +0000997
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000998// Emit all Dwarf sections that should come after the content.
Eric Christopher960ac372012-11-22 00:59:49 +0000999void DwarfDebug::endModule() {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001000 assert(CurFn == 0);
1001 assert(CurMI == 0);
Eric Christopher960ac372012-11-22 00:59:49 +00001002
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001003 if (!FirstCU)
1004 return;
Eric Christopher960ac372012-11-22 00:59:49 +00001005
1006 // End any existing sections.
1007 // TODO: Does this need to happen?
1008 endSections();
1009
1010 // Finalize the debug info for the module.
1011 finalizeModuleInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001012
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001013 emitDebugStr();
Eric Christopher9cd26af2013-09-20 23:22:52 +00001014
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001015 // Emit all the DIEs into a debug info section.
1016 emitDebugInfo();
Eric Christopher4c9b1192012-11-27 00:41:54 +00001017
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001018 // Corresponding abbreviations into a abbrev section.
1019 emitAbbreviations();
Eric Christopher95198f502012-11-27 22:43:42 +00001020
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001021 // Emit info into a debug aranges section.
Eric Christopher02dbadb2014-02-14 01:26:55 +00001022 if (GenerateARangeSection)
1023 emitDebugARanges();
Eric Christopher95198f502012-11-27 22:43:42 +00001024
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001025 // Emit info into a debug ranges section.
1026 emitDebugRanges();
Eric Christopher95198f502012-11-27 22:43:42 +00001027
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001028 if (useSplitDwarf()) {
1029 emitDebugStrDWO();
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001030 emitDebugInfoDWO();
Eric Christopher3c5a1912012-12-19 22:02:53 +00001031 emitDebugAbbrevDWO();
David Blaikie4a2f95f2014-03-18 01:17:26 +00001032 emitDebugLineDWO();
Eric Christopher962c9082013-01-15 23:56:56 +00001033 // Emit DWO addresses.
David Blaikied75fb282014-04-23 21:20:10 +00001034 AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection());
David Blaikie94c1d7f2014-04-02 01:50:20 +00001035 emitDebugLocDWO();
1036 } else
1037 // Emit info into a debug loc section.
1038 emitDebugLoc();
Bill Wendling2b128d72009-05-20 23:19:06 +00001039
Eric Christophera876b822012-08-23 07:32:06 +00001040 // Emit info into the dwarf accelerator table sections.
Eric Christopher20b76a72012-08-23 22:36:40 +00001041 if (useDwarfAccelTables()) {
Eric Christopher4996c702011-11-07 09:24:32 +00001042 emitAccelNames();
1043 emitAccelObjC();
1044 emitAccelNamespaces();
1045 emitAccelTypes();
1046 }
Eric Christopher6a841382012-11-19 22:42:10 +00001047
Eric Christopher4b358182013-08-30 00:40:17 +00001048 // Emit the pubnames and pubtypes sections if requested.
1049 if (HasDwarfPubSections) {
David Blaikie70a33202013-09-19 17:33:35 +00001050 emitDebugPubNames(GenerateGnuPubSections);
1051 emitDebugPubTypes(GenerateGnuPubSections);
Eric Christopher4b358182013-08-30 00:40:17 +00001052 }
Devang Patel04d2f2d2009-11-24 01:14:22 +00001053
Devang Pateld0701282010-08-02 17:32:15 +00001054 // clean up.
Devang Pateleb1bb4e2011-08-16 22:09:43 +00001055 SPMap.clear();
Eric Christopher8afd7b62012-12-10 19:51:18 +00001056
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001057 // Reset these for the next Module if we have one.
Craig Topper353eda42014-04-24 06:44:33 +00001058 FirstCU = nullptr;
Bill Wendling2b128d72009-05-20 23:19:06 +00001059}
1060
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001061// Find abstract variable, if any, associated with Var.
Devang Patelbb23a4a2011-08-10 21:50:54 +00001062DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattner915c5f92010-04-02 19:42:39 +00001063 DebugLoc ScopeLoc) {
Devang Patelbb23a4a2011-08-10 21:50:54 +00001064 LLVMContext &Ctx = DV->getContext();
1065 // More then one inlined variable corresponds to one abstract variable.
1066 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001067 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001068 if (AbsDbgVariable)
1069 return AbsDbgVariable;
1070
Devang Patel7e623022011-08-10 20:55:27 +00001071 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001072 if (!Scope)
Craig Topper353eda42014-04-24 06:44:33 +00001073 return nullptr;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001074
Craig Topper353eda42014-04-24 06:44:33 +00001075 AbsDbgVariable = new DbgVariable(Var, nullptr, this);
David Blaikieafd2c6b2014-04-22 05:41:06 +00001076 addScopeVariable(Scope, AbsDbgVariable);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001077 AbstractVariables[Var] = AbsDbgVariable;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001078 return AbsDbgVariable;
1079}
1080
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001081// If Var is a current function argument then add it to CurrentFnArguments list.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001082bool DwarfDebug::addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope) {
Devang Patel7e623022011-08-10 20:55:27 +00001083 if (!LScopes.isCurrentFunctionScope(Scope))
David Blaikieafd2c6b2014-04-22 05:41:06 +00001084 return false;
1085 DIVariable DV = Var->getVariable();
Devang Patel6c622ef2011-03-01 22:58:55 +00001086 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
David Blaikieafd2c6b2014-04-22 05:41:06 +00001087 return false;
Devang Patel6c622ef2011-03-01 22:58:55 +00001088 unsigned ArgNo = DV.getArgNumber();
Eric Christopher6a841382012-11-19 22:42:10 +00001089 if (ArgNo == 0)
David Blaikieafd2c6b2014-04-22 05:41:06 +00001090 return false;
Devang Patel6c622ef2011-03-01 22:58:55 +00001091
David Blaikieafd2c6b2014-04-22 05:41:06 +00001092 size_t Size = CurrentFnArguments.size();
1093 if (Size == 0)
1094 CurrentFnArguments.resize(CurFn->getFunction()->arg_size());
1095 // llvm::Function argument size is not good indicator of how many
1096 // arguments does the function have at source level.
1097 if (ArgNo > Size)
1098 CurrentFnArguments.resize(ArgNo * 2);
1099 CurrentFnArguments[ArgNo - 1] = Var;
1100 return true;
Devang Patel6c622ef2011-03-01 22:58:55 +00001101}
1102
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001103// Collect variable information from side table maintained by MMI.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001104void DwarfDebug::collectVariableInfoFromMMITable(
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001105 SmallPtrSet<const MDNode *, 16> &Processed) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00001106 for (const auto &VI : MMI->getVariableDbgInfo()) {
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001107 if (!VI.Var)
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001108 continue;
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001109 Processed.insert(VI.Var);
1110 DIVariable DV(VI.Var);
1111 LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001112
Devang Patelcdb7d442009-11-10 23:20:04 +00001113 // If variable scope is not found then skip this variable.
Craig Topper353eda42014-04-24 06:44:33 +00001114 if (!Scope)
Devang Patelcdb7d442009-11-10 23:20:04 +00001115 continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001116
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001117 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VI.Loc);
David Blaikieafd2c6b2014-04-22 05:41:06 +00001118 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable, this);
1119 RegVar->setFrameIndex(VI.Slot);
1120 if (!addCurrentFnArgument(RegVar, Scope))
1121 addScopeVariable(Scope, RegVar);
Devang Patel99819b52011-08-15 19:01:20 +00001122 if (AbsDbgVariable)
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001123 AbsDbgVariable->setFrameIndex(VI.Slot);
Devang Patel475d32a2009-10-06 01:26:37 +00001124 }
Devang Patel490c8ab2010-05-20 19:57:06 +00001125}
Devang Patela3e9c9c2010-03-15 18:33:46 +00001126
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001127// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1128// defined reg.
Devang Patel9fc11702010-05-25 23:40:22 +00001129static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001130 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001131 return MI->getNumOperands() == 3 && MI->getOperand(0).isReg() &&
1132 MI->getOperand(0).getReg() &&
Adrian Prantl418d1d12013-07-09 20:28:37 +00001133 (MI->getOperand(1).isImm() ||
1134 (MI->getOperand(1).isReg() && MI->getOperand(1).getReg() == 0U));
Devang Patel9fc11702010-05-25 23:40:22 +00001135}
1136
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001137// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher05135fb2014-03-18 02:18:24 +00001138static DebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
Eric Christopher384f3fe2014-03-20 19:16:16 +00001139 const MCSymbol *FLabel,
1140 const MCSymbol *SLabel,
1141 const MachineInstr *MI,
1142 DwarfCompileUnit *Unit) {
Adrian Prantl7f487772014-04-10 17:39:48 +00001143 const MDNode *Var = MI->getDebugVariable();
Devang Patel2442a892011-07-08 17:09:57 +00001144
David Blaikie0252265b2013-06-16 20:34:15 +00001145 assert(MI->getNumOperands() == 3);
Adrian Prantl418d1d12013-07-09 20:28:37 +00001146 if (MI->getOperand(0).isReg()) {
Devang Patel2442a892011-07-08 17:09:57 +00001147 MachineLocation MLoc;
Adrian Prantl418d1d12013-07-09 20:28:37 +00001148 // If the second operand is an immediate, this is a
1149 // register-indirect address.
1150 if (!MI->getOperand(1).isImm())
Adrian Prantld4c0dd42013-04-26 21:57:17 +00001151 MLoc.set(MI->getOperand(0).getReg());
1152 else
1153 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Eric Christopher384f3fe2014-03-20 19:16:16 +00001154 return DebugLocEntry(FLabel, SLabel, MLoc, Var, Unit);
Devang Patel2442a892011-07-08 17:09:57 +00001155 }
1156 if (MI->getOperand(0).isImm())
Adrian Prantl3bdcb522014-04-11 17:49:47 +00001157 return DebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm(), Var, Unit);
Devang Patel2442a892011-07-08 17:09:57 +00001158 if (MI->getOperand(0).isFPImm())
Adrian Prantl3bdcb522014-04-11 17:49:47 +00001159 return DebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm(),
1160 Var, Unit);
Devang Patel2442a892011-07-08 17:09:57 +00001161 if (MI->getOperand(0).isCImm())
Adrian Prantl3bdcb522014-04-11 17:49:47 +00001162 return DebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm(),
1163 Var, Unit);
Devang Patel2442a892011-07-08 17:09:57 +00001164
Craig Topperee4dab52012-02-05 08:31:47 +00001165 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel2442a892011-07-08 17:09:57 +00001166}
1167
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001168// Find variables for each lexical scope.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001169void
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001170DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001171
Eric Christopher270a12c2013-07-03 21:37:03 +00001172 // Grab the variable info that was squirreled away in the MMI side-table.
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001173 collectVariableInfoFromMMITable(Processed);
Devang Patel490c8ab2010-05-20 19:57:06 +00001174
Benjamin Kramer15596c72014-03-07 19:09:39 +00001175 for (const MDNode *Var : UserVariables) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001176 if (Processed.count(Var))
Devang Patel490c8ab2010-05-20 19:57:06 +00001177 continue;
1178
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001179 // History contains relevant DBG_VALUE instructions for Var and instructions
1180 // clobbering it.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001181 SmallVectorImpl<const MachineInstr *> &History = DbgValues[Var];
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001182 if (History.empty())
1183 continue;
1184 const MachineInstr *MInsn = History.front();
Devang Patel9fc11702010-05-25 23:40:22 +00001185
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001186 DIVariable DV(Var);
Craig Topper353eda42014-04-24 06:44:33 +00001187 LexicalScope *Scope = nullptr;
Devang Patel7a9dedf2010-05-27 20:25:04 +00001188 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001189 DISubprogram(DV.getContext()).describes(CurFn->getFunction()))
Devang Patel7e623022011-08-10 20:55:27 +00001190 Scope = LScopes.getCurrentFunctionScope();
David Blaikiedc69ebb2013-03-11 23:39:23 +00001191 else if (MDNode *IA = DV.getInlinedAt())
1192 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1193 else
1194 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patel490c8ab2010-05-20 19:57:06 +00001195 // If variable scope is not found then skip this variable.
Devang Patelfbd6c452010-05-21 00:10:20 +00001196 if (!Scope)
Devang Patel490c8ab2010-05-20 19:57:06 +00001197 continue;
1198
1199 Processed.insert(DV);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001200 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel99819b52011-08-15 19:01:20 +00001201 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
David Blaikieafd2c6b2014-04-22 05:41:06 +00001202 DbgVariable *RegVar = new DbgVariable(DV, AbsVar, this);
1203 if (!addCurrentFnArgument(RegVar, Scope))
1204 addScopeVariable(Scope, RegVar);
Devang Patel99819b52011-08-15 19:01:20 +00001205 if (AbsVar)
Devang Patel3e4a9652011-08-15 21:24:36 +00001206 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001207
Eric Christophercc10d202012-10-08 20:48:54 +00001208 // Simplify ranges that are fully coalesced.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001209 if (History.size() <= 1 ||
1210 (History.size() == 2 && MInsn->isIdenticalTo(History.back()))) {
David Blaikieafd2c6b2014-04-22 05:41:06 +00001211 RegVar->setMInsn(MInsn);
Devang Patel9fc11702010-05-25 23:40:22 +00001212 continue;
1213 }
1214
Eric Christopher59cc0712013-01-28 17:33:26 +00001215 // Handle multiple DBG_VALUE instructions describing one variable.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001216 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001217
David Blaikie0a456de2014-04-02 01:43:18 +00001218 DotDebugLocEntries.resize(DotDebugLocEntries.size() + 1);
1219 DebugLocList &LocList = DotDebugLocEntries.back();
1220 LocList.Label =
1221 Asm->GetTempSymbol("debug_loc", DotDebugLocEntries.size() - 1);
1222 SmallVector<DebugLocEntry, 4> &DebugLoc = LocList.List;
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001223 for (SmallVectorImpl<const MachineInstr *>::const_iterator
1224 HI = History.begin(),
1225 HE = History.end();
1226 HI != HE; ++HI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001227 const MachineInstr *Begin = *HI;
1228 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesen9c057ee2011-03-22 00:21:41 +00001229
Devang Patele7181b52011-06-01 23:00:17 +00001230 // Check if DBG_VALUE is truncating a range.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001231 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg() &&
1232 !Begin->getOperand(0).getReg())
Devang Patele7181b52011-06-01 23:00:17 +00001233 continue;
1234
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001235 // Compute the range for a register location.
1236 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
Craig Topper353eda42014-04-24 06:44:33 +00001237 const MCSymbol *SLabel = nullptr;
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001238
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001239 if (HI + 1 == HE)
1240 // If Begin is the last instruction in History then its value is valid
Chris Lattner0ab5e2c2011-04-15 05:18:47 +00001241 // until the end of the function.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001242 SLabel = FunctionEndSym;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001243 else {
1244 const MachineInstr *End = HI[1];
Eric Christopher6a841382012-11-19 22:42:10 +00001245 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001246 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001247 if (End->isDebugValue())
1248 SLabel = getLabelBeforeInsn(End);
1249 else {
1250 // End is a normal instruction clobbering the range.
1251 SLabel = getLabelAfterInsn(End);
1252 assert(SLabel && "Forgot label after clobber instruction");
1253 ++HI;
1254 }
1255 }
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001256
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001257 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopher384f3fe2014-03-20 19:16:16 +00001258 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1259 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
David Blaikie34ec5d02014-03-24 22:27:06 +00001260 DebugLocEntry Loc = getDebugLocEntry(Asm, FLabel, SLabel, Begin, TheCU);
David Blaikie84d8e182014-03-24 22:38:38 +00001261 if (DebugLoc.empty() || !DebugLoc.back().Merge(Loc))
1262 DebugLoc.push_back(std::move(Loc));
Devang Patel9fc11702010-05-25 23:40:22 +00001263 }
Devang Patela3e9c9c2010-03-15 18:33:46 +00001264 }
Devang Patele0a94bf2010-05-14 21:01:35 +00001265
1266 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001267 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1268 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1269 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1270 DIVariable DV(Variables.getElement(i));
Manman Ren7504ed42013-07-08 18:33:29 +00001271 if (!DV || !DV.isVariable() || !Processed.insert(DV))
Devang Patel59e27c52011-08-19 23:28:12 +00001272 continue;
1273 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
Craig Topper353eda42014-04-24 06:44:33 +00001274 addScopeVariable(Scope, new DbgVariable(DV, nullptr, this));
Devang Patele0a94bf2010-05-14 21:01:35 +00001275 }
Devang Patel9fc11702010-05-25 23:40:22 +00001276}
Devang Patele0a94bf2010-05-14 21:01:35 +00001277
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001278// Return Label preceding the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001279MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001280 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1281 assert(Label && "Didn't insert label before instruction");
1282 return Label;
Devang Patel9fc11702010-05-25 23:40:22 +00001283}
1284
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001285// Return Label immediately following the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001286MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001287 return LabelsAfterInsn.lookup(MI);
Devang Patel475d32a2009-10-06 01:26:37 +00001288}
1289
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001290// Process beginning of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001291void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001292 assert(CurMI == 0);
1293 CurMI = MI;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001294 // Check if source location changes, but ignore DBG_VALUE locations.
1295 if (!MI->isDebugValue()) {
1296 DebugLoc DL = MI->getDebugLoc();
1297 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopheraec8a822012-04-05 20:39:05 +00001298 unsigned Flags = 0;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001299 PrevInstLoc = DL;
Devang Patel34a66202011-05-11 19:22:19 +00001300 if (DL == PrologEndLoc) {
1301 Flags |= DWARF2_FLAG_PROLOGUE_END;
1302 PrologEndLoc = DebugLoc();
1303 }
Eric Christopheraec8a822012-04-05 20:39:05 +00001304 if (PrologEndLoc.isUnknown())
1305 Flags |= DWARF2_FLAG_IS_STMT;
1306
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001307 if (!DL.isUnknown()) {
1308 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel34a66202011-05-11 19:22:19 +00001309 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001310 } else
Craig Topper353eda42014-04-24 06:44:33 +00001311 recordSourceLine(0, 0, nullptr, 0);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001312 }
Devang Patel9fc11702010-05-25 23:40:22 +00001313 }
Devang Patel23b2ae62010-03-29 22:59:58 +00001314
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001315 // Insert labels where requested.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001316 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
1317 LabelsBeforeInsn.find(MI);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001318
1319 // No label needed.
1320 if (I == LabelsBeforeInsn.end())
1321 return;
1322
1323 // Label already assigned.
1324 if (I->second)
Devang Patel002d54d2010-05-26 19:37:24 +00001325 return;
Devang Patelbd477be2010-03-29 17:20:31 +00001326
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001327 if (!PrevLabel) {
Devang Patelacc32a52010-05-26 21:23:46 +00001328 PrevLabel = MMI->getContext().CreateTempSymbol();
1329 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel002d54d2010-05-26 19:37:24 +00001330 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001331 I->second = PrevLabel;
Devang Patel8db360d2009-10-06 01:50:42 +00001332}
1333
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001334// Process end of an instruction.
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001335void DwarfDebug::endInstruction() {
1336 assert(CurMI != 0);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001337 // Don't create a new label after DBG_VALUE instructions.
1338 // They don't generate code.
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001339 if (!CurMI->isDebugValue())
Craig Topper353eda42014-04-24 06:44:33 +00001340 PrevLabel = nullptr;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001341
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001342 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001343 LabelsAfterInsn.find(CurMI);
Craig Topper353eda42014-04-24 06:44:33 +00001344 CurMI = nullptr;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001345
1346 // No label needed.
1347 if (I == LabelsAfterInsn.end())
1348 return;
1349
1350 // Label already assigned.
1351 if (I->second)
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001352 return;
1353
1354 // We need a label after this instruction.
1355 if (!PrevLabel) {
1356 PrevLabel = MMI->getContext().CreateTempSymbol();
1357 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel3ebd8932010-04-08 16:50:29 +00001358 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001359 I->second = PrevLabel;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001360}
1361
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001362// Each LexicalScope has first instruction and last instruction to mark
1363// beginning and end of a scope respectively. Create an inverse map that list
1364// scopes starts (and ends) with an instruction. One instruction may start (or
1365// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patel359b0132010-04-08 18:43:56 +00001366void DwarfDebug::identifyScopeMarkers() {
Devang Patel7e623022011-08-10 20:55:27 +00001367 SmallVector<LexicalScope *, 4> WorkList;
1368 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel7771b7c2010-01-20 02:05:23 +00001369 while (!WorkList.empty()) {
Devang Patel7e623022011-08-10 20:55:27 +00001370 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001371
Craig Topper977e9cd2013-07-03 04:24:43 +00001372 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001373 if (!Children.empty())
Benjamin Kramer15596c72014-03-07 19:09:39 +00001374 WorkList.append(Children.begin(), Children.end());
Devang Patel7771b7c2010-01-20 02:05:23 +00001375
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001376 if (S->isAbstractScope())
1377 continue;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001378
Benjamin Kramer15596c72014-03-07 19:09:39 +00001379 for (const InsnRange &R : S->getRanges()) {
1380 assert(R.first && "InsnRange does not have first instruction!");
1381 assert(R.second && "InsnRange does not have second instruction!");
1382 requestLabelBeforeInsn(R.first);
1383 requestLabelAfterInsn(R.second);
Devang Patel6c74a872010-04-27 19:46:33 +00001384 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001385 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001386}
1387
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001388// Gather pre-function debug information. Assumes being called immediately
1389// after the function entry point has been emitted.
Chris Lattner76555b52010-01-26 23:18:02 +00001390void DwarfDebug::beginFunction(const MachineFunction *MF) {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001391 CurFn = MF;
Eric Christopherfedfa442013-11-01 23:14:17 +00001392
1393 // If there's no debug info for the function we're not going to do anything.
1394 if (!MMI->hasDebugInfo())
1395 return;
1396
1397 // Grab the lexical scopes for the function, if we don't have any of those
1398 // then we're not going to be able to do anything.
Devang Patel7e623022011-08-10 20:55:27 +00001399 LScopes.initialize(*MF);
Eric Christopher384f3fe2014-03-20 19:16:16 +00001400 if (LScopes.empty())
Eric Christopherfedfa442013-11-01 23:14:17 +00001401 return;
1402
1403 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1404
1405 // Make sure that each lexical scope will have a begin/end label.
Devang Patel7e623022011-08-10 20:55:27 +00001406 identifyScopeMarkers();
Devang Patel4598eb62009-10-06 18:37:31 +00001407
Eric Christopher4287a492013-12-09 23:57:44 +00001408 // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function
Eric Christopherfedfa442013-11-01 23:14:17 +00001409 // belongs to so that we add to the correct per-cu line table in the
1410 // non-asm case.
Manman Ren4e042a62013-02-05 21:52:47 +00001411 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Eric Christopher4287a492013-12-09 23:57:44 +00001412 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Manman Ren4e042a62013-02-05 21:52:47 +00001413 assert(TheCU && "Unable to find compile unit!");
Rafael Espindolab4eec1d2014-02-05 18:00:21 +00001414 if (Asm->OutStreamer.hasRawTextSupport())
1415 // Use a single line table if we are generating assembly.
Manman Ren9d4c7352013-05-21 00:57:22 +00001416 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1417 else
1418 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
Manman Ren4e042a62013-02-05 21:52:47 +00001419
Eric Christopherfedfa442013-11-01 23:14:17 +00001420 // Emit a label for the function so that we have a beginning address.
1421 FunctionBeginSym = Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber());
Bill Wendling2b128d72009-05-20 23:19:06 +00001422 // Assumes in correct section after the entry point.
Devang Patel6c74a872010-04-27 19:46:33 +00001423 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendling2b128d72009-05-20 23:19:06 +00001424
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001425 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001426 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Eric Christopherfedfa442013-11-01 23:14:17 +00001427 std::vector<const MDNode *> LiveUserVar(TRI->getNumRegs());
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001428
Eric Christopherfedfa442013-11-01 23:14:17 +00001429 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); I != E;
1430 ++I) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001431 bool AtBlockEntry = true;
Devang Patel002d54d2010-05-26 19:37:24 +00001432 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1433 II != IE; ++II) {
1434 const MachineInstr *MI = II;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001435
Devang Patel002d54d2010-05-26 19:37:24 +00001436 if (MI->isDebugValue()) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001437 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001438
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001439 // Keep track of user variables.
Adrian Prantl7f487772014-04-10 17:39:48 +00001440 const MDNode *Var = MI->getDebugVariable();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001441
1442 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001443 if (isDbgValueInDefinedReg(MI))
1444 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1445
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001446 // Check the history of this variable.
Eric Christopherfedfa442013-11-01 23:14:17 +00001447 SmallVectorImpl<const MachineInstr *> &History = DbgValues[Var];
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001448 if (History.empty()) {
1449 UserVariables.push_back(Var);
1450 // The first mention of a function argument gets the FunctionBeginSym
1451 // label, so arguments are visible when breaking at function entry.
1452 DIVariable DV(Var);
Manman Ren7504ed42013-07-08 18:33:29 +00001453 if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
David Blaikie5af2aca2013-11-18 23:57:26 +00001454 getDISubprogram(DV.getContext()).describes(MF->getFunction()))
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001455 LabelsBeforeInsn[MI] = FunctionBeginSym;
1456 } else {
1457 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1458 const MachineInstr *Prev = History.back();
1459 if (Prev->isDebugValue()) {
1460 // Coalesce identical entries at the end of History.
1461 if (History.size() >= 2 &&
Devang Patelb7a328e2011-07-07 00:14:27 +00001462 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher85a495e2012-10-08 20:48:49 +00001463 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopherfedfa442013-11-01 23:14:17 +00001464 << "\t" << *Prev << "\t"
1465 << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001466 History.pop_back();
Devang Patelb7a328e2011-07-07 00:14:27 +00001467 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001468
1469 // Terminate old register assignments that don't reach MI;
1470 MachineFunction::const_iterator PrevMBB = Prev->getParent();
Benjamin Kramerb6d0bd42014-03-02 12:27:27 +00001471 if (PrevMBB != I && (!AtBlockEntry || std::next(PrevMBB) != I) &&
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001472 isDbgValueInDefinedReg(Prev)) {
1473 // Previous register assignment needs to terminate at the end of
1474 // its basic block.
1475 MachineBasicBlock::const_iterator LastMI =
Eric Christopherfedfa442013-11-01 23:14:17 +00001476 PrevMBB->getLastNonDebugInstr();
Devang Patelb7a328e2011-07-07 00:14:27 +00001477 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001478 // Drop DBG_VALUE for empty range.
Eric Christopher85a495e2012-10-08 20:48:49 +00001479 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Eric Christopherfedfa442013-11-01 23:14:17 +00001480 << "\t" << *Prev << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001481 History.pop_back();
Benjamin Kramerb6d0bd42014-03-02 12:27:27 +00001482 } else if (std::next(PrevMBB) != PrevMBB->getParent()->end())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001483 // Terminate after LastMI.
1484 History.push_back(LastMI);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001485 }
1486 }
1487 }
1488 History.push_back(MI);
Devang Patel002d54d2010-05-26 19:37:24 +00001489 } else {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001490 // Not a DBG_VALUE instruction.
Rafael Espindolab1f25f12014-03-07 06:08:31 +00001491 if (!MI->isPosition())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001492 AtBlockEntry = false;
1493
Eric Christopher133195782012-10-04 20:46:14 +00001494 // First known non-DBG_VALUE and non-frame setup location marks
1495 // the beginning of the function body.
1496 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1497 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel34a66202011-05-11 19:22:19 +00001498 PrologEndLoc = MI->getDebugLoc();
1499
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001500 // Check if the instruction clobbers any registers with debug vars.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001501 for (const MachineOperand &MO : MI->operands()) {
1502 if (!MO.isReg() || !MO.isDef() || !MO.getReg())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001503 continue;
Benjamin Kramer15596c72014-03-07 19:09:39 +00001504 for (MCRegAliasIterator AI(MO.getReg(), TRI, true); AI.isValid();
Eric Christopherfedfa442013-11-01 23:14:17 +00001505 ++AI) {
Jakob Stoklund Olesen54038d72012-06-01 23:28:30 +00001506 unsigned Reg = *AI;
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001507 const MDNode *Var = LiveUserVar[Reg];
1508 if (!Var)
1509 continue;
1510 // Reg is now clobbered.
Craig Topper353eda42014-04-24 06:44:33 +00001511 LiveUserVar[Reg] = nullptr;
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001512
1513 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001514 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1515 if (HistI == DbgValues.end())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001516 continue;
Eric Christopherfedfa442013-11-01 23:14:17 +00001517 SmallVectorImpl<const MachineInstr *> &History = HistI->second;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001518 if (History.empty())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001519 continue;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001520 const MachineInstr *Prev = History.back();
1521 // Sanity-check: Register assignments are terminated at the end of
1522 // their block.
1523 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1524 continue;
1525 // Is the variable still in Reg?
1526 if (!isDbgValueInDefinedReg(Prev) ||
1527 Prev->getOperand(0).getReg() != Reg)
1528 continue;
1529 // Var is clobbered. Make sure the next instruction gets a label.
1530 History.push_back(MI);
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001531 }
1532 }
Devang Patel002d54d2010-05-26 19:37:24 +00001533 }
Devang Patel002d54d2010-05-26 19:37:24 +00001534 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001535 }
1536
Benjamin Kramer15596c72014-03-07 19:09:39 +00001537 for (auto &I : DbgValues) {
1538 SmallVectorImpl<const MachineInstr *> &History = I.second;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001539 if (History.empty())
1540 continue;
1541
1542 // Make sure the final register assignments are terminated.
1543 const MachineInstr *Prev = History.back();
1544 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1545 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher6a841382012-11-19 22:42:10 +00001546 MachineBasicBlock::const_iterator LastMI =
Eric Christopherfedfa442013-11-01 23:14:17 +00001547 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001548 if (LastMI == PrevMBB->end())
1549 // Drop DBG_VALUE for empty range.
1550 History.pop_back();
David Blaikieea2605d2013-06-20 00:25:24 +00001551 else if (PrevMBB != &PrevMBB->getParent()->back()) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001552 // Terminate after LastMI.
1553 History.push_back(LastMI);
1554 }
1555 }
1556 // Request labels for the full history.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001557 for (const MachineInstr *MI : History) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001558 if (MI->isDebugValue())
1559 requestLabelBeforeInsn(MI);
1560 else
1561 requestLabelAfterInsn(MI);
1562 }
1563 }
Devang Patel002d54d2010-05-26 19:37:24 +00001564
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001565 PrevInstLoc = DebugLoc();
Devang Patel002d54d2010-05-26 19:37:24 +00001566 PrevLabel = FunctionBeginSym;
Devang Patel34a66202011-05-11 19:22:19 +00001567
1568 // Record beginning of function.
1569 if (!PrologEndLoc.isUnknown()) {
Eric Christopherfedfa442013-11-01 23:14:17 +00001570 DebugLoc FnStartDL =
Timur Iskhodzhanovf166f6c2014-01-30 01:39:17 +00001571 PrologEndLoc.getFnDebugLoc(MF->getFunction()->getContext());
Eric Christopherfedfa442013-11-01 23:14:17 +00001572 recordSourceLine(
1573 FnStartDL.getLine(), FnStartDL.getCol(),
1574 FnStartDL.getScope(MF->getFunction()->getContext()),
1575 // We'd like to list the prologue as "not statements" but GDB behaves
1576 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
1577 DWARF2_FLAG_IS_STMT);
Devang Patel34a66202011-05-11 19:22:19 +00001578 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001579}
1580
David Blaikieafd2c6b2014-04-22 05:41:06 +00001581void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1582 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1583 DIVariable DV = Var->getVariable();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001584 // Variables with positive arg numbers are parameters.
1585 if (unsigned ArgNum = DV.getArgNumber()) {
1586 // Keep all parameters in order at the start of the variable list to ensure
1587 // function types are correct (no out-of-order parameters)
1588 //
1589 // This could be improved by only doing it for optimized builds (unoptimized
1590 // builds have the right order to begin with), searching from the back (this
1591 // would catch the unoptimized case quickly), or doing a binary search
1592 // rather than linear search.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001593 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001594 while (I != Vars.end()) {
David Blaikieafd2c6b2014-04-22 05:41:06 +00001595 unsigned CurNum = (*I)->getVariable().getArgNumber();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001596 // A local (non-parameter) variable has been found, insert immediately
1597 // before it.
1598 if (CurNum == 0)
1599 break;
1600 // A later indexed parameter has been found, insert immediately before it.
David Blaikieb272a752013-06-06 22:28:26 +00001601 if (CurNum > ArgNum)
David Blaikie36d5d2f2013-06-06 21:04:51 +00001602 break;
David Blaikieb272a752013-06-06 22:28:26 +00001603 ++I;
David Blaikie6f1a8062013-06-05 05:39:59 +00001604 }
David Blaikieafd2c6b2014-04-22 05:41:06 +00001605 Vars.insert(I, Var);
1606 return;
David Blaikie6f1a8062013-06-05 05:39:59 +00001607 }
1608
David Blaikieafd2c6b2014-04-22 05:41:06 +00001609 Vars.push_back(Var);
Devang Patel7e623022011-08-10 20:55:27 +00001610}
1611
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001612// Gather and emit post-function debug information.
NAKAMURA Takumib9271612013-12-03 13:15:54 +00001613void DwarfDebug::endFunction(const MachineFunction *MF) {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001614 // Every beginFunction(MF) call should be followed by an endFunction(MF) call,
1615 // though the beginFunction may not be called at all.
1616 // We should handle both cases.
Craig Topper353eda42014-04-24 06:44:33 +00001617 if (!CurFn)
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001618 CurFn = MF;
1619 else
1620 assert(CurFn == MF);
1621 assert(CurFn != 0);
1622
1623 if (!MMI->hasDebugInfo() || LScopes.empty()) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00001624 // If we don't have a lexical scope for this function then there will
1625 // be a hole in the range information. Keep note of this by setting the
1626 // previously used section to nullptr.
1627 PrevSection = nullptr;
1628 PrevCU = nullptr;
Craig Topper353eda42014-04-24 06:44:33 +00001629 CurFn = nullptr;
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001630 return;
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001631 }
Devang Patel2904aa92009-11-12 19:02:56 +00001632
Devang Patel7e623022011-08-10 20:55:27 +00001633 // Define end label for subprogram.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001634 FunctionEndSym = Asm->GetTempSymbol("func_end", Asm->getFunctionNumber());
Devang Patel7e623022011-08-10 20:55:27 +00001635 // Assumes in correct section after the entry point.
1636 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Eric Christopher1a972152014-01-29 23:05:43 +00001637
Eric Christopher4287a492013-12-09 23:57:44 +00001638 // Set DwarfDwarfCompileUnitID in MCContext to default value.
Manman Ren4e042a62013-02-05 21:52:47 +00001639 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher6a841382012-11-19 22:42:10 +00001640
Devang Patel7e623022011-08-10 20:55:27 +00001641 SmallPtrSet<const MDNode *, 16> ProcessedVars;
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001642 collectVariableInfo(ProcessedVars);
Eric Christopher6a841382012-11-19 22:42:10 +00001643
Devang Patel3acc70e2011-08-15 22:04:40 +00001644 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
David Blaikief9b6a552014-04-22 22:39:41 +00001645 DwarfCompileUnit &TheCU = *SPMap.lookup(FnScope->getScopeNode());
Devang Patel3acc70e2011-08-15 22:04:40 +00001646
Devang Patel7e623022011-08-10 20:55:27 +00001647 // Construct abstract scopes.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001648 for (LexicalScope *AScope : LScopes.getAbstractScopesList()) {
Devang Patel44403472011-08-12 18:10:19 +00001649 DISubprogram SP(AScope->getScopeNode());
Manman Ren7504ed42013-07-08 18:33:29 +00001650 if (SP.isSubprogram()) {
Devang Patel7e623022011-08-10 20:55:27 +00001651 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001652 DIArray Variables = SP.getVariables();
1653 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1654 DIVariable DV(Variables.getElement(i));
Manman Ren7504ed42013-07-08 18:33:29 +00001655 if (!DV || !DV.isVariable() || !ProcessedVars.insert(DV))
Devang Patel59e27c52011-08-19 23:28:12 +00001656 continue;
Alexey Samsonov39602782012-07-06 08:45:08 +00001657 // Check that DbgVariable for DV wasn't created earlier, when
1658 // findAbstractVariable() was called for inlined instance of DV.
1659 LLVMContext &Ctx = DV->getContext();
1660 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1661 if (AbstractVariables.lookup(CleanDV))
1662 continue;
Devang Patel59e27c52011-08-19 23:28:12 +00001663 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
Craig Topper353eda42014-04-24 06:44:33 +00001664 addScopeVariable(Scope, new DbgVariable(DV, nullptr, this));
Devang Patel5c0f85c2010-06-25 22:07:34 +00001665 }
1666 }
Devang Patel44403472011-08-12 18:10:19 +00001667 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Manman Ren4213c392013-05-29 17:16:59 +00001668 constructScopeDIE(TheCU, AScope);
Bill Wendling2b128d72009-05-20 23:19:06 +00001669 }
Eric Christopher6a841382012-11-19 22:42:10 +00001670
David Blaikie65a74662014-04-25 18:26:14 +00001671 DIE &CurFnDIE = *constructScopeDIE(TheCU, FnScope);
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001672 if (!CurFn->getTarget().Options.DisableFramePointerElim(*CurFn))
David Blaikief9b6a552014-04-22 22:39:41 +00001673 TheCU.addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Patel3acc70e2011-08-15 22:04:40 +00001674
Eric Christopher1a972152014-01-29 23:05:43 +00001675 // Add the range of this function to the list of ranges for the CU.
1676 RangeSpan Span(FunctionBeginSym, FunctionEndSym);
David Blaikief9b6a552014-04-22 22:39:41 +00001677 TheCU.addRange(std::move(Span));
Eric Christopher384f3fe2014-03-20 19:16:16 +00001678 PrevSection = Asm->getCurrentSection();
David Blaikief9b6a552014-04-22 22:39:41 +00001679 PrevCU = &TheCU;
Eric Christopher1a972152014-01-29 23:05:43 +00001680
Bill Wendling2b128d72009-05-20 23:19:06 +00001681 // Clear debug info
David Blaikieafd2c6b2014-04-22 05:41:06 +00001682 for (auto &I : ScopeVariables)
1683 DeleteContainerPointers(I.second);
Devang Patel7e623022011-08-10 20:55:27 +00001684 ScopeVariables.clear();
David Blaikieafd2c6b2014-04-22 05:41:06 +00001685 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001686 UserVariables.clear();
1687 DbgValues.clear();
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00001688 AbstractVariables.clear();
Devang Patel6c74a872010-04-27 19:46:33 +00001689 LabelsBeforeInsn.clear();
1690 LabelsAfterInsn.clear();
Craig Topper353eda42014-04-24 06:44:33 +00001691 PrevLabel = nullptr;
1692 CurFn = nullptr;
Bill Wendling2b128d72009-05-20 23:19:06 +00001693}
1694
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001695// Register a source line with debug info. Returns the unique label that was
1696// emitted and which provides correspondence to the source line list.
Devang Patel34a66202011-05-11 19:22:19 +00001697void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1698 unsigned Flags) {
Devang Patel2d9caf92009-11-25 17:36:49 +00001699 StringRef Fn;
Devang Patele01b75c2011-03-24 20:30:50 +00001700 StringRef Dir;
Dan Gohman50849c62010-05-05 23:41:32 +00001701 unsigned Src = 1;
Diego Novillo282450d2014-03-03 18:53:17 +00001702 unsigned Discriminator = 0;
Dan Gohman50849c62010-05-05 23:41:32 +00001703 if (S) {
1704 DIDescriptor Scope(S);
Devang Patel2089d162009-10-05 18:03:19 +00001705
Dan Gohman50849c62010-05-05 23:41:32 +00001706 if (Scope.isCompileUnit()) {
1707 DICompileUnit CU(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001708 Fn = CU.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001709 Dir = CU.getDirectory();
Devang Patelc4b69052010-10-28 17:30:52 +00001710 } else if (Scope.isFile()) {
1711 DIFile F(S);
Devang Patelc4b69052010-10-28 17:30:52 +00001712 Fn = F.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001713 Dir = F.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001714 } else if (Scope.isSubprogram()) {
1715 DISubprogram SP(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001716 Fn = SP.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001717 Dir = SP.getDirectory();
Eric Christopher6647b832011-10-11 22:59:11 +00001718 } else if (Scope.isLexicalBlockFile()) {
1719 DILexicalBlockFile DBF(S);
1720 Fn = DBF.getFilename();
1721 Dir = DBF.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001722 } else if (Scope.isLexicalBlock()) {
1723 DILexicalBlock DB(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001724 Fn = DB.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001725 Dir = DB.getDirectory();
Diego Novillo282450d2014-03-03 18:53:17 +00001726 Discriminator = DB.getDiscriminator();
Dan Gohman50849c62010-05-05 23:41:32 +00001727 } else
Craig Topperee4dab52012-02-05 08:31:47 +00001728 llvm_unreachable("Unexpected scope info");
Dan Gohman50849c62010-05-05 23:41:32 +00001729
David Blaikie0e8d4012014-03-17 23:53:25 +00001730 unsigned CUID = Asm->OutStreamer.getContext().getDwarfCompileUnitID();
David Blaikiec33b3cd2014-04-22 21:27:37 +00001731 Src = static_cast<DwarfCompileUnit &>(*InfoHolder.getUnits()[CUID])
1732 .getOrCreateSourceID(Fn, Dir);
Dan Gohman50849c62010-05-05 23:41:32 +00001733 }
Diego Novillo282450d2014-03-03 18:53:17 +00001734 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0,
1735 Discriminator, Fn);
Bill Wendling2b128d72009-05-20 23:19:06 +00001736}
1737
Bill Wendling806535f2009-05-20 23:22:40 +00001738//===----------------------------------------------------------------------===//
1739// Emit Methods
1740//===----------------------------------------------------------------------===//
1741
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001742// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001743void DwarfDebug::emitSectionLabels() {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001744 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00001745
Bill Wendling480ff322009-05-20 23:21:38 +00001746 // Dwarf sections base addresses.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001747 DwarfInfoSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001748 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Eric Christopherd8667202013-12-30 17:22:27 +00001749 if (useSplitDwarf())
1750 DwarfInfoDWOSectionSym =
1751 emitSectionSym(Asm, TLOF.getDwarfInfoDWOSection(), "section_info_dwo");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001752 DwarfAbbrevSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001753 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher3c5a1912012-12-19 22:02:53 +00001754 if (useSplitDwarf())
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001755 DwarfAbbrevDWOSectionSym = emitSectionSym(
1756 Asm, TLOF.getDwarfAbbrevDWOSection(), "section_abbrev_dwo");
David Blaikie20474102014-02-25 22:46:44 +00001757 if (GenerateARangeSection)
1758 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001759
Eric Christopher74804332013-02-07 21:19:50 +00001760 DwarfLineSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001761 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher261d2342013-09-23 20:55:35 +00001762 if (GenerateGnuPubSections) {
Eric Christopher39eebfa2013-09-30 23:14:16 +00001763 DwarfGnuPubNamesSectionSym =
1764 emitSectionSym(Asm, TLOF.getDwarfGnuPubNamesSection());
1765 DwarfGnuPubTypesSectionSym =
1766 emitSectionSym(Asm, TLOF.getDwarfGnuPubTypesSection());
Eric Christopher261d2342013-09-23 20:55:35 +00001767 } else if (HasDwarfPubSections) {
1768 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
1769 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001770 }
Eric Christopherdd1a0122013-09-13 00:35:05 +00001771
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001772 DwarfStrSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001773 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001774 if (useSplitDwarf()) {
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001775 DwarfStrDWOSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001776 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001777 DwarfAddrSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001778 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
David Blaikiee12ab122014-04-01 16:09:49 +00001779 DwarfDebugLocSectionSym =
David Blaikie9c550ac2014-03-25 01:44:02 +00001780 emitSectionSym(Asm, TLOF.getDwarfLocDWOSection(), "skel_loc");
1781 } else
1782 DwarfDebugLocSectionSym =
1783 emitSectionSym(Asm, TLOF.getDwarfLocSection(), "section_debug_loc");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001784 DwarfDebugRangeSectionSym =
1785 emitSectionSym(Asm, TLOF.getDwarfRangesSection(), "debug_range");
Bill Wendling480ff322009-05-20 23:21:38 +00001786}
1787
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001788// Recursively emits a debug information entry.
David Blaikieb8184182014-04-14 22:45:02 +00001789void DwarfDebug::emitDIE(DIE &Die) {
Bill Wendling480ff322009-05-20 23:21:38 +00001790 // Get the abbreviation for this DIE.
David Blaikieb8184182014-04-14 22:45:02 +00001791 const DIEAbbrev &Abbrev = Die.getAbbrev();
Bill Wendling480ff322009-05-20 23:21:38 +00001792
Bill Wendling480ff322009-05-20 23:21:38 +00001793 // Emit the code (index) for the abbreviation.
Chris Lattner7bde8c02010-04-04 18:52:31 +00001794 if (Asm->isVerbose())
David Blaikieff3ab2c2013-12-05 01:01:41 +00001795 Asm->OutStreamer.AddComment("Abbrev [" + Twine(Abbrev.getNumber()) +
David Blaikieb8184182014-04-14 22:45:02 +00001796 "] 0x" + Twine::utohexstr(Die.getOffset()) +
1797 ":0x" + Twine::utohexstr(Die.getSize()) + " " +
David Blaikieff3ab2c2013-12-05 01:01:41 +00001798 dwarf::TagString(Abbrev.getTag()));
1799 Asm->EmitULEB128(Abbrev.getNumber());
Bill Wendling480ff322009-05-20 23:21:38 +00001800
David Blaikieb8184182014-04-14 22:45:02 +00001801 const SmallVectorImpl<DIEValue *> &Values = Die.getValues();
David Blaikieff3ab2c2013-12-05 01:01:41 +00001802 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
Bill Wendling480ff322009-05-20 23:21:38 +00001803
1804 // Emit the DIE attribute values.
1805 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
David Blaikief2443192013-10-21 17:28:37 +00001806 dwarf::Attribute Attr = AbbrevData[i].getAttribute();
1807 dwarf::Form Form = AbbrevData[i].getForm();
Bill Wendling480ff322009-05-20 23:21:38 +00001808 assert(Form && "Too many attributes for DIE (check abbreviation)");
1809
Eric Christopher13a1bb32014-03-06 00:00:49 +00001810 if (Asm->isVerbose()) {
Chris Lattner5adf9872010-01-24 18:54:17 +00001811 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Eric Christopher13a1bb32014-03-06 00:00:49 +00001812 if (Attr == dwarf::DW_AT_accessibility)
1813 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(
1814 cast<DIEInteger>(Values[i])->getValue()));
1815 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001816
Eric Christopherdd508382014-03-06 00:00:56 +00001817 // Emit an attribute using the defined form.
1818 Values[i]->EmitValue(Asm, Form);
Bill Wendling480ff322009-05-20 23:21:38 +00001819 }
1820
1821 // Emit the DIE children if any.
Eric Christophere8f10722014-03-05 01:44:58 +00001822 if (Abbrev.hasChildren()) {
David Blaikieb8184182014-04-14 22:45:02 +00001823 for (auto &Child : Die.getChildren())
1824 emitDIE(*Child);
Bill Wendling480ff322009-05-20 23:21:38 +00001825
David Blaikie155f8812013-12-04 21:51:05 +00001826 Asm->OutStreamer.AddComment("End Of Children Mark");
Chris Lattner566cae92010-03-09 23:52:58 +00001827 Asm->EmitInt8(0);
Bill Wendling480ff322009-05-20 23:21:38 +00001828 }
1829}
1830
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001831// Emit the debug info section.
1832void DwarfDebug::emitDebugInfo() {
Eric Christopherf8194852013-12-05 18:06:10 +00001833 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Eric Christophera2de8262012-12-15 00:04:07 +00001834
David Blaikief72ed5f2014-03-24 20:31:01 +00001835 Holder.emitUnits(this, DwarfAbbrevSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001836}
1837
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001838// Emit the abbreviation section.
Eric Christopher38371952012-11-20 23:30:11 +00001839void DwarfDebug::emitAbbreviations() {
Eric Christopherf8194852013-12-05 18:06:10 +00001840 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
David Blaikie0504cda2013-12-05 07:43:55 +00001841
1842 Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
Eric Christopher3c5a1912012-12-19 22:02:53 +00001843}
Bill Wendling480ff322009-05-20 23:21:38 +00001844
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001845// Emit the last address of the section and the end of the line matrix.
Devang Patel930143b2009-11-21 02:48:08 +00001846void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling480ff322009-05-20 23:21:38 +00001847 // Define last address of section.
Chris Lattner566cae92010-03-09 23:52:58 +00001848 Asm->OutStreamer.AddComment("Extended Op");
1849 Asm->EmitInt8(0);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001850
Chris Lattner566cae92010-03-09 23:52:58 +00001851 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth5da3f052012-11-01 09:14:31 +00001852 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner566cae92010-03-09 23:52:58 +00001853 Asm->OutStreamer.AddComment("DW_LNE_set_address");
1854 Asm->EmitInt8(dwarf::DW_LNE_set_address);
1855
1856 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerb245dfb2010-03-10 01:17:49 +00001857
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001858 Asm->OutStreamer.EmitSymbolValue(
1859 Asm->GetTempSymbol("section_end", SectionEnd),
1860 Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00001861
1862 // Mark end of matrix.
Chris Lattner566cae92010-03-09 23:52:58 +00001863 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1864 Asm->EmitInt8(0);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00001865 Asm->EmitInt8(1);
Chris Lattnerfa823552010-01-22 23:18:42 +00001866 Asm->EmitInt8(1);
Bill Wendling480ff322009-05-20 23:21:38 +00001867}
1868
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001869// Emit visible names into a hashed accelerator table section.
Eric Christopher4996c702011-11-07 09:24:32 +00001870void DwarfDebug::emitAccelNames() {
David Blaikie27931a42014-04-23 23:46:25 +00001871 AccelNames.FinalizeTable(Asm, "Names");
Eric Christopher4996c702011-11-07 09:24:32 +00001872 Asm->OutStreamer.SwitchSection(
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001873 Asm->getObjFileLowering().getDwarfAccelNamesSection());
Eric Christopher4996c702011-11-07 09:24:32 +00001874 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
1875 Asm->OutStreamer.EmitLabel(SectionBegin);
1876
1877 // Emit the full data.
David Blaikie27931a42014-04-23 23:46:25 +00001878 AccelNames.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00001879}
1880
Eric Christopher48fef592012-12-20 21:58:40 +00001881// Emit objective C classes and categories into a hashed accelerator table
1882// section.
Eric Christopher4996c702011-11-07 09:24:32 +00001883void DwarfDebug::emitAccelObjC() {
David Blaikie0ee82b92014-04-24 00:53:32 +00001884 AccelObjC.FinalizeTable(Asm, "ObjC");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001885 Asm->OutStreamer.SwitchSection(
1886 Asm->getObjFileLowering().getDwarfAccelObjCSection());
Eric Christopher4996c702011-11-07 09:24:32 +00001887 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
1888 Asm->OutStreamer.EmitLabel(SectionBegin);
1889
1890 // Emit the full data.
David Blaikie0ee82b92014-04-24 00:53:32 +00001891 AccelObjC.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00001892}
1893
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001894// Emit namespace dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00001895void DwarfDebug::emitAccelNamespaces() {
David Blaikieecf04152014-04-24 01:02:42 +00001896 AccelNamespace.FinalizeTable(Asm, "namespac");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001897 Asm->OutStreamer.SwitchSection(
1898 Asm->getObjFileLowering().getDwarfAccelNamespaceSection());
Eric Christopher4996c702011-11-07 09:24:32 +00001899 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
1900 Asm->OutStreamer.EmitLabel(SectionBegin);
1901
1902 // Emit the full data.
David Blaikieecf04152014-04-24 01:02:42 +00001903 AccelNamespace.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00001904}
1905
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001906// Emit type dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00001907void DwarfDebug::emitAccelTypes() {
Eric Christopher4996c702011-11-07 09:24:32 +00001908
David Blaikie18d33752014-04-24 01:23:49 +00001909 AccelTypes.FinalizeTable(Asm, "types");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001910 Asm->OutStreamer.SwitchSection(
1911 Asm->getObjFileLowering().getDwarfAccelTypesSection());
Eric Christopher4996c702011-11-07 09:24:32 +00001912 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
1913 Asm->OutStreamer.EmitLabel(SectionBegin);
1914
1915 // Emit the full data.
David Blaikie18d33752014-04-24 01:23:49 +00001916 AccelTypes.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00001917}
1918
Eric Christopherdd1a0122013-09-13 00:35:05 +00001919// Public name handling.
1920// The format for the various pubnames:
1921//
1922// dwarf pubnames - offset/name pairs where the offset is the offset into the CU
1923// for the DIE that is named.
1924//
1925// gnu pubnames - offset/index value/name tuples where the offset is the offset
1926// into the CU and the index value is computed according to the type of value
1927// for the DIE that is named.
1928//
1929// For type units the offset is the offset of the skeleton DIE. For split dwarf
1930// it's the offset within the debug_info/debug_types dwo section, however, the
1931// reference in the pubname header doesn't change.
1932
1933/// computeIndexValue - Compute the gdb index value for the DIE and CU.
Eric Christophera5a79422013-12-09 23:32:48 +00001934static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU,
Eric Christopher0fe676a2013-11-21 00:48:22 +00001935 const DIE *Die) {
Eric Christopherd2b497b2013-10-16 01:37:49 +00001936 dwarf::GDBIndexEntryLinkage Linkage = dwarf::GIEL_STATIC;
1937
1938 // We could have a specification DIE that has our most of our knowledge,
1939 // look for that now.
1940 DIEValue *SpecVal = Die->findAttribute(dwarf::DW_AT_specification);
1941 if (SpecVal) {
1942 DIE *SpecDIE = cast<DIEEntry>(SpecVal)->getEntry();
1943 if (SpecDIE->findAttribute(dwarf::DW_AT_external))
1944 Linkage = dwarf::GIEL_EXTERNAL;
1945 } else if (Die->findAttribute(dwarf::DW_AT_external))
1946 Linkage = dwarf::GIEL_EXTERNAL;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001947
1948 switch (Die->getTag()) {
1949 case dwarf::DW_TAG_class_type:
1950 case dwarf::DW_TAG_structure_type:
1951 case dwarf::DW_TAG_union_type:
1952 case dwarf::DW_TAG_enumeration_type:
Eric Christopher261d2342013-09-23 20:55:35 +00001953 return dwarf::PubIndexEntryDescriptor(
1954 dwarf::GIEK_TYPE, CU->getLanguage() != dwarf::DW_LANG_C_plus_plus
1955 ? dwarf::GIEL_STATIC
1956 : dwarf::GIEL_EXTERNAL);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001957 case dwarf::DW_TAG_typedef:
1958 case dwarf::DW_TAG_base_type:
1959 case dwarf::DW_TAG_subrange_type:
David Blaikie8dec4072013-09-19 20:40:26 +00001960 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE, dwarf::GIEL_STATIC);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001961 case dwarf::DW_TAG_namespace:
David Blaikie8dec4072013-09-19 20:40:26 +00001962 return dwarf::GIEK_TYPE;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001963 case dwarf::DW_TAG_subprogram:
Eric Christopherccac5c42013-09-23 22:59:14 +00001964 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_FUNCTION, Linkage);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001965 case dwarf::DW_TAG_constant:
1966 case dwarf::DW_TAG_variable:
Eric Christopherccac5c42013-09-23 22:59:14 +00001967 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, Linkage);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001968 case dwarf::DW_TAG_enumerator:
David Blaikie8dec4072013-09-19 20:40:26 +00001969 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE,
1970 dwarf::GIEL_STATIC);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001971 default:
David Blaikie8dec4072013-09-19 20:40:26 +00001972 return dwarf::GIEK_NONE;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001973 }
Eric Christopherdd1a0122013-09-13 00:35:05 +00001974}
1975
Eric Christopher5f93bb92013-09-09 20:03:17 +00001976/// emitDebugPubNames - Emit visible names into a debug pubnames section.
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001977///
Eric Christopherdd1a0122013-09-13 00:35:05 +00001978void DwarfDebug::emitDebugPubNames(bool GnuStyle) {
Eric Christopherdd1a0122013-09-13 00:35:05 +00001979 const MCSection *PSec =
1980 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection()
1981 : Asm->getObjFileLowering().getDwarfPubNamesSection();
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001982
David Blaikie0f55e832014-03-11 23:18:15 +00001983 emitDebugPubSection(GnuStyle, PSec, "Names", &DwarfUnit::getGlobalNames);
1984}
1985
1986void DwarfDebug::emitDebugPubSection(
1987 bool GnuStyle, const MCSection *PSec, StringRef Name,
1988 const StringMap<const DIE *> &(DwarfUnit::*Accessor)() const) {
David Blaikiec3d9e9e2014-03-06 01:42:00 +00001989 for (const auto &NU : CUMap) {
1990 DwarfCompileUnit *TheU = NU.second;
David Blaikie55bb8ac2014-03-11 23:23:39 +00001991
1992 const auto &Globals = (TheU->*Accessor)();
1993
David Blaikiece2f1cb2014-03-11 23:35:06 +00001994 if (Globals.empty())
1995 continue;
1996
David Blaikiec3d9e9e2014-03-06 01:42:00 +00001997 if (auto Skeleton = static_cast<DwarfCompileUnit *>(TheU->getSkeleton()))
1998 TheU = Skeleton;
David Blaikie2a80e442013-12-02 22:09:48 +00001999 unsigned ID = TheU->getUniqueID();
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002000
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002001 // Start the dwarf pubnames section.
Eric Christopher13b99d22013-09-10 21:49:37 +00002002 Asm->OutStreamer.SwitchSection(PSec);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002003
Eric Christopherdd1a0122013-09-13 00:35:05 +00002004 // Emit the header.
David Blaikie0f55e832014-03-11 23:18:15 +00002005 Asm->OutStreamer.AddComment("Length of Public " + Name + " Info");
2006 MCSymbol *BeginLabel = Asm->GetTempSymbol("pub" + Name + "_begin", ID);
2007 MCSymbol *EndLabel = Asm->GetTempSymbol("pub" + Name + "_end", ID);
David Blaikieb7a1c4d2013-12-04 17:55:41 +00002008 Asm->EmitLabelDifference(EndLabel, BeginLabel, 4);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002009
David Blaikieb7a1c4d2013-12-04 17:55:41 +00002010 Asm->OutStreamer.EmitLabel(BeginLabel);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002011
2012 Asm->OutStreamer.AddComment("DWARF Version");
David Majnemered89b5c2013-08-21 06:13:34 +00002013 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002014
2015 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
David Blaikie7d734602013-12-06 22:33:05 +00002016 Asm->EmitSectionOffset(TheU->getLabelBegin(), TheU->getSectionSym());
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002017
2018 Asm->OutStreamer.AddComment("Compilation Unit Length");
David Blaikie7d734602013-12-06 22:33:05 +00002019 Asm->EmitLabelDifference(TheU->getLabelEnd(), TheU->getLabelBegin(), 4);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002020
Eric Christopherdd1a0122013-09-13 00:35:05 +00002021 // Emit the pubnames for this compilation unit.
David Blaikie55bb8ac2014-03-11 23:23:39 +00002022 for (const auto &GI : Globals) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00002023 const char *Name = GI.getKeyData();
2024 const DIE *Entity = GI.second;
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002025
2026 Asm->OutStreamer.AddComment("DIE offset");
2027 Asm->EmitInt32(Entity->getOffset());
2028
Eric Christopherdd1a0122013-09-13 00:35:05 +00002029 if (GnuStyle) {
David Blaikie2a80e442013-12-02 22:09:48 +00002030 dwarf::PubIndexEntryDescriptor Desc = computeIndexValue(TheU, Entity);
David Blaikied0a869d2013-09-19 22:19:37 +00002031 Asm->OutStreamer.AddComment(
David Blaikieefd0bcb2013-09-20 00:33:15 +00002032 Twine("Kind: ") + dwarf::GDBIndexEntryKindString(Desc.Kind) + ", " +
David Blaikie404d3042013-09-19 23:01:29 +00002033 dwarf::GDBIndexEntryLinkageString(Desc.Linkage));
David Blaikied0a869d2013-09-19 22:19:37 +00002034 Asm->EmitInt8(Desc.toBits());
Eric Christopherdd1a0122013-09-13 00:35:05 +00002035 }
2036
David Blaikie155f8812013-12-04 21:51:05 +00002037 Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer15596c72014-03-07 19:09:39 +00002038 Asm->OutStreamer.EmitBytes(StringRef(Name, GI.getKeyLength() + 1));
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002039 }
2040
2041 Asm->OutStreamer.AddComment("End Mark");
2042 Asm->EmitInt32(0);
David Blaikieb7a1c4d2013-12-04 17:55:41 +00002043 Asm->OutStreamer.EmitLabel(EndLabel);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002044 }
2045}
2046
Eric Christopherdd1a0122013-09-13 00:35:05 +00002047void DwarfDebug::emitDebugPubTypes(bool GnuStyle) {
Eric Christopher261d2342013-09-23 20:55:35 +00002048 const MCSection *PSec =
2049 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
2050 : Asm->getObjFileLowering().getDwarfPubTypesSection();
Eric Christopher8b3737f2013-09-13 00:34:58 +00002051
David Blaikie0f55e832014-03-11 23:18:15 +00002052 emitDebugPubSection(GnuStyle, PSec, "Types", &DwarfUnit::getGlobalTypes);
Devang Patel04d2f2d2009-11-24 01:14:22 +00002053}
2054
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002055// Emit visible names into a debug str section.
2056void DwarfDebug::emitDebugStr() {
Eric Christopherf8194852013-12-05 18:06:10 +00002057 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002058 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2059}
2060
Eric Christopher29e874d2014-03-07 22:40:37 +00002061void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer,
Eric Christopher05135fb2014-03-18 02:18:24 +00002062 const DebugLocEntry &Entry) {
Eric Christopher29e874d2014-03-07 22:40:37 +00002063 DIVariable DV(Entry.getVariable());
2064 if (Entry.isInt()) {
Adrian Prantl1a1647c2014-03-18 02:34:58 +00002065 DIBasicType BTy(resolve(DV.getType()));
Eric Christopher29e874d2014-03-07 22:40:37 +00002066 if (BTy.Verify() && (BTy.getEncoding() == dwarf::DW_ATE_signed ||
2067 BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2068 Streamer.EmitInt8(dwarf::DW_OP_consts, "DW_OP_consts");
2069 Streamer.EmitSLEB128(Entry.getInt());
2070 } else {
2071 Streamer.EmitInt8(dwarf::DW_OP_constu, "DW_OP_constu");
2072 Streamer.EmitULEB128(Entry.getInt());
2073 }
2074 } else if (Entry.isLocation()) {
2075 MachineLocation Loc = Entry.getLoc();
2076 if (!DV.hasComplexAddress())
2077 // Regular entry.
2078 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2079 else {
2080 // Complex address entry.
2081 unsigned N = DV.getNumAddrElements();
2082 unsigned i = 0;
2083 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2084 if (Loc.getOffset()) {
2085 i = 2;
2086 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2087 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
2088 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
2089 Streamer.EmitSLEB128(DV.getAddrElement(1));
2090 } else {
2091 // If first address element is OpPlus then emit
2092 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2093 MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));
2094 Asm->EmitDwarfRegOp(Streamer, TLoc, DV.isIndirect());
2095 i = 2;
2096 }
2097 } else {
2098 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2099 }
2100
2101 // Emit remaining complex address elements.
2102 for (; i < N; ++i) {
2103 uint64_t Element = DV.getAddrElement(i);
2104 if (Element == DIBuilder::OpPlus) {
2105 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
2106 Streamer.EmitULEB128(DV.getAddrElement(++i));
2107 } else if (Element == DIBuilder::OpDeref) {
2108 if (!Loc.isReg())
2109 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
2110 } else
2111 llvm_unreachable("unknown Opcode found in complex address");
2112 }
2113 }
2114 }
2115 // else ... ignore constant fp. There is not any good way to
2116 // to represent them here in dwarf.
2117 // FIXME: ^
2118}
2119
David Blaikie0e84adc2014-04-01 16:17:41 +00002120void DwarfDebug::emitDebugLocEntryLocation(const DebugLocEntry &Entry) {
2121 Asm->OutStreamer.AddComment("Loc expr size");
2122 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2123 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2124 Asm->EmitLabelDifference(end, begin, 2);
2125 Asm->OutStreamer.EmitLabel(begin);
2126 // Emit the entry.
2127 APByteStreamer Streamer(*Asm);
2128 emitDebugLocEntry(Streamer, Entry);
2129 // Close the range.
2130 Asm->OutStreamer.EmitLabel(end);
2131}
2132
Eric Christopher9046f942013-07-02 21:36:07 +00002133// Emit locations into the debug loc section.
Devang Patel930143b2009-11-21 02:48:08 +00002134void DwarfDebug::emitDebugLoc() {
Daniel Dunbarfd95b012011-03-16 22:16:39 +00002135 // Start the dwarf loc section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002136 Asm->OutStreamer.SwitchSection(
David Blaikie94c1d7f2014-04-02 01:50:20 +00002137 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth5da3f052012-11-01 09:14:31 +00002138 unsigned char Size = Asm->getDataLayout().getPointerSize();
David Blaikie84d8e182014-03-24 22:38:38 +00002139 for (const auto &DebugLoc : DotDebugLocEntries) {
David Blaikie0a456de2014-04-02 01:43:18 +00002140 Asm->OutStreamer.EmitLabel(DebugLoc.Label);
2141 for (const auto &Entry : DebugLoc.List) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00002142 // Set up the range. This range is relative to the entry point of the
2143 // compile unit. This is a hard coded 0 for low_pc when we're emitting
2144 // ranges, or the DW_AT_low_pc on the compile unit otherwise.
2145 const DwarfCompileUnit *CU = Entry.getCU();
David Blaikie94c1d7f2014-04-02 01:50:20 +00002146 if (CU->getRanges().size() == 1) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00002147 // Grab the begin symbol from the first range as our base.
2148 const MCSymbol *Base = CU->getRanges()[0].getStart();
2149 Asm->EmitLabelDifference(Entry.getBeginSym(), Base, Size);
2150 Asm->EmitLabelDifference(Entry.getEndSym(), Base, Size);
2151 } else {
2152 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
2153 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
2154 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002155
David Blaikie0e84adc2014-04-01 16:17:41 +00002156 emitDebugLocEntryLocation(Entry);
Devang Patel9fc11702010-05-25 23:40:22 +00002157 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002158 Asm->OutStreamer.EmitIntValue(0, Size);
2159 Asm->OutStreamer.EmitIntValue(0, Size);
2160 }
2161}
2162
2163void DwarfDebug::emitDebugLocDWO() {
2164 Asm->OutStreamer.SwitchSection(
2165 Asm->getObjFileLowering().getDwarfLocDWOSection());
2166 for (const auto &DebugLoc : DotDebugLocEntries) {
2167 Asm->OutStreamer.EmitLabel(DebugLoc.Label);
2168 for (const auto &Entry : DebugLoc.List) {
2169 // Just always use start_length for now - at least that's one address
2170 // rather than two. We could get fancier and try to, say, reuse an
2171 // address we know we've emitted elsewhere (the start of the function?
2172 // The start of the CU or CU subrange that encloses this range?)
2173 Asm->EmitInt8(dwarf::DW_LLE_start_length_entry);
David Blaikied75fb282014-04-23 21:20:10 +00002174 unsigned idx = AddrPool.getIndex(Entry.getBeginSym());
David Blaikie94c1d7f2014-04-02 01:50:20 +00002175 Asm->EmitULEB128(idx);
2176 Asm->EmitLabelDifference(Entry.getEndSym(), Entry.getBeginSym(), 4);
2177
2178 emitDebugLocEntryLocation(Entry);
David Blaikie9c550ac2014-03-25 01:44:02 +00002179 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002180 Asm->EmitInt8(dwarf::DW_LLE_end_of_list_entry);
Devang Patel9fc11702010-05-25 23:40:22 +00002181 }
Bill Wendling480ff322009-05-20 23:21:38 +00002182}
2183
Richard Mitton21101b32013-09-19 23:21:01 +00002184struct ArangeSpan {
2185 const MCSymbol *Start, *End;
2186};
2187
2188// Emit a debug aranges section, containing a CU lookup for any
2189// address we can tie back to a CU.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00002190void DwarfDebug::emitDebugARanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002191 // Start the dwarf aranges section.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002192 Asm->OutStreamer.SwitchSection(
2193 Asm->getObjFileLowering().getDwarfARangesSection());
Richard Mitton21101b32013-09-19 23:21:01 +00002194
Eric Christopher4287a492013-12-09 23:57:44 +00002195 typedef DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan> > SpansType;
Richard Mitton21101b32013-09-19 23:21:01 +00002196
2197 SpansType Spans;
2198
2199 // Build a list of sections used.
2200 std::vector<const MCSection *> Sections;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002201 for (const auto &it : SectionMap) {
2202 const MCSection *Section = it.first;
Richard Mitton21101b32013-09-19 23:21:01 +00002203 Sections.push_back(Section);
2204 }
2205
2206 // Sort the sections into order.
2207 // This is only done to ensure consistent output order across different runs.
2208 std::sort(Sections.begin(), Sections.end(), SectionSort);
2209
2210 // Build a set of address spans, sorted by CU.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002211 for (const MCSection *Section : Sections) {
David Blaikieafd2c6b2014-04-22 05:41:06 +00002212 SmallVector<SymbolCU, 8> &List = SectionMap[Section];
Richard Mitton21101b32013-09-19 23:21:01 +00002213 if (List.size() < 2)
2214 continue;
2215
2216 // Sort the symbols by offset within the section.
Benjamin Kramer571e2fe2014-03-07 19:41:22 +00002217 std::sort(List.begin(), List.end(),
2218 [&](const SymbolCU &A, const SymbolCU &B) {
2219 unsigned IA = A.Sym ? Asm->OutStreamer.GetSymbolOrder(A.Sym) : 0;
2220 unsigned IB = B.Sym ? Asm->OutStreamer.GetSymbolOrder(B.Sym) : 0;
2221
2222 // Symbols with no order assigned should be placed at the end.
2223 // (e.g. section end labels)
2224 if (IA == 0)
2225 return false;
2226 if (IB == 0)
2227 return true;
2228 return IA < IB;
2229 });
Richard Mitton21101b32013-09-19 23:21:01 +00002230
2231 // If we have no section (e.g. common), just write out
2232 // individual spans for each symbol.
Craig Topper353eda42014-04-24 06:44:33 +00002233 if (!Section) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00002234 for (const SymbolCU &Cur : List) {
Richard Mitton21101b32013-09-19 23:21:01 +00002235 ArangeSpan Span;
2236 Span.Start = Cur.Sym;
Craig Topper353eda42014-04-24 06:44:33 +00002237 Span.End = nullptr;
Richard Mitton21101b32013-09-19 23:21:01 +00002238 if (Cur.CU)
2239 Spans[Cur.CU].push_back(Span);
2240 }
2241 } else {
2242 // Build spans between each label.
2243 const MCSymbol *StartSym = List[0].Sym;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002244 for (size_t n = 1, e = List.size(); n < e; n++) {
Richard Mitton21101b32013-09-19 23:21:01 +00002245 const SymbolCU &Prev = List[n - 1];
2246 const SymbolCU &Cur = List[n];
2247
2248 // Try and build the longest span we can within the same CU.
2249 if (Cur.CU != Prev.CU) {
2250 ArangeSpan Span;
2251 Span.Start = StartSym;
2252 Span.End = Cur.Sym;
2253 Spans[Prev.CU].push_back(Span);
2254 StartSym = Cur.Sym;
2255 }
2256 }
2257 }
2258 }
2259
Richard Mitton21101b32013-09-19 23:21:01 +00002260 unsigned PtrSize = Asm->getDataLayout().getPointerSize();
2261
2262 // Build a list of CUs used.
Eric Christopher4287a492013-12-09 23:57:44 +00002263 std::vector<DwarfCompileUnit *> CUs;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002264 for (const auto &it : Spans) {
2265 DwarfCompileUnit *CU = it.first;
Richard Mitton21101b32013-09-19 23:21:01 +00002266 CUs.push_back(CU);
2267 }
2268
2269 // Sort the CU list (again, to ensure consistent output order).
Benjamin Kramer571e2fe2014-03-07 19:41:22 +00002270 std::sort(CUs.begin(), CUs.end(), [](const DwarfUnit *A, const DwarfUnit *B) {
2271 return A->getUniqueID() < B->getUniqueID();
2272 });
Richard Mitton21101b32013-09-19 23:21:01 +00002273
2274 // Emit an arange table for each CU we used.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002275 for (DwarfCompileUnit *CU : CUs) {
Richard Mitton21101b32013-09-19 23:21:01 +00002276 std::vector<ArangeSpan> &List = Spans[CU];
2277
2278 // Emit size of content not including length itself.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002279 unsigned ContentSize =
2280 sizeof(int16_t) + // DWARF ARange version number
2281 sizeof(int32_t) + // Offset of CU in the .debug_info section
2282 sizeof(int8_t) + // Pointer Size (in bytes)
2283 sizeof(int8_t); // Segment Size (in bytes)
Richard Mitton21101b32013-09-19 23:21:01 +00002284
2285 unsigned TupleSize = PtrSize * 2;
2286
2287 // 7.20 in the Dwarf specs requires the table to be aligned to a tuple.
Benjamin Kramer8a68ab32014-01-07 19:28:14 +00002288 unsigned Padding =
2289 OffsetToAlignment(sizeof(int32_t) + ContentSize, TupleSize);
Richard Mitton21101b32013-09-19 23:21:01 +00002290
2291 ContentSize += Padding;
2292 ContentSize += (List.size() + 1) * TupleSize;
2293
2294 // For each compile unit, write the list of spans it covers.
2295 Asm->OutStreamer.AddComment("Length of ARange Set");
2296 Asm->EmitInt32(ContentSize);
2297 Asm->OutStreamer.AddComment("DWARF Arange version number");
2298 Asm->EmitInt16(dwarf::DW_ARANGES_VERSION);
2299 Asm->OutStreamer.AddComment("Offset Into Debug Info Section");
Eric Christopherd8667202013-12-30 17:22:27 +00002300 Asm->EmitSectionOffset(CU->getLocalLabelBegin(), CU->getLocalSectionSym());
Richard Mitton21101b32013-09-19 23:21:01 +00002301 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2302 Asm->EmitInt8(PtrSize);
2303 Asm->OutStreamer.AddComment("Segment Size (in bytes)");
2304 Asm->EmitInt8(0);
2305
Benjamin Kramer8a68ab32014-01-07 19:28:14 +00002306 Asm->OutStreamer.EmitFill(Padding, 0xff);
Richard Mitton21101b32013-09-19 23:21:01 +00002307
Benjamin Kramer15596c72014-03-07 19:09:39 +00002308 for (const ArangeSpan &Span : List) {
Richard Mitton21101b32013-09-19 23:21:01 +00002309 Asm->EmitLabelReference(Span.Start, PtrSize);
2310
2311 // Calculate the size as being from the span start to it's end.
Richard Mitton089ed892013-09-23 17:56:20 +00002312 if (Span.End) {
Richard Mitton21101b32013-09-19 23:21:01 +00002313 Asm->EmitLabelDifference(Span.End, Span.Start, PtrSize);
Richard Mitton089ed892013-09-23 17:56:20 +00002314 } else {
2315 // For symbols without an end marker (e.g. common), we
2316 // write a single arange entry containing just that one symbol.
2317 uint64_t Size = SymSize[Span.Start];
2318 if (Size == 0)
2319 Size = 1;
2320
2321 Asm->OutStreamer.EmitIntValue(Size, PtrSize);
2322 }
Richard Mitton21101b32013-09-19 23:21:01 +00002323 }
2324
2325 Asm->OutStreamer.AddComment("ARange terminator");
2326 Asm->OutStreamer.EmitIntValue(0, PtrSize);
2327 Asm->OutStreamer.EmitIntValue(0, PtrSize);
2328 }
Bill Wendling480ff322009-05-20 23:21:38 +00002329}
2330
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002331// Emit visible names into a debug ranges section.
Devang Patel930143b2009-11-21 02:48:08 +00002332void DwarfDebug::emitDebugRanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002333 // Start the dwarf ranges section.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002334 Asm->OutStreamer.SwitchSection(
2335 Asm->getObjFileLowering().getDwarfRangesSection());
Eric Christopher4751d702013-11-23 00:05:29 +00002336
Eric Christopher0f63d062013-12-03 00:45:45 +00002337 // Size for our labels.
2338 unsigned char Size = Asm->getDataLayout().getPointerSize();
2339
2340 // Grab the specific ranges for the compile units in the module.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002341 for (const auto &I : CUMap) {
2342 DwarfCompileUnit *TheCU = I.second;
Eric Christopher0f63d062013-12-03 00:45:45 +00002343
2344 // Emit a symbol so we can find the beginning of our ranges.
David Blaikie1ab7c2d2013-12-09 17:51:30 +00002345 Asm->OutStreamer.EmitLabel(TheCU->getLabelRange());
Eric Christopher0f63d062013-12-03 00:45:45 +00002346
2347 // Iterate over the misc ranges for the compile units in the module.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002348 for (const RangeSpanList &List : TheCU->getRangeLists()) {
Eric Christopherf8790642013-12-04 22:04:50 +00002349 // Emit our symbol so we can find the beginning of the range.
2350 Asm->OutStreamer.EmitLabel(List.getSym());
Eric Christopher0f63d062013-12-03 00:45:45 +00002351
Benjamin Kramer15596c72014-03-07 19:09:39 +00002352 for (const RangeSpan &Range : List.getRanges()) {
Eric Christopher0f63d062013-12-03 00:45:45 +00002353 const MCSymbol *Begin = Range.getStart();
2354 const MCSymbol *End = Range.getEnd();
Eric Christopher565ab112013-12-20 04:34:22 +00002355 assert(Begin && "Range without a begin symbol?");
2356 assert(End && "Range without an end symbol?");
2357 Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2358 Asm->OutStreamer.EmitSymbolValue(End, Size);
Eric Christopher0f63d062013-12-03 00:45:45 +00002359 }
2360
2361 // And terminate the list with two 0 values.
Eric Christopherce0cfce2013-01-09 01:35:34 +00002362 Asm->OutStreamer.EmitIntValue(0, Size);
Eric Christopher0f63d062013-12-03 00:45:45 +00002363 Asm->OutStreamer.EmitIntValue(0, Size);
2364 }
Eric Christopher46e23432013-12-20 04:16:18 +00002365
2366 // Now emit a range for the CU itself.
Eric Christopher384f3fe2014-03-20 19:16:16 +00002367 if (TheCU->getRanges().size() > 1) {
Eric Christopher46e23432013-12-20 04:16:18 +00002368 Asm->OutStreamer.EmitLabel(
2369 Asm->GetTempSymbol("cu_ranges", TheCU->getUniqueID()));
Benjamin Kramer15596c72014-03-07 19:09:39 +00002370 for (const RangeSpan &Range : TheCU->getRanges()) {
Eric Christopher46e23432013-12-20 04:16:18 +00002371 const MCSymbol *Begin = Range.getStart();
2372 const MCSymbol *End = Range.getEnd();
Eric Christopher565ab112013-12-20 04:34:22 +00002373 assert(Begin && "Range without a begin symbol?");
2374 assert(End && "Range without an end symbol?");
2375 Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2376 Asm->OutStreamer.EmitSymbolValue(End, Size);
Eric Christopher46e23432013-12-20 04:16:18 +00002377 }
2378 // And terminate the list with two 0 values.
2379 Asm->OutStreamer.EmitIntValue(0, Size);
2380 Asm->OutStreamer.EmitIntValue(0, Size);
2381 }
Devang Patel12563b32010-04-16 23:33:45 +00002382 }
Bill Wendling480ff322009-05-20 23:21:38 +00002383}
2384
Eric Christopherd692c1d2012-12-11 19:42:09 +00002385// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002386
David Blaikie65a74662014-04-25 18:26:14 +00002387void DwarfDebug::initSkeletonUnit(const DwarfUnit &U, DIE &Die,
David Blaikief9b6a552014-04-22 22:39:41 +00002388 std::unique_ptr<DwarfUnit> NewU) {
David Blaikie38fe6342014-01-09 04:28:46 +00002389 NewU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
David Blaikief9b6a552014-04-22 22:39:41 +00002390 U.getCUNode().getSplitDebugFilename());
David Blaikie38fe6342014-01-09 04:28:46 +00002391
David Blaikie38fe6342014-01-09 04:28:46 +00002392 if (!CompilationDir.empty())
2393 NewU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
2394
David Blaikief9b6a552014-04-22 22:39:41 +00002395 addGnuPubAttributes(*NewU, Die);
David Blaikie38fe6342014-01-09 04:28:46 +00002396
David Blaikief9b6a552014-04-22 22:39:41 +00002397 SkeletonHolder.addUnit(std::move(NewU));
David Blaikie38fe6342014-01-09 04:28:46 +00002398}
2399
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002400// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2401// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
David Blaikie96dea052014-03-24 21:31:35 +00002402// DW_AT_addr_base, DW_AT_ranges_base.
David Blaikief9b6a552014-04-22 22:39:41 +00002403DwarfCompileUnit &DwarfDebug::constructSkeletonCU(const DwarfCompileUnit &CU) {
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002404
2405 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
David Blaikief9b6a552014-04-22 22:39:41 +00002406 auto OwnedUnit = make_unique<DwarfCompileUnit>(
2407 CU.getUniqueID(), Die, CU.getCUNode(), Asm, this, &SkeletonHolder);
2408 DwarfCompileUnit &NewCU = *OwnedUnit;
2409 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
David Blaikie637cac42014-04-22 23:09:36 +00002410 DwarfInfoSectionSym);
Eric Christopher4c7765f2013-01-17 03:00:04 +00002411
David Blaikief9b6a552014-04-22 22:39:41 +00002412 NewCU.initStmtList(DwarfLineSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002413
David Blaikie65a74662014-04-25 18:26:14 +00002414 initSkeletonUnit(CU, *Die, std::move(OwnedUnit));
Eric Christopherc8a310e2012-12-10 23:34:43 +00002415
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002416 return NewCU;
2417}
2418
David Blaikie15ed5eb2014-01-10 01:38:41 +00002419// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_dwo_name,
2420// DW_AT_addr_base.
David Blaikief9b6a552014-04-22 22:39:41 +00002421DwarfTypeUnit &DwarfDebug::constructSkeletonTU(DwarfTypeUnit &TU) {
David Blaikie60e63862014-02-14 23:58:13 +00002422 DwarfCompileUnit &CU = static_cast<DwarfCompileUnit &>(
David Blaikief9b6a552014-04-22 22:39:41 +00002423 *SkeletonHolder.getUnits()[TU.getCU().getUniqueID()]);
David Blaikie15ed5eb2014-01-10 01:38:41 +00002424
2425 DIE *Die = new DIE(dwarf::DW_TAG_type_unit);
David Blaikief9b6a552014-04-22 22:39:41 +00002426 auto OwnedUnit = make_unique<DwarfTypeUnit>(TU.getUniqueID(), Die, CU, Asm,
2427 this, &SkeletonHolder);
2428 DwarfTypeUnit &NewTU = *OwnedUnit;
2429 NewTU.setTypeSignature(TU.getTypeSignature());
Craig Topper353eda42014-04-24 06:44:33 +00002430 NewTU.setType(nullptr);
David Blaikief9b6a552014-04-22 22:39:41 +00002431 NewTU.initSection(
2432 Asm->getObjFileLowering().getDwarfTypesSection(TU.getTypeSignature()));
David Blaikie15ed5eb2014-01-10 01:38:41 +00002433
David Blaikie65a74662014-04-25 18:26:14 +00002434 initSkeletonUnit(TU, *Die, std::move(OwnedUnit));
David Blaikie15ed5eb2014-01-10 01:38:41 +00002435 return NewTU;
2436}
2437
Eric Christopherd692c1d2012-12-11 19:42:09 +00002438// Emit the .debug_info.dwo section for separated dwarf. This contains the
2439// compile units that would normally be in debug_info.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002440void DwarfDebug::emitDebugInfoDWO() {
Eric Christophercdf218d2012-12-10 19:51:21 +00002441 assert(useSplitDwarf() && "No split dwarf debug info?");
David Blaikie326e1fa2014-04-02 02:04:51 +00002442 // Don't pass an abbrev symbol, using a constant zero instead so as not to
2443 // emit relocations into the dwo file.
2444 InfoHolder.emitUnits(this, /* AbbrevSymbol */nullptr);
Eric Christopher3c5a1912012-12-19 22:02:53 +00002445}
2446
2447// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2448// abbreviations for the .debug_info.dwo section.
2449void DwarfDebug::emitDebugAbbrevDWO() {
2450 assert(useSplitDwarf() && "No split dwarf?");
David Blaikie0504cda2013-12-05 07:43:55 +00002451 InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection());
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002452}
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002453
David Blaikie4a2f95f2014-03-18 01:17:26 +00002454void DwarfDebug::emitDebugLineDWO() {
2455 assert(useSplitDwarf() && "No split dwarf?");
2456 Asm->OutStreamer.SwitchSection(
2457 Asm->getObjFileLowering().getDwarfLineDWOSection());
David Blaikie8287aff2014-03-18 02:13:23 +00002458 SplitTypeUnitFileTable.Emit(Asm->OutStreamer);
David Blaikie4a2f95f2014-03-18 01:17:26 +00002459}
2460
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002461// Emit the .debug_str.dwo section for separated dwarf. This contains the
2462// string section and is identical in format to traditional .debug_str
2463// sections.
2464void DwarfDebug::emitDebugStrDWO() {
2465 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002466 const MCSection *OffSec =
2467 Asm->getObjFileLowering().getDwarfStrOffDWOSection();
Eric Christopher2cbd5762013-01-07 19:32:41 +00002468 const MCSymbol *StrSym = DwarfStrSectionSym;
2469 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2470 OffSec, StrSym);
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002471}
David Blaikie409dd9c2013-11-19 23:08:21 +00002472
David Blaikie47f4b822014-03-19 00:11:28 +00002473MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) {
2474 if (!useSplitDwarf())
2475 return nullptr;
2476 if (SingleCU)
2477 SplitTypeUnitFileTable.setCompilationDir(CU.getCUNode().getDirectory());
2478 return &SplitTypeUnitFileTable;
2479}
2480
David Blaikie15632ae2014-02-12 00:31:30 +00002481void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU,
David Blaikie65a74662014-04-25 18:26:14 +00002482 StringRef Identifier, DIE &RefDie,
David Blaikief645f962014-01-09 03:23:41 +00002483 DICompositeType CTy) {
David Blaikie322d79b2014-01-31 19:52:26 +00002484 // Flag the type unit reference as a declaration so that if it contains
2485 // members (implicit special members, static data member definitions, member
2486 // declarations for definitions in this CU, etc) consumers don't get confused
2487 // and think this is a full definition.
David Blaikie15632ae2014-02-12 00:31:30 +00002488 CU.addFlag(RefDie, dwarf::DW_AT_declaration);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002489
David Blaikie47f615e2013-12-17 23:32:35 +00002490 const DwarfTypeUnit *&TU = DwarfTypeUnits[CTy];
Chandler Carruthb587ab62014-01-20 08:07:07 +00002491 if (TU) {
David Blaikie15632ae2014-02-12 00:31:30 +00002492 CU.addDIETypeSignature(RefDie, *TU);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002493 return;
David Blaikie409dd9c2013-11-19 23:08:21 +00002494 }
2495
Chandler Carruthb587ab62014-01-20 08:07:07 +00002496 DIE *UnitDie = new DIE(dwarf::DW_TAG_type_unit);
David Blaikief9b6a552014-04-22 22:39:41 +00002497 auto OwnedUnit =
2498 make_unique<DwarfTypeUnit>(InfoHolder.getUnits().size(), UnitDie, CU, Asm,
2499 this, &InfoHolder, getDwoLineTable(CU));
2500 DwarfTypeUnit &NewTU = *OwnedUnit;
2501 TU = &NewTU;
2502 InfoHolder.addUnit(std::move(OwnedUnit));
Chandler Carruthb587ab62014-01-20 08:07:07 +00002503
David Blaikie65a74662014-04-25 18:26:14 +00002504 NewTU.addUInt(*UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
David Blaikie637cac42014-04-22 23:09:36 +00002505 CU.getLanguage());
Chandler Carruthb587ab62014-01-20 08:07:07 +00002506
2507 MD5 Hash;
2508 Hash.update(Identifier);
2509 // ... take the least significant 8 bytes and return those. Our MD5
2510 // implementation always returns its results in little endian, swap bytes
2511 // appropriately.
2512 MD5::MD5Result Result;
2513 Hash.final(Result);
2514 uint64_t Signature = *reinterpret_cast<support::ulittle64_t *>(Result + 8);
David Blaikief9b6a552014-04-22 22:39:41 +00002515 NewTU.setTypeSignature(Signature);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002516 if (useSplitDwarf())
David Blaikief9b6a552014-04-22 22:39:41 +00002517 NewTU.setSkeleton(constructSkeletonTU(NewTU));
David Blaikie60e63862014-02-14 23:58:13 +00002518 else
2519 CU.applyStmtList(*UnitDie);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002520
David Blaikief9b6a552014-04-22 22:39:41 +00002521 NewTU.setType(NewTU.createTypeDIE(CTy));
Chandler Carruthb587ab62014-01-20 08:07:07 +00002522
David Blaikief9b6a552014-04-22 22:39:41 +00002523 NewTU.initSection(
Chandler Carruthb587ab62014-01-20 08:07:07 +00002524 useSplitDwarf()
2525 ? Asm->getObjFileLowering().getDwarfTypesDWOSection(Signature)
2526 : Asm->getObjFileLowering().getDwarfTypesSection(Signature));
2527
David Blaikief9b6a552014-04-22 22:39:41 +00002528 CU.addDIETypeSignature(RefDie, NewTU);
David Blaikie409dd9c2013-11-19 23:08:21 +00002529}
David Blaikie4bd13b72014-03-07 18:49:45 +00002530
David Blaikie65a74662014-04-25 18:26:14 +00002531void DwarfDebug::attachLowHighPC(DwarfCompileUnit &Unit, DIE &D,
David Blaikie4bd13b72014-03-07 18:49:45 +00002532 MCSymbol *Begin, MCSymbol *End) {
David Blaikief9b6a552014-04-22 22:39:41 +00002533 Unit.addLabelAddress(D, dwarf::DW_AT_low_pc, Begin);
Adrian Prantl887e7072014-03-07 23:07:21 +00002534 if (DwarfVersion < 4)
David Blaikief9b6a552014-04-22 22:39:41 +00002535 Unit.addLabelAddress(D, dwarf::DW_AT_high_pc, End);
David Blaikie4bd13b72014-03-07 18:49:45 +00002536 else
David Blaikief9b6a552014-04-22 22:39:41 +00002537 Unit.addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin);
David Blaikie4bd13b72014-03-07 18:49:45 +00002538}
David Blaikie2406a0622014-04-23 23:37:35 +00002539
2540// Accelerator table mutators - add each name along with its companion
2541// DIE to the proper table while ensuring that the name that we're going
2542// to reference is in the string table. We do this since the names we
2543// add may not only be identical to the names in the DIE.
2544void DwarfDebug::addAccelName(StringRef Name, const DIE *Die) {
2545 if (!useDwarfAccelTables())
2546 return;
2547 InfoHolder.getStringPoolEntry(Name);
2548 AccelNames.AddName(Name, Die);
2549}
David Blaikie0ee82b92014-04-24 00:53:32 +00002550
2551void DwarfDebug::addAccelObjC(StringRef Name, const DIE *Die) {
2552 if (!useDwarfAccelTables())
2553 return;
2554 InfoHolder.getStringPoolEntry(Name);
2555 AccelObjC.AddName(Name, Die);
2556}
David Blaikieecf04152014-04-24 01:02:42 +00002557
2558void DwarfDebug::addAccelNamespace(StringRef Name, const DIE *Die) {
2559 if (!useDwarfAccelTables())
2560 return;
2561 InfoHolder.getStringPoolEntry(Name);
2562 AccelNamespace.AddName(Name, Die);
2563}
David Blaikie18d33752014-04-24 01:23:49 +00002564
2565void DwarfDebug::addAccelType(StringRef Name, const DIE *Die, char Flags) {
2566 if (!useDwarfAccelTables())
2567 return;
2568 InfoHolder.getStringPoolEntry(Name);
2569 AccelTypes.AddName(Name, Die, Flags);
2570}