blob: 71d076eb4801018d10f6cd40c1672cda68b98c87 [file] [log] [blame]
Bill Wendling2f921f82009-05-15 09:23:25 +00001//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf debug info into asm files.
11//
12//===----------------------------------------------------------------------===//
Chris Lattnerb14490d2010-03-09 00:39:24 +000013
Eric Christopher29e874d2014-03-07 22:40:37 +000014#include "ByteStreamer.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000015#include "DwarfDebug.h"
Chris Lattner3f3fb972010-04-05 05:24:55 +000016#include "DIE.h"
Eric Christopher45731982013-08-08 23:45:55 +000017#include "DIEHash.h"
David Blaikie2c86a722013-12-02 19:33:15 +000018#include "DwarfUnit.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000019#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/Statistic.h"
21#include "llvm/ADT/StringExtras.h"
22#include "llvm/ADT/Triple.h"
David Greene829b3e82009-08-19 21:52:55 +000023#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000024#include "llvm/CodeGen/MachineModuleInfo.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000025#include "llvm/IR/Constants.h"
Chandler Carruth12664a02014-03-06 00:22:06 +000026#include "llvm/IR/DIBuilder.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000027#include "llvm/IR/DataLayout.h"
Chandler Carruth9a4c9e52014-03-06 00:46:21 +000028#include "llvm/IR/DebugInfo.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000029#include "llvm/IR/Instructions.h"
30#include "llvm/IR/Module.h"
Chandler Carruth4220e9c2014-03-04 11:17:44 +000031#include "llvm/IR/ValueHandle.h"
Chris Lattnere13c3722010-03-09 01:58:53 +000032#include "llvm/MC/MCAsmInfo.h"
Chris Lattner4d2c0f92009-07-31 18:48:30 +000033#include "llvm/MC/MCSection.h"
Chris Lattner4b7dadb2009-08-19 05:49:37 +000034#include "llvm/MC/MCStreamer.h"
Chris Lattnere13c3722010-03-09 01:58:53 +000035#include "llvm/MC/MCSymbol.h"
Devang Patel6c74a872010-04-27 19:46:33 +000036#include "llvm/Support/CommandLine.h"
Daniel Dunbarcdf01b52009-10-13 06:47:08 +000037#include "llvm/Support/Debug.h"
David Majnemered89b5c2013-08-21 06:13:34 +000038#include "llvm/Support/Dwarf.h"
Saleem Abdulrasool271ac582014-07-14 16:28:09 +000039#include "llvm/Support/Endian.h"
Daniel Dunbarcdf01b52009-10-13 06:47:08 +000040#include "llvm/Support/ErrorHandling.h"
Chris Lattnerf5c834f2010-01-22 22:09:00 +000041#include "llvm/Support/FormattedStream.h"
Logan Chien5b776b72014-02-22 14:00:39 +000042#include "llvm/Support/LEB128.h"
Eric Christopher67646432013-07-26 17:02:41 +000043#include "llvm/Support/MD5.h"
Michael J. Spencer447762d2010-11-29 18:16:10 +000044#include "llvm/Support/Path.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000045#include "llvm/Support/Timer.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000046#include "llvm/Target/TargetFrameLowering.h"
47#include "llvm/Target/TargetLoweringObjectFile.h"
48#include "llvm/Target/TargetMachine.h"
49#include "llvm/Target/TargetOptions.h"
50#include "llvm/Target/TargetRegisterInfo.h"
Eric Christopherd9134482014-08-04 21:25:23 +000051#include "llvm/Target/TargetSubtargetInfo.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000052using namespace llvm;
53
Chandler Carruth1b9dde02014-04-22 02:02:50 +000054#define DEBUG_TYPE "dwarfdebug"
55
Eric Christopher7f2b5512013-07-23 22:16:41 +000056static cl::opt<bool>
57DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden,
58 cl::desc("Disable debug info printing"));
Devang Patel6c74a872010-04-27 19:46:33 +000059
Eric Christopher7f2b5512013-07-23 22:16:41 +000060static cl::opt<bool> UnknownLocations(
61 "use-unknown-locations", cl::Hidden,
62 cl::desc("Make an absence of debug location information explicit."),
63 cl::init(false));
Dan Gohman7421ae42010-05-07 01:08:53 +000064
Eric Christopherdd1a0122013-09-13 00:35:05 +000065static cl::opt<bool>
66GenerateGnuPubSections("generate-gnu-dwarf-pub-sections", cl::Hidden,
67 cl::desc("Generate GNU-style pubnames and pubtypes"),
68 cl::init(false));
69
Eric Christopher02dbadb2014-02-14 01:26:55 +000070static cl::opt<bool> GenerateARangeSection("generate-arange-section",
71 cl::Hidden,
72 cl::desc("Generate dwarf aranges"),
73 cl::init(false));
74
Eric Christopher20b76a72012-08-23 22:36:40 +000075namespace {
Eric Christopherf07ee3a2014-01-27 23:50:03 +000076enum DefaultOnOff { Default, Enable, Disable };
Eric Christopher20b76a72012-08-23 22:36:40 +000077}
Eric Christopher4996c702011-11-07 09:24:32 +000078
Eric Christopher7f2b5512013-07-23 22:16:41 +000079static cl::opt<DefaultOnOff>
80DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
81 cl::desc("Output prototype dwarf accelerator tables."),
82 cl::values(clEnumVal(Default, "Default for platform"),
83 clEnumVal(Enable, "Enabled"),
84 clEnumVal(Disable, "Disabled"), clEnumValEnd),
85 cl::init(Default));
Eric Christopher20b76a72012-08-23 22:36:40 +000086
Eric Christopher7f2b5512013-07-23 22:16:41 +000087static cl::opt<DefaultOnOff>
Eric Christopher7f2b5512013-07-23 22:16:41 +000088SplitDwarf("split-dwarf", cl::Hidden,
Eric Christopher5d008fe2013-12-04 23:24:28 +000089 cl::desc("Output DWARF5 split debug info."),
Eric Christopher7f2b5512013-07-23 22:16:41 +000090 cl::values(clEnumVal(Default, "Default for platform"),
91 clEnumVal(Enable, "Enabled"),
92 clEnumVal(Disable, "Disabled"), clEnumValEnd),
93 cl::init(Default));
Eric Christopher29424312012-11-12 22:22:20 +000094
Eric Christopher7da24882013-08-19 21:07:38 +000095static cl::opt<DefaultOnOff>
Eric Christopher4d36ca02013-08-26 23:24:35 +000096DwarfPubSections("generate-dwarf-pub-sections", cl::Hidden,
97 cl::desc("Generate DWARF pubnames and pubtypes sections"),
98 cl::values(clEnumVal(Default, "Default for platform"),
99 clEnumVal(Enable, "Enabled"),
100 clEnumVal(Disable, "Disabled"), clEnumValEnd),
101 cl::init(Default));
Eric Christopher7da24882013-08-19 21:07:38 +0000102
Benjamin Kramerb12cf012013-08-24 12:54:27 +0000103static const char *const DWARFGroupName = "DWARF Emission";
104static const char *const DbgTimerName = "DWARF Debug Writer";
Bill Wendlingfcc14142010-04-07 09:28:04 +0000105
Bill Wendling2f921f82009-05-15 09:23:25 +0000106//===----------------------------------------------------------------------===//
107
Manman Renbe5576f2013-10-08 19:07:44 +0000108/// resolve - Look in the DwarfDebug map for the MDNode that
109/// corresponds to the reference.
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000110template <typename T> T DbgVariable::resolve(DIRef<T> Ref) const {
Manman Renbe5576f2013-10-08 19:07:44 +0000111 return DD->resolve(Ref);
112}
113
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000114bool DbgVariable::isBlockByrefVariable() const {
115 assert(Var.isVariable() && "Invalid complex DbgVariable!");
116 return Var.isBlockByrefVariable(DD->getTypeIdentifierMap());
117}
118
Nick Lewycky019d2552011-07-29 03:49:23 +0000119DIType DbgVariable::getType() const {
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000120 DIType Ty = Var.getType().resolve(DD->getTypeIdentifierMap());
Devang Patelf20c4f72011-04-12 22:53:02 +0000121 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
122 // addresses instead.
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000123 if (Var.isBlockByrefVariable(DD->getTypeIdentifierMap())) {
Devang Patelf20c4f72011-04-12 22:53:02 +0000124 /* Byref variables, in Blocks, are declared by the programmer as
125 "SomeType VarName;", but the compiler creates a
126 __Block_byref_x_VarName struct, and gives the variable VarName
127 either the struct, or a pointer to the struct, as its type. This
128 is necessary for various behind-the-scenes things the compiler
129 needs to do with by-reference variables in blocks.
Eric Christopher6a841382012-11-19 22:42:10 +0000130
Devang Patelf20c4f72011-04-12 22:53:02 +0000131 However, as far as the original *programmer* is concerned, the
132 variable should still have type 'SomeType', as originally declared.
Eric Christopher6a841382012-11-19 22:42:10 +0000133
Devang Patelf20c4f72011-04-12 22:53:02 +0000134 The following function dives into the __Block_byref_x_VarName
135 struct to find the original type of the variable. This will be
136 passed back to the code generating the type for the Debug
137 Information Entry for the variable 'VarName'. 'VarName' will then
138 have the original type 'SomeType' in its debug information.
Eric Christopher6a841382012-11-19 22:42:10 +0000139
Devang Patelf20c4f72011-04-12 22:53:02 +0000140 The original type 'SomeType' will be the type of the field named
141 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher6a841382012-11-19 22:42:10 +0000142
Devang Patelf20c4f72011-04-12 22:53:02 +0000143 NOTE: In order for this to not completely fail on the debugger
144 side, the Debug Information Entry for the variable VarName needs to
145 have a DW_AT_location that tells the debugger how to unwind through
146 the pointers and __Block_byref_x_VarName struct to find the actual
147 value of the variable. The function addBlockByrefType does this. */
148 DIType subType = Ty;
Eric Christopher31b05762013-08-08 01:41:00 +0000149 uint16_t tag = Ty.getTag();
Eric Christopher6a841382012-11-19 22:42:10 +0000150
Eric Christopher9adc55f2013-09-04 19:53:21 +0000151 if (tag == dwarf::DW_TAG_pointer_type)
Manman Renbe5576f2013-10-08 19:07:44 +0000152 subType = resolve(DIDerivedType(Ty).getTypeDerivedFrom());
Eric Christopher6a841382012-11-19 22:42:10 +0000153
Manman Renab8ffba2014-07-28 19:14:13 +0000154 DIArray Elements = DICompositeType(subType).getElements();
Devang Patelf20c4f72011-04-12 22:53:02 +0000155 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
David Blaikie5af2aca2013-11-18 23:57:26 +0000156 DIDerivedType DT(Elements.getElement(i));
Devang Patelf20c4f72011-04-12 22:53:02 +0000157 if (getName() == DT.getName())
Manman Renbe5576f2013-10-08 19:07:44 +0000158 return (resolve(DT.getTypeDerivedFrom()));
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000159 }
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000160 }
Devang Patelf20c4f72011-04-12 22:53:02 +0000161 return Ty;
162}
Bill Wendling2f921f82009-05-15 09:23:25 +0000163
David Blaikie18d33752014-04-24 01:23:49 +0000164static LLVM_CONSTEXPR DwarfAccelTable::Atom TypeAtoms[] = {
165 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4),
166 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag, dwarf::DW_FORM_data2),
167 DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags, dwarf::DW_FORM_data1)};
168
Chris Lattnerf0d6bd32010-04-05 05:11:15 +0000169DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Craig Topper353eda42014-04-24 06:44:33 +0000170 : Asm(A), MMI(Asm->MMI), FirstCU(nullptr), PrevLabel(nullptr),
171 GlobalRangeCount(0), InfoHolder(A, "info_string", DIEValueAllocator),
Eric Christopher2037caf2014-01-28 00:49:26 +0000172 UsedNonDefaultText(false),
David Blaikie2406a0622014-04-23 23:37:35 +0000173 SkeletonHolder(A, "skel_string", DIEValueAllocator),
David Blaikiee1c79742014-09-30 21:28:32 +0000174 IsDarwin(Triple(A->getTargetTriple()).isOSDarwin()),
David Blaikie2406a0622014-04-23 23:37:35 +0000175 AccelNames(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
David Blaikie0ee82b92014-04-24 00:53:32 +0000176 dwarf::DW_FORM_data4)),
177 AccelObjC(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
David Blaikieecf04152014-04-24 01:02:42 +0000178 dwarf::DW_FORM_data4)),
179 AccelNamespace(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
David Blaikie18d33752014-04-24 01:23:49 +0000180 dwarf::DW_FORM_data4)),
181 AccelTypes(TypeAtoms) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000182
Craig Topper353eda42014-04-24 06:44:33 +0000183 DwarfInfoSectionSym = DwarfAbbrevSectionSym = DwarfStrSectionSym = nullptr;
184 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = nullptr;
185 DwarfLineSectionSym = nullptr;
186 DwarfAddrSectionSym = nullptr;
187 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = nullptr;
188 FunctionBeginSym = FunctionEndSym = nullptr;
189 CurFn = nullptr;
190 CurMI = nullptr;
Eric Christopherad9fe892012-04-02 17:58:52 +0000191
Adrian Prantl5bf1d002013-10-15 20:26:37 +0000192 // Turn on accelerator tables for Darwin by default, pubnames by
193 // default for non-Darwin, and handle split dwarf.
Eric Christopher574b5c82013-08-19 21:41:38 +0000194 if (DwarfAccelTables == Default)
195 HasDwarfAccelTables = IsDarwin;
196 else
Eric Christopher5297df02013-08-26 20:58:35 +0000197 HasDwarfAccelTables = DwarfAccelTables == Enable;
Eric Christopher20b76a72012-08-23 22:36:40 +0000198
Eric Christophercdf218d2012-12-10 19:51:21 +0000199 if (SplitDwarf == Default)
200 HasSplitDwarf = false;
Eric Christopher29424312012-11-12 22:22:20 +0000201 else
Eric Christopher574b5c82013-08-19 21:41:38 +0000202 HasSplitDwarf = SplitDwarf == Enable;
Eric Christopher29424312012-11-12 22:22:20 +0000203
Eric Christopher4d36ca02013-08-26 23:24:35 +0000204 if (DwarfPubSections == Default)
205 HasDwarfPubSections = !IsDarwin;
Eric Christopher574b5c82013-08-19 21:41:38 +0000206 else
Eric Christopher4d36ca02013-08-26 23:24:35 +0000207 HasDwarfPubSections = DwarfPubSections == Enable;
Eric Christopher7da24882013-08-19 21:07:38 +0000208
Eric Christopher4c5bff32014-06-19 06:22:08 +0000209 unsigned DwarfVersionNumber = Asm->TM.Options.MCOptions.DwarfVersion;
Eric Christopher793c7472014-04-28 20:42:22 +0000210 DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber
211 : MMI->getModule()->getDwarfVersion();
Manman Renac8062b2013-07-02 23:40:10 +0000212
Oliver Stannardf7693f42014-06-19 15:39:33 +0000213 Asm->OutStreamer.getContext().setDwarfVersion(DwarfVersion);
214
Dan Gohman6e681a52010-06-18 15:56:31 +0000215 {
216 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopher58f41952012-11-19 22:42:15 +0000217 beginModule();
Torok Edwinf8dba242010-04-07 10:44:46 +0000218 }
Bill Wendling2f921f82009-05-15 09:23:25 +0000219}
Bill Wendling2f921f82009-05-15 09:23:25 +0000220
Reid Klecknerdd2647e2014-04-30 20:34:31 +0000221// Define out of line so we don't have to include DwarfUnit.h in DwarfDebug.h.
222DwarfDebug::~DwarfDebug() { }
223
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000224// Switch to the specified MCSection and emit an assembler
225// temporary label to it if SymbolStem is specified.
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000226static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Craig Topper353eda42014-04-24 06:44:33 +0000227 const char *SymbolStem = nullptr) {
Eric Christophera7b61892011-11-07 09:18:38 +0000228 Asm->OutStreamer.SwitchSection(Section);
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000229 if (!SymbolStem)
Craig Topper353eda42014-04-24 06:44:33 +0000230 return nullptr;
Eric Christophera7b61892011-11-07 09:18:38 +0000231
232 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
233 Asm->OutStreamer.EmitLabel(TmpSym);
234 return TmpSym;
235}
236
Eric Christopherd9843b32011-11-10 19:25:34 +0000237static bool isObjCClass(StringRef Name) {
238 return Name.startswith("+") || Name.startswith("-");
239}
240
241static bool hasObjCCategory(StringRef Name) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000242 if (!isObjCClass(Name))
243 return false;
Eric Christopherd9843b32011-11-10 19:25:34 +0000244
Benjamin Kramer260de742013-08-24 12:15:54 +0000245 return Name.find(") ") != StringRef::npos;
Eric Christopherd9843b32011-11-10 19:25:34 +0000246}
247
248static void getObjCClassCategory(StringRef In, StringRef &Class,
249 StringRef &Category) {
250 if (!hasObjCCategory(In)) {
251 Class = In.slice(In.find('[') + 1, In.find(' '));
252 Category = "";
253 return;
254 }
255
256 Class = In.slice(In.find('[') + 1, In.find('('));
257 Category = In.slice(In.find('[') + 1, In.find(' '));
258 return;
259}
260
261static StringRef getObjCMethodName(StringRef In) {
262 return In.slice(In.find(' ') + 1, In.find(']'));
263}
264
Richard Mittonc2508242013-10-03 22:07:08 +0000265// Helper for sorting sections into a stable output order.
266static bool SectionSort(const MCSection *A, const MCSection *B) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000267 std::string LA = (A ? A->getLabelBeginName() : "");
268 std::string LB = (B ? B->getLabelBeginName() : "");
269 return LA < LB;
Richard Mittonc2508242013-10-03 22:07:08 +0000270}
271
Eric Christopherd9843b32011-11-10 19:25:34 +0000272// Add the various names to the Dwarf accelerator table names.
Eric Christopher9cd26af2013-09-20 23:22:52 +0000273// TODO: Determine whether or not we should add names for programs
274// that do not have a DW_AT_name or DW_AT_linkage_name field - this
275// is only slightly different than the lookup of non-standard ObjC names.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000276void DwarfDebug::addSubprogramNames(DISubprogram SP, DIE &Die) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000277 if (!SP.isDefinition())
278 return;
David Blaikie2406a0622014-04-23 23:37:35 +0000279 addAccelName(SP.getName(), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000280
281 // If the linkage name is different than the name, go ahead and output
282 // that as well into the name table.
283 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
David Blaikie2406a0622014-04-23 23:37:35 +0000284 addAccelName(SP.getLinkageName(), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000285
286 // If this is an Objective-C selector name add it to the ObjC accelerator
287 // too.
288 if (isObjCClass(SP.getName())) {
289 StringRef Class, Category;
290 getObjCClassCategory(SP.getName(), Class, Category);
David Blaikie0ee82b92014-04-24 00:53:32 +0000291 addAccelObjC(Class, Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000292 if (Category != "")
David Blaikie0ee82b92014-04-24 00:53:32 +0000293 addAccelObjC(Category, Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000294 // Also add the base method name to the name table.
David Blaikie2406a0622014-04-23 23:37:35 +0000295 addAccelName(getObjCMethodName(SP.getName()), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000296 }
297}
298
Manman Ren3eb9dff2013-09-09 19:05:21 +0000299/// isSubprogramContext - Return true if Context is either a subprogram
300/// or another context nested inside a subprogram.
301bool DwarfDebug::isSubprogramContext(const MDNode *Context) {
302 if (!Context)
303 return false;
304 DIDescriptor D(Context);
305 if (D.isSubprogram())
306 return true;
307 if (D.isType())
Manman Ren116868e2013-09-09 19:47:11 +0000308 return isSubprogramContext(resolve(DIType(Context).getContext()));
Manman Ren3eb9dff2013-09-09 19:05:21 +0000309 return false;
310}
311
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000312// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
313// and DW_AT_high_pc attributes. If there are global variables in this
314// scope then create and insert DIEs for these variables.
David Blaikiee872a6e2014-04-29 15:58:35 +0000315DIE &DwarfDebug::updateSubprogramScopeDIE(DwarfCompileUnit &SPCU,
Eric Christopher4287a492013-12-09 23:57:44 +0000316 DISubprogram SP) {
David Blaikie3c2fff32014-05-27 18:37:48 +0000317 DIE *SPDie = SPCU.getOrCreateSubprogramDIE(SP);
Devang Patela37a95e2010-07-07 22:20:57 +0000318
David Blaikie65a74662014-04-25 18:26:14 +0000319 attachLowHighPC(SPCU, *SPDie, FunctionBeginSym, FunctionEndSym);
Eric Christopher0f63d062013-12-03 00:45:45 +0000320
David Blaikie03c3dbe2014-09-19 04:55:05 +0000321 // Only include DW_AT_frame_base in full debug info
322 if (SPCU.getCUNode().getEmissionKind() != DIBuilder::LineTablesOnly) {
323 const TargetRegisterInfo *RI =
324 Asm->TM.getSubtargetImpl()->getRegisterInfo();
325 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
326 SPCU.addAddress(*SPDie, dwarf::DW_AT_frame_base, Location);
327 }
Devang Patel6efc8e52010-02-06 01:02:37 +0000328
Eric Christopherd9843b32011-11-10 19:25:34 +0000329 // Add name to the name table, we do this here because we're guaranteed
330 // to have concrete versions of our DW_TAG_subprogram nodes.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000331 addSubprogramNames(SP, *SPDie);
Eric Christopher6a841382012-11-19 22:42:10 +0000332
David Blaikiee872a6e2014-04-29 15:58:35 +0000333 return *SPDie;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000334}
335
Manman Ren5b2f4b02013-09-11 19:40:28 +0000336/// Check whether we should create a DIE for the given Scope, return true
337/// if we don't create a DIE (the corresponding DIE is null).
Manman Ren2312ed32013-09-10 18:40:41 +0000338bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
339 if (Scope->isAbstractScope())
340 return false;
341
Manman Ren5b2f4b02013-09-11 19:40:28 +0000342 // We don't create a DIE if there is no Range.
Manman Ren2312ed32013-09-10 18:40:41 +0000343 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
344 if (Ranges.empty())
345 return true;
346
347 if (Ranges.size() > 1)
348 return false;
349
Manman Ren5b2f4b02013-09-11 19:40:28 +0000350 // We don't create a DIE if we have a single Range and the end label
351 // is null.
David Blaikiecd4b8a22014-08-31 02:14:26 +0000352 return !getLabelAfterInsn(Ranges.front().second);
Manman Ren2312ed32013-09-10 18:40:41 +0000353}
354
David Blaikie65a74662014-04-25 18:26:14 +0000355static void addSectionLabel(AsmPrinter &Asm, DwarfUnit &U, DIE &D,
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000356 dwarf::Attribute A, const MCSymbol *L,
357 const MCSymbol *Sec) {
David Blaikief9b6a552014-04-22 22:39:41 +0000358 if (Asm.MAI->doesDwarfUseRelocationsAcrossSections())
359 U.addSectionLabel(D, A, L);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000360 else
David Blaikief9b6a552014-04-22 22:39:41 +0000361 U.addSectionDelta(D, A, L, Sec);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000362}
363
David Blaikie65a74662014-04-25 18:26:14 +0000364void DwarfDebug::addScopeRangeList(DwarfCompileUnit &TheCU, DIE &ScopeDIE,
Eric Christopherbe2513e2013-12-03 00:45:59 +0000365 const SmallVectorImpl<InsnRange> &Range) {
366 // Emit offset in .debug_range as a relocatable label. emitDIE will handle
367 // emitting it appropriately.
Eric Christopherf8790642013-12-04 22:04:50 +0000368 MCSymbol *RangeSym = Asm->GetTempSymbol("debug_ranges", GlobalRangeCount++);
David Blaikie26b2bd02014-03-24 21:07:27 +0000369
370 // Under fission, ranges are specified by constant offsets relative to the
371 // CU's DW_AT_GNU_ranges_base.
372 if (useSplitDwarf())
David Blaikief9b6a552014-04-22 22:39:41 +0000373 TheCU.addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
David Blaikie637cac42014-04-22 23:09:36 +0000374 DwarfDebugRangeSectionSym);
David Blaikie26b2bd02014-03-24 21:07:27 +0000375 else
David Blaikief9b6a552014-04-22 22:39:41 +0000376 addSectionLabel(*Asm, TheCU, ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
David Blaikie26b2bd02014-03-24 21:07:27 +0000377 DwarfDebugRangeSectionSym);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000378
Eric Christopherf8790642013-12-04 22:04:50 +0000379 RangeSpanList List(RangeSym);
Benjamin Kramer15596c72014-03-07 19:09:39 +0000380 for (const InsnRange &R : Range) {
381 RangeSpan Span(getLabelBeforeInsn(R.first), getLabelAfterInsn(R.second));
Chandler Carruth002da5d2014-03-02 04:08:41 +0000382 List.addRange(std::move(Span));
Eric Christopherbe2513e2013-12-03 00:45:59 +0000383 }
384
385 // Add the range list to the set of ranges to be emitted.
David Blaikief9b6a552014-04-22 22:39:41 +0000386 TheCU.addRangeList(std::move(List));
Eric Christopherbe2513e2013-12-03 00:45:59 +0000387}
388
David Blaikie4a3b84d2014-05-16 16:42:40 +0000389void DwarfDebug::attachRangesOrLowHighPC(DwarfCompileUnit &TheCU, DIE &Die,
390 const SmallVectorImpl<InsnRange> &Ranges) {
391 assert(!Ranges.empty());
392 if (Ranges.size() == 1)
393 attachLowHighPC(TheCU, Die, getLabelBeforeInsn(Ranges.front().first),
394 getLabelAfterInsn(Ranges.front().second));
395 else
396 addScopeRangeList(TheCU, Die, Ranges);
397}
398
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000399// Construct new DW_TAG_lexical_block for this scope and attach
400// DW_AT_low_pc/DW_AT_high_pc labels.
David Blaikief2449222014-04-28 20:36:45 +0000401std::unique_ptr<DIE>
402DwarfDebug::constructLexicalScopeDIE(DwarfCompileUnit &TheCU,
403 LexicalScope *Scope) {
Manman Ren2312ed32013-09-10 18:40:41 +0000404 if (isLexicalScopeDIENull(Scope))
Craig Topper353eda42014-04-24 06:44:33 +0000405 return nullptr;
Manman Ren2312ed32013-09-10 18:40:41 +0000406
David Blaikief2449222014-04-28 20:36:45 +0000407 auto ScopeDIE = make_unique<DIE>(dwarf::DW_TAG_lexical_block);
Devang Patel6c74a872010-04-27 19:46:33 +0000408 if (Scope->isAbstractScope())
409 return ScopeDIE;
410
David Blaikie4a3b84d2014-05-16 16:42:40 +0000411 attachRangesOrLowHighPC(TheCU, *ScopeDIE, Scope->getRanges());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000412
413 return ScopeDIE;
414}
415
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000416// This scope represents inlined body of a function. Construct DIE to
417// represent this concrete inlined copy of the function.
David Blaikief2449222014-04-28 20:36:45 +0000418std::unique_ptr<DIE>
419DwarfDebug::constructInlinedScopeDIE(DwarfCompileUnit &TheCU,
420 LexicalScope *Scope) {
David Blaikief662f0a2014-05-14 17:58:53 +0000421 assert(Scope->getScopeNode());
Devang Patelf098ce22011-07-27 00:34:13 +0000422 DIScope DS(Scope->getScopeNode());
423 DISubprogram InlinedSP = getDISubprogram(DS);
David Blaikie1ea9db22014-05-21 23:14:12 +0000424 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
425 // was inlined from another compile unit.
David Blaikie2910f622014-05-27 18:37:51 +0000426 DIE *OriginDIE = AbstractSPDies[InlinedSP];
David Blaikie1ea9db22014-05-21 23:14:12 +0000427 assert(OriginDIE && "Unable to find original DIE for an inlined subprogram.");
Devang Patelf098ce22011-07-27 00:34:13 +0000428
David Blaikief2449222014-04-28 20:36:45 +0000429 auto ScopeDIE = make_unique<DIE>(dwarf::DW_TAG_inlined_subroutine);
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000430 TheCU.addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000431
David Blaikie4a3b84d2014-05-16 16:42:40 +0000432 attachRangesOrLowHighPC(TheCU, *ScopeDIE, Scope->getRanges());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000433
434 InlinedSubprogramDIEs.insert(OriginDIE);
435
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000436 // Add the call site information to the DIE.
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000437 DILocation DL(Scope->getInlinedAt());
David Blaikie65a74662014-04-25 18:26:14 +0000438 TheCU.addUInt(*ScopeDIE, dwarf::DW_AT_call_file, None,
David Blaikie637cac42014-04-22 23:09:36 +0000439 TheCU.getOrCreateSourceID(DL.getFilename(), DL.getDirectory()));
David Blaikie65a74662014-04-25 18:26:14 +0000440 TheCU.addUInt(*ScopeDIE, dwarf::DW_AT_call_line, None, DL.getLineNumber());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000441
Eric Christopher8dda5d02011-12-04 06:02:38 +0000442 // Add name to the name table, we do this here because we're guaranteed
443 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000444 addSubprogramNames(InlinedSP, *ScopeDIE);
Eric Christopher6a841382012-11-19 22:42:10 +0000445
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000446 return ScopeDIE;
447}
448
David Blaikie44078b32014-04-30 22:41:33 +0000449static std::unique_ptr<DIE> constructVariableDIE(DwarfCompileUnit &TheCU,
450 DbgVariable &DV,
451 const LexicalScope &Scope,
452 DIE *&ObjectPointer) {
David Blaikieb85f0082014-05-27 19:34:32 +0000453 auto Var = TheCU.constructVariableDIE(DV, Scope.isAbstractScope());
David Blaikie44078b32014-04-30 22:41:33 +0000454 if (DV.isObjectPointer())
455 ObjectPointer = Var.get();
456 return Var;
457}
458
David Blaikie914046e2014-04-25 20:00:34 +0000459DIE *DwarfDebug::createScopeChildrenDIE(
460 DwarfCompileUnit &TheCU, LexicalScope *Scope,
David Blaikie6a150a82014-08-31 21:26:22 +0000461 SmallVectorImpl<std::unique_ptr<DIE>> &Children,
462 unsigned *ChildScopeCount) {
Craig Topper353eda42014-04-24 06:44:33 +0000463 DIE *ObjectPointer = nullptr;
Devang Patel6c622ef2011-03-01 22:58:55 +0000464
David Blaikie44078b32014-04-30 22:41:33 +0000465 for (DbgVariable *DV : ScopeVariables.lookup(Scope))
466 Children.push_back(constructVariableDIE(TheCU, *DV, *Scope, ObjectPointer));
467
David Blaikie6a150a82014-08-31 21:26:22 +0000468 unsigned ChildCountWithoutScopes = Children.size();
469
Benjamin Kramer15596c72014-03-07 19:09:39 +0000470 for (LexicalScope *LS : Scope->getChildren())
David Blaikie6a150a82014-08-31 21:26:22 +0000471 constructScopeDIE(TheCU, LS, Children);
472
473 if (ChildScopeCount)
474 *ChildScopeCount = Children.size() - ChildCountWithoutScopes;
475
Manman Ren2312ed32013-09-10 18:40:41 +0000476 return ObjectPointer;
477}
478
David Blaikie3fbf3b82014-08-31 18:04:28 +0000479DIE *DwarfDebug::createAndAddScopeChildren(DwarfCompileUnit &TheCU,
David Blaikie899ae612014-04-30 22:58:19 +0000480 LexicalScope *Scope, DIE &ScopeDIE) {
David Blaikied8f0ac72014-04-28 20:27:02 +0000481 // We create children when the scope DIE is not null.
David Blaikiee872a6e2014-04-29 15:58:35 +0000482 SmallVector<std::unique_ptr<DIE>, 8> Children;
David Blaikie3fbf3b82014-08-31 18:04:28 +0000483 DIE *ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children);
David Blaikied8f0ac72014-04-28 20:27:02 +0000484
485 // Add children
486 for (auto &I : Children)
David Blaikiee872a6e2014-04-29 15:58:35 +0000487 ScopeDIE.addChild(std::move(I));
David Blaikie3fbf3b82014-08-31 18:04:28 +0000488
489 return ObjectPointer;
David Blaikiee872a6e2014-04-29 15:58:35 +0000490}
491
David Blaikie4c1089d2014-04-29 23:43:06 +0000492void DwarfDebug::constructAbstractSubprogramScopeDIE(DwarfCompileUnit &TheCU,
493 LexicalScope *Scope) {
David Blaikiee872a6e2014-04-29 15:58:35 +0000494 assert(Scope && Scope->getScopeNode());
495 assert(Scope->isAbstractScope());
496 assert(!Scope->getInlinedAt());
497
David Blaikie48602252014-05-23 05:03:23 +0000498 DISubprogram SP(Scope->getScopeNode());
David Blaikiee872a6e2014-04-29 15:58:35 +0000499
David Blaikie482097d2014-05-27 18:37:55 +0000500 ProcessedSPNodes.insert(SP);
501
David Blaikie3c2fff32014-05-27 18:37:48 +0000502 DIE *&AbsDef = AbstractSPDies[SP];
503 if (AbsDef)
David Blaikie4abe19e2014-05-12 18:23:35 +0000504 return;
David Blaikiee872a6e2014-04-29 15:58:35 +0000505
David Blaikie1ea9db22014-05-21 23:14:12 +0000506 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
507 // was inlined from another compile unit.
David Blaikie48602252014-05-23 05:03:23 +0000508 DwarfCompileUnit &SPCU = *SPMap[SP];
David Blaikie482097d2014-05-27 18:37:55 +0000509 DIE *ContextDIE;
David Blaikie3c2fff32014-05-27 18:37:48 +0000510
David Blaikie482097d2014-05-27 18:37:55 +0000511 // Some of this is duplicated from DwarfUnit::getOrCreateSubprogramDIE, with
512 // the important distinction that the DIDescriptor is not associated with the
513 // DIE (since the DIDescriptor will be associated with the concrete DIE, if
514 // any). It could be refactored to some common utility function.
515 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
516 ContextDIE = &SPCU.getUnitDie();
517 SPCU.getOrCreateSubprogramDIE(SPDecl);
518 } else
519 ContextDIE = SPCU.getOrCreateContextDIE(resolve(SP.getContext()));
520
521 // Passing null as the associated DIDescriptor because the abstract definition
522 // shouldn't be found by lookup.
523 AbsDef = &SPCU.createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE,
524 DIDescriptor());
David Blaikie3dca5992014-06-06 22:29:05 +0000525 SPCU.applySubprogramAttributesToDefinition(SP, *AbsDef);
David Blaikie3c2fff32014-05-27 18:37:48 +0000526
David Blaikie48602252014-05-23 05:03:23 +0000527 SPCU.addUInt(*AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
David Blaikie3fbf3b82014-08-31 18:04:28 +0000528 if (DIE *ObjectPointer = createAndAddScopeChildren(SPCU, Scope, *AbsDef))
529 SPCU.addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer);
David Blaikiee872a6e2014-04-29 15:58:35 +0000530}
531
532DIE &DwarfDebug::constructSubprogramScopeDIE(DwarfCompileUnit &TheCU,
533 LexicalScope *Scope) {
534 assert(Scope && Scope->getScopeNode());
535 assert(!Scope->getInlinedAt());
536 assert(!Scope->isAbstractScope());
David Blaikiee872a6e2014-04-29 15:58:35 +0000537 DISubprogram Sub(Scope->getScopeNode());
538
David Blaikie9ba72542014-05-14 21:52:46 +0000539 assert(Sub.isSubprogram());
540
David Blaikiee872a6e2014-04-29 15:58:35 +0000541 ProcessedSPNodes.insert(Sub);
542
543 DIE &ScopeDIE = updateSubprogramScopeDIE(TheCU, Sub);
544
David Blaikie3fbf3b82014-08-31 18:04:28 +0000545 // Collect arguments for current function.
546 assert(LScopes.isCurrentFunctionScope(Scope));
547 DIE *ObjectPointer = nullptr;
548 for (DbgVariable *ArgDV : CurrentFnArguments)
549 if (ArgDV)
550 ScopeDIE.addChild(
551 constructVariableDIE(TheCU, *ArgDV, *Scope, ObjectPointer));
552
553 // If this is a variadic function, add an unspecified parameter.
554 DITypeArray FnArgs = Sub.getType().getTypeArray();
555 // If we have a single element of null, it is a function that returns void.
556 // If we have more than one elements and the last one is null, it is a
557 // variadic function.
558 if (FnArgs.getNumElements() > 1 &&
559 !FnArgs.getElement(FnArgs.getNumElements() - 1))
560 ScopeDIE.addChild(make_unique<DIE>(dwarf::DW_TAG_unspecified_parameters));
561
562 // Collect lexical scope children first.
563 // ObjectPointer might be a local (non-argument) local variable if it's a
564 // block's synthetic this pointer.
565 if (DIE *BlockObjPtr = createAndAddScopeChildren(TheCU, Scope, ScopeDIE)) {
566 assert(!ObjectPointer && "multiple object pointers can't be described");
567 ObjectPointer = BlockObjPtr;
568 }
569
570 if (ObjectPointer)
571 TheCU.addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer);
David Blaikied8f0ac72014-04-28 20:27:02 +0000572
573 return ScopeDIE;
574}
575
Manman Ren2312ed32013-09-10 18:40:41 +0000576// Construct a DIE for this scope.
David Blaikie6a150a82014-08-31 21:26:22 +0000577void DwarfDebug::constructScopeDIE(
578 DwarfCompileUnit &TheCU, LexicalScope *Scope,
579 SmallVectorImpl<std::unique_ptr<DIE>> &FinalChildren) {
Manman Ren2312ed32013-09-10 18:40:41 +0000580 if (!Scope || !Scope->getScopeNode())
David Blaikie6a150a82014-08-31 21:26:22 +0000581 return;
Manman Ren2312ed32013-09-10 18:40:41 +0000582
Adrian Prantl78619f72014-03-21 22:16:32 +0000583 DIScope DS(Scope->getScopeNode());
Manman Ren2312ed32013-09-10 18:40:41 +0000584
David Blaikied67ffe82014-04-28 22:27:26 +0000585 assert((Scope->getInlinedAt() || !DS.isSubprogram()) &&
586 "Only handle inlined subprograms here, use "
587 "constructSubprogramScopeDIE for non-inlined "
588 "subprograms");
David Blaikied8f0ac72014-04-28 20:27:02 +0000589
David Blaikie914046e2014-04-25 20:00:34 +0000590 SmallVector<std::unique_ptr<DIE>, 8> Children;
Manman Ren2312ed32013-09-10 18:40:41 +0000591
Manman Ren5b2f4b02013-09-11 19:40:28 +0000592 // We try to create the scope DIE first, then the children DIEs. This will
593 // avoid creating un-used children then removing them later when we find out
594 // the scope DIE is null.
David Blaikief2449222014-04-28 20:36:45 +0000595 std::unique_ptr<DIE> ScopeDIE;
David Blaikie48b056b2014-05-19 21:54:31 +0000596 if (Scope->getParent() && DS.isSubprogram()) {
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000597 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
David Blaikied8f0ac72014-04-28 20:27:02 +0000598 if (!ScopeDIE)
David Blaikie6a150a82014-08-31 21:26:22 +0000599 return;
David Blaikied8f0ac72014-04-28 20:27:02 +0000600 // We create children when the scope DIE is not null.
601 createScopeChildrenDIE(TheCU, Scope, Children);
David Blaikiee26a3772013-11-18 23:59:04 +0000602 } else {
Manman Ren5b2f4b02013-09-11 19:40:28 +0000603 // Early exit when we know the scope DIE is going to be null.
Manman Ren2312ed32013-09-10 18:40:41 +0000604 if (isLexicalScopeDIENull(Scope))
David Blaikie6a150a82014-08-31 21:26:22 +0000605 return;
606
607 unsigned ChildScopeCount;
Manman Ren5b2f4b02013-09-11 19:40:28 +0000608
609 // We create children here when we know the scope DIE is not going to be
610 // null and the children will be added to the scope DIE.
David Blaikie6a150a82014-08-31 21:26:22 +0000611 createScopeChildrenDIE(TheCU, Scope, Children, &ChildScopeCount);
Manman Ren5b2f4b02013-09-11 19:40:28 +0000612
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000613 // There is no need to emit empty lexical block DIE.
David Blaikie684fc532013-05-06 23:33:07 +0000614 std::pair<ImportedEntityMap::const_iterator,
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000615 ImportedEntityMap::const_iterator> Range =
Eric Christopher793c7472014-04-28 20:42:22 +0000616 std::equal_range(ScopesWithImportedEntities.begin(),
617 ScopesWithImportedEntities.end(),
618 std::pair<const MDNode *, const MDNode *>(DS, nullptr),
619 less_first());
David Blaikie28127462014-08-31 05:46:17 +0000620 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
621 ++i)
622 Children.push_back(
623 constructImportedEntityDIE(TheCU, DIImportedEntity(i->second)));
David Blaikie6a150a82014-08-31 21:26:22 +0000624 // If there are only other scopes as children, put them directly in the
625 // parent instead, as this scope would serve no purpose.
626 if (Children.size() == ChildScopeCount) {
627 FinalChildren.insert(FinalChildren.end(),
628 std::make_move_iterator(Children.begin()),
629 std::make_move_iterator(Children.end()));
630 return;
631 }
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000632 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Manman Ren2312ed32013-09-10 18:40:41 +0000633 assert(ScopeDIE && "Scope DIE should not be null.");
Benjamin Kramer892daba2013-08-24 11:55:49 +0000634 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000635
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000636 // Add children
David Blaikie914046e2014-04-25 20:00:34 +0000637 for (auto &I : Children)
638 ScopeDIE->addChild(std::move(I));
Devang Patel04d2f2d2009-11-24 01:14:22 +0000639
David Blaikie6a150a82014-08-31 21:26:22 +0000640 FinalChildren.push_back(std::move(ScopeDIE));
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000641}
642
David Blaikie65a74662014-04-25 18:26:14 +0000643void DwarfDebug::addGnuPubAttributes(DwarfUnit &U, DIE &D) const {
David Blaikie3c842622013-12-04 21:31:26 +0000644 if (!GenerateGnuPubSections)
645 return;
646
David Blaikief9b6a552014-04-22 22:39:41 +0000647 U.addFlag(D, dwarf::DW_AT_GNU_pubnames);
David Blaikie3c842622013-12-04 21:31:26 +0000648}
649
Eric Christopher4287a492013-12-09 23:57:44 +0000650// Create new DwarfCompileUnit for the given metadata node with tag
Eric Christopher48fef592012-12-20 21:58:40 +0000651// DW_TAG_compile_unit.
David Blaikief9b6a552014-04-22 22:39:41 +0000652DwarfCompileUnit &DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) {
Devang Patel2d9caf92009-11-25 17:36:49 +0000653 StringRef FN = DIUnit.getFilename();
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000654 CompilationDir = DIUnit.getDirectory();
Bill Wendling2b128d72009-05-20 23:19:06 +0000655
David Blaikief9b6a552014-04-22 22:39:41 +0000656 auto OwnedUnit = make_unique<DwarfCompileUnit>(
David Blaikiebd579052014-04-28 21:14:27 +0000657 InfoHolder.getUnits().size(), DIUnit, Asm, this, &InfoHolder);
David Blaikief9b6a552014-04-22 22:39:41 +0000658 DwarfCompileUnit &NewCU = *OwnedUnit;
David Blaikie92a2f8a2014-04-28 21:04:29 +0000659 DIE &Die = NewCU.getUnitDie();
David Blaikief9b6a552014-04-22 22:39:41 +0000660 InfoHolder.addUnit(std::move(OwnedUnit));
661
David Blaikie7ac51492014-03-20 17:05:45 +0000662 // LTO with assembly output shares a single line table amongst multiple CUs.
663 // To avoid the compilation directory being ambiguous, let the line table
664 // explicitly describe the directory of all files, never relying on the
665 // compilation directory.
David Blaikie47f4b822014-03-19 00:11:28 +0000666 if (!Asm->OutStreamer.hasRawTextSupport() || SingleCU)
David Blaikiee05274d2014-03-18 00:11:48 +0000667 Asm->OutStreamer.getContext().setMCLineTableCompilationDir(
David Blaikief9b6a552014-04-22 22:39:41 +0000668 NewCU.getUniqueID(), CompilationDir);
David Blaikie2666e242013-12-06 19:38:46 +0000669
David Blaikie92a2f8a2014-04-28 21:04:29 +0000670 NewCU.addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
671 NewCU.addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
David Blaikie637cac42014-04-22 23:09:36 +0000672 DIUnit.getLanguage());
David Blaikie92a2f8a2014-04-28 21:04:29 +0000673 NewCU.addString(Die, dwarf::DW_AT_name, FN);
Eric Christopher52ce7182013-04-09 19:23:15 +0000674
Eric Christopher52ce7182013-04-09 19:23:15 +0000675 if (!useSplitDwarf()) {
David Blaikief9b6a552014-04-22 22:39:41 +0000676 NewCU.initStmtList(DwarfLineSectionSym);
Eric Christophera51d3fc2013-09-27 22:50:48 +0000677
678 // If we're using split dwarf the compilation dir is going to be in the
679 // skeleton CU and so we don't need to duplicate it here.
680 if (!CompilationDir.empty())
David Blaikie92a2f8a2014-04-28 21:04:29 +0000681 NewCU.addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christophera51d3fc2013-09-27 22:50:48 +0000682
David Blaikie92a2f8a2014-04-28 21:04:29 +0000683 addGnuPubAttributes(NewCU, Die);
Eric Christopher52ce7182013-04-09 19:23:15 +0000684 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000685
Bill Wendling2b128d72009-05-20 23:19:06 +0000686 if (DIUnit.isOptimized())
David Blaikie92a2f8a2014-04-28 21:04:29 +0000687 NewCU.addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendling2b128d72009-05-20 23:19:06 +0000688
Devang Patel2d9caf92009-11-25 17:36:49 +0000689 StringRef Flags = DIUnit.getFlags();
690 if (!Flags.empty())
David Blaikie92a2f8a2014-04-28 21:04:29 +0000691 NewCU.addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher6a841382012-11-19 22:42:10 +0000692
Nick Lewycky479a8fe2011-10-17 23:27:36 +0000693 if (unsigned RVer = DIUnit.getRunTimeVersion())
David Blaikie92a2f8a2014-04-28 21:04:29 +0000694 NewCU.addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
David Blaikie637cac42014-04-22 23:09:36 +0000695 dwarf::DW_FORM_data1, RVer);
Bill Wendling2b128d72009-05-20 23:19:06 +0000696
Devang Patel1a0df9a2010-05-10 22:49:55 +0000697 if (!FirstCU)
David Blaikief9b6a552014-04-22 22:39:41 +0000698 FirstCU = &NewCU;
Eric Christopher7a2cdf72013-02-05 07:31:55 +0000699
Eric Christopherd4368fd2014-01-02 21:03:28 +0000700 if (useSplitDwarf()) {
David Blaikief9b6a552014-04-22 22:39:41 +0000701 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoDWOSection(),
David Blaikie637cac42014-04-22 23:09:36 +0000702 DwarfInfoDWOSectionSym);
David Blaikief9b6a552014-04-22 22:39:41 +0000703 NewCU.setSkeleton(constructSkeletonCU(NewCU));
Eric Christopherd4368fd2014-01-02 21:03:28 +0000704 } else
David Blaikief9b6a552014-04-22 22:39:41 +0000705 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
David Blaikie637cac42014-04-22 23:09:36 +0000706 DwarfInfoSectionSym);
Eric Christopherd039baa2013-12-30 03:40:32 +0000707
David Blaikief9b6a552014-04-22 22:39:41 +0000708 CUMap.insert(std::make_pair(DIUnit, &NewCU));
David Blaikie92a2f8a2014-04-28 21:04:29 +0000709 CUDieMap.insert(std::make_pair(&Die, &NewCU));
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000710 return NewCU;
Devang Patel1a0df9a2010-05-10 22:49:55 +0000711}
712
David Blaikie8912df12014-08-31 05:41:15 +0000713void DwarfDebug::constructAndAddImportedEntityDIE(DwarfCompileUnit &TheCU,
714 const MDNode *N) {
David Blaikie1fd43652013-05-07 21:35:53 +0000715 DIImportedEntity Module(N);
David Blaikie5e390e42014-02-04 01:23:52 +0000716 assert(Module.Verify());
David Blaikief9b6a552014-04-22 22:39:41 +0000717 if (DIE *D = TheCU.getOrCreateContextDIE(Module.getContext()))
David Blaikiee0e8a3b2014-08-31 05:32:06 +0000718 D->addChild(constructImportedEntityDIE(TheCU, Module));
David Blaikie684fc532013-05-06 23:33:07 +0000719}
720
David Blaikiee0e8a3b2014-08-31 05:32:06 +0000721std::unique_ptr<DIE>
722DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
723 const DIImportedEntity &Module) {
David Blaikie684fc532013-05-06 23:33:07 +0000724 assert(Module.Verify() &&
725 "Use one of the MDNode * overloads to handle invalid metadata");
David Blaikiee0e8a3b2014-08-31 05:32:06 +0000726 std::unique_ptr<DIE> IMDie = make_unique<DIE>((dwarf::Tag)Module.getTag());
727 TheCU.insertDIE(Module, IMDie.get());
David Blaikie1fd43652013-05-07 21:35:53 +0000728 DIE *EntityDie;
Adrian Prantld09ba232014-04-01 03:41:04 +0000729 DIDescriptor Entity = resolve(Module.getEntity());
David Blaikie1fd43652013-05-07 21:35:53 +0000730 if (Entity.isNameSpace())
David Blaikief9b6a552014-04-22 22:39:41 +0000731 EntityDie = TheCU.getOrCreateNameSpace(DINameSpace(Entity));
David Blaikie1fd43652013-05-07 21:35:53 +0000732 else if (Entity.isSubprogram())
David Blaikief9b6a552014-04-22 22:39:41 +0000733 EntityDie = TheCU.getOrCreateSubprogramDIE(DISubprogram(Entity));
David Blaikie3b6038b2013-05-08 06:01:41 +0000734 else if (Entity.isType())
David Blaikief9b6a552014-04-22 22:39:41 +0000735 EntityDie = TheCU.getOrCreateTypeDIE(DIType(Entity));
David Blaikie1fd43652013-05-07 21:35:53 +0000736 else
David Blaikief9b6a552014-04-22 22:39:41 +0000737 EntityDie = TheCU.getDIE(Entity);
David Blaikiee0e8a3b2014-08-31 05:32:06 +0000738 assert(EntityDie);
739 TheCU.addSourceLine(*IMDie, Module.getLineNumber(),
David Blaikie637cac42014-04-22 23:09:36 +0000740 Module.getContext().getFilename(),
741 Module.getContext().getDirectory());
David Blaikiee0e8a3b2014-08-31 05:32:06 +0000742 TheCU.addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie);
David Blaikiee63d5d12013-05-20 22:50:35 +0000743 StringRef Name = Module.getName();
744 if (!Name.empty())
David Blaikiee0e8a3b2014-08-31 05:32:06 +0000745 TheCU.addString(*IMDie, dwarf::DW_AT_name, Name);
746
747 return IMDie;
David Blaikief55abea2013-04-22 06:12:31 +0000748}
749
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000750// Emit all Dwarf sections that should come prior to the content. Create
751// global DIEs and emit initial debug info sections. This is invoked by
752// the target AsmPrinter.
Eric Christopher58f41952012-11-19 22:42:15 +0000753void DwarfDebug::beginModule() {
Devang Patel6c74a872010-04-27 19:46:33 +0000754 if (DisableDebugInfoPrinting)
755 return;
756
Eric Christopher58f41952012-11-19 22:42:15 +0000757 const Module *M = MMI->getModule();
758
David Blaikie2f040112014-07-25 16:10:16 +0000759 FunctionDIs = makeSubprogramMap(*M);
760
Nick Lewycky019d2552011-07-29 03:49:23 +0000761 // If module has named metadata anchors then use them, otherwise scan the
762 // module using debug info finder to collect debug info.
Devang Patele02e5852011-05-03 16:45:22 +0000763 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiedc69ebb2013-03-11 23:39:23 +0000764 if (!CU_Nodes)
Devang Patel07bb9ee2011-08-15 23:47:24 +0000765 return;
Manman Ren60352032013-09-05 18:48:31 +0000766 TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
Devang Patele02e5852011-05-03 16:45:22 +0000767
David Blaikiedc69ebb2013-03-11 23:39:23 +0000768 // Emit initial sections so we can reference labels later.
769 emitSectionLabels();
770
David Blaikie47f4b822014-03-19 00:11:28 +0000771 SingleCU = CU_Nodes->getNumOperands() == 1;
David Blaikiee05274d2014-03-18 00:11:48 +0000772
David Blaikie47f4b822014-03-19 00:11:28 +0000773 for (MDNode *N : CU_Nodes->operands()) {
Benjamin Kramer15596c72014-03-07 19:09:39 +0000774 DICompileUnit CUNode(N);
David Blaikief9b6a552014-04-22 22:39:41 +0000775 DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode);
David Blaikie1fd43652013-05-07 21:35:53 +0000776 DIArray ImportedEntities = CUNode.getImportedEntities();
777 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikie684fc532013-05-06 23:33:07 +0000778 ScopesWithImportedEntities.push_back(std::make_pair(
David Blaikie1fd43652013-05-07 21:35:53 +0000779 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
780 ImportedEntities.getElement(i)));
David Blaikie684fc532013-05-06 23:33:07 +0000781 std::sort(ScopesWithImportedEntities.begin(),
Benjamin Kramerb12cf012013-08-24 12:54:27 +0000782 ScopesWithImportedEntities.end(), less_first());
David Blaikiedc69ebb2013-03-11 23:39:23 +0000783 DIArray GVs = CUNode.getGlobalVariables();
784 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
Frederic Riss9ba9eff2014-09-19 15:12:03 +0000785 CU.getOrCreateGlobalVariableDIE(DIGlobalVariable(GVs.getElement(i)));
David Blaikie6ba88e02014-08-29 22:10:52 +0000786 DIArray SPs = CUNode.getSubprograms();
787 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
788 SPMap.insert(std::make_pair(SPs.getElement(i), &CU));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000789 DIArray EnumTypes = CUNode.getEnumTypes();
Manman Renbd1628a2014-07-28 23:04:20 +0000790 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i) {
791 DIType Ty(EnumTypes.getElement(i));
792 // The enum types array by design contains pointers to
793 // MDNodes rather than DIRefs. Unique them here.
794 DIType UniqueTy(resolve(Ty.getRef()));
795 CU.getOrCreateTypeDIE(UniqueTy);
796 }
David Blaikiedc69ebb2013-03-11 23:39:23 +0000797 DIArray RetainedTypes = CUNode.getRetainedTypes();
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000798 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i) {
799 DIType Ty(RetainedTypes.getElement(i));
800 // The retained types array by design contains pointers to
801 // MDNodes rather than DIRefs. Unique them here.
802 DIType UniqueTy(resolve(Ty.getRef()));
David Blaikief9b6a552014-04-22 22:39:41 +0000803 CU.getOrCreateTypeDIE(UniqueTy);
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000804 }
David Blaikief55abea2013-04-22 06:12:31 +0000805 // Emit imported_modules last so that the relevant context is already
806 // available.
David Blaikie1fd43652013-05-07 21:35:53 +0000807 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikie8912df12014-08-31 05:41:15 +0000808 constructAndAddImportedEntityDIE(CU, ImportedEntities.getElement(i));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000809 }
Eric Christopher6a841382012-11-19 22:42:10 +0000810
Chris Lattner7cfa70e2010-04-05 02:19:28 +0000811 // Tell MMI that we have debug info.
812 MMI->setDebugInfoAvailability(true);
Eric Christopher6a841382012-11-19 22:42:10 +0000813
Bill Wendling2b128d72009-05-20 23:19:06 +0000814 // Prime section data.
Richard Mitton21101b32013-09-19 23:21:01 +0000815 SectionMap[Asm->getObjFileLowering().getTextSection()];
Bill Wendling2b128d72009-05-20 23:19:06 +0000816}
817
David Blaikieeb1a2722014-06-13 22:18:23 +0000818void DwarfDebug::finishVariableDefinitions() {
819 for (const auto &Var : ConcreteVariables) {
820 DIE *VariableDie = Var->getDIE();
David Blaikief73ae4f2014-08-12 00:00:31 +0000821 assert(VariableDie);
David Blaikieeb1a2722014-06-13 22:18:23 +0000822 // FIXME: Consider the time-space tradeoff of just storing the unit pointer
823 // in the ConcreteVariables list, rather than looking it up again here.
824 // DIE::getUnit isn't simple - it walks parent pointers, etc.
825 DwarfCompileUnit *Unit = lookupUnit(VariableDie->getUnit());
826 assert(Unit);
David Blaikiee847f132014-06-13 22:35:44 +0000827 DbgVariable *AbsVar = getExistingAbstractVariable(Var->getVariable());
David Blaikieeb1a2722014-06-13 22:18:23 +0000828 if (AbsVar && AbsVar->getDIE()) {
829 Unit->addDIEEntry(*VariableDie, dwarf::DW_AT_abstract_origin,
830 *AbsVar->getDIE());
831 } else
832 Unit->applyVariableAttributes(*Var, *VariableDie);
833 }
834}
835
David Blaikief7221ad2014-05-27 18:37:43 +0000836void DwarfDebug::finishSubprogramDefinitions() {
837 const Module *M = MMI->getModule();
838
839 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
840 for (MDNode *N : CU_Nodes->operands()) {
841 DICompileUnit TheCU(N);
842 // Construct subprogram DIE and add variables DIEs.
843 DwarfCompileUnit *SPCU =
844 static_cast<DwarfCompileUnit *>(CUMap.lookup(TheCU));
845 DIArray Subprograms = TheCU.getSubprograms();
846 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
847 DISubprogram SP(Subprograms.getElement(i));
David Blaikie3c2fff32014-05-27 18:37:48 +0000848 // Perhaps the subprogram is in another CU (such as due to comdat
849 // folding, etc), in which case ignore it here.
850 if (SPMap[SP] != SPCU)
851 continue;
852 DIE *D = SPCU->getDIE(SP);
David Blaikie482097d2014-05-27 18:37:55 +0000853 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SP)) {
854 if (D)
855 // If this subprogram has an abstract definition, reference that
856 SPCU->addDIEEntry(*D, dwarf::DW_AT_abstract_origin, *AbsSPDIE);
857 } else {
David Blaikie3a7ce252014-09-19 17:03:16 +0000858 if (!D && TheCU.getEmissionKind() != DIBuilder::LineTablesOnly)
David Blaikie482097d2014-05-27 18:37:55 +0000859 // Lazily construct the subprogram if we didn't see either concrete or
David Blaikie3a7ce252014-09-19 17:03:16 +0000860 // inlined versions during codegen. (except in -gmlt ^ where we want
861 // to omit these entirely)
David Blaikie482097d2014-05-27 18:37:55 +0000862 D = SPCU->getOrCreateSubprogramDIE(SP);
David Blaikie3a7ce252014-09-19 17:03:16 +0000863 if (D)
864 // And attach the attributes
865 SPCU->applySubprogramAttributesToDefinition(SP, *D);
David Blaikie482097d2014-05-27 18:37:55 +0000866 }
David Blaikief7221ad2014-05-27 18:37:43 +0000867 }
868 }
869}
870
871
Eric Christopher960ac372012-11-22 00:59:49 +0000872// Collect info for variables that were optimized out.
873void DwarfDebug::collectDeadVariables() {
874 const Module *M = MMI->getModule();
Eric Christopher960ac372012-11-22 00:59:49 +0000875
876 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
Benjamin Kramer15596c72014-03-07 19:09:39 +0000877 for (MDNode *N : CU_Nodes->operands()) {
878 DICompileUnit TheCU(N);
David Blaikie9ba72542014-05-14 21:52:46 +0000879 // Construct subprogram DIE and add variables DIEs.
880 DwarfCompileUnit *SPCU =
881 static_cast<DwarfCompileUnit *>(CUMap.lookup(TheCU));
882 assert(SPCU && "Unable to find Compile Unit!");
Eric Christopher960ac372012-11-22 00:59:49 +0000883 DIArray Subprograms = TheCU.getSubprograms();
884 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopher735401c2012-11-27 00:13:51 +0000885 DISubprogram SP(Subprograms.getElement(i));
Eric Christophera6c38a32013-10-15 23:31:38 +0000886 if (ProcessedSPNodes.count(SP) != 0)
887 continue;
David Blaikie7af6e6f2014-05-14 21:52:37 +0000888 assert(SP.isSubprogram() &&
889 "CU's subprogram list contains a non-subprogram");
David Blaikie48369d12014-05-16 22:21:45 +0000890 assert(SP.isDefinition() &&
891 "CU's subprogram list contains a subprogram declaration");
Eric Christopher735401c2012-11-27 00:13:51 +0000892 DIArray Variables = SP.getVariables();
Eric Christophera6c38a32013-10-15 23:31:38 +0000893 if (Variables.getNumElements() == 0)
894 continue;
Eric Christopher960ac372012-11-22 00:59:49 +0000895
David Blaikie482097d2014-05-27 18:37:55 +0000896 DIE *SPDIE = AbstractSPDies.lookup(SP);
897 if (!SPDIE)
898 SPDIE = SPCU->getDIE(SP);
David Blaikie8729bca2014-05-22 00:48:36 +0000899 assert(SPDIE);
Eric Christopher735401c2012-11-27 00:13:51 +0000900 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
901 DIVariable DV(Variables.getElement(vi));
David Blaikie9ba72542014-05-14 21:52:46 +0000902 assert(DV.isVariable());
David Blaikie6f9e8672014-06-13 23:52:55 +0000903 DbgVariable NewVar(DV, this);
David Blaikieeb1a2722014-06-13 22:18:23 +0000904 auto VariableDie = SPCU->constructVariableDIE(NewVar);
905 SPCU->applyVariableAttributes(NewVar, *VariableDie);
906 SPDIE->addChild(std::move(VariableDie));
Eric Christopher735401c2012-11-27 00:13:51 +0000907 }
Eric Christopher960ac372012-11-22 00:59:49 +0000908 }
909 }
910 }
Eric Christopher960ac372012-11-22 00:59:49 +0000911}
912
913void DwarfDebug::finalizeModuleInfo() {
David Blaikie3c2fff32014-05-27 18:37:48 +0000914 finishSubprogramDefinitions();
915
David Blaikieeb1a2722014-06-13 22:18:23 +0000916 finishVariableDefinitions();
917
Eric Christopher960ac372012-11-22 00:59:49 +0000918 // Collect info for variables that were optimized out.
919 collectDeadVariables();
920
Eric Christopherad10cb52013-12-04 23:24:38 +0000921 // Handle anything that needs to be done on a per-unit basis after
922 // all other generation.
David Blaikiec33b3cd2014-04-22 21:27:37 +0000923 for (const auto &TheU : getUnits()) {
Eric Christopher60eb7692013-08-12 20:27:48 +0000924 // Emit DW_AT_containing_type attribute to connect types with their
925 // vtable holding type.
David Blaikie2a80e442013-12-02 22:09:48 +0000926 TheU->constructContainingTypeDIEs();
Eric Christopher60eb7692013-08-12 20:27:48 +0000927
Eric Christopher46e23432013-12-20 04:16:18 +0000928 // Add CU specific attributes if we need to add any.
David Blaikieadcde362014-04-25 18:35:57 +0000929 if (TheU->getUnitDie().getTag() == dwarf::DW_TAG_compile_unit) {
Eric Christopher46e23432013-12-20 04:16:18 +0000930 // If we're splitting the dwarf out now that we've got the entire
Eric Christopherd8667202013-12-30 17:22:27 +0000931 // CU then add the dwo id to it.
932 DwarfCompileUnit *SkCU =
933 static_cast<DwarfCompileUnit *>(TheU->getSkeleton());
Eric Christopher46e23432013-12-20 04:16:18 +0000934 if (useSplitDwarf()) {
Eric Christopher09d1c0f2014-03-14 21:20:07 +0000935 // Emit a unique identifier for this CU.
David Blaikieadcde362014-04-25 18:35:57 +0000936 uint64_t ID = DIEHash(Asm).computeCUSignature(TheU->getUnitDie());
937 TheU->addUInt(TheU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher46e23432013-12-20 04:16:18 +0000938 dwarf::DW_FORM_data8, ID);
David Blaikieadcde362014-04-25 18:35:57 +0000939 SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher46e23432013-12-20 04:16:18 +0000940 dwarf::DW_FORM_data8, ID);
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000941
942 // We don't keep track of which addresses are used in which CU so this
943 // is a bit pessimistic under LTO.
David Blaikied75fb282014-04-23 21:20:10 +0000944 if (!AddrPool.isEmpty())
David Blaikieadcde362014-04-25 18:35:57 +0000945 addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000946 dwarf::DW_AT_GNU_addr_base, DwarfAddrSectionSym,
947 DwarfAddrSectionSym);
948 if (!TheU->getRangeLists().empty())
David Blaikieadcde362014-04-25 18:35:57 +0000949 addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000950 dwarf::DW_AT_GNU_ranges_base,
951 DwarfDebugRangeSectionSym, DwarfDebugRangeSectionSym);
Eric Christopherd29614f2013-08-13 01:21:55 +0000952 }
Eric Christopherd8667202013-12-30 17:22:27 +0000953
Eric Christopher384f3fe2014-03-20 19:16:16 +0000954 // If we have code split among multiple sections or non-contiguous
955 // ranges of code then emit a DW_AT_ranges attribute on the unit that will
956 // remain in the .o file, otherwise add a DW_AT_low_pc.
957 // FIXME: We should use ranges allow reordering of code ala
958 // .subsections_via_symbols in mach-o. This would mean turning on
959 // ranges for all subprogram DIEs for mach-o.
David Blaikiec33b3cd2014-04-22 21:27:37 +0000960 DwarfCompileUnit &U =
961 SkCU ? *SkCU : static_cast<DwarfCompileUnit &>(*TheU);
Eric Christopher384f3fe2014-03-20 19:16:16 +0000962 unsigned NumRanges = TheU->getRanges().size();
963 if (NumRanges) {
964 if (NumRanges > 1) {
David Blaikieadcde362014-04-25 18:35:57 +0000965 addSectionLabel(*Asm, U, U.getUnitDie(), dwarf::DW_AT_ranges,
David Blaikiec33b3cd2014-04-22 21:27:37 +0000966 Asm->GetTempSymbol("cu_ranges", U.getUniqueID()),
Eric Christopher384f3fe2014-03-20 19:16:16 +0000967 DwarfDebugRangeSectionSym);
Eric Christopher8873ada2014-01-29 22:22:56 +0000968
Eric Christopher384f3fe2014-03-20 19:16:16 +0000969 // A DW_AT_low_pc attribute may also be specified in combination with
970 // DW_AT_ranges to specify the default base address for use in
971 // location lists (see Section 2.6.2) and range lists (see Section
972 // 2.17.3).
David Blaikieadcde362014-04-25 18:35:57 +0000973 U.addUInt(U.getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
David Blaikiec33b3cd2014-04-22 21:27:37 +0000974 0);
Eric Christopher384f3fe2014-03-20 19:16:16 +0000975 } else {
976 RangeSpan &Range = TheU->getRanges().back();
Frederic Riss57323012014-08-29 09:00:26 +0000977 attachLowHighPC(U, U.getUnitDie(), Range.getStart(), Range.getEnd());
Eric Christopher384f3fe2014-03-20 19:16:16 +0000978 }
979 }
Eric Christopher60eb7692013-08-12 20:27:48 +0000980 }
981 }
982
983 // Compute DIE offsets and sizes.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000984 InfoHolder.computeSizeAndOffsets();
985 if (useSplitDwarf())
986 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher960ac372012-11-22 00:59:49 +0000987}
988
989void DwarfDebug::endSections() {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000990 // Filter labels by section.
Benjamin Kramer15596c72014-03-07 19:09:39 +0000991 for (const SymbolCU &SCU : ArangeLabels) {
Richard Mitton21101b32013-09-19 23:21:01 +0000992 if (SCU.Sym->isInSection()) {
993 // Make a note of this symbol and it's section.
994 const MCSection *Section = &SCU.Sym->getSection();
995 if (!Section->getKind().isMetadata())
996 SectionMap[Section].push_back(SCU);
997 } else {
998 // Some symbols (e.g. common/bss on mach-o) can have no section but still
999 // appear in the output. This sucks as we rely on sections to build
1000 // arange spans. We can do it without, but it's icky.
Craig Topper353eda42014-04-24 06:44:33 +00001001 SectionMap[nullptr].push_back(SCU);
Richard Mitton21101b32013-09-19 23:21:01 +00001002 }
1003 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001004
Richard Mittonc2508242013-10-03 22:07:08 +00001005 // Build a list of sections used.
1006 std::vector<const MCSection *> Sections;
Benjamin Kramer15596c72014-03-07 19:09:39 +00001007 for (const auto &it : SectionMap) {
1008 const MCSection *Section = it.first;
Richard Mittonc2508242013-10-03 22:07:08 +00001009 Sections.push_back(Section);
1010 }
1011
1012 // Sort the sections into order.
1013 // This is only done to ensure consistent output order across different runs.
1014 std::sort(Sections.begin(), Sections.end(), SectionSort);
1015
1016 // Add terminating symbols for each section.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001017 for (unsigned ID = 0, E = Sections.size(); ID != E; ID++) {
Richard Mittonc2508242013-10-03 22:07:08 +00001018 const MCSection *Section = Sections[ID];
Craig Topper353eda42014-04-24 06:44:33 +00001019 MCSymbol *Sym = nullptr;
Richard Mitton21101b32013-09-19 23:21:01 +00001020
1021 if (Section) {
Richard Mittonc2508242013-10-03 22:07:08 +00001022 // We can't call MCSection::getLabelEndName, as it's only safe to do so
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001023 // if we know the section name up-front. For user-created sections, the
Eric Christopher95531b62014-01-29 22:06:21 +00001024 // resulting label may not be valid to use as a label. (section names can
1025 // use a greater set of characters on some systems)
Richard Mittonc2508242013-10-03 22:07:08 +00001026 Sym = Asm->GetTempSymbol("debug_end", ID);
Richard Mitton21101b32013-09-19 23:21:01 +00001027 Asm->OutStreamer.SwitchSection(Section);
1028 Asm->OutStreamer.EmitLabel(Sym);
1029 }
1030
1031 // Insert a final terminator.
Craig Topper353eda42014-04-24 06:44:33 +00001032 SectionMap[Section].push_back(SymbolCU(nullptr, Sym));
Bill Wendling2b128d72009-05-20 23:19:06 +00001033 }
Eric Christopher960ac372012-11-22 00:59:49 +00001034}
Bill Wendling2b128d72009-05-20 23:19:06 +00001035
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001036// Emit all Dwarf sections that should come after the content.
Eric Christopher960ac372012-11-22 00:59:49 +00001037void DwarfDebug::endModule() {
Craig Toppere73658d2014-04-28 04:05:08 +00001038 assert(CurFn == nullptr);
1039 assert(CurMI == nullptr);
Eric Christopher960ac372012-11-22 00:59:49 +00001040
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001041 if (!FirstCU)
1042 return;
Eric Christopher960ac372012-11-22 00:59:49 +00001043
1044 // End any existing sections.
1045 // TODO: Does this need to happen?
1046 endSections();
1047
1048 // Finalize the debug info for the module.
1049 finalizeModuleInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001050
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001051 emitDebugStr();
Eric Christopher9cd26af2013-09-20 23:22:52 +00001052
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001053 // Emit all the DIEs into a debug info section.
1054 emitDebugInfo();
Eric Christopher4c9b1192012-11-27 00:41:54 +00001055
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001056 // Corresponding abbreviations into a abbrev section.
1057 emitAbbreviations();
Eric Christopher95198f502012-11-27 22:43:42 +00001058
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001059 // Emit info into a debug aranges section.
Eric Christopher02dbadb2014-02-14 01:26:55 +00001060 if (GenerateARangeSection)
1061 emitDebugARanges();
Eric Christopher95198f502012-11-27 22:43:42 +00001062
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001063 // Emit info into a debug ranges section.
1064 emitDebugRanges();
Eric Christopher95198f502012-11-27 22:43:42 +00001065
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001066 if (useSplitDwarf()) {
1067 emitDebugStrDWO();
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001068 emitDebugInfoDWO();
Eric Christopher3c5a1912012-12-19 22:02:53 +00001069 emitDebugAbbrevDWO();
David Blaikie4a2f95f2014-03-18 01:17:26 +00001070 emitDebugLineDWO();
David Blaikiede8e12a2014-06-19 17:59:14 +00001071 emitDebugLocDWO();
Eric Christopher962c9082013-01-15 23:56:56 +00001072 // Emit DWO addresses.
David Blaikied75fb282014-04-23 21:20:10 +00001073 AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection());
David Blaikie94c1d7f2014-04-02 01:50:20 +00001074 } else
1075 // Emit info into a debug loc section.
1076 emitDebugLoc();
Bill Wendling2b128d72009-05-20 23:19:06 +00001077
Eric Christophera876b822012-08-23 07:32:06 +00001078 // Emit info into the dwarf accelerator table sections.
Eric Christopher20b76a72012-08-23 22:36:40 +00001079 if (useDwarfAccelTables()) {
Eric Christopher4996c702011-11-07 09:24:32 +00001080 emitAccelNames();
1081 emitAccelObjC();
1082 emitAccelNamespaces();
1083 emitAccelTypes();
1084 }
Eric Christopher6a841382012-11-19 22:42:10 +00001085
Eric Christopher4b358182013-08-30 00:40:17 +00001086 // Emit the pubnames and pubtypes sections if requested.
1087 if (HasDwarfPubSections) {
David Blaikie70a33202013-09-19 17:33:35 +00001088 emitDebugPubNames(GenerateGnuPubSections);
1089 emitDebugPubTypes(GenerateGnuPubSections);
Eric Christopher4b358182013-08-30 00:40:17 +00001090 }
Devang Patel04d2f2d2009-11-24 01:14:22 +00001091
Devang Pateld0701282010-08-02 17:32:15 +00001092 // clean up.
Devang Pateleb1bb4e2011-08-16 22:09:43 +00001093 SPMap.clear();
David Blaikie825bdd22014-05-21 22:41:17 +00001094 AbstractVariables.clear();
Eric Christopher8afd7b62012-12-10 19:51:18 +00001095
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001096 // Reset these for the next Module if we have one.
Craig Topper353eda42014-04-24 06:44:33 +00001097 FirstCU = nullptr;
Bill Wendling2b128d72009-05-20 23:19:06 +00001098}
1099
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001100// Find abstract variable, if any, associated with Var.
David Blaikiebe7c6772014-06-13 22:29:31 +00001101DbgVariable *DwarfDebug::getExistingAbstractVariable(const DIVariable &DV,
David Blaikie36408e72014-06-04 23:50:52 +00001102 DIVariable &Cleansed) {
Devang Patelbb23a4a2011-08-10 21:50:54 +00001103 LLVMContext &Ctx = DV->getContext();
1104 // More then one inlined variable corresponds to one abstract variable.
David Blaikie36408e72014-06-04 23:50:52 +00001105 // FIXME: This duplication of variables when inlining should probably be
1106 // removed. It's done to allow each DIVariable to describe its location
1107 // because the DebugLoc on the dbg.value/declare isn't accurate. We should
1108 // make it accurate then remove this duplication/cleansing stuff.
1109 Cleansed = cleanseInlinedVariable(DV, Ctx);
1110 auto I = AbstractVariables.find(Cleansed);
David Blaikie825bdd22014-05-21 22:41:17 +00001111 if (I != AbstractVariables.end())
1112 return I->second.get();
David Blaikie36408e72014-06-04 23:50:52 +00001113 return nullptr;
1114}
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001115
David Blaikiee847f132014-06-13 22:35:44 +00001116DbgVariable *DwarfDebug::getExistingAbstractVariable(const DIVariable &DV) {
1117 DIVariable Cleansed;
1118 return getExistingAbstractVariable(DV, Cleansed);
1119}
1120
David Blaikie6f9e8672014-06-13 23:52:55 +00001121void DwarfDebug::createAbstractVariable(const DIVariable &Var,
1122 LexicalScope *Scope) {
1123 auto AbsDbgVariable = make_unique<DbgVariable>(Var, this);
David Blaikie825bdd22014-05-21 22:41:17 +00001124 addScopeVariable(Scope, AbsDbgVariable.get());
David Blaikie6f9e8672014-06-13 23:52:55 +00001125 AbstractVariables[Var] = std::move(AbsDbgVariable);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001126}
1127
David Blaikie6f9e8672014-06-13 23:52:55 +00001128void DwarfDebug::ensureAbstractVariableIsCreated(const DIVariable &DV,
1129 const MDNode *ScopeNode) {
David Blaikie36408e72014-06-04 23:50:52 +00001130 DIVariable Cleansed = DV;
David Blaikie6f9e8672014-06-13 23:52:55 +00001131 if (getExistingAbstractVariable(DV, Cleansed))
1132 return;
David Blaikie36408e72014-06-04 23:50:52 +00001133
David Blaikie6f9e8672014-06-13 23:52:55 +00001134 createAbstractVariable(Cleansed, LScopes.getOrCreateAbstractScope(ScopeNode));
David Blaikie36408e72014-06-04 23:50:52 +00001135}
1136
David Blaikie6f9e8672014-06-13 23:52:55 +00001137void
1138DwarfDebug::ensureAbstractVariableIsCreatedIfScoped(const DIVariable &DV,
1139 const MDNode *ScopeNode) {
David Blaikie36408e72014-06-04 23:50:52 +00001140 DIVariable Cleansed = DV;
David Blaikie6f9e8672014-06-13 23:52:55 +00001141 if (getExistingAbstractVariable(DV, Cleansed))
1142 return;
David Blaikie36408e72014-06-04 23:50:52 +00001143
1144 if (LexicalScope *Scope = LScopes.findAbstractScope(ScopeNode))
David Blaikie6f9e8672014-06-13 23:52:55 +00001145 createAbstractVariable(Cleansed, Scope);
David Blaikie36408e72014-06-04 23:50:52 +00001146}
1147
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001148// If Var is a current function argument then add it to CurrentFnArguments list.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001149bool DwarfDebug::addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope) {
Devang Patel7e623022011-08-10 20:55:27 +00001150 if (!LScopes.isCurrentFunctionScope(Scope))
David Blaikieafd2c6b2014-04-22 05:41:06 +00001151 return false;
1152 DIVariable DV = Var->getVariable();
Devang Patel6c622ef2011-03-01 22:58:55 +00001153 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
David Blaikieafd2c6b2014-04-22 05:41:06 +00001154 return false;
Devang Patel6c622ef2011-03-01 22:58:55 +00001155 unsigned ArgNo = DV.getArgNumber();
Eric Christopher6a841382012-11-19 22:42:10 +00001156 if (ArgNo == 0)
David Blaikieafd2c6b2014-04-22 05:41:06 +00001157 return false;
Devang Patel6c622ef2011-03-01 22:58:55 +00001158
David Blaikieafd2c6b2014-04-22 05:41:06 +00001159 size_t Size = CurrentFnArguments.size();
1160 if (Size == 0)
1161 CurrentFnArguments.resize(CurFn->getFunction()->arg_size());
1162 // llvm::Function argument size is not good indicator of how many
1163 // arguments does the function have at source level.
1164 if (ArgNo > Size)
1165 CurrentFnArguments.resize(ArgNo * 2);
David Blaikiebd56fbb2014-08-08 17:12:35 +00001166 assert(!CurrentFnArguments[ArgNo - 1]);
David Blaikieafd2c6b2014-04-22 05:41:06 +00001167 CurrentFnArguments[ArgNo - 1] = Var;
1168 return true;
Devang Patel6c622ef2011-03-01 22:58:55 +00001169}
1170
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001171// Collect variable information from side table maintained by MMI.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001172void DwarfDebug::collectVariableInfoFromMMITable(
Craig Topper71b7b682014-08-21 05:55:13 +00001173 SmallPtrSetImpl<const MDNode *> &Processed) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00001174 for (const auto &VI : MMI->getVariableDbgInfo()) {
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001175 if (!VI.Var)
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001176 continue;
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001177 Processed.insert(VI.Var);
1178 DIVariable DV(VI.Var);
1179 LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001180
Devang Patelcdb7d442009-11-10 23:20:04 +00001181 // If variable scope is not found then skip this variable.
Craig Topper353eda42014-04-24 06:44:33 +00001182 if (!Scope)
Devang Patelcdb7d442009-11-10 23:20:04 +00001183 continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001184
David Blaikie6f9e8672014-06-13 23:52:55 +00001185 ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode());
1186 ConcreteVariables.push_back(make_unique<DbgVariable>(DV, this));
David Blaikieeb1a2722014-06-13 22:18:23 +00001187 DbgVariable *RegVar = ConcreteVariables.back().get();
David Blaikieafd2c6b2014-04-22 05:41:06 +00001188 RegVar->setFrameIndex(VI.Slot);
David Blaikie087e7202014-06-05 01:04:20 +00001189 addScopeVariable(Scope, RegVar);
Devang Patel475d32a2009-10-06 01:26:37 +00001190 }
Devang Patel490c8ab2010-05-20 19:57:06 +00001191}
Devang Patela3e9c9c2010-03-15 18:33:46 +00001192
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001193// Get .debug_loc entry for the instruction range starting at MI.
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001194static DebugLocEntry::Value getDebugLocValue(const MachineInstr *MI) {
Adrian Prantl7f487772014-04-10 17:39:48 +00001195 const MDNode *Var = MI->getDebugVariable();
Devang Patel2442a892011-07-08 17:09:57 +00001196
David Blaikie0252265b2013-06-16 20:34:15 +00001197 assert(MI->getNumOperands() == 3);
Adrian Prantl418d1d12013-07-09 20:28:37 +00001198 if (MI->getOperand(0).isReg()) {
Devang Patel2442a892011-07-08 17:09:57 +00001199 MachineLocation MLoc;
Adrian Prantl418d1d12013-07-09 20:28:37 +00001200 // If the second operand is an immediate, this is a
1201 // register-indirect address.
1202 if (!MI->getOperand(1).isImm())
Adrian Prantld4c0dd42013-04-26 21:57:17 +00001203 MLoc.set(MI->getOperand(0).getReg());
1204 else
1205 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001206 return DebugLocEntry::Value(Var, MLoc);
Devang Patel2442a892011-07-08 17:09:57 +00001207 }
1208 if (MI->getOperand(0).isImm())
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001209 return DebugLocEntry::Value(Var, MI->getOperand(0).getImm());
Devang Patel2442a892011-07-08 17:09:57 +00001210 if (MI->getOperand(0).isFPImm())
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001211 return DebugLocEntry::Value(Var, MI->getOperand(0).getFPImm());
Devang Patel2442a892011-07-08 17:09:57 +00001212 if (MI->getOperand(0).isCImm())
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001213 return DebugLocEntry::Value(Var, MI->getOperand(0).getCImm());
Devang Patel2442a892011-07-08 17:09:57 +00001214
Craig Topperee4dab52012-02-05 08:31:47 +00001215 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel2442a892011-07-08 17:09:57 +00001216}
1217
Adrian Prantlb1416832014-08-01 22:11:58 +00001218/// Determine whether two variable pieces overlap.
1219static bool piecesOverlap(DIVariable P1, DIVariable P2) {
1220 if (!P1.isVariablePiece() || !P2.isVariablePiece())
1221 return true;
1222 unsigned l1 = P1.getPieceOffset();
1223 unsigned l2 = P2.getPieceOffset();
1224 unsigned r1 = l1 + P1.getPieceSize();
1225 unsigned r2 = l2 + P2.getPieceSize();
1226 // True where [l1,r1[ and [r1,r2[ overlap.
1227 return (l1 < r2) && (l2 < r1);
1228}
1229
1230/// Build the location list for all DBG_VALUEs in the function that
1231/// describe the same variable. If the ranges of several independent
1232/// pieces of the same variable overlap partially, split them up and
1233/// combine the ranges. The resulting DebugLocEntries are will have
1234/// strict monotonically increasing begin addresses and will never
1235/// overlap.
1236//
1237// Input:
1238//
1239// Ranges History [var, loc, piece ofs size]
1240// 0 | [x, (reg0, piece 0, 32)]
1241// 1 | | [x, (reg1, piece 32, 32)] <- IsPieceOfPrevEntry
1242// 2 | | ...
1243// 3 | [clobber reg0]
1244// 4 [x, (mem, piece 0, 64)] <- overlapping with both previous pieces of x.
1245//
1246// Output:
1247//
1248// [0-1] [x, (reg0, piece 0, 32)]
1249// [1-3] [x, (reg0, piece 0, 32), (reg1, piece 32, 32)]
1250// [3-4] [x, (reg1, piece 32, 32)]
1251// [4- ] [x, (mem, piece 0, 64)]
David Blaikiee1a26a62014-08-05 23:14:16 +00001252void
1253DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
1254 const DbgValueHistoryMap::InstrRanges &Ranges) {
Adrian Prantlcaaf0532014-08-11 21:05:57 +00001255 SmallVector<DebugLocEntry::Value, 4> OpenRanges;
Adrian Prantlb1416832014-08-01 22:11:58 +00001256
1257 for (auto I = Ranges.begin(), E = Ranges.end(); I != E; ++I) {
1258 const MachineInstr *Begin = I->first;
1259 const MachineInstr *End = I->second;
1260 assert(Begin->isDebugValue() && "Invalid History entry");
1261
1262 // Check if a variable is inaccessible in this range.
Adrian Prantl5e1fa852014-08-12 21:55:58 +00001263 if (Begin->getNumOperands() > 1 &&
1264 Begin->getOperand(0).isReg() && !Begin->getOperand(0).getReg()) {
Adrian Prantlb1416832014-08-01 22:11:58 +00001265 OpenRanges.clear();
1266 continue;
1267 }
1268
1269 // If this piece overlaps with any open ranges, truncate them.
1270 DIVariable DIVar = Begin->getDebugVariable();
Adrian Prantlcaaf0532014-08-11 21:05:57 +00001271 auto Last = std::remove_if(OpenRanges.begin(), OpenRanges.end(),
Adrian Prantl76502d82014-08-11 23:22:59 +00001272 [&](DebugLocEntry::Value R) {
1273 return piecesOverlap(DIVar, R.getVariable());
1274 });
Adrian Prantlb1416832014-08-01 22:11:58 +00001275 OpenRanges.erase(Last, OpenRanges.end());
1276
1277 const MCSymbol *StartLabel = getLabelBeforeInsn(Begin);
1278 assert(StartLabel && "Forgot label before DBG_VALUE starting a range!");
1279
1280 const MCSymbol *EndLabel;
1281 if (End != nullptr)
1282 EndLabel = getLabelAfterInsn(End);
1283 else if (std::next(I) == Ranges.end())
1284 EndLabel = FunctionEndSym;
1285 else
1286 EndLabel = getLabelBeforeInsn(std::next(I)->first);
1287 assert(EndLabel && "Forgot label after instruction ending a range!");
1288
1289 DEBUG(dbgs() << "DotDebugLoc: " << *Begin << "\n");
1290
1291 auto Value = getDebugLocValue(Begin);
David Blaikiee1a26a62014-08-05 23:14:16 +00001292 DebugLocEntry Loc(StartLabel, EndLabel, Value);
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001293 bool couldMerge = false;
1294
1295 // If this is a piece, it may belong to the current DebugLocEntry.
1296 if (DIVar.isVariablePiece()) {
1297 // Add this value to the list of open ranges.
Adrian Prantlcaaf0532014-08-11 21:05:57 +00001298 OpenRanges.push_back(Value);
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001299
1300 // Attempt to add the piece to the last entry.
1301 if (!DebugLoc.empty())
1302 if (DebugLoc.back().MergeValues(Loc))
1303 couldMerge = true;
1304 }
1305
1306 if (!couldMerge) {
1307 // Need to add a new DebugLocEntry. Add all values from still
1308 // valid non-overlapping pieces.
Adrian Prantl1c6f2ec2014-08-11 21:06:00 +00001309 if (OpenRanges.size())
1310 Loc.addValues(OpenRanges);
1311
Adrian Prantlb1416832014-08-01 22:11:58 +00001312 DebugLoc.push_back(std::move(Loc));
1313 }
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001314
1315 // Attempt to coalesce the ranges of two otherwise identical
1316 // DebugLocEntries.
1317 auto CurEntry = DebugLoc.rbegin();
1318 auto PrevEntry = std::next(CurEntry);
1319 if (PrevEntry != DebugLoc.rend() && PrevEntry->MergeRanges(*CurEntry))
1320 DebugLoc.pop_back();
Adrian Prantlb1416832014-08-01 22:11:58 +00001321
1322 DEBUG(dbgs() << "Values:\n";
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001323 for (auto Value : CurEntry->getValues())
Adrian Prantlb1416832014-08-01 22:11:58 +00001324 Value.getVariable()->dump();
1325 dbgs() << "-----\n");
1326 }
1327}
1328
1329
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001330// Find variables for each lexical scope.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001331void
Craig Topper71b7b682014-08-21 05:55:13 +00001332DwarfDebug::collectVariableInfo(SmallPtrSetImpl<const MDNode *> &Processed) {
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001333 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1334 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001335
Eric Christopher270a12c2013-07-03 21:37:03 +00001336 // Grab the variable info that was squirreled away in the MMI side-table.
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001337 collectVariableInfoFromMMITable(Processed);
Devang Patel490c8ab2010-05-20 19:57:06 +00001338
Alexey Samsonov0436caa2014-04-30 23:02:40 +00001339 for (const auto &I : DbgValues) {
1340 DIVariable DV(I.first);
1341 if (Processed.count(DV))
Devang Patel490c8ab2010-05-20 19:57:06 +00001342 continue;
1343
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001344 // Instruction ranges, specifying where DV is accessible.
1345 const auto &Ranges = I.second;
1346 if (Ranges.empty())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001347 continue;
Devang Patel9fc11702010-05-25 23:40:22 +00001348
Craig Topper353eda42014-04-24 06:44:33 +00001349 LexicalScope *Scope = nullptr;
David Blaikie09fdfab2014-08-07 22:22:49 +00001350 if (MDNode *IA = DV.getInlinedAt()) {
David Blaikie9b8c8cd2014-05-14 01:08:28 +00001351 DebugLoc DL = DebugLoc::getFromDILocation(IA);
1352 Scope = LScopes.findInlinedScope(DebugLoc::get(
1353 DL.getLine(), DL.getCol(), DV.getContext(), IA));
1354 } else
1355 Scope = LScopes.findLexicalScope(DV.getContext());
Devang Patel490c8ab2010-05-20 19:57:06 +00001356 // If variable scope is not found then skip this variable.
Devang Patelfbd6c452010-05-21 00:10:20 +00001357 if (!Scope)
Devang Patel490c8ab2010-05-20 19:57:06 +00001358 continue;
1359
Adrian Prantlb1416832014-08-01 22:11:58 +00001360 Processed.insert(getEntireVariable(DV));
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001361 const MachineInstr *MInsn = Ranges.front().first;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001362 assert(MInsn->isDebugValue() && "History must begin with debug value");
David Blaikie6f9e8672014-06-13 23:52:55 +00001363 ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode());
1364 ConcreteVariables.push_back(make_unique<DbgVariable>(MInsn, this));
David Blaikieeb1a2722014-06-13 22:18:23 +00001365 DbgVariable *RegVar = ConcreteVariables.back().get();
David Blaikie087e7202014-06-05 01:04:20 +00001366 addScopeVariable(Scope, RegVar);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001367
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001368 // Check if the first DBG_VALUE is valid for the rest of the function.
Adrian Prantlc1197542014-05-30 21:10:13 +00001369 if (Ranges.size() == 1 && Ranges.front().second == nullptr)
Devang Patel9fc11702010-05-25 23:40:22 +00001370 continue;
Devang Patel9fc11702010-05-25 23:40:22 +00001371
Eric Christopher59cc0712013-01-28 17:33:26 +00001372 // Handle multiple DBG_VALUE instructions describing one variable.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001373 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001374
David Blaikie0a456de2014-04-02 01:43:18 +00001375 DotDebugLocEntries.resize(DotDebugLocEntries.size() + 1);
1376 DebugLocList &LocList = DotDebugLocEntries.back();
David Blaikiee1a26a62014-08-05 23:14:16 +00001377 LocList.CU = TheCU;
David Blaikie0a456de2014-04-02 01:43:18 +00001378 LocList.Label =
1379 Asm->GetTempSymbol("debug_loc", DotDebugLocEntries.size() - 1);
Jakob Stoklund Olesen9c057ee2011-03-22 00:21:41 +00001380
Adrian Prantlb1416832014-08-01 22:11:58 +00001381 // Build the location list for this variable.
David Blaikiee1a26a62014-08-05 23:14:16 +00001382 buildLocationList(LocList.List, Ranges);
Devang Patela3e9c9c2010-03-15 18:33:46 +00001383 }
Devang Patele0a94bf2010-05-14 21:01:35 +00001384
1385 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001386 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1387 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1388 DIVariable DV(Variables.getElement(i));
David Blaikie9ba72542014-05-14 21:52:46 +00001389 assert(DV.isVariable());
1390 if (!Processed.insert(DV))
Devang Patel59e27c52011-08-19 23:28:12 +00001391 continue;
David Blaikiebb6a4e22014-06-05 00:51:35 +00001392 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext())) {
David Blaikie6f9e8672014-06-13 23:52:55 +00001393 ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode());
1394 ConcreteVariables.push_back(make_unique<DbgVariable>(DV, this));
David Blaikieeb1a2722014-06-13 22:18:23 +00001395 addScopeVariable(Scope, ConcreteVariables.back().get());
David Blaikiebb6a4e22014-06-05 00:51:35 +00001396 }
Devang Patele0a94bf2010-05-14 21:01:35 +00001397 }
Devang Patel9fc11702010-05-25 23:40:22 +00001398}
Devang Patele0a94bf2010-05-14 21:01:35 +00001399
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001400// Return Label preceding the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001401MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001402 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1403 assert(Label && "Didn't insert label before instruction");
1404 return Label;
Devang Patel9fc11702010-05-25 23:40:22 +00001405}
1406
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001407// Return Label immediately following the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001408MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001409 return LabelsAfterInsn.lookup(MI);
Devang Patel475d32a2009-10-06 01:26:37 +00001410}
1411
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001412// Process beginning of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001413void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Craig Toppere73658d2014-04-28 04:05:08 +00001414 assert(CurMI == nullptr);
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001415 CurMI = MI;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001416 // Check if source location changes, but ignore DBG_VALUE locations.
1417 if (!MI->isDebugValue()) {
1418 DebugLoc DL = MI->getDebugLoc();
1419 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopheraec8a822012-04-05 20:39:05 +00001420 unsigned Flags = 0;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001421 PrevInstLoc = DL;
Devang Patel34a66202011-05-11 19:22:19 +00001422 if (DL == PrologEndLoc) {
1423 Flags |= DWARF2_FLAG_PROLOGUE_END;
1424 PrologEndLoc = DebugLoc();
1425 }
Eric Christopheraec8a822012-04-05 20:39:05 +00001426 if (PrologEndLoc.isUnknown())
1427 Flags |= DWARF2_FLAG_IS_STMT;
1428
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001429 if (!DL.isUnknown()) {
1430 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel34a66202011-05-11 19:22:19 +00001431 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001432 } else
Craig Topper353eda42014-04-24 06:44:33 +00001433 recordSourceLine(0, 0, nullptr, 0);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001434 }
Devang Patel9fc11702010-05-25 23:40:22 +00001435 }
Devang Patel23b2ae62010-03-29 22:59:58 +00001436
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001437 // Insert labels where requested.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001438 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
1439 LabelsBeforeInsn.find(MI);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001440
1441 // No label needed.
1442 if (I == LabelsBeforeInsn.end())
1443 return;
1444
1445 // Label already assigned.
1446 if (I->second)
Devang Patel002d54d2010-05-26 19:37:24 +00001447 return;
Devang Patelbd477be2010-03-29 17:20:31 +00001448
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001449 if (!PrevLabel) {
Devang Patelacc32a52010-05-26 21:23:46 +00001450 PrevLabel = MMI->getContext().CreateTempSymbol();
1451 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel002d54d2010-05-26 19:37:24 +00001452 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001453 I->second = PrevLabel;
Devang Patel8db360d2009-10-06 01:50:42 +00001454}
1455
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001456// Process end of an instruction.
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001457void DwarfDebug::endInstruction() {
Craig Toppere73658d2014-04-28 04:05:08 +00001458 assert(CurMI != nullptr);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001459 // Don't create a new label after DBG_VALUE instructions.
1460 // They don't generate code.
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001461 if (!CurMI->isDebugValue())
Craig Topper353eda42014-04-24 06:44:33 +00001462 PrevLabel = nullptr;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001463
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001464 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001465 LabelsAfterInsn.find(CurMI);
Craig Topper353eda42014-04-24 06:44:33 +00001466 CurMI = nullptr;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001467
1468 // No label needed.
1469 if (I == LabelsAfterInsn.end())
1470 return;
1471
1472 // Label already assigned.
1473 if (I->second)
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001474 return;
1475
1476 // We need a label after this instruction.
1477 if (!PrevLabel) {
1478 PrevLabel = MMI->getContext().CreateTempSymbol();
1479 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel3ebd8932010-04-08 16:50:29 +00001480 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001481 I->second = PrevLabel;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001482}
1483
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001484// Each LexicalScope has first instruction and last instruction to mark
1485// beginning and end of a scope respectively. Create an inverse map that list
1486// scopes starts (and ends) with an instruction. One instruction may start (or
1487// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patel359b0132010-04-08 18:43:56 +00001488void DwarfDebug::identifyScopeMarkers() {
Devang Patel7e623022011-08-10 20:55:27 +00001489 SmallVector<LexicalScope *, 4> WorkList;
1490 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel7771b7c2010-01-20 02:05:23 +00001491 while (!WorkList.empty()) {
Devang Patel7e623022011-08-10 20:55:27 +00001492 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001493
Craig Topper977e9cd2013-07-03 04:24:43 +00001494 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001495 if (!Children.empty())
Benjamin Kramer15596c72014-03-07 19:09:39 +00001496 WorkList.append(Children.begin(), Children.end());
Devang Patel7771b7c2010-01-20 02:05:23 +00001497
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001498 if (S->isAbstractScope())
1499 continue;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001500
Benjamin Kramer15596c72014-03-07 19:09:39 +00001501 for (const InsnRange &R : S->getRanges()) {
1502 assert(R.first && "InsnRange does not have first instruction!");
1503 assert(R.second && "InsnRange does not have second instruction!");
1504 requestLabelBeforeInsn(R.first);
1505 requestLabelAfterInsn(R.second);
Devang Patel6c74a872010-04-27 19:46:33 +00001506 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001507 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001508}
1509
Alexey Samsonov8a86d6d2014-05-27 22:47:41 +00001510static DebugLoc findPrologueEndLoc(const MachineFunction *MF) {
1511 // First known non-DBG_VALUE and non-frame setup location marks
1512 // the beginning of the function body.
1513 for (const auto &MBB : *MF)
1514 for (const auto &MI : MBB)
1515 if (!MI.isDebugValue() && !MI.getFlag(MachineInstr::FrameSetup) &&
1516 !MI.getDebugLoc().isUnknown())
1517 return MI.getDebugLoc();
1518 return DebugLoc();
1519}
1520
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001521// Gather pre-function debug information. Assumes being called immediately
1522// after the function entry point has been emitted.
Chris Lattner76555b52010-01-26 23:18:02 +00001523void DwarfDebug::beginFunction(const MachineFunction *MF) {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001524 CurFn = MF;
Eric Christopherfedfa442013-11-01 23:14:17 +00001525
1526 // If there's no debug info for the function we're not going to do anything.
1527 if (!MMI->hasDebugInfo())
1528 return;
1529
David Blaikie2f040112014-07-25 16:10:16 +00001530 auto DI = FunctionDIs.find(MF->getFunction());
1531 if (DI == FunctionDIs.end())
1532 return;
1533
Eric Christopherfedfa442013-11-01 23:14:17 +00001534 // Grab the lexical scopes for the function, if we don't have any of those
1535 // then we're not going to be able to do anything.
Devang Patel7e623022011-08-10 20:55:27 +00001536 LScopes.initialize(*MF);
Eric Christopher384f3fe2014-03-20 19:16:16 +00001537 if (LScopes.empty())
Eric Christopherfedfa442013-11-01 23:14:17 +00001538 return;
1539
Alexey Samsonov0436caa2014-04-30 23:02:40 +00001540 assert(DbgValues.empty() && "DbgValues map wasn't cleaned!");
Eric Christopherfedfa442013-11-01 23:14:17 +00001541
1542 // Make sure that each lexical scope will have a begin/end label.
Devang Patel7e623022011-08-10 20:55:27 +00001543 identifyScopeMarkers();
Devang Patel4598eb62009-10-06 18:37:31 +00001544
Eric Christopher4287a492013-12-09 23:57:44 +00001545 // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function
Eric Christopherfedfa442013-11-01 23:14:17 +00001546 // belongs to so that we add to the correct per-cu line table in the
1547 // non-asm case.
Manman Ren4e042a62013-02-05 21:52:47 +00001548 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
David Blaikie2f040112014-07-25 16:10:16 +00001549 // FnScope->getScopeNode() and DI->second should represent the same function,
1550 // though they may not be the same MDNode due to inline functions merged in
1551 // LTO where the debug info metadata still differs (either due to distinct
1552 // written differences - two versions of a linkonce_odr function
1553 // written/copied into two separate files, or some sub-optimal metadata that
1554 // isn't structurally identical (see: file path/name info from clang, which
1555 // includes the directory of the cpp file being built, even when the file name
1556 // is absolute (such as an <> lookup header)))
Eric Christopher4287a492013-12-09 23:57:44 +00001557 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Manman Ren4e042a62013-02-05 21:52:47 +00001558 assert(TheCU && "Unable to find compile unit!");
Rafael Espindolab4eec1d2014-02-05 18:00:21 +00001559 if (Asm->OutStreamer.hasRawTextSupport())
1560 // Use a single line table if we are generating assembly.
Manman Ren9d4c7352013-05-21 00:57:22 +00001561 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1562 else
1563 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
Manman Ren4e042a62013-02-05 21:52:47 +00001564
Eric Christopherfedfa442013-11-01 23:14:17 +00001565 // Emit a label for the function so that we have a beginning address.
1566 FunctionBeginSym = Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber());
Bill Wendling2b128d72009-05-20 23:19:06 +00001567 // Assumes in correct section after the entry point.
Devang Patel6c74a872010-04-27 19:46:33 +00001568 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendling2b128d72009-05-20 23:19:06 +00001569
Alexey Samsonov414b6fb2014-04-30 21:34:11 +00001570 // Calculate history for local variables.
Eric Christopherd9134482014-08-04 21:25:23 +00001571 calculateDbgValueHistory(MF, Asm->TM.getSubtargetImpl()->getRegisterInfo(),
1572 DbgValues);
Alexey Samsonov414b6fb2014-04-30 21:34:11 +00001573
1574 // Request labels for the full history.
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001575 for (const auto &I : DbgValues) {
1576 const auto &Ranges = I.second;
1577 if (Ranges.empty())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001578 continue;
1579
Alexey Samsonov414b6fb2014-04-30 21:34:11 +00001580 // The first mention of a function argument gets the FunctionBeginSym
1581 // label, so arguments are visible when breaking at function entry.
Adrian Prantlb1416832014-08-01 22:11:58 +00001582 DIVariable DV(Ranges.front().first->getDebugVariable());
Alexey Samsonov414b6fb2014-04-30 21:34:11 +00001583 if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
Adrian Prantlb1416832014-08-01 22:11:58 +00001584 getDISubprogram(DV.getContext()).describes(MF->getFunction())) {
1585 if (!DV.isVariablePiece())
1586 LabelsBeforeInsn[Ranges.front().first] = FunctionBeginSym;
1587 else {
1588 // Mark all non-overlapping initial pieces.
1589 for (auto I = Ranges.begin(); I != Ranges.end(); ++I) {
1590 DIVariable Piece = I->first->getDebugVariable();
1591 if (std::all_of(Ranges.begin(), I,
1592 [&](DbgValueHistoryMap::InstrRange Pred){
1593 return !piecesOverlap(Piece, Pred.first->getDebugVariable());
1594 }))
1595 LabelsBeforeInsn[I->first] = FunctionBeginSym;
1596 else
1597 break;
1598 }
1599 }
1600 }
Alexey Samsonov414b6fb2014-04-30 21:34:11 +00001601
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001602 for (const auto &Range : Ranges) {
1603 requestLabelBeforeInsn(Range.first);
1604 if (Range.second)
1605 requestLabelAfterInsn(Range.second);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001606 }
1607 }
Devang Patel002d54d2010-05-26 19:37:24 +00001608
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001609 PrevInstLoc = DebugLoc();
Devang Patel002d54d2010-05-26 19:37:24 +00001610 PrevLabel = FunctionBeginSym;
Devang Patel34a66202011-05-11 19:22:19 +00001611
1612 // Record beginning of function.
Alexey Samsonov8a86d6d2014-05-27 22:47:41 +00001613 PrologEndLoc = findPrologueEndLoc(MF);
Devang Patel34a66202011-05-11 19:22:19 +00001614 if (!PrologEndLoc.isUnknown()) {
Eric Christopherfedfa442013-11-01 23:14:17 +00001615 DebugLoc FnStartDL =
Timur Iskhodzhanovf166f6c2014-01-30 01:39:17 +00001616 PrologEndLoc.getFnDebugLoc(MF->getFunction()->getContext());
Eric Christopherfedfa442013-11-01 23:14:17 +00001617 recordSourceLine(
1618 FnStartDL.getLine(), FnStartDL.getCol(),
1619 FnStartDL.getScope(MF->getFunction()->getContext()),
1620 // We'd like to list the prologue as "not statements" but GDB behaves
1621 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
1622 DWARF2_FLAG_IS_STMT);
Devang Patel34a66202011-05-11 19:22:19 +00001623 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001624}
1625
David Blaikieafd2c6b2014-04-22 05:41:06 +00001626void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
David Blaikie087e7202014-06-05 01:04:20 +00001627 if (addCurrentFnArgument(Var, LS))
1628 return;
David Blaikieafd2c6b2014-04-22 05:41:06 +00001629 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1630 DIVariable DV = Var->getVariable();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001631 // Variables with positive arg numbers are parameters.
1632 if (unsigned ArgNum = DV.getArgNumber()) {
1633 // Keep all parameters in order at the start of the variable list to ensure
1634 // function types are correct (no out-of-order parameters)
1635 //
1636 // This could be improved by only doing it for optimized builds (unoptimized
1637 // builds have the right order to begin with), searching from the back (this
1638 // would catch the unoptimized case quickly), or doing a binary search
1639 // rather than linear search.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001640 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001641 while (I != Vars.end()) {
David Blaikieafd2c6b2014-04-22 05:41:06 +00001642 unsigned CurNum = (*I)->getVariable().getArgNumber();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001643 // A local (non-parameter) variable has been found, insert immediately
1644 // before it.
1645 if (CurNum == 0)
1646 break;
1647 // A later indexed parameter has been found, insert immediately before it.
David Blaikieb272a752013-06-06 22:28:26 +00001648 if (CurNum > ArgNum)
David Blaikie36d5d2f2013-06-06 21:04:51 +00001649 break;
David Blaikieb272a752013-06-06 22:28:26 +00001650 ++I;
David Blaikie6f1a8062013-06-05 05:39:59 +00001651 }
David Blaikieafd2c6b2014-04-22 05:41:06 +00001652 Vars.insert(I, Var);
1653 return;
David Blaikie6f1a8062013-06-05 05:39:59 +00001654 }
1655
David Blaikieafd2c6b2014-04-22 05:41:06 +00001656 Vars.push_back(Var);
Devang Patel7e623022011-08-10 20:55:27 +00001657}
1658
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001659// Gather and emit post-function debug information.
NAKAMURA Takumib9271612013-12-03 13:15:54 +00001660void DwarfDebug::endFunction(const MachineFunction *MF) {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001661 // Every beginFunction(MF) call should be followed by an endFunction(MF) call,
1662 // though the beginFunction may not be called at all.
1663 // We should handle both cases.
Craig Topper353eda42014-04-24 06:44:33 +00001664 if (!CurFn)
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001665 CurFn = MF;
1666 else
1667 assert(CurFn == MF);
Craig Toppere73658d2014-04-28 04:05:08 +00001668 assert(CurFn != nullptr);
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001669
David Blaikie2f040112014-07-25 16:10:16 +00001670 if (!MMI->hasDebugInfo() || LScopes.empty() ||
1671 !FunctionDIs.count(MF->getFunction())) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00001672 // If we don't have a lexical scope for this function then there will
1673 // be a hole in the range information. Keep note of this by setting the
1674 // previously used section to nullptr.
Eric Christopher384f3fe2014-03-20 19:16:16 +00001675 PrevCU = nullptr;
Craig Topper353eda42014-04-24 06:44:33 +00001676 CurFn = nullptr;
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001677 return;
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001678 }
Devang Patel2904aa92009-11-12 19:02:56 +00001679
Devang Patel7e623022011-08-10 20:55:27 +00001680 // Define end label for subprogram.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001681 FunctionEndSym = Asm->GetTempSymbol("func_end", Asm->getFunctionNumber());
Devang Patel7e623022011-08-10 20:55:27 +00001682 // Assumes in correct section after the entry point.
1683 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Eric Christopher1a972152014-01-29 23:05:43 +00001684
Eric Christopher4287a492013-12-09 23:57:44 +00001685 // Set DwarfDwarfCompileUnitID in MCContext to default value.
Manman Ren4e042a62013-02-05 21:52:47 +00001686 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher6a841382012-11-19 22:42:10 +00001687
Devang Patel7e623022011-08-10 20:55:27 +00001688 SmallPtrSet<const MDNode *, 16> ProcessedVars;
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001689 collectVariableInfo(ProcessedVars);
Eric Christopher6a841382012-11-19 22:42:10 +00001690
Devang Patel3acc70e2011-08-15 22:04:40 +00001691 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
David Blaikief9b6a552014-04-22 22:39:41 +00001692 DwarfCompileUnit &TheCU = *SPMap.lookup(FnScope->getScopeNode());
Devang Patel3acc70e2011-08-15 22:04:40 +00001693
David Blaikie3a7ce252014-09-19 17:03:16 +00001694 // Add the range of this function to the list of ranges for the CU.
1695 TheCU.addRange(RangeSpan(FunctionBeginSym, FunctionEndSym));
1696
1697 // Under -gmlt, skip building the subprogram if there are no inlined
1698 // subroutines inside it.
1699 if (TheCU.getCUNode().getEmissionKind() == DIBuilder::LineTablesOnly &&
David Blaikiee1c79742014-09-30 21:28:32 +00001700 LScopes.getAbstractScopesList().empty() && !IsDarwin) {
David Blaikie3a7ce252014-09-19 17:03:16 +00001701 assert(ScopeVariables.empty());
1702 assert(CurrentFnArguments.empty());
1703 assert(DbgValues.empty());
1704 assert(AbstractVariables.empty());
1705 LabelsBeforeInsn.clear();
1706 LabelsAfterInsn.clear();
1707 PrevLabel = nullptr;
1708 CurFn = nullptr;
1709 return;
1710 }
1711
Devang Patel7e623022011-08-10 20:55:27 +00001712 // Construct abstract scopes.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001713 for (LexicalScope *AScope : LScopes.getAbstractScopesList()) {
Devang Patel44403472011-08-12 18:10:19 +00001714 DISubprogram SP(AScope->getScopeNode());
David Blaikiedb5371b2014-07-18 22:26:59 +00001715 assert(SP.isSubprogram());
David Blaikie4abe19e2014-05-12 18:23:35 +00001716 // Collect info for variables that were optimized out.
1717 DIArray Variables = SP.getVariables();
1718 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1719 DIVariable DV(Variables.getElement(i));
1720 assert(DV && DV.isVariable());
1721 if (!ProcessedVars.insert(DV))
1722 continue;
David Blaikie6f9e8672014-06-13 23:52:55 +00001723 ensureAbstractVariableIsCreated(DV, DV.getContext());
Devang Patel5c0f85c2010-06-25 22:07:34 +00001724 }
David Blaikie4abe19e2014-05-12 18:23:35 +00001725 constructAbstractSubprogramScopeDIE(TheCU, AScope);
Bill Wendling2b128d72009-05-20 23:19:06 +00001726 }
Eric Christopher6a841382012-11-19 22:42:10 +00001727
David Blaikiee872a6e2014-04-29 15:58:35 +00001728 DIE &CurFnDIE = constructSubprogramScopeDIE(TheCU, FnScope);
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001729 if (!CurFn->getTarget().Options.DisableFramePointerElim(*CurFn))
David Blaikief9b6a552014-04-22 22:39:41 +00001730 TheCU.addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Patel3acc70e2011-08-15 22:04:40 +00001731
Bill Wendling2b128d72009-05-20 23:19:06 +00001732 // Clear debug info
David Blaikie825bdd22014-05-21 22:41:17 +00001733 // Ownership of DbgVariables is a bit subtle - ScopeVariables owns all the
1734 // DbgVariables except those that are also in AbstractVariables (since they
1735 // can be used cross-function)
Devang Patel7e623022011-08-10 20:55:27 +00001736 ScopeVariables.clear();
David Blaikieeb1a2722014-06-13 22:18:23 +00001737 CurrentFnArguments.clear();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001738 DbgValues.clear();
Devang Patel6c74a872010-04-27 19:46:33 +00001739 LabelsBeforeInsn.clear();
1740 LabelsAfterInsn.clear();
Craig Topper353eda42014-04-24 06:44:33 +00001741 PrevLabel = nullptr;
1742 CurFn = nullptr;
Bill Wendling2b128d72009-05-20 23:19:06 +00001743}
1744
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001745// Register a source line with debug info. Returns the unique label that was
1746// emitted and which provides correspondence to the source line list.
Devang Patel34a66202011-05-11 19:22:19 +00001747void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1748 unsigned Flags) {
Devang Patel2d9caf92009-11-25 17:36:49 +00001749 StringRef Fn;
Devang Patele01b75c2011-03-24 20:30:50 +00001750 StringRef Dir;
Dan Gohman50849c62010-05-05 23:41:32 +00001751 unsigned Src = 1;
Diego Novillo282450d2014-03-03 18:53:17 +00001752 unsigned Discriminator = 0;
David Blaikie4c6d9872014-05-15 20:18:50 +00001753 if (DIScope Scope = DIScope(S)) {
1754 assert(Scope.isScope());
1755 Fn = Scope.getFilename();
1756 Dir = Scope.getDirectory();
David Blaikie2f3f76f2014-08-21 22:45:21 +00001757 if (Scope.isLexicalBlockFile())
1758 Discriminator = DILexicalBlockFile(S).getDiscriminator();
Dan Gohman50849c62010-05-05 23:41:32 +00001759
David Blaikie0e8d4012014-03-17 23:53:25 +00001760 unsigned CUID = Asm->OutStreamer.getContext().getDwarfCompileUnitID();
David Blaikiec33b3cd2014-04-22 21:27:37 +00001761 Src = static_cast<DwarfCompileUnit &>(*InfoHolder.getUnits()[CUID])
1762 .getOrCreateSourceID(Fn, Dir);
Dan Gohman50849c62010-05-05 23:41:32 +00001763 }
Diego Novillo282450d2014-03-03 18:53:17 +00001764 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0,
1765 Discriminator, Fn);
Bill Wendling2b128d72009-05-20 23:19:06 +00001766}
1767
Bill Wendling806535f2009-05-20 23:22:40 +00001768//===----------------------------------------------------------------------===//
1769// Emit Methods
1770//===----------------------------------------------------------------------===//
1771
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001772// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001773void DwarfDebug::emitSectionLabels() {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001774 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00001775
Bill Wendling480ff322009-05-20 23:21:38 +00001776 // Dwarf sections base addresses.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001777 DwarfInfoSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001778 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
David Blaikie29459ae2014-07-25 17:11:58 +00001779 if (useSplitDwarf()) {
Eric Christopherd8667202013-12-30 17:22:27 +00001780 DwarfInfoDWOSectionSym =
1781 emitSectionSym(Asm, TLOF.getDwarfInfoDWOSection(), "section_info_dwo");
David Blaikie29459ae2014-07-25 17:11:58 +00001782 DwarfTypesDWOSectionSym =
1783 emitSectionSym(Asm, TLOF.getDwarfTypesDWOSection(), "section_types_dwo");
1784 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001785 DwarfAbbrevSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001786 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher3c5a1912012-12-19 22:02:53 +00001787 if (useSplitDwarf())
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001788 DwarfAbbrevDWOSectionSym = emitSectionSym(
1789 Asm, TLOF.getDwarfAbbrevDWOSection(), "section_abbrev_dwo");
David Blaikie20474102014-02-25 22:46:44 +00001790 if (GenerateARangeSection)
1791 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001792
Eric Christopher74804332013-02-07 21:19:50 +00001793 DwarfLineSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001794 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher261d2342013-09-23 20:55:35 +00001795 if (GenerateGnuPubSections) {
Eric Christopher39eebfa2013-09-30 23:14:16 +00001796 DwarfGnuPubNamesSectionSym =
1797 emitSectionSym(Asm, TLOF.getDwarfGnuPubNamesSection());
1798 DwarfGnuPubTypesSectionSym =
1799 emitSectionSym(Asm, TLOF.getDwarfGnuPubTypesSection());
Eric Christopher261d2342013-09-23 20:55:35 +00001800 } else if (HasDwarfPubSections) {
1801 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
1802 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001803 }
Eric Christopherdd1a0122013-09-13 00:35:05 +00001804
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001805 DwarfStrSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001806 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001807 if (useSplitDwarf()) {
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001808 DwarfStrDWOSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001809 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001810 DwarfAddrSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001811 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
David Blaikiee12ab122014-04-01 16:09:49 +00001812 DwarfDebugLocSectionSym =
David Blaikie9c550ac2014-03-25 01:44:02 +00001813 emitSectionSym(Asm, TLOF.getDwarfLocDWOSection(), "skel_loc");
1814 } else
1815 DwarfDebugLocSectionSym =
1816 emitSectionSym(Asm, TLOF.getDwarfLocSection(), "section_debug_loc");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001817 DwarfDebugRangeSectionSym =
1818 emitSectionSym(Asm, TLOF.getDwarfRangesSection(), "debug_range");
Bill Wendling480ff322009-05-20 23:21:38 +00001819}
1820
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001821// Recursively emits a debug information entry.
David Blaikieb8184182014-04-14 22:45:02 +00001822void DwarfDebug::emitDIE(DIE &Die) {
Bill Wendling480ff322009-05-20 23:21:38 +00001823 // Get the abbreviation for this DIE.
David Blaikieb8184182014-04-14 22:45:02 +00001824 const DIEAbbrev &Abbrev = Die.getAbbrev();
Bill Wendling480ff322009-05-20 23:21:38 +00001825
Bill Wendling480ff322009-05-20 23:21:38 +00001826 // Emit the code (index) for the abbreviation.
Chris Lattner7bde8c02010-04-04 18:52:31 +00001827 if (Asm->isVerbose())
David Blaikieff3ab2c2013-12-05 01:01:41 +00001828 Asm->OutStreamer.AddComment("Abbrev [" + Twine(Abbrev.getNumber()) +
David Blaikieb8184182014-04-14 22:45:02 +00001829 "] 0x" + Twine::utohexstr(Die.getOffset()) +
1830 ":0x" + Twine::utohexstr(Die.getSize()) + " " +
David Blaikieff3ab2c2013-12-05 01:01:41 +00001831 dwarf::TagString(Abbrev.getTag()));
1832 Asm->EmitULEB128(Abbrev.getNumber());
Bill Wendling480ff322009-05-20 23:21:38 +00001833
David Blaikieb8184182014-04-14 22:45:02 +00001834 const SmallVectorImpl<DIEValue *> &Values = Die.getValues();
David Blaikieff3ab2c2013-12-05 01:01:41 +00001835 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
Bill Wendling480ff322009-05-20 23:21:38 +00001836
1837 // Emit the DIE attribute values.
1838 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
David Blaikief2443192013-10-21 17:28:37 +00001839 dwarf::Attribute Attr = AbbrevData[i].getAttribute();
1840 dwarf::Form Form = AbbrevData[i].getForm();
Bill Wendling480ff322009-05-20 23:21:38 +00001841 assert(Form && "Too many attributes for DIE (check abbreviation)");
1842
Eric Christopher13a1bb32014-03-06 00:00:49 +00001843 if (Asm->isVerbose()) {
Chris Lattner5adf9872010-01-24 18:54:17 +00001844 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Eric Christopher13a1bb32014-03-06 00:00:49 +00001845 if (Attr == dwarf::DW_AT_accessibility)
1846 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(
1847 cast<DIEInteger>(Values[i])->getValue()));
1848 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001849
Eric Christopherdd508382014-03-06 00:00:56 +00001850 // Emit an attribute using the defined form.
1851 Values[i]->EmitValue(Asm, Form);
Bill Wendling480ff322009-05-20 23:21:38 +00001852 }
1853
1854 // Emit the DIE children if any.
Eric Christophere8f10722014-03-05 01:44:58 +00001855 if (Abbrev.hasChildren()) {
David Blaikieb8184182014-04-14 22:45:02 +00001856 for (auto &Child : Die.getChildren())
1857 emitDIE(*Child);
Bill Wendling480ff322009-05-20 23:21:38 +00001858
David Blaikie155f8812013-12-04 21:51:05 +00001859 Asm->OutStreamer.AddComment("End Of Children Mark");
Chris Lattner566cae92010-03-09 23:52:58 +00001860 Asm->EmitInt8(0);
Bill Wendling480ff322009-05-20 23:21:38 +00001861 }
1862}
1863
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001864// Emit the debug info section.
1865void DwarfDebug::emitDebugInfo() {
Eric Christopherf8194852013-12-05 18:06:10 +00001866 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Eric Christophera2de8262012-12-15 00:04:07 +00001867
David Blaikief72ed5f2014-03-24 20:31:01 +00001868 Holder.emitUnits(this, DwarfAbbrevSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001869}
1870
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001871// Emit the abbreviation section.
Eric Christopher38371952012-11-20 23:30:11 +00001872void DwarfDebug::emitAbbreviations() {
Eric Christopherf8194852013-12-05 18:06:10 +00001873 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
David Blaikie0504cda2013-12-05 07:43:55 +00001874
1875 Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
Eric Christopher3c5a1912012-12-19 22:02:53 +00001876}
Bill Wendling480ff322009-05-20 23:21:38 +00001877
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001878// Emit the last address of the section and the end of the line matrix.
Devang Patel930143b2009-11-21 02:48:08 +00001879void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling480ff322009-05-20 23:21:38 +00001880 // Define last address of section.
Chris Lattner566cae92010-03-09 23:52:58 +00001881 Asm->OutStreamer.AddComment("Extended Op");
1882 Asm->EmitInt8(0);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001883
Chris Lattner566cae92010-03-09 23:52:58 +00001884 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth5da3f052012-11-01 09:14:31 +00001885 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner566cae92010-03-09 23:52:58 +00001886 Asm->OutStreamer.AddComment("DW_LNE_set_address");
1887 Asm->EmitInt8(dwarf::DW_LNE_set_address);
1888
1889 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerb245dfb2010-03-10 01:17:49 +00001890
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001891 Asm->OutStreamer.EmitSymbolValue(
1892 Asm->GetTempSymbol("section_end", SectionEnd),
1893 Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00001894
1895 // Mark end of matrix.
Chris Lattner566cae92010-03-09 23:52:58 +00001896 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1897 Asm->EmitInt8(0);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00001898 Asm->EmitInt8(1);
Chris Lattnerfa823552010-01-22 23:18:42 +00001899 Asm->EmitInt8(1);
Bill Wendling480ff322009-05-20 23:21:38 +00001900}
1901
David Blaikie6741bb02014-09-11 21:12:48 +00001902void DwarfDebug::emitAccel(DwarfAccelTable &Accel, const MCSection *Section,
1903 StringRef TableName, StringRef SymName) {
1904 Accel.FinalizeTable(Asm, TableName);
1905 Asm->OutStreamer.SwitchSection(Section);
1906 auto *SectionBegin = Asm->GetTempSymbol(SymName);
Eric Christopher4996c702011-11-07 09:24:32 +00001907 Asm->OutStreamer.EmitLabel(SectionBegin);
1908
1909 // Emit the full data.
David Blaikie6741bb02014-09-11 21:12:48 +00001910 Accel.Emit(Asm, SectionBegin, &InfoHolder, DwarfStrSectionSym);
1911}
1912
1913// Emit visible names into a hashed accelerator table section.
1914void DwarfDebug::emitAccelNames() {
1915 emitAccel(AccelNames, Asm->getObjFileLowering().getDwarfAccelNamesSection(),
1916 "Names", "names_begin");
Eric Christopher4996c702011-11-07 09:24:32 +00001917}
1918
Eric Christopher48fef592012-12-20 21:58:40 +00001919// Emit objective C classes and categories into a hashed accelerator table
1920// section.
Eric Christopher4996c702011-11-07 09:24:32 +00001921void DwarfDebug::emitAccelObjC() {
David Blaikie6741bb02014-09-11 21:12:48 +00001922 emitAccel(AccelObjC, Asm->getObjFileLowering().getDwarfAccelObjCSection(),
1923 "ObjC", "objc_begin");
Eric Christopher4996c702011-11-07 09:24:32 +00001924}
1925
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001926// Emit namespace dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00001927void DwarfDebug::emitAccelNamespaces() {
David Blaikie6741bb02014-09-11 21:12:48 +00001928 emitAccel(AccelNamespace,
1929 Asm->getObjFileLowering().getDwarfAccelNamespaceSection(),
1930 "namespac", "namespac_begin");
Eric Christopher4996c702011-11-07 09:24:32 +00001931}
1932
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001933// Emit type dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00001934void DwarfDebug::emitAccelTypes() {
David Blaikie6741bb02014-09-11 21:12:48 +00001935 emitAccel(AccelTypes, Asm->getObjFileLowering().getDwarfAccelTypesSection(),
1936 "types", "types_begin");
Eric Christopher4996c702011-11-07 09:24:32 +00001937}
1938
Eric Christopherdd1a0122013-09-13 00:35:05 +00001939// Public name handling.
1940// The format for the various pubnames:
1941//
1942// dwarf pubnames - offset/name pairs where the offset is the offset into the CU
1943// for the DIE that is named.
1944//
1945// gnu pubnames - offset/index value/name tuples where the offset is the offset
1946// into the CU and the index value is computed according to the type of value
1947// for the DIE that is named.
1948//
1949// For type units the offset is the offset of the skeleton DIE. For split dwarf
1950// it's the offset within the debug_info/debug_types dwo section, however, the
1951// reference in the pubname header doesn't change.
1952
1953/// computeIndexValue - Compute the gdb index value for the DIE and CU.
Eric Christophera5a79422013-12-09 23:32:48 +00001954static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU,
Eric Christopher0fe676a2013-11-21 00:48:22 +00001955 const DIE *Die) {
Eric Christopherd2b497b2013-10-16 01:37:49 +00001956 dwarf::GDBIndexEntryLinkage Linkage = dwarf::GIEL_STATIC;
1957
1958 // We could have a specification DIE that has our most of our knowledge,
1959 // look for that now.
1960 DIEValue *SpecVal = Die->findAttribute(dwarf::DW_AT_specification);
1961 if (SpecVal) {
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001962 DIE &SpecDIE = cast<DIEEntry>(SpecVal)->getEntry();
1963 if (SpecDIE.findAttribute(dwarf::DW_AT_external))
Eric Christopherd2b497b2013-10-16 01:37:49 +00001964 Linkage = dwarf::GIEL_EXTERNAL;
1965 } else if (Die->findAttribute(dwarf::DW_AT_external))
1966 Linkage = dwarf::GIEL_EXTERNAL;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001967
1968 switch (Die->getTag()) {
1969 case dwarf::DW_TAG_class_type:
1970 case dwarf::DW_TAG_structure_type:
1971 case dwarf::DW_TAG_union_type:
1972 case dwarf::DW_TAG_enumeration_type:
Eric Christopher261d2342013-09-23 20:55:35 +00001973 return dwarf::PubIndexEntryDescriptor(
1974 dwarf::GIEK_TYPE, CU->getLanguage() != dwarf::DW_LANG_C_plus_plus
1975 ? dwarf::GIEL_STATIC
1976 : dwarf::GIEL_EXTERNAL);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001977 case dwarf::DW_TAG_typedef:
1978 case dwarf::DW_TAG_base_type:
1979 case dwarf::DW_TAG_subrange_type:
David Blaikie8dec4072013-09-19 20:40:26 +00001980 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE, dwarf::GIEL_STATIC);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001981 case dwarf::DW_TAG_namespace:
David Blaikie8dec4072013-09-19 20:40:26 +00001982 return dwarf::GIEK_TYPE;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001983 case dwarf::DW_TAG_subprogram:
Eric Christopherccac5c42013-09-23 22:59:14 +00001984 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_FUNCTION, Linkage);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001985 case dwarf::DW_TAG_constant:
1986 case dwarf::DW_TAG_variable:
Eric Christopherccac5c42013-09-23 22:59:14 +00001987 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, Linkage);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001988 case dwarf::DW_TAG_enumerator:
David Blaikie8dec4072013-09-19 20:40:26 +00001989 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE,
1990 dwarf::GIEL_STATIC);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001991 default:
David Blaikie8dec4072013-09-19 20:40:26 +00001992 return dwarf::GIEK_NONE;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001993 }
Eric Christopherdd1a0122013-09-13 00:35:05 +00001994}
1995
Eric Christopher5f93bb92013-09-09 20:03:17 +00001996/// emitDebugPubNames - Emit visible names into a debug pubnames section.
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001997///
Eric Christopherdd1a0122013-09-13 00:35:05 +00001998void DwarfDebug::emitDebugPubNames(bool GnuStyle) {
Eric Christopherdd1a0122013-09-13 00:35:05 +00001999 const MCSection *PSec =
2000 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection()
2001 : Asm->getObjFileLowering().getDwarfPubNamesSection();
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002002
David Blaikie0f55e832014-03-11 23:18:15 +00002003 emitDebugPubSection(GnuStyle, PSec, "Names", &DwarfUnit::getGlobalNames);
2004}
2005
2006void DwarfDebug::emitDebugPubSection(
2007 bool GnuStyle, const MCSection *PSec, StringRef Name,
2008 const StringMap<const DIE *> &(DwarfUnit::*Accessor)() const) {
David Blaikiec3d9e9e2014-03-06 01:42:00 +00002009 for (const auto &NU : CUMap) {
2010 DwarfCompileUnit *TheU = NU.second;
David Blaikie55bb8ac2014-03-11 23:23:39 +00002011
2012 const auto &Globals = (TheU->*Accessor)();
2013
David Blaikiece2f1cb2014-03-11 23:35:06 +00002014 if (Globals.empty())
2015 continue;
2016
David Blaikiec3d9e9e2014-03-06 01:42:00 +00002017 if (auto Skeleton = static_cast<DwarfCompileUnit *>(TheU->getSkeleton()))
2018 TheU = Skeleton;
David Blaikie2a80e442013-12-02 22:09:48 +00002019 unsigned ID = TheU->getUniqueID();
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002020
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002021 // Start the dwarf pubnames section.
Eric Christopher13b99d22013-09-10 21:49:37 +00002022 Asm->OutStreamer.SwitchSection(PSec);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002023
Eric Christopherdd1a0122013-09-13 00:35:05 +00002024 // Emit the header.
David Blaikie0f55e832014-03-11 23:18:15 +00002025 Asm->OutStreamer.AddComment("Length of Public " + Name + " Info");
2026 MCSymbol *BeginLabel = Asm->GetTempSymbol("pub" + Name + "_begin", ID);
2027 MCSymbol *EndLabel = Asm->GetTempSymbol("pub" + Name + "_end", ID);
David Blaikieb7a1c4d2013-12-04 17:55:41 +00002028 Asm->EmitLabelDifference(EndLabel, BeginLabel, 4);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002029
David Blaikieb7a1c4d2013-12-04 17:55:41 +00002030 Asm->OutStreamer.EmitLabel(BeginLabel);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002031
2032 Asm->OutStreamer.AddComment("DWARF Version");
David Majnemered89b5c2013-08-21 06:13:34 +00002033 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002034
2035 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
David Blaikie7d734602013-12-06 22:33:05 +00002036 Asm->EmitSectionOffset(TheU->getLabelBegin(), TheU->getSectionSym());
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002037
2038 Asm->OutStreamer.AddComment("Compilation Unit Length");
David Blaikie7d734602013-12-06 22:33:05 +00002039 Asm->EmitLabelDifference(TheU->getLabelEnd(), TheU->getLabelBegin(), 4);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002040
Eric Christopherdd1a0122013-09-13 00:35:05 +00002041 // Emit the pubnames for this compilation unit.
David Blaikie55bb8ac2014-03-11 23:23:39 +00002042 for (const auto &GI : Globals) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00002043 const char *Name = GI.getKeyData();
2044 const DIE *Entity = GI.second;
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002045
2046 Asm->OutStreamer.AddComment("DIE offset");
2047 Asm->EmitInt32(Entity->getOffset());
2048
Eric Christopherdd1a0122013-09-13 00:35:05 +00002049 if (GnuStyle) {
David Blaikie2a80e442013-12-02 22:09:48 +00002050 dwarf::PubIndexEntryDescriptor Desc = computeIndexValue(TheU, Entity);
David Blaikied0a869d2013-09-19 22:19:37 +00002051 Asm->OutStreamer.AddComment(
David Blaikieefd0bcb2013-09-20 00:33:15 +00002052 Twine("Kind: ") + dwarf::GDBIndexEntryKindString(Desc.Kind) + ", " +
David Blaikie404d3042013-09-19 23:01:29 +00002053 dwarf::GDBIndexEntryLinkageString(Desc.Linkage));
David Blaikied0a869d2013-09-19 22:19:37 +00002054 Asm->EmitInt8(Desc.toBits());
Eric Christopherdd1a0122013-09-13 00:35:05 +00002055 }
2056
David Blaikie155f8812013-12-04 21:51:05 +00002057 Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer15596c72014-03-07 19:09:39 +00002058 Asm->OutStreamer.EmitBytes(StringRef(Name, GI.getKeyLength() + 1));
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002059 }
2060
2061 Asm->OutStreamer.AddComment("End Mark");
2062 Asm->EmitInt32(0);
David Blaikieb7a1c4d2013-12-04 17:55:41 +00002063 Asm->OutStreamer.EmitLabel(EndLabel);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002064 }
2065}
2066
Eric Christopherdd1a0122013-09-13 00:35:05 +00002067void DwarfDebug::emitDebugPubTypes(bool GnuStyle) {
Eric Christopher261d2342013-09-23 20:55:35 +00002068 const MCSection *PSec =
2069 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
2070 : Asm->getObjFileLowering().getDwarfPubTypesSection();
Eric Christopher8b3737f2013-09-13 00:34:58 +00002071
David Blaikie0f55e832014-03-11 23:18:15 +00002072 emitDebugPubSection(GnuStyle, PSec, "Types", &DwarfUnit::getGlobalTypes);
Devang Patel04d2f2d2009-11-24 01:14:22 +00002073}
2074
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002075// Emit visible names into a debug str section.
2076void DwarfDebug::emitDebugStr() {
Eric Christopherf8194852013-12-05 18:06:10 +00002077 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002078 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2079}
2080
Adrian Prantlb1416832014-08-01 22:11:58 +00002081/// Emits an optimal (=sorted) sequence of DW_OP_pieces.
2082void DwarfDebug::emitLocPieces(ByteStreamer &Streamer,
2083 const DITypeIdentifierMap &Map,
2084 ArrayRef<DebugLocEntry::Value> Values) {
Adrian Prantl293dd932014-08-11 21:05:55 +00002085 assert(std::all_of(Values.begin(), Values.end(), [](DebugLocEntry::Value P) {
Adrian Prantl76502d82014-08-11 23:22:59 +00002086 return P.isVariablePiece();
Adrian Prantlb1416832014-08-01 22:11:58 +00002087 }) && "all values are expected to be pieces");
Adrian Prantl293dd932014-08-11 21:05:55 +00002088 assert(std::is_sorted(Values.begin(), Values.end()) &&
2089 "pieces are expected to be sorted");
Adrian Prantlb1416832014-08-01 22:11:58 +00002090
2091 unsigned Offset = 0;
Adrian Prantl293dd932014-08-11 21:05:55 +00002092 for (auto Piece : Values) {
Adrian Prantl76502d82014-08-11 23:22:59 +00002093 DIVariable Var = Piece.getVariable();
Adrian Prantlb1416832014-08-01 22:11:58 +00002094 unsigned PieceOffset = Var.getPieceOffset();
2095 unsigned PieceSize = Var.getPieceSize();
Adrian Prantl293dd932014-08-11 21:05:55 +00002096 assert(Offset <= PieceOffset && "overlapping or duplicate pieces");
Adrian Prantlb1416832014-08-01 22:11:58 +00002097 if (Offset < PieceOffset) {
2098 // The DWARF spec seriously mandates pieces with no locations for gaps.
2099 Asm->EmitDwarfOpPiece(Streamer, (PieceOffset-Offset)*8);
2100 Offset += PieceOffset-Offset;
2101 }
2102
2103 Offset += PieceSize;
2104
2105 const unsigned SizeOfByte = 8;
2106 assert(!Var.isIndirect() && "indirect address for piece");
2107#ifndef NDEBUG
2108 unsigned VarSize = Var.getSizeInBits(Map);
2109 assert(PieceSize+PieceOffset <= VarSize/SizeOfByte
2110 && "piece is larger than or outside of variable");
2111 assert(PieceSize*SizeOfByte != VarSize
2112 && "piece covers entire variable");
2113#endif
2114 if (Piece.isLocation() && Piece.getLoc().isReg())
2115 Asm->EmitDwarfRegOpPiece(Streamer,
2116 Piece.getLoc(),
2117 PieceSize*SizeOfByte);
2118 else {
2119 emitDebugLocValue(Streamer, Piece);
2120 Asm->EmitDwarfOpPiece(Streamer, PieceSize*SizeOfByte);
2121 }
2122 }
2123}
2124
2125
Eric Christopher29e874d2014-03-07 22:40:37 +00002126void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer,
Eric Christopher05135fb2014-03-18 02:18:24 +00002127 const DebugLocEntry &Entry) {
Adrian Prantle19e5ef2014-04-27 18:25:40 +00002128 const DebugLocEntry::Value Value = Entry.getValues()[0];
Adrian Prantl76502d82014-08-11 23:22:59 +00002129 if (Value.isVariablePiece())
Adrian Prantlb1416832014-08-01 22:11:58 +00002130 // Emit all pieces that belong to the same variable and range.
2131 return emitLocPieces(Streamer, TypeIdentifierMap, Entry.getValues());
2132
2133 assert(Entry.getValues().size() == 1 && "only pieces may have >1 value");
2134 emitDebugLocValue(Streamer, Value);
2135}
2136
2137void DwarfDebug::emitDebugLocValue(ByteStreamer &Streamer,
2138 const DebugLocEntry::Value &Value) {
Adrian Prantl76502d82014-08-11 23:22:59 +00002139 DIVariable DV = Value.getVariable();
Adrian Prantlb1416832014-08-01 22:11:58 +00002140 // Regular entry.
Adrian Prantle19e5ef2014-04-27 18:25:40 +00002141 if (Value.isInt()) {
Adrian Prantl1a1647c2014-03-18 02:34:58 +00002142 DIBasicType BTy(resolve(DV.getType()));
Eric Christopher29e874d2014-03-07 22:40:37 +00002143 if (BTy.Verify() && (BTy.getEncoding() == dwarf::DW_ATE_signed ||
2144 BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2145 Streamer.EmitInt8(dwarf::DW_OP_consts, "DW_OP_consts");
Adrian Prantle19e5ef2014-04-27 18:25:40 +00002146 Streamer.EmitSLEB128(Value.getInt());
Eric Christopher29e874d2014-03-07 22:40:37 +00002147 } else {
2148 Streamer.EmitInt8(dwarf::DW_OP_constu, "DW_OP_constu");
Adrian Prantle19e5ef2014-04-27 18:25:40 +00002149 Streamer.EmitULEB128(Value.getInt());
Eric Christopher29e874d2014-03-07 22:40:37 +00002150 }
Adrian Prantle19e5ef2014-04-27 18:25:40 +00002151 } else if (Value.isLocation()) {
2152 MachineLocation Loc = Value.getLoc();
Eric Christopher29e874d2014-03-07 22:40:37 +00002153 if (!DV.hasComplexAddress())
2154 // Regular entry.
2155 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2156 else {
2157 // Complex address entry.
2158 unsigned N = DV.getNumAddrElements();
2159 unsigned i = 0;
2160 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2161 if (Loc.getOffset()) {
2162 i = 2;
2163 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2164 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
2165 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
2166 Streamer.EmitSLEB128(DV.getAddrElement(1));
2167 } else {
2168 // If first address element is OpPlus then emit
2169 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2170 MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));
2171 Asm->EmitDwarfRegOp(Streamer, TLoc, DV.isIndirect());
2172 i = 2;
2173 }
2174 } else {
2175 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2176 }
2177
2178 // Emit remaining complex address elements.
2179 for (; i < N; ++i) {
2180 uint64_t Element = DV.getAddrElement(i);
2181 if (Element == DIBuilder::OpPlus) {
2182 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
2183 Streamer.EmitULEB128(DV.getAddrElement(++i));
2184 } else if (Element == DIBuilder::OpDeref) {
2185 if (!Loc.isReg())
2186 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
Adrian Prantlb1416832014-08-01 22:11:58 +00002187 } else if (Element == DIBuilder::OpPiece) {
2188 i += 3;
2189 // handled in emitDebugLocEntry.
Eric Christopher29e874d2014-03-07 22:40:37 +00002190 } else
2191 llvm_unreachable("unknown Opcode found in complex address");
2192 }
2193 }
2194 }
2195 // else ... ignore constant fp. There is not any good way to
2196 // to represent them here in dwarf.
2197 // FIXME: ^
2198}
2199
David Blaikie0e84adc2014-04-01 16:17:41 +00002200void DwarfDebug::emitDebugLocEntryLocation(const DebugLocEntry &Entry) {
2201 Asm->OutStreamer.AddComment("Loc expr size");
2202 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2203 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2204 Asm->EmitLabelDifference(end, begin, 2);
2205 Asm->OutStreamer.EmitLabel(begin);
2206 // Emit the entry.
2207 APByteStreamer Streamer(*Asm);
2208 emitDebugLocEntry(Streamer, Entry);
2209 // Close the range.
2210 Asm->OutStreamer.EmitLabel(end);
2211}
2212
Eric Christopher9046f942013-07-02 21:36:07 +00002213// Emit locations into the debug loc section.
Devang Patel930143b2009-11-21 02:48:08 +00002214void DwarfDebug::emitDebugLoc() {
Daniel Dunbarfd95b012011-03-16 22:16:39 +00002215 // Start the dwarf loc section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002216 Asm->OutStreamer.SwitchSection(
David Blaikie94c1d7f2014-04-02 01:50:20 +00002217 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth5da3f052012-11-01 09:14:31 +00002218 unsigned char Size = Asm->getDataLayout().getPointerSize();
David Blaikie84d8e182014-03-24 22:38:38 +00002219 for (const auto &DebugLoc : DotDebugLocEntries) {
David Blaikie0a456de2014-04-02 01:43:18 +00002220 Asm->OutStreamer.EmitLabel(DebugLoc.Label);
David Blaikiee1a26a62014-08-05 23:14:16 +00002221 const DwarfCompileUnit *CU = DebugLoc.CU;
David Blaikiefb0412f2014-08-06 00:21:25 +00002222 assert(!CU->getRanges().empty());
David Blaikie0a456de2014-04-02 01:43:18 +00002223 for (const auto &Entry : DebugLoc.List) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00002224 // Set up the range. This range is relative to the entry point of the
2225 // compile unit. This is a hard coded 0 for low_pc when we're emitting
2226 // ranges, or the DW_AT_low_pc on the compile unit otherwise.
David Blaikie94c1d7f2014-04-02 01:50:20 +00002227 if (CU->getRanges().size() == 1) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00002228 // Grab the begin symbol from the first range as our base.
2229 const MCSymbol *Base = CU->getRanges()[0].getStart();
2230 Asm->EmitLabelDifference(Entry.getBeginSym(), Base, Size);
2231 Asm->EmitLabelDifference(Entry.getEndSym(), Base, Size);
2232 } else {
2233 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
2234 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
2235 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002236
David Blaikie0e84adc2014-04-01 16:17:41 +00002237 emitDebugLocEntryLocation(Entry);
Devang Patel9fc11702010-05-25 23:40:22 +00002238 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002239 Asm->OutStreamer.EmitIntValue(0, Size);
2240 Asm->OutStreamer.EmitIntValue(0, Size);
2241 }
2242}
2243
2244void DwarfDebug::emitDebugLocDWO() {
2245 Asm->OutStreamer.SwitchSection(
2246 Asm->getObjFileLowering().getDwarfLocDWOSection());
2247 for (const auto &DebugLoc : DotDebugLocEntries) {
2248 Asm->OutStreamer.EmitLabel(DebugLoc.Label);
2249 for (const auto &Entry : DebugLoc.List) {
2250 // Just always use start_length for now - at least that's one address
2251 // rather than two. We could get fancier and try to, say, reuse an
2252 // address we know we've emitted elsewhere (the start of the function?
2253 // The start of the CU or CU subrange that encloses this range?)
2254 Asm->EmitInt8(dwarf::DW_LLE_start_length_entry);
David Blaikied75fb282014-04-23 21:20:10 +00002255 unsigned idx = AddrPool.getIndex(Entry.getBeginSym());
David Blaikie94c1d7f2014-04-02 01:50:20 +00002256 Asm->EmitULEB128(idx);
2257 Asm->EmitLabelDifference(Entry.getEndSym(), Entry.getBeginSym(), 4);
2258
2259 emitDebugLocEntryLocation(Entry);
David Blaikie9c550ac2014-03-25 01:44:02 +00002260 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002261 Asm->EmitInt8(dwarf::DW_LLE_end_of_list_entry);
Devang Patel9fc11702010-05-25 23:40:22 +00002262 }
Bill Wendling480ff322009-05-20 23:21:38 +00002263}
2264
Richard Mitton21101b32013-09-19 23:21:01 +00002265struct ArangeSpan {
2266 const MCSymbol *Start, *End;
2267};
2268
2269// Emit a debug aranges section, containing a CU lookup for any
2270// address we can tie back to a CU.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00002271void DwarfDebug::emitDebugARanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002272 // Start the dwarf aranges section.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002273 Asm->OutStreamer.SwitchSection(
2274 Asm->getObjFileLowering().getDwarfARangesSection());
Richard Mitton21101b32013-09-19 23:21:01 +00002275
Eric Christopher793c7472014-04-28 20:42:22 +00002276 typedef DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan>> SpansType;
Richard Mitton21101b32013-09-19 23:21:01 +00002277
2278 SpansType Spans;
2279
2280 // Build a list of sections used.
2281 std::vector<const MCSection *> Sections;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002282 for (const auto &it : SectionMap) {
2283 const MCSection *Section = it.first;
Richard Mitton21101b32013-09-19 23:21:01 +00002284 Sections.push_back(Section);
2285 }
2286
2287 // Sort the sections into order.
2288 // This is only done to ensure consistent output order across different runs.
2289 std::sort(Sections.begin(), Sections.end(), SectionSort);
2290
2291 // Build a set of address spans, sorted by CU.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002292 for (const MCSection *Section : Sections) {
David Blaikieafd2c6b2014-04-22 05:41:06 +00002293 SmallVector<SymbolCU, 8> &List = SectionMap[Section];
Richard Mitton21101b32013-09-19 23:21:01 +00002294 if (List.size() < 2)
2295 continue;
2296
2297 // Sort the symbols by offset within the section.
Benjamin Kramer571e2fe2014-03-07 19:41:22 +00002298 std::sort(List.begin(), List.end(),
2299 [&](const SymbolCU &A, const SymbolCU &B) {
2300 unsigned IA = A.Sym ? Asm->OutStreamer.GetSymbolOrder(A.Sym) : 0;
2301 unsigned IB = B.Sym ? Asm->OutStreamer.GetSymbolOrder(B.Sym) : 0;
2302
2303 // Symbols with no order assigned should be placed at the end.
2304 // (e.g. section end labels)
2305 if (IA == 0)
2306 return false;
2307 if (IB == 0)
2308 return true;
2309 return IA < IB;
2310 });
Richard Mitton21101b32013-09-19 23:21:01 +00002311
2312 // If we have no section (e.g. common), just write out
2313 // individual spans for each symbol.
Craig Topper353eda42014-04-24 06:44:33 +00002314 if (!Section) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00002315 for (const SymbolCU &Cur : List) {
Richard Mitton21101b32013-09-19 23:21:01 +00002316 ArangeSpan Span;
2317 Span.Start = Cur.Sym;
Craig Topper353eda42014-04-24 06:44:33 +00002318 Span.End = nullptr;
Richard Mitton21101b32013-09-19 23:21:01 +00002319 if (Cur.CU)
2320 Spans[Cur.CU].push_back(Span);
2321 }
2322 } else {
2323 // Build spans between each label.
2324 const MCSymbol *StartSym = List[0].Sym;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002325 for (size_t n = 1, e = List.size(); n < e; n++) {
Richard Mitton21101b32013-09-19 23:21:01 +00002326 const SymbolCU &Prev = List[n - 1];
2327 const SymbolCU &Cur = List[n];
2328
2329 // Try and build the longest span we can within the same CU.
2330 if (Cur.CU != Prev.CU) {
2331 ArangeSpan Span;
2332 Span.Start = StartSym;
2333 Span.End = Cur.Sym;
2334 Spans[Prev.CU].push_back(Span);
2335 StartSym = Cur.Sym;
2336 }
2337 }
2338 }
2339 }
2340
Richard Mitton21101b32013-09-19 23:21:01 +00002341 unsigned PtrSize = Asm->getDataLayout().getPointerSize();
2342
2343 // Build a list of CUs used.
Eric Christopher4287a492013-12-09 23:57:44 +00002344 std::vector<DwarfCompileUnit *> CUs;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002345 for (const auto &it : Spans) {
2346 DwarfCompileUnit *CU = it.first;
Richard Mitton21101b32013-09-19 23:21:01 +00002347 CUs.push_back(CU);
2348 }
2349
2350 // Sort the CU list (again, to ensure consistent output order).
Benjamin Kramer571e2fe2014-03-07 19:41:22 +00002351 std::sort(CUs.begin(), CUs.end(), [](const DwarfUnit *A, const DwarfUnit *B) {
2352 return A->getUniqueID() < B->getUniqueID();
2353 });
Richard Mitton21101b32013-09-19 23:21:01 +00002354
2355 // Emit an arange table for each CU we used.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002356 for (DwarfCompileUnit *CU : CUs) {
Richard Mitton21101b32013-09-19 23:21:01 +00002357 std::vector<ArangeSpan> &List = Spans[CU];
2358
2359 // Emit size of content not including length itself.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002360 unsigned ContentSize =
2361 sizeof(int16_t) + // DWARF ARange version number
2362 sizeof(int32_t) + // Offset of CU in the .debug_info section
2363 sizeof(int8_t) + // Pointer Size (in bytes)
2364 sizeof(int8_t); // Segment Size (in bytes)
Richard Mitton21101b32013-09-19 23:21:01 +00002365
2366 unsigned TupleSize = PtrSize * 2;
2367
2368 // 7.20 in the Dwarf specs requires the table to be aligned to a tuple.
Benjamin Kramer8a68ab32014-01-07 19:28:14 +00002369 unsigned Padding =
2370 OffsetToAlignment(sizeof(int32_t) + ContentSize, TupleSize);
Richard Mitton21101b32013-09-19 23:21:01 +00002371
2372 ContentSize += Padding;
2373 ContentSize += (List.size() + 1) * TupleSize;
2374
2375 // For each compile unit, write the list of spans it covers.
2376 Asm->OutStreamer.AddComment("Length of ARange Set");
2377 Asm->EmitInt32(ContentSize);
2378 Asm->OutStreamer.AddComment("DWARF Arange version number");
2379 Asm->EmitInt16(dwarf::DW_ARANGES_VERSION);
2380 Asm->OutStreamer.AddComment("Offset Into Debug Info Section");
Eric Christopherd8667202013-12-30 17:22:27 +00002381 Asm->EmitSectionOffset(CU->getLocalLabelBegin(), CU->getLocalSectionSym());
Richard Mitton21101b32013-09-19 23:21:01 +00002382 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2383 Asm->EmitInt8(PtrSize);
2384 Asm->OutStreamer.AddComment("Segment Size (in bytes)");
2385 Asm->EmitInt8(0);
2386
Benjamin Kramer8a68ab32014-01-07 19:28:14 +00002387 Asm->OutStreamer.EmitFill(Padding, 0xff);
Richard Mitton21101b32013-09-19 23:21:01 +00002388
Benjamin Kramer15596c72014-03-07 19:09:39 +00002389 for (const ArangeSpan &Span : List) {
Richard Mitton21101b32013-09-19 23:21:01 +00002390 Asm->EmitLabelReference(Span.Start, PtrSize);
2391
2392 // Calculate the size as being from the span start to it's end.
Richard Mitton089ed892013-09-23 17:56:20 +00002393 if (Span.End) {
Richard Mitton21101b32013-09-19 23:21:01 +00002394 Asm->EmitLabelDifference(Span.End, Span.Start, PtrSize);
Richard Mitton089ed892013-09-23 17:56:20 +00002395 } else {
2396 // For symbols without an end marker (e.g. common), we
2397 // write a single arange entry containing just that one symbol.
2398 uint64_t Size = SymSize[Span.Start];
2399 if (Size == 0)
2400 Size = 1;
2401
2402 Asm->OutStreamer.EmitIntValue(Size, PtrSize);
2403 }
Richard Mitton21101b32013-09-19 23:21:01 +00002404 }
2405
2406 Asm->OutStreamer.AddComment("ARange terminator");
2407 Asm->OutStreamer.EmitIntValue(0, PtrSize);
2408 Asm->OutStreamer.EmitIntValue(0, PtrSize);
2409 }
Bill Wendling480ff322009-05-20 23:21:38 +00002410}
2411
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002412// Emit visible names into a debug ranges section.
Devang Patel930143b2009-11-21 02:48:08 +00002413void DwarfDebug::emitDebugRanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002414 // Start the dwarf ranges section.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002415 Asm->OutStreamer.SwitchSection(
2416 Asm->getObjFileLowering().getDwarfRangesSection());
Eric Christopher4751d702013-11-23 00:05:29 +00002417
Eric Christopher0f63d062013-12-03 00:45:45 +00002418 // Size for our labels.
2419 unsigned char Size = Asm->getDataLayout().getPointerSize();
2420
2421 // Grab the specific ranges for the compile units in the module.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002422 for (const auto &I : CUMap) {
2423 DwarfCompileUnit *TheCU = I.second;
Eric Christopher0f63d062013-12-03 00:45:45 +00002424
Eric Christopher0f63d062013-12-03 00:45:45 +00002425 // Iterate over the misc ranges for the compile units in the module.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002426 for (const RangeSpanList &List : TheCU->getRangeLists()) {
Eric Christopherf8790642013-12-04 22:04:50 +00002427 // Emit our symbol so we can find the beginning of the range.
2428 Asm->OutStreamer.EmitLabel(List.getSym());
Eric Christopher0f63d062013-12-03 00:45:45 +00002429
Benjamin Kramer15596c72014-03-07 19:09:39 +00002430 for (const RangeSpan &Range : List.getRanges()) {
Eric Christopher0f63d062013-12-03 00:45:45 +00002431 const MCSymbol *Begin = Range.getStart();
2432 const MCSymbol *End = Range.getEnd();
Eric Christopher565ab112013-12-20 04:34:22 +00002433 assert(Begin && "Range without a begin symbol?");
2434 assert(End && "Range without an end symbol?");
Eric Christopherece0e902014-04-25 22:23:54 +00002435 if (TheCU->getRanges().size() == 1) {
2436 // Grab the begin symbol from the first range as our base.
2437 const MCSymbol *Base = TheCU->getRanges()[0].getStart();
2438 Asm->EmitLabelDifference(Begin, Base, Size);
2439 Asm->EmitLabelDifference(End, Base, Size);
2440 } else {
2441 Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2442 Asm->OutStreamer.EmitSymbolValue(End, Size);
2443 }
Eric Christopher0f63d062013-12-03 00:45:45 +00002444 }
2445
2446 // And terminate the list with two 0 values.
Eric Christopherce0cfce2013-01-09 01:35:34 +00002447 Asm->OutStreamer.EmitIntValue(0, Size);
Eric Christopher0f63d062013-12-03 00:45:45 +00002448 Asm->OutStreamer.EmitIntValue(0, Size);
2449 }
Eric Christopher46e23432013-12-20 04:16:18 +00002450
2451 // Now emit a range for the CU itself.
Eric Christopher384f3fe2014-03-20 19:16:16 +00002452 if (TheCU->getRanges().size() > 1) {
Eric Christopher46e23432013-12-20 04:16:18 +00002453 Asm->OutStreamer.EmitLabel(
2454 Asm->GetTempSymbol("cu_ranges", TheCU->getUniqueID()));
Benjamin Kramer15596c72014-03-07 19:09:39 +00002455 for (const RangeSpan &Range : TheCU->getRanges()) {
Eric Christopher46e23432013-12-20 04:16:18 +00002456 const MCSymbol *Begin = Range.getStart();
2457 const MCSymbol *End = Range.getEnd();
Eric Christopher565ab112013-12-20 04:34:22 +00002458 assert(Begin && "Range without a begin symbol?");
2459 assert(End && "Range without an end symbol?");
2460 Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2461 Asm->OutStreamer.EmitSymbolValue(End, Size);
Eric Christopher46e23432013-12-20 04:16:18 +00002462 }
2463 // And terminate the list with two 0 values.
2464 Asm->OutStreamer.EmitIntValue(0, Size);
2465 Asm->OutStreamer.EmitIntValue(0, Size);
2466 }
Devang Patel12563b32010-04-16 23:33:45 +00002467 }
Bill Wendling480ff322009-05-20 23:21:38 +00002468}
2469
Eric Christopherd692c1d2012-12-11 19:42:09 +00002470// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002471
David Blaikie65a74662014-04-25 18:26:14 +00002472void DwarfDebug::initSkeletonUnit(const DwarfUnit &U, DIE &Die,
David Blaikief9b6a552014-04-22 22:39:41 +00002473 std::unique_ptr<DwarfUnit> NewU) {
David Blaikie38fe6342014-01-09 04:28:46 +00002474 NewU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
David Blaikief9b6a552014-04-22 22:39:41 +00002475 U.getCUNode().getSplitDebugFilename());
David Blaikie38fe6342014-01-09 04:28:46 +00002476
David Blaikie38fe6342014-01-09 04:28:46 +00002477 if (!CompilationDir.empty())
2478 NewU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
2479
David Blaikief9b6a552014-04-22 22:39:41 +00002480 addGnuPubAttributes(*NewU, Die);
David Blaikie38fe6342014-01-09 04:28:46 +00002481
David Blaikief9b6a552014-04-22 22:39:41 +00002482 SkeletonHolder.addUnit(std::move(NewU));
David Blaikie38fe6342014-01-09 04:28:46 +00002483}
2484
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002485// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2486// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
David Blaikie96dea052014-03-24 21:31:35 +00002487// DW_AT_addr_base, DW_AT_ranges_base.
David Blaikief9b6a552014-04-22 22:39:41 +00002488DwarfCompileUnit &DwarfDebug::constructSkeletonCU(const DwarfCompileUnit &CU) {
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002489
David Blaikief9b6a552014-04-22 22:39:41 +00002490 auto OwnedUnit = make_unique<DwarfCompileUnit>(
David Blaikiebd579052014-04-28 21:14:27 +00002491 CU.getUniqueID(), CU.getCUNode(), Asm, this, &SkeletonHolder);
David Blaikief9b6a552014-04-22 22:39:41 +00002492 DwarfCompileUnit &NewCU = *OwnedUnit;
2493 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
David Blaikie637cac42014-04-22 23:09:36 +00002494 DwarfInfoSectionSym);
Eric Christopher4c7765f2013-01-17 03:00:04 +00002495
David Blaikief9b6a552014-04-22 22:39:41 +00002496 NewCU.initStmtList(DwarfLineSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002497
David Blaikie92a2f8a2014-04-28 21:04:29 +00002498 initSkeletonUnit(CU, NewCU.getUnitDie(), std::move(OwnedUnit));
Eric Christopherc8a310e2012-12-10 23:34:43 +00002499
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002500 return NewCU;
2501}
2502
Eric Christopherd692c1d2012-12-11 19:42:09 +00002503// Emit the .debug_info.dwo section for separated dwarf. This contains the
2504// compile units that would normally be in debug_info.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002505void DwarfDebug::emitDebugInfoDWO() {
Eric Christophercdf218d2012-12-10 19:51:21 +00002506 assert(useSplitDwarf() && "No split dwarf debug info?");
David Blaikie326e1fa2014-04-02 02:04:51 +00002507 // Don't pass an abbrev symbol, using a constant zero instead so as not to
2508 // emit relocations into the dwo file.
Eric Christopher793c7472014-04-28 20:42:22 +00002509 InfoHolder.emitUnits(this, /* AbbrevSymbol */ nullptr);
Eric Christopher3c5a1912012-12-19 22:02:53 +00002510}
2511
2512// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2513// abbreviations for the .debug_info.dwo section.
2514void DwarfDebug::emitDebugAbbrevDWO() {
2515 assert(useSplitDwarf() && "No split dwarf?");
David Blaikie0504cda2013-12-05 07:43:55 +00002516 InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection());
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002517}
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002518
David Blaikie4a2f95f2014-03-18 01:17:26 +00002519void DwarfDebug::emitDebugLineDWO() {
2520 assert(useSplitDwarf() && "No split dwarf?");
2521 Asm->OutStreamer.SwitchSection(
2522 Asm->getObjFileLowering().getDwarfLineDWOSection());
David Blaikie8287aff2014-03-18 02:13:23 +00002523 SplitTypeUnitFileTable.Emit(Asm->OutStreamer);
David Blaikie4a2f95f2014-03-18 01:17:26 +00002524}
2525
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002526// Emit the .debug_str.dwo section for separated dwarf. This contains the
2527// string section and is identical in format to traditional .debug_str
2528// sections.
2529void DwarfDebug::emitDebugStrDWO() {
2530 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002531 const MCSection *OffSec =
2532 Asm->getObjFileLowering().getDwarfStrOffDWOSection();
Eric Christopher2cbd5762013-01-07 19:32:41 +00002533 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
David Blaikie6741bb02014-09-11 21:12:48 +00002534 OffSec);
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002535}
David Blaikie409dd9c2013-11-19 23:08:21 +00002536
David Blaikie47f4b822014-03-19 00:11:28 +00002537MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) {
2538 if (!useSplitDwarf())
2539 return nullptr;
2540 if (SingleCU)
2541 SplitTypeUnitFileTable.setCompilationDir(CU.getCUNode().getDirectory());
2542 return &SplitTypeUnitFileTable;
2543}
2544
David Blaikief3de2ab2014-04-26 16:26:41 +00002545static uint64_t makeTypeSignature(StringRef Identifier) {
2546 MD5 Hash;
2547 Hash.update(Identifier);
2548 // ... take the least significant 8 bytes and return those. Our MD5
2549 // implementation always returns its results in little endian, swap bytes
2550 // appropriately.
2551 MD5::MD5Result Result;
2552 Hash.final(Result);
2553 return *reinterpret_cast<support::ulittle64_t *>(Result + 8);
2554}
2555
David Blaikie15632ae2014-02-12 00:31:30 +00002556void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU,
David Blaikie65a74662014-04-25 18:26:14 +00002557 StringRef Identifier, DIE &RefDie,
David Blaikief645f962014-01-09 03:23:41 +00002558 DICompositeType CTy) {
David Blaikiee12b49a2014-04-26 17:27:38 +00002559 // Fast path if we're building some type units and one has already used the
2560 // address pool we know we're going to throw away all this work anyway, so
2561 // don't bother building dependent types.
2562 if (!TypeUnitsUnderConstruction.empty() && AddrPool.hasBeenUsed())
2563 return;
2564
David Blaikie47f615e2013-12-17 23:32:35 +00002565 const DwarfTypeUnit *&TU = DwarfTypeUnits[CTy];
Chandler Carruthb587ab62014-01-20 08:07:07 +00002566 if (TU) {
David Blaikie15632ae2014-02-12 00:31:30 +00002567 CU.addDIETypeSignature(RefDie, *TU);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002568 return;
David Blaikie409dd9c2013-11-19 23:08:21 +00002569 }
2570
David Blaikiee12b49a2014-04-26 17:27:38 +00002571 bool TopLevelType = TypeUnitsUnderConstruction.empty();
2572 AddrPool.resetUsedFlag();
2573
David Blaikie29459ae2014-07-25 17:11:58 +00002574 auto OwnedUnit = make_unique<DwarfTypeUnit>(
2575 InfoHolder.getUnits().size() + TypeUnitsUnderConstruction.size(), CU, Asm,
2576 this, &InfoHolder, getDwoLineTable(CU));
David Blaikief9b6a552014-04-22 22:39:41 +00002577 DwarfTypeUnit &NewTU = *OwnedUnit;
David Blaikie92a2f8a2014-04-28 21:04:29 +00002578 DIE &UnitDie = NewTU.getUnitDie();
David Blaikief9b6a552014-04-22 22:39:41 +00002579 TU = &NewTU;
Eric Christopher793c7472014-04-28 20:42:22 +00002580 TypeUnitsUnderConstruction.push_back(
2581 std::make_pair(std::move(OwnedUnit), CTy));
Chandler Carruthb587ab62014-01-20 08:07:07 +00002582
David Blaikie92a2f8a2014-04-28 21:04:29 +00002583 NewTU.addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
David Blaikie637cac42014-04-22 23:09:36 +00002584 CU.getLanguage());
Chandler Carruthb587ab62014-01-20 08:07:07 +00002585
David Blaikief3de2ab2014-04-26 16:26:41 +00002586 uint64_t Signature = makeTypeSignature(Identifier);
David Blaikief9b6a552014-04-22 22:39:41 +00002587 NewTU.setTypeSignature(Signature);
David Blaikief3de2ab2014-04-26 16:26:41 +00002588
David Blaikie29459ae2014-07-25 17:11:58 +00002589 if (useSplitDwarf())
2590 NewTU.initSection(Asm->getObjFileLowering().getDwarfTypesDWOSection(),
2591 DwarfTypesDWOSectionSym);
2592 else {
David Blaikie92a2f8a2014-04-28 21:04:29 +00002593 CU.applyStmtList(UnitDie);
David Blaikie29459ae2014-07-25 17:11:58 +00002594 NewTU.initSection(
2595 Asm->getObjFileLowering().getDwarfTypesSection(Signature));
2596 }
Chandler Carruthb587ab62014-01-20 08:07:07 +00002597
David Blaikief3de2ab2014-04-26 16:26:41 +00002598 NewTU.setType(NewTU.createTypeDIE(CTy));
2599
David Blaikiee12b49a2014-04-26 17:27:38 +00002600 if (TopLevelType) {
2601 auto TypeUnitsToAdd = std::move(TypeUnitsUnderConstruction);
2602 TypeUnitsUnderConstruction.clear();
2603
2604 // Types referencing entries in the address table cannot be placed in type
2605 // units.
2606 if (AddrPool.hasBeenUsed()) {
2607
2608 // Remove all the types built while building this type.
2609 // This is pessimistic as some of these types might not be dependent on
2610 // the type that used an address.
2611 for (const auto &TU : TypeUnitsToAdd)
2612 DwarfTypeUnits.erase(TU.second);
2613
2614 // Construct this type in the CU directly.
2615 // This is inefficient because all the dependent types will be rebuilt
2616 // from scratch, including building them in type units, discovering that
2617 // they depend on addresses, throwing them out and rebuilding them.
2618 CU.constructTypeDIE(RefDie, CTy);
2619 return;
2620 }
2621
2622 // If the type wasn't dependent on fission addresses, finish adding the type
2623 // and all its dependent types.
David Blaikiec13bc972014-08-27 05:04:14 +00002624 for (auto &TU : TypeUnitsToAdd)
David Blaikiee12b49a2014-04-26 17:27:38 +00002625 InfoHolder.addUnit(std::move(TU.first));
David Blaikiee12b49a2014-04-26 17:27:38 +00002626 }
David Blaikief9b6a552014-04-22 22:39:41 +00002627 CU.addDIETypeSignature(RefDie, NewTU);
David Blaikie409dd9c2013-11-19 23:08:21 +00002628}
David Blaikie4bd13b72014-03-07 18:49:45 +00002629
David Blaikie65a74662014-04-25 18:26:14 +00002630void DwarfDebug::attachLowHighPC(DwarfCompileUnit &Unit, DIE &D,
Frederic Riss9e324752014-08-28 19:09:29 +00002631 const MCSymbol *Begin, const MCSymbol *End) {
David Blaikie4a3b84d2014-05-16 16:42:40 +00002632 assert(Begin && "Begin label should not be null!");
2633 assert(End && "End label should not be null!");
2634 assert(Begin->isDefined() && "Invalid starting label");
2635 assert(End->isDefined() && "Invalid end label");
2636
David Blaikief9b6a552014-04-22 22:39:41 +00002637 Unit.addLabelAddress(D, dwarf::DW_AT_low_pc, Begin);
Adrian Prantl887e7072014-03-07 23:07:21 +00002638 if (DwarfVersion < 4)
David Blaikief9b6a552014-04-22 22:39:41 +00002639 Unit.addLabelAddress(D, dwarf::DW_AT_high_pc, End);
David Blaikie4bd13b72014-03-07 18:49:45 +00002640 else
David Blaikief9b6a552014-04-22 22:39:41 +00002641 Unit.addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin);
David Blaikie4bd13b72014-03-07 18:49:45 +00002642}
David Blaikie2406a0622014-04-23 23:37:35 +00002643
2644// Accelerator table mutators - add each name along with its companion
2645// DIE to the proper table while ensuring that the name that we're going
2646// to reference is in the string table. We do this since the names we
2647// add may not only be identical to the names in the DIE.
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002648void DwarfDebug::addAccelName(StringRef Name, const DIE &Die) {
David Blaikie2406a0622014-04-23 23:37:35 +00002649 if (!useDwarfAccelTables())
2650 return;
David Blaikie772ab8a2014-04-25 22:21:35 +00002651 AccelNames.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2652 &Die);
David Blaikie2406a0622014-04-23 23:37:35 +00002653}
David Blaikie0ee82b92014-04-24 00:53:32 +00002654
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002655void DwarfDebug::addAccelObjC(StringRef Name, const DIE &Die) {
David Blaikie0ee82b92014-04-24 00:53:32 +00002656 if (!useDwarfAccelTables())
2657 return;
David Blaikie772ab8a2014-04-25 22:21:35 +00002658 AccelObjC.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2659 &Die);
David Blaikie0ee82b92014-04-24 00:53:32 +00002660}
David Blaikieecf04152014-04-24 01:02:42 +00002661
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002662void DwarfDebug::addAccelNamespace(StringRef Name, const DIE &Die) {
David Blaikieecf04152014-04-24 01:02:42 +00002663 if (!useDwarfAccelTables())
2664 return;
David Blaikie772ab8a2014-04-25 22:21:35 +00002665 AccelNamespace.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2666 &Die);
David Blaikieecf04152014-04-24 01:02:42 +00002667}
David Blaikie18d33752014-04-24 01:23:49 +00002668
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002669void DwarfDebug::addAccelType(StringRef Name, const DIE &Die, char Flags) {
David Blaikie18d33752014-04-24 01:23:49 +00002670 if (!useDwarfAccelTables())
2671 return;
David Blaikie772ab8a2014-04-25 22:21:35 +00002672 AccelTypes.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2673 &Die);
David Blaikie18d33752014-04-24 01:23:49 +00002674}