blob: 2a0615d74f61c12a251f3c0cb6a8626b69603f18 [file] [log] [blame]
Bill Wendling0310d762009-05-15 09:23:25 +00001//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf debug info into asm files.
11//
12//===----------------------------------------------------------------------===//
Chris Lattner6cde3e62010-03-09 00:39:24 +000013
Stephen Hines36b56882014-04-23 16:57:46 -070014#include "ByteStreamer.h"
Bill Wendling0310d762009-05-15 09:23:25 +000015#include "DwarfDebug.h"
Chris Lattner74e41f92010-04-05 05:24:55 +000016#include "DIE.h"
Eric Christopher0d27ca12013-08-08 23:45:55 +000017#include "DIEHash.h"
Stephen Hines36b56882014-04-23 16:57:46 -070018#include "DwarfUnit.h"
Chandler Carruthd04a8d42012-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 Greeneb2c66fc2009-08-19 21:52:55 +000023#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling0310d762009-05-15 09:23:25 +000024#include "llvm/CodeGen/MachineModuleInfo.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000025#include "llvm/IR/Constants.h"
Stephen Hines36b56882014-04-23 16:57:46 -070026#include "llvm/IR/DIBuilder.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000027#include "llvm/IR/DataLayout.h"
Stephen Hines36b56882014-04-23 16:57:46 -070028#include "llvm/IR/DebugInfo.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000029#include "llvm/IR/Instructions.h"
30#include "llvm/IR/Module.h"
Stephen Hines36b56882014-04-23 16:57:46 -070031#include "llvm/IR/ValueHandle.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000032#include "llvm/MC/MCAsmInfo.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000033#include "llvm/MC/MCSection.h"
Chris Lattner6c2f9e12009-08-19 05:49:37 +000034#include "llvm/MC/MCStreamer.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000035#include "llvm/MC/MCSymbol.h"
Devang Pateleac9c072010-04-27 19:46:33 +000036#include "llvm/Support/CommandLine.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000037#include "llvm/Support/Debug.h"
David Majnemerd7d43dc2013-08-21 06:13:34 +000038#include "llvm/Support/Dwarf.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000039#include "llvm/Support/ErrorHandling.h"
Chris Lattner0ad9c912010-01-22 22:09:00 +000040#include "llvm/Support/FormattedStream.h"
Stephen Hines36b56882014-04-23 16:57:46 -070041#include "llvm/Support/LEB128.h"
Eric Christopher3dee5752013-07-26 17:02:41 +000042#include "llvm/Support/MD5.h"
Michael J. Spencer1f6efa32010-11-29 18:16:10 +000043#include "llvm/Support/Path.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000044#include "llvm/Support/Timer.h"
Chandler Carruthd04a8d42012-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 Wendling0310d762009-05-15 09:23:25 +000050using namespace llvm;
51
Stephen Hinesdce4a402014-05-29 02:49:00 -070052#define DEBUG_TYPE "dwarfdebug"
53
Eric Christopher6e61e0b2013-07-23 22:16:41 +000054static cl::opt<bool>
55DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden,
56 cl::desc("Disable debug info printing"));
Devang Pateleac9c072010-04-27 19:46:33 +000057
Eric Christopher6e61e0b2013-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 Gohman281d65d2010-05-07 01:08:53 +000062
Eric Christopher6e61e0b2013-07-23 22:16:41 +000063static cl::opt<bool>
Eric Christopher8f1a9292013-09-13 00:35:05 +000064GenerateGnuPubSections("generate-gnu-dwarf-pub-sections", cl::Hidden,
65 cl::desc("Generate GNU-style pubnames and pubtypes"),
66 cl::init(false));
67
Stephen Hines36b56882014-04-23 16:57:46 -070068static cl::opt<bool> GenerateARangeSection("generate-arange-section",
69 cl::Hidden,
70 cl::desc("Generate dwarf aranges"),
71 cl::init(false));
72
Eric Christopher20f47ab2012-08-23 22:36:40 +000073namespace {
Stephen Hines36b56882014-04-23 16:57:46 -070074enum DefaultOnOff { Default, Enable, Disable };
Eric Christopher20f47ab2012-08-23 22:36:40 +000075}
Eric Christopher09ac3d82011-11-07 09:24:32 +000076
Eric Christopher6e61e0b2013-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 Christopher20f47ab2012-08-23 22:36:40 +000084
Eric Christopher6e61e0b2013-07-23 22:16:41 +000085static cl::opt<DefaultOnOff>
Eric Christopher6e61e0b2013-07-23 22:16:41 +000086SplitDwarf("split-dwarf", cl::Hidden,
Stephen Hines36b56882014-04-23 16:57:46 -070087 cl::desc("Output DWARF5 split debug info."),
Eric Christopher6e61e0b2013-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 Christopherf5b6dcd2012-11-12 22:22:20 +000092
Eric Christopherf04e4ef2013-08-19 21:07:38 +000093static cl::opt<DefaultOnOff>
Eric Christopher63ae7c92013-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 Christopherf04e4ef2013-08-19 21:07:38 +0000100
Stephen Hines36b56882014-04-23 16:57:46 -0700101static cl::opt<unsigned>
102DwarfVersionNumber("dwarf-version", cl::Hidden,
103 cl::desc("Generate DWARF for dwarf version."), cl::init(0));
104
Benjamin Kramer0b6962f2013-08-24 12:54:27 +0000105static const char *const DWARFGroupName = "DWARF Emission";
106static const char *const DbgTimerName = "DWARF Debug Writer";
Bill Wendling5f017e82010-04-07 09:28:04 +0000107
Bill Wendling0310d762009-05-15 09:23:25 +0000108//===----------------------------------------------------------------------===//
109
Manman Ren8199f0b2013-10-08 19:07:44 +0000110/// resolve - Look in the DwarfDebug map for the MDNode that
111/// corresponds to the reference.
Stephen Hines36b56882014-04-23 16:57:46 -0700112template <typename T> T DbgVariable::resolve(DIRef<T> Ref) const {
Manman Ren8199f0b2013-10-08 19:07:44 +0000113 return DD->resolve(Ref);
114}
115
Stephen Hines36b56882014-04-23 16:57:46 -0700116bool DbgVariable::isBlockByrefVariable() const {
117 assert(Var.isVariable() && "Invalid complex DbgVariable!");
118 return Var.isBlockByrefVariable(DD->getTypeIdentifierMap());
119}
120
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000121DIType DbgVariable::getType() const {
Stephen Hines36b56882014-04-23 16:57:46 -0700122 DIType Ty = Var.getType().resolve(DD->getTypeIdentifierMap());
Devang Patel3cbee302011-04-12 22:53:02 +0000123 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
124 // addresses instead.
Stephen Hines36b56882014-04-23 16:57:46 -0700125 if (Var.isBlockByrefVariable(DD->getTypeIdentifierMap())) {
Devang Patel3cbee302011-04-12 22:53:02 +0000126 /* Byref variables, in Blocks, are declared by the programmer as
127 "SomeType VarName;", but the compiler creates a
128 __Block_byref_x_VarName struct, and gives the variable VarName
129 either the struct, or a pointer to the struct, as its type. This
130 is necessary for various behind-the-scenes things the compiler
131 needs to do with by-reference variables in blocks.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000132
Devang Patel3cbee302011-04-12 22:53:02 +0000133 However, as far as the original *programmer* is concerned, the
134 variable should still have type 'SomeType', as originally declared.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000135
Devang Patel3cbee302011-04-12 22:53:02 +0000136 The following function dives into the __Block_byref_x_VarName
137 struct to find the original type of the variable. This will be
138 passed back to the code generating the type for the Debug
139 Information Entry for the variable 'VarName'. 'VarName' will then
140 have the original type 'SomeType' in its debug information.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000141
Devang Patel3cbee302011-04-12 22:53:02 +0000142 The original type 'SomeType' will be the type of the field named
143 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000144
Devang Patel3cbee302011-04-12 22:53:02 +0000145 NOTE: In order for this to not completely fail on the debugger
146 side, the Debug Information Entry for the variable VarName needs to
147 have a DW_AT_location that tells the debugger how to unwind through
148 the pointers and __Block_byref_x_VarName struct to find the actual
149 value of the variable. The function addBlockByrefType does this. */
150 DIType subType = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000151 uint16_t tag = Ty.getTag();
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000152
Eric Christopher4dc211a2013-09-04 19:53:21 +0000153 if (tag == dwarf::DW_TAG_pointer_type)
Manman Ren8199f0b2013-10-08 19:07:44 +0000154 subType = resolve(DIDerivedType(Ty).getTypeDerivedFrom());
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000155
Eric Christopher4dc211a2013-09-04 19:53:21 +0000156 DIArray Elements = DICompositeType(subType).getTypeArray();
Devang Patel3cbee302011-04-12 22:53:02 +0000157 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
David Blaikied6dffb42013-11-18 23:57:26 +0000158 DIDerivedType DT(Elements.getElement(i));
Devang Patel3cbee302011-04-12 22:53:02 +0000159 if (getName() == DT.getName())
Manman Ren8199f0b2013-10-08 19:07:44 +0000160 return (resolve(DT.getTypeDerivedFrom()));
Devang Patel8bd11de2010-08-09 21:01:39 +0000161 }
Devang Patel8bd11de2010-08-09 21:01:39 +0000162 }
Devang Patel3cbee302011-04-12 22:53:02 +0000163 return Ty;
164}
Bill Wendling0310d762009-05-15 09:23:25 +0000165
Stephen Hinesdce4a402014-05-29 02:49:00 -0700166static LLVM_CONSTEXPR DwarfAccelTable::Atom TypeAtoms[] = {
167 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4),
168 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag, dwarf::DW_FORM_data2),
169 DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags, dwarf::DW_FORM_data1)};
Manman Ren0e6783f2013-07-02 23:40:10 +0000170
Chris Lattner49cd6642010-04-05 05:11:15 +0000171DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Stephen Hinesdce4a402014-05-29 02:49:00 -0700172 : Asm(A), MMI(Asm->MMI), FirstCU(nullptr), PrevLabel(nullptr),
173 GlobalRangeCount(0), InfoHolder(A, "info_string", DIEValueAllocator),
Stephen Hines36b56882014-04-23 16:57:46 -0700174 UsedNonDefaultText(false),
Stephen Hinesdce4a402014-05-29 02:49:00 -0700175 SkeletonHolder(A, "skel_string", DIEValueAllocator),
176 AccelNames(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
177 dwarf::DW_FORM_data4)),
178 AccelObjC(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
179 dwarf::DW_FORM_data4)),
180 AccelNamespace(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
181 dwarf::DW_FORM_data4)),
182 AccelTypes(TypeAtoms) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000183
Stephen Hinesdce4a402014-05-29 02:49:00 -0700184 DwarfInfoSectionSym = DwarfAbbrevSectionSym = DwarfStrSectionSym = nullptr;
185 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = nullptr;
186 DwarfLineSectionSym = nullptr;
187 DwarfAddrSectionSym = nullptr;
188 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = nullptr;
189 FunctionBeginSym = FunctionEndSym = nullptr;
190 CurFn = nullptr;
191 CurMI = nullptr;
Eric Christopher60777d82012-04-02 17:58:52 +0000192
Adrian Prantl73df4b92013-10-15 20:26:37 +0000193 // Turn on accelerator tables for Darwin by default, pubnames by
194 // default for non-Darwin, and handle split dwarf.
Eric Christopher00297ba2013-04-27 01:07:52 +0000195 bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin();
Eric Christopherc1610fa2012-08-23 22:36:36 +0000196
Eric Christopher05bae3b2013-08-19 21:41:38 +0000197 if (DwarfAccelTables == Default)
198 HasDwarfAccelTables = IsDarwin;
199 else
Eric Christopher03be5e52013-08-26 20:58:35 +0000200 HasDwarfAccelTables = DwarfAccelTables == Enable;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000201
Eric Christopher4daaed12012-12-10 19:51:21 +0000202 if (SplitDwarf == Default)
203 HasSplitDwarf = false;
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000204 else
Eric Christopher05bae3b2013-08-19 21:41:38 +0000205 HasSplitDwarf = SplitDwarf == Enable;
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000206
Eric Christopher63ae7c92013-08-26 23:24:35 +0000207 if (DwarfPubSections == Default)
208 HasDwarfPubSections = !IsDarwin;
Eric Christopher05bae3b2013-08-19 21:41:38 +0000209 else
Eric Christopher63ae7c92013-08-26 23:24:35 +0000210 HasDwarfPubSections = DwarfPubSections == Enable;
Eric Christopherf04e4ef2013-08-19 21:07:38 +0000211
Stephen Hinesdce4a402014-05-29 02:49:00 -0700212 DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber
213 : MMI->getModule()->getDwarfVersion();
Manman Ren0e6783f2013-07-02 23:40:10 +0000214
Dan Gohman03c3dc72010-06-18 15:56:31 +0000215 {
216 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopherc4639d62012-11-19 22:42:15 +0000217 beginModule();
Torok Edwin9c421072010-04-07 10:44:46 +0000218 }
Bill Wendling0310d762009-05-15 09:23:25 +0000219}
Bill Wendling0310d762009-05-15 09:23:25 +0000220
Stephen Hinesdce4a402014-05-29 02:49:00 -0700221// Define out of line so we don't have to include DwarfUnit.h in DwarfDebug.h.
222DwarfDebug::~DwarfDebug() { }
223
Eric Christopherb6dc8652012-11-27 22:43:45 +0000224// Switch to the specified MCSection and emit an assembler
225// temporary label to it if SymbolStem is specified.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000226static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Stephen Hinesdce4a402014-05-29 02:49:00 -0700227 const char *SymbolStem = nullptr) {
Eric Christopherd8a87522011-11-07 09:18:38 +0000228 Asm->OutStreamer.SwitchSection(Section);
Stephen Hines36b56882014-04-23 16:57:46 -0700229 if (!SymbolStem)
Stephen Hinesdce4a402014-05-29 02:49:00 -0700230 return nullptr;
Eric Christopherd8a87522011-11-07 09:18:38 +0000231
232 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
233 Asm->OutStreamer.EmitLabel(TmpSym);
234 return TmpSym;
235}
236
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000237static bool isObjCClass(StringRef Name) {
238 return Name.startswith("+") || Name.startswith("-");
239}
240
241static bool hasObjCCategory(StringRef Name) {
Stephen Hines36b56882014-04-23 16:57:46 -0700242 if (!isObjCClass(Name))
243 return false;
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000244
Benjamin Kramer4321d4e2013-08-24 12:15:54 +0000245 return Name.find(") ") != StringRef::npos;
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000246}
247
248static void getObjCClassCategory(StringRef In, StringRef &Class,
249 StringRef &Category) {
250 if (!hasObjCCategory(In)) {
251 Class = In.slice(In.find('[') + 1, In.find(' '));
252 Category = "";
253 return;
254 }
255
256 Class = In.slice(In.find('[') + 1, In.find('('));
257 Category = In.slice(In.find('[') + 1, In.find(' '));
258 return;
259}
260
261static StringRef getObjCMethodName(StringRef In) {
262 return In.slice(In.find(' ') + 1, In.find(']'));
263}
264
Richard Mitton7c9659a2013-10-03 22:07:08 +0000265// Helper for sorting sections into a stable output order.
266static bool SectionSort(const MCSection *A, const MCSection *B) {
Stephen Hines36b56882014-04-23 16:57:46 -0700267 std::string LA = (A ? A->getLabelBeginName() : "");
268 std::string LB = (B ? B->getLabelBeginName() : "");
269 return LA < LB;
Richard Mitton7c9659a2013-10-03 22:07:08 +0000270}
271
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000272// Add the various names to the Dwarf accelerator table names.
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000273// TODO: Determine whether or not we should add names for programs
274// that do not have a DW_AT_name or DW_AT_linkage_name field - this
275// is only slightly different than the lookup of non-standard ObjC names.
Stephen Hinesdce4a402014-05-29 02:49:00 -0700276void DwarfDebug::addSubprogramNames(DISubprogram SP, DIE &Die) {
Stephen Hines36b56882014-04-23 16:57:46 -0700277 if (!SP.isDefinition())
278 return;
Stephen Hinesdce4a402014-05-29 02:49:00 -0700279 addAccelName(SP.getName(), Die);
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000280
281 // If the linkage name is different than the name, go ahead and output
282 // that as well into the name table.
283 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
Stephen Hinesdce4a402014-05-29 02:49:00 -0700284 addAccelName(SP.getLinkageName(), Die);
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000285
286 // If this is an Objective-C selector name add it to the ObjC accelerator
287 // too.
288 if (isObjCClass(SP.getName())) {
289 StringRef Class, Category;
290 getObjCClassCategory(SP.getName(), Class, Category);
Stephen Hinesdce4a402014-05-29 02:49:00 -0700291 addAccelObjC(Class, Die);
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000292 if (Category != "")
Stephen Hinesdce4a402014-05-29 02:49:00 -0700293 addAccelObjC(Category, Die);
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000294 // Also add the base method name to the name table.
Stephen Hinesdce4a402014-05-29 02:49:00 -0700295 addAccelName(getObjCMethodName(SP.getName()), Die);
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000296 }
297}
298
Manman Ren02d29672013-09-09 19:05:21 +0000299/// isSubprogramContext - Return true if Context is either a subprogram
300/// or another context nested inside a subprogram.
301bool DwarfDebug::isSubprogramContext(const MDNode *Context) {
302 if (!Context)
303 return false;
304 DIDescriptor D(Context);
305 if (D.isSubprogram())
306 return true;
307 if (D.isType())
Manman Ren2c9905a2013-09-09 19:47:11 +0000308 return isSubprogramContext(resolve(DIType(Context).getContext()));
Manman Ren02d29672013-09-09 19:05:21 +0000309 return false;
310}
311
Eric Christopherb6dc8652012-11-27 22:43:45 +0000312// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
313// and DW_AT_high_pc attributes. If there are global variables in this
314// scope then create and insert DIEs for these variables.
Stephen Hinesdce4a402014-05-29 02:49:00 -0700315DIE &DwarfDebug::updateSubprogramScopeDIE(DwarfCompileUnit &SPCU,
Stephen Hines36b56882014-04-23 16:57:46 -0700316 DISubprogram SP) {
Stephen Hinesdce4a402014-05-29 02:49:00 -0700317 DIE *SPDie = SPCU.getOrCreateSubprogramDIE(SP);
Devang Patel8aa61472010-07-07 22:20:57 +0000318
Stephen Hinesdce4a402014-05-29 02:49:00 -0700319 attachLowHighPC(SPCU, *SPDie, FunctionBeginSym, FunctionEndSym);
Stephen Hines36b56882014-04-23 16:57:46 -0700320
Chris Lattnerd38fee82010-04-05 00:13:49 +0000321 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
322 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Stephen Hinesdce4a402014-05-29 02:49:00 -0700323 SPCU.addAddress(*SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patelb4645642010-02-06 01:02:37 +0000324
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000325 // Add name to the name table, we do this here because we're guaranteed
326 // to have concrete versions of our DW_TAG_subprogram nodes.
Stephen Hinesdce4a402014-05-29 02:49:00 -0700327 addSubprogramNames(SP, *SPDie);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000328
Stephen Hinesdce4a402014-05-29 02:49:00 -0700329 return *SPDie;
Devang Patel53bb5c92009-11-10 23:06:00 +0000330}
331
Manman Ren995de6c2013-09-11 19:40:28 +0000332/// Check whether we should create a DIE for the given Scope, return true
333/// if we don't create a DIE (the corresponding DIE is null).
Manman Renfd2210a2013-09-10 18:40:41 +0000334bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
335 if (Scope->isAbstractScope())
336 return false;
337
Manman Ren995de6c2013-09-11 19:40:28 +0000338 // We don't create a DIE if there is no Range.
Manman Renfd2210a2013-09-10 18:40:41 +0000339 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
340 if (Ranges.empty())
341 return true;
342
343 if (Ranges.size() > 1)
344 return false;
345
Manman Ren995de6c2013-09-11 19:40:28 +0000346 // We don't create a DIE if we have a single Range and the end label
347 // is null.
Manman Renfd2210a2013-09-10 18:40:41 +0000348 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
349 MCSymbol *End = getLabelAfterInsn(RI->second);
350 return !End;
351}
352
Stephen Hinesdce4a402014-05-29 02:49:00 -0700353static void addSectionLabel(AsmPrinter &Asm, DwarfUnit &U, DIE &D,
Stephen Hines36b56882014-04-23 16:57:46 -0700354 dwarf::Attribute A, const MCSymbol *L,
355 const MCSymbol *Sec) {
Stephen Hinesdce4a402014-05-29 02:49:00 -0700356 if (Asm.MAI->doesDwarfUseRelocationsAcrossSections())
357 U.addSectionLabel(D, A, L);
Stephen Hines36b56882014-04-23 16:57:46 -0700358 else
Stephen Hinesdce4a402014-05-29 02:49:00 -0700359 U.addSectionDelta(D, A, L, Sec);
Stephen Hines36b56882014-04-23 16:57:46 -0700360}
361
Stephen Hinesdce4a402014-05-29 02:49:00 -0700362void DwarfDebug::addScopeRangeList(DwarfCompileUnit &TheCU, DIE &ScopeDIE,
Stephen Hines36b56882014-04-23 16:57:46 -0700363 const SmallVectorImpl<InsnRange> &Range) {
364 // Emit offset in .debug_range as a relocatable label. emitDIE will handle
365 // emitting it appropriately.
366 MCSymbol *RangeSym = Asm->GetTempSymbol("debug_ranges", GlobalRangeCount++);
367
368 // Under fission, ranges are specified by constant offsets relative to the
369 // CU's DW_AT_GNU_ranges_base.
370 if (useSplitDwarf())
Stephen Hinesdce4a402014-05-29 02:49:00 -0700371 TheCU.addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
372 DwarfDebugRangeSectionSym);
Stephen Hines36b56882014-04-23 16:57:46 -0700373 else
Stephen Hinesdce4a402014-05-29 02:49:00 -0700374 addSectionLabel(*Asm, TheCU, ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
Stephen Hines36b56882014-04-23 16:57:46 -0700375 DwarfDebugRangeSectionSym);
376
377 RangeSpanList List(RangeSym);
378 for (const InsnRange &R : Range) {
379 RangeSpan Span(getLabelBeforeInsn(R.first), getLabelAfterInsn(R.second));
380 List.addRange(std::move(Span));
381 }
382
383 // Add the range list to the set of ranges to be emitted.
Stephen Hinesdce4a402014-05-29 02:49:00 -0700384 TheCU.addRangeList(std::move(List));
385}
386
387void DwarfDebug::attachRangesOrLowHighPC(DwarfCompileUnit &TheCU, DIE &Die,
388 const SmallVectorImpl<InsnRange> &Ranges) {
389 assert(!Ranges.empty());
390 if (Ranges.size() == 1)
391 attachLowHighPC(TheCU, Die, getLabelBeforeInsn(Ranges.front().first),
392 getLabelAfterInsn(Ranges.front().second));
393 else
394 addScopeRangeList(TheCU, Die, Ranges);
Stephen Hines36b56882014-04-23 16:57:46 -0700395}
396
Eric Christopherb6dc8652012-11-27 22:43:45 +0000397// Construct new DW_TAG_lexical_block for this scope and attach
398// DW_AT_low_pc/DW_AT_high_pc labels.
Stephen Hinesdce4a402014-05-29 02:49:00 -0700399std::unique_ptr<DIE>
400DwarfDebug::constructLexicalScopeDIE(DwarfCompileUnit &TheCU,
401 LexicalScope *Scope) {
Manman Renfd2210a2013-09-10 18:40:41 +0000402 if (isLexicalScopeDIENull(Scope))
Stephen Hinesdce4a402014-05-29 02:49:00 -0700403 return nullptr;
Manman Renfd2210a2013-09-10 18:40:41 +0000404
Stephen Hinesdce4a402014-05-29 02:49:00 -0700405 auto ScopeDIE = make_unique<DIE>(dwarf::DW_TAG_lexical_block);
Devang Pateleac9c072010-04-27 19:46:33 +0000406 if (Scope->isAbstractScope())
407 return ScopeDIE;
408
Stephen Hinesdce4a402014-05-29 02:49:00 -0700409 attachRangesOrLowHighPC(TheCU, *ScopeDIE, Scope->getRanges());
Devang Patel53bb5c92009-11-10 23:06:00 +0000410
411 return ScopeDIE;
412}
413
Eric Christopherb6dc8652012-11-27 22:43:45 +0000414// This scope represents inlined body of a function. Construct DIE to
415// represent this concrete inlined copy of the function.
Stephen Hinesdce4a402014-05-29 02:49:00 -0700416std::unique_ptr<DIE>
417DwarfDebug::constructInlinedScopeDIE(DwarfCompileUnit &TheCU,
418 LexicalScope *Scope) {
419 assert(Scope->getScopeNode());
Devang Patel26a92002011-07-27 00:34:13 +0000420 DIScope DS(Scope->getScopeNode());
421 DISubprogram InlinedSP = getDISubprogram(DS);
Stephen Hinesdce4a402014-05-29 02:49:00 -0700422 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
423 // was inlined from another compile unit.
424 DIE *OriginDIE = AbstractSPDies[InlinedSP];
425 assert(OriginDIE && "Unable to find original DIE for an inlined subprogram.");
Devang Patel26a92002011-07-27 00:34:13 +0000426
Stephen Hinesdce4a402014-05-29 02:49:00 -0700427 auto ScopeDIE = make_unique<DIE>(dwarf::DW_TAG_inlined_subroutine);
428 TheCU.addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +0000429
Stephen Hinesdce4a402014-05-29 02:49:00 -0700430 attachRangesOrLowHighPC(TheCU, *ScopeDIE, Scope->getRanges());
Devang Patel53bb5c92009-11-10 23:06:00 +0000431
432 InlinedSubprogramDIEs.insert(OriginDIE);
433
Eric Christophere7177132013-07-03 02:23:53 +0000434 // Add the call site information to the DIE.
Devang Patel53bb5c92009-11-10 23:06:00 +0000435 DILocation DL(Scope->getInlinedAt());
Stephen Hinesdce4a402014-05-29 02:49:00 -0700436 TheCU.addUInt(*ScopeDIE, dwarf::DW_AT_call_file, None,
437 TheCU.getOrCreateSourceID(DL.getFilename(), DL.getDirectory()));
438 TheCU.addUInt(*ScopeDIE, dwarf::DW_AT_call_line, None, DL.getLineNumber());
Devang Patel53bb5c92009-11-10 23:06:00 +0000439
Eric Christopher309bedd2011-12-04 06:02:38 +0000440 // Add name to the name table, we do this here because we're guaranteed
441 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
Stephen Hinesdce4a402014-05-29 02:49:00 -0700442 addSubprogramNames(InlinedSP, *ScopeDIE);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000443
Devang Patel53bb5c92009-11-10 23:06:00 +0000444 return ScopeDIE;
445}
446
Stephen Hinesdce4a402014-05-29 02:49:00 -0700447static std::unique_ptr<DIE> constructVariableDIE(DwarfCompileUnit &TheCU,
448 DbgVariable &DV,
449 const LexicalScope &Scope,
450 DIE *&ObjectPointer) {
451 auto Var = TheCU.constructVariableDIE(DV, Scope.isAbstractScope());
452 if (DV.isObjectPointer())
453 ObjectPointer = Var.get();
454 return Var;
455}
456
457DIE *DwarfDebug::createScopeChildrenDIE(
458 DwarfCompileUnit &TheCU, LexicalScope *Scope,
459 SmallVectorImpl<std::unique_ptr<DIE>> &Children) {
460 DIE *ObjectPointer = nullptr;
Devang Patel0478c152011-03-01 22:58:55 +0000461
462 // Collect arguments for current function.
Stephen Hines36b56882014-04-23 16:57:46 -0700463 if (LScopes.isCurrentFunctionScope(Scope)) {
464 for (DbgVariable *ArgDV : CurrentFnArguments)
465 if (ArgDV)
Stephen Hinesdce4a402014-05-29 02:49:00 -0700466 Children.push_back(
467 constructVariableDIE(TheCU, *ArgDV, *Scope, ObjectPointer));
Devang Patel0478c152011-03-01 22:58:55 +0000468
Stephen Hines36b56882014-04-23 16:57:46 -0700469 // If this is a variadic function, add an unspecified parameter.
470 DISubprogram SP(Scope->getScopeNode());
471 DIArray FnArgs = SP.getType().getTypeArray();
472 if (FnArgs.getElement(FnArgs.getNumElements() - 1)
473 .isUnspecifiedParameter()) {
Stephen Hinesdce4a402014-05-29 02:49:00 -0700474 Children.push_back(
475 make_unique<DIE>(dwarf::DW_TAG_unspecified_parameters));
Eric Christopher7b451cf2012-09-21 22:18:52 +0000476 }
Stephen Hines36b56882014-04-23 16:57:46 -0700477 }
478
479 // Collect lexical scope children first.
480 for (DbgVariable *DV : ScopeVariables.lookup(Scope))
Stephen Hinesdce4a402014-05-29 02:49:00 -0700481 Children.push_back(constructVariableDIE(TheCU, *DV, *Scope, ObjectPointer));
482
Stephen Hines36b56882014-04-23 16:57:46 -0700483 for (LexicalScope *LS : Scope->getChildren())
Stephen Hinesdce4a402014-05-29 02:49:00 -0700484 if (std::unique_ptr<DIE> Nested = constructScopeDIE(TheCU, LS))
485 Children.push_back(std::move(Nested));
Manman Renfd2210a2013-09-10 18:40:41 +0000486 return ObjectPointer;
487}
488
Stephen Hinesdce4a402014-05-29 02:49:00 -0700489void DwarfDebug::createAndAddScopeChildren(DwarfCompileUnit &TheCU,
490 LexicalScope *Scope, DIE &ScopeDIE) {
491 // We create children when the scope DIE is not null.
492 SmallVector<std::unique_ptr<DIE>, 8> Children;
493 if (DIE *ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children))
494 TheCU.addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000495
Devang Patel5bc9fec2011-02-19 01:31:27 +0000496 // Add children
Stephen Hinesdce4a402014-05-29 02:49:00 -0700497 for (auto &I : Children)
498 ScopeDIE.addChild(std::move(I));
499}
Devang Patel193f7202009-11-24 01:14:22 +0000500
Stephen Hinesdce4a402014-05-29 02:49:00 -0700501void DwarfDebug::constructAbstractSubprogramScopeDIE(DwarfCompileUnit &TheCU,
502 LexicalScope *Scope) {
503 assert(Scope && Scope->getScopeNode());
504 assert(Scope->isAbstractScope());
505 assert(!Scope->getInlinedAt());
506
507 DISubprogram SP(Scope->getScopeNode());
508
509 ProcessedSPNodes.insert(SP);
510
511 DIE *&AbsDef = AbstractSPDies[SP];
512 if (AbsDef)
513 return;
514
515 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
516 // was inlined from another compile unit.
517 DwarfCompileUnit &SPCU = *SPMap[SP];
518 DIE *ContextDIE;
519
520 // Some of this is duplicated from DwarfUnit::getOrCreateSubprogramDIE, with
521 // the important distinction that the DIDescriptor is not associated with the
522 // DIE (since the DIDescriptor will be associated with the concrete DIE, if
523 // any). It could be refactored to some common utility function.
524 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
525 ContextDIE = &SPCU.getUnitDie();
526 SPCU.getOrCreateSubprogramDIE(SPDecl);
527 } else
528 ContextDIE = SPCU.getOrCreateContextDIE(resolve(SP.getContext()));
529
530 // Passing null as the associated DIDescriptor because the abstract definition
531 // shouldn't be found by lookup.
532 AbsDef = &SPCU.createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE,
533 DIDescriptor());
534 SPCU.applySubprogramAttributes(SP, *AbsDef);
535 SPCU.addGlobalName(SP.getName(), *AbsDef, resolve(SP.getContext()));
536
537 SPCU.addUInt(*AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
538 createAndAddScopeChildren(SPCU, Scope, *AbsDef);
539}
540
541DIE &DwarfDebug::constructSubprogramScopeDIE(DwarfCompileUnit &TheCU,
542 LexicalScope *Scope) {
543 assert(Scope && Scope->getScopeNode());
544 assert(!Scope->getInlinedAt());
545 assert(!Scope->isAbstractScope());
546 DISubprogram Sub(Scope->getScopeNode());
547
548 assert(Sub.isSubprogram());
549
550 ProcessedSPNodes.insert(Sub);
551
552 DIE &ScopeDIE = updateSubprogramScopeDIE(TheCU, Sub);
553
554 createAndAddScopeChildren(TheCU, Scope, ScopeDIE);
Eric Christophere5212782012-09-12 23:36:19 +0000555
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000556 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +0000557}
558
Stephen Hinesdce4a402014-05-29 02:49:00 -0700559// Construct a DIE for this scope.
560std::unique_ptr<DIE> DwarfDebug::constructScopeDIE(DwarfCompileUnit &TheCU,
561 LexicalScope *Scope) {
562 if (!Scope || !Scope->getScopeNode())
563 return nullptr;
564
565 DIScope DS(Scope->getScopeNode());
566
567 assert((Scope->getInlinedAt() || !DS.isSubprogram()) &&
568 "Only handle inlined subprograms here, use "
569 "constructSubprogramScopeDIE for non-inlined "
570 "subprograms");
571
572 SmallVector<std::unique_ptr<DIE>, 8> Children;
573
574 // We try to create the scope DIE first, then the children DIEs. This will
575 // avoid creating un-used children then removing them later when we find out
576 // the scope DIE is null.
577 std::unique_ptr<DIE> ScopeDIE;
578 if (Scope->getParent() && DS.isSubprogram()) {
579 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
580 if (!ScopeDIE)
581 return nullptr;
582 // We create children when the scope DIE is not null.
583 createScopeChildrenDIE(TheCU, Scope, Children);
584 } else {
585 // Early exit when we know the scope DIE is going to be null.
586 if (isLexicalScopeDIENull(Scope))
587 return nullptr;
588
589 // We create children here when we know the scope DIE is not going to be
590 // null and the children will be added to the scope DIE.
591 createScopeChildrenDIE(TheCU, Scope, Children);
592
593 // There is no need to emit empty lexical block DIE.
594 std::pair<ImportedEntityMap::const_iterator,
595 ImportedEntityMap::const_iterator> Range =
596 std::equal_range(ScopesWithImportedEntities.begin(),
597 ScopesWithImportedEntities.end(),
598 std::pair<const MDNode *, const MDNode *>(DS, nullptr),
599 less_first());
600 if (Children.empty() && Range.first == Range.second)
601 return nullptr;
602 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
603 assert(ScopeDIE && "Scope DIE should not be null.");
604 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
605 ++i)
606 constructImportedEntityDIE(TheCU, i->second, *ScopeDIE);
607 }
608
609 // Add children
610 for (auto &I : Children)
611 ScopeDIE->addChild(std::move(I));
612
613 return ScopeDIE;
614}
615
616void DwarfDebug::addGnuPubAttributes(DwarfUnit &U, DIE &D) const {
Stephen Hines36b56882014-04-23 16:57:46 -0700617 if (!GenerateGnuPubSections)
618 return;
Rafael Espindola5e195a42013-10-05 16:42:21 +0000619
Stephen Hinesdce4a402014-05-29 02:49:00 -0700620 U.addFlag(D, dwarf::DW_AT_GNU_pubnames);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000621}
622
Stephen Hines36b56882014-04-23 16:57:46 -0700623// Create new DwarfCompileUnit for the given metadata node with tag
Eric Christopher72c16552012-12-20 21:58:40 +0000624// DW_TAG_compile_unit.
Stephen Hinesdce4a402014-05-29 02:49:00 -0700625DwarfCompileUnit &DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) {
Devang Patel65dbc902009-11-25 17:36:49 +0000626 StringRef FN = DIUnit.getFilename();
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000627 CompilationDir = DIUnit.getDirectory();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000628
Stephen Hinesdce4a402014-05-29 02:49:00 -0700629 auto OwnedUnit = make_unique<DwarfCompileUnit>(
630 InfoHolder.getUnits().size(), DIUnit, Asm, this, &InfoHolder);
631 DwarfCompileUnit &NewCU = *OwnedUnit;
632 DIE &Die = NewCU.getUnitDie();
633 InfoHolder.addUnit(std::move(OwnedUnit));
Manman Ren3de61b42013-03-07 01:42:00 +0000634
Stephen Hines36b56882014-04-23 16:57:46 -0700635 // LTO with assembly output shares a single line table amongst multiple CUs.
636 // To avoid the compilation directory being ambiguous, let the line table
637 // explicitly describe the directory of all files, never relying on the
638 // compilation directory.
639 if (!Asm->OutStreamer.hasRawTextSupport() || SingleCU)
640 Asm->OutStreamer.getContext().setMCLineTableCompilationDir(
Stephen Hinesdce4a402014-05-29 02:49:00 -0700641 NewCU.getUniqueID(), CompilationDir);
Manman Ren3de61b42013-03-07 01:42:00 +0000642
Stephen Hinesdce4a402014-05-29 02:49:00 -0700643 NewCU.addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
644 NewCU.addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
645 DIUnit.getLanguage());
646 NewCU.addString(Die, dwarf::DW_AT_name, FN);
Eric Christophere0828ec2013-04-09 19:23:15 +0000647
Eric Christophere0828ec2013-04-09 19:23:15 +0000648 if (!useSplitDwarf()) {
Stephen Hinesdce4a402014-05-29 02:49:00 -0700649 NewCU.initStmtList(DwarfLineSectionSym);
Eric Christopher0b15e982013-09-27 22:50:48 +0000650
651 // If we're using split dwarf the compilation dir is going to be in the
652 // skeleton CU and so we don't need to duplicate it here.
653 if (!CompilationDir.empty())
Stephen Hinesdce4a402014-05-29 02:49:00 -0700654 NewCU.addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher0b15e982013-09-27 22:50:48 +0000655
Stephen Hines36b56882014-04-23 16:57:46 -0700656 addGnuPubAttributes(NewCU, Die);
Eric Christophere0828ec2013-04-09 19:23:15 +0000657 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000658
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000659 if (DIUnit.isOptimized())
Stephen Hinesdce4a402014-05-29 02:49:00 -0700660 NewCU.addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000661
Devang Patel65dbc902009-11-25 17:36:49 +0000662 StringRef Flags = DIUnit.getFlags();
663 if (!Flags.empty())
Stephen Hinesdce4a402014-05-29 02:49:00 -0700664 NewCU.addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000665
Nick Lewyckyd5d52132011-10-17 23:27:36 +0000666 if (unsigned RVer = DIUnit.getRunTimeVersion())
Stephen Hinesdce4a402014-05-29 02:49:00 -0700667 NewCU.addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
668 dwarf::DW_FORM_data1, RVer);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000669
Devang Patel163a9f72010-05-10 22:49:55 +0000670 if (!FirstCU)
Stephen Hinesdce4a402014-05-29 02:49:00 -0700671 FirstCU = &NewCU;
Eric Christopher208cc6f2013-02-05 07:31:55 +0000672
Stephen Hines36b56882014-04-23 16:57:46 -0700673 if (useSplitDwarf()) {
Stephen Hinesdce4a402014-05-29 02:49:00 -0700674 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoDWOSection(),
675 DwarfInfoDWOSectionSym);
676 NewCU.setSkeleton(constructSkeletonCU(NewCU));
Stephen Hines36b56882014-04-23 16:57:46 -0700677 } else
Stephen Hinesdce4a402014-05-29 02:49:00 -0700678 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
679 DwarfInfoSectionSym);
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000680
Stephen Hinesdce4a402014-05-29 02:49:00 -0700681 CUMap.insert(std::make_pair(DIUnit, &NewCU));
682 CUDieMap.insert(std::make_pair(&Die, &NewCU));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000683 return NewCU;
Devang Patel163a9f72010-05-10 22:49:55 +0000684}
685
Stephen Hinesdce4a402014-05-29 02:49:00 -0700686void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
David Blaikiec462db62013-04-22 06:12:31 +0000687 const MDNode *N) {
David Blaikie20d9e412013-05-07 21:35:53 +0000688 DIImportedEntity Module(N);
Stephen Hines36b56882014-04-23 16:57:46 -0700689 assert(Module.Verify());
Stephen Hinesdce4a402014-05-29 02:49:00 -0700690 if (DIE *D = TheCU.getOrCreateContextDIE(Module.getContext()))
691 constructImportedEntityDIE(TheCU, Module, *D);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000692}
693
Stephen Hinesdce4a402014-05-29 02:49:00 -0700694void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
695 const MDNode *N, DIE &Context) {
David Blaikie20d9e412013-05-07 21:35:53 +0000696 DIImportedEntity Module(N);
Stephen Hines36b56882014-04-23 16:57:46 -0700697 assert(Module.Verify());
David Blaikied1221e32013-05-08 06:01:38 +0000698 return constructImportedEntityDIE(TheCU, Module, Context);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000699}
700
Stephen Hinesdce4a402014-05-29 02:49:00 -0700701void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
David Blaikie20d9e412013-05-07 21:35:53 +0000702 const DIImportedEntity &Module,
Stephen Hinesdce4a402014-05-29 02:49:00 -0700703 DIE &Context) {
David Blaikied2e0f7e2013-05-06 23:33:07 +0000704 assert(Module.Verify() &&
705 "Use one of the MDNode * overloads to handle invalid metadata");
Stephen Hinesdce4a402014-05-29 02:49:00 -0700706 DIE &IMDie = TheCU.createAndAddDIE(Module.getTag(), Context, Module);
David Blaikie20d9e412013-05-07 21:35:53 +0000707 DIE *EntityDie;
Stephen Hines36b56882014-04-23 16:57:46 -0700708 DIDescriptor Entity = resolve(Module.getEntity());
David Blaikie20d9e412013-05-07 21:35:53 +0000709 if (Entity.isNameSpace())
Stephen Hinesdce4a402014-05-29 02:49:00 -0700710 EntityDie = TheCU.getOrCreateNameSpace(DINameSpace(Entity));
David Blaikie20d9e412013-05-07 21:35:53 +0000711 else if (Entity.isSubprogram())
Stephen Hinesdce4a402014-05-29 02:49:00 -0700712 EntityDie = TheCU.getOrCreateSubprogramDIE(DISubprogram(Entity));
David Blaikieaa76a932013-05-08 06:01:41 +0000713 else if (Entity.isType())
Stephen Hinesdce4a402014-05-29 02:49:00 -0700714 EntityDie = TheCU.getOrCreateTypeDIE(DIType(Entity));
David Blaikie20d9e412013-05-07 21:35:53 +0000715 else
Stephen Hinesdce4a402014-05-29 02:49:00 -0700716 EntityDie = TheCU.getDIE(Entity);
717 TheCU.addSourceLine(IMDie, Module.getLineNumber(),
718 Module.getContext().getFilename(),
719 Module.getContext().getDirectory());
720 TheCU.addDIEEntry(IMDie, dwarf::DW_AT_import, *EntityDie);
David Blaikie7b72cc72013-05-20 22:50:35 +0000721 StringRef Name = Module.getName();
722 if (!Name.empty())
Stephen Hinesdce4a402014-05-29 02:49:00 -0700723 TheCU.addString(IMDie, dwarf::DW_AT_name, Name);
David Blaikiec462db62013-04-22 06:12:31 +0000724}
725
Eric Christopherb6dc8652012-11-27 22:43:45 +0000726// Emit all Dwarf sections that should come prior to the content. Create
727// global DIEs and emit initial debug info sections. This is invoked by
728// the target AsmPrinter.
Eric Christopherc4639d62012-11-19 22:42:15 +0000729void DwarfDebug::beginModule() {
Devang Pateleac9c072010-04-27 19:46:33 +0000730 if (DisableDebugInfoPrinting)
731 return;
732
Eric Christopherc4639d62012-11-19 22:42:15 +0000733 const Module *M = MMI->getModule();
734
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000735 // If module has named metadata anchors then use them, otherwise scan the
736 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +0000737 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiec0ec8a42013-03-11 23:39:23 +0000738 if (!CU_Nodes)
Devang Patel02e603f2011-08-15 23:47:24 +0000739 return;
Manman Renbc660712013-09-05 18:48:31 +0000740 TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
Devang Patel30692ab2011-05-03 16:45:22 +0000741
David Blaikiec0ec8a42013-03-11 23:39:23 +0000742 // Emit initial sections so we can reference labels later.
743 emitSectionLabels();
744
Stephen Hines36b56882014-04-23 16:57:46 -0700745 SingleCU = CU_Nodes->getNumOperands() == 1;
746
747 for (MDNode *N : CU_Nodes->operands()) {
748 DICompileUnit CUNode(N);
Stephen Hinesdce4a402014-05-29 02:49:00 -0700749 DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode);
David Blaikie20d9e412013-05-07 21:35:53 +0000750 DIArray ImportedEntities = CUNode.getImportedEntities();
751 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikied2e0f7e2013-05-06 23:33:07 +0000752 ScopesWithImportedEntities.push_back(std::make_pair(
David Blaikie20d9e412013-05-07 21:35:53 +0000753 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
754 ImportedEntities.getElement(i)));
David Blaikied2e0f7e2013-05-06 23:33:07 +0000755 std::sort(ScopesWithImportedEntities.begin(),
Benjamin Kramer0b6962f2013-08-24 12:54:27 +0000756 ScopesWithImportedEntities.end(), less_first());
David Blaikiec0ec8a42013-03-11 23:39:23 +0000757 DIArray GVs = CUNode.getGlobalVariables();
758 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
Stephen Hinesdce4a402014-05-29 02:49:00 -0700759 CU.createGlobalVariableDIE(DIGlobalVariable(GVs.getElement(i)));
David Blaikiec0ec8a42013-03-11 23:39:23 +0000760 DIArray SPs = CUNode.getSubprograms();
761 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
Stephen Hinesdce4a402014-05-29 02:49:00 -0700762 SPMap.insert(std::make_pair(SPs.getElement(i), &CU));
David Blaikiec0ec8a42013-03-11 23:39:23 +0000763 DIArray EnumTypes = CUNode.getEnumTypes();
764 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
Stephen Hinesdce4a402014-05-29 02:49:00 -0700765 CU.getOrCreateTypeDIE(EnumTypes.getElement(i));
David Blaikiec0ec8a42013-03-11 23:39:23 +0000766 DIArray RetainedTypes = CUNode.getRetainedTypes();
Stephen Hines36b56882014-04-23 16:57:46 -0700767 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i) {
768 DIType Ty(RetainedTypes.getElement(i));
769 // The retained types array by design contains pointers to
770 // MDNodes rather than DIRefs. Unique them here.
771 DIType UniqueTy(resolve(Ty.getRef()));
Stephen Hinesdce4a402014-05-29 02:49:00 -0700772 CU.getOrCreateTypeDIE(UniqueTy);
Stephen Hines36b56882014-04-23 16:57:46 -0700773 }
David Blaikiec462db62013-04-22 06:12:31 +0000774 // Emit imported_modules last so that the relevant context is already
775 // available.
David Blaikie20d9e412013-05-07 21:35:53 +0000776 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
777 constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
David Blaikiec0ec8a42013-03-11 23:39:23 +0000778 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000779
Chris Lattnerd850ac72010-04-05 02:19:28 +0000780 // Tell MMI that we have debug info.
781 MMI->setDebugInfoAvailability(true);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000782
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000783 // Prime section data.
Richard Mitton5cc319a2013-09-19 23:21:01 +0000784 SectionMap[Asm->getObjFileLowering().getTextSection()];
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000785}
786
Stephen Hinesdce4a402014-05-29 02:49:00 -0700787void DwarfDebug::finishSubprogramDefinitions() {
788 const Module *M = MMI->getModule();
Stephen Hines36b56882014-04-23 16:57:46 -0700789
Stephen Hinesdce4a402014-05-29 02:49:00 -0700790 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
791 for (MDNode *N : CU_Nodes->operands()) {
792 DICompileUnit TheCU(N);
793 // Construct subprogram DIE and add variables DIEs.
794 DwarfCompileUnit *SPCU =
795 static_cast<DwarfCompileUnit *>(CUMap.lookup(TheCU));
796 DIArray Subprograms = TheCU.getSubprograms();
797 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
798 DISubprogram SP(Subprograms.getElement(i));
799 // Perhaps the subprogram is in another CU (such as due to comdat
800 // folding, etc), in which case ignore it here.
801 if (SPMap[SP] != SPCU)
802 continue;
803 DIE *D = SPCU->getDIE(SP);
804 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SP)) {
805 if (D)
806 // If this subprogram has an abstract definition, reference that
807 SPCU->addDIEEntry(*D, dwarf::DW_AT_abstract_origin, *AbsSPDIE);
808 } else {
809 if (!D)
810 // Lazily construct the subprogram if we didn't see either concrete or
811 // inlined versions during codegen.
812 D = SPCU->getOrCreateSubprogramDIE(SP);
813 // And attach the attributes
814 SPCU->applySubprogramAttributes(SP, *D);
815 SPCU->addGlobalName(SP.getName(), *D, resolve(SP.getContext()));
816 }
817 }
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000818 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000819}
820
Stephen Hinesdce4a402014-05-29 02:49:00 -0700821
Eric Christopher4117bec2012-11-22 00:59:49 +0000822// Collect info for variables that were optimized out.
823void DwarfDebug::collectDeadVariables() {
824 const Module *M = MMI->getModule();
Eric Christopher4117bec2012-11-22 00:59:49 +0000825
826 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
Stephen Hines36b56882014-04-23 16:57:46 -0700827 for (MDNode *N : CU_Nodes->operands()) {
828 DICompileUnit TheCU(N);
Stephen Hinesdce4a402014-05-29 02:49:00 -0700829 // Construct subprogram DIE and add variables DIEs.
830 DwarfCompileUnit *SPCU =
831 static_cast<DwarfCompileUnit *>(CUMap.lookup(TheCU));
832 assert(SPCU && "Unable to find Compile Unit!");
Eric Christopher4117bec2012-11-22 00:59:49 +0000833 DIArray Subprograms = TheCU.getSubprograms();
834 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopherbdab8002012-11-27 00:13:51 +0000835 DISubprogram SP(Subprograms.getElement(i));
Eric Christopherc6228242013-10-15 23:31:38 +0000836 if (ProcessedSPNodes.count(SP) != 0)
837 continue;
Stephen Hinesdce4a402014-05-29 02:49:00 -0700838 assert(SP.isSubprogram() &&
839 "CU's subprogram list contains a non-subprogram");
840 assert(SP.isDefinition() &&
841 "CU's subprogram list contains a subprogram declaration");
Eric Christopherbdab8002012-11-27 00:13:51 +0000842 DIArray Variables = SP.getVariables();
Eric Christopherc6228242013-10-15 23:31:38 +0000843 if (Variables.getNumElements() == 0)
844 continue;
Eric Christopher4117bec2012-11-22 00:59:49 +0000845
Stephen Hinesdce4a402014-05-29 02:49:00 -0700846 DIE *SPDIE = AbstractSPDies.lookup(SP);
847 if (!SPDIE)
848 SPDIE = SPCU->getDIE(SP);
849 assert(SPDIE);
Eric Christopherbdab8002012-11-27 00:13:51 +0000850 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
851 DIVariable DV(Variables.getElement(vi));
Stephen Hinesdce4a402014-05-29 02:49:00 -0700852 assert(DV.isVariable());
853 DbgVariable NewVar(DV, nullptr, this);
854 SPDIE->addChild(SPCU->constructVariableDIE(NewVar));
Eric Christopherbdab8002012-11-27 00:13:51 +0000855 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000856 }
857 }
858 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000859}
860
861void DwarfDebug::finalizeModuleInfo() {
Stephen Hinesdce4a402014-05-29 02:49:00 -0700862 finishSubprogramDefinitions();
863
Eric Christopher4117bec2012-11-22 00:59:49 +0000864 // Collect info for variables that were optimized out.
865 collectDeadVariables();
866
Stephen Hines36b56882014-04-23 16:57:46 -0700867 // Handle anything that needs to be done on a per-unit basis after
868 // all other generation.
Stephen Hinesdce4a402014-05-29 02:49:00 -0700869 for (const auto &TheU : getUnits()) {
Eric Christopherf962c022013-08-12 20:27:48 +0000870 // Emit DW_AT_containing_type attribute to connect types with their
871 // vtable holding type.
Stephen Hines36b56882014-04-23 16:57:46 -0700872 TheU->constructContainingTypeDIEs();
Eric Christopherf962c022013-08-12 20:27:48 +0000873
Stephen Hines36b56882014-04-23 16:57:46 -0700874 // Add CU specific attributes if we need to add any.
Stephen Hinesdce4a402014-05-29 02:49:00 -0700875 if (TheU->getUnitDie().getTag() == dwarf::DW_TAG_compile_unit) {
Stephen Hines36b56882014-04-23 16:57:46 -0700876 // If we're splitting the dwarf out now that we've got the entire
877 // CU then add the dwo id to it.
878 DwarfCompileUnit *SkCU =
879 static_cast<DwarfCompileUnit *>(TheU->getSkeleton());
880 if (useSplitDwarf()) {
881 // Emit a unique identifier for this CU.
Stephen Hinesdce4a402014-05-29 02:49:00 -0700882 uint64_t ID = DIEHash(Asm).computeCUSignature(TheU->getUnitDie());
Stephen Hines36b56882014-04-23 16:57:46 -0700883 TheU->addUInt(TheU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
884 dwarf::DW_FORM_data8, ID);
885 SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
886 dwarf::DW_FORM_data8, ID);
887
888 // We don't keep track of which addresses are used in which CU so this
889 // is a bit pessimistic under LTO.
Stephen Hinesdce4a402014-05-29 02:49:00 -0700890 if (!AddrPool.isEmpty())
891 addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
Stephen Hines36b56882014-04-23 16:57:46 -0700892 dwarf::DW_AT_GNU_addr_base, DwarfAddrSectionSym,
893 DwarfAddrSectionSym);
894 if (!TheU->getRangeLists().empty())
Stephen Hinesdce4a402014-05-29 02:49:00 -0700895 addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
Stephen Hines36b56882014-04-23 16:57:46 -0700896 dwarf::DW_AT_GNU_ranges_base,
897 DwarfDebugRangeSectionSym, DwarfDebugRangeSectionSym);
Eric Christopher0710bfa2013-08-13 01:21:55 +0000898 }
Stephen Hines36b56882014-04-23 16:57:46 -0700899
900 // If we have code split among multiple sections or non-contiguous
901 // ranges of code then emit a DW_AT_ranges attribute on the unit that will
902 // remain in the .o file, otherwise add a DW_AT_low_pc.
903 // FIXME: We should use ranges allow reordering of code ala
904 // .subsections_via_symbols in mach-o. This would mean turning on
905 // ranges for all subprogram DIEs for mach-o.
Stephen Hinesdce4a402014-05-29 02:49:00 -0700906 DwarfCompileUnit &U =
907 SkCU ? *SkCU : static_cast<DwarfCompileUnit &>(*TheU);
Stephen Hines36b56882014-04-23 16:57:46 -0700908 unsigned NumRanges = TheU->getRanges().size();
909 if (NumRanges) {
910 if (NumRanges > 1) {
Stephen Hinesdce4a402014-05-29 02:49:00 -0700911 addSectionLabel(*Asm, U, U.getUnitDie(), dwarf::DW_AT_ranges,
912 Asm->GetTempSymbol("cu_ranges", U.getUniqueID()),
Stephen Hines36b56882014-04-23 16:57:46 -0700913 DwarfDebugRangeSectionSym);
914
915 // A DW_AT_low_pc attribute may also be specified in combination with
916 // DW_AT_ranges to specify the default base address for use in
917 // location lists (see Section 2.6.2) and range lists (see Section
918 // 2.17.3).
Stephen Hinesdce4a402014-05-29 02:49:00 -0700919 U.addUInt(U.getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
920 0);
Stephen Hines36b56882014-04-23 16:57:46 -0700921 } else {
922 RangeSpan &Range = TheU->getRanges().back();
Stephen Hinesdce4a402014-05-29 02:49:00 -0700923 U.addLocalLabelAddress(U.getUnitDie(), dwarf::DW_AT_low_pc,
924 Range.getStart());
925 U.addLabelDelta(U.getUnitDie(), dwarf::DW_AT_high_pc, Range.getEnd(),
926 Range.getStart());
Stephen Hines36b56882014-04-23 16:57:46 -0700927 }
928 }
Eric Christopherf962c022013-08-12 20:27:48 +0000929 }
930 }
931
932 // Compute DIE offsets and sizes.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000933 InfoHolder.computeSizeAndOffsets();
934 if (useSplitDwarf())
935 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher4117bec2012-11-22 00:59:49 +0000936}
937
938void DwarfDebug::endSections() {
Stephen Hines36b56882014-04-23 16:57:46 -0700939 // Filter labels by section.
940 for (const SymbolCU &SCU : ArangeLabels) {
Richard Mitton5cc319a2013-09-19 23:21:01 +0000941 if (SCU.Sym->isInSection()) {
942 // Make a note of this symbol and it's section.
943 const MCSection *Section = &SCU.Sym->getSection();
944 if (!Section->getKind().isMetadata())
945 SectionMap[Section].push_back(SCU);
946 } else {
947 // Some symbols (e.g. common/bss on mach-o) can have no section but still
948 // appear in the output. This sucks as we rely on sections to build
949 // arange spans. We can do it without, but it's icky.
Stephen Hinesdce4a402014-05-29 02:49:00 -0700950 SectionMap[nullptr].push_back(SCU);
Richard Mitton5cc319a2013-09-19 23:21:01 +0000951 }
952 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000953
Richard Mitton7c9659a2013-10-03 22:07:08 +0000954 // Build a list of sections used.
955 std::vector<const MCSection *> Sections;
Stephen Hines36b56882014-04-23 16:57:46 -0700956 for (const auto &it : SectionMap) {
957 const MCSection *Section = it.first;
Richard Mitton7c9659a2013-10-03 22:07:08 +0000958 Sections.push_back(Section);
959 }
960
961 // Sort the sections into order.
962 // This is only done to ensure consistent output order across different runs.
963 std::sort(Sections.begin(), Sections.end(), SectionSort);
964
965 // Add terminating symbols for each section.
Stephen Hines36b56882014-04-23 16:57:46 -0700966 for (unsigned ID = 0, E = Sections.size(); ID != E; ID++) {
Richard Mitton7c9659a2013-10-03 22:07:08 +0000967 const MCSection *Section = Sections[ID];
Stephen Hinesdce4a402014-05-29 02:49:00 -0700968 MCSymbol *Sym = nullptr;
Richard Mitton5cc319a2013-09-19 23:21:01 +0000969
970 if (Section) {
Richard Mitton7c9659a2013-10-03 22:07:08 +0000971 // We can't call MCSection::getLabelEndName, as it's only safe to do so
Stephen Hines36b56882014-04-23 16:57:46 -0700972 // if we know the section name up-front. For user-created sections, the
973 // resulting label may not be valid to use as a label. (section names can
974 // use a greater set of characters on some systems)
Richard Mitton7c9659a2013-10-03 22:07:08 +0000975 Sym = Asm->GetTempSymbol("debug_end", ID);
Richard Mitton5cc319a2013-09-19 23:21:01 +0000976 Asm->OutStreamer.SwitchSection(Section);
977 Asm->OutStreamer.EmitLabel(Sym);
978 }
979
980 // Insert a final terminator.
Stephen Hinesdce4a402014-05-29 02:49:00 -0700981 SectionMap[Section].push_back(SymbolCU(nullptr, Sym));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000982 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000983}
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000984
Eric Christopherb6dc8652012-11-27 22:43:45 +0000985// Emit all Dwarf sections that should come after the content.
Eric Christopher4117bec2012-11-22 00:59:49 +0000986void DwarfDebug::endModule() {
Stephen Hinesdce4a402014-05-29 02:49:00 -0700987 assert(CurFn == nullptr);
988 assert(CurMI == nullptr);
Eric Christopher4117bec2012-11-22 00:59:49 +0000989
Stephen Hines36b56882014-04-23 16:57:46 -0700990 if (!FirstCU)
991 return;
Eric Christopher4117bec2012-11-22 00:59:49 +0000992
993 // End any existing sections.
994 // TODO: Does this need to happen?
995 endSections();
996
997 // Finalize the debug info for the module.
998 finalizeModuleInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000999
Stephen Hines36b56882014-04-23 16:57:46 -07001000 emitDebugStr();
Eric Christopher9e0b08d2013-09-20 23:22:52 +00001001
Stephen Hines36b56882014-04-23 16:57:46 -07001002 // Emit all the DIEs into a debug info section.
1003 emitDebugInfo();
Eric Christopher74802f72012-11-27 00:41:54 +00001004
Stephen Hines36b56882014-04-23 16:57:46 -07001005 // Corresponding abbreviations into a abbrev section.
1006 emitAbbreviations();
Eric Christopher42885022012-11-27 22:43:42 +00001007
Stephen Hines36b56882014-04-23 16:57:46 -07001008 // Emit info into a debug aranges section.
1009 if (GenerateARangeSection)
Eric Christopher42885022012-11-27 22:43:42 +00001010 emitDebugARanges();
1011
Stephen Hines36b56882014-04-23 16:57:46 -07001012 // Emit info into a debug ranges section.
1013 emitDebugRanges();
Eric Christopher42885022012-11-27 22:43:42 +00001014
Stephen Hines36b56882014-04-23 16:57:46 -07001015 if (useSplitDwarf()) {
1016 emitDebugStrDWO();
Eric Christopher98e237f2012-11-30 23:59:06 +00001017 emitDebugInfoDWO();
Eric Christopher6eebe472012-12-19 22:02:53 +00001018 emitDebugAbbrevDWO();
Stephen Hines36b56882014-04-23 16:57:46 -07001019 emitDebugLineDWO();
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001020 // Emit DWO addresses.
Stephen Hinesdce4a402014-05-29 02:49:00 -07001021 AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection());
Stephen Hines36b56882014-04-23 16:57:46 -07001022 emitDebugLocDWO();
1023 } else
1024 // Emit info into a debug loc section.
1025 emitDebugLoc();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001026
Eric Christopher9d9f5a52012-08-23 07:32:06 +00001027 // Emit info into the dwarf accelerator table sections.
Eric Christopher20f47ab2012-08-23 22:36:40 +00001028 if (useDwarfAccelTables()) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001029 emitAccelNames();
1030 emitAccelObjC();
1031 emitAccelNamespaces();
1032 emitAccelTypes();
1033 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001034
Eric Christopher26123542013-08-30 00:40:17 +00001035 // Emit the pubnames and pubtypes sections if requested.
1036 if (HasDwarfPubSections) {
David Blaikiee56a4d92013-09-19 17:33:35 +00001037 emitDebugPubNames(GenerateGnuPubSections);
1038 emitDebugPubTypes(GenerateGnuPubSections);
Eric Christopher26123542013-08-30 00:40:17 +00001039 }
Devang Patel193f7202009-11-24 01:14:22 +00001040
Devang Patele9a1cca2010-08-02 17:32:15 +00001041 // clean up.
Devang Patel94c7ddb2011-08-16 22:09:43 +00001042 SPMap.clear();
Stephen Hinesdce4a402014-05-29 02:49:00 -07001043 AbstractVariables.clear();
Eric Christopher9ec87b32012-12-10 19:51:18 +00001044
Eric Christopher98e237f2012-11-30 23:59:06 +00001045 // Reset these for the next Module if we have one.
Stephen Hinesdce4a402014-05-29 02:49:00 -07001046 FirstCU = nullptr;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001047}
1048
Eric Christopherb6dc8652012-11-27 22:43:45 +00001049// Find abstract variable, if any, associated with Var.
Devang Patelb549bcf2011-08-10 21:50:54 +00001050DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattnerde4845c2010-04-02 19:42:39 +00001051 DebugLoc ScopeLoc) {
Stephen Hinesdce4a402014-05-29 02:49:00 -07001052 return findAbstractVariable(DV, ScopeLoc.getScope(DV->getContext()));
1053}
1054
1055DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
1056 const MDNode *ScopeNode) {
Devang Patelb549bcf2011-08-10 21:50:54 +00001057 LLVMContext &Ctx = DV->getContext();
1058 // More then one inlined variable corresponds to one abstract variable.
1059 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Stephen Hinesdce4a402014-05-29 02:49:00 -07001060 auto I = AbstractVariables.find(Var);
1061 if (I != AbstractVariables.end())
1062 return I->second.get();
Devang Patel53bb5c92009-11-10 23:06:00 +00001063
Stephen Hinesdce4a402014-05-29 02:49:00 -07001064 LexicalScope *Scope = LScopes.findAbstractScope(ScopeNode);
Devang Patel53bb5c92009-11-10 23:06:00 +00001065 if (!Scope)
Stephen Hinesdce4a402014-05-29 02:49:00 -07001066 return nullptr;
Devang Patel53bb5c92009-11-10 23:06:00 +00001067
Stephen Hinesdce4a402014-05-29 02:49:00 -07001068 auto AbsDbgVariable = make_unique<DbgVariable>(Var, nullptr, this);
1069 addScopeVariable(Scope, AbsDbgVariable.get());
1070 return (AbstractVariables[Var] = std::move(AbsDbgVariable)).get();
Devang Patel53bb5c92009-11-10 23:06:00 +00001071}
1072
Eric Christopherb6dc8652012-11-27 22:43:45 +00001073// If Var is a current function argument then add it to CurrentFnArguments list.
Stephen Hines36b56882014-04-23 16:57:46 -07001074bool DwarfDebug::addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001075 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +00001076 return false;
1077 DIVariable DV = Var->getVariable();
1078 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1079 return false;
1080 unsigned ArgNo = DV.getArgNumber();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001081 if (ArgNo == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001082 return false;
1083
Devang Patelcb3a6572011-03-03 20:02:02 +00001084 size_t Size = CurrentFnArguments.size();
1085 if (Size == 0)
Stephen Hines36b56882014-04-23 16:57:46 -07001086 CurrentFnArguments.resize(CurFn->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00001087 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00001088 // arguments does the function have at source level.
1089 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00001090 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00001091 CurrentFnArguments[ArgNo - 1] = Var;
1092 return true;
1093}
1094
Eric Christopherb6dc8652012-11-27 22:43:45 +00001095// Collect variable information from side table maintained by MMI.
Stephen Hines36b56882014-04-23 16:57:46 -07001096void DwarfDebug::collectVariableInfoFromMMITable(
1097 SmallPtrSet<const MDNode *, 16> &Processed) {
1098 for (const auto &VI : MMI->getVariableDbgInfo()) {
1099 if (!VI.Var)
1100 continue;
1101 Processed.insert(VI.Var);
1102 DIVariable DV(VI.Var);
1103 LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001104
Devang Patelfb0ee432009-11-10 23:20:04 +00001105 // If variable scope is not found then skip this variable.
Stephen Hinesdce4a402014-05-29 02:49:00 -07001106 if (!Scope)
Devang Patelfb0ee432009-11-10 23:20:04 +00001107 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001108
Stephen Hines36b56882014-04-23 16:57:46 -07001109 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VI.Loc);
Manman Renc664d762013-10-05 01:43:03 +00001110 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable, this);
Stephen Hines36b56882014-04-23 16:57:46 -07001111 RegVar->setFrameIndex(VI.Slot);
1112 if (!addCurrentFnArgument(RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001113 addScopeVariable(Scope, RegVar);
Devang Patele717faa2009-10-06 01:26:37 +00001114 }
Devang Patelee432862010-05-20 19:57:06 +00001115}
Devang Patel90a48ad2010-03-15 18:33:46 +00001116
Eric Christopherb6dc8652012-11-27 22:43:45 +00001117// Get .debug_loc entry for the instruction range starting at MI.
Stephen Hinesdce4a402014-05-29 02:49:00 -07001118static DebugLocEntry::Value getDebugLocValue(const MachineInstr *MI) {
1119 const MDNode *Var = MI->getDebugVariable();
Devang Patel90b40412011-07-08 17:09:57 +00001120
David Blaikie6d9dbd52013-06-16 20:34:15 +00001121 assert(MI->getNumOperands() == 3);
Adrian Prantl35176402013-07-09 20:28:37 +00001122 if (MI->getOperand(0).isReg()) {
Devang Patel90b40412011-07-08 17:09:57 +00001123 MachineLocation MLoc;
Adrian Prantl35176402013-07-09 20:28:37 +00001124 // If the second operand is an immediate, this is a
1125 // register-indirect address.
1126 if (!MI->getOperand(1).isImm())
Adrian Prantl13131e62013-04-26 21:57:17 +00001127 MLoc.set(MI->getOperand(0).getReg());
1128 else
1129 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Stephen Hinesdce4a402014-05-29 02:49:00 -07001130 return DebugLocEntry::Value(Var, MLoc);
Devang Patel90b40412011-07-08 17:09:57 +00001131 }
1132 if (MI->getOperand(0).isImm())
Stephen Hinesdce4a402014-05-29 02:49:00 -07001133 return DebugLocEntry::Value(Var, MI->getOperand(0).getImm());
Devang Patel90b40412011-07-08 17:09:57 +00001134 if (MI->getOperand(0).isFPImm())
Stephen Hinesdce4a402014-05-29 02:49:00 -07001135 return DebugLocEntry::Value(Var, MI->getOperand(0).getFPImm());
Devang Patel90b40412011-07-08 17:09:57 +00001136 if (MI->getOperand(0).isCImm())
Stephen Hinesdce4a402014-05-29 02:49:00 -07001137 return DebugLocEntry::Value(Var, MI->getOperand(0).getCImm());
Devang Patel90b40412011-07-08 17:09:57 +00001138
Craig Topper5e25ee82012-02-05 08:31:47 +00001139 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel90b40412011-07-08 17:09:57 +00001140}
1141
Eric Christopherb6dc8652012-11-27 22:43:45 +00001142// Find variables for each lexical scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001143void
Stephen Hines36b56882014-04-23 16:57:46 -07001144DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &Processed) {
Stephen Hinesdce4a402014-05-29 02:49:00 -07001145 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1146 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001147
Eric Christopher4e976452013-07-03 21:37:03 +00001148 // Grab the variable info that was squirreled away in the MMI side-table.
Stephen Hines36b56882014-04-23 16:57:46 -07001149 collectVariableInfoFromMMITable(Processed);
Devang Patelee432862010-05-20 19:57:06 +00001150
Stephen Hinesdce4a402014-05-29 02:49:00 -07001151 for (const auto &I : DbgValues) {
1152 DIVariable DV(I.first);
1153 if (Processed.count(DV))
Devang Patelee432862010-05-20 19:57:06 +00001154 continue;
1155
Stephen Hinesdce4a402014-05-29 02:49:00 -07001156 // Instruction ranges, specifying where DV is accessible.
1157 const auto &Ranges = I.second;
1158 if (Ranges.empty())
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001159 continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00001160
Stephen Hinesdce4a402014-05-29 02:49:00 -07001161 LexicalScope *Scope = nullptr;
Devang Pateld8720f42010-05-27 20:25:04 +00001162 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
Stephen Hines36b56882014-04-23 16:57:46 -07001163 DISubprogram(DV.getContext()).describes(CurFn->getFunction()))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001164 Scope = LScopes.getCurrentFunctionScope();
Stephen Hinesdce4a402014-05-29 02:49:00 -07001165 else if (MDNode *IA = DV.getInlinedAt()) {
1166 DebugLoc DL = DebugLoc::getFromDILocation(IA);
1167 Scope = LScopes.findInlinedScope(DebugLoc::get(
1168 DL.getLine(), DL.getCol(), DV.getContext(), IA));
1169 } else
1170 Scope = LScopes.findLexicalScope(DV.getContext());
Devang Patelee432862010-05-20 19:57:06 +00001171 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00001172 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001173 continue;
1174
1175 Processed.insert(DV);
Stephen Hinesdce4a402014-05-29 02:49:00 -07001176 const MachineInstr *MInsn = Ranges.front().first;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001177 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel5a1a67c2011-08-15 19:01:20 +00001178 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
Manman Renc664d762013-10-05 01:43:03 +00001179 DbgVariable *RegVar = new DbgVariable(DV, AbsVar, this);
Stephen Hines36b56882014-04-23 16:57:46 -07001180 if (!addCurrentFnArgument(RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001181 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001182 if (AbsVar)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001183 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001184
Stephen Hinesdce4a402014-05-29 02:49:00 -07001185 // Check if the first DBG_VALUE is valid for the rest of the function.
1186 if (Ranges.size() == 1 && Ranges.front().second == nullptr) {
Devang Patelff9dd0a2011-08-15 21:24:36 +00001187 RegVar->setMInsn(MInsn);
Devang Patelc3f5f782010-05-25 23:40:22 +00001188 continue;
1189 }
1190
Eric Christopher498703b2013-01-28 17:33:26 +00001191 // Handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001192 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001193
Stephen Hines36b56882014-04-23 16:57:46 -07001194 DotDebugLocEntries.resize(DotDebugLocEntries.size() + 1);
1195 DebugLocList &LocList = DotDebugLocEntries.back();
1196 LocList.Label =
1197 Asm->GetTempSymbol("debug_loc", DotDebugLocEntries.size() - 1);
1198 SmallVector<DebugLocEntry, 4> &DebugLoc = LocList.List;
Stephen Hinesdce4a402014-05-29 02:49:00 -07001199 for (auto I = Ranges.begin(), E = Ranges.end(); I != E; ++I) {
1200 const MachineInstr *Begin = I->first;
1201 const MachineInstr *End = I->second;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001202 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001203
Stephen Hinesdce4a402014-05-29 02:49:00 -07001204 // Check if a variable is unaccessible in this range.
Stephen Hines36b56882014-04-23 16:57:46 -07001205 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg() &&
1206 !Begin->getOperand(0).getReg())
Devang Patel4ada1d72011-06-01 23:00:17 +00001207 continue;
1208
Stephen Hinesdce4a402014-05-29 02:49:00 -07001209 const MCSymbol *StartLabel = getLabelBeforeInsn(Begin);
1210 assert(StartLabel && "Forgot label before DBG_VALUE starting a range!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001211
Stephen Hinesdce4a402014-05-29 02:49:00 -07001212 const MCSymbol *EndLabel;
1213 if (End != nullptr)
1214 EndLabel = getLabelAfterInsn(End);
1215 else if (std::next(I) == Ranges.end())
1216 EndLabel = FunctionEndSym;
1217 else
1218 EndLabel = getLabelBeforeInsn(std::next(I)->first);
1219 assert(EndLabel && "Forgot label after instruction ending a range!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001220
Stephen Hinesdce4a402014-05-29 02:49:00 -07001221 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
1222 << "\t" << *Begin << "\t" << *End << "\n");
1223 DebugLocEntry Loc(StartLabel, EndLabel, getDebugLocValue(Begin), TheCU);
Stephen Hines36b56882014-04-23 16:57:46 -07001224 if (DebugLoc.empty() || !DebugLoc.back().Merge(Loc))
1225 DebugLoc.push_back(std::move(Loc));
Devang Patelc3f5f782010-05-25 23:40:22 +00001226 }
Devang Patel90a48ad2010-03-15 18:33:46 +00001227 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001228
1229 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001230 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1231 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1232 DIVariable DV(Variables.getElement(i));
Stephen Hinesdce4a402014-05-29 02:49:00 -07001233 assert(DV.isVariable());
1234 if (!Processed.insert(DV))
Devang Patel93d39be2011-08-19 23:28:12 +00001235 continue;
1236 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
Stephen Hinesdce4a402014-05-29 02:49:00 -07001237 addScopeVariable(
1238 Scope,
1239 new DbgVariable(DV, findAbstractVariable(DV, Scope->getScopeNode()),
1240 this));
Devang Patel98e1cac2010-05-14 21:01:35 +00001241 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001242}
Devang Patel98e1cac2010-05-14 21:01:35 +00001243
Eric Christopherb6dc8652012-11-27 22:43:45 +00001244// Return Label preceding the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001245MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001246 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1247 assert(Label && "Didn't insert label before instruction");
1248 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001249}
1250
Eric Christopherb6dc8652012-11-27 22:43:45 +00001251// Return Label immediately following the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001252MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001253 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001254}
1255
Eric Christopherb6dc8652012-11-27 22:43:45 +00001256// Process beginning of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001257void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Stephen Hinesdce4a402014-05-29 02:49:00 -07001258 assert(CurMI == nullptr);
Stephen Hines36b56882014-04-23 16:57:46 -07001259 CurMI = MI;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001260 // Check if source location changes, but ignore DBG_VALUE locations.
1261 if (!MI->isDebugValue()) {
1262 DebugLoc DL = MI->getDebugLoc();
1263 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopher60b35f42012-04-05 20:39:05 +00001264 unsigned Flags = 0;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001265 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001266 if (DL == PrologEndLoc) {
1267 Flags |= DWARF2_FLAG_PROLOGUE_END;
1268 PrologEndLoc = DebugLoc();
1269 }
Eric Christopher60b35f42012-04-05 20:39:05 +00001270 if (PrologEndLoc.isUnknown())
1271 Flags |= DWARF2_FLAG_IS_STMT;
1272
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001273 if (!DL.isUnknown()) {
1274 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001275 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001276 } else
Stephen Hinesdce4a402014-05-29 02:49:00 -07001277 recordSourceLine(0, 0, nullptr, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001278 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001279 }
Devang Patelaead63c2010-03-29 22:59:58 +00001280
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001281 // Insert labels where requested.
Stephen Hines36b56882014-04-23 16:57:46 -07001282 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
1283 LabelsBeforeInsn.find(MI);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001284
1285 // No label needed.
1286 if (I == LabelsBeforeInsn.end())
1287 return;
1288
1289 // Label already assigned.
1290 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001291 return;
Devang Patel553881b2010-03-29 17:20:31 +00001292
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001293 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001294 PrevLabel = MMI->getContext().CreateTempSymbol();
1295 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001296 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001297 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001298}
1299
Eric Christopherb6dc8652012-11-27 22:43:45 +00001300// Process end of an instruction.
Stephen Hines36b56882014-04-23 16:57:46 -07001301void DwarfDebug::endInstruction() {
Stephen Hinesdce4a402014-05-29 02:49:00 -07001302 assert(CurMI != nullptr);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001303 // Don't create a new label after DBG_VALUE instructions.
1304 // They don't generate code.
Stephen Hines36b56882014-04-23 16:57:46 -07001305 if (!CurMI->isDebugValue())
Stephen Hinesdce4a402014-05-29 02:49:00 -07001306 PrevLabel = nullptr;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001307
Stephen Hines36b56882014-04-23 16:57:46 -07001308 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
1309 LabelsAfterInsn.find(CurMI);
Stephen Hinesdce4a402014-05-29 02:49:00 -07001310 CurMI = nullptr;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001311
1312 // No label needed.
1313 if (I == LabelsAfterInsn.end())
1314 return;
1315
1316 // Label already assigned.
1317 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001318 return;
1319
1320 // We need a label after this instruction.
1321 if (!PrevLabel) {
1322 PrevLabel = MMI->getContext().CreateTempSymbol();
1323 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001324 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001325 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001326}
1327
Eric Christopherb6dc8652012-11-27 22:43:45 +00001328// Each LexicalScope has first instruction and last instruction to mark
1329// beginning and end of a scope respectively. Create an inverse map that list
1330// scopes starts (and ends) with an instruction. One instruction may start (or
1331// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001332void DwarfDebug::identifyScopeMarkers() {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001333 SmallVector<LexicalScope *, 4> WorkList;
1334 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel42aafd72010-01-20 02:05:23 +00001335 while (!WorkList.empty()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001336 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001337
Craig Topper9f43ac62013-07-03 04:24:43 +00001338 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001339 if (!Children.empty())
Stephen Hines36b56882014-04-23 16:57:46 -07001340 WorkList.append(Children.begin(), Children.end());
Devang Patel42aafd72010-01-20 02:05:23 +00001341
Devang Patel53bb5c92009-11-10 23:06:00 +00001342 if (S->isAbstractScope())
1343 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001344
Stephen Hines36b56882014-04-23 16:57:46 -07001345 for (const InsnRange &R : S->getRanges()) {
1346 assert(R.first && "InsnRange does not have first instruction!");
1347 assert(R.second && "InsnRange does not have second instruction!");
1348 requestLabelBeforeInsn(R.first);
1349 requestLabelAfterInsn(R.second);
Devang Pateleac9c072010-04-27 19:46:33 +00001350 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001351 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001352}
1353
Stephen Hinesdce4a402014-05-29 02:49:00 -07001354static DebugLoc findPrologueEndLoc(const MachineFunction *MF) {
1355 // First known non-DBG_VALUE and non-frame setup location marks
1356 // the beginning of the function body.
1357 for (const auto &MBB : *MF)
1358 for (const auto &MI : MBB)
1359 if (!MI.isDebugValue() && !MI.getFlag(MachineInstr::FrameSetup) &&
1360 !MI.getDebugLoc().isUnknown())
1361 return MI.getDebugLoc();
1362 return DebugLoc();
1363}
1364
Eric Christopherb6dc8652012-11-27 22:43:45 +00001365// Gather pre-function debug information. Assumes being called immediately
1366// after the function entry point has been emitted.
Chris Lattnereec791a2010-01-26 23:18:02 +00001367void DwarfDebug::beginFunction(const MachineFunction *MF) {
Stephen Hines36b56882014-04-23 16:57:46 -07001368 CurFn = MF;
Eric Christopher31ed50c2013-11-01 23:14:17 +00001369
1370 // If there's no debug info for the function we're not going to do anything.
1371 if (!MMI->hasDebugInfo())
1372 return;
1373
1374 // Grab the lexical scopes for the function, if we don't have any of those
1375 // then we're not going to be able to do anything.
Devang Patelbf47fdb2011-08-10 20:55:27 +00001376 LScopes.initialize(*MF);
Eric Christopher31ed50c2013-11-01 23:14:17 +00001377 if (LScopes.empty())
1378 return;
1379
Stephen Hinesdce4a402014-05-29 02:49:00 -07001380 assert(DbgValues.empty() && "DbgValues map wasn't cleaned!");
Eric Christopher31ed50c2013-11-01 23:14:17 +00001381
1382 // Make sure that each lexical scope will have a begin/end label.
Devang Patelbf47fdb2011-08-10 20:55:27 +00001383 identifyScopeMarkers();
Devang Patel60b35bd2009-10-06 18:37:31 +00001384
Stephen Hines36b56882014-04-23 16:57:46 -07001385 // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function
Eric Christopher31ed50c2013-11-01 23:14:17 +00001386 // belongs to so that we add to the correct per-cu line table in the
1387 // non-asm case.
Manman Ren43213cf2013-02-05 21:52:47 +00001388 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Stephen Hines36b56882014-04-23 16:57:46 -07001389 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Manman Ren43213cf2013-02-05 21:52:47 +00001390 assert(TheCU && "Unable to find compile unit!");
Stephen Hines36b56882014-04-23 16:57:46 -07001391 if (Asm->OutStreamer.hasRawTextSupport())
1392 // Use a single line table if we are generating assembly.
Manman Ren01cb18e2013-05-21 00:57:22 +00001393 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1394 else
1395 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
Manman Ren43213cf2013-02-05 21:52:47 +00001396
Eric Christopher31ed50c2013-11-01 23:14:17 +00001397 // Emit a label for the function so that we have a beginning address.
1398 FunctionBeginSym = Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001399 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001400 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001401
Stephen Hinesdce4a402014-05-29 02:49:00 -07001402 // Calculate history for local variables.
1403 calculateDbgValueHistory(MF, Asm->TM.getRegisterInfo(), DbgValues);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001404
Stephen Hinesdce4a402014-05-29 02:49:00 -07001405 // Request labels for the full history.
1406 for (const auto &I : DbgValues) {
1407 const auto &Ranges = I.second;
1408 if (Ranges.empty())
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001409 continue;
1410
Stephen Hinesdce4a402014-05-29 02:49:00 -07001411 // The first mention of a function argument gets the FunctionBeginSym
1412 // label, so arguments are visible when breaking at function entry.
1413 DIVariable DV(I.first);
1414 if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1415 getDISubprogram(DV.getContext()).describes(MF->getFunction()))
1416 LabelsBeforeInsn[Ranges.front().first] = FunctionBeginSym;
1417
1418 for (const auto &Range : Ranges) {
1419 requestLabelBeforeInsn(Range.first);
1420 if (Range.second)
1421 requestLabelAfterInsn(Range.second);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001422 }
1423 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001424
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001425 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00001426 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00001427
1428 // Record beginning of function.
Stephen Hinesdce4a402014-05-29 02:49:00 -07001429 PrologEndLoc = findPrologueEndLoc(MF);
Devang Patel4243e672011-05-11 19:22:19 +00001430 if (!PrologEndLoc.isUnknown()) {
Eric Christopher31ed50c2013-11-01 23:14:17 +00001431 DebugLoc FnStartDL =
Stephen Hines36b56882014-04-23 16:57:46 -07001432 PrologEndLoc.getFnDebugLoc(MF->getFunction()->getContext());
Eric Christopher31ed50c2013-11-01 23:14:17 +00001433 recordSourceLine(
1434 FnStartDL.getLine(), FnStartDL.getCol(),
1435 FnStartDL.getScope(MF->getFunction()->getContext()),
1436 // We'd like to list the prologue as "not statements" but GDB behaves
1437 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
1438 DWARF2_FLAG_IS_STMT);
Devang Patel4243e672011-05-11 19:22:19 +00001439 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001440}
1441
Devang Patelbf47fdb2011-08-10 20:55:27 +00001442void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
David Blaikie032d6242013-06-05 05:39:59 +00001443 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1444 DIVariable DV = Var->getVariable();
David Blaikieb20fdff2013-06-06 21:04:51 +00001445 // Variables with positive arg numbers are parameters.
1446 if (unsigned ArgNum = DV.getArgNumber()) {
1447 // Keep all parameters in order at the start of the variable list to ensure
1448 // function types are correct (no out-of-order parameters)
1449 //
1450 // This could be improved by only doing it for optimized builds (unoptimized
1451 // builds have the right order to begin with), searching from the back (this
1452 // would catch the unoptimized case quickly), or doing a binary search
1453 // rather than linear search.
1454 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
1455 while (I != Vars.end()) {
1456 unsigned CurNum = (*I)->getVariable().getArgNumber();
1457 // A local (non-parameter) variable has been found, insert immediately
1458 // before it.
1459 if (CurNum == 0)
1460 break;
1461 // A later indexed parameter has been found, insert immediately before it.
David Blaikiebabfebb2013-06-06 22:28:26 +00001462 if (CurNum > ArgNum)
David Blaikieb20fdff2013-06-06 21:04:51 +00001463 break;
David Blaikiebabfebb2013-06-06 22:28:26 +00001464 ++I;
David Blaikie032d6242013-06-05 05:39:59 +00001465 }
David Blaikieb20fdff2013-06-06 21:04:51 +00001466 Vars.insert(I, Var);
1467 return;
David Blaikie032d6242013-06-05 05:39:59 +00001468 }
1469
1470 Vars.push_back(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001471}
1472
Eric Christopherb6dc8652012-11-27 22:43:45 +00001473// Gather and emit post-function debug information.
Chris Lattnereec791a2010-01-26 23:18:02 +00001474void DwarfDebug::endFunction(const MachineFunction *MF) {
Stephen Hines36b56882014-04-23 16:57:46 -07001475 // Every beginFunction(MF) call should be followed by an endFunction(MF) call,
1476 // though the beginFunction may not be called at all.
1477 // We should handle both cases.
Stephen Hinesdce4a402014-05-29 02:49:00 -07001478 if (!CurFn)
Stephen Hines36b56882014-04-23 16:57:46 -07001479 CurFn = MF;
1480 else
1481 assert(CurFn == MF);
Stephen Hinesdce4a402014-05-29 02:49:00 -07001482 assert(CurFn != nullptr);
Stephen Hines36b56882014-04-23 16:57:46 -07001483
1484 if (!MMI->hasDebugInfo() || LScopes.empty()) {
1485 // If we don't have a lexical scope for this function then there will
1486 // be a hole in the range information. Keep note of this by setting the
1487 // previously used section to nullptr.
1488 PrevSection = nullptr;
1489 PrevCU = nullptr;
Stephen Hinesdce4a402014-05-29 02:49:00 -07001490 CurFn = nullptr;
Stephen Hines36b56882014-04-23 16:57:46 -07001491 return;
1492 }
Devang Patel70d75ca2009-11-12 19:02:56 +00001493
Devang Patelbf47fdb2011-08-10 20:55:27 +00001494 // Define end label for subprogram.
Stephen Hines36b56882014-04-23 16:57:46 -07001495 FunctionEndSym = Asm->GetTempSymbol("func_end", Asm->getFunctionNumber());
Devang Patelbf47fdb2011-08-10 20:55:27 +00001496 // Assumes in correct section after the entry point.
1497 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Stephen Hines36b56882014-04-23 16:57:46 -07001498
1499 // Set DwarfDwarfCompileUnitID in MCContext to default value.
Manman Ren43213cf2013-02-05 21:52:47 +00001500 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001501
Devang Patelbf47fdb2011-08-10 20:55:27 +00001502 SmallPtrSet<const MDNode *, 16> ProcessedVars;
Stephen Hines36b56882014-04-23 16:57:46 -07001503 collectVariableInfo(ProcessedVars);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001504
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001505 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Stephen Hinesdce4a402014-05-29 02:49:00 -07001506 DwarfCompileUnit &TheCU = *SPMap.lookup(FnScope->getScopeNode());
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001507
Devang Patelbf47fdb2011-08-10 20:55:27 +00001508 // Construct abstract scopes.
Stephen Hines36b56882014-04-23 16:57:46 -07001509 for (LexicalScope *AScope : LScopes.getAbstractScopesList()) {
Devang Patelcd9f6c52011-08-12 18:10:19 +00001510 DISubprogram SP(AScope->getScopeNode());
Stephen Hinesdce4a402014-05-29 02:49:00 -07001511 if (!SP.isSubprogram())
1512 continue;
1513 // Collect info for variables that were optimized out.
1514 DIArray Variables = SP.getVariables();
1515 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1516 DIVariable DV(Variables.getElement(i));
1517 assert(DV && DV.isVariable());
1518 if (!ProcessedVars.insert(DV))
1519 continue;
1520 findAbstractVariable(DV, DV.getContext());
Devang Patel78e127d2010-06-25 22:07:34 +00001521 }
Stephen Hinesdce4a402014-05-29 02:49:00 -07001522 constructAbstractSubprogramScopeDIE(TheCU, AScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001523 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001524
Stephen Hinesdce4a402014-05-29 02:49:00 -07001525 DIE &CurFnDIE = constructSubprogramScopeDIE(TheCU, FnScope);
Stephen Hines36b56882014-04-23 16:57:46 -07001526 if (!CurFn->getTarget().Options.DisableFramePointerElim(*CurFn))
Stephen Hinesdce4a402014-05-29 02:49:00 -07001527 TheCU.addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001528
Stephen Hines36b56882014-04-23 16:57:46 -07001529 // Add the range of this function to the list of ranges for the CU.
1530 RangeSpan Span(FunctionBeginSym, FunctionEndSym);
Stephen Hinesdce4a402014-05-29 02:49:00 -07001531 TheCU.addRange(std::move(Span));
Stephen Hines36b56882014-04-23 16:57:46 -07001532 PrevSection = Asm->getCurrentSection();
Stephen Hinesdce4a402014-05-29 02:49:00 -07001533 PrevCU = &TheCU;
Stephen Hines36b56882014-04-23 16:57:46 -07001534
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001535 // Clear debug info
Stephen Hinesdce4a402014-05-29 02:49:00 -07001536 // Ownership of DbgVariables is a bit subtle - ScopeVariables owns all the
1537 // DbgVariables except those that are also in AbstractVariables (since they
1538 // can be used cross-function)
1539 for (const auto &I : ScopeVariables)
1540 for (const auto *Var : I.second)
1541 if (!AbstractVariables.count(Var->getVariable()) || Var->getAbstractVariable())
1542 delete Var;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001543 ScopeVariables.clear();
Devang Pateleac0c9d2011-04-22 18:09:57 +00001544 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001545 DbgValues.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00001546 LabelsBeforeInsn.clear();
1547 LabelsAfterInsn.clear();
Stephen Hinesdce4a402014-05-29 02:49:00 -07001548 PrevLabel = nullptr;
1549 CurFn = nullptr;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001550}
1551
Eric Christopherb6dc8652012-11-27 22:43:45 +00001552// Register a source line with debug info. Returns the unique label that was
1553// emitted and which provides correspondence to the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00001554void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1555 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00001556 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00001557 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00001558 unsigned Src = 1;
Stephen Hines36b56882014-04-23 16:57:46 -07001559 unsigned Discriminator = 0;
Stephen Hinesdce4a402014-05-29 02:49:00 -07001560 if (DIScope Scope = DIScope(S)) {
1561 assert(Scope.isScope());
1562 Fn = Scope.getFilename();
1563 Dir = Scope.getDirectory();
1564 if (Scope.isLexicalBlock())
1565 Discriminator = DILexicalBlock(S).getDiscriminator();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001566
Stephen Hines36b56882014-04-23 16:57:46 -07001567 unsigned CUID = Asm->OutStreamer.getContext().getDwarfCompileUnitID();
Stephen Hinesdce4a402014-05-29 02:49:00 -07001568 Src = static_cast<DwarfCompileUnit &>(*InfoHolder.getUnits()[CUID])
1569 .getOrCreateSourceID(Fn, Dir);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001570 }
Stephen Hines36b56882014-04-23 16:57:46 -07001571 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0,
1572 Discriminator, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001573}
1574
Bill Wendling829e67b2009-05-20 23:22:40 +00001575//===----------------------------------------------------------------------===//
1576// Emit Methods
1577//===----------------------------------------------------------------------===//
1578
Eric Christopherb6dc8652012-11-27 22:43:45 +00001579// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001580void DwarfDebug::emitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001581 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001582
Bill Wendling94d04b82009-05-20 23:21:38 +00001583 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001584 DwarfInfoSectionSym =
Stephen Hines36b56882014-04-23 16:57:46 -07001585 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Eric Christopher6eebe472012-12-19 22:02:53 +00001586 if (useSplitDwarf())
Stephen Hines36b56882014-04-23 16:57:46 -07001587 DwarfInfoDWOSectionSym =
1588 emitSectionSym(Asm, TLOF.getDwarfInfoDWOSection(), "section_info_dwo");
1589 DwarfAbbrevSectionSym =
1590 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
1591 if (useSplitDwarf())
1592 DwarfAbbrevDWOSectionSym = emitSectionSym(
1593 Asm, TLOF.getDwarfAbbrevDWOSection(), "section_abbrev_dwo");
1594 if (GenerateARangeSection)
1595 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001596
Eric Christopher7a0103c2013-02-07 21:19:50 +00001597 DwarfLineSectionSym =
Stephen Hines36b56882014-04-23 16:57:46 -07001598 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christophercdeaae42013-09-23 20:55:35 +00001599 if (GenerateGnuPubSections) {
Eric Christophera6d84152013-09-30 23:14:16 +00001600 DwarfGnuPubNamesSectionSym =
1601 emitSectionSym(Asm, TLOF.getDwarfGnuPubNamesSection());
1602 DwarfGnuPubTypesSectionSym =
1603 emitSectionSym(Asm, TLOF.getDwarfGnuPubTypesSection());
Eric Christophercdeaae42013-09-23 20:55:35 +00001604 } else if (HasDwarfPubSections) {
1605 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
1606 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Michael Gottesmandc42d032013-09-04 04:39:38 +00001607 }
Eric Christopher8f1a9292013-09-13 00:35:05 +00001608
Jim Grosbach1e20b962010-07-21 21:21:52 +00001609 DwarfStrSectionSym =
Stephen Hines36b56882014-04-23 16:57:46 -07001610 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher9a9e73b2013-04-07 03:43:09 +00001611 if (useSplitDwarf()) {
Eric Christopher64f824c2012-12-27 02:14:01 +00001612 DwarfStrDWOSectionSym =
Stephen Hines36b56882014-04-23 16:57:46 -07001613 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher9a9e73b2013-04-07 03:43:09 +00001614 DwarfAddrSectionSym =
Stephen Hines36b56882014-04-23 16:57:46 -07001615 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
1616 DwarfDebugLocSectionSym =
1617 emitSectionSym(Asm, TLOF.getDwarfLocDWOSection(), "skel_loc");
1618 } else
1619 DwarfDebugLocSectionSym =
1620 emitSectionSym(Asm, TLOF.getDwarfLocSection(), "section_debug_loc");
1621 DwarfDebugRangeSectionSym =
1622 emitSectionSym(Asm, TLOF.getDwarfRangesSection(), "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00001623}
1624
Eric Christopherb6dc8652012-11-27 22:43:45 +00001625// Recursively emits a debug information entry.
Stephen Hinesdce4a402014-05-29 02:49:00 -07001626void DwarfDebug::emitDIE(DIE &Die) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001627 // Get the abbreviation for this DIE.
Stephen Hinesdce4a402014-05-29 02:49:00 -07001628 const DIEAbbrev &Abbrev = Die.getAbbrev();
Bill Wendling94d04b82009-05-20 23:21:38 +00001629
Bill Wendling94d04b82009-05-20 23:21:38 +00001630 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00001631 if (Asm->isVerbose())
Stephen Hines36b56882014-04-23 16:57:46 -07001632 Asm->OutStreamer.AddComment("Abbrev [" + Twine(Abbrev.getNumber()) +
Stephen Hinesdce4a402014-05-29 02:49:00 -07001633 "] 0x" + Twine::utohexstr(Die.getOffset()) +
1634 ":0x" + Twine::utohexstr(Die.getSize()) + " " +
Stephen Hines36b56882014-04-23 16:57:46 -07001635 dwarf::TagString(Abbrev.getTag()));
1636 Asm->EmitULEB128(Abbrev.getNumber());
Bill Wendling94d04b82009-05-20 23:21:38 +00001637
Stephen Hinesdce4a402014-05-29 02:49:00 -07001638 const SmallVectorImpl<DIEValue *> &Values = Die.getValues();
Stephen Hines36b56882014-04-23 16:57:46 -07001639 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
Bill Wendling94d04b82009-05-20 23:21:38 +00001640
1641 // Emit the DIE attribute values.
1642 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
David Blaikie770530b2013-10-21 17:28:37 +00001643 dwarf::Attribute Attr = AbbrevData[i].getAttribute();
1644 dwarf::Form Form = AbbrevData[i].getForm();
Bill Wendling94d04b82009-05-20 23:21:38 +00001645 assert(Form && "Too many attributes for DIE (check abbreviation)");
1646
Stephen Hines36b56882014-04-23 16:57:46 -07001647 if (Asm->isVerbose()) {
Chris Lattnera8013622010-01-24 18:54:17 +00001648 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Stephen Hines36b56882014-04-23 16:57:46 -07001649 if (Attr == dwarf::DW_AT_accessibility)
1650 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(
1651 cast<DIEInteger>(Values[i])->getValue()));
1652 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001653
Stephen Hines36b56882014-04-23 16:57:46 -07001654 // Emit an attribute using the defined form.
1655 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00001656 }
1657
1658 // Emit the DIE children if any.
Stephen Hines36b56882014-04-23 16:57:46 -07001659 if (Abbrev.hasChildren()) {
Stephen Hinesdce4a402014-05-29 02:49:00 -07001660 for (auto &Child : Die.getChildren())
1661 emitDIE(*Child);
Bill Wendling94d04b82009-05-20 23:21:38 +00001662
Stephen Hines36b56882014-04-23 16:57:46 -07001663 Asm->OutStreamer.AddComment("End Of Children Mark");
Chris Lattner233f52b2010-03-09 23:52:58 +00001664 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00001665 }
1666}
1667
Eric Christopher98e237f2012-11-30 23:59:06 +00001668// Emit the debug info section.
1669void DwarfDebug::emitDebugInfo() {
Stephen Hines36b56882014-04-23 16:57:46 -07001670 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Eric Christopherb1e66d02012-12-15 00:04:07 +00001671
Stephen Hines36b56882014-04-23 16:57:46 -07001672 Holder.emitUnits(this, DwarfAbbrevSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00001673}
1674
Eric Christopherb6dc8652012-11-27 22:43:45 +00001675// Emit the abbreviation section.
Eric Christopher7dc68db2012-11-20 23:30:11 +00001676void DwarfDebug::emitAbbreviations() {
Stephen Hines36b56882014-04-23 16:57:46 -07001677 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1678
1679 Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
Eric Christopher6eebe472012-12-19 22:02:53 +00001680}
Bill Wendling94d04b82009-05-20 23:21:38 +00001681
Eric Christopherb6dc8652012-11-27 22:43:45 +00001682// Emit the last address of the section and the end of the line matrix.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001683void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001684 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00001685 Asm->OutStreamer.AddComment("Extended Op");
1686 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001687
Chris Lattner233f52b2010-03-09 23:52:58 +00001688 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00001689 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00001690 Asm->OutStreamer.AddComment("DW_LNE_set_address");
1691 Asm->EmitInt8(dwarf::DW_LNE_set_address);
1692
1693 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00001694
Stephen Hines36b56882014-04-23 16:57:46 -07001695 Asm->OutStreamer.EmitSymbolValue(
1696 Asm->GetTempSymbol("section_end", SectionEnd),
1697 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00001698
1699 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00001700 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1701 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00001702 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00001703 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001704}
1705
Eric Christopherb6dc8652012-11-27 22:43:45 +00001706// Emit visible names into a hashed accelerator table section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001707void DwarfDebug::emitAccelNames() {
Stephen Hinesdce4a402014-05-29 02:49:00 -07001708 AccelNames.FinalizeTable(Asm, "Names");
Eric Christopher09ac3d82011-11-07 09:24:32 +00001709 Asm->OutStreamer.SwitchSection(
Stephen Hines36b56882014-04-23 16:57:46 -07001710 Asm->getObjFileLowering().getDwarfAccelNamesSection());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001711 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
1712 Asm->OutStreamer.EmitLabel(SectionBegin);
1713
1714 // Emit the full data.
Stephen Hinesdce4a402014-05-29 02:49:00 -07001715 AccelNames.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001716}
1717
Eric Christopher72c16552012-12-20 21:58:40 +00001718// Emit objective C classes and categories into a hashed accelerator table
1719// section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001720void DwarfDebug::emitAccelObjC() {
Stephen Hinesdce4a402014-05-29 02:49:00 -07001721 AccelObjC.FinalizeTable(Asm, "ObjC");
Stephen Hines36b56882014-04-23 16:57:46 -07001722 Asm->OutStreamer.SwitchSection(
1723 Asm->getObjFileLowering().getDwarfAccelObjCSection());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001724 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
1725 Asm->OutStreamer.EmitLabel(SectionBegin);
1726
1727 // Emit the full data.
Stephen Hinesdce4a402014-05-29 02:49:00 -07001728 AccelObjC.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001729}
1730
Eric Christopherb6dc8652012-11-27 22:43:45 +00001731// Emit namespace dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001732void DwarfDebug::emitAccelNamespaces() {
Stephen Hinesdce4a402014-05-29 02:49:00 -07001733 AccelNamespace.FinalizeTable(Asm, "namespac");
Stephen Hines36b56882014-04-23 16:57:46 -07001734 Asm->OutStreamer.SwitchSection(
1735 Asm->getObjFileLowering().getDwarfAccelNamespaceSection());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001736 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
1737 Asm->OutStreamer.EmitLabel(SectionBegin);
1738
1739 // Emit the full data.
Stephen Hinesdce4a402014-05-29 02:49:00 -07001740 AccelNamespace.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001741}
1742
Eric Christopherb6dc8652012-11-27 22:43:45 +00001743// Emit type dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001744void DwarfDebug::emitAccelTypes() {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001745
Stephen Hinesdce4a402014-05-29 02:49:00 -07001746 AccelTypes.FinalizeTable(Asm, "types");
Stephen Hines36b56882014-04-23 16:57:46 -07001747 Asm->OutStreamer.SwitchSection(
1748 Asm->getObjFileLowering().getDwarfAccelTypesSection());
Eric Christopher09ac3d82011-11-07 09:24:32 +00001749 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
1750 Asm->OutStreamer.EmitLabel(SectionBegin);
1751
1752 // Emit the full data.
Stephen Hinesdce4a402014-05-29 02:49:00 -07001753 AccelTypes.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001754}
1755
Eric Christopher8f1a9292013-09-13 00:35:05 +00001756// Public name handling.
1757// The format for the various pubnames:
1758//
1759// dwarf pubnames - offset/name pairs where the offset is the offset into the CU
1760// for the DIE that is named.
1761//
1762// gnu pubnames - offset/index value/name tuples where the offset is the offset
1763// into the CU and the index value is computed according to the type of value
1764// for the DIE that is named.
1765//
1766// For type units the offset is the offset of the skeleton DIE. For split dwarf
1767// it's the offset within the debug_info/debug_types dwo section, however, the
1768// reference in the pubname header doesn't change.
1769
1770/// computeIndexValue - Compute the gdb index value for the DIE and CU.
Stephen Hines36b56882014-04-23 16:57:46 -07001771static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU,
1772 const DIE *Die) {
Eric Christophera486f552013-10-16 01:37:49 +00001773 dwarf::GDBIndexEntryLinkage Linkage = dwarf::GIEL_STATIC;
1774
1775 // We could have a specification DIE that has our most of our knowledge,
1776 // look for that now.
1777 DIEValue *SpecVal = Die->findAttribute(dwarf::DW_AT_specification);
1778 if (SpecVal) {
Stephen Hinesdce4a402014-05-29 02:49:00 -07001779 DIE &SpecDIE = cast<DIEEntry>(SpecVal)->getEntry();
1780 if (SpecDIE.findAttribute(dwarf::DW_AT_external))
Eric Christophera486f552013-10-16 01:37:49 +00001781 Linkage = dwarf::GIEL_EXTERNAL;
1782 } else if (Die->findAttribute(dwarf::DW_AT_external))
1783 Linkage = dwarf::GIEL_EXTERNAL;
Eric Christopher8f1a9292013-09-13 00:35:05 +00001784
1785 switch (Die->getTag()) {
1786 case dwarf::DW_TAG_class_type:
1787 case dwarf::DW_TAG_structure_type:
1788 case dwarf::DW_TAG_union_type:
1789 case dwarf::DW_TAG_enumeration_type:
Eric Christophercdeaae42013-09-23 20:55:35 +00001790 return dwarf::PubIndexEntryDescriptor(
1791 dwarf::GIEK_TYPE, CU->getLanguage() != dwarf::DW_LANG_C_plus_plus
1792 ? dwarf::GIEL_STATIC
1793 : dwarf::GIEL_EXTERNAL);
Eric Christopher8f1a9292013-09-13 00:35:05 +00001794 case dwarf::DW_TAG_typedef:
1795 case dwarf::DW_TAG_base_type:
1796 case dwarf::DW_TAG_subrange_type:
David Blaikie9599f512013-09-19 20:40:26 +00001797 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE, dwarf::GIEL_STATIC);
Eric Christopher8f1a9292013-09-13 00:35:05 +00001798 case dwarf::DW_TAG_namespace:
David Blaikie9599f512013-09-19 20:40:26 +00001799 return dwarf::GIEK_TYPE;
Eric Christopher8f1a9292013-09-13 00:35:05 +00001800 case dwarf::DW_TAG_subprogram:
Eric Christophera31a9752013-09-23 22:59:14 +00001801 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_FUNCTION, Linkage);
Eric Christopher8f1a9292013-09-13 00:35:05 +00001802 case dwarf::DW_TAG_constant:
1803 case dwarf::DW_TAG_variable:
Eric Christophera31a9752013-09-23 22:59:14 +00001804 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, Linkage);
Eric Christopher8f1a9292013-09-13 00:35:05 +00001805 case dwarf::DW_TAG_enumerator:
David Blaikie9599f512013-09-19 20:40:26 +00001806 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE,
1807 dwarf::GIEL_STATIC);
Eric Christopher8f1a9292013-09-13 00:35:05 +00001808 default:
David Blaikie9599f512013-09-19 20:40:26 +00001809 return dwarf::GIEK_NONE;
Eric Christopher8f1a9292013-09-13 00:35:05 +00001810 }
Eric Christopher8f1a9292013-09-13 00:35:05 +00001811}
1812
Eric Christopher57479322013-09-09 20:03:17 +00001813/// emitDebugPubNames - Emit visible names into a debug pubnames section.
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001814///
Eric Christopher8f1a9292013-09-13 00:35:05 +00001815void DwarfDebug::emitDebugPubNames(bool GnuStyle) {
Eric Christopher8f1a9292013-09-13 00:35:05 +00001816 const MCSection *PSec =
1817 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection()
1818 : Asm->getObjFileLowering().getDwarfPubNamesSection();
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001819
Stephen Hines36b56882014-04-23 16:57:46 -07001820 emitDebugPubSection(GnuStyle, PSec, "Names", &DwarfUnit::getGlobalNames);
1821}
1822
1823void DwarfDebug::emitDebugPubSection(
1824 bool GnuStyle, const MCSection *PSec, StringRef Name,
1825 const StringMap<const DIE *> &(DwarfUnit::*Accessor)() const) {
1826 for (const auto &NU : CUMap) {
1827 DwarfCompileUnit *TheU = NU.second;
1828
1829 const auto &Globals = (TheU->*Accessor)();
1830
1831 if (Globals.empty())
1832 continue;
1833
1834 if (auto Skeleton = static_cast<DwarfCompileUnit *>(TheU->getSkeleton()))
1835 TheU = Skeleton;
1836 unsigned ID = TheU->getUniqueID();
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001837
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001838 // Start the dwarf pubnames section.
Eric Christopher21a6a502013-09-10 21:49:37 +00001839 Asm->OutStreamer.SwitchSection(PSec);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001840
Eric Christopher8f1a9292013-09-13 00:35:05 +00001841 // Emit the header.
Stephen Hines36b56882014-04-23 16:57:46 -07001842 Asm->OutStreamer.AddComment("Length of Public " + Name + " Info");
1843 MCSymbol *BeginLabel = Asm->GetTempSymbol("pub" + Name + "_begin", ID);
1844 MCSymbol *EndLabel = Asm->GetTempSymbol("pub" + Name + "_end", ID);
1845 Asm->EmitLabelDifference(EndLabel, BeginLabel, 4);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001846
Stephen Hines36b56882014-04-23 16:57:46 -07001847 Asm->OutStreamer.EmitLabel(BeginLabel);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001848
1849 Asm->OutStreamer.AddComment("DWARF Version");
David Majnemerd7d43dc2013-08-21 06:13:34 +00001850 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001851
1852 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Stephen Hines36b56882014-04-23 16:57:46 -07001853 Asm->EmitSectionOffset(TheU->getLabelBegin(), TheU->getSectionSym());
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001854
1855 Asm->OutStreamer.AddComment("Compilation Unit Length");
Stephen Hines36b56882014-04-23 16:57:46 -07001856 Asm->EmitLabelDifference(TheU->getLabelEnd(), TheU->getLabelBegin(), 4);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001857
Eric Christopher8f1a9292013-09-13 00:35:05 +00001858 // Emit the pubnames for this compilation unit.
Stephen Hines36b56882014-04-23 16:57:46 -07001859 for (const auto &GI : Globals) {
1860 const char *Name = GI.getKeyData();
1861 const DIE *Entity = GI.second;
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001862
1863 Asm->OutStreamer.AddComment("DIE offset");
1864 Asm->EmitInt32(Entity->getOffset());
1865
Eric Christopher8f1a9292013-09-13 00:35:05 +00001866 if (GnuStyle) {
Stephen Hines36b56882014-04-23 16:57:46 -07001867 dwarf::PubIndexEntryDescriptor Desc = computeIndexValue(TheU, Entity);
David Blaikie18a6ade2013-09-19 22:19:37 +00001868 Asm->OutStreamer.AddComment(
David Blaikieac3f0162013-09-20 00:33:15 +00001869 Twine("Kind: ") + dwarf::GDBIndexEntryKindString(Desc.Kind) + ", " +
David Blaikie994c37f2013-09-19 23:01:29 +00001870 dwarf::GDBIndexEntryLinkageString(Desc.Linkage));
David Blaikie18a6ade2013-09-19 22:19:37 +00001871 Asm->EmitInt8(Desc.toBits());
Eric Christopher8f1a9292013-09-13 00:35:05 +00001872 }
1873
Stephen Hines36b56882014-04-23 16:57:46 -07001874 Asm->OutStreamer.AddComment("External Name");
1875 Asm->OutStreamer.EmitBytes(StringRef(Name, GI.getKeyLength() + 1));
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001876 }
1877
1878 Asm->OutStreamer.AddComment("End Mark");
1879 Asm->EmitInt32(0);
Stephen Hines36b56882014-04-23 16:57:46 -07001880 Asm->OutStreamer.EmitLabel(EndLabel);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001881 }
1882}
1883
Eric Christopher8f1a9292013-09-13 00:35:05 +00001884void DwarfDebug::emitDebugPubTypes(bool GnuStyle) {
Eric Christophercdeaae42013-09-23 20:55:35 +00001885 const MCSection *PSec =
1886 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
1887 : Asm->getObjFileLowering().getDwarfPubTypesSection();
Eric Christopher5704d642013-09-13 00:34:58 +00001888
Stephen Hines36b56882014-04-23 16:57:46 -07001889 emitDebugPubSection(GnuStyle, PSec, "Types", &DwarfUnit::getGlobalTypes);
Devang Patel193f7202009-11-24 01:14:22 +00001890}
1891
Eric Christopher64f824c2012-12-27 02:14:01 +00001892// Emit visible names into a debug str section.
1893void DwarfDebug::emitDebugStr() {
Stephen Hines36b56882014-04-23 16:57:46 -07001894 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Eric Christopher64f824c2012-12-27 02:14:01 +00001895 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
1896}
1897
Stephen Hines36b56882014-04-23 16:57:46 -07001898void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer,
1899 const DebugLocEntry &Entry) {
Stephen Hinesdce4a402014-05-29 02:49:00 -07001900 assert(Entry.getValues().size() == 1 &&
1901 "multi-value entries are not supported yet.");
1902 const DebugLocEntry::Value Value = Entry.getValues()[0];
1903 DIVariable DV(Value.getVariable());
1904 if (Value.isInt()) {
Stephen Hines36b56882014-04-23 16:57:46 -07001905 DIBasicType BTy(resolve(DV.getType()));
1906 if (BTy.Verify() && (BTy.getEncoding() == dwarf::DW_ATE_signed ||
1907 BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
1908 Streamer.EmitInt8(dwarf::DW_OP_consts, "DW_OP_consts");
Stephen Hinesdce4a402014-05-29 02:49:00 -07001909 Streamer.EmitSLEB128(Value.getInt());
Stephen Hines36b56882014-04-23 16:57:46 -07001910 } else {
1911 Streamer.EmitInt8(dwarf::DW_OP_constu, "DW_OP_constu");
Stephen Hinesdce4a402014-05-29 02:49:00 -07001912 Streamer.EmitULEB128(Value.getInt());
Stephen Hines36b56882014-04-23 16:57:46 -07001913 }
Stephen Hinesdce4a402014-05-29 02:49:00 -07001914 } else if (Value.isLocation()) {
1915 MachineLocation Loc = Value.getLoc();
Stephen Hines36b56882014-04-23 16:57:46 -07001916 if (!DV.hasComplexAddress())
1917 // Regular entry.
1918 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
1919 else {
1920 // Complex address entry.
1921 unsigned N = DV.getNumAddrElements();
1922 unsigned i = 0;
1923 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
1924 if (Loc.getOffset()) {
1925 i = 2;
1926 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
1927 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
1928 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
1929 Streamer.EmitSLEB128(DV.getAddrElement(1));
1930 } else {
1931 // If first address element is OpPlus then emit
1932 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
1933 MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));
1934 Asm->EmitDwarfRegOp(Streamer, TLoc, DV.isIndirect());
1935 i = 2;
1936 }
1937 } else {
1938 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
1939 }
1940
1941 // Emit remaining complex address elements.
1942 for (; i < N; ++i) {
1943 uint64_t Element = DV.getAddrElement(i);
1944 if (Element == DIBuilder::OpPlus) {
1945 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
1946 Streamer.EmitULEB128(DV.getAddrElement(++i));
1947 } else if (Element == DIBuilder::OpDeref) {
1948 if (!Loc.isReg())
1949 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
1950 } else
1951 llvm_unreachable("unknown Opcode found in complex address");
1952 }
1953 }
1954 }
1955 // else ... ignore constant fp. There is not any good way to
1956 // to represent them here in dwarf.
1957 // FIXME: ^
1958}
1959
1960void DwarfDebug::emitDebugLocEntryLocation(const DebugLocEntry &Entry) {
1961 Asm->OutStreamer.AddComment("Loc expr size");
1962 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
1963 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
1964 Asm->EmitLabelDifference(end, begin, 2);
1965 Asm->OutStreamer.EmitLabel(begin);
1966 // Emit the entry.
1967 APByteStreamer Streamer(*Asm);
1968 emitDebugLocEntry(Streamer, Entry);
1969 // Close the range.
1970 Asm->OutStreamer.EmitLabel(end);
1971}
1972
Eric Christopherd3b98532013-07-02 21:36:07 +00001973// Emit locations into the debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001974void DwarfDebug::emitDebugLoc() {
Daniel Dunbar83320a02011-03-16 22:16:39 +00001975 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001976 Asm->OutStreamer.SwitchSection(
Stephen Hines36b56882014-04-23 16:57:46 -07001977 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00001978 unsigned char Size = Asm->getDataLayout().getPointerSize();
Stephen Hines36b56882014-04-23 16:57:46 -07001979 for (const auto &DebugLoc : DotDebugLocEntries) {
1980 Asm->OutStreamer.EmitLabel(DebugLoc.Label);
1981 for (const auto &Entry : DebugLoc.List) {
1982 // Set up the range. This range is relative to the entry point of the
1983 // compile unit. This is a hard coded 0 for low_pc when we're emitting
1984 // ranges, or the DW_AT_low_pc on the compile unit otherwise.
1985 const DwarfCompileUnit *CU = Entry.getCU();
1986 if (CU->getRanges().size() == 1) {
1987 // Grab the begin symbol from the first range as our base.
1988 const MCSymbol *Base = CU->getRanges()[0].getStart();
1989 Asm->EmitLabelDifference(Entry.getBeginSym(), Base, Size);
1990 Asm->EmitLabelDifference(Entry.getEndSym(), Base, Size);
1991 } else {
1992 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
1993 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
Devang Patelc26f5442011-04-28 02:22:40 +00001994 }
Stephen Hines36b56882014-04-23 16:57:46 -07001995
1996 emitDebugLocEntryLocation(Entry);
Devang Patelc3f5f782010-05-25 23:40:22 +00001997 }
Stephen Hines36b56882014-04-23 16:57:46 -07001998 Asm->OutStreamer.EmitIntValue(0, Size);
1999 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patelc3f5f782010-05-25 23:40:22 +00002000 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002001}
2002
Stephen Hines36b56882014-04-23 16:57:46 -07002003void DwarfDebug::emitDebugLocDWO() {
2004 Asm->OutStreamer.SwitchSection(
2005 Asm->getObjFileLowering().getDwarfLocDWOSection());
2006 for (const auto &DebugLoc : DotDebugLocEntries) {
2007 Asm->OutStreamer.EmitLabel(DebugLoc.Label);
2008 for (const auto &Entry : DebugLoc.List) {
2009 // Just always use start_length for now - at least that's one address
2010 // rather than two. We could get fancier and try to, say, reuse an
2011 // address we know we've emitted elsewhere (the start of the function?
2012 // The start of the CU or CU subrange that encloses this range?)
2013 Asm->EmitInt8(dwarf::DW_LLE_start_length_entry);
Stephen Hinesdce4a402014-05-29 02:49:00 -07002014 unsigned idx = AddrPool.getIndex(Entry.getBeginSym());
Stephen Hines36b56882014-04-23 16:57:46 -07002015 Asm->EmitULEB128(idx);
2016 Asm->EmitLabelDifference(Entry.getEndSym(), Entry.getBeginSym(), 4);
Richard Mitton5cc319a2013-09-19 23:21:01 +00002017
Stephen Hines36b56882014-04-23 16:57:46 -07002018 emitDebugLocEntryLocation(Entry);
2019 }
2020 Asm->EmitInt8(dwarf::DW_LLE_end_of_list_entry);
Richard Mitton5cc319a2013-09-19 23:21:01 +00002021 }
Richard Mitton5cc319a2013-09-19 23:21:01 +00002022}
2023
2024struct ArangeSpan {
2025 const MCSymbol *Start, *End;
2026};
2027
2028// Emit a debug aranges section, containing a CU lookup for any
2029// address we can tie back to a CU.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00002030void DwarfDebug::emitDebugARanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002031 // Start the dwarf aranges section.
Stephen Hines36b56882014-04-23 16:57:46 -07002032 Asm->OutStreamer.SwitchSection(
2033 Asm->getObjFileLowering().getDwarfARangesSection());
Richard Mitton5cc319a2013-09-19 23:21:01 +00002034
Stephen Hinesdce4a402014-05-29 02:49:00 -07002035 typedef DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan>> SpansType;
Richard Mitton5cc319a2013-09-19 23:21:01 +00002036
2037 SpansType Spans;
2038
2039 // Build a list of sections used.
2040 std::vector<const MCSection *> Sections;
Stephen Hines36b56882014-04-23 16:57:46 -07002041 for (const auto &it : SectionMap) {
2042 const MCSection *Section = it.first;
Richard Mitton5cc319a2013-09-19 23:21:01 +00002043 Sections.push_back(Section);
2044 }
2045
2046 // Sort the sections into order.
2047 // This is only done to ensure consistent output order across different runs.
2048 std::sort(Sections.begin(), Sections.end(), SectionSort);
2049
2050 // Build a set of address spans, sorted by CU.
Stephen Hines36b56882014-04-23 16:57:46 -07002051 for (const MCSection *Section : Sections) {
Richard Mitton5cc319a2013-09-19 23:21:01 +00002052 SmallVector<SymbolCU, 8> &List = SectionMap[Section];
2053 if (List.size() < 2)
2054 continue;
2055
2056 // Sort the symbols by offset within the section.
Stephen Hines36b56882014-04-23 16:57:46 -07002057 std::sort(List.begin(), List.end(),
2058 [&](const SymbolCU &A, const SymbolCU &B) {
2059 unsigned IA = A.Sym ? Asm->OutStreamer.GetSymbolOrder(A.Sym) : 0;
2060 unsigned IB = B.Sym ? Asm->OutStreamer.GetSymbolOrder(B.Sym) : 0;
2061
2062 // Symbols with no order assigned should be placed at the end.
2063 // (e.g. section end labels)
2064 if (IA == 0)
2065 return false;
2066 if (IB == 0)
2067 return true;
2068 return IA < IB;
2069 });
Richard Mitton5cc319a2013-09-19 23:21:01 +00002070
2071 // If we have no section (e.g. common), just write out
2072 // individual spans for each symbol.
Stephen Hinesdce4a402014-05-29 02:49:00 -07002073 if (!Section) {
Stephen Hines36b56882014-04-23 16:57:46 -07002074 for (const SymbolCU &Cur : List) {
Richard Mitton5cc319a2013-09-19 23:21:01 +00002075 ArangeSpan Span;
2076 Span.Start = Cur.Sym;
Stephen Hinesdce4a402014-05-29 02:49:00 -07002077 Span.End = nullptr;
Richard Mitton5cc319a2013-09-19 23:21:01 +00002078 if (Cur.CU)
2079 Spans[Cur.CU].push_back(Span);
2080 }
2081 } else {
2082 // Build spans between each label.
2083 const MCSymbol *StartSym = List[0].Sym;
Stephen Hines36b56882014-04-23 16:57:46 -07002084 for (size_t n = 1, e = List.size(); n < e; n++) {
Richard Mitton5cc319a2013-09-19 23:21:01 +00002085 const SymbolCU &Prev = List[n - 1];
2086 const SymbolCU &Cur = List[n];
2087
2088 // Try and build the longest span we can within the same CU.
2089 if (Cur.CU != Prev.CU) {
2090 ArangeSpan Span;
2091 Span.Start = StartSym;
2092 Span.End = Cur.Sym;
2093 Spans[Prev.CU].push_back(Span);
2094 StartSym = Cur.Sym;
2095 }
2096 }
2097 }
2098 }
2099
Richard Mitton5cc319a2013-09-19 23:21:01 +00002100 unsigned PtrSize = Asm->getDataLayout().getPointerSize();
2101
2102 // Build a list of CUs used.
Stephen Hines36b56882014-04-23 16:57:46 -07002103 std::vector<DwarfCompileUnit *> CUs;
2104 for (const auto &it : Spans) {
2105 DwarfCompileUnit *CU = it.first;
Richard Mitton5cc319a2013-09-19 23:21:01 +00002106 CUs.push_back(CU);
2107 }
2108
2109 // Sort the CU list (again, to ensure consistent output order).
Stephen Hines36b56882014-04-23 16:57:46 -07002110 std::sort(CUs.begin(), CUs.end(), [](const DwarfUnit *A, const DwarfUnit *B) {
2111 return A->getUniqueID() < B->getUniqueID();
2112 });
Richard Mitton5cc319a2013-09-19 23:21:01 +00002113
2114 // Emit an arange table for each CU we used.
Stephen Hines36b56882014-04-23 16:57:46 -07002115 for (DwarfCompileUnit *CU : CUs) {
Richard Mitton5cc319a2013-09-19 23:21:01 +00002116 std::vector<ArangeSpan> &List = Spans[CU];
2117
2118 // Emit size of content not including length itself.
Stephen Hines36b56882014-04-23 16:57:46 -07002119 unsigned ContentSize =
2120 sizeof(int16_t) + // DWARF ARange version number
2121 sizeof(int32_t) + // Offset of CU in the .debug_info section
2122 sizeof(int8_t) + // Pointer Size (in bytes)
2123 sizeof(int8_t); // Segment Size (in bytes)
Richard Mitton5cc319a2013-09-19 23:21:01 +00002124
2125 unsigned TupleSize = PtrSize * 2;
2126
2127 // 7.20 in the Dwarf specs requires the table to be aligned to a tuple.
Stephen Hines36b56882014-04-23 16:57:46 -07002128 unsigned Padding =
2129 OffsetToAlignment(sizeof(int32_t) + ContentSize, TupleSize);
Richard Mitton5cc319a2013-09-19 23:21:01 +00002130
2131 ContentSize += Padding;
2132 ContentSize += (List.size() + 1) * TupleSize;
2133
2134 // For each compile unit, write the list of spans it covers.
2135 Asm->OutStreamer.AddComment("Length of ARange Set");
2136 Asm->EmitInt32(ContentSize);
2137 Asm->OutStreamer.AddComment("DWARF Arange version number");
2138 Asm->EmitInt16(dwarf::DW_ARANGES_VERSION);
2139 Asm->OutStreamer.AddComment("Offset Into Debug Info Section");
Stephen Hines36b56882014-04-23 16:57:46 -07002140 Asm->EmitSectionOffset(CU->getLocalLabelBegin(), CU->getLocalSectionSym());
Richard Mitton5cc319a2013-09-19 23:21:01 +00002141 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2142 Asm->EmitInt8(PtrSize);
2143 Asm->OutStreamer.AddComment("Segment Size (in bytes)");
2144 Asm->EmitInt8(0);
2145
Stephen Hines36b56882014-04-23 16:57:46 -07002146 Asm->OutStreamer.EmitFill(Padding, 0xff);
Richard Mitton5cc319a2013-09-19 23:21:01 +00002147
Stephen Hines36b56882014-04-23 16:57:46 -07002148 for (const ArangeSpan &Span : List) {
Richard Mitton5cc319a2013-09-19 23:21:01 +00002149 Asm->EmitLabelReference(Span.Start, PtrSize);
2150
2151 // Calculate the size as being from the span start to it's end.
Richard Mittoneb46def2013-09-23 17:56:20 +00002152 if (Span.End) {
Richard Mitton5cc319a2013-09-19 23:21:01 +00002153 Asm->EmitLabelDifference(Span.End, Span.Start, PtrSize);
Richard Mittoneb46def2013-09-23 17:56:20 +00002154 } else {
2155 // For symbols without an end marker (e.g. common), we
2156 // write a single arange entry containing just that one symbol.
2157 uint64_t Size = SymSize[Span.Start];
2158 if (Size == 0)
2159 Size = 1;
2160
2161 Asm->OutStreamer.EmitIntValue(Size, PtrSize);
2162 }
Richard Mitton5cc319a2013-09-19 23:21:01 +00002163 }
2164
2165 Asm->OutStreamer.AddComment("ARange terminator");
2166 Asm->OutStreamer.EmitIntValue(0, PtrSize);
2167 Asm->OutStreamer.EmitIntValue(0, PtrSize);
2168 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002169}
2170
Eric Christopherb6dc8652012-11-27 22:43:45 +00002171// Emit visible names into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002172void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002173 // Start the dwarf ranges section.
Stephen Hines36b56882014-04-23 16:57:46 -07002174 Asm->OutStreamer.SwitchSection(
2175 Asm->getObjFileLowering().getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002176
Stephen Hines36b56882014-04-23 16:57:46 -07002177 // Size for our labels.
2178 unsigned char Size = Asm->getDataLayout().getPointerSize();
2179
2180 // Grab the specific ranges for the compile units in the module.
2181 for (const auto &I : CUMap) {
2182 DwarfCompileUnit *TheCU = I.second;
2183
Stephen Hines36b56882014-04-23 16:57:46 -07002184 // Iterate over the misc ranges for the compile units in the module.
2185 for (const RangeSpanList &List : TheCU->getRangeLists()) {
2186 // Emit our symbol so we can find the beginning of the range.
2187 Asm->OutStreamer.EmitLabel(List.getSym());
2188
2189 for (const RangeSpan &Range : List.getRanges()) {
2190 const MCSymbol *Begin = Range.getStart();
2191 const MCSymbol *End = Range.getEnd();
2192 assert(Begin && "Range without a begin symbol?");
2193 assert(End && "Range without an end symbol?");
Stephen Hinesdce4a402014-05-29 02:49:00 -07002194 if (TheCU->getRanges().size() == 1) {
2195 // Grab the begin symbol from the first range as our base.
2196 const MCSymbol *Base = TheCU->getRanges()[0].getStart();
2197 Asm->EmitLabelDifference(Begin, Base, Size);
2198 Asm->EmitLabelDifference(End, Base, Size);
2199 } else {
2200 Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2201 Asm->OutStreamer.EmitSymbolValue(End, Size);
2202 }
Stephen Hines36b56882014-04-23 16:57:46 -07002203 }
2204
2205 // And terminate the list with two 0 values.
2206 Asm->OutStreamer.EmitIntValue(0, Size);
2207 Asm->OutStreamer.EmitIntValue(0, Size);
2208 }
2209
2210 // Now emit a range for the CU itself.
2211 if (TheCU->getRanges().size() > 1) {
2212 Asm->OutStreamer.EmitLabel(
2213 Asm->GetTempSymbol("cu_ranges", TheCU->getUniqueID()));
2214 for (const RangeSpan &Range : TheCU->getRanges()) {
2215 const MCSymbol *Begin = Range.getStart();
2216 const MCSymbol *End = Range.getEnd();
2217 assert(Begin && "Range without a begin symbol?");
2218 assert(End && "Range without an end symbol?");
2219 Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2220 Asm->OutStreamer.EmitSymbolValue(End, Size);
2221 }
2222 // And terminate the list with two 0 values.
2223 Asm->OutStreamer.EmitIntValue(0, Size);
2224 Asm->OutStreamer.EmitIntValue(0, Size);
2225 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002226 }
2227}
2228
Eric Christopher0b944ee2012-12-11 19:42:09 +00002229// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher98e237f2012-11-30 23:59:06 +00002230
Stephen Hinesdce4a402014-05-29 02:49:00 -07002231void DwarfDebug::initSkeletonUnit(const DwarfUnit &U, DIE &Die,
2232 std::unique_ptr<DwarfUnit> NewU) {
Stephen Hines36b56882014-04-23 16:57:46 -07002233 NewU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
Stephen Hinesdce4a402014-05-29 02:49:00 -07002234 U.getCUNode().getSplitDebugFilename());
Eric Christopher98e237f2012-11-30 23:59:06 +00002235
2236 if (!CompilationDir.empty())
Stephen Hines36b56882014-04-23 16:57:46 -07002237 NewU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher98e237f2012-11-30 23:59:06 +00002238
Stephen Hinesdce4a402014-05-29 02:49:00 -07002239 addGnuPubAttributes(*NewU, Die);
Eric Christophera6d84152013-09-30 23:14:16 +00002240
Stephen Hinesdce4a402014-05-29 02:49:00 -07002241 SkeletonHolder.addUnit(std::move(NewU));
Stephen Hines36b56882014-04-23 16:57:46 -07002242}
Eric Christopher8f1a9292013-09-13 00:35:05 +00002243
Stephen Hines36b56882014-04-23 16:57:46 -07002244// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2245// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2246// DW_AT_addr_base, DW_AT_ranges_base.
Stephen Hinesdce4a402014-05-29 02:49:00 -07002247DwarfCompileUnit &DwarfDebug::constructSkeletonCU(const DwarfCompileUnit &CU) {
Eric Christopher451c71d2013-10-01 00:43:36 +00002248
Stephen Hinesdce4a402014-05-29 02:49:00 -07002249 auto OwnedUnit = make_unique<DwarfCompileUnit>(
2250 CU.getUniqueID(), CU.getCUNode(), Asm, this, &SkeletonHolder);
2251 DwarfCompileUnit &NewCU = *OwnedUnit;
2252 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
2253 DwarfInfoSectionSym);
Stephen Hines36b56882014-04-23 16:57:46 -07002254
Stephen Hinesdce4a402014-05-29 02:49:00 -07002255 NewCU.initStmtList(DwarfLineSectionSym);
Stephen Hines36b56882014-04-23 16:57:46 -07002256
Stephen Hinesdce4a402014-05-29 02:49:00 -07002257 initSkeletonUnit(CU, NewCU.getUnitDie(), std::move(OwnedUnit));
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002258
Eric Christopher98e237f2012-11-30 23:59:06 +00002259 return NewCU;
2260}
2261
Stephen Hines36b56882014-04-23 16:57:46 -07002262// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_dwo_name,
2263// DW_AT_addr_base.
Stephen Hinesdce4a402014-05-29 02:49:00 -07002264DwarfTypeUnit &DwarfDebug::constructSkeletonTU(DwarfTypeUnit &TU) {
Stephen Hines36b56882014-04-23 16:57:46 -07002265 DwarfCompileUnit &CU = static_cast<DwarfCompileUnit &>(
Stephen Hinesdce4a402014-05-29 02:49:00 -07002266 *SkeletonHolder.getUnits()[TU.getCU().getUniqueID()]);
Stephen Hines36b56882014-04-23 16:57:46 -07002267
Stephen Hinesdce4a402014-05-29 02:49:00 -07002268 auto OwnedUnit = make_unique<DwarfTypeUnit>(TU.getUniqueID(), CU, Asm, this,
2269 &SkeletonHolder);
2270 DwarfTypeUnit &NewTU = *OwnedUnit;
2271 NewTU.setTypeSignature(TU.getTypeSignature());
2272 NewTU.setType(nullptr);
2273 NewTU.initSection(
2274 Asm->getObjFileLowering().getDwarfTypesSection(TU.getTypeSignature()));
Stephen Hines36b56882014-04-23 16:57:46 -07002275
Stephen Hinesdce4a402014-05-29 02:49:00 -07002276 initSkeletonUnit(TU, NewTU.getUnitDie(), std::move(OwnedUnit));
Stephen Hines36b56882014-04-23 16:57:46 -07002277 return NewTU;
Eric Christopher98e237f2012-11-30 23:59:06 +00002278}
2279
Eric Christopher0b944ee2012-12-11 19:42:09 +00002280// Emit the .debug_info.dwo section for separated dwarf. This contains the
2281// compile units that would normally be in debug_info.
Eric Christopher98e237f2012-11-30 23:59:06 +00002282void DwarfDebug::emitDebugInfoDWO() {
Eric Christopher4daaed12012-12-10 19:51:21 +00002283 assert(useSplitDwarf() && "No split dwarf debug info?");
Stephen Hines36b56882014-04-23 16:57:46 -07002284 // Don't pass an abbrev symbol, using a constant zero instead so as not to
2285 // emit relocations into the dwo file.
Stephen Hinesdce4a402014-05-29 02:49:00 -07002286 InfoHolder.emitUnits(this, /* AbbrevSymbol */ nullptr);
Eric Christopher6eebe472012-12-19 22:02:53 +00002287}
2288
2289// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2290// abbreviations for the .debug_info.dwo section.
2291void DwarfDebug::emitDebugAbbrevDWO() {
2292 assert(useSplitDwarf() && "No split dwarf?");
Stephen Hines36b56882014-04-23 16:57:46 -07002293 InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection());
2294}
2295
2296void DwarfDebug::emitDebugLineDWO() {
2297 assert(useSplitDwarf() && "No split dwarf?");
2298 Asm->OutStreamer.SwitchSection(
2299 Asm->getObjFileLowering().getDwarfLineDWOSection());
2300 SplitTypeUnitFileTable.Emit(Asm->OutStreamer);
Eric Christopher98e237f2012-11-30 23:59:06 +00002301}
Eric Christopher64f824c2012-12-27 02:14:01 +00002302
2303// Emit the .debug_str.dwo section for separated dwarf. This contains the
2304// string section and is identical in format to traditional .debug_str
2305// sections.
2306void DwarfDebug::emitDebugStrDWO() {
2307 assert(useSplitDwarf() && "No split dwarf?");
Stephen Hines36b56882014-04-23 16:57:46 -07002308 const MCSection *OffSec =
2309 Asm->getObjFileLowering().getDwarfStrOffDWOSection();
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002310 const MCSymbol *StrSym = DwarfStrSectionSym;
2311 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2312 OffSec, StrSym);
Eric Christopher64f824c2012-12-27 02:14:01 +00002313}
Stephen Hines36b56882014-04-23 16:57:46 -07002314
2315MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) {
2316 if (!useSplitDwarf())
2317 return nullptr;
2318 if (SingleCU)
2319 SplitTypeUnitFileTable.setCompilationDir(CU.getCUNode().getDirectory());
2320 return &SplitTypeUnitFileTable;
2321}
2322
Stephen Hinesdce4a402014-05-29 02:49:00 -07002323static uint64_t makeTypeSignature(StringRef Identifier) {
Stephen Hines36b56882014-04-23 16:57:46 -07002324 MD5 Hash;
2325 Hash.update(Identifier);
2326 // ... take the least significant 8 bytes and return those. Our MD5
2327 // implementation always returns its results in little endian, swap bytes
2328 // appropriately.
2329 MD5::MD5Result Result;
2330 Hash.final(Result);
Stephen Hinesdce4a402014-05-29 02:49:00 -07002331 return *reinterpret_cast<support::ulittle64_t *>(Result + 8);
2332}
Stephen Hines36b56882014-04-23 16:57:46 -07002333
Stephen Hinesdce4a402014-05-29 02:49:00 -07002334void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU,
2335 StringRef Identifier, DIE &RefDie,
2336 DICompositeType CTy) {
2337 // Fast path if we're building some type units and one has already used the
2338 // address pool we know we're going to throw away all this work anyway, so
2339 // don't bother building dependent types.
2340 if (!TypeUnitsUnderConstruction.empty() && AddrPool.hasBeenUsed())
2341 return;
Stephen Hines36b56882014-04-23 16:57:46 -07002342
Stephen Hinesdce4a402014-05-29 02:49:00 -07002343 const DwarfTypeUnit *&TU = DwarfTypeUnits[CTy];
2344 if (TU) {
2345 CU.addDIETypeSignature(RefDie, *TU);
2346 return;
2347 }
2348
2349 bool TopLevelType = TypeUnitsUnderConstruction.empty();
2350 AddrPool.resetUsedFlag();
2351
2352 auto OwnedUnit =
2353 make_unique<DwarfTypeUnit>(InfoHolder.getUnits().size(), CU, Asm, this,
2354 &InfoHolder, getDwoLineTable(CU));
2355 DwarfTypeUnit &NewTU = *OwnedUnit;
2356 DIE &UnitDie = NewTU.getUnitDie();
2357 TU = &NewTU;
2358 TypeUnitsUnderConstruction.push_back(
2359 std::make_pair(std::move(OwnedUnit), CTy));
2360
2361 NewTU.addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
2362 CU.getLanguage());
2363
2364 uint64_t Signature = makeTypeSignature(Identifier);
2365 NewTU.setTypeSignature(Signature);
2366
2367 if (!useSplitDwarf())
2368 CU.applyStmtList(UnitDie);
2369
2370 // FIXME: Skip using COMDAT groups for type units in the .dwo file once tools
2371 // such as DWP ( http://gcc.gnu.org/wiki/DebugFissionDWP ) can cope with it.
2372 NewTU.initSection(
Stephen Hines36b56882014-04-23 16:57:46 -07002373 useSplitDwarf()
2374 ? Asm->getObjFileLowering().getDwarfTypesDWOSection(Signature)
2375 : Asm->getObjFileLowering().getDwarfTypesSection(Signature));
2376
Stephen Hinesdce4a402014-05-29 02:49:00 -07002377 NewTU.setType(NewTU.createTypeDIE(CTy));
2378
2379 if (TopLevelType) {
2380 auto TypeUnitsToAdd = std::move(TypeUnitsUnderConstruction);
2381 TypeUnitsUnderConstruction.clear();
2382
2383 // Types referencing entries in the address table cannot be placed in type
2384 // units.
2385 if (AddrPool.hasBeenUsed()) {
2386
2387 // Remove all the types built while building this type.
2388 // This is pessimistic as some of these types might not be dependent on
2389 // the type that used an address.
2390 for (const auto &TU : TypeUnitsToAdd)
2391 DwarfTypeUnits.erase(TU.second);
2392
2393 // Construct this type in the CU directly.
2394 // This is inefficient because all the dependent types will be rebuilt
2395 // from scratch, including building them in type units, discovering that
2396 // they depend on addresses, throwing them out and rebuilding them.
2397 CU.constructTypeDIE(RefDie, CTy);
2398 return;
2399 }
2400
2401 // If the type wasn't dependent on fission addresses, finish adding the type
2402 // and all its dependent types.
2403 for (auto &TU : TypeUnitsToAdd) {
2404 if (useSplitDwarf())
2405 TU.first->setSkeleton(constructSkeletonTU(*TU.first));
2406 InfoHolder.addUnit(std::move(TU.first));
2407 }
2408 }
2409 CU.addDIETypeSignature(RefDie, NewTU);
Stephen Hines36b56882014-04-23 16:57:46 -07002410}
2411
Stephen Hinesdce4a402014-05-29 02:49:00 -07002412void DwarfDebug::attachLowHighPC(DwarfCompileUnit &Unit, DIE &D,
Stephen Hines36b56882014-04-23 16:57:46 -07002413 MCSymbol *Begin, MCSymbol *End) {
Stephen Hinesdce4a402014-05-29 02:49:00 -07002414 assert(Begin && "Begin label should not be null!");
2415 assert(End && "End label should not be null!");
2416 assert(Begin->isDefined() && "Invalid starting label");
2417 assert(End->isDefined() && "Invalid end label");
2418
2419 Unit.addLabelAddress(D, dwarf::DW_AT_low_pc, Begin);
Stephen Hines36b56882014-04-23 16:57:46 -07002420 if (DwarfVersion < 4)
Stephen Hinesdce4a402014-05-29 02:49:00 -07002421 Unit.addLabelAddress(D, dwarf::DW_AT_high_pc, End);
Stephen Hines36b56882014-04-23 16:57:46 -07002422 else
Stephen Hinesdce4a402014-05-29 02:49:00 -07002423 Unit.addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin);
2424}
2425
2426// Accelerator table mutators - add each name along with its companion
2427// DIE to the proper table while ensuring that the name that we're going
2428// to reference is in the string table. We do this since the names we
2429// add may not only be identical to the names in the DIE.
2430void DwarfDebug::addAccelName(StringRef Name, const DIE &Die) {
2431 if (!useDwarfAccelTables())
2432 return;
2433 AccelNames.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2434 &Die);
2435}
2436
2437void DwarfDebug::addAccelObjC(StringRef Name, const DIE &Die) {
2438 if (!useDwarfAccelTables())
2439 return;
2440 AccelObjC.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2441 &Die);
2442}
2443
2444void DwarfDebug::addAccelNamespace(StringRef Name, const DIE &Die) {
2445 if (!useDwarfAccelTables())
2446 return;
2447 AccelNamespace.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2448 &Die);
2449}
2450
2451void DwarfDebug::addAccelType(StringRef Name, const DIE &Die, char Flags) {
2452 if (!useDwarfAccelTables())
2453 return;
2454 AccelTypes.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2455 &Die);
Stephen Hines36b56882014-04-23 16:57:46 -07002456}