blob: 11345eb288a84f72609e2de09dd822e8151c3294 [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
Devang Patele4b27562009-08-28 23:24:31 +000014#define DEBUG_TYPE "dwarfdebug"
Stephen Hines36b56882014-04-23 16:57:46 -070015#include "ByteStreamer.h"
Bill Wendling0310d762009-05-15 09:23:25 +000016#include "DwarfDebug.h"
Chris Lattner74e41f92010-04-05 05:24:55 +000017#include "DIE.h"
Eric Christopher0d27ca12013-08-08 23:45:55 +000018#include "DIEHash.h"
Eric Christopher09ac3d82011-11-07 09:24:32 +000019#include "DwarfAccelTable.h"
Stephen Hines36b56882014-04-23 16:57:46 -070020#include "DwarfUnit.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000021#include "llvm/ADT/STLExtras.h"
22#include "llvm/ADT/Statistic.h"
23#include "llvm/ADT/StringExtras.h"
24#include "llvm/ADT/Triple.h"
David Greeneb2c66fc2009-08-19 21:52:55 +000025#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling0310d762009-05-15 09:23:25 +000026#include "llvm/CodeGen/MachineModuleInfo.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000027#include "llvm/IR/Constants.h"
Stephen Hines36b56882014-04-23 16:57:46 -070028#include "llvm/IR/DIBuilder.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000029#include "llvm/IR/DataLayout.h"
Stephen Hines36b56882014-04-23 16:57:46 -070030#include "llvm/IR/DebugInfo.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000031#include "llvm/IR/Instructions.h"
32#include "llvm/IR/Module.h"
Stephen Hines36b56882014-04-23 16:57:46 -070033#include "llvm/IR/ValueHandle.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000034#include "llvm/MC/MCAsmInfo.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000035#include "llvm/MC/MCSection.h"
Chris Lattner6c2f9e12009-08-19 05:49:37 +000036#include "llvm/MC/MCStreamer.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000037#include "llvm/MC/MCSymbol.h"
Devang Pateleac9c072010-04-27 19:46:33 +000038#include "llvm/Support/CommandLine.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000039#include "llvm/Support/Debug.h"
David Majnemerd7d43dc2013-08-21 06:13:34 +000040#include "llvm/Support/Dwarf.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000041#include "llvm/Support/ErrorHandling.h"
Chris Lattner0ad9c912010-01-22 22:09:00 +000042#include "llvm/Support/FormattedStream.h"
Stephen Hines36b56882014-04-23 16:57:46 -070043#include "llvm/Support/LEB128.h"
Eric Christopher3dee5752013-07-26 17:02:41 +000044#include "llvm/Support/MD5.h"
Michael J. Spencer1f6efa32010-11-29 18:16:10 +000045#include "llvm/Support/Path.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000046#include "llvm/Support/Timer.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000047#include "llvm/Target/TargetFrameLowering.h"
48#include "llvm/Target/TargetLoweringObjectFile.h"
49#include "llvm/Target/TargetMachine.h"
50#include "llvm/Target/TargetOptions.h"
51#include "llvm/Target/TargetRegisterInfo.h"
Bill Wendling0310d762009-05-15 09:23:25 +000052using namespace llvm;
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
Bill Wendling0310d762009-05-15 09:23:25 +0000110namespace llvm {
111
Manman Ren8199f0b2013-10-08 19:07:44 +0000112/// resolve - Look in the DwarfDebug map for the MDNode that
113/// corresponds to the reference.
Stephen Hines36b56882014-04-23 16:57:46 -0700114template <typename T> T DbgVariable::resolve(DIRef<T> Ref) const {
Manman Ren8199f0b2013-10-08 19:07:44 +0000115 return DD->resolve(Ref);
116}
117
Stephen Hines36b56882014-04-23 16:57:46 -0700118bool DbgVariable::isBlockByrefVariable() const {
119 assert(Var.isVariable() && "Invalid complex DbgVariable!");
120 return Var.isBlockByrefVariable(DD->getTypeIdentifierMap());
121}
122
123
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000124DIType DbgVariable::getType() const {
Stephen Hines36b56882014-04-23 16:57:46 -0700125 DIType Ty = Var.getType().resolve(DD->getTypeIdentifierMap());
Devang Patel3cbee302011-04-12 22:53:02 +0000126 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
127 // addresses instead.
Stephen Hines36b56882014-04-23 16:57:46 -0700128 if (Var.isBlockByrefVariable(DD->getTypeIdentifierMap())) {
Devang Patel3cbee302011-04-12 22:53:02 +0000129 /* Byref variables, in Blocks, are declared by the programmer as
130 "SomeType VarName;", but the compiler creates a
131 __Block_byref_x_VarName struct, and gives the variable VarName
132 either the struct, or a pointer to the struct, as its type. This
133 is necessary for various behind-the-scenes things the compiler
134 needs to do with by-reference variables in blocks.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000135
Devang Patel3cbee302011-04-12 22:53:02 +0000136 However, as far as the original *programmer* is concerned, the
137 variable should still have type 'SomeType', as originally declared.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000138
Devang Patel3cbee302011-04-12 22:53:02 +0000139 The following function dives into the __Block_byref_x_VarName
140 struct to find the original type of the variable. This will be
141 passed back to the code generating the type for the Debug
142 Information Entry for the variable 'VarName'. 'VarName' will then
143 have the original type 'SomeType' in its debug information.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000144
Devang Patel3cbee302011-04-12 22:53:02 +0000145 The original type 'SomeType' will be the type of the field named
146 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000147
Devang Patel3cbee302011-04-12 22:53:02 +0000148 NOTE: In order for this to not completely fail on the debugger
149 side, the Debug Information Entry for the variable VarName needs to
150 have a DW_AT_location that tells the debugger how to unwind through
151 the pointers and __Block_byref_x_VarName struct to find the actual
152 value of the variable. The function addBlockByrefType does this. */
153 DIType subType = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000154 uint16_t tag = Ty.getTag();
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000155
Eric Christopher4dc211a2013-09-04 19:53:21 +0000156 if (tag == dwarf::DW_TAG_pointer_type)
Manman Ren8199f0b2013-10-08 19:07:44 +0000157 subType = resolve(DIDerivedType(Ty).getTypeDerivedFrom());
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000158
Eric Christopher4dc211a2013-09-04 19:53:21 +0000159 DIArray Elements = DICompositeType(subType).getTypeArray();
Devang Patel3cbee302011-04-12 22:53:02 +0000160 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
David Blaikied6dffb42013-11-18 23:57:26 +0000161 DIDerivedType DT(Elements.getElement(i));
Devang Patel3cbee302011-04-12 22:53:02 +0000162 if (getName() == DT.getName())
Manman Ren8199f0b2013-10-08 19:07:44 +0000163 return (resolve(DT.getTypeDerivedFrom()));
Devang Patel8bd11de2010-08-09 21:01:39 +0000164 }
Devang Patel8bd11de2010-08-09 21:01:39 +0000165 }
Devang Patel3cbee302011-04-12 22:53:02 +0000166 return Ty;
167}
Bill Wendling0310d762009-05-15 09:23:25 +0000168
Chris Lattnerea761862010-04-05 04:09:20 +0000169} // end llvm namespace
Bill Wendling0310d762009-05-15 09:23:25 +0000170
Manman Ren0e6783f2013-07-02 23:40:10 +0000171/// Return Dwarf Version by checking module flags.
172static unsigned getDwarfVersionFromModule(const Module *M) {
Manman Renc8cfaa12013-07-16 23:21:16 +0000173 Value *Val = M->getModuleFlag("Dwarf Version");
174 if (!Val)
Eric Christopherefc47ec2013-09-04 22:21:24 +0000175 return dwarf::DWARF_VERSION;
Manman Renc8cfaa12013-07-16 23:21:16 +0000176 return cast<ConstantInt>(Val)->getZExtValue();
Manman Ren0e6783f2013-07-02 23:40:10 +0000177}
178
Chris Lattner49cd6642010-04-05 05:11:15 +0000179DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Stephen Hines36b56882014-04-23 16:57:46 -0700180 : Asm(A), MMI(Asm->MMI), FirstCU(0), PrevLabel(NULL), GlobalRangeCount(0),
181 InfoHolder(A, "info_string", DIEValueAllocator),
182 UsedNonDefaultText(false),
183 SkeletonHolder(A, "skel_string", DIEValueAllocator) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000184
Stephen Hines36b56882014-04-23 16:57:46 -0700185 DwarfInfoSectionSym = DwarfAbbrevSectionSym = DwarfStrSectionSym = 0;
Eric Christopher7a0103c2013-02-07 21:19:50 +0000186 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = DwarfLineSectionSym = 0;
Eric Christopher9a9e73b2013-04-07 03:43:09 +0000187 DwarfAddrSectionSym = 0;
Eric Christopher64f824c2012-12-27 02:14:01 +0000188 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
Devang Patelc3f5f782010-05-25 23:40:22 +0000189 FunctionBeginSym = FunctionEndSym = 0;
Stephen Hines36b56882014-04-23 16:57:46 -0700190 CurFn = 0;
191 CurMI = 0;
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 Hines36b56882014-04-23 16:57:46 -0700212 DwarfVersion = DwarfVersionNumber
213 ? DwarfVersionNumber
214 : getDwarfVersionFromModule(MMI->getModule());
Manman Ren0e6783f2013-07-02 23:40:10 +0000215
Dan Gohman03c3dc72010-06-18 15:56:31 +0000216 {
217 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopherc4639d62012-11-19 22:42:15 +0000218 beginModule();
Torok Edwin9c421072010-04-07 10:44:46 +0000219 }
Bill Wendling0310d762009-05-15 09:23:25 +0000220}
Bill Wendling0310d762009-05-15 09:23:25 +0000221
Eric Christopherb6dc8652012-11-27 22:43:45 +0000222// Switch to the specified MCSection and emit an assembler
223// temporary label to it if SymbolStem is specified.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000224static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Eric Christopherd8a87522011-11-07 09:18:38 +0000225 const char *SymbolStem = 0) {
226 Asm->OutStreamer.SwitchSection(Section);
Stephen Hines36b56882014-04-23 16:57:46 -0700227 if (!SymbolStem)
228 return 0;
Eric Christopherd8a87522011-11-07 09:18:38 +0000229
230 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
231 Asm->OutStreamer.EmitLabel(TmpSym);
232 return TmpSym;
233}
234
Stephen Hines36b56882014-04-23 16:57:46 -0700235DwarfFile::~DwarfFile() {
236 for (DwarfUnit *DU : CUs)
237 delete DU;
238}
239
240MCSymbol *DwarfFile::getStringPoolSym() {
Eric Christopher64f824c2012-12-27 02:14:01 +0000241 return Asm->GetTempSymbol(StringPref);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000242}
243
Stephen Hines36b56882014-04-23 16:57:46 -0700244MCSymbol *DwarfFile::getStringPoolEntry(StringRef Str) {
245 std::pair<MCSymbol *, unsigned> &Entry =
246 StringPool.GetOrCreateValue(Str).getValue();
247 if (Entry.first)
248 return Entry.first;
Chris Lattnerbc733f52010-03-13 02:17:42 +0000249
250 Entry.second = NextStringPoolNumber++;
Eric Christopher64f824c2012-12-27 02:14:01 +0000251 return Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
Chris Lattnerbc733f52010-03-13 02:17:42 +0000252}
253
Stephen Hines36b56882014-04-23 16:57:46 -0700254unsigned DwarfFile::getStringPoolIndex(StringRef Str) {
255 std::pair<MCSymbol *, unsigned> &Entry =
256 StringPool.GetOrCreateValue(Str).getValue();
257 if (Entry.first)
258 return Entry.second;
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000259
260 Entry.second = NextStringPoolNumber++;
261 Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
262 return Entry.second;
263}
264
Stephen Hines36b56882014-04-23 16:57:46 -0700265unsigned DwarfFile::getAddrPoolIndex(const MCSymbol *Sym, bool TLS) {
266 std::pair<AddrPool::iterator, bool> P = AddressPool.insert(
267 std::make_pair(Sym, AddressPoolEntry(NextAddrPoolNumber, TLS)));
David Blaikie1ca79902013-06-28 18:55:13 +0000268 if (P.second)
269 ++NextAddrPoolNumber;
Stephen Hines36b56882014-04-23 16:57:46 -0700270 return P.first->second.Number;
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000271}
272
Eric Christopherb6dc8652012-11-27 22:43:45 +0000273// Define a unique number for the abbreviation.
274//
Stephen Hines36b56882014-04-23 16:57:46 -0700275void DwarfFile::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling0310d762009-05-15 09:23:25 +0000276 // Check the set for priors.
Stephen Hines36b56882014-04-23 16:57:46 -0700277 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
Bill Wendling0310d762009-05-15 09:23:25 +0000278
279 // If it's newly added.
280 if (InSet == &Abbrev) {
281 // Add to abbreviation list.
David Blaikie8e8e6dc2013-10-30 17:14:24 +0000282 Abbreviations.push_back(&Abbrev);
Bill Wendling0310d762009-05-15 09:23:25 +0000283
284 // Assign the vector position + 1 as its number.
David Blaikie8e8e6dc2013-10-30 17:14:24 +0000285 Abbrev.setNumber(Abbreviations.size());
Bill Wendling0310d762009-05-15 09:23:25 +0000286 } else {
287 // Assign existing abbreviation number.
288 Abbrev.setNumber(InSet->getNumber());
289 }
290}
291
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000292static bool isObjCClass(StringRef Name) {
293 return Name.startswith("+") || Name.startswith("-");
294}
295
296static bool hasObjCCategory(StringRef Name) {
Stephen Hines36b56882014-04-23 16:57:46 -0700297 if (!isObjCClass(Name))
298 return false;
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000299
Benjamin Kramer4321d4e2013-08-24 12:15:54 +0000300 return Name.find(") ") != StringRef::npos;
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000301}
302
303static void getObjCClassCategory(StringRef In, StringRef &Class,
304 StringRef &Category) {
305 if (!hasObjCCategory(In)) {
306 Class = In.slice(In.find('[') + 1, In.find(' '));
307 Category = "";
308 return;
309 }
310
311 Class = In.slice(In.find('[') + 1, In.find('('));
312 Category = In.slice(In.find('[') + 1, In.find(' '));
313 return;
314}
315
316static StringRef getObjCMethodName(StringRef In) {
317 return In.slice(In.find(' ') + 1, In.find(']'));
318}
319
Richard Mitton7c9659a2013-10-03 22:07:08 +0000320// Helper for sorting sections into a stable output order.
321static bool SectionSort(const MCSection *A, const MCSection *B) {
Stephen Hines36b56882014-04-23 16:57:46 -0700322 std::string LA = (A ? A->getLabelBeginName() : "");
323 std::string LB = (B ? B->getLabelBeginName() : "");
324 return LA < LB;
Richard Mitton7c9659a2013-10-03 22:07:08 +0000325}
326
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000327// Add the various names to the Dwarf accelerator table names.
Eric Christopher9e0b08d2013-09-20 23:22:52 +0000328// TODO: Determine whether or not we should add names for programs
329// that do not have a DW_AT_name or DW_AT_linkage_name field - this
330// is only slightly different than the lookup of non-standard ObjC names.
Stephen Hines36b56882014-04-23 16:57:46 -0700331static void addSubprogramNames(DwarfUnit *TheU, DISubprogram SP, DIE *Die) {
332 if (!SP.isDefinition())
333 return;
334 TheU->addAccelName(SP.getName(), Die);
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000335
336 // If the linkage name is different than the name, go ahead and output
337 // that as well into the name table.
338 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
Stephen Hines36b56882014-04-23 16:57:46 -0700339 TheU->addAccelName(SP.getLinkageName(), Die);
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000340
341 // If this is an Objective-C selector name add it to the ObjC accelerator
342 // too.
343 if (isObjCClass(SP.getName())) {
344 StringRef Class, Category;
345 getObjCClassCategory(SP.getName(), Class, Category);
Stephen Hines36b56882014-04-23 16:57:46 -0700346 TheU->addAccelObjC(Class, Die);
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000347 if (Category != "")
Stephen Hines36b56882014-04-23 16:57:46 -0700348 TheU->addAccelObjC(Category, Die);
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000349 // Also add the base method name to the name table.
Stephen Hines36b56882014-04-23 16:57:46 -0700350 TheU->addAccelName(getObjCMethodName(SP.getName()), Die);
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000351 }
352}
353
Manman Ren02d29672013-09-09 19:05:21 +0000354/// isSubprogramContext - Return true if Context is either a subprogram
355/// or another context nested inside a subprogram.
356bool DwarfDebug::isSubprogramContext(const MDNode *Context) {
357 if (!Context)
358 return false;
359 DIDescriptor D(Context);
360 if (D.isSubprogram())
361 return true;
362 if (D.isType())
Manman Ren2c9905a2013-09-09 19:47:11 +0000363 return isSubprogramContext(resolve(DIType(Context).getContext()));
Manman Ren02d29672013-09-09 19:05:21 +0000364 return false;
365}
366
Eric Christopherb6dc8652012-11-27 22:43:45 +0000367// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
368// and DW_AT_high_pc attributes. If there are global variables in this
369// scope then create and insert DIEs for these variables.
Stephen Hines36b56882014-04-23 16:57:46 -0700370DIE *DwarfDebug::updateSubprogramScopeDIE(DwarfCompileUnit *SPCU,
371 DISubprogram SP) {
David Blaikie14f41e72013-11-15 23:13:08 +0000372 DIE *SPDie = SPCU->getDIE(SP);
Devang Patel8aa61472010-07-07 22:20:57 +0000373
Chris Lattnerd38fee82010-04-05 00:13:49 +0000374 assert(SPDie && "Unable to find subprogram DIE!");
Jim Grosbach1e20b962010-07-21 21:21:52 +0000375
Bill Wendling168c1902012-11-07 05:19:04 +0000376 // If we're updating an abstract DIE, then we will be adding the children and
377 // object pointer later on. But what we don't want to do is process the
378 // concrete DIE twice.
David Blaikie14f41e72013-11-15 23:13:08 +0000379 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SP)) {
Bill Wendling168c1902012-11-07 05:19:04 +0000380 // Pick up abstract subprogram DIE.
Stephen Hines36b56882014-04-23 16:57:46 -0700381 SPDie =
382 SPCU->createAndAddDIE(dwarf::DW_TAG_subprogram, *SPCU->getUnitDie());
Manman Ren87b110a2013-10-11 23:58:05 +0000383 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin, AbsSPDIE);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000384 } else {
385 DISubprogram SPDecl = SP.getFunctionDeclaration();
386 if (!SPDecl.isSubprogram()) {
387 // There is not any need to generate specification DIE for a function
388 // defined at compile unit level. If a function is defined inside another
389 // function then gdb prefers the definition at top level and but does not
390 // expect specification DIE in parent function. So avoid creating
391 // specification DIE for a function defined inside a function.
Manman Renb8e48a62013-10-10 18:40:01 +0000392 DIScope SPContext = resolve(SP.getContext());
393 if (SP.isDefinition() && !SPContext.isCompileUnit() &&
Stephen Hines36b56882014-04-23 16:57:46 -0700394 !SPContext.isFile() && !isSubprogramContext(SPContext)) {
Bill Wendlinga4c76932012-11-07 04:42:18 +0000395 SPCU->addFlag(SPDie, dwarf::DW_AT_declaration);
396
397 // Add arguments.
398 DICompositeType SPTy = SP.getType();
399 DIArray Args = SPTy.getTypeArray();
Eric Christopher31667622013-08-08 01:41:00 +0000400 uint16_t SPTag = SPTy.getTag();
Bill Wendlinga4c76932012-11-07 04:42:18 +0000401 if (SPTag == dwarf::DW_TAG_subroutine_type)
Stephen Hines36b56882014-04-23 16:57:46 -0700402 SPCU->constructSubprogramArguments(*SPDie, Args);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000403 DIE *SPDeclDie = SPDie;
Stephen Hines36b56882014-04-23 16:57:46 -0700404 SPDie = SPCU->createAndAddDIE(dwarf::DW_TAG_subprogram,
405 *SPCU->getUnitDie());
Manman Ren87b110a2013-10-11 23:58:05 +0000406 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, SPDeclDie);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000407 }
408 }
Devang Patel8aa61472010-07-07 22:20:57 +0000409 }
410
Stephen Hines36b56882014-04-23 16:57:46 -0700411 attachLowHighPC(SPCU, SPDie, FunctionBeginSym, FunctionEndSym);
412
Chris Lattnerd38fee82010-04-05 00:13:49 +0000413 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
414 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Devang Patel3cbee302011-04-12 22:53:02 +0000415 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patelb4645642010-02-06 01:02:37 +0000416
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000417 // Add name to the name table, we do this here because we're guaranteed
418 // to have concrete versions of our DW_TAG_subprogram nodes.
419 addSubprogramNames(SPCU, SP, SPDie);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000420
Chris Lattnerd38fee82010-04-05 00:13:49 +0000421 return SPDie;
Devang Patel53bb5c92009-11-10 23:06:00 +0000422}
423
Manman Ren995de6c2013-09-11 19:40:28 +0000424/// Check whether we should create a DIE for the given Scope, return true
425/// if we don't create a DIE (the corresponding DIE is null).
Manman Renfd2210a2013-09-10 18:40:41 +0000426bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
427 if (Scope->isAbstractScope())
428 return false;
429
Manman Ren995de6c2013-09-11 19:40:28 +0000430 // We don't create a DIE if there is no Range.
Manman Renfd2210a2013-09-10 18:40:41 +0000431 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
432 if (Ranges.empty())
433 return true;
434
435 if (Ranges.size() > 1)
436 return false;
437
Manman Ren995de6c2013-09-11 19:40:28 +0000438 // We don't create a DIE if we have a single Range and the end label
439 // is null.
Manman Renfd2210a2013-09-10 18:40:41 +0000440 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
441 MCSymbol *End = getLabelAfterInsn(RI->second);
442 return !End;
443}
444
Stephen Hines36b56882014-04-23 16:57:46 -0700445static void addSectionLabel(AsmPrinter *Asm, DwarfUnit *U, DIE *D,
446 dwarf::Attribute A, const MCSymbol *L,
447 const MCSymbol *Sec) {
448 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
449 U->addSectionLabel(D, A, L);
450 else
451 U->addSectionDelta(D, A, L, Sec);
452}
453
454void DwarfDebug::addScopeRangeList(DwarfCompileUnit *TheCU, DIE *ScopeDIE,
455 const SmallVectorImpl<InsnRange> &Range) {
456 // Emit offset in .debug_range as a relocatable label. emitDIE will handle
457 // emitting it appropriately.
458 MCSymbol *RangeSym = Asm->GetTempSymbol("debug_ranges", GlobalRangeCount++);
459
460 // Under fission, ranges are specified by constant offsets relative to the
461 // CU's DW_AT_GNU_ranges_base.
462 if (useSplitDwarf())
463 TheCU->addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
464 DwarfDebugRangeSectionSym);
465 else
466 addSectionLabel(Asm, TheCU, ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
467 DwarfDebugRangeSectionSym);
468
469 RangeSpanList List(RangeSym);
470 for (const InsnRange &R : Range) {
471 RangeSpan Span(getLabelBeforeInsn(R.first), getLabelAfterInsn(R.second));
472 List.addRange(std::move(Span));
473 }
474
475 // Add the range list to the set of ranges to be emitted.
476 TheCU->addRangeList(std::move(List));
477}
478
Eric Christopherb6dc8652012-11-27 22:43:45 +0000479// Construct new DW_TAG_lexical_block for this scope and attach
480// DW_AT_low_pc/DW_AT_high_pc labels.
Stephen Hines36b56882014-04-23 16:57:46 -0700481DIE *DwarfDebug::constructLexicalScopeDIE(DwarfCompileUnit *TheCU,
Devang Pateld3024342011-08-15 22:24:32 +0000482 LexicalScope *Scope) {
Manman Renfd2210a2013-09-10 18:40:41 +0000483 if (isLexicalScopeDIENull(Scope))
484 return 0;
485
Devang Pateleac9c072010-04-27 19:46:33 +0000486 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
487 if (Scope->isAbstractScope())
488 return ScopeDIE;
489
Stephen Hines36b56882014-04-23 16:57:46 -0700490 const SmallVectorImpl<InsnRange> &ScopeRanges = Scope->getRanges();
Eric Christopherda965de2013-07-03 01:22:29 +0000491
Stephen Hines36b56882014-04-23 16:57:46 -0700492 // If we have multiple ranges, emit them into the range section.
493 if (ScopeRanges.size() > 1) {
494 addScopeRangeList(TheCU, ScopeDIE, ScopeRanges);
Devang Pateleac9c072010-04-27 19:46:33 +0000495 return ScopeDIE;
496 }
497
Eric Christopherf53d6432013-07-03 01:57:28 +0000498 // Construct the address range for this DIE.
Stephen Hines36b56882014-04-23 16:57:46 -0700499 SmallVectorImpl<InsnRange>::const_iterator RI = ScopeRanges.begin();
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000500 MCSymbol *Start = getLabelBeforeInsn(RI->first);
501 MCSymbol *End = getLabelAfterInsn(RI->second);
Manman Renfd2210a2013-09-10 18:40:41 +0000502 assert(End && "End label should not be null!");
Devang Patel53bb5c92009-11-10 23:06:00 +0000503
Chris Lattnerb7db7332010-03-09 01:58:53 +0000504 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
505 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbach1e20b962010-07-21 21:21:52 +0000506
Stephen Hines36b56882014-04-23 16:57:46 -0700507 attachLowHighPC(TheCU, ScopeDIE, Start, End);
Devang Patel53bb5c92009-11-10 23:06:00 +0000508
509 return ScopeDIE;
510}
511
Eric Christopherb6dc8652012-11-27 22:43:45 +0000512// This scope represents inlined body of a function. Construct DIE to
513// represent this concrete inlined copy of the function.
Stephen Hines36b56882014-04-23 16:57:46 -0700514DIE *DwarfDebug::constructInlinedScopeDIE(DwarfCompileUnit *TheCU,
Devang Pateld3024342011-08-15 22:24:32 +0000515 LexicalScope *Scope) {
Stephen Hines36b56882014-04-23 16:57:46 -0700516 const SmallVectorImpl<InsnRange> &ScopeRanges = Scope->getRanges();
517 assert(!ScopeRanges.empty() &&
Nick Lewycky746cb672011-10-26 22:55:33 +0000518 "LexicalScope does not have instruction markers!");
Devang Pateleac9c072010-04-27 19:46:33 +0000519
Devang Patel26a92002011-07-27 00:34:13 +0000520 if (!Scope->getScopeNode())
521 return NULL;
522 DIScope DS(Scope->getScopeNode());
523 DISubprogram InlinedSP = getDISubprogram(DS);
Eric Christopher3f045002013-10-04 17:08:38 +0000524 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
Devang Patel26a92002011-07-27 00:34:13 +0000525 if (!OriginDIE) {
Bill Wendlinge0aae5b2012-10-30 17:51:02 +0000526 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Devang Patel26a92002011-07-27 00:34:13 +0000527 return NULL;
528 }
529
Devang Pateld96efb82011-05-05 17:54:26 +0000530 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Manman Ren87b110a2013-10-11 23:58:05 +0000531 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin, OriginDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +0000532
Stephen Hines36b56882014-04-23 16:57:46 -0700533 // If we have multiple ranges, emit them into the range section.
534 if (ScopeRanges.size() > 1)
535 addScopeRangeList(TheCU, ScopeDIE, ScopeRanges);
536 else {
537 SmallVectorImpl<InsnRange>::const_iterator RI = ScopeRanges.begin();
Eric Christophere7177132013-07-03 02:23:53 +0000538 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
539 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
540
541 if (StartLabel == 0 || EndLabel == 0)
542 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
543
544 assert(StartLabel->isDefined() &&
545 "Invalid starting label for an inlined scope!");
546 assert(EndLabel->isDefined() && "Invalid end label for an inlined scope!");
547
Stephen Hines36b56882014-04-23 16:57:46 -0700548 attachLowHighPC(TheCU, ScopeDIE, StartLabel, EndLabel);
Devang Patel26a92002011-07-27 00:34:13 +0000549 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000550
551 InlinedSubprogramDIEs.insert(OriginDIE);
552
Eric Christophere7177132013-07-03 02:23:53 +0000553 // Add the call site information to the DIE.
Devang Patel53bb5c92009-11-10 23:06:00 +0000554 DILocation DL(Scope->getInlinedAt());
Stephen Hines36b56882014-04-23 16:57:46 -0700555 TheCU->addUInt(
556 ScopeDIE, dwarf::DW_AT_call_file, None,
557 TheCU->getOrCreateSourceID(DL.getFilename(), DL.getDirectory()));
David Blaikie770530b2013-10-21 17:28:37 +0000558 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, None, DL.getLineNumber());
Devang Patel53bb5c92009-11-10 23:06:00 +0000559
Eric Christopher309bedd2011-12-04 06:02:38 +0000560 // Add name to the name table, we do this here because we're guaranteed
561 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
562 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000563
Devang Patel53bb5c92009-11-10 23:06:00 +0000564 return ScopeDIE;
565}
566
Stephen Hines36b56882014-04-23 16:57:46 -0700567DIE *DwarfDebug::createScopeChildrenDIE(DwarfCompileUnit *TheCU,
568 LexicalScope *Scope,
569 SmallVectorImpl<DIE *> &Children) {
570 DIE *ObjectPointer = NULL;
Devang Patel0478c152011-03-01 22:58:55 +0000571
572 // Collect arguments for current function.
Stephen Hines36b56882014-04-23 16:57:46 -0700573 if (LScopes.isCurrentFunctionScope(Scope)) {
574 for (DbgVariable *ArgDV : CurrentFnArguments)
575 if (ArgDV)
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000576 if (DIE *Arg =
Stephen Hines36b56882014-04-23 16:57:46 -0700577 TheCU->constructVariableDIE(*ArgDV, Scope->isAbstractScope())) {
Devang Patel0478c152011-03-01 22:58:55 +0000578 Children.push_back(Arg);
Stephen Hines36b56882014-04-23 16:57:46 -0700579 if (ArgDV->isObjectPointer())
580 ObjectPointer = Arg;
Eric Christophere5212782012-09-12 23:36:19 +0000581 }
Devang Patel0478c152011-03-01 22:58:55 +0000582
Stephen Hines36b56882014-04-23 16:57:46 -0700583 // If this is a variadic function, add an unspecified parameter.
584 DISubprogram SP(Scope->getScopeNode());
585 DIArray FnArgs = SP.getType().getTypeArray();
586 if (FnArgs.getElement(FnArgs.getNumElements() - 1)
587 .isUnspecifiedParameter()) {
588 DIE *Ellipsis = new DIE(dwarf::DW_TAG_unspecified_parameters);
589 Children.push_back(Ellipsis);
Eric Christopher7b451cf2012-09-21 22:18:52 +0000590 }
Stephen Hines36b56882014-04-23 16:57:46 -0700591 }
592
593 // Collect lexical scope children first.
594 for (DbgVariable *DV : ScopeVariables.lookup(Scope))
595 if (DIE *Variable = TheCU->constructVariableDIE(*DV,
596 Scope->isAbstractScope())) {
597 Children.push_back(Variable);
598 if (DV->isObjectPointer())
599 ObjectPointer = Variable;
600 }
601 for (LexicalScope *LS : Scope->getChildren())
602 if (DIE *Nested = constructScopeDIE(TheCU, LS))
Devang Patel5bc9fec2011-02-19 01:31:27 +0000603 Children.push_back(Nested);
Manman Renfd2210a2013-09-10 18:40:41 +0000604 return ObjectPointer;
605}
606
607// Construct a DIE for this scope.
Stephen Hines36b56882014-04-23 16:57:46 -0700608DIE *DwarfDebug::constructScopeDIE(DwarfCompileUnit *TheCU,
609 LexicalScope *Scope) {
Manman Renfd2210a2013-09-10 18:40:41 +0000610 if (!Scope || !Scope->getScopeNode())
611 return NULL;
612
613 DIScope DS(Scope->getScopeNode());
614
615 SmallVector<DIE *, 8> Children;
616 DIE *ObjectPointer = NULL;
617 bool ChildrenCreated = false;
618
Manman Ren995de6c2013-09-11 19:40:28 +0000619 // We try to create the scope DIE first, then the children DIEs. This will
620 // avoid creating un-used children then removing them later when we find out
621 // the scope DIE is null.
Devang Patel3c91b052010-03-08 20:52:55 +0000622 DIE *ScopeDIE = NULL;
623 if (Scope->getInlinedAt())
Devang Pateld3024342011-08-15 22:24:32 +0000624 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3c91b052010-03-08 20:52:55 +0000625 else if (DS.isSubprogram()) {
Devang Patel0dd45582010-06-28 20:53:04 +0000626 ProcessedSPNodes.insert(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000627 if (Scope->isAbstractScope()) {
Eric Christopher3f045002013-10-04 17:08:38 +0000628 ScopeDIE = TheCU->getDIE(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000629 // Note down abstract DIE.
630 if (ScopeDIE)
631 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
David Blaikie8da75402013-11-18 23:59:04 +0000632 } else
David Blaikie14f41e72013-11-15 23:13:08 +0000633 ScopeDIE = updateSubprogramScopeDIE(TheCU, DISubprogram(DS));
David Blaikie8da75402013-11-18 23:59:04 +0000634 } else {
Manman Ren995de6c2013-09-11 19:40:28 +0000635 // Early exit when we know the scope DIE is going to be null.
Manman Renfd2210a2013-09-10 18:40:41 +0000636 if (isLexicalScopeDIENull(Scope))
637 return NULL;
Manman Ren995de6c2013-09-11 19:40:28 +0000638
639 // We create children here when we know the scope DIE is not going to be
640 // null and the children will be added to the scope DIE.
Manman Renfd2210a2013-09-10 18:40:41 +0000641 ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children);
642 ChildrenCreated = true;
Manman Ren995de6c2013-09-11 19:40:28 +0000643
Devang Patel5bc9fec2011-02-19 01:31:27 +0000644 // There is no need to emit empty lexical block DIE.
David Blaikied2e0f7e2013-05-06 23:33:07 +0000645 std::pair<ImportedEntityMap::const_iterator,
Stephen Hines36b56882014-04-23 16:57:46 -0700646 ImportedEntityMap::const_iterator> Range =
647 std::equal_range(
648 ScopesWithImportedEntities.begin(),
649 ScopesWithImportedEntities.end(),
650 std::pair<const MDNode *, const MDNode *>(DS, (const MDNode *)0),
651 less_first());
David Blaikied2e0f7e2013-05-06 23:33:07 +0000652 if (Children.empty() && Range.first == Range.second)
Devang Patel5bc9fec2011-02-19 01:31:27 +0000653 return NULL;
Devang Pateld3024342011-08-15 22:24:32 +0000654 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Manman Renfd2210a2013-09-10 18:40:41 +0000655 assert(ScopeDIE && "Scope DIE should not be null.");
Eric Christopherfdfc81f2013-06-24 23:20:02 +0000656 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
657 ++i)
David Blaikied1221e32013-05-08 06:01:38 +0000658 constructImportedEntityDIE(TheCU, i->second, ScopeDIE);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000659 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000660
Benjamin Kramer6bee6312013-08-24 11:55:49 +0000661 if (!ScopeDIE) {
Manman Renfd2210a2013-09-10 18:40:41 +0000662 assert(Children.empty() &&
663 "We create children only when the scope DIE is not null.");
Benjamin Kramer6bee6312013-08-24 11:55:49 +0000664 return NULL;
665 }
Manman Renfd2210a2013-09-10 18:40:41 +0000666 if (!ChildrenCreated)
Manman Ren995de6c2013-09-11 19:40:28 +0000667 // We create children when the scope DIE is not null.
Manman Renfd2210a2013-09-10 18:40:41 +0000668 ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000669
Devang Patel5bc9fec2011-02-19 01:31:27 +0000670 // Add children
Stephen Hines36b56882014-04-23 16:57:46 -0700671 for (DIE *I : Children)
672 ScopeDIE->addChild(I);
Devang Patel193f7202009-11-24 01:14:22 +0000673
Eric Christophere5212782012-09-12 23:36:19 +0000674 if (DS.isSubprogram() && ObjectPointer != NULL)
Manman Ren87b110a2013-10-11 23:58:05 +0000675 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, ObjectPointer);
Eric Christophere5212782012-09-12 23:36:19 +0000676
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000677 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +0000678}
679
Stephen Hines36b56882014-04-23 16:57:46 -0700680void DwarfDebug::addGnuPubAttributes(DwarfUnit *U, DIE *D) const {
681 if (!GenerateGnuPubSections)
682 return;
Rafael Espindola5e195a42013-10-05 16:42:21 +0000683
Stephen Hines36b56882014-04-23 16:57:46 -0700684 U->addFlag(D, dwarf::DW_AT_GNU_pubnames);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000685}
686
Stephen Hines36b56882014-04-23 16:57:46 -0700687// Create new DwarfCompileUnit for the given metadata node with tag
Eric Christopher72c16552012-12-20 21:58:40 +0000688// DW_TAG_compile_unit.
Stephen Hines36b56882014-04-23 16:57:46 -0700689DwarfCompileUnit *DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) {
Devang Patel65dbc902009-11-25 17:36:49 +0000690 StringRef FN = DIUnit.getFilename();
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000691 CompilationDir = DIUnit.getDirectory();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000692
693 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Stephen Hines36b56882014-04-23 16:57:46 -0700694 DwarfCompileUnit *NewCU = new DwarfCompileUnit(
695 InfoHolder.getUnits().size(), Die, DIUnit, Asm, this, &InfoHolder);
696 InfoHolder.addUnit(NewCU);
Manman Ren3de61b42013-03-07 01:42:00 +0000697
Stephen Hines36b56882014-04-23 16:57:46 -0700698 // LTO with assembly output shares a single line table amongst multiple CUs.
699 // To avoid the compilation directory being ambiguous, let the line table
700 // explicitly describe the directory of all files, never relying on the
701 // compilation directory.
702 if (!Asm->OutStreamer.hasRawTextSupport() || SingleCU)
703 Asm->OutStreamer.getContext().setMCLineTableCompilationDir(
704 NewCU->getUniqueID(), CompilationDir);
Manman Ren3de61b42013-03-07 01:42:00 +0000705
Nick Lewycky390c40d2011-10-27 06:44:11 +0000706 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
Devang Patel3cbee302011-04-12 22:53:02 +0000707 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
708 DIUnit.getLanguage());
Nick Lewycky390c40d2011-10-27 06:44:11 +0000709 NewCU->addString(Die, dwarf::DW_AT_name, FN);
Eric Christophere0828ec2013-04-09 19:23:15 +0000710
Eric Christophere0828ec2013-04-09 19:23:15 +0000711 if (!useSplitDwarf()) {
Stephen Hines36b56882014-04-23 16:57:46 -0700712 NewCU->initStmtList(DwarfLineSectionSym);
Eric Christopher0b15e982013-09-27 22:50:48 +0000713
714 // If we're using split dwarf the compilation dir is going to be in the
715 // skeleton CU and so we don't need to duplicate it here.
716 if (!CompilationDir.empty())
717 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
718
Stephen Hines36b56882014-04-23 16:57:46 -0700719 addGnuPubAttributes(NewCU, Die);
Eric Christophere0828ec2013-04-09 19:23:15 +0000720 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000721
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000722 if (DIUnit.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +0000723 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000724
Devang Patel65dbc902009-11-25 17:36:49 +0000725 StringRef Flags = DIUnit.getFlags();
726 if (!Flags.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000727 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000728
Nick Lewyckyd5d52132011-10-17 23:27:36 +0000729 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patel3cbee302011-04-12 22:53:02 +0000730 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Stephen Hines36b56882014-04-23 16:57:46 -0700731 dwarf::DW_FORM_data1, RVer);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000732
Devang Patel163a9f72010-05-10 22:49:55 +0000733 if (!FirstCU)
734 FirstCU = NewCU;
Eric Christopher208cc6f2013-02-05 07:31:55 +0000735
Stephen Hines36b56882014-04-23 16:57:46 -0700736 if (useSplitDwarf()) {
737 NewCU->initSection(Asm->getObjFileLowering().getDwarfInfoDWOSection(),
738 DwarfInfoDWOSectionSym);
739 NewCU->setSkeleton(constructSkeletonCU(NewCU));
740 } else
741 NewCU->initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
742 DwarfInfoSectionSym);
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000743
David Blaikie942431f2013-11-15 23:52:02 +0000744 CUMap.insert(std::make_pair(DIUnit, NewCU));
Manman Ren3eabc2a2013-10-29 22:57:10 +0000745 CUDieMap.insert(std::make_pair(Die, NewCU));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000746 return NewCU;
Devang Patel163a9f72010-05-10 22:49:55 +0000747}
748
Eric Christopherb6dc8652012-11-27 22:43:45 +0000749// Construct subprogram DIE.
Stephen Hines36b56882014-04-23 16:57:46 -0700750void DwarfDebug::constructSubprogramDIE(DwarfCompileUnit *TheCU,
751 const MDNode *N) {
Eric Christopher1c165b82013-10-18 01:57:30 +0000752 // FIXME: We should only call this routine once, however, during LTO if a
753 // program is defined in multiple CUs we could end up calling it out of
754 // beginModule as we walk the CUs.
755
Stephen Hines36b56882014-04-23 16:57:46 -0700756 DwarfCompileUnit *&CURef = SPMap[N];
Eric Christopher1c165b82013-10-18 01:57:30 +0000757 if (CURef)
758 return;
759 CURef = TheCU;
Rafael Espindolab0527282011-11-04 19:00:29 +0000760
Devang Patele4b27562009-08-28 23:24:31 +0000761 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000762 if (!SP.isDefinition())
763 // This is a method declaration which will be handled while constructing
764 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +0000765 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000766
Devang Pateldbc64af2011-08-15 17:24:54 +0000767 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings639336e2010-04-06 21:38:29 +0000768
Eric Christopher28b020d2013-09-09 20:03:20 +0000769 // Expose as a global name.
Eric Christopher91986572013-10-17 02:06:06 +0000770 TheCU->addGlobalName(SP.getName(), SubprogramDie, resolve(SP.getContext()));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000771}
772
Stephen Hines36b56882014-04-23 16:57:46 -0700773void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit *TheCU,
David Blaikiec462db62013-04-22 06:12:31 +0000774 const MDNode *N) {
David Blaikie20d9e412013-05-07 21:35:53 +0000775 DIImportedEntity Module(N);
Stephen Hines36b56882014-04-23 16:57:46 -0700776 assert(Module.Verify());
David Blaikied2e0f7e2013-05-06 23:33:07 +0000777 if (DIE *D = TheCU->getOrCreateContextDIE(Module.getContext()))
David Blaikied1221e32013-05-08 06:01:38 +0000778 constructImportedEntityDIE(TheCU, Module, D);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000779}
780
Stephen Hines36b56882014-04-23 16:57:46 -0700781void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit *TheCU,
782 const MDNode *N, DIE *Context) {
David Blaikie20d9e412013-05-07 21:35:53 +0000783 DIImportedEntity Module(N);
Stephen Hines36b56882014-04-23 16:57:46 -0700784 assert(Module.Verify());
David Blaikied1221e32013-05-08 06:01:38 +0000785 return constructImportedEntityDIE(TheCU, Module, Context);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000786}
787
Stephen Hines36b56882014-04-23 16:57:46 -0700788void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit *TheCU,
David Blaikie20d9e412013-05-07 21:35:53 +0000789 const DIImportedEntity &Module,
David Blaikied2e0f7e2013-05-06 23:33:07 +0000790 DIE *Context) {
791 assert(Module.Verify() &&
792 "Use one of the MDNode * overloads to handle invalid metadata");
793 assert(Context && "Should always have a context for an imported_module");
David Blaikie20d9e412013-05-07 21:35:53 +0000794 DIE *IMDie = new DIE(Module.getTag());
David Blaikiec462db62013-04-22 06:12:31 +0000795 TheCU->insertDIE(Module, IMDie);
David Blaikie20d9e412013-05-07 21:35:53 +0000796 DIE *EntityDie;
Stephen Hines36b56882014-04-23 16:57:46 -0700797 DIDescriptor Entity = resolve(Module.getEntity());
David Blaikie20d9e412013-05-07 21:35:53 +0000798 if (Entity.isNameSpace())
799 EntityDie = TheCU->getOrCreateNameSpace(DINameSpace(Entity));
800 else if (Entity.isSubprogram())
801 EntityDie = TheCU->getOrCreateSubprogramDIE(DISubprogram(Entity));
David Blaikieaa76a932013-05-08 06:01:41 +0000802 else if (Entity.isType())
803 EntityDie = TheCU->getOrCreateTypeDIE(DIType(Entity));
David Blaikie20d9e412013-05-07 21:35:53 +0000804 else
David Blaikieaa76a932013-05-08 06:01:41 +0000805 EntityDie = TheCU->getDIE(Entity);
Stephen Hines36b56882014-04-23 16:57:46 -0700806 TheCU->addSourceLine(IMDie, Module.getLineNumber(),
807 Module.getContext().getFilename(),
808 Module.getContext().getDirectory());
Manman Ren87b110a2013-10-11 23:58:05 +0000809 TheCU->addDIEEntry(IMDie, dwarf::DW_AT_import, EntityDie);
David Blaikie7b72cc72013-05-20 22:50:35 +0000810 StringRef Name = Module.getName();
811 if (!Name.empty())
812 TheCU->addString(IMDie, dwarf::DW_AT_name, Name);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000813 Context->addChild(IMDie);
David Blaikiec462db62013-04-22 06:12:31 +0000814}
815
Eric Christopherb6dc8652012-11-27 22:43:45 +0000816// Emit all Dwarf sections that should come prior to the content. Create
817// global DIEs and emit initial debug info sections. This is invoked by
818// the target AsmPrinter.
Eric Christopherc4639d62012-11-19 22:42:15 +0000819void DwarfDebug::beginModule() {
Devang Pateleac9c072010-04-27 19:46:33 +0000820 if (DisableDebugInfoPrinting)
821 return;
822
Eric Christopherc4639d62012-11-19 22:42:15 +0000823 const Module *M = MMI->getModule();
824
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000825 // If module has named metadata anchors then use them, otherwise scan the
826 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +0000827 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiec0ec8a42013-03-11 23:39:23 +0000828 if (!CU_Nodes)
Devang Patel02e603f2011-08-15 23:47:24 +0000829 return;
Manman Renbc660712013-09-05 18:48:31 +0000830 TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
Devang Patel30692ab2011-05-03 16:45:22 +0000831
David Blaikiec0ec8a42013-03-11 23:39:23 +0000832 // Emit initial sections so we can reference labels later.
833 emitSectionLabels();
834
Stephen Hines36b56882014-04-23 16:57:46 -0700835 SingleCU = CU_Nodes->getNumOperands() == 1;
836
837 for (MDNode *N : CU_Nodes->operands()) {
838 DICompileUnit CUNode(N);
839 DwarfCompileUnit *CU = constructDwarfCompileUnit(CUNode);
David Blaikie20d9e412013-05-07 21:35:53 +0000840 DIArray ImportedEntities = CUNode.getImportedEntities();
841 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikied2e0f7e2013-05-06 23:33:07 +0000842 ScopesWithImportedEntities.push_back(std::make_pair(
David Blaikie20d9e412013-05-07 21:35:53 +0000843 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
844 ImportedEntities.getElement(i)));
David Blaikied2e0f7e2013-05-06 23:33:07 +0000845 std::sort(ScopesWithImportedEntities.begin(),
Benjamin Kramer0b6962f2013-08-24 12:54:27 +0000846 ScopesWithImportedEntities.end(), less_first());
David Blaikiec0ec8a42013-03-11 23:39:23 +0000847 DIArray GVs = CUNode.getGlobalVariables();
848 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
David Blaikie08e51e12013-11-17 21:55:13 +0000849 CU->createGlobalVariableDIE(DIGlobalVariable(GVs.getElement(i)));
David Blaikiec0ec8a42013-03-11 23:39:23 +0000850 DIArray SPs = CUNode.getSubprograms();
851 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
852 constructSubprogramDIE(CU, SPs.getElement(i));
853 DIArray EnumTypes = CUNode.getEnumTypes();
854 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
855 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
856 DIArray RetainedTypes = CUNode.getRetainedTypes();
Stephen Hines36b56882014-04-23 16:57:46 -0700857 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i) {
858 DIType Ty(RetainedTypes.getElement(i));
859 // The retained types array by design contains pointers to
860 // MDNodes rather than DIRefs. Unique them here.
861 DIType UniqueTy(resolve(Ty.getRef()));
862 CU->getOrCreateTypeDIE(UniqueTy);
863 }
David Blaikiec462db62013-04-22 06:12:31 +0000864 // Emit imported_modules last so that the relevant context is already
865 // available.
David Blaikie20d9e412013-05-07 21:35:53 +0000866 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
867 constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
David Blaikiec0ec8a42013-03-11 23:39:23 +0000868 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000869
Chris Lattnerd850ac72010-04-05 02:19:28 +0000870 // Tell MMI that we have debug info.
871 MMI->setDebugInfoAvailability(true);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000872
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000873 // Prime section data.
Richard Mitton5cc319a2013-09-19 23:21:01 +0000874 SectionMap[Asm->getObjFileLowering().getTextSection()];
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000875}
876
Eric Christopher4117bec2012-11-22 00:59:49 +0000877// Attach DW_AT_inline attribute with inlined subprogram DIEs.
878void DwarfDebug::computeInlinedDIEs() {
Devang Patel53bb5c92009-11-10 23:06:00 +0000879 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
Stephen Hines36b56882014-04-23 16:57:46 -0700880 for (DIE *ISP : InlinedSubprogramDIEs)
David Blaikie770530b2013-10-21 17:28:37 +0000881 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
Stephen Hines36b56882014-04-23 16:57:46 -0700882
883 for (const auto &AI : AbstractSPDies) {
884 DIE *ISP = AI.second;
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000885 if (InlinedSubprogramDIEs.count(ISP))
886 continue;
David Blaikie770530b2013-10-21 17:28:37 +0000887 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000888 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000889}
890
891// Collect info for variables that were optimized out.
892void DwarfDebug::collectDeadVariables() {
893 const Module *M = MMI->getModule();
Eric Christopher4117bec2012-11-22 00:59:49 +0000894
895 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
Stephen Hines36b56882014-04-23 16:57:46 -0700896 for (MDNode *N : CU_Nodes->operands()) {
897 DICompileUnit TheCU(N);
Eric Christopher4117bec2012-11-22 00:59:49 +0000898 DIArray Subprograms = TheCU.getSubprograms();
899 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopherbdab8002012-11-27 00:13:51 +0000900 DISubprogram SP(Subprograms.getElement(i));
Eric Christopherc6228242013-10-15 23:31:38 +0000901 if (ProcessedSPNodes.count(SP) != 0)
902 continue;
903 if (!SP.isSubprogram())
904 continue;
905 if (!SP.isDefinition())
906 continue;
Eric Christopherbdab8002012-11-27 00:13:51 +0000907 DIArray Variables = SP.getVariables();
Eric Christopherc6228242013-10-15 23:31:38 +0000908 if (Variables.getNumElements() == 0)
909 continue;
Eric Christopher4117bec2012-11-22 00:59:49 +0000910
Eric Christopherbdab8002012-11-27 00:13:51 +0000911 // Construct subprogram DIE and add variables DIEs.
Stephen Hines36b56882014-04-23 16:57:46 -0700912 DwarfCompileUnit *SPCU =
913 static_cast<DwarfCompileUnit *>(CUMap.lookup(TheCU));
Eric Christopherbdab8002012-11-27 00:13:51 +0000914 assert(SPCU && "Unable to find Compile Unit!");
Eric Christopher8348b7d2013-10-22 00:22:39 +0000915 // FIXME: See the comment in constructSubprogramDIE about duplicate
916 // subprogram DIEs.
917 constructSubprogramDIE(SPCU, SP);
918 DIE *SPDIE = SPCU->getDIE(SP);
Eric Christopherbdab8002012-11-27 00:13:51 +0000919 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
920 DIVariable DV(Variables.getElement(vi));
Eric Christopherc6228242013-10-15 23:31:38 +0000921 if (!DV.isVariable())
922 continue;
Manman Renc664d762013-10-05 01:43:03 +0000923 DbgVariable NewVar(DV, NULL, this);
Stephen Hines36b56882014-04-23 16:57:46 -0700924 if (DIE *VariableDIE = SPCU->constructVariableDIE(NewVar, false))
Eric Christopherc6228242013-10-15 23:31:38 +0000925 SPDIE->addChild(VariableDIE);
Eric Christopherbdab8002012-11-27 00:13:51 +0000926 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000927 }
928 }
929 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000930}
931
932void DwarfDebug::finalizeModuleInfo() {
933 // Collect info for variables that were optimized out.
934 collectDeadVariables();
935
936 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
937 computeInlinedDIEs();
Devang Patel53bb5c92009-11-10 23:06:00 +0000938
Stephen Hines36b56882014-04-23 16:57:46 -0700939 // Handle anything that needs to be done on a per-unit basis after
940 // all other generation.
941 for (DwarfUnit *TheU : getUnits()) {
Eric Christopherf962c022013-08-12 20:27:48 +0000942 // Emit DW_AT_containing_type attribute to connect types with their
943 // vtable holding type.
Stephen Hines36b56882014-04-23 16:57:46 -0700944 TheU->constructContainingTypeDIEs();
Eric Christopherf962c022013-08-12 20:27:48 +0000945
Stephen Hines36b56882014-04-23 16:57:46 -0700946 // Add CU specific attributes if we need to add any.
947 if (TheU->getUnitDie()->getTag() == dwarf::DW_TAG_compile_unit) {
948 // If we're splitting the dwarf out now that we've got the entire
949 // CU then add the dwo id to it.
950 DwarfCompileUnit *SkCU =
951 static_cast<DwarfCompileUnit *>(TheU->getSkeleton());
952 if (useSplitDwarf()) {
953 // Emit a unique identifier for this CU.
954 uint64_t ID = DIEHash(Asm).computeCUSignature(*TheU->getUnitDie());
955 TheU->addUInt(TheU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
956 dwarf::DW_FORM_data8, ID);
957 SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
958 dwarf::DW_FORM_data8, ID);
959
960 // We don't keep track of which addresses are used in which CU so this
961 // is a bit pessimistic under LTO.
962 if (!InfoHolder.getAddrPool()->empty())
963 addSectionLabel(Asm, SkCU, SkCU->getUnitDie(),
964 dwarf::DW_AT_GNU_addr_base, DwarfAddrSectionSym,
965 DwarfAddrSectionSym);
966 if (!TheU->getRangeLists().empty())
967 addSectionLabel(Asm, SkCU, SkCU->getUnitDie(),
968 dwarf::DW_AT_GNU_ranges_base,
969 DwarfDebugRangeSectionSym, DwarfDebugRangeSectionSym);
Eric Christopher0710bfa2013-08-13 01:21:55 +0000970 }
Stephen Hines36b56882014-04-23 16:57:46 -0700971
972 // If we have code split among multiple sections or non-contiguous
973 // ranges of code then emit a DW_AT_ranges attribute on the unit that will
974 // remain in the .o file, otherwise add a DW_AT_low_pc.
975 // FIXME: We should use ranges allow reordering of code ala
976 // .subsections_via_symbols in mach-o. This would mean turning on
977 // ranges for all subprogram DIEs for mach-o.
978 DwarfCompileUnit *U = SkCU ? SkCU : static_cast<DwarfCompileUnit *>(TheU);
979 unsigned NumRanges = TheU->getRanges().size();
980 if (NumRanges) {
981 if (NumRanges > 1) {
982 addSectionLabel(Asm, U, U->getUnitDie(), dwarf::DW_AT_ranges,
983 Asm->GetTempSymbol("cu_ranges", U->getUniqueID()),
984 DwarfDebugRangeSectionSym);
985
986 // A DW_AT_low_pc attribute may also be specified in combination with
987 // DW_AT_ranges to specify the default base address for use in
988 // location lists (see Section 2.6.2) and range lists (see Section
989 // 2.17.3).
990 U->addUInt(U->getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
991 0);
992 } else {
993 RangeSpan &Range = TheU->getRanges().back();
994 U->addLocalLabelAddress(U->getUnitDie(), dwarf::DW_AT_low_pc,
995 Range.getStart());
996 U->addLabelDelta(U->getUnitDie(), dwarf::DW_AT_high_pc,
997 Range.getEnd(), Range.getStart());
998 }
999 }
Eric Christopherf962c022013-08-12 20:27:48 +00001000 }
1001 }
1002
1003 // Compute DIE offsets and sizes.
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001004 InfoHolder.computeSizeAndOffsets();
1005 if (useSplitDwarf())
1006 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher4117bec2012-11-22 00:59:49 +00001007}
1008
1009void DwarfDebug::endSections() {
Stephen Hines36b56882014-04-23 16:57:46 -07001010 // Filter labels by section.
1011 for (const SymbolCU &SCU : ArangeLabels) {
Richard Mitton5cc319a2013-09-19 23:21:01 +00001012 if (SCU.Sym->isInSection()) {
1013 // Make a note of this symbol and it's section.
1014 const MCSection *Section = &SCU.Sym->getSection();
1015 if (!Section->getKind().isMetadata())
1016 SectionMap[Section].push_back(SCU);
1017 } else {
1018 // Some symbols (e.g. common/bss on mach-o) can have no section but still
1019 // appear in the output. This sucks as we rely on sections to build
1020 // arange spans. We can do it without, but it's icky.
1021 SectionMap[NULL].push_back(SCU);
1022 }
1023 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001024
Richard Mitton7c9659a2013-10-03 22:07:08 +00001025 // Build a list of sections used.
1026 std::vector<const MCSection *> Sections;
Stephen Hines36b56882014-04-23 16:57:46 -07001027 for (const auto &it : SectionMap) {
1028 const MCSection *Section = it.first;
Richard Mitton7c9659a2013-10-03 22:07:08 +00001029 Sections.push_back(Section);
1030 }
1031
1032 // Sort the sections into order.
1033 // This is only done to ensure consistent output order across different runs.
1034 std::sort(Sections.begin(), Sections.end(), SectionSort);
1035
1036 // Add terminating symbols for each section.
Stephen Hines36b56882014-04-23 16:57:46 -07001037 for (unsigned ID = 0, E = Sections.size(); ID != E; ID++) {
Richard Mitton7c9659a2013-10-03 22:07:08 +00001038 const MCSection *Section = Sections[ID];
Richard Mitton5cc319a2013-09-19 23:21:01 +00001039 MCSymbol *Sym = NULL;
1040
1041 if (Section) {
Richard Mitton7c9659a2013-10-03 22:07:08 +00001042 // We can't call MCSection::getLabelEndName, as it's only safe to do so
Stephen Hines36b56882014-04-23 16:57:46 -07001043 // if we know the section name up-front. For user-created sections, the
1044 // resulting label may not be valid to use as a label. (section names can
1045 // use a greater set of characters on some systems)
Richard Mitton7c9659a2013-10-03 22:07:08 +00001046 Sym = Asm->GetTempSymbol("debug_end", ID);
Richard Mitton5cc319a2013-09-19 23:21:01 +00001047 Asm->OutStreamer.SwitchSection(Section);
1048 Asm->OutStreamer.EmitLabel(Sym);
1049 }
1050
1051 // Insert a final terminator.
Alexey Samsonov9d08d692013-10-03 08:54:43 +00001052 SectionMap[Section].push_back(SymbolCU(NULL, Sym));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001053 }
Eric Christopher4117bec2012-11-22 00:59:49 +00001054}
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001055
Eric Christopherb6dc8652012-11-27 22:43:45 +00001056// Emit all Dwarf sections that should come after the content.
Eric Christopher4117bec2012-11-22 00:59:49 +00001057void DwarfDebug::endModule() {
Stephen Hines36b56882014-04-23 16:57:46 -07001058 assert(CurFn == 0);
1059 assert(CurMI == 0);
Eric Christopher4117bec2012-11-22 00:59:49 +00001060
Stephen Hines36b56882014-04-23 16:57:46 -07001061 if (!FirstCU)
1062 return;
Eric Christopher4117bec2012-11-22 00:59:49 +00001063
1064 // End any existing sections.
1065 // TODO: Does this need to happen?
1066 endSections();
1067
1068 // Finalize the debug info for the module.
1069 finalizeModuleInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001070
Stephen Hines36b56882014-04-23 16:57:46 -07001071 emitDebugStr();
Eric Christopher9e0b08d2013-09-20 23:22:52 +00001072
Stephen Hines36b56882014-04-23 16:57:46 -07001073 // Emit all the DIEs into a debug info section.
1074 emitDebugInfo();
Eric Christopher74802f72012-11-27 00:41:54 +00001075
Stephen Hines36b56882014-04-23 16:57:46 -07001076 // Corresponding abbreviations into a abbrev section.
1077 emitAbbreviations();
Eric Christopher42885022012-11-27 22:43:42 +00001078
Stephen Hines36b56882014-04-23 16:57:46 -07001079 // Emit info into a debug aranges section.
1080 if (GenerateARangeSection)
Eric Christopher42885022012-11-27 22:43:42 +00001081 emitDebugARanges();
1082
Stephen Hines36b56882014-04-23 16:57:46 -07001083 // Emit info into a debug ranges section.
1084 emitDebugRanges();
Eric Christopher42885022012-11-27 22:43:42 +00001085
Stephen Hines36b56882014-04-23 16:57:46 -07001086 if (useSplitDwarf()) {
1087 emitDebugStrDWO();
Eric Christopher98e237f2012-11-30 23:59:06 +00001088 emitDebugInfoDWO();
Eric Christopher6eebe472012-12-19 22:02:53 +00001089 emitDebugAbbrevDWO();
Stephen Hines36b56882014-04-23 16:57:46 -07001090 emitDebugLineDWO();
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001091 // Emit DWO addresses.
1092 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
Stephen Hines36b56882014-04-23 16:57:46 -07001093 emitDebugLocDWO();
1094 } else
1095 // Emit info into a debug loc section.
1096 emitDebugLoc();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001097
Eric Christopher9d9f5a52012-08-23 07:32:06 +00001098 // Emit info into the dwarf accelerator table sections.
Eric Christopher20f47ab2012-08-23 22:36:40 +00001099 if (useDwarfAccelTables()) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001100 emitAccelNames();
1101 emitAccelObjC();
1102 emitAccelNamespaces();
1103 emitAccelTypes();
1104 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001105
Eric Christopher26123542013-08-30 00:40:17 +00001106 // Emit the pubnames and pubtypes sections if requested.
1107 if (HasDwarfPubSections) {
David Blaikiee56a4d92013-09-19 17:33:35 +00001108 emitDebugPubNames(GenerateGnuPubSections);
1109 emitDebugPubTypes(GenerateGnuPubSections);
Eric Christopher26123542013-08-30 00:40:17 +00001110 }
Devang Patel193f7202009-11-24 01:14:22 +00001111
Devang Patele9a1cca2010-08-02 17:32:15 +00001112 // clean up.
Devang Patel94c7ddb2011-08-16 22:09:43 +00001113 SPMap.clear();
Eric Christopher9ec87b32012-12-10 19:51:18 +00001114
Eric Christopher98e237f2012-11-30 23:59:06 +00001115 // Reset these for the next Module if we have one.
1116 FirstCU = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001117}
1118
Eric Christopherb6dc8652012-11-27 22:43:45 +00001119// Find abstract variable, if any, associated with Var.
Devang Patelb549bcf2011-08-10 21:50:54 +00001120DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattnerde4845c2010-04-02 19:42:39 +00001121 DebugLoc ScopeLoc) {
Devang Patelb549bcf2011-08-10 21:50:54 +00001122 LLVMContext &Ctx = DV->getContext();
1123 // More then one inlined variable corresponds to one abstract variable.
1124 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patel2db49d72010-05-07 18:11:54 +00001125 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00001126 if (AbsDbgVariable)
1127 return AbsDbgVariable;
1128
Devang Patelbf47fdb2011-08-10 20:55:27 +00001129 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00001130 if (!Scope)
1131 return NULL;
1132
Manman Renc664d762013-10-05 01:43:03 +00001133 AbsDbgVariable = new DbgVariable(Var, NULL, this);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001134 addScopeVariable(Scope, AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00001135 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00001136 return AbsDbgVariable;
1137}
1138
Eric Christopherb6dc8652012-11-27 22:43:45 +00001139// If Var is a current function argument then add it to CurrentFnArguments list.
Stephen Hines36b56882014-04-23 16:57:46 -07001140bool DwarfDebug::addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001141 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +00001142 return false;
1143 DIVariable DV = Var->getVariable();
1144 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1145 return false;
1146 unsigned ArgNo = DV.getArgNumber();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001147 if (ArgNo == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001148 return false;
1149
Devang Patelcb3a6572011-03-03 20:02:02 +00001150 size_t Size = CurrentFnArguments.size();
1151 if (Size == 0)
Stephen Hines36b56882014-04-23 16:57:46 -07001152 CurrentFnArguments.resize(CurFn->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00001153 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00001154 // arguments does the function have at source level.
1155 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00001156 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00001157 CurrentFnArguments[ArgNo - 1] = Var;
1158 return true;
1159}
1160
Eric Christopherb6dc8652012-11-27 22:43:45 +00001161// Collect variable information from side table maintained by MMI.
Stephen Hines36b56882014-04-23 16:57:46 -07001162void DwarfDebug::collectVariableInfoFromMMITable(
1163 SmallPtrSet<const MDNode *, 16> &Processed) {
1164 for (const auto &VI : MMI->getVariableDbgInfo()) {
1165 if (!VI.Var)
1166 continue;
1167 Processed.insert(VI.Var);
1168 DIVariable DV(VI.Var);
1169 LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001170
Devang Patelfb0ee432009-11-10 23:20:04 +00001171 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00001172 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00001173 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001174
Stephen Hines36b56882014-04-23 16:57:46 -07001175 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VI.Loc);
Manman Renc664d762013-10-05 01:43:03 +00001176 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable, this);
Stephen Hines36b56882014-04-23 16:57:46 -07001177 RegVar->setFrameIndex(VI.Slot);
1178 if (!addCurrentFnArgument(RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001179 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001180 if (AbsDbgVariable)
Stephen Hines36b56882014-04-23 16:57:46 -07001181 AbsDbgVariable->setFrameIndex(VI.Slot);
Devang Patele717faa2009-10-06 01:26:37 +00001182 }
Devang Patelee432862010-05-20 19:57:06 +00001183}
Devang Patel90a48ad2010-03-15 18:33:46 +00001184
Eric Christopherb6dc8652012-11-27 22:43:45 +00001185// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1186// defined reg.
Devang Patelc3f5f782010-05-25 23:40:22 +00001187static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001188 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Stephen Hines36b56882014-04-23 16:57:46 -07001189 return MI->getNumOperands() == 3 && MI->getOperand(0).isReg() &&
1190 MI->getOperand(0).getReg() &&
Adrian Prantl35176402013-07-09 20:28:37 +00001191 (MI->getOperand(1).isImm() ||
1192 (MI->getOperand(1).isReg() && MI->getOperand(1).getReg() == 0U));
Devang Patelc3f5f782010-05-25 23:40:22 +00001193}
1194
Eric Christopherb6dc8652012-11-27 22:43:45 +00001195// Get .debug_loc entry for the instruction range starting at MI.
Stephen Hines36b56882014-04-23 16:57:46 -07001196static DebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1197 const MCSymbol *FLabel,
1198 const MCSymbol *SLabel,
1199 const MachineInstr *MI,
1200 DwarfCompileUnit *Unit) {
1201 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Devang Patel90b40412011-07-08 17:09:57 +00001202
David Blaikie6d9dbd52013-06-16 20:34:15 +00001203 assert(MI->getNumOperands() == 3);
Adrian Prantl35176402013-07-09 20:28:37 +00001204 if (MI->getOperand(0).isReg()) {
Devang Patel90b40412011-07-08 17:09:57 +00001205 MachineLocation MLoc;
Adrian Prantl35176402013-07-09 20:28:37 +00001206 // If the second operand is an immediate, this is a
1207 // register-indirect address.
1208 if (!MI->getOperand(1).isImm())
Adrian Prantl13131e62013-04-26 21:57:17 +00001209 MLoc.set(MI->getOperand(0).getReg());
1210 else
1211 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Stephen Hines36b56882014-04-23 16:57:46 -07001212 return DebugLocEntry(FLabel, SLabel, MLoc, Var, Unit);
Devang Patel90b40412011-07-08 17:09:57 +00001213 }
1214 if (MI->getOperand(0).isImm())
Stephen Hines36b56882014-04-23 16:57:46 -07001215 return DebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm(), Unit);
Devang Patel90b40412011-07-08 17:09:57 +00001216 if (MI->getOperand(0).isFPImm())
Stephen Hines36b56882014-04-23 16:57:46 -07001217 return DebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm(), Unit);
Devang Patel90b40412011-07-08 17:09:57 +00001218 if (MI->getOperand(0).isCImm())
Stephen Hines36b56882014-04-23 16:57:46 -07001219 return DebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm(), Unit);
Devang Patel90b40412011-07-08 17:09:57 +00001220
Craig Topper5e25ee82012-02-05 08:31:47 +00001221 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel90b40412011-07-08 17:09:57 +00001222}
1223
Eric Christopherb6dc8652012-11-27 22:43:45 +00001224// Find variables for each lexical scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001225void
Stephen Hines36b56882014-04-23 16:57:46 -07001226DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001227
Eric Christopher4e976452013-07-03 21:37:03 +00001228 // Grab the variable info that was squirreled away in the MMI side-table.
Stephen Hines36b56882014-04-23 16:57:46 -07001229 collectVariableInfoFromMMITable(Processed);
Devang Patelee432862010-05-20 19:57:06 +00001230
Stephen Hines36b56882014-04-23 16:57:46 -07001231 for (const MDNode *Var : UserVariables) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001232 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00001233 continue;
1234
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001235 // History contains relevant DBG_VALUE instructions for Var and instructions
1236 // clobbering it.
Stephen Hines36b56882014-04-23 16:57:46 -07001237 SmallVectorImpl<const MachineInstr *> &History = DbgValues[Var];
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001238 if (History.empty())
1239 continue;
1240 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00001241
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001242 DIVariable DV(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001243 LexicalScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00001244 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
Stephen Hines36b56882014-04-23 16:57:46 -07001245 DISubprogram(DV.getContext()).describes(CurFn->getFunction()))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001246 Scope = LScopes.getCurrentFunctionScope();
David Blaikiec0ec8a42013-03-11 23:39:23 +00001247 else if (MDNode *IA = DV.getInlinedAt())
1248 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1249 else
1250 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patelee432862010-05-20 19:57:06 +00001251 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00001252 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001253 continue;
1254
1255 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001256 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel5a1a67c2011-08-15 19:01:20 +00001257 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
Manman Renc664d762013-10-05 01:43:03 +00001258 DbgVariable *RegVar = new DbgVariable(DV, AbsVar, this);
Stephen Hines36b56882014-04-23 16:57:46 -07001259 if (!addCurrentFnArgument(RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001260 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001261 if (AbsVar)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001262 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001263
Eric Christopherc56e3f02012-10-08 20:48:54 +00001264 // Simplify ranges that are fully coalesced.
Stephen Hines36b56882014-04-23 16:57:46 -07001265 if (History.size() <= 1 ||
1266 (History.size() == 2 && MInsn->isIdenticalTo(History.back()))) {
Devang Patelff9dd0a2011-08-15 21:24:36 +00001267 RegVar->setMInsn(MInsn);
Devang Patelc3f5f782010-05-25 23:40:22 +00001268 continue;
1269 }
1270
Eric Christopher498703b2013-01-28 17:33:26 +00001271 // Handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001272 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001273
Stephen Hines36b56882014-04-23 16:57:46 -07001274 DotDebugLocEntries.resize(DotDebugLocEntries.size() + 1);
1275 DebugLocList &LocList = DotDebugLocEntries.back();
1276 LocList.Label =
1277 Asm->GetTempSymbol("debug_loc", DotDebugLocEntries.size() - 1);
1278 SmallVector<DebugLocEntry, 4> &DebugLoc = LocList.List;
1279 for (SmallVectorImpl<const MachineInstr *>::const_iterator
1280 HI = History.begin(),
1281 HE = History.end();
1282 HI != HE; ++HI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001283 const MachineInstr *Begin = *HI;
1284 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001285
Devang Patel4ada1d72011-06-01 23:00:17 +00001286 // Check if DBG_VALUE is truncating a range.
Stephen Hines36b56882014-04-23 16:57:46 -07001287 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg() &&
1288 !Begin->getOperand(0).getReg())
Devang Patel4ada1d72011-06-01 23:00:17 +00001289 continue;
1290
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001291 // Compute the range for a register location.
1292 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1293 const MCSymbol *SLabel = 0;
1294
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001295 if (HI + 1 == HE)
1296 // If Begin is the last instruction in History then its value is valid
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001297 // until the end of the function.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001298 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001299 else {
1300 const MachineInstr *End = HI[1];
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001301 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Stephen Hines36b56882014-04-23 16:57:46 -07001302 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001303 if (End->isDebugValue())
1304 SLabel = getLabelBeforeInsn(End);
1305 else {
1306 // End is a normal instruction clobbering the range.
1307 SLabel = getLabelAfterInsn(End);
1308 assert(SLabel && "Forgot label after clobber instruction");
1309 ++HI;
1310 }
1311 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001312
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001313 // The value is valid until the next DBG_VALUE or clobber.
Stephen Hines36b56882014-04-23 16:57:46 -07001314 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1315 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1316 DebugLocEntry Loc = getDebugLocEntry(Asm, FLabel, SLabel, Begin, TheCU);
1317 if (DebugLoc.empty() || !DebugLoc.back().Merge(Loc))
1318 DebugLoc.push_back(std::move(Loc));
Devang Patelc3f5f782010-05-25 23:40:22 +00001319 }
Devang Patel90a48ad2010-03-15 18:33:46 +00001320 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001321
1322 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001323 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1324 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1325 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1326 DIVariable DV(Variables.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +00001327 if (!DV || !DV.isVariable() || !Processed.insert(DV))
Devang Patel93d39be2011-08-19 23:28:12 +00001328 continue;
1329 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
Manman Renc664d762013-10-05 01:43:03 +00001330 addScopeVariable(Scope, new DbgVariable(DV, NULL, this));
Devang Patel98e1cac2010-05-14 21:01:35 +00001331 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001332}
Devang Patel98e1cac2010-05-14 21:01:35 +00001333
Eric Christopherb6dc8652012-11-27 22:43:45 +00001334// Return Label preceding the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001335MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001336 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1337 assert(Label && "Didn't insert label before instruction");
1338 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001339}
1340
Eric Christopherb6dc8652012-11-27 22:43:45 +00001341// Return Label immediately following the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001342MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001343 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001344}
1345
Eric Christopherb6dc8652012-11-27 22:43:45 +00001346// Process beginning of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001347void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Stephen Hines36b56882014-04-23 16:57:46 -07001348 assert(CurMI == 0);
1349 CurMI = MI;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001350 // Check if source location changes, but ignore DBG_VALUE locations.
1351 if (!MI->isDebugValue()) {
1352 DebugLoc DL = MI->getDebugLoc();
1353 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopher60b35f42012-04-05 20:39:05 +00001354 unsigned Flags = 0;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001355 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001356 if (DL == PrologEndLoc) {
1357 Flags |= DWARF2_FLAG_PROLOGUE_END;
1358 PrologEndLoc = DebugLoc();
1359 }
Eric Christopher60b35f42012-04-05 20:39:05 +00001360 if (PrologEndLoc.isUnknown())
1361 Flags |= DWARF2_FLAG_IS_STMT;
1362
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001363 if (!DL.isUnknown()) {
1364 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001365 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001366 } else
Devang Patel4243e672011-05-11 19:22:19 +00001367 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001368 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001369 }
Devang Patelaead63c2010-03-29 22:59:58 +00001370
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001371 // Insert labels where requested.
Stephen Hines36b56882014-04-23 16:57:46 -07001372 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
1373 LabelsBeforeInsn.find(MI);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001374
1375 // No label needed.
1376 if (I == LabelsBeforeInsn.end())
1377 return;
1378
1379 // Label already assigned.
1380 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001381 return;
Devang Patel553881b2010-03-29 17:20:31 +00001382
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001383 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001384 PrevLabel = MMI->getContext().CreateTempSymbol();
1385 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001386 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001387 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001388}
1389
Eric Christopherb6dc8652012-11-27 22:43:45 +00001390// Process end of an instruction.
Stephen Hines36b56882014-04-23 16:57:46 -07001391void DwarfDebug::endInstruction() {
1392 assert(CurMI != 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001393 // Don't create a new label after DBG_VALUE instructions.
1394 // They don't generate code.
Stephen Hines36b56882014-04-23 16:57:46 -07001395 if (!CurMI->isDebugValue())
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001396 PrevLabel = 0;
1397
Stephen Hines36b56882014-04-23 16:57:46 -07001398 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
1399 LabelsAfterInsn.find(CurMI);
1400 CurMI = 0;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001401
1402 // No label needed.
1403 if (I == LabelsAfterInsn.end())
1404 return;
1405
1406 // Label already assigned.
1407 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001408 return;
1409
1410 // We need a label after this instruction.
1411 if (!PrevLabel) {
1412 PrevLabel = MMI->getContext().CreateTempSymbol();
1413 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001414 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001415 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001416}
1417
Eric Christopherb6dc8652012-11-27 22:43:45 +00001418// Each LexicalScope has first instruction and last instruction to mark
1419// beginning and end of a scope respectively. Create an inverse map that list
1420// scopes starts (and ends) with an instruction. One instruction may start (or
1421// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001422void DwarfDebug::identifyScopeMarkers() {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001423 SmallVector<LexicalScope *, 4> WorkList;
1424 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel42aafd72010-01-20 02:05:23 +00001425 while (!WorkList.empty()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001426 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001427
Craig Topper9f43ac62013-07-03 04:24:43 +00001428 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001429 if (!Children.empty())
Stephen Hines36b56882014-04-23 16:57:46 -07001430 WorkList.append(Children.begin(), Children.end());
Devang Patel42aafd72010-01-20 02:05:23 +00001431
Devang Patel53bb5c92009-11-10 23:06:00 +00001432 if (S->isAbstractScope())
1433 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001434
Stephen Hines36b56882014-04-23 16:57:46 -07001435 for (const InsnRange &R : S->getRanges()) {
1436 assert(R.first && "InsnRange does not have first instruction!");
1437 assert(R.second && "InsnRange does not have second instruction!");
1438 requestLabelBeforeInsn(R.first);
1439 requestLabelAfterInsn(R.second);
Devang Pateleac9c072010-04-27 19:46:33 +00001440 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001441 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001442}
1443
Eric Christopherb6dc8652012-11-27 22:43:45 +00001444// Gather pre-function debug information. Assumes being called immediately
1445// after the function entry point has been emitted.
Chris Lattnereec791a2010-01-26 23:18:02 +00001446void DwarfDebug::beginFunction(const MachineFunction *MF) {
Stephen Hines36b56882014-04-23 16:57:46 -07001447 CurFn = MF;
Eric Christopher31ed50c2013-11-01 23:14:17 +00001448
1449 // If there's no debug info for the function we're not going to do anything.
1450 if (!MMI->hasDebugInfo())
1451 return;
1452
1453 // Grab the lexical scopes for the function, if we don't have any of those
1454 // then we're not going to be able to do anything.
Devang Patelbf47fdb2011-08-10 20:55:27 +00001455 LScopes.initialize(*MF);
Eric Christopher31ed50c2013-11-01 23:14:17 +00001456 if (LScopes.empty())
1457 return;
1458
1459 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1460
1461 // Make sure that each lexical scope will have a begin/end label.
Devang Patelbf47fdb2011-08-10 20:55:27 +00001462 identifyScopeMarkers();
Devang Patel60b35bd2009-10-06 18:37:31 +00001463
Stephen Hines36b56882014-04-23 16:57:46 -07001464 // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function
Eric Christopher31ed50c2013-11-01 23:14:17 +00001465 // belongs to so that we add to the correct per-cu line table in the
1466 // non-asm case.
Manman Ren43213cf2013-02-05 21:52:47 +00001467 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Stephen Hines36b56882014-04-23 16:57:46 -07001468 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Manman Ren43213cf2013-02-05 21:52:47 +00001469 assert(TheCU && "Unable to find compile unit!");
Stephen Hines36b56882014-04-23 16:57:46 -07001470 if (Asm->OutStreamer.hasRawTextSupport())
1471 // Use a single line table if we are generating assembly.
Manman Ren01cb18e2013-05-21 00:57:22 +00001472 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1473 else
1474 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
Manman Ren43213cf2013-02-05 21:52:47 +00001475
Eric Christopher31ed50c2013-11-01 23:14:17 +00001476 // Emit a label for the function so that we have a beginning address.
1477 FunctionBeginSym = Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001478 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001479 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001480
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001481 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopherb6dc8652012-11-27 22:43:45 +00001482 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Eric Christopher31ed50c2013-11-01 23:14:17 +00001483 std::vector<const MDNode *> LiveUserVar(TRI->getNumRegs());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001484
Eric Christopher31ed50c2013-11-01 23:14:17 +00001485 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); I != E;
1486 ++I) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001487 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00001488 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1489 II != IE; ++II) {
1490 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001491
Devang Patelb2b31a62010-05-26 19:37:24 +00001492 if (MI->isDebugValue()) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001493 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001494
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001495 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001496 const MDNode *Var =
Eric Christopher31ed50c2013-11-01 23:14:17 +00001497 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001498
1499 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001500 if (isDbgValueInDefinedReg(MI))
1501 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1502
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001503 // Check the history of this variable.
Eric Christopher31ed50c2013-11-01 23:14:17 +00001504 SmallVectorImpl<const MachineInstr *> &History = DbgValues[Var];
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001505 if (History.empty()) {
1506 UserVariables.push_back(Var);
1507 // The first mention of a function argument gets the FunctionBeginSym
1508 // label, so arguments are visible when breaking at function entry.
1509 DIVariable DV(Var);
Manman Rend03d2b22013-07-08 18:33:29 +00001510 if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
David Blaikied6dffb42013-11-18 23:57:26 +00001511 getDISubprogram(DV.getContext()).describes(MF->getFunction()))
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001512 LabelsBeforeInsn[MI] = FunctionBeginSym;
1513 } else {
1514 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1515 const MachineInstr *Prev = History.back();
1516 if (Prev->isDebugValue()) {
1517 // Coalesce identical entries at the end of History.
1518 if (History.size() >= 2 &&
Devang Patel79862892011-07-07 00:14:27 +00001519 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher02c1a642012-10-08 20:48:49 +00001520 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher31ed50c2013-11-01 23:14:17 +00001521 << "\t" << *Prev << "\t"
1522 << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001523 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001524 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001525
1526 // Terminate old register assignments that don't reach MI;
1527 MachineFunction::const_iterator PrevMBB = Prev->getParent();
Stephen Hines36b56882014-04-23 16:57:46 -07001528 if (PrevMBB != I && (!AtBlockEntry || std::next(PrevMBB) != I) &&
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001529 isDbgValueInDefinedReg(Prev)) {
1530 // Previous register assignment needs to terminate at the end of
1531 // its basic block.
1532 MachineBasicBlock::const_iterator LastMI =
Eric Christopher31ed50c2013-11-01 23:14:17 +00001533 PrevMBB->getLastNonDebugInstr();
Devang Patel79862892011-07-07 00:14:27 +00001534 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001535 // Drop DBG_VALUE for empty range.
Eric Christopher02c1a642012-10-08 20:48:49 +00001536 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Eric Christopher31ed50c2013-11-01 23:14:17 +00001537 << "\t" << *Prev << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001538 History.pop_back();
Stephen Hines36b56882014-04-23 16:57:46 -07001539 } else if (std::next(PrevMBB) != PrevMBB->getParent()->end())
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001540 // Terminate after LastMI.
1541 History.push_back(LastMI);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001542 }
1543 }
1544 }
1545 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00001546 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001547 // Not a DBG_VALUE instruction.
Stephen Hines36b56882014-04-23 16:57:46 -07001548 if (!MI->isPosition())
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001549 AtBlockEntry = false;
1550
Eric Christopher0313ced2012-10-04 20:46:14 +00001551 // First known non-DBG_VALUE and non-frame setup location marks
1552 // the beginning of the function body.
1553 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1554 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel4243e672011-05-11 19:22:19 +00001555 PrologEndLoc = MI->getDebugLoc();
1556
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001557 // Check if the instruction clobbers any registers with debug vars.
Stephen Hines36b56882014-04-23 16:57:46 -07001558 for (const MachineOperand &MO : MI->operands()) {
1559 if (!MO.isReg() || !MO.isDef() || !MO.getReg())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001560 continue;
Stephen Hines36b56882014-04-23 16:57:46 -07001561 for (MCRegAliasIterator AI(MO.getReg(), TRI, true); AI.isValid();
Eric Christopher31ed50c2013-11-01 23:14:17 +00001562 ++AI) {
Jakob Stoklund Olesen396618b2012-06-01 23:28:30 +00001563 unsigned Reg = *AI;
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001564 const MDNode *Var = LiveUserVar[Reg];
1565 if (!Var)
1566 continue;
1567 // Reg is now clobbered.
1568 LiveUserVar[Reg] = 0;
1569
1570 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001571 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1572 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001573 continue;
Eric Christopher31ed50c2013-11-01 23:14:17 +00001574 SmallVectorImpl<const MachineInstr *> &History = HistI->second;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001575 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001576 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001577 const MachineInstr *Prev = History.back();
1578 // Sanity-check: Register assignments are terminated at the end of
1579 // their block.
1580 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1581 continue;
1582 // Is the variable still in Reg?
1583 if (!isDbgValueInDefinedReg(Prev) ||
1584 Prev->getOperand(0).getReg() != Reg)
1585 continue;
1586 // Var is clobbered. Make sure the next instruction gets a label.
1587 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001588 }
1589 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001590 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001591 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001592 }
1593
Stephen Hines36b56882014-04-23 16:57:46 -07001594 for (auto &I : DbgValues) {
1595 SmallVectorImpl<const MachineInstr *> &History = I.second;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001596 if (History.empty())
1597 continue;
1598
1599 // Make sure the final register assignments are terminated.
1600 const MachineInstr *Prev = History.back();
1601 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1602 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001603 MachineBasicBlock::const_iterator LastMI =
Eric Christopher31ed50c2013-11-01 23:14:17 +00001604 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001605 if (LastMI == PrevMBB->end())
1606 // Drop DBG_VALUE for empty range.
1607 History.pop_back();
David Blaikie4532c282013-06-20 00:25:24 +00001608 else if (PrevMBB != &PrevMBB->getParent()->back()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001609 // Terminate after LastMI.
1610 History.push_back(LastMI);
1611 }
1612 }
1613 // Request labels for the full history.
Stephen Hines36b56882014-04-23 16:57:46 -07001614 for (const MachineInstr *MI : History) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001615 if (MI->isDebugValue())
1616 requestLabelBeforeInsn(MI);
1617 else
1618 requestLabelAfterInsn(MI);
1619 }
1620 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001621
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001622 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00001623 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00001624
1625 // Record beginning of function.
1626 if (!PrologEndLoc.isUnknown()) {
Eric Christopher31ed50c2013-11-01 23:14:17 +00001627 DebugLoc FnStartDL =
Stephen Hines36b56882014-04-23 16:57:46 -07001628 PrologEndLoc.getFnDebugLoc(MF->getFunction()->getContext());
Eric Christopher31ed50c2013-11-01 23:14:17 +00001629 recordSourceLine(
1630 FnStartDL.getLine(), FnStartDL.getCol(),
1631 FnStartDL.getScope(MF->getFunction()->getContext()),
1632 // We'd like to list the prologue as "not statements" but GDB behaves
1633 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
1634 DWARF2_FLAG_IS_STMT);
Devang Patel4243e672011-05-11 19:22:19 +00001635 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001636}
1637
Devang Patelbf47fdb2011-08-10 20:55:27 +00001638void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
David Blaikie032d6242013-06-05 05:39:59 +00001639 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1640 DIVariable DV = Var->getVariable();
David Blaikieb20fdff2013-06-06 21:04:51 +00001641 // Variables with positive arg numbers are parameters.
1642 if (unsigned ArgNum = DV.getArgNumber()) {
1643 // Keep all parameters in order at the start of the variable list to ensure
1644 // function types are correct (no out-of-order parameters)
1645 //
1646 // This could be improved by only doing it for optimized builds (unoptimized
1647 // builds have the right order to begin with), searching from the back (this
1648 // would catch the unoptimized case quickly), or doing a binary search
1649 // rather than linear search.
1650 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
1651 while (I != Vars.end()) {
1652 unsigned CurNum = (*I)->getVariable().getArgNumber();
1653 // A local (non-parameter) variable has been found, insert immediately
1654 // before it.
1655 if (CurNum == 0)
1656 break;
1657 // A later indexed parameter has been found, insert immediately before it.
David Blaikiebabfebb2013-06-06 22:28:26 +00001658 if (CurNum > ArgNum)
David Blaikieb20fdff2013-06-06 21:04:51 +00001659 break;
David Blaikiebabfebb2013-06-06 22:28:26 +00001660 ++I;
David Blaikie032d6242013-06-05 05:39:59 +00001661 }
David Blaikieb20fdff2013-06-06 21:04:51 +00001662 Vars.insert(I, Var);
1663 return;
David Blaikie032d6242013-06-05 05:39:59 +00001664 }
1665
1666 Vars.push_back(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001667}
1668
Eric Christopherb6dc8652012-11-27 22:43:45 +00001669// Gather and emit post-function debug information.
Chris Lattnereec791a2010-01-26 23:18:02 +00001670void DwarfDebug::endFunction(const MachineFunction *MF) {
Stephen Hines36b56882014-04-23 16:57:46 -07001671 // Every beginFunction(MF) call should be followed by an endFunction(MF) call,
1672 // though the beginFunction may not be called at all.
1673 // We should handle both cases.
1674 if (CurFn == 0)
1675 CurFn = MF;
1676 else
1677 assert(CurFn == MF);
1678 assert(CurFn != 0);
1679
1680 if (!MMI->hasDebugInfo() || LScopes.empty()) {
1681 // If we don't have a lexical scope for this function then there will
1682 // be a hole in the range information. Keep note of this by setting the
1683 // previously used section to nullptr.
1684 PrevSection = nullptr;
1685 PrevCU = nullptr;
1686 CurFn = 0;
1687 return;
1688 }
Devang Patel70d75ca2009-11-12 19:02:56 +00001689
Devang Patelbf47fdb2011-08-10 20:55:27 +00001690 // Define end label for subprogram.
Stephen Hines36b56882014-04-23 16:57:46 -07001691 FunctionEndSym = Asm->GetTempSymbol("func_end", Asm->getFunctionNumber());
Devang Patelbf47fdb2011-08-10 20:55:27 +00001692 // Assumes in correct section after the entry point.
1693 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Stephen Hines36b56882014-04-23 16:57:46 -07001694
1695 // Set DwarfDwarfCompileUnitID in MCContext to default value.
Manman Ren43213cf2013-02-05 21:52:47 +00001696 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001697
Devang Patelbf47fdb2011-08-10 20:55:27 +00001698 SmallPtrSet<const MDNode *, 16> ProcessedVars;
Stephen Hines36b56882014-04-23 16:57:46 -07001699 collectVariableInfo(ProcessedVars);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001700
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001701 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Stephen Hines36b56882014-04-23 16:57:46 -07001702 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky746cb672011-10-26 22:55:33 +00001703 assert(TheCU && "Unable to find compile unit!");
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001704
Devang Patelbf47fdb2011-08-10 20:55:27 +00001705 // Construct abstract scopes.
Stephen Hines36b56882014-04-23 16:57:46 -07001706 for (LexicalScope *AScope : LScopes.getAbstractScopesList()) {
Devang Patelcd9f6c52011-08-12 18:10:19 +00001707 DISubprogram SP(AScope->getScopeNode());
Manman Rend03d2b22013-07-08 18:33:29 +00001708 if (SP.isSubprogram()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001709 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001710 DIArray Variables = SP.getVariables();
1711 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1712 DIVariable DV(Variables.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +00001713 if (!DV || !DV.isVariable() || !ProcessedVars.insert(DV))
Devang Patel93d39be2011-08-19 23:28:12 +00001714 continue;
Alexey Samsonovb67bd332012-07-06 08:45:08 +00001715 // Check that DbgVariable for DV wasn't created earlier, when
1716 // findAbstractVariable() was called for inlined instance of DV.
1717 LLVMContext &Ctx = DV->getContext();
1718 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1719 if (AbstractVariables.lookup(CleanDV))
1720 continue;
Devang Patel93d39be2011-08-19 23:28:12 +00001721 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
Manman Renc664d762013-10-05 01:43:03 +00001722 addScopeVariable(Scope, new DbgVariable(DV, NULL, this));
Devang Patel78e127d2010-06-25 22:07:34 +00001723 }
1724 }
Devang Patelcd9f6c52011-08-12 18:10:19 +00001725 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Manman Ren742671b2013-05-29 17:16:59 +00001726 constructScopeDIE(TheCU, AScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001727 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001728
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001729 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Stephen Hines36b56882014-04-23 16:57:46 -07001730 if (!CurFn->getTarget().Options.DisableFramePointerElim(*CurFn))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001731 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001732
Stephen Hines36b56882014-04-23 16:57:46 -07001733 // Add the range of this function to the list of ranges for the CU.
1734 RangeSpan Span(FunctionBeginSym, FunctionEndSym);
1735 TheCU->addRange(std::move(Span));
1736 PrevSection = Asm->getCurrentSection();
1737 PrevCU = TheCU;
1738
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001739 // Clear debug info
Stephen Hines36b56882014-04-23 16:57:46 -07001740 for (auto &I : ScopeVariables)
1741 DeleteContainerPointers(I.second);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001742 ScopeVariables.clear();
Devang Pateleac0c9d2011-04-22 18:09:57 +00001743 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001744 UserVariables.clear();
1745 DbgValues.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001746 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00001747 LabelsBeforeInsn.clear();
1748 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00001749 PrevLabel = NULL;
Stephen Hines36b56882014-04-23 16:57:46 -07001750 CurFn = 0;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001751}
1752
Eric Christopherb6dc8652012-11-27 22:43:45 +00001753// Register a source line with debug info. Returns the unique label that was
1754// emitted and which provides correspondence to the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00001755void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1756 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00001757 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00001758 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00001759 unsigned Src = 1;
Stephen Hines36b56882014-04-23 16:57:46 -07001760 unsigned Discriminator = 0;
Dan Gohman1cc0d622010-05-05 23:41:32 +00001761 if (S) {
1762 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00001763
Dan Gohman1cc0d622010-05-05 23:41:32 +00001764 if (Scope.isCompileUnit()) {
1765 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001766 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001767 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00001768 } else if (Scope.isFile()) {
1769 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00001770 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001771 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001772 } else if (Scope.isSubprogram()) {
1773 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001774 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001775 Dir = SP.getDirectory();
Eric Christopher6618a242011-10-11 22:59:11 +00001776 } else if (Scope.isLexicalBlockFile()) {
1777 DILexicalBlockFile DBF(S);
1778 Fn = DBF.getFilename();
1779 Dir = DBF.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001780 } else if (Scope.isLexicalBlock()) {
1781 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001782 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001783 Dir = DB.getDirectory();
Stephen Hines36b56882014-04-23 16:57:46 -07001784 Discriminator = DB.getDiscriminator();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001785 } else
Craig Topper5e25ee82012-02-05 08:31:47 +00001786 llvm_unreachable("Unexpected scope info");
Dan Gohman1cc0d622010-05-05 23:41:32 +00001787
Stephen Hines36b56882014-04-23 16:57:46 -07001788 unsigned CUID = Asm->OutStreamer.getContext().getDwarfCompileUnitID();
1789 Src = static_cast<DwarfCompileUnit *>(InfoHolder.getUnits()[CUID])
1790 ->getOrCreateSourceID(Fn, Dir);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001791 }
Stephen Hines36b56882014-04-23 16:57:46 -07001792 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0,
1793 Discriminator, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001794}
1795
Bill Wendling829e67b2009-05-20 23:22:40 +00001796//===----------------------------------------------------------------------===//
1797// Emit Methods
1798//===----------------------------------------------------------------------===//
1799
Manman Ren3eabc2a2013-10-29 22:57:10 +00001800// Compute the size and offset of a DIE. The offset is relative to start of the
1801// CU. It returns the offset after laying out the DIE.
Stephen Hines36b56882014-04-23 16:57:46 -07001802unsigned DwarfFile::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001803 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001804 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00001805
1806 // Get the abbreviation for this DIE.
Stephen Hines36b56882014-04-23 16:57:46 -07001807 const DIEAbbrev &Abbrev = Die->getAbbrev();
Bill Wendling94d04b82009-05-20 23:21:38 +00001808
1809 // Set DIE offset
1810 Die->setOffset(Offset);
1811
1812 // Start the size with the size of abbreviation code.
Stephen Hines36b56882014-04-23 16:57:46 -07001813 Offset += getULEB128Size(Die->getAbbrevNumber());
Bill Wendling94d04b82009-05-20 23:21:38 +00001814
Stephen Hines36b56882014-04-23 16:57:46 -07001815 const SmallVectorImpl<DIEValue *> &Values = Die->getValues();
1816 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
Bill Wendling94d04b82009-05-20 23:21:38 +00001817
1818 // Size the DIE attribute values.
1819 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1820 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00001821 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00001822
Stephen Hines36b56882014-04-23 16:57:46 -07001823 // Get the children.
1824 const std::vector<DIE *> &Children = Die->getChildren();
1825
Bill Wendling94d04b82009-05-20 23:21:38 +00001826 // Size the DIE children if any.
1827 if (!Children.empty()) {
Stephen Hines36b56882014-04-23 16:57:46 -07001828 assert(Abbrev.hasChildren() && "Children flag not set");
Bill Wendling94d04b82009-05-20 23:21:38 +00001829
Stephen Hines36b56882014-04-23 16:57:46 -07001830 for (DIE *Child : Children)
1831 Offset = computeSizeAndOffset(Child, Offset);
Bill Wendling94d04b82009-05-20 23:21:38 +00001832
1833 // End of children marker.
1834 Offset += sizeof(int8_t);
1835 }
1836
1837 Die->setSize(Offset - Die->getOffset());
1838 return Offset;
1839}
1840
Eric Christopher39cd7d42013-10-24 21:05:08 +00001841// Compute the size and offset for each DIE.
Stephen Hines36b56882014-04-23 16:57:46 -07001842void DwarfFile::computeSizeAndOffsets() {
Manman Ren3eabc2a2013-10-29 22:57:10 +00001843 // Offset from the first CU in the debug info section is 0 initially.
1844 unsigned SecOffset = 0;
1845
Eric Christopher39cd7d42013-10-24 21:05:08 +00001846 // Iterate over each compile unit and set the size and offsets for each
1847 // DIE within each compile unit. All offsets are CU relative.
Stephen Hines36b56882014-04-23 16:57:46 -07001848 for (DwarfUnit *TheU : CUs) {
1849 TheU->setDebugInfoOffset(SecOffset);
Manman Ren3eabc2a2013-10-29 22:57:10 +00001850
1851 // CU-relative offset is reset to 0 here.
Stephen Hines36b56882014-04-23 16:57:46 -07001852 unsigned Offset = sizeof(int32_t) + // Length of Unit Info
1853 TheU->getHeaderSize(); // Unit-specific headers
Manman Ren3eabc2a2013-10-29 22:57:10 +00001854
1855 // EndOffset here is CU-relative, after laying out
1856 // all of the CU DIE.
Stephen Hines36b56882014-04-23 16:57:46 -07001857 unsigned EndOffset = computeSizeAndOffset(TheU->getUnitDie(), Offset);
Manman Ren3eabc2a2013-10-29 22:57:10 +00001858 SecOffset += EndOffset;
Devang Patel163a9f72010-05-10 22:49:55 +00001859 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001860}
1861
Eric Christopherb6dc8652012-11-27 22:43:45 +00001862// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001863void DwarfDebug::emitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001864 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001865
Bill Wendling94d04b82009-05-20 23:21:38 +00001866 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001867 DwarfInfoSectionSym =
Stephen Hines36b56882014-04-23 16:57:46 -07001868 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Eric Christopher6eebe472012-12-19 22:02:53 +00001869 if (useSplitDwarf())
Stephen Hines36b56882014-04-23 16:57:46 -07001870 DwarfInfoDWOSectionSym =
1871 emitSectionSym(Asm, TLOF.getDwarfInfoDWOSection(), "section_info_dwo");
1872 DwarfAbbrevSectionSym =
1873 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
1874 if (useSplitDwarf())
1875 DwarfAbbrevDWOSectionSym = emitSectionSym(
1876 Asm, TLOF.getDwarfAbbrevDWOSection(), "section_abbrev_dwo");
1877 if (GenerateARangeSection)
1878 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001879
Eric Christopher7a0103c2013-02-07 21:19:50 +00001880 DwarfLineSectionSym =
Stephen Hines36b56882014-04-23 16:57:46 -07001881 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christophercdeaae42013-09-23 20:55:35 +00001882 if (GenerateGnuPubSections) {
Eric Christophera6d84152013-09-30 23:14:16 +00001883 DwarfGnuPubNamesSectionSym =
1884 emitSectionSym(Asm, TLOF.getDwarfGnuPubNamesSection());
1885 DwarfGnuPubTypesSectionSym =
1886 emitSectionSym(Asm, TLOF.getDwarfGnuPubTypesSection());
Eric Christophercdeaae42013-09-23 20:55:35 +00001887 } else if (HasDwarfPubSections) {
1888 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
1889 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Michael Gottesmandc42d032013-09-04 04:39:38 +00001890 }
Eric Christopher8f1a9292013-09-13 00:35:05 +00001891
Jim Grosbach1e20b962010-07-21 21:21:52 +00001892 DwarfStrSectionSym =
Stephen Hines36b56882014-04-23 16:57:46 -07001893 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher9a9e73b2013-04-07 03:43:09 +00001894 if (useSplitDwarf()) {
Eric Christopher64f824c2012-12-27 02:14:01 +00001895 DwarfStrDWOSectionSym =
Stephen Hines36b56882014-04-23 16:57:46 -07001896 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher9a9e73b2013-04-07 03:43:09 +00001897 DwarfAddrSectionSym =
Stephen Hines36b56882014-04-23 16:57:46 -07001898 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
1899 DwarfDebugLocSectionSym =
1900 emitSectionSym(Asm, TLOF.getDwarfLocDWOSection(), "skel_loc");
1901 } else
1902 DwarfDebugLocSectionSym =
1903 emitSectionSym(Asm, TLOF.getDwarfLocSection(), "section_debug_loc");
1904 DwarfDebugRangeSectionSym =
1905 emitSectionSym(Asm, TLOF.getDwarfRangesSection(), "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00001906}
1907
Eric Christopherb6dc8652012-11-27 22:43:45 +00001908// Recursively emits a debug information entry.
Stephen Hines36b56882014-04-23 16:57:46 -07001909void DwarfDebug::emitDIE(DIE *Die) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001910 // Get the abbreviation for this DIE.
Stephen Hines36b56882014-04-23 16:57:46 -07001911 const DIEAbbrev &Abbrev = Die->getAbbrev();
Bill Wendling94d04b82009-05-20 23:21:38 +00001912
Bill Wendling94d04b82009-05-20 23:21:38 +00001913 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00001914 if (Asm->isVerbose())
Stephen Hines36b56882014-04-23 16:57:46 -07001915 Asm->OutStreamer.AddComment("Abbrev [" + Twine(Abbrev.getNumber()) +
1916 "] 0x" + Twine::utohexstr(Die->getOffset()) +
1917 ":0x" + Twine::utohexstr(Die->getSize()) + " " +
1918 dwarf::TagString(Abbrev.getTag()));
1919 Asm->EmitULEB128(Abbrev.getNumber());
Bill Wendling94d04b82009-05-20 23:21:38 +00001920
Stephen Hines36b56882014-04-23 16:57:46 -07001921 const SmallVectorImpl<DIEValue *> &Values = Die->getValues();
1922 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
Bill Wendling94d04b82009-05-20 23:21:38 +00001923
1924 // Emit the DIE attribute values.
1925 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
David Blaikie770530b2013-10-21 17:28:37 +00001926 dwarf::Attribute Attr = AbbrevData[i].getAttribute();
1927 dwarf::Form Form = AbbrevData[i].getForm();
Bill Wendling94d04b82009-05-20 23:21:38 +00001928 assert(Form && "Too many attributes for DIE (check abbreviation)");
1929
Stephen Hines36b56882014-04-23 16:57:46 -07001930 if (Asm->isVerbose()) {
Chris Lattnera8013622010-01-24 18:54:17 +00001931 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Stephen Hines36b56882014-04-23 16:57:46 -07001932 if (Attr == dwarf::DW_AT_accessibility)
1933 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(
1934 cast<DIEInteger>(Values[i])->getValue()));
1935 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001936
Stephen Hines36b56882014-04-23 16:57:46 -07001937 // Emit an attribute using the defined form.
1938 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00001939 }
1940
1941 // Emit the DIE children if any.
Stephen Hines36b56882014-04-23 16:57:46 -07001942 if (Abbrev.hasChildren()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001943 const std::vector<DIE *> &Children = Die->getChildren();
1944
Stephen Hines36b56882014-04-23 16:57:46 -07001945 for (DIE *Child : Children)
1946 emitDIE(Child);
Bill Wendling94d04b82009-05-20 23:21:38 +00001947
Stephen Hines36b56882014-04-23 16:57:46 -07001948 Asm->OutStreamer.AddComment("End Of Children Mark");
Chris Lattner233f52b2010-03-09 23:52:58 +00001949 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00001950 }
1951}
1952
Eric Christopherb1e66d02012-12-15 00:04:07 +00001953// Emit the various dwarf units to the unit section USection with
1954// the abbreviations going into ASection.
Stephen Hines36b56882014-04-23 16:57:46 -07001955void DwarfFile::emitUnits(DwarfDebug *DD, const MCSymbol *ASectionSym) {
1956 for (DwarfUnit *TheU : CUs) {
1957 DIE *Die = TheU->getUnitDie();
1958 const MCSection *USection = TheU->getSection();
1959 Asm->OutStreamer.SwitchSection(USection);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001960
Devang Patel163a9f72010-05-10 22:49:55 +00001961 // Emit the compile units header.
Stephen Hines36b56882014-04-23 16:57:46 -07001962 Asm->OutStreamer.EmitLabel(TheU->getLabelBegin());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001963
Devang Patel163a9f72010-05-10 22:49:55 +00001964 // Emit size of content not including length itself
David Blaikie1d361132013-10-30 20:42:41 +00001965 Asm->OutStreamer.AddComment("Length of Unit");
Stephen Hines36b56882014-04-23 16:57:46 -07001966 Asm->EmitInt32(TheU->getHeaderSize() + Die->getSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001967
Stephen Hines36b56882014-04-23 16:57:46 -07001968 TheU->emitHeader(ASectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001969
Stephen Hines36b56882014-04-23 16:57:46 -07001970 DD->emitDIE(Die);
1971 Asm->OutStreamer.EmitLabel(TheU->getLabelEnd());
Devang Patel163a9f72010-05-10 22:49:55 +00001972 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001973}
1974
Eric Christopher98e237f2012-11-30 23:59:06 +00001975// Emit the debug info section.
1976void DwarfDebug::emitDebugInfo() {
Stephen Hines36b56882014-04-23 16:57:46 -07001977 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Eric Christopherb1e66d02012-12-15 00:04:07 +00001978
Stephen Hines36b56882014-04-23 16:57:46 -07001979 Holder.emitUnits(this, DwarfAbbrevSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00001980}
1981
Eric Christopherb6dc8652012-11-27 22:43:45 +00001982// Emit the abbreviation section.
Eric Christopher7dc68db2012-11-20 23:30:11 +00001983void DwarfDebug::emitAbbreviations() {
Stephen Hines36b56882014-04-23 16:57:46 -07001984 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1985
1986 Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
Eric Christopher6eebe472012-12-19 22:02:53 +00001987}
Bill Wendling94d04b82009-05-20 23:21:38 +00001988
Stephen Hines36b56882014-04-23 16:57:46 -07001989void DwarfFile::emitAbbrevs(const MCSection *Section) {
Eric Christopher6eebe472012-12-19 22:02:53 +00001990 // Check to see if it is worth the effort.
Stephen Hines36b56882014-04-23 16:57:46 -07001991 if (!Abbreviations.empty()) {
Eric Christopher6eebe472012-12-19 22:02:53 +00001992 // Start the debug abbrev section.
1993 Asm->OutStreamer.SwitchSection(Section);
1994
Bill Wendling94d04b82009-05-20 23:21:38 +00001995 // For each abbrevation.
Stephen Hines36b56882014-04-23 16:57:46 -07001996 for (const DIEAbbrev *Abbrev : Abbreviations) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001997 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001998 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00001999
2000 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00002001 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00002002 }
2003
2004 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002005 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00002006 }
2007}
2008
Eric Christopherb6dc8652012-11-27 22:43:45 +00002009// Emit the last address of the section and the end of the line matrix.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002010void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002011 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00002012 Asm->OutStreamer.AddComment("Extended Op");
2013 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002014
Chris Lattner233f52b2010-03-09 23:52:58 +00002015 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002016 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00002017 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2018 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2019
2020 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00002021
Stephen Hines36b56882014-04-23 16:57:46 -07002022 Asm->OutStreamer.EmitSymbolValue(
2023 Asm->GetTempSymbol("section_end", SectionEnd),
2024 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002025
2026 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00002027 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2028 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00002029 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00002030 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00002031}
2032
Eric Christopherb6dc8652012-11-27 22:43:45 +00002033// Emit visible names into a hashed accelerator table section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002034void DwarfDebug::emitAccelNames() {
Stephen Hines36b56882014-04-23 16:57:46 -07002035 DwarfAccelTable AT(
2036 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4));
2037 for (DwarfUnit *TheU : getUnits()) {
2038 for (const auto &GI : TheU->getAccelNames()) {
2039 StringRef Name = GI.getKey();
2040 for (const DIE *D : GI.second)
2041 AT.AddName(Name, D);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002042 }
2043 }
2044
2045 AT.FinalizeTable(Asm, "Names");
2046 Asm->OutStreamer.SwitchSection(
Stephen Hines36b56882014-04-23 16:57:46 -07002047 Asm->getObjFileLowering().getDwarfAccelNamesSection());
Eric Christopher09ac3d82011-11-07 09:24:32 +00002048 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
2049 Asm->OutStreamer.EmitLabel(SectionBegin);
2050
2051 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002052 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002053}
2054
Eric Christopher72c16552012-12-20 21:58:40 +00002055// Emit objective C classes and categories into a hashed accelerator table
2056// section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002057void DwarfDebug::emitAccelObjC() {
Stephen Hines36b56882014-04-23 16:57:46 -07002058 DwarfAccelTable AT(
2059 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4));
2060 for (DwarfUnit *TheU : getUnits()) {
2061 for (const auto &GI : TheU->getAccelObjC()) {
2062 StringRef Name = GI.getKey();
2063 for (const DIE *D : GI.second)
2064 AT.AddName(Name, D);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002065 }
2066 }
2067
2068 AT.FinalizeTable(Asm, "ObjC");
Stephen Hines36b56882014-04-23 16:57:46 -07002069 Asm->OutStreamer.SwitchSection(
2070 Asm->getObjFileLowering().getDwarfAccelObjCSection());
Eric Christopher09ac3d82011-11-07 09:24:32 +00002071 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2072 Asm->OutStreamer.EmitLabel(SectionBegin);
2073
2074 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002075 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002076}
2077
Eric Christopherb6dc8652012-11-27 22:43:45 +00002078// Emit namespace dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002079void DwarfDebug::emitAccelNamespaces() {
Stephen Hines36b56882014-04-23 16:57:46 -07002080 DwarfAccelTable AT(
2081 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4));
2082 for (DwarfUnit *TheU : getUnits()) {
2083 for (const auto &GI : TheU->getAccelNamespace()) {
2084 StringRef Name = GI.getKey();
2085 for (const DIE *D : GI.second)
2086 AT.AddName(Name, D);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002087 }
2088 }
2089
2090 AT.FinalizeTable(Asm, "namespac");
Stephen Hines36b56882014-04-23 16:57:46 -07002091 Asm->OutStreamer.SwitchSection(
2092 Asm->getObjFileLowering().getDwarfAccelNamespaceSection());
Eric Christopher09ac3d82011-11-07 09:24:32 +00002093 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2094 Asm->OutStreamer.EmitLabel(SectionBegin);
2095
2096 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002097 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002098}
2099
Eric Christopherb6dc8652012-11-27 22:43:45 +00002100// Emit type dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002101void DwarfDebug::emitAccelTypes() {
Eric Christopherc36145f2012-01-06 04:35:23 +00002102 std::vector<DwarfAccelTable::Atom> Atoms;
Stephen Hines36b56882014-04-23 16:57:46 -07002103 Atoms.push_back(
2104 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4));
2105 Atoms.push_back(
2106 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag, dwarf::DW_FORM_data2));
2107 Atoms.push_back(
2108 DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags, dwarf::DW_FORM_data1));
Eric Christopherc36145f2012-01-06 04:35:23 +00002109 DwarfAccelTable AT(Atoms);
Stephen Hines36b56882014-04-23 16:57:46 -07002110 for (DwarfUnit *TheU : getUnits()) {
2111 for (const auto &GI : TheU->getAccelTypes()) {
2112 StringRef Name = GI.getKey();
2113 for (const auto &DI : GI.second)
2114 AT.AddName(Name, DI.first, DI.second);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002115 }
2116 }
2117
2118 AT.FinalizeTable(Asm, "types");
Stephen Hines36b56882014-04-23 16:57:46 -07002119 Asm->OutStreamer.SwitchSection(
2120 Asm->getObjFileLowering().getDwarfAccelTypesSection());
Eric Christopher09ac3d82011-11-07 09:24:32 +00002121 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2122 Asm->OutStreamer.EmitLabel(SectionBegin);
2123
2124 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002125 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002126}
2127
Eric Christopher8f1a9292013-09-13 00:35:05 +00002128// Public name handling.
2129// The format for the various pubnames:
2130//
2131// dwarf pubnames - offset/name pairs where the offset is the offset into the CU
2132// for the DIE that is named.
2133//
2134// gnu pubnames - offset/index value/name tuples where the offset is the offset
2135// into the CU and the index value is computed according to the type of value
2136// for the DIE that is named.
2137//
2138// For type units the offset is the offset of the skeleton DIE. For split dwarf
2139// it's the offset within the debug_info/debug_types dwo section, however, the
2140// reference in the pubname header doesn't change.
2141
2142/// computeIndexValue - Compute the gdb index value for the DIE and CU.
Stephen Hines36b56882014-04-23 16:57:46 -07002143static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU,
2144 const DIE *Die) {
Eric Christophera486f552013-10-16 01:37:49 +00002145 dwarf::GDBIndexEntryLinkage Linkage = dwarf::GIEL_STATIC;
2146
2147 // We could have a specification DIE that has our most of our knowledge,
2148 // look for that now.
2149 DIEValue *SpecVal = Die->findAttribute(dwarf::DW_AT_specification);
2150 if (SpecVal) {
2151 DIE *SpecDIE = cast<DIEEntry>(SpecVal)->getEntry();
2152 if (SpecDIE->findAttribute(dwarf::DW_AT_external))
2153 Linkage = dwarf::GIEL_EXTERNAL;
2154 } else if (Die->findAttribute(dwarf::DW_AT_external))
2155 Linkage = dwarf::GIEL_EXTERNAL;
Eric Christopher8f1a9292013-09-13 00:35:05 +00002156
2157 switch (Die->getTag()) {
2158 case dwarf::DW_TAG_class_type:
2159 case dwarf::DW_TAG_structure_type:
2160 case dwarf::DW_TAG_union_type:
2161 case dwarf::DW_TAG_enumeration_type:
Eric Christophercdeaae42013-09-23 20:55:35 +00002162 return dwarf::PubIndexEntryDescriptor(
2163 dwarf::GIEK_TYPE, CU->getLanguage() != dwarf::DW_LANG_C_plus_plus
2164 ? dwarf::GIEL_STATIC
2165 : dwarf::GIEL_EXTERNAL);
Eric Christopher8f1a9292013-09-13 00:35:05 +00002166 case dwarf::DW_TAG_typedef:
2167 case dwarf::DW_TAG_base_type:
2168 case dwarf::DW_TAG_subrange_type:
David Blaikie9599f512013-09-19 20:40:26 +00002169 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE, dwarf::GIEL_STATIC);
Eric Christopher8f1a9292013-09-13 00:35:05 +00002170 case dwarf::DW_TAG_namespace:
David Blaikie9599f512013-09-19 20:40:26 +00002171 return dwarf::GIEK_TYPE;
Eric Christopher8f1a9292013-09-13 00:35:05 +00002172 case dwarf::DW_TAG_subprogram:
Eric Christophera31a9752013-09-23 22:59:14 +00002173 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_FUNCTION, Linkage);
Eric Christopher8f1a9292013-09-13 00:35:05 +00002174 case dwarf::DW_TAG_constant:
2175 case dwarf::DW_TAG_variable:
Eric Christophera31a9752013-09-23 22:59:14 +00002176 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, Linkage);
Eric Christopher8f1a9292013-09-13 00:35:05 +00002177 case dwarf::DW_TAG_enumerator:
David Blaikie9599f512013-09-19 20:40:26 +00002178 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE,
2179 dwarf::GIEL_STATIC);
Eric Christopher8f1a9292013-09-13 00:35:05 +00002180 default:
David Blaikie9599f512013-09-19 20:40:26 +00002181 return dwarf::GIEK_NONE;
Eric Christopher8f1a9292013-09-13 00:35:05 +00002182 }
Eric Christopher8f1a9292013-09-13 00:35:05 +00002183}
2184
Eric Christopher57479322013-09-09 20:03:17 +00002185/// emitDebugPubNames - Emit visible names into a debug pubnames section.
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002186///
Eric Christopher8f1a9292013-09-13 00:35:05 +00002187void DwarfDebug::emitDebugPubNames(bool GnuStyle) {
Eric Christopher8f1a9292013-09-13 00:35:05 +00002188 const MCSection *PSec =
2189 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection()
2190 : Asm->getObjFileLowering().getDwarfPubNamesSection();
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002191
Stephen Hines36b56882014-04-23 16:57:46 -07002192 emitDebugPubSection(GnuStyle, PSec, "Names", &DwarfUnit::getGlobalNames);
2193}
2194
2195void DwarfDebug::emitDebugPubSection(
2196 bool GnuStyle, const MCSection *PSec, StringRef Name,
2197 const StringMap<const DIE *> &(DwarfUnit::*Accessor)() const) {
2198 for (const auto &NU : CUMap) {
2199 DwarfCompileUnit *TheU = NU.second;
2200
2201 const auto &Globals = (TheU->*Accessor)();
2202
2203 if (Globals.empty())
2204 continue;
2205
2206 if (auto Skeleton = static_cast<DwarfCompileUnit *>(TheU->getSkeleton()))
2207 TheU = Skeleton;
2208 unsigned ID = TheU->getUniqueID();
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002209
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002210 // Start the dwarf pubnames section.
Eric Christopher21a6a502013-09-10 21:49:37 +00002211 Asm->OutStreamer.SwitchSection(PSec);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002212
Eric Christopher8f1a9292013-09-13 00:35:05 +00002213 // Emit the header.
Stephen Hines36b56882014-04-23 16:57:46 -07002214 Asm->OutStreamer.AddComment("Length of Public " + Name + " Info");
2215 MCSymbol *BeginLabel = Asm->GetTempSymbol("pub" + Name + "_begin", ID);
2216 MCSymbol *EndLabel = Asm->GetTempSymbol("pub" + Name + "_end", ID);
2217 Asm->EmitLabelDifference(EndLabel, BeginLabel, 4);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002218
Stephen Hines36b56882014-04-23 16:57:46 -07002219 Asm->OutStreamer.EmitLabel(BeginLabel);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002220
2221 Asm->OutStreamer.AddComment("DWARF Version");
David Majnemerd7d43dc2013-08-21 06:13:34 +00002222 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002223
2224 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Stephen Hines36b56882014-04-23 16:57:46 -07002225 Asm->EmitSectionOffset(TheU->getLabelBegin(), TheU->getSectionSym());
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002226
2227 Asm->OutStreamer.AddComment("Compilation Unit Length");
Stephen Hines36b56882014-04-23 16:57:46 -07002228 Asm->EmitLabelDifference(TheU->getLabelEnd(), TheU->getLabelBegin(), 4);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002229
Eric Christopher8f1a9292013-09-13 00:35:05 +00002230 // Emit the pubnames for this compilation unit.
Stephen Hines36b56882014-04-23 16:57:46 -07002231 for (const auto &GI : Globals) {
2232 const char *Name = GI.getKeyData();
2233 const DIE *Entity = GI.second;
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002234
2235 Asm->OutStreamer.AddComment("DIE offset");
2236 Asm->EmitInt32(Entity->getOffset());
2237
Eric Christopher8f1a9292013-09-13 00:35:05 +00002238 if (GnuStyle) {
Stephen Hines36b56882014-04-23 16:57:46 -07002239 dwarf::PubIndexEntryDescriptor Desc = computeIndexValue(TheU, Entity);
David Blaikie18a6ade2013-09-19 22:19:37 +00002240 Asm->OutStreamer.AddComment(
David Blaikieac3f0162013-09-20 00:33:15 +00002241 Twine("Kind: ") + dwarf::GDBIndexEntryKindString(Desc.Kind) + ", " +
David Blaikie994c37f2013-09-19 23:01:29 +00002242 dwarf::GDBIndexEntryLinkageString(Desc.Linkage));
David Blaikie18a6ade2013-09-19 22:19:37 +00002243 Asm->EmitInt8(Desc.toBits());
Eric Christopher8f1a9292013-09-13 00:35:05 +00002244 }
2245
Stephen Hines36b56882014-04-23 16:57:46 -07002246 Asm->OutStreamer.AddComment("External Name");
2247 Asm->OutStreamer.EmitBytes(StringRef(Name, GI.getKeyLength() + 1));
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002248 }
2249
2250 Asm->OutStreamer.AddComment("End Mark");
2251 Asm->EmitInt32(0);
Stephen Hines36b56882014-04-23 16:57:46 -07002252 Asm->OutStreamer.EmitLabel(EndLabel);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002253 }
2254}
2255
Eric Christopher8f1a9292013-09-13 00:35:05 +00002256void DwarfDebug::emitDebugPubTypes(bool GnuStyle) {
Eric Christophercdeaae42013-09-23 20:55:35 +00002257 const MCSection *PSec =
2258 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
2259 : Asm->getObjFileLowering().getDwarfPubTypesSection();
Eric Christopher5704d642013-09-13 00:34:58 +00002260
Stephen Hines36b56882014-04-23 16:57:46 -07002261 emitDebugPubSection(GnuStyle, PSec, "Types", &DwarfUnit::getGlobalTypes);
Devang Patel193f7202009-11-24 01:14:22 +00002262}
2263
Eric Christopher64f824c2012-12-27 02:14:01 +00002264// Emit strings into a string section.
Stephen Hines36b56882014-04-23 16:57:46 -07002265void DwarfFile::emitStrings(const MCSection *StrSection,
2266 const MCSection *OffsetSection = NULL,
2267 const MCSymbol *StrSecSym = NULL) {
Eric Christopher64f824c2012-12-27 02:14:01 +00002268
Stephen Hines36b56882014-04-23 16:57:46 -07002269 if (StringPool.empty())
2270 return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002271
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002272 // Start the dwarf str section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002273 Asm->OutStreamer.SwitchSection(StrSection);
Bill Wendling94d04b82009-05-20 23:21:38 +00002274
Chris Lattnerbc733f52010-03-13 02:17:42 +00002275 // Get all of the string pool entries and put them in an array by their ID so
2276 // we can sort them.
Stephen Hines36b56882014-04-23 16:57:46 -07002277 SmallVector<std::pair<unsigned, const StrPool::value_type *>, 64 > Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002278
Stephen Hines36b56882014-04-23 16:57:46 -07002279 for (const auto &I : StringPool)
2280 Entries.push_back(std::make_pair(I.second.second, &I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002281
Chris Lattnerbc733f52010-03-13 02:17:42 +00002282 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002283
Stephen Hines36b56882014-04-23 16:57:46 -07002284 for (const auto &Entry : Entries) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002285 // Emit a label for reference from debug information entries.
Stephen Hines36b56882014-04-23 16:57:46 -07002286 Asm->OutStreamer.EmitLabel(Entry.second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002287
Benjamin Kramer983c4572011-11-09 18:16:11 +00002288 // Emit the string itself with a terminating null byte.
Stephen Hines36b56882014-04-23 16:57:46 -07002289 Asm->OutStreamer.EmitBytes(StringRef(Entry.second->getKeyData(),
2290 Entry.second->getKeyLength() + 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002291 }
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002292
2293 // If we've got an offset section go ahead and emit that now as well.
2294 if (OffsetSection) {
2295 Asm->OutStreamer.SwitchSection(OffsetSection);
2296 unsigned offset = 0;
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002297 unsigned size = 4; // FIXME: DWARF64 is 8.
Stephen Hines36b56882014-04-23 16:57:46 -07002298 for (const auto &Entry : Entries) {
Eric Christopher1ced2082013-01-09 03:52:05 +00002299 Asm->OutStreamer.EmitIntValue(offset, size);
Stephen Hines36b56882014-04-23 16:57:46 -07002300 offset += Entry.second->getKeyLength() + 1;
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002301 }
2302 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002303}
2304
Stephen Hines36b56882014-04-23 16:57:46 -07002305// Emit addresses into the section given.
2306void DwarfFile::emitAddresses(const MCSection *AddrSection) {
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002307
Stephen Hines36b56882014-04-23 16:57:46 -07002308 if (AddressPool.empty())
2309 return;
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002310
2311 // Start the dwarf addr section.
2312 Asm->OutStreamer.SwitchSection(AddrSection);
2313
David Blaikie66f464e2013-07-08 17:51:28 +00002314 // Order the address pool entries by ID
David Blaikie5ce40912013-07-08 17:33:10 +00002315 SmallVector<const MCExpr *, 64> Entries(AddressPool.size());
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002316
Stephen Hines36b56882014-04-23 16:57:46 -07002317 for (const auto &I : AddressPool)
2318 Entries[I.second.Number] =
2319 I.second.TLS
2320 ? Asm->getObjFileLowering().getDebugThreadLocalSymbol(I.first)
2321 : MCSymbolRefExpr::Create(I.first, Asm->OutContext);
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002322
Stephen Hines36b56882014-04-23 16:57:46 -07002323 for (const MCExpr *Entry : Entries)
2324 Asm->OutStreamer.EmitValue(Entry, Asm->getDataLayout().getPointerSize());
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002325}
2326
Eric Christopher64f824c2012-12-27 02:14:01 +00002327// Emit visible names into a debug str section.
2328void DwarfDebug::emitDebugStr() {
Stephen Hines36b56882014-04-23 16:57:46 -07002329 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Eric Christopher64f824c2012-12-27 02:14:01 +00002330 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2331}
2332
Stephen Hines36b56882014-04-23 16:57:46 -07002333void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer,
2334 const DebugLocEntry &Entry) {
2335 DIVariable DV(Entry.getVariable());
2336 if (Entry.isInt()) {
2337 DIBasicType BTy(resolve(DV.getType()));
2338 if (BTy.Verify() && (BTy.getEncoding() == dwarf::DW_ATE_signed ||
2339 BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2340 Streamer.EmitInt8(dwarf::DW_OP_consts, "DW_OP_consts");
2341 Streamer.EmitSLEB128(Entry.getInt());
2342 } else {
2343 Streamer.EmitInt8(dwarf::DW_OP_constu, "DW_OP_constu");
2344 Streamer.EmitULEB128(Entry.getInt());
2345 }
2346 } else if (Entry.isLocation()) {
2347 MachineLocation Loc = Entry.getLoc();
2348 if (!DV.hasComplexAddress())
2349 // Regular entry.
2350 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2351 else {
2352 // Complex address entry.
2353 unsigned N = DV.getNumAddrElements();
2354 unsigned i = 0;
2355 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2356 if (Loc.getOffset()) {
2357 i = 2;
2358 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2359 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
2360 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
2361 Streamer.EmitSLEB128(DV.getAddrElement(1));
2362 } else {
2363 // If first address element is OpPlus then emit
2364 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2365 MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));
2366 Asm->EmitDwarfRegOp(Streamer, TLoc, DV.isIndirect());
2367 i = 2;
2368 }
2369 } else {
2370 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2371 }
2372
2373 // Emit remaining complex address elements.
2374 for (; i < N; ++i) {
2375 uint64_t Element = DV.getAddrElement(i);
2376 if (Element == DIBuilder::OpPlus) {
2377 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
2378 Streamer.EmitULEB128(DV.getAddrElement(++i));
2379 } else if (Element == DIBuilder::OpDeref) {
2380 if (!Loc.isReg())
2381 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
2382 } else
2383 llvm_unreachable("unknown Opcode found in complex address");
2384 }
2385 }
2386 }
2387 // else ... ignore constant fp. There is not any good way to
2388 // to represent them here in dwarf.
2389 // FIXME: ^
2390}
2391
2392void DwarfDebug::emitDebugLocEntryLocation(const DebugLocEntry &Entry) {
2393 Asm->OutStreamer.AddComment("Loc expr size");
2394 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2395 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2396 Asm->EmitLabelDifference(end, begin, 2);
2397 Asm->OutStreamer.EmitLabel(begin);
2398 // Emit the entry.
2399 APByteStreamer Streamer(*Asm);
2400 emitDebugLocEntry(Streamer, Entry);
2401 // Close the range.
2402 Asm->OutStreamer.EmitLabel(end);
2403}
2404
Eric Christopherd3b98532013-07-02 21:36:07 +00002405// Emit locations into the debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002406void DwarfDebug::emitDebugLoc() {
Daniel Dunbar83320a02011-03-16 22:16:39 +00002407 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002408 Asm->OutStreamer.SwitchSection(
Stephen Hines36b56882014-04-23 16:57:46 -07002409 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002410 unsigned char Size = Asm->getDataLayout().getPointerSize();
Stephen Hines36b56882014-04-23 16:57:46 -07002411 for (const auto &DebugLoc : DotDebugLocEntries) {
2412 Asm->OutStreamer.EmitLabel(DebugLoc.Label);
2413 for (const auto &Entry : DebugLoc.List) {
2414 // Set up the range. This range is relative to the entry point of the
2415 // compile unit. This is a hard coded 0 for low_pc when we're emitting
2416 // ranges, or the DW_AT_low_pc on the compile unit otherwise.
2417 const DwarfCompileUnit *CU = Entry.getCU();
2418 if (CU->getRanges().size() == 1) {
2419 // Grab the begin symbol from the first range as our base.
2420 const MCSymbol *Base = CU->getRanges()[0].getStart();
2421 Asm->EmitLabelDifference(Entry.getBeginSym(), Base, Size);
2422 Asm->EmitLabelDifference(Entry.getEndSym(), Base, Size);
2423 } else {
2424 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
2425 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
Devang Patelc26f5442011-04-28 02:22:40 +00002426 }
Stephen Hines36b56882014-04-23 16:57:46 -07002427
2428 emitDebugLocEntryLocation(Entry);
Devang Patelc3f5f782010-05-25 23:40:22 +00002429 }
Stephen Hines36b56882014-04-23 16:57:46 -07002430 Asm->OutStreamer.EmitIntValue(0, Size);
2431 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patelc3f5f782010-05-25 23:40:22 +00002432 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002433}
2434
Stephen Hines36b56882014-04-23 16:57:46 -07002435void DwarfDebug::emitDebugLocDWO() {
2436 Asm->OutStreamer.SwitchSection(
2437 Asm->getObjFileLowering().getDwarfLocDWOSection());
2438 for (const auto &DebugLoc : DotDebugLocEntries) {
2439 Asm->OutStreamer.EmitLabel(DebugLoc.Label);
2440 for (const auto &Entry : DebugLoc.List) {
2441 // Just always use start_length for now - at least that's one address
2442 // rather than two. We could get fancier and try to, say, reuse an
2443 // address we know we've emitted elsewhere (the start of the function?
2444 // The start of the CU or CU subrange that encloses this range?)
2445 Asm->EmitInt8(dwarf::DW_LLE_start_length_entry);
2446 unsigned idx = InfoHolder.getAddrPoolIndex(Entry.getBeginSym());
2447 Asm->EmitULEB128(idx);
2448 Asm->EmitLabelDifference(Entry.getEndSym(), Entry.getBeginSym(), 4);
Richard Mitton5cc319a2013-09-19 23:21:01 +00002449
Stephen Hines36b56882014-04-23 16:57:46 -07002450 emitDebugLocEntryLocation(Entry);
2451 }
2452 Asm->EmitInt8(dwarf::DW_LLE_end_of_list_entry);
Richard Mitton5cc319a2013-09-19 23:21:01 +00002453 }
Richard Mitton5cc319a2013-09-19 23:21:01 +00002454}
2455
2456struct ArangeSpan {
2457 const MCSymbol *Start, *End;
2458};
2459
2460// Emit a debug aranges section, containing a CU lookup for any
2461// address we can tie back to a CU.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00002462void DwarfDebug::emitDebugARanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002463 // Start the dwarf aranges section.
Stephen Hines36b56882014-04-23 16:57:46 -07002464 Asm->OutStreamer.SwitchSection(
2465 Asm->getObjFileLowering().getDwarfARangesSection());
Richard Mitton5cc319a2013-09-19 23:21:01 +00002466
Stephen Hines36b56882014-04-23 16:57:46 -07002467 typedef DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan> > SpansType;
Richard Mitton5cc319a2013-09-19 23:21:01 +00002468
2469 SpansType Spans;
2470
2471 // Build a list of sections used.
2472 std::vector<const MCSection *> Sections;
Stephen Hines36b56882014-04-23 16:57:46 -07002473 for (const auto &it : SectionMap) {
2474 const MCSection *Section = it.first;
Richard Mitton5cc319a2013-09-19 23:21:01 +00002475 Sections.push_back(Section);
2476 }
2477
2478 // Sort the sections into order.
2479 // This is only done to ensure consistent output order across different runs.
2480 std::sort(Sections.begin(), Sections.end(), SectionSort);
2481
2482 // Build a set of address spans, sorted by CU.
Stephen Hines36b56882014-04-23 16:57:46 -07002483 for (const MCSection *Section : Sections) {
Richard Mitton5cc319a2013-09-19 23:21:01 +00002484 SmallVector<SymbolCU, 8> &List = SectionMap[Section];
2485 if (List.size() < 2)
2486 continue;
2487
2488 // Sort the symbols by offset within the section.
Stephen Hines36b56882014-04-23 16:57:46 -07002489 std::sort(List.begin(), List.end(),
2490 [&](const SymbolCU &A, const SymbolCU &B) {
2491 unsigned IA = A.Sym ? Asm->OutStreamer.GetSymbolOrder(A.Sym) : 0;
2492 unsigned IB = B.Sym ? Asm->OutStreamer.GetSymbolOrder(B.Sym) : 0;
2493
2494 // Symbols with no order assigned should be placed at the end.
2495 // (e.g. section end labels)
2496 if (IA == 0)
2497 return false;
2498 if (IB == 0)
2499 return true;
2500 return IA < IB;
2501 });
Richard Mitton5cc319a2013-09-19 23:21:01 +00002502
2503 // If we have no section (e.g. common), just write out
2504 // individual spans for each symbol.
2505 if (Section == NULL) {
Stephen Hines36b56882014-04-23 16:57:46 -07002506 for (const SymbolCU &Cur : List) {
Richard Mitton5cc319a2013-09-19 23:21:01 +00002507 ArangeSpan Span;
2508 Span.Start = Cur.Sym;
2509 Span.End = NULL;
2510 if (Cur.CU)
2511 Spans[Cur.CU].push_back(Span);
2512 }
2513 } else {
2514 // Build spans between each label.
2515 const MCSymbol *StartSym = List[0].Sym;
Stephen Hines36b56882014-04-23 16:57:46 -07002516 for (size_t n = 1, e = List.size(); n < e; n++) {
Richard Mitton5cc319a2013-09-19 23:21:01 +00002517 const SymbolCU &Prev = List[n - 1];
2518 const SymbolCU &Cur = List[n];
2519
2520 // Try and build the longest span we can within the same CU.
2521 if (Cur.CU != Prev.CU) {
2522 ArangeSpan Span;
2523 Span.Start = StartSym;
2524 Span.End = Cur.Sym;
2525 Spans[Prev.CU].push_back(Span);
2526 StartSym = Cur.Sym;
2527 }
2528 }
2529 }
2530 }
2531
Richard Mitton5cc319a2013-09-19 23:21:01 +00002532 unsigned PtrSize = Asm->getDataLayout().getPointerSize();
2533
2534 // Build a list of CUs used.
Stephen Hines36b56882014-04-23 16:57:46 -07002535 std::vector<DwarfCompileUnit *> CUs;
2536 for (const auto &it : Spans) {
2537 DwarfCompileUnit *CU = it.first;
Richard Mitton5cc319a2013-09-19 23:21:01 +00002538 CUs.push_back(CU);
2539 }
2540
2541 // Sort the CU list (again, to ensure consistent output order).
Stephen Hines36b56882014-04-23 16:57:46 -07002542 std::sort(CUs.begin(), CUs.end(), [](const DwarfUnit *A, const DwarfUnit *B) {
2543 return A->getUniqueID() < B->getUniqueID();
2544 });
Richard Mitton5cc319a2013-09-19 23:21:01 +00002545
2546 // Emit an arange table for each CU we used.
Stephen Hines36b56882014-04-23 16:57:46 -07002547 for (DwarfCompileUnit *CU : CUs) {
Richard Mitton5cc319a2013-09-19 23:21:01 +00002548 std::vector<ArangeSpan> &List = Spans[CU];
2549
2550 // Emit size of content not including length itself.
Stephen Hines36b56882014-04-23 16:57:46 -07002551 unsigned ContentSize =
2552 sizeof(int16_t) + // DWARF ARange version number
2553 sizeof(int32_t) + // Offset of CU in the .debug_info section
2554 sizeof(int8_t) + // Pointer Size (in bytes)
2555 sizeof(int8_t); // Segment Size (in bytes)
Richard Mitton5cc319a2013-09-19 23:21:01 +00002556
2557 unsigned TupleSize = PtrSize * 2;
2558
2559 // 7.20 in the Dwarf specs requires the table to be aligned to a tuple.
Stephen Hines36b56882014-04-23 16:57:46 -07002560 unsigned Padding =
2561 OffsetToAlignment(sizeof(int32_t) + ContentSize, TupleSize);
Richard Mitton5cc319a2013-09-19 23:21:01 +00002562
2563 ContentSize += Padding;
2564 ContentSize += (List.size() + 1) * TupleSize;
2565
2566 // For each compile unit, write the list of spans it covers.
2567 Asm->OutStreamer.AddComment("Length of ARange Set");
2568 Asm->EmitInt32(ContentSize);
2569 Asm->OutStreamer.AddComment("DWARF Arange version number");
2570 Asm->EmitInt16(dwarf::DW_ARANGES_VERSION);
2571 Asm->OutStreamer.AddComment("Offset Into Debug Info Section");
Stephen Hines36b56882014-04-23 16:57:46 -07002572 Asm->EmitSectionOffset(CU->getLocalLabelBegin(), CU->getLocalSectionSym());
Richard Mitton5cc319a2013-09-19 23:21:01 +00002573 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2574 Asm->EmitInt8(PtrSize);
2575 Asm->OutStreamer.AddComment("Segment Size (in bytes)");
2576 Asm->EmitInt8(0);
2577
Stephen Hines36b56882014-04-23 16:57:46 -07002578 Asm->OutStreamer.EmitFill(Padding, 0xff);
Richard Mitton5cc319a2013-09-19 23:21:01 +00002579
Stephen Hines36b56882014-04-23 16:57:46 -07002580 for (const ArangeSpan &Span : List) {
Richard Mitton5cc319a2013-09-19 23:21:01 +00002581 Asm->EmitLabelReference(Span.Start, PtrSize);
2582
2583 // Calculate the size as being from the span start to it's end.
Richard Mittoneb46def2013-09-23 17:56:20 +00002584 if (Span.End) {
Richard Mitton5cc319a2013-09-19 23:21:01 +00002585 Asm->EmitLabelDifference(Span.End, Span.Start, PtrSize);
Richard Mittoneb46def2013-09-23 17:56:20 +00002586 } else {
2587 // For symbols without an end marker (e.g. common), we
2588 // write a single arange entry containing just that one symbol.
2589 uint64_t Size = SymSize[Span.Start];
2590 if (Size == 0)
2591 Size = 1;
2592
2593 Asm->OutStreamer.EmitIntValue(Size, PtrSize);
2594 }
Richard Mitton5cc319a2013-09-19 23:21:01 +00002595 }
2596
2597 Asm->OutStreamer.AddComment("ARange terminator");
2598 Asm->OutStreamer.EmitIntValue(0, PtrSize);
2599 Asm->OutStreamer.EmitIntValue(0, PtrSize);
2600 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002601}
2602
Eric Christopherb6dc8652012-11-27 22:43:45 +00002603// Emit visible names into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002604void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002605 // Start the dwarf ranges section.
Stephen Hines36b56882014-04-23 16:57:46 -07002606 Asm->OutStreamer.SwitchSection(
2607 Asm->getObjFileLowering().getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002608
Stephen Hines36b56882014-04-23 16:57:46 -07002609 // Size for our labels.
2610 unsigned char Size = Asm->getDataLayout().getPointerSize();
2611
2612 // Grab the specific ranges for the compile units in the module.
2613 for (const auto &I : CUMap) {
2614 DwarfCompileUnit *TheCU = I.second;
2615
2616 // Emit a symbol so we can find the beginning of our ranges.
2617 Asm->OutStreamer.EmitLabel(TheCU->getLabelRange());
2618
2619 // Iterate over the misc ranges for the compile units in the module.
2620 for (const RangeSpanList &List : TheCU->getRangeLists()) {
2621 // Emit our symbol so we can find the beginning of the range.
2622 Asm->OutStreamer.EmitLabel(List.getSym());
2623
2624 for (const RangeSpan &Range : List.getRanges()) {
2625 const MCSymbol *Begin = Range.getStart();
2626 const MCSymbol *End = Range.getEnd();
2627 assert(Begin && "Range without a begin symbol?");
2628 assert(End && "Range without an end symbol?");
2629 Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2630 Asm->OutStreamer.EmitSymbolValue(End, Size);
2631 }
2632
2633 // And terminate the list with two 0 values.
2634 Asm->OutStreamer.EmitIntValue(0, Size);
2635 Asm->OutStreamer.EmitIntValue(0, Size);
2636 }
2637
2638 // Now emit a range for the CU itself.
2639 if (TheCU->getRanges().size() > 1) {
2640 Asm->OutStreamer.EmitLabel(
2641 Asm->GetTempSymbol("cu_ranges", TheCU->getUniqueID()));
2642 for (const RangeSpan &Range : TheCU->getRanges()) {
2643 const MCSymbol *Begin = Range.getStart();
2644 const MCSymbol *End = Range.getEnd();
2645 assert(Begin && "Range without a begin symbol?");
2646 assert(End && "Range without an end symbol?");
2647 Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2648 Asm->OutStreamer.EmitSymbolValue(End, Size);
2649 }
2650 // And terminate the list with two 0 values.
2651 Asm->OutStreamer.EmitIntValue(0, Size);
2652 Asm->OutStreamer.EmitIntValue(0, Size);
2653 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002654 }
2655}
2656
Eric Christopher0b944ee2012-12-11 19:42:09 +00002657// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher98e237f2012-11-30 23:59:06 +00002658
Stephen Hines36b56882014-04-23 16:57:46 -07002659void DwarfDebug::initSkeletonUnit(const DwarfUnit *U, DIE *Die,
2660 DwarfUnit *NewU) {
2661 NewU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
2662 U->getCUNode().getSplitDebugFilename());
Eric Christopher98e237f2012-11-30 23:59:06 +00002663
2664 if (!CompilationDir.empty())
Stephen Hines36b56882014-04-23 16:57:46 -07002665 NewU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher98e237f2012-11-30 23:59:06 +00002666
Stephen Hines36b56882014-04-23 16:57:46 -07002667 addGnuPubAttributes(NewU, Die);
Eric Christophera6d84152013-09-30 23:14:16 +00002668
Stephen Hines36b56882014-04-23 16:57:46 -07002669 SkeletonHolder.addUnit(NewU);
2670}
Eric Christopher8f1a9292013-09-13 00:35:05 +00002671
Stephen Hines36b56882014-04-23 16:57:46 -07002672// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2673// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2674// DW_AT_addr_base, DW_AT_ranges_base.
2675DwarfCompileUnit *DwarfDebug::constructSkeletonCU(const DwarfCompileUnit *CU) {
Eric Christopher451c71d2013-10-01 00:43:36 +00002676
Stephen Hines36b56882014-04-23 16:57:46 -07002677 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
2678 DwarfCompileUnit *NewCU = new DwarfCompileUnit(
2679 CU->getUniqueID(), Die, CU->getCUNode(), Asm, this, &SkeletonHolder);
2680 NewCU->initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
2681 DwarfInfoSectionSym);
2682
2683 NewCU->initStmtList(DwarfLineSectionSym);
2684
2685 initSkeletonUnit(CU, Die, NewCU);
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002686
Eric Christopher98e237f2012-11-30 23:59:06 +00002687 return NewCU;
2688}
2689
Stephen Hines36b56882014-04-23 16:57:46 -07002690// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_dwo_name,
2691// DW_AT_addr_base.
2692DwarfTypeUnit *DwarfDebug::constructSkeletonTU(DwarfTypeUnit *TU) {
2693 DwarfCompileUnit &CU = static_cast<DwarfCompileUnit &>(
2694 *SkeletonHolder.getUnits()[TU->getCU().getUniqueID()]);
2695
2696 DIE *Die = new DIE(dwarf::DW_TAG_type_unit);
2697 DwarfTypeUnit *NewTU =
2698 new DwarfTypeUnit(TU->getUniqueID(), Die, CU, Asm, this, &SkeletonHolder);
2699 NewTU->setTypeSignature(TU->getTypeSignature());
2700 NewTU->setType(NULL);
2701 NewTU->initSection(
2702 Asm->getObjFileLowering().getDwarfTypesSection(TU->getTypeSignature()));
2703
2704 initSkeletonUnit(TU, Die, NewTU);
2705 return NewTU;
Eric Christopher98e237f2012-11-30 23:59:06 +00002706}
2707
Eric Christopher0b944ee2012-12-11 19:42:09 +00002708// Emit the .debug_info.dwo section for separated dwarf. This contains the
2709// compile units that would normally be in debug_info.
Eric Christopher98e237f2012-11-30 23:59:06 +00002710void DwarfDebug::emitDebugInfoDWO() {
Eric Christopher4daaed12012-12-10 19:51:21 +00002711 assert(useSplitDwarf() && "No split dwarf debug info?");
Stephen Hines36b56882014-04-23 16:57:46 -07002712 // Don't pass an abbrev symbol, using a constant zero instead so as not to
2713 // emit relocations into the dwo file.
2714 InfoHolder.emitUnits(this, /* AbbrevSymbol */nullptr);
Eric Christopher6eebe472012-12-19 22:02:53 +00002715}
2716
2717// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2718// abbreviations for the .debug_info.dwo section.
2719void DwarfDebug::emitDebugAbbrevDWO() {
2720 assert(useSplitDwarf() && "No split dwarf?");
Stephen Hines36b56882014-04-23 16:57:46 -07002721 InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection());
2722}
2723
2724void DwarfDebug::emitDebugLineDWO() {
2725 assert(useSplitDwarf() && "No split dwarf?");
2726 Asm->OutStreamer.SwitchSection(
2727 Asm->getObjFileLowering().getDwarfLineDWOSection());
2728 SplitTypeUnitFileTable.Emit(Asm->OutStreamer);
Eric Christopher98e237f2012-11-30 23:59:06 +00002729}
Eric Christopher64f824c2012-12-27 02:14:01 +00002730
2731// Emit the .debug_str.dwo section for separated dwarf. This contains the
2732// string section and is identical in format to traditional .debug_str
2733// sections.
2734void DwarfDebug::emitDebugStrDWO() {
2735 assert(useSplitDwarf() && "No split dwarf?");
Stephen Hines36b56882014-04-23 16:57:46 -07002736 const MCSection *OffSec =
2737 Asm->getObjFileLowering().getDwarfStrOffDWOSection();
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002738 const MCSymbol *StrSym = DwarfStrSectionSym;
2739 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2740 OffSec, StrSym);
Eric Christopher64f824c2012-12-27 02:14:01 +00002741}
Stephen Hines36b56882014-04-23 16:57:46 -07002742
2743MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) {
2744 if (!useSplitDwarf())
2745 return nullptr;
2746 if (SingleCU)
2747 SplitTypeUnitFileTable.setCompilationDir(CU.getCUNode().getDirectory());
2748 return &SplitTypeUnitFileTable;
2749}
2750
2751void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU,
2752 StringRef Identifier, DIE *RefDie,
2753 DICompositeType CTy) {
2754 // Flag the type unit reference as a declaration so that if it contains
2755 // members (implicit special members, static data member definitions, member
2756 // declarations for definitions in this CU, etc) consumers don't get confused
2757 // and think this is a full definition.
2758 CU.addFlag(RefDie, dwarf::DW_AT_declaration);
2759
2760 const DwarfTypeUnit *&TU = DwarfTypeUnits[CTy];
2761 if (TU) {
2762 CU.addDIETypeSignature(RefDie, *TU);
2763 return;
2764 }
2765
2766 DIE *UnitDie = new DIE(dwarf::DW_TAG_type_unit);
2767 DwarfTypeUnit *NewTU =
2768 new DwarfTypeUnit(InfoHolder.getUnits().size(), UnitDie, CU, Asm, this,
2769 &InfoHolder, getDwoLineTable(CU));
2770 TU = NewTU;
2771 InfoHolder.addUnit(NewTU);
2772
2773 NewTU->addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
2774 CU.getLanguage());
2775
2776 MD5 Hash;
2777 Hash.update(Identifier);
2778 // ... take the least significant 8 bytes and return those. Our MD5
2779 // implementation always returns its results in little endian, swap bytes
2780 // appropriately.
2781 MD5::MD5Result Result;
2782 Hash.final(Result);
2783 uint64_t Signature = *reinterpret_cast<support::ulittle64_t *>(Result + 8);
2784 NewTU->setTypeSignature(Signature);
2785 if (useSplitDwarf())
2786 NewTU->setSkeleton(constructSkeletonTU(NewTU));
2787 else
2788 CU.applyStmtList(*UnitDie);
2789
2790 NewTU->setType(NewTU->createTypeDIE(CTy));
2791
2792 NewTU->initSection(
2793 useSplitDwarf()
2794 ? Asm->getObjFileLowering().getDwarfTypesDWOSection(Signature)
2795 : Asm->getObjFileLowering().getDwarfTypesSection(Signature));
2796
2797 CU.addDIETypeSignature(RefDie, *NewTU);
2798}
2799
2800void DwarfDebug::attachLowHighPC(DwarfCompileUnit *Unit, DIE *D,
2801 MCSymbol *Begin, MCSymbol *End) {
2802 Unit->addLabelAddress(D, dwarf::DW_AT_low_pc, Begin);
2803 if (DwarfVersion < 4)
2804 Unit->addLabelAddress(D, dwarf::DW_AT_high_pc, End);
2805 else
2806 Unit->addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin);
2807}