blob: 038082d315533bdb12246b1b03dfbb9255bfe702 [file] [log] [blame]
Bill Wendling2f921f82009-05-15 09:23:25 +00001//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf debug info into asm files.
11//
12//===----------------------------------------------------------------------===//
Chris Lattnerb14490d2010-03-09 00:39:24 +000013
Eric Christopher29e874d2014-03-07 22:40:37 +000014#include "ByteStreamer.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000015#include "DwarfDebug.h"
Chris Lattner3f3fb972010-04-05 05:24:55 +000016#include "DIE.h"
Eric Christopher45731982013-08-08 23:45:55 +000017#include "DIEHash.h"
David Blaikie2c86a722013-12-02 19:33:15 +000018#include "DwarfUnit.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000019#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/Statistic.h"
21#include "llvm/ADT/StringExtras.h"
22#include "llvm/ADT/Triple.h"
David Greene829b3e82009-08-19 21:52:55 +000023#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000024#include "llvm/CodeGen/MachineModuleInfo.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000025#include "llvm/IR/Constants.h"
Chandler Carruth12664a02014-03-06 00:22:06 +000026#include "llvm/IR/DIBuilder.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000027#include "llvm/IR/DataLayout.h"
Chandler Carruth9a4c9e52014-03-06 00:46:21 +000028#include "llvm/IR/DebugInfo.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000029#include "llvm/IR/Instructions.h"
30#include "llvm/IR/Module.h"
Chandler Carruth4220e9c2014-03-04 11:17:44 +000031#include "llvm/IR/ValueHandle.h"
Chris Lattnere13c3722010-03-09 01:58:53 +000032#include "llvm/MC/MCAsmInfo.h"
Chris Lattner4d2c0f92009-07-31 18:48:30 +000033#include "llvm/MC/MCSection.h"
Chris Lattner4b7dadb2009-08-19 05:49:37 +000034#include "llvm/MC/MCStreamer.h"
Chris Lattnere13c3722010-03-09 01:58:53 +000035#include "llvm/MC/MCSymbol.h"
Devang Patel6c74a872010-04-27 19:46:33 +000036#include "llvm/Support/CommandLine.h"
Daniel Dunbarcdf01b52009-10-13 06:47:08 +000037#include "llvm/Support/Debug.h"
David Majnemered89b5c2013-08-21 06:13:34 +000038#include "llvm/Support/Dwarf.h"
Daniel Dunbarcdf01b52009-10-13 06:47:08 +000039#include "llvm/Support/ErrorHandling.h"
Chris Lattnerf5c834f2010-01-22 22:09:00 +000040#include "llvm/Support/FormattedStream.h"
Logan Chien5b776b72014-02-22 14:00:39 +000041#include "llvm/Support/LEB128.h"
Eric Christopher67646432013-07-26 17:02:41 +000042#include "llvm/Support/MD5.h"
Michael J. Spencer447762d2010-11-29 18:16:10 +000043#include "llvm/Support/Path.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000044#include "llvm/Support/Timer.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000045#include "llvm/Target/TargetFrameLowering.h"
46#include "llvm/Target/TargetLoweringObjectFile.h"
47#include "llvm/Target/TargetMachine.h"
48#include "llvm/Target/TargetOptions.h"
49#include "llvm/Target/TargetRegisterInfo.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000050using namespace llvm;
51
Chandler Carruth1b9dde02014-04-22 02:02:50 +000052#define DEBUG_TYPE "dwarfdebug"
53
Eric Christopher7f2b5512013-07-23 22:16:41 +000054static cl::opt<bool>
55DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden,
56 cl::desc("Disable debug info printing"));
Devang Patel6c74a872010-04-27 19:46:33 +000057
Eric Christopher7f2b5512013-07-23 22:16:41 +000058static cl::opt<bool> UnknownLocations(
59 "use-unknown-locations", cl::Hidden,
60 cl::desc("Make an absence of debug location information explicit."),
61 cl::init(false));
Dan Gohman7421ae42010-05-07 01:08:53 +000062
Eric Christopherdd1a0122013-09-13 00:35:05 +000063static cl::opt<bool>
64GenerateGnuPubSections("generate-gnu-dwarf-pub-sections", cl::Hidden,
65 cl::desc("Generate GNU-style pubnames and pubtypes"),
66 cl::init(false));
67
Eric Christopher02dbadb2014-02-14 01:26:55 +000068static cl::opt<bool> GenerateARangeSection("generate-arange-section",
69 cl::Hidden,
70 cl::desc("Generate dwarf aranges"),
71 cl::init(false));
72
Eric Christopher20b76a72012-08-23 22:36:40 +000073namespace {
Eric Christopherf07ee3a2014-01-27 23:50:03 +000074enum DefaultOnOff { Default, Enable, Disable };
Eric Christopher20b76a72012-08-23 22:36:40 +000075}
Eric Christopher4996c702011-11-07 09:24:32 +000076
Eric Christopher7f2b5512013-07-23 22:16:41 +000077static cl::opt<DefaultOnOff>
78DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
79 cl::desc("Output prototype dwarf accelerator tables."),
80 cl::values(clEnumVal(Default, "Default for platform"),
81 clEnumVal(Enable, "Enabled"),
82 clEnumVal(Disable, "Disabled"), clEnumValEnd),
83 cl::init(Default));
Eric Christopher20b76a72012-08-23 22:36:40 +000084
Eric Christopher7f2b5512013-07-23 22:16:41 +000085static cl::opt<DefaultOnOff>
Eric Christopher7f2b5512013-07-23 22:16:41 +000086SplitDwarf("split-dwarf", cl::Hidden,
Eric Christopher5d008fe2013-12-04 23:24:28 +000087 cl::desc("Output DWARF5 split debug info."),
Eric Christopher7f2b5512013-07-23 22:16:41 +000088 cl::values(clEnumVal(Default, "Default for platform"),
89 clEnumVal(Enable, "Enabled"),
90 clEnumVal(Disable, "Disabled"), clEnumValEnd),
91 cl::init(Default));
Eric Christopher29424312012-11-12 22:22:20 +000092
Eric Christopher7da24882013-08-19 21:07:38 +000093static cl::opt<DefaultOnOff>
Eric Christopher4d36ca02013-08-26 23:24:35 +000094DwarfPubSections("generate-dwarf-pub-sections", cl::Hidden,
95 cl::desc("Generate DWARF pubnames and pubtypes sections"),
96 cl::values(clEnumVal(Default, "Default for platform"),
97 clEnumVal(Enable, "Enabled"),
98 clEnumVal(Disable, "Disabled"), clEnumValEnd),
99 cl::init(Default));
Eric Christopher7da24882013-08-19 21:07:38 +0000100
Eric Christopher33ff6972013-11-21 23:46:41 +0000101static cl::opt<unsigned>
102DwarfVersionNumber("dwarf-version", cl::Hidden,
Eric Christophera5a79422013-12-09 23:32:48 +0000103 cl::desc("Generate DWARF for dwarf version."), cl::init(0));
Eric Christopher33ff6972013-11-21 23:46:41 +0000104
Benjamin Kramerb12cf012013-08-24 12:54:27 +0000105static const char *const DWARFGroupName = "DWARF Emission";
106static const char *const DbgTimerName = "DWARF Debug Writer";
Bill Wendlingfcc14142010-04-07 09:28:04 +0000107
Bill Wendling2f921f82009-05-15 09:23:25 +0000108//===----------------------------------------------------------------------===//
109
Manman Renbe5576f2013-10-08 19:07:44 +0000110/// resolve - Look in the DwarfDebug map for the MDNode that
111/// corresponds to the reference.
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000112template <typename T> T DbgVariable::resolve(DIRef<T> Ref) const {
Manman Renbe5576f2013-10-08 19:07:44 +0000113 return DD->resolve(Ref);
114}
115
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000116bool DbgVariable::isBlockByrefVariable() const {
117 assert(Var.isVariable() && "Invalid complex DbgVariable!");
118 return Var.isBlockByrefVariable(DD->getTypeIdentifierMap());
119}
120
Nick Lewycky019d2552011-07-29 03:49:23 +0000121DIType DbgVariable::getType() const {
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000122 DIType Ty = Var.getType().resolve(DD->getTypeIdentifierMap());
Devang Patelf20c4f72011-04-12 22:53:02 +0000123 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
124 // addresses instead.
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000125 if (Var.isBlockByrefVariable(DD->getTypeIdentifierMap())) {
Devang Patelf20c4f72011-04-12 22:53:02 +0000126 /* Byref variables, in Blocks, are declared by the programmer as
127 "SomeType VarName;", but the compiler creates a
128 __Block_byref_x_VarName struct, and gives the variable VarName
129 either the struct, or a pointer to the struct, as its type. This
130 is necessary for various behind-the-scenes things the compiler
131 needs to do with by-reference variables in blocks.
Eric Christopher6a841382012-11-19 22:42:10 +0000132
Devang Patelf20c4f72011-04-12 22:53:02 +0000133 However, as far as the original *programmer* is concerned, the
134 variable should still have type 'SomeType', as originally declared.
Eric Christopher6a841382012-11-19 22:42:10 +0000135
Devang Patelf20c4f72011-04-12 22:53:02 +0000136 The following function dives into the __Block_byref_x_VarName
137 struct to find the original type of the variable. This will be
138 passed back to the code generating the type for the Debug
139 Information Entry for the variable 'VarName'. 'VarName' will then
140 have the original type 'SomeType' in its debug information.
Eric Christopher6a841382012-11-19 22:42:10 +0000141
Devang Patelf20c4f72011-04-12 22:53:02 +0000142 The original type 'SomeType' will be the type of the field named
143 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher6a841382012-11-19 22:42:10 +0000144
Devang Patelf20c4f72011-04-12 22:53:02 +0000145 NOTE: In order for this to not completely fail on the debugger
146 side, the Debug Information Entry for the variable VarName needs to
147 have a DW_AT_location that tells the debugger how to unwind through
148 the pointers and __Block_byref_x_VarName struct to find the actual
149 value of the variable. The function addBlockByrefType does this. */
150 DIType subType = Ty;
Eric Christopher31b05762013-08-08 01:41:00 +0000151 uint16_t tag = Ty.getTag();
Eric Christopher6a841382012-11-19 22:42:10 +0000152
Eric Christopher9adc55f2013-09-04 19:53:21 +0000153 if (tag == dwarf::DW_TAG_pointer_type)
Manman Renbe5576f2013-10-08 19:07:44 +0000154 subType = resolve(DIDerivedType(Ty).getTypeDerivedFrom());
Eric Christopher6a841382012-11-19 22:42:10 +0000155
Eric Christopher9adc55f2013-09-04 19:53:21 +0000156 DIArray Elements = DICompositeType(subType).getTypeArray();
Devang Patelf20c4f72011-04-12 22:53:02 +0000157 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
David Blaikie5af2aca2013-11-18 23:57:26 +0000158 DIDerivedType DT(Elements.getElement(i));
Devang Patelf20c4f72011-04-12 22:53:02 +0000159 if (getName() == DT.getName())
Manman Renbe5576f2013-10-08 19:07:44 +0000160 return (resolve(DT.getTypeDerivedFrom()));
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000161 }
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000162 }
Devang Patelf20c4f72011-04-12 22:53:02 +0000163 return Ty;
164}
Bill Wendling2f921f82009-05-15 09:23:25 +0000165
David Blaikie18d33752014-04-24 01:23:49 +0000166static LLVM_CONSTEXPR DwarfAccelTable::Atom TypeAtoms[] = {
167 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4),
168 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag, dwarf::DW_FORM_data2),
169 DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags, dwarf::DW_FORM_data1)};
170
Chris Lattnerf0d6bd32010-04-05 05:11:15 +0000171DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Craig Topper353eda42014-04-24 06:44:33 +0000172 : Asm(A), MMI(Asm->MMI), FirstCU(nullptr), PrevLabel(nullptr),
173 GlobalRangeCount(0), InfoHolder(A, "info_string", DIEValueAllocator),
Eric Christopher2037caf2014-01-28 00:49:26 +0000174 UsedNonDefaultText(false),
David Blaikie2406a0622014-04-23 23:37:35 +0000175 SkeletonHolder(A, "skel_string", DIEValueAllocator),
176 AccelNames(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
David Blaikie0ee82b92014-04-24 00:53:32 +0000177 dwarf::DW_FORM_data4)),
178 AccelObjC(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
David Blaikieecf04152014-04-24 01:02:42 +0000179 dwarf::DW_FORM_data4)),
180 AccelNamespace(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
David Blaikie18d33752014-04-24 01:23:49 +0000181 dwarf::DW_FORM_data4)),
182 AccelTypes(TypeAtoms) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000183
Craig Topper353eda42014-04-24 06:44:33 +0000184 DwarfInfoSectionSym = DwarfAbbrevSectionSym = DwarfStrSectionSym = nullptr;
185 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = nullptr;
186 DwarfLineSectionSym = nullptr;
187 DwarfAddrSectionSym = nullptr;
188 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = nullptr;
189 FunctionBeginSym = FunctionEndSym = nullptr;
190 CurFn = nullptr;
191 CurMI = nullptr;
Eric Christopherad9fe892012-04-02 17:58:52 +0000192
Adrian Prantl5bf1d002013-10-15 20:26:37 +0000193 // Turn on accelerator tables for Darwin by default, pubnames by
194 // default for non-Darwin, and handle split dwarf.
Eric Christopher203e12b2013-04-27 01:07:52 +0000195 bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin();
Eric Christopher4977f212012-08-23 22:36:36 +0000196
Eric Christopher574b5c82013-08-19 21:41:38 +0000197 if (DwarfAccelTables == Default)
198 HasDwarfAccelTables = IsDarwin;
199 else
Eric Christopher5297df02013-08-26 20:58:35 +0000200 HasDwarfAccelTables = DwarfAccelTables == Enable;
Eric Christopher20b76a72012-08-23 22:36:40 +0000201
Eric Christophercdf218d2012-12-10 19:51:21 +0000202 if (SplitDwarf == Default)
203 HasSplitDwarf = false;
Eric Christopher29424312012-11-12 22:22:20 +0000204 else
Eric Christopher574b5c82013-08-19 21:41:38 +0000205 HasSplitDwarf = SplitDwarf == Enable;
Eric Christopher29424312012-11-12 22:22:20 +0000206
Eric Christopher4d36ca02013-08-26 23:24:35 +0000207 if (DwarfPubSections == Default)
208 HasDwarfPubSections = !IsDarwin;
Eric Christopher574b5c82013-08-19 21:41:38 +0000209 else
Eric Christopher4d36ca02013-08-26 23:24:35 +0000210 HasDwarfPubSections = DwarfPubSections == Enable;
Eric Christopher7da24882013-08-19 21:07:38 +0000211
Eric Christopher793c7472014-04-28 20:42:22 +0000212 DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber
213 : MMI->getModule()->getDwarfVersion();
Manman Renac8062b2013-07-02 23:40:10 +0000214
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
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000221// Switch to the specified MCSection and emit an assembler
222// temporary label to it if SymbolStem is specified.
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000223static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Craig Topper353eda42014-04-24 06:44:33 +0000224 const char *SymbolStem = nullptr) {
Eric Christophera7b61892011-11-07 09:18:38 +0000225 Asm->OutStreamer.SwitchSection(Section);
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000226 if (!SymbolStem)
Craig Topper353eda42014-04-24 06:44:33 +0000227 return nullptr;
Eric Christophera7b61892011-11-07 09:18:38 +0000228
229 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
230 Asm->OutStreamer.EmitLabel(TmpSym);
231 return TmpSym;
232}
233
Eric Christopherd9843b32011-11-10 19:25:34 +0000234static bool isObjCClass(StringRef Name) {
235 return Name.startswith("+") || Name.startswith("-");
236}
237
238static bool hasObjCCategory(StringRef Name) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000239 if (!isObjCClass(Name))
240 return false;
Eric Christopherd9843b32011-11-10 19:25:34 +0000241
Benjamin Kramer260de742013-08-24 12:15:54 +0000242 return Name.find(") ") != StringRef::npos;
Eric Christopherd9843b32011-11-10 19:25:34 +0000243}
244
245static void getObjCClassCategory(StringRef In, StringRef &Class,
246 StringRef &Category) {
247 if (!hasObjCCategory(In)) {
248 Class = In.slice(In.find('[') + 1, In.find(' '));
249 Category = "";
250 return;
251 }
252
253 Class = In.slice(In.find('[') + 1, In.find('('));
254 Category = In.slice(In.find('[') + 1, In.find(' '));
255 return;
256}
257
258static StringRef getObjCMethodName(StringRef In) {
259 return In.slice(In.find(' ') + 1, In.find(']'));
260}
261
Richard Mittonc2508242013-10-03 22:07:08 +0000262// Helper for sorting sections into a stable output order.
263static bool SectionSort(const MCSection *A, const MCSection *B) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000264 std::string LA = (A ? A->getLabelBeginName() : "");
265 std::string LB = (B ? B->getLabelBeginName() : "");
266 return LA < LB;
Richard Mittonc2508242013-10-03 22:07:08 +0000267}
268
Eric Christopherd9843b32011-11-10 19:25:34 +0000269// Add the various names to the Dwarf accelerator table names.
Eric Christopher9cd26af2013-09-20 23:22:52 +0000270// TODO: Determine whether or not we should add names for programs
271// that do not have a DW_AT_name or DW_AT_linkage_name field - this
272// is only slightly different than the lookup of non-standard ObjC names.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000273void DwarfDebug::addSubprogramNames(DISubprogram SP, DIE &Die) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000274 if (!SP.isDefinition())
275 return;
David Blaikie2406a0622014-04-23 23:37:35 +0000276 addAccelName(SP.getName(), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000277
278 // If the linkage name is different than the name, go ahead and output
279 // that as well into the name table.
280 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
David Blaikie2406a0622014-04-23 23:37:35 +0000281 addAccelName(SP.getLinkageName(), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000282
283 // If this is an Objective-C selector name add it to the ObjC accelerator
284 // too.
285 if (isObjCClass(SP.getName())) {
286 StringRef Class, Category;
287 getObjCClassCategory(SP.getName(), Class, Category);
David Blaikie0ee82b92014-04-24 00:53:32 +0000288 addAccelObjC(Class, Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000289 if (Category != "")
David Blaikie0ee82b92014-04-24 00:53:32 +0000290 addAccelObjC(Category, Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000291 // Also add the base method name to the name table.
David Blaikie2406a0622014-04-23 23:37:35 +0000292 addAccelName(getObjCMethodName(SP.getName()), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000293 }
294}
295
Manman Ren3eb9dff2013-09-09 19:05:21 +0000296/// isSubprogramContext - Return true if Context is either a subprogram
297/// or another context nested inside a subprogram.
298bool DwarfDebug::isSubprogramContext(const MDNode *Context) {
299 if (!Context)
300 return false;
301 DIDescriptor D(Context);
302 if (D.isSubprogram())
303 return true;
304 if (D.isType())
Manman Ren116868e2013-09-09 19:47:11 +0000305 return isSubprogramContext(resolve(DIType(Context).getContext()));
Manman Ren3eb9dff2013-09-09 19:05:21 +0000306 return false;
307}
308
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000309// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
310// and DW_AT_high_pc attributes. If there are global variables in this
311// scope then create and insert DIEs for these variables.
David Blaikief9b6a552014-04-22 22:39:41 +0000312DIE *DwarfDebug::updateSubprogramScopeDIE(DwarfCompileUnit &SPCU,
Eric Christopher4287a492013-12-09 23:57:44 +0000313 DISubprogram SP) {
David Blaikief9b6a552014-04-22 22:39:41 +0000314 DIE *SPDie = SPCU.getDIE(SP);
Devang Patela37a95e2010-07-07 22:20:57 +0000315
Chris Lattner3a383cb2010-04-05 00:13:49 +0000316 assert(SPDie && "Unable to find subprogram DIE!");
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000317
Bill Wendlingf720bf62012-11-07 05:19:04 +0000318 // If we're updating an abstract DIE, then we will be adding the children and
319 // object pointer later on. But what we don't want to do is process the
320 // concrete DIE twice.
David Blaikie25bc7192013-11-15 23:13:08 +0000321 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SP)) {
Bill Wendlingf720bf62012-11-07 05:19:04 +0000322 // Pick up abstract subprogram DIE.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000323 SPDie = &SPCU.createAndAddDIE(dwarf::DW_TAG_subprogram, SPCU.getUnitDie());
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000324 SPCU.addDIEEntry(*SPDie, dwarf::DW_AT_abstract_origin, *AbsSPDIE);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000325 } else {
326 DISubprogram SPDecl = SP.getFunctionDeclaration();
327 if (!SPDecl.isSubprogram()) {
328 // There is not any need to generate specification DIE for a function
329 // defined at compile unit level. If a function is defined inside another
330 // function then gdb prefers the definition at top level and but does not
331 // expect specification DIE in parent function. So avoid creating
332 // specification DIE for a function defined inside a function.
Manman Renc50fa112013-10-10 18:40:01 +0000333 DIScope SPContext = resolve(SP.getContext());
334 if (SP.isDefinition() && !SPContext.isCompileUnit() &&
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000335 !SPContext.isFile() && !isSubprogramContext(SPContext)) {
David Blaikie65a74662014-04-25 18:26:14 +0000336 SPCU.addFlag(*SPDie, dwarf::DW_AT_declaration);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000337
338 // Add arguments.
339 DICompositeType SPTy = SP.getType();
340 DIArray Args = SPTy.getTypeArray();
Eric Christopher31b05762013-08-08 01:41:00 +0000341 uint16_t SPTag = SPTy.getTag();
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000342 if (SPTag == dwarf::DW_TAG_subroutine_type)
David Blaikief9b6a552014-04-22 22:39:41 +0000343 SPCU.constructSubprogramArguments(*SPDie, Args);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000344 DIE *SPDeclDie = SPDie;
David Blaikie637cac42014-04-22 23:09:36 +0000345 SPDie =
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000346 &SPCU.createAndAddDIE(dwarf::DW_TAG_subprogram, SPCU.getUnitDie());
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000347 SPCU.addDIEEntry(*SPDie, dwarf::DW_AT_specification, *SPDeclDie);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000348 }
349 }
Devang Patela37a95e2010-07-07 22:20:57 +0000350 }
351
David Blaikie65a74662014-04-25 18:26:14 +0000352 attachLowHighPC(SPCU, *SPDie, FunctionBeginSym, FunctionEndSym);
Eric Christopher0f63d062013-12-03 00:45:45 +0000353
Chris Lattner3a383cb2010-04-05 00:13:49 +0000354 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
355 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
David Blaikie65a74662014-04-25 18:26:14 +0000356 SPCU.addAddress(*SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patel6efc8e52010-02-06 01:02:37 +0000357
Eric Christopherd9843b32011-11-10 19:25:34 +0000358 // Add name to the name table, we do this here because we're guaranteed
359 // to have concrete versions of our DW_TAG_subprogram nodes.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000360 addSubprogramNames(SP, *SPDie);
Eric Christopher6a841382012-11-19 22:42:10 +0000361
Chris Lattner3a383cb2010-04-05 00:13:49 +0000362 return SPDie;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000363}
364
Manman Ren5b2f4b02013-09-11 19:40:28 +0000365/// Check whether we should create a DIE for the given Scope, return true
366/// if we don't create a DIE (the corresponding DIE is null).
Manman Ren2312ed32013-09-10 18:40:41 +0000367bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
368 if (Scope->isAbstractScope())
369 return false;
370
Manman Ren5b2f4b02013-09-11 19:40:28 +0000371 // We don't create a DIE if there is no Range.
Manman Ren2312ed32013-09-10 18:40:41 +0000372 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
373 if (Ranges.empty())
374 return true;
375
376 if (Ranges.size() > 1)
377 return false;
378
Manman Ren5b2f4b02013-09-11 19:40:28 +0000379 // We don't create a DIE if we have a single Range and the end label
380 // is null.
Manman Ren2312ed32013-09-10 18:40:41 +0000381 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
382 MCSymbol *End = getLabelAfterInsn(RI->second);
383 return !End;
384}
385
David Blaikie65a74662014-04-25 18:26:14 +0000386static void addSectionLabel(AsmPrinter &Asm, DwarfUnit &U, DIE &D,
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000387 dwarf::Attribute A, const MCSymbol *L,
388 const MCSymbol *Sec) {
David Blaikief9b6a552014-04-22 22:39:41 +0000389 if (Asm.MAI->doesDwarfUseRelocationsAcrossSections())
390 U.addSectionLabel(D, A, L);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000391 else
David Blaikief9b6a552014-04-22 22:39:41 +0000392 U.addSectionDelta(D, A, L, Sec);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000393}
394
David Blaikie65a74662014-04-25 18:26:14 +0000395void DwarfDebug::addScopeRangeList(DwarfCompileUnit &TheCU, DIE &ScopeDIE,
Eric Christopherbe2513e2013-12-03 00:45:59 +0000396 const SmallVectorImpl<InsnRange> &Range) {
397 // Emit offset in .debug_range as a relocatable label. emitDIE will handle
398 // emitting it appropriately.
Eric Christopherf8790642013-12-04 22:04:50 +0000399 MCSymbol *RangeSym = Asm->GetTempSymbol("debug_ranges", GlobalRangeCount++);
David Blaikie26b2bd02014-03-24 21:07:27 +0000400
401 // Under fission, ranges are specified by constant offsets relative to the
402 // CU's DW_AT_GNU_ranges_base.
403 if (useSplitDwarf())
David Blaikief9b6a552014-04-22 22:39:41 +0000404 TheCU.addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
David Blaikie637cac42014-04-22 23:09:36 +0000405 DwarfDebugRangeSectionSym);
David Blaikie26b2bd02014-03-24 21:07:27 +0000406 else
David Blaikief9b6a552014-04-22 22:39:41 +0000407 addSectionLabel(*Asm, TheCU, ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
David Blaikie26b2bd02014-03-24 21:07:27 +0000408 DwarfDebugRangeSectionSym);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000409
Eric Christopherf8790642013-12-04 22:04:50 +0000410 RangeSpanList List(RangeSym);
Benjamin Kramer15596c72014-03-07 19:09:39 +0000411 for (const InsnRange &R : Range) {
412 RangeSpan Span(getLabelBeforeInsn(R.first), getLabelAfterInsn(R.second));
Chandler Carruth002da5d2014-03-02 04:08:41 +0000413 List.addRange(std::move(Span));
Eric Christopherbe2513e2013-12-03 00:45:59 +0000414 }
415
416 // Add the range list to the set of ranges to be emitted.
David Blaikief9b6a552014-04-22 22:39:41 +0000417 TheCU.addRangeList(std::move(List));
Eric Christopherbe2513e2013-12-03 00:45:59 +0000418}
419
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000420// Construct new DW_TAG_lexical_block for this scope and attach
421// DW_AT_low_pc/DW_AT_high_pc labels.
David Blaikief2449222014-04-28 20:36:45 +0000422std::unique_ptr<DIE>
423DwarfDebug::constructLexicalScopeDIE(DwarfCompileUnit &TheCU,
424 LexicalScope *Scope) {
Manman Ren2312ed32013-09-10 18:40:41 +0000425 if (isLexicalScopeDIENull(Scope))
Craig Topper353eda42014-04-24 06:44:33 +0000426 return nullptr;
Manman Ren2312ed32013-09-10 18:40:41 +0000427
David Blaikief2449222014-04-28 20:36:45 +0000428 auto ScopeDIE = make_unique<DIE>(dwarf::DW_TAG_lexical_block);
Devang Patel6c74a872010-04-27 19:46:33 +0000429 if (Scope->isAbstractScope())
430 return ScopeDIE;
431
Eric Christopher0f63d062013-12-03 00:45:45 +0000432 const SmallVectorImpl<InsnRange> &ScopeRanges = Scope->getRanges();
Eric Christopherbe2513e2013-12-03 00:45:59 +0000433
Eric Christopherdc42ea82013-07-03 01:57:28 +0000434 // If we have multiple ranges, emit them into the range section.
Eric Christopher0f63d062013-12-03 00:45:45 +0000435 if (ScopeRanges.size() > 1) {
David Blaikie65a74662014-04-25 18:26:14 +0000436 addScopeRangeList(TheCU, *ScopeDIE, ScopeRanges);
Devang Patel6c74a872010-04-27 19:46:33 +0000437 return ScopeDIE;
438 }
439
Eric Christopherdc42ea82013-07-03 01:57:28 +0000440 // Construct the address range for this DIE.
Eric Christopher0f63d062013-12-03 00:45:45 +0000441 SmallVectorImpl<InsnRange>::const_iterator RI = ScopeRanges.begin();
Eric Christopher962c9082013-01-15 23:56:56 +0000442 MCSymbol *Start = getLabelBeforeInsn(RI->first);
443 MCSymbol *End = getLabelAfterInsn(RI->second);
Manman Ren2312ed32013-09-10 18:40:41 +0000444 assert(End && "End label should not be null!");
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000445
Chris Lattnere13c3722010-03-09 01:58:53 +0000446 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
447 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000448
David Blaikie65a74662014-04-25 18:26:14 +0000449 attachLowHighPC(TheCU, *ScopeDIE, Start, End);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000450
451 return ScopeDIE;
452}
453
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000454// This scope represents inlined body of a function. Construct DIE to
455// represent this concrete inlined copy of the function.
David Blaikief2449222014-04-28 20:36:45 +0000456std::unique_ptr<DIE>
457DwarfDebug::constructInlinedScopeDIE(DwarfCompileUnit &TheCU,
458 LexicalScope *Scope) {
Eric Christopher0f63d062013-12-03 00:45:45 +0000459 const SmallVectorImpl<InsnRange> &ScopeRanges = Scope->getRanges();
Eric Christopher1cdb63d2013-12-04 21:20:15 +0000460 assert(!ScopeRanges.empty() &&
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000461 "LexicalScope does not have instruction markers!");
Devang Patel6c74a872010-04-27 19:46:33 +0000462
Devang Patelf098ce22011-07-27 00:34:13 +0000463 if (!Scope->getScopeNode())
Craig Topper353eda42014-04-24 06:44:33 +0000464 return nullptr;
Devang Patelf098ce22011-07-27 00:34:13 +0000465 DIScope DS(Scope->getScopeNode());
466 DISubprogram InlinedSP = getDISubprogram(DS);
David Blaikief9b6a552014-04-22 22:39:41 +0000467 DIE *OriginDIE = TheCU.getDIE(InlinedSP);
Devang Patelf098ce22011-07-27 00:34:13 +0000468 if (!OriginDIE) {
Bill Wendling10e0e2e2012-10-30 17:51:02 +0000469 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Craig Topper353eda42014-04-24 06:44:33 +0000470 return nullptr;
Devang Patelf098ce22011-07-27 00:34:13 +0000471 }
472
David Blaikief2449222014-04-28 20:36:45 +0000473 auto ScopeDIE = make_unique<DIE>(dwarf::DW_TAG_inlined_subroutine);
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000474 TheCU.addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000475
Eric Christopherbe2513e2013-12-03 00:45:59 +0000476 // If we have multiple ranges, emit them into the range section.
477 if (ScopeRanges.size() > 1)
David Blaikie65a74662014-04-25 18:26:14 +0000478 addScopeRangeList(TheCU, *ScopeDIE, ScopeRanges);
Eric Christopherbe2513e2013-12-03 00:45:59 +0000479 else {
Eric Christopher0f63d062013-12-03 00:45:45 +0000480 SmallVectorImpl<InsnRange>::const_iterator RI = ScopeRanges.begin();
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000481 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
482 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
483
Craig Topper353eda42014-04-24 06:44:33 +0000484 if (!StartLabel || !EndLabel)
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000485 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
486
487 assert(StartLabel->isDefined() &&
488 "Invalid starting label for an inlined scope!");
489 assert(EndLabel->isDefined() && "Invalid end label for an inlined scope!");
490
David Blaikie65a74662014-04-25 18:26:14 +0000491 attachLowHighPC(TheCU, *ScopeDIE, StartLabel, EndLabel);
Devang Patelf098ce22011-07-27 00:34:13 +0000492 }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000493
494 InlinedSubprogramDIEs.insert(OriginDIE);
495
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000496 // Add the call site information to the DIE.
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000497 DILocation DL(Scope->getInlinedAt());
David Blaikie65a74662014-04-25 18:26:14 +0000498 TheCU.addUInt(*ScopeDIE, dwarf::DW_AT_call_file, None,
David Blaikie637cac42014-04-22 23:09:36 +0000499 TheCU.getOrCreateSourceID(DL.getFilename(), DL.getDirectory()));
David Blaikie65a74662014-04-25 18:26:14 +0000500 TheCU.addUInt(*ScopeDIE, dwarf::DW_AT_call_line, None, DL.getLineNumber());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000501
Eric Christopher8dda5d02011-12-04 06:02:38 +0000502 // Add name to the name table, we do this here because we're guaranteed
503 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000504 addSubprogramNames(InlinedSP, *ScopeDIE);
Eric Christopher6a841382012-11-19 22:42:10 +0000505
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000506 return ScopeDIE;
507}
508
David Blaikie914046e2014-04-25 20:00:34 +0000509DIE *DwarfDebug::createScopeChildrenDIE(
510 DwarfCompileUnit &TheCU, LexicalScope *Scope,
511 SmallVectorImpl<std::unique_ptr<DIE>> &Children) {
Craig Topper353eda42014-04-24 06:44:33 +0000512 DIE *ObjectPointer = nullptr;
Devang Patel6c622ef2011-03-01 22:58:55 +0000513
514 // Collect arguments for current function.
Adrian Prantl3f49c892014-02-25 19:57:42 +0000515 if (LScopes.isCurrentFunctionScope(Scope)) {
David Blaikieafd2c6b2014-04-22 05:41:06 +0000516 for (DbgVariable *ArgDV : CurrentFnArguments)
David Blaikie914046e2014-04-25 20:00:34 +0000517 if (ArgDV) {
David Blaikie45aa56b2014-04-26 22:37:45 +0000518 Children.push_back(
519 TheCU.constructVariableDIE(*ArgDV, Scope->isAbstractScope()));
David Blaikie914046e2014-04-25 20:00:34 +0000520 if (ArgDV->isObjectPointer())
David Blaikie45aa56b2014-04-26 22:37:45 +0000521 ObjectPointer = Children.back().get();
David Blaikie914046e2014-04-25 20:00:34 +0000522 }
Devang Patel6c622ef2011-03-01 22:58:55 +0000523
Adrian Prantl69140d22014-02-25 22:27:14 +0000524 // If this is a variadic function, add an unspecified parameter.
Adrian Prantl3f49c892014-02-25 19:57:42 +0000525 DISubprogram SP(Scope->getScopeNode());
Adrian Prantl3f49c892014-02-25 19:57:42 +0000526 DIArray FnArgs = SP.getType().getTypeArray();
Eric Christopher73ffdb82014-02-26 02:50:56 +0000527 if (FnArgs.getElement(FnArgs.getNumElements() - 1)
528 .isUnspecifiedParameter()) {
David Blaikie914046e2014-04-25 20:00:34 +0000529 Children.push_back(
530 make_unique<DIE>(dwarf::DW_TAG_unspecified_parameters));
Adrian Prantl3f49c892014-02-25 19:57:42 +0000531 }
532 }
533
Eric Christopherf84354b2011-10-03 15:49:16 +0000534 // Collect lexical scope children first.
David Blaikie914046e2014-04-25 20:00:34 +0000535 for (DbgVariable *DV : ScopeVariables.lookup(Scope)) {
David Blaikie45aa56b2014-04-26 22:37:45 +0000536 Children.push_back(
537 TheCU.constructVariableDIE(*DV, Scope->isAbstractScope()));
David Blaikie914046e2014-04-25 20:00:34 +0000538 if (DV->isObjectPointer())
David Blaikie45aa56b2014-04-26 22:37:45 +0000539 ObjectPointer = Children.back().get();
David Blaikie914046e2014-04-25 20:00:34 +0000540 }
Benjamin Kramer15596c72014-03-07 19:09:39 +0000541 for (LexicalScope *LS : Scope->getChildren())
David Blaikief2449222014-04-28 20:36:45 +0000542 if (std::unique_ptr<DIE> Nested = constructScopeDIE(TheCU, LS))
543 Children.push_back(std::move(Nested));
Manman Ren2312ed32013-09-10 18:40:41 +0000544 return ObjectPointer;
545}
546
Eric Christopher793c7472014-04-28 20:42:22 +0000547DIE *DwarfDebug::constructSubprogramScopeDIE(DwarfCompileUnit &TheCU,
548 LexicalScope *Scope) {
David Blaikied8f0ac72014-04-28 20:27:02 +0000549 assert(Scope && Scope->getScopeNode());
550
551 DIScope DS(Scope->getScopeNode());
552
553 assert(!Scope->getInlinedAt());
554 assert(DS.isSubprogram());
555
556 ProcessedSPNodes.insert(DS);
557
558 SmallVector<std::unique_ptr<DIE>, 8> Children;
559 DIE *ScopeDIE;
560
561 if (Scope->isAbstractScope()) {
562 ScopeDIE = TheCU.getDIE(DS);
563 // Note down abstract DIE.
564 if (ScopeDIE)
565 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
566 else {
567 assert(Children.empty() &&
568 "We create children only when the scope DIE is not null.");
569 return nullptr;
570 }
571 } else
572 ScopeDIE = updateSubprogramScopeDIE(TheCU, DISubprogram(DS));
573
574 // We create children when the scope DIE is not null.
575 if (DIE *ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children))
576 TheCU.addDIEEntry(*ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer);
577
578 // Add children
579 for (auto &I : Children)
580 ScopeDIE->addChild(std::move(I));
581
582 return ScopeDIE;
583}
584
Manman Ren2312ed32013-09-10 18:40:41 +0000585// Construct a DIE for this scope.
David Blaikief2449222014-04-28 20:36:45 +0000586std::unique_ptr<DIE> DwarfDebug::constructScopeDIE(DwarfCompileUnit &TheCU,
587 LexicalScope *Scope) {
Manman Ren2312ed32013-09-10 18:40:41 +0000588 if (!Scope || !Scope->getScopeNode())
Craig Topper353eda42014-04-24 06:44:33 +0000589 return nullptr;
Manman Ren2312ed32013-09-10 18:40:41 +0000590
Adrian Prantl78619f72014-03-21 22:16:32 +0000591 DIScope DS(Scope->getScopeNode());
Manman Ren2312ed32013-09-10 18:40:41 +0000592
David Blaikied8f0ac72014-04-28 20:27:02 +0000593 assert(Scope->getInlinedAt() ||
594 !DS.isSubprogram() && "Only handle inlined subprograms here, use "
595 "constructSubprogramScopeDIE for non-inlined "
596 "subprograms");
597
David Blaikie914046e2014-04-25 20:00:34 +0000598 SmallVector<std::unique_ptr<DIE>, 8> Children;
Manman Ren2312ed32013-09-10 18:40:41 +0000599
Manman Ren5b2f4b02013-09-11 19:40:28 +0000600 // We try to create the scope DIE first, then the children DIEs. This will
601 // avoid creating un-used children then removing them later when we find out
602 // the scope DIE is null.
David Blaikief2449222014-04-28 20:36:45 +0000603 std::unique_ptr<DIE> ScopeDIE;
David Blaikied8f0ac72014-04-28 20:27:02 +0000604 if (Scope->getInlinedAt()) {
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000605 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
David Blaikied8f0ac72014-04-28 20:27:02 +0000606 if (!ScopeDIE)
607 return nullptr;
608 // We create children when the scope DIE is not null.
609 createScopeChildrenDIE(TheCU, Scope, Children);
David Blaikiee26a3772013-11-18 23:59:04 +0000610 } else {
Manman Ren5b2f4b02013-09-11 19:40:28 +0000611 // Early exit when we know the scope DIE is going to be null.
Manman Ren2312ed32013-09-10 18:40:41 +0000612 if (isLexicalScopeDIENull(Scope))
Craig Topper353eda42014-04-24 06:44:33 +0000613 return nullptr;
Manman Ren5b2f4b02013-09-11 19:40:28 +0000614
615 // We create children here when we know the scope DIE is not going to be
616 // null and the children will be added to the scope DIE.
David Blaikied8f0ac72014-04-28 20:27:02 +0000617 createScopeChildrenDIE(TheCU, Scope, Children);
Manman Ren5b2f4b02013-09-11 19:40:28 +0000618
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000619 // There is no need to emit empty lexical block DIE.
David Blaikie684fc532013-05-06 23:33:07 +0000620 std::pair<ImportedEntityMap::const_iterator,
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000621 ImportedEntityMap::const_iterator> Range =
Eric Christopher793c7472014-04-28 20:42:22 +0000622 std::equal_range(ScopesWithImportedEntities.begin(),
623 ScopesWithImportedEntities.end(),
624 std::pair<const MDNode *, const MDNode *>(DS, nullptr),
625 less_first());
David Blaikie684fc532013-05-06 23:33:07 +0000626 if (Children.empty() && Range.first == Range.second)
Craig Topper353eda42014-04-24 06:44:33 +0000627 return nullptr;
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000628 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Manman Ren2312ed32013-09-10 18:40:41 +0000629 assert(ScopeDIE && "Scope DIE should not be null.");
Eric Christopher5fdd68e2013-06-24 23:20:02 +0000630 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
631 ++i)
David Blaikief2449222014-04-28 20:36:45 +0000632 constructImportedEntityDIE(TheCU, i->second, *ScopeDIE);
Benjamin Kramer892daba2013-08-24 11:55:49 +0000633 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000634
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000635 // Add children
David Blaikie914046e2014-04-25 20:00:34 +0000636 for (auto &I : Children)
637 ScopeDIE->addChild(std::move(I));
Devang Patel04d2f2d2009-11-24 01:14:22 +0000638
Eric Christopherd9843b32011-11-10 19:25:34 +0000639 return ScopeDIE;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000640}
641
David Blaikie65a74662014-04-25 18:26:14 +0000642void DwarfDebug::addGnuPubAttributes(DwarfUnit &U, DIE &D) const {
David Blaikie3c842622013-12-04 21:31:26 +0000643 if (!GenerateGnuPubSections)
644 return;
645
David Blaikief9b6a552014-04-22 22:39:41 +0000646 U.addFlag(D, dwarf::DW_AT_GNU_pubnames);
David Blaikie3c842622013-12-04 21:31:26 +0000647}
648
Eric Christopher4287a492013-12-09 23:57:44 +0000649// Create new DwarfCompileUnit for the given metadata node with tag
Eric Christopher48fef592012-12-20 21:58:40 +0000650// DW_TAG_compile_unit.
David Blaikief9b6a552014-04-22 22:39:41 +0000651DwarfCompileUnit &DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) {
Devang Patel2d9caf92009-11-25 17:36:49 +0000652 StringRef FN = DIUnit.getFilename();
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000653 CompilationDir = DIUnit.getDirectory();
Bill Wendling2b128d72009-05-20 23:19:06 +0000654
655 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
David Blaikief9b6a552014-04-22 22:39:41 +0000656 auto OwnedUnit = make_unique<DwarfCompileUnit>(
Eric Christopher4287a492013-12-09 23:57:44 +0000657 InfoHolder.getUnits().size(), Die, DIUnit, Asm, this, &InfoHolder);
David Blaikief9b6a552014-04-22 22:39:41 +0000658 DwarfCompileUnit &NewCU = *OwnedUnit;
659 InfoHolder.addUnit(std::move(OwnedUnit));
660
David Blaikie7ac51492014-03-20 17:05:45 +0000661 // LTO with assembly output shares a single line table amongst multiple CUs.
662 // To avoid the compilation directory being ambiguous, let the line table
663 // explicitly describe the directory of all files, never relying on the
664 // compilation directory.
David Blaikie47f4b822014-03-19 00:11:28 +0000665 if (!Asm->OutStreamer.hasRawTextSupport() || SingleCU)
David Blaikiee05274d2014-03-18 00:11:48 +0000666 Asm->OutStreamer.getContext().setMCLineTableCompilationDir(
David Blaikief9b6a552014-04-22 22:39:41 +0000667 NewCU.getUniqueID(), CompilationDir);
David Blaikie2666e242013-12-06 19:38:46 +0000668
David Blaikie65a74662014-04-25 18:26:14 +0000669 NewCU.addString(*Die, dwarf::DW_AT_producer, DIUnit.getProducer());
670 NewCU.addUInt(*Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
David Blaikie637cac42014-04-22 23:09:36 +0000671 DIUnit.getLanguage());
David Blaikie65a74662014-04-25 18:26:14 +0000672 NewCU.addString(*Die, dwarf::DW_AT_name, FN);
Eric Christopher52ce7182013-04-09 19:23:15 +0000673
Eric Christopher52ce7182013-04-09 19:23:15 +0000674 if (!useSplitDwarf()) {
David Blaikief9b6a552014-04-22 22:39:41 +0000675 NewCU.initStmtList(DwarfLineSectionSym);
Eric Christophera51d3fc2013-09-27 22:50:48 +0000676
677 // If we're using split dwarf the compilation dir is going to be in the
678 // skeleton CU and so we don't need to duplicate it here.
679 if (!CompilationDir.empty())
David Blaikie65a74662014-04-25 18:26:14 +0000680 NewCU.addString(*Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christophera51d3fc2013-09-27 22:50:48 +0000681
David Blaikie65a74662014-04-25 18:26:14 +0000682 addGnuPubAttributes(NewCU, *Die);
Eric Christopher52ce7182013-04-09 19:23:15 +0000683 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000684
Bill Wendling2b128d72009-05-20 23:19:06 +0000685 if (DIUnit.isOptimized())
David Blaikie65a74662014-04-25 18:26:14 +0000686 NewCU.addFlag(*Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendling2b128d72009-05-20 23:19:06 +0000687
Devang Patel2d9caf92009-11-25 17:36:49 +0000688 StringRef Flags = DIUnit.getFlags();
689 if (!Flags.empty())
David Blaikie65a74662014-04-25 18:26:14 +0000690 NewCU.addString(*Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher6a841382012-11-19 22:42:10 +0000691
Nick Lewycky479a8fe2011-10-17 23:27:36 +0000692 if (unsigned RVer = DIUnit.getRunTimeVersion())
David Blaikie65a74662014-04-25 18:26:14 +0000693 NewCU.addUInt(*Die, dwarf::DW_AT_APPLE_major_runtime_vers,
David Blaikie637cac42014-04-22 23:09:36 +0000694 dwarf::DW_FORM_data1, RVer);
Bill Wendling2b128d72009-05-20 23:19:06 +0000695
Devang Patel1a0df9a2010-05-10 22:49:55 +0000696 if (!FirstCU)
David Blaikief9b6a552014-04-22 22:39:41 +0000697 FirstCU = &NewCU;
Eric Christopher7a2cdf72013-02-05 07:31:55 +0000698
Eric Christopherd4368fd2014-01-02 21:03:28 +0000699 if (useSplitDwarf()) {
David Blaikief9b6a552014-04-22 22:39:41 +0000700 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoDWOSection(),
David Blaikie637cac42014-04-22 23:09:36 +0000701 DwarfInfoDWOSectionSym);
David Blaikief9b6a552014-04-22 22:39:41 +0000702 NewCU.setSkeleton(constructSkeletonCU(NewCU));
Eric Christopherd4368fd2014-01-02 21:03:28 +0000703 } else
David Blaikief9b6a552014-04-22 22:39:41 +0000704 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
David Blaikie637cac42014-04-22 23:09:36 +0000705 DwarfInfoSectionSym);
Eric Christopherd039baa2013-12-30 03:40:32 +0000706
David Blaikief9b6a552014-04-22 22:39:41 +0000707 CUMap.insert(std::make_pair(DIUnit, &NewCU));
708 CUDieMap.insert(std::make_pair(Die, &NewCU));
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000709 return NewCU;
Devang Patel1a0df9a2010-05-10 22:49:55 +0000710}
711
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000712// Construct subprogram DIE.
David Blaikief9b6a552014-04-22 22:39:41 +0000713void DwarfDebug::constructSubprogramDIE(DwarfCompileUnit &TheCU,
Eric Christopher4287a492013-12-09 23:57:44 +0000714 const MDNode *N) {
Eric Christopherffbc4de2013-10-18 01:57:30 +0000715 // FIXME: We should only call this routine once, however, during LTO if a
716 // program is defined in multiple CUs we could end up calling it out of
717 // beginModule as we walk the CUs.
718
Eric Christopher4287a492013-12-09 23:57:44 +0000719 DwarfCompileUnit *&CURef = SPMap[N];
Eric Christopherffbc4de2013-10-18 01:57:30 +0000720 if (CURef)
721 return;
David Blaikief9b6a552014-04-22 22:39:41 +0000722 CURef = &TheCU;
Rafael Espindola6cf4e832011-11-04 19:00:29 +0000723
Devang Patel80ae3492009-08-28 23:24:31 +0000724 DISubprogram SP(N);
Bill Wendling2b128d72009-05-20 23:19:06 +0000725 if (!SP.isDefinition())
726 // This is a method declaration which will be handled while constructing
727 // class type.
Devang Patel0751a282009-06-26 01:49:18 +0000728 return;
Bill Wendling2b128d72009-05-20 23:19:06 +0000729
David Blaikie65a74662014-04-25 18:26:14 +0000730 DIE &SubprogramDie = *TheCU.getOrCreateSubprogramDIE(SP);
Stuart Hastings4bd3dd92010-04-06 21:38:29 +0000731
Eric Christopherba506db2013-09-09 20:03:20 +0000732 // Expose as a global name.
David Blaikief9b6a552014-04-22 22:39:41 +0000733 TheCU.addGlobalName(SP.getName(), SubprogramDie, resolve(SP.getContext()));
Bill Wendling2b128d72009-05-20 23:19:06 +0000734}
735
David Blaikief9b6a552014-04-22 22:39:41 +0000736void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
David Blaikief55abea2013-04-22 06:12:31 +0000737 const MDNode *N) {
David Blaikie1fd43652013-05-07 21:35:53 +0000738 DIImportedEntity Module(N);
David Blaikie5e390e42014-02-04 01:23:52 +0000739 assert(Module.Verify());
David Blaikief9b6a552014-04-22 22:39:41 +0000740 if (DIE *D = TheCU.getOrCreateContextDIE(Module.getContext()))
David Blaikief2449222014-04-28 20:36:45 +0000741 constructImportedEntityDIE(TheCU, Module, *D);
David Blaikie684fc532013-05-06 23:33:07 +0000742}
743
David Blaikief9b6a552014-04-22 22:39:41 +0000744void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
David Blaikief2449222014-04-28 20:36:45 +0000745 const MDNode *N, DIE &Context) {
David Blaikie1fd43652013-05-07 21:35:53 +0000746 DIImportedEntity Module(N);
David Blaikie5e390e42014-02-04 01:23:52 +0000747 assert(Module.Verify());
David Blaikie4dd2de72013-05-08 06:01:38 +0000748 return constructImportedEntityDIE(TheCU, Module, Context);
David Blaikie684fc532013-05-06 23:33:07 +0000749}
750
David Blaikief9b6a552014-04-22 22:39:41 +0000751void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
David Blaikie1fd43652013-05-07 21:35:53 +0000752 const DIImportedEntity &Module,
David Blaikief2449222014-04-28 20:36:45 +0000753 DIE &Context) {
David Blaikie684fc532013-05-06 23:33:07 +0000754 assert(Module.Verify() &&
755 "Use one of the MDNode * overloads to handle invalid metadata");
David Blaikief2449222014-04-28 20:36:45 +0000756 DIE &IMDie = TheCU.createAndAddDIE(Module.getTag(), Context, Module);
David Blaikie1fd43652013-05-07 21:35:53 +0000757 DIE *EntityDie;
Adrian Prantld09ba232014-04-01 03:41:04 +0000758 DIDescriptor Entity = resolve(Module.getEntity());
David Blaikie1fd43652013-05-07 21:35:53 +0000759 if (Entity.isNameSpace())
David Blaikief9b6a552014-04-22 22:39:41 +0000760 EntityDie = TheCU.getOrCreateNameSpace(DINameSpace(Entity));
David Blaikie1fd43652013-05-07 21:35:53 +0000761 else if (Entity.isSubprogram())
David Blaikief9b6a552014-04-22 22:39:41 +0000762 EntityDie = TheCU.getOrCreateSubprogramDIE(DISubprogram(Entity));
David Blaikie3b6038b2013-05-08 06:01:41 +0000763 else if (Entity.isType())
David Blaikief9b6a552014-04-22 22:39:41 +0000764 EntityDie = TheCU.getOrCreateTypeDIE(DIType(Entity));
David Blaikie1fd43652013-05-07 21:35:53 +0000765 else
David Blaikief9b6a552014-04-22 22:39:41 +0000766 EntityDie = TheCU.getDIE(Entity);
767 TheCU.addSourceLine(IMDie, Module.getLineNumber(),
David Blaikie637cac42014-04-22 23:09:36 +0000768 Module.getContext().getFilename(),
769 Module.getContext().getDirectory());
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000770 TheCU.addDIEEntry(IMDie, dwarf::DW_AT_import, *EntityDie);
David Blaikiee63d5d12013-05-20 22:50:35 +0000771 StringRef Name = Module.getName();
772 if (!Name.empty())
David Blaikief9b6a552014-04-22 22:39:41 +0000773 TheCU.addString(IMDie, dwarf::DW_AT_name, Name);
David Blaikief55abea2013-04-22 06:12:31 +0000774}
775
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000776// Emit all Dwarf sections that should come prior to the content. Create
777// global DIEs and emit initial debug info sections. This is invoked by
778// the target AsmPrinter.
Eric Christopher58f41952012-11-19 22:42:15 +0000779void DwarfDebug::beginModule() {
Devang Patel6c74a872010-04-27 19:46:33 +0000780 if (DisableDebugInfoPrinting)
781 return;
782
Eric Christopher58f41952012-11-19 22:42:15 +0000783 const Module *M = MMI->getModule();
784
Nick Lewycky019d2552011-07-29 03:49:23 +0000785 // If module has named metadata anchors then use them, otherwise scan the
786 // module using debug info finder to collect debug info.
Devang Patele02e5852011-05-03 16:45:22 +0000787 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiedc69ebb2013-03-11 23:39:23 +0000788 if (!CU_Nodes)
Devang Patel07bb9ee2011-08-15 23:47:24 +0000789 return;
Manman Ren60352032013-09-05 18:48:31 +0000790 TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
Devang Patele02e5852011-05-03 16:45:22 +0000791
David Blaikiedc69ebb2013-03-11 23:39:23 +0000792 // Emit initial sections so we can reference labels later.
793 emitSectionLabels();
794
David Blaikie47f4b822014-03-19 00:11:28 +0000795 SingleCU = CU_Nodes->getNumOperands() == 1;
David Blaikiee05274d2014-03-18 00:11:48 +0000796
David Blaikie47f4b822014-03-19 00:11:28 +0000797 for (MDNode *N : CU_Nodes->operands()) {
Benjamin Kramer15596c72014-03-07 19:09:39 +0000798 DICompileUnit CUNode(N);
David Blaikief9b6a552014-04-22 22:39:41 +0000799 DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode);
David Blaikie1fd43652013-05-07 21:35:53 +0000800 DIArray ImportedEntities = CUNode.getImportedEntities();
801 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikie684fc532013-05-06 23:33:07 +0000802 ScopesWithImportedEntities.push_back(std::make_pair(
David Blaikie1fd43652013-05-07 21:35:53 +0000803 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
804 ImportedEntities.getElement(i)));
David Blaikie684fc532013-05-06 23:33:07 +0000805 std::sort(ScopesWithImportedEntities.begin(),
Benjamin Kramerb12cf012013-08-24 12:54:27 +0000806 ScopesWithImportedEntities.end(), less_first());
David Blaikiedc69ebb2013-03-11 23:39:23 +0000807 DIArray GVs = CUNode.getGlobalVariables();
808 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
David Blaikief9b6a552014-04-22 22:39:41 +0000809 CU.createGlobalVariableDIE(DIGlobalVariable(GVs.getElement(i)));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000810 DIArray SPs = CUNode.getSubprograms();
811 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
812 constructSubprogramDIE(CU, SPs.getElement(i));
813 DIArray EnumTypes = CUNode.getEnumTypes();
814 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
David Blaikief9b6a552014-04-22 22:39:41 +0000815 CU.getOrCreateTypeDIE(EnumTypes.getElement(i));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000816 DIArray RetainedTypes = CUNode.getRetainedTypes();
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000817 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i) {
818 DIType Ty(RetainedTypes.getElement(i));
819 // The retained types array by design contains pointers to
820 // MDNodes rather than DIRefs. Unique them here.
821 DIType UniqueTy(resolve(Ty.getRef()));
David Blaikief9b6a552014-04-22 22:39:41 +0000822 CU.getOrCreateTypeDIE(UniqueTy);
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000823 }
David Blaikief55abea2013-04-22 06:12:31 +0000824 // Emit imported_modules last so that the relevant context is already
825 // available.
David Blaikie1fd43652013-05-07 21:35:53 +0000826 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
827 constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000828 }
Eric Christopher6a841382012-11-19 22:42:10 +0000829
Chris Lattner7cfa70e2010-04-05 02:19:28 +0000830 // Tell MMI that we have debug info.
831 MMI->setDebugInfoAvailability(true);
Eric Christopher6a841382012-11-19 22:42:10 +0000832
Bill Wendling2b128d72009-05-20 23:19:06 +0000833 // Prime section data.
Richard Mitton21101b32013-09-19 23:21:01 +0000834 SectionMap[Asm->getObjFileLowering().getTextSection()];
Bill Wendling2b128d72009-05-20 23:19:06 +0000835}
836
Eric Christopher960ac372012-11-22 00:59:49 +0000837// Attach DW_AT_inline attribute with inlined subprogram DIEs.
838void DwarfDebug::computeInlinedDIEs() {
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000839 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
Benjamin Kramer15596c72014-03-07 19:09:39 +0000840 for (DIE *ISP : InlinedSubprogramDIEs)
David Blaikie65a74662014-04-25 18:26:14 +0000841 FirstCU->addUInt(*ISP, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
Benjamin Kramer15596c72014-03-07 19:09:39 +0000842
843 for (const auto &AI : AbstractSPDies) {
David Blaikie65a74662014-04-25 18:26:14 +0000844 DIE &ISP = *AI.second;
845 if (InlinedSubprogramDIEs.count(&ISP))
Rafael Espindolae7cc8bf2011-11-12 01:57:54 +0000846 continue;
David Blaikief2443192013-10-21 17:28:37 +0000847 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
Rafael Espindolae7cc8bf2011-11-12 01:57:54 +0000848 }
Eric Christopher960ac372012-11-22 00:59:49 +0000849}
850
851// Collect info for variables that were optimized out.
852void DwarfDebug::collectDeadVariables() {
853 const Module *M = MMI->getModule();
Eric Christopher960ac372012-11-22 00:59:49 +0000854
855 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
Benjamin Kramer15596c72014-03-07 19:09:39 +0000856 for (MDNode *N : CU_Nodes->operands()) {
857 DICompileUnit TheCU(N);
Eric Christopher960ac372012-11-22 00:59:49 +0000858 DIArray Subprograms = TheCU.getSubprograms();
859 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopher735401c2012-11-27 00:13:51 +0000860 DISubprogram SP(Subprograms.getElement(i));
Eric Christophera6c38a32013-10-15 23:31:38 +0000861 if (ProcessedSPNodes.count(SP) != 0)
862 continue;
863 if (!SP.isSubprogram())
864 continue;
865 if (!SP.isDefinition())
866 continue;
Eric Christopher735401c2012-11-27 00:13:51 +0000867 DIArray Variables = SP.getVariables();
Eric Christophera6c38a32013-10-15 23:31:38 +0000868 if (Variables.getNumElements() == 0)
869 continue;
Eric Christopher960ac372012-11-22 00:59:49 +0000870
Eric Christopher735401c2012-11-27 00:13:51 +0000871 // Construct subprogram DIE and add variables DIEs.
Eric Christopher4287a492013-12-09 23:57:44 +0000872 DwarfCompileUnit *SPCU =
873 static_cast<DwarfCompileUnit *>(CUMap.lookup(TheCU));
Eric Christopher735401c2012-11-27 00:13:51 +0000874 assert(SPCU && "Unable to find Compile Unit!");
Eric Christopherc798d8a2013-10-22 00:22:39 +0000875 // FIXME: See the comment in constructSubprogramDIE about duplicate
876 // subprogram DIEs.
David Blaikief9b6a552014-04-22 22:39:41 +0000877 constructSubprogramDIE(*SPCU, SP);
Eric Christopherc798d8a2013-10-22 00:22:39 +0000878 DIE *SPDIE = SPCU->getDIE(SP);
Eric Christopher735401c2012-11-27 00:13:51 +0000879 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
880 DIVariable DV(Variables.getElement(vi));
Eric Christophera6c38a32013-10-15 23:31:38 +0000881 if (!DV.isVariable())
882 continue;
Craig Topper353eda42014-04-24 06:44:33 +0000883 DbgVariable NewVar(DV, nullptr, this);
David Blaikie914046e2014-04-25 20:00:34 +0000884 SPDIE->addChild(SPCU->constructVariableDIE(NewVar, false));
Eric Christopher735401c2012-11-27 00:13:51 +0000885 }
Eric Christopher960ac372012-11-22 00:59:49 +0000886 }
887 }
888 }
Eric Christopher960ac372012-11-22 00:59:49 +0000889}
890
891void DwarfDebug::finalizeModuleInfo() {
892 // Collect info for variables that were optimized out.
893 collectDeadVariables();
894
895 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
896 computeInlinedDIEs();
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000897
Eric Christopherad10cb52013-12-04 23:24:38 +0000898 // Handle anything that needs to be done on a per-unit basis after
899 // all other generation.
David Blaikiec33b3cd2014-04-22 21:27:37 +0000900 for (const auto &TheU : getUnits()) {
Eric Christopher60eb7692013-08-12 20:27:48 +0000901 // Emit DW_AT_containing_type attribute to connect types with their
902 // vtable holding type.
David Blaikie2a80e442013-12-02 22:09:48 +0000903 TheU->constructContainingTypeDIEs();
Eric Christopher60eb7692013-08-12 20:27:48 +0000904
Eric Christopher46e23432013-12-20 04:16:18 +0000905 // Add CU specific attributes if we need to add any.
David Blaikieadcde362014-04-25 18:35:57 +0000906 if (TheU->getUnitDie().getTag() == dwarf::DW_TAG_compile_unit) {
Eric Christopher46e23432013-12-20 04:16:18 +0000907 // If we're splitting the dwarf out now that we've got the entire
Eric Christopherd8667202013-12-30 17:22:27 +0000908 // CU then add the dwo id to it.
909 DwarfCompileUnit *SkCU =
910 static_cast<DwarfCompileUnit *>(TheU->getSkeleton());
Eric Christopher46e23432013-12-20 04:16:18 +0000911 if (useSplitDwarf()) {
Eric Christopher09d1c0f2014-03-14 21:20:07 +0000912 // Emit a unique identifier for this CU.
David Blaikieadcde362014-04-25 18:35:57 +0000913 uint64_t ID = DIEHash(Asm).computeCUSignature(TheU->getUnitDie());
914 TheU->addUInt(TheU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher46e23432013-12-20 04:16:18 +0000915 dwarf::DW_FORM_data8, ID);
David Blaikieadcde362014-04-25 18:35:57 +0000916 SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher46e23432013-12-20 04:16:18 +0000917 dwarf::DW_FORM_data8, ID);
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000918
919 // We don't keep track of which addresses are used in which CU so this
920 // is a bit pessimistic under LTO.
David Blaikied75fb282014-04-23 21:20:10 +0000921 if (!AddrPool.isEmpty())
David Blaikieadcde362014-04-25 18:35:57 +0000922 addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000923 dwarf::DW_AT_GNU_addr_base, DwarfAddrSectionSym,
924 DwarfAddrSectionSym);
925 if (!TheU->getRangeLists().empty())
David Blaikieadcde362014-04-25 18:35:57 +0000926 addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000927 dwarf::DW_AT_GNU_ranges_base,
928 DwarfDebugRangeSectionSym, DwarfDebugRangeSectionSym);
Eric Christopherd29614f2013-08-13 01:21:55 +0000929 }
Eric Christopherd8667202013-12-30 17:22:27 +0000930
Eric Christopher384f3fe2014-03-20 19:16:16 +0000931 // If we have code split among multiple sections or non-contiguous
932 // ranges of code then emit a DW_AT_ranges attribute on the unit that will
933 // remain in the .o file, otherwise add a DW_AT_low_pc.
934 // FIXME: We should use ranges allow reordering of code ala
935 // .subsections_via_symbols in mach-o. This would mean turning on
936 // ranges for all subprogram DIEs for mach-o.
David Blaikiec33b3cd2014-04-22 21:27:37 +0000937 DwarfCompileUnit &U =
938 SkCU ? *SkCU : static_cast<DwarfCompileUnit &>(*TheU);
Eric Christopher384f3fe2014-03-20 19:16:16 +0000939 unsigned NumRanges = TheU->getRanges().size();
940 if (NumRanges) {
941 if (NumRanges > 1) {
David Blaikieadcde362014-04-25 18:35:57 +0000942 addSectionLabel(*Asm, U, U.getUnitDie(), dwarf::DW_AT_ranges,
David Blaikiec33b3cd2014-04-22 21:27:37 +0000943 Asm->GetTempSymbol("cu_ranges", U.getUniqueID()),
Eric Christopher384f3fe2014-03-20 19:16:16 +0000944 DwarfDebugRangeSectionSym);
Eric Christopher8873ada2014-01-29 22:22:56 +0000945
Eric Christopher384f3fe2014-03-20 19:16:16 +0000946 // A DW_AT_low_pc attribute may also be specified in combination with
947 // DW_AT_ranges to specify the default base address for use in
948 // location lists (see Section 2.6.2) and range lists (see Section
949 // 2.17.3).
David Blaikieadcde362014-04-25 18:35:57 +0000950 U.addUInt(U.getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
David Blaikiec33b3cd2014-04-22 21:27:37 +0000951 0);
Eric Christopher384f3fe2014-03-20 19:16:16 +0000952 } else {
953 RangeSpan &Range = TheU->getRanges().back();
David Blaikieadcde362014-04-25 18:35:57 +0000954 U.addLocalLabelAddress(U.getUnitDie(), dwarf::DW_AT_low_pc,
David Blaikiec33b3cd2014-04-22 21:27:37 +0000955 Range.getStart());
David Blaikieadcde362014-04-25 18:35:57 +0000956 U.addLabelDelta(U.getUnitDie(), dwarf::DW_AT_high_pc, Range.getEnd(),
David Blaikiec33b3cd2014-04-22 21:27:37 +0000957 Range.getStart());
Eric Christopher384f3fe2014-03-20 19:16:16 +0000958 }
959 }
Eric Christopher60eb7692013-08-12 20:27:48 +0000960 }
961 }
962
963 // Compute DIE offsets and sizes.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000964 InfoHolder.computeSizeAndOffsets();
965 if (useSplitDwarf())
966 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher960ac372012-11-22 00:59:49 +0000967}
968
969void DwarfDebug::endSections() {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000970 // Filter labels by section.
Benjamin Kramer15596c72014-03-07 19:09:39 +0000971 for (const SymbolCU &SCU : ArangeLabels) {
Richard Mitton21101b32013-09-19 23:21:01 +0000972 if (SCU.Sym->isInSection()) {
973 // Make a note of this symbol and it's section.
974 const MCSection *Section = &SCU.Sym->getSection();
975 if (!Section->getKind().isMetadata())
976 SectionMap[Section].push_back(SCU);
977 } else {
978 // Some symbols (e.g. common/bss on mach-o) can have no section but still
979 // appear in the output. This sucks as we rely on sections to build
980 // arange spans. We can do it without, but it's icky.
Craig Topper353eda42014-04-24 06:44:33 +0000981 SectionMap[nullptr].push_back(SCU);
Richard Mitton21101b32013-09-19 23:21:01 +0000982 }
983 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000984
Richard Mittonc2508242013-10-03 22:07:08 +0000985 // Build a list of sections used.
986 std::vector<const MCSection *> Sections;
Benjamin Kramer15596c72014-03-07 19:09:39 +0000987 for (const auto &it : SectionMap) {
988 const MCSection *Section = it.first;
Richard Mittonc2508242013-10-03 22:07:08 +0000989 Sections.push_back(Section);
990 }
991
992 // Sort the sections into order.
993 // This is only done to ensure consistent output order across different runs.
994 std::sort(Sections.begin(), Sections.end(), SectionSort);
995
996 // Add terminating symbols for each section.
Benjamin Kramer15596c72014-03-07 19:09:39 +0000997 for (unsigned ID = 0, E = Sections.size(); ID != E; ID++) {
Richard Mittonc2508242013-10-03 22:07:08 +0000998 const MCSection *Section = Sections[ID];
Craig Topper353eda42014-04-24 06:44:33 +0000999 MCSymbol *Sym = nullptr;
Richard Mitton21101b32013-09-19 23:21:01 +00001000
1001 if (Section) {
Richard Mittonc2508242013-10-03 22:07:08 +00001002 // We can't call MCSection::getLabelEndName, as it's only safe to do so
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001003 // if we know the section name up-front. For user-created sections, the
Eric Christopher95531b62014-01-29 22:06:21 +00001004 // resulting label may not be valid to use as a label. (section names can
1005 // use a greater set of characters on some systems)
Richard Mittonc2508242013-10-03 22:07:08 +00001006 Sym = Asm->GetTempSymbol("debug_end", ID);
Richard Mitton21101b32013-09-19 23:21:01 +00001007 Asm->OutStreamer.SwitchSection(Section);
1008 Asm->OutStreamer.EmitLabel(Sym);
1009 }
1010
1011 // Insert a final terminator.
Craig Topper353eda42014-04-24 06:44:33 +00001012 SectionMap[Section].push_back(SymbolCU(nullptr, Sym));
Bill Wendling2b128d72009-05-20 23:19:06 +00001013 }
Eric Christopher960ac372012-11-22 00:59:49 +00001014}
Bill Wendling2b128d72009-05-20 23:19:06 +00001015
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001016// Emit all Dwarf sections that should come after the content.
Eric Christopher960ac372012-11-22 00:59:49 +00001017void DwarfDebug::endModule() {
Craig Toppere73658d2014-04-28 04:05:08 +00001018 assert(CurFn == nullptr);
1019 assert(CurMI == nullptr);
Eric Christopher960ac372012-11-22 00:59:49 +00001020
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001021 if (!FirstCU)
1022 return;
Eric Christopher960ac372012-11-22 00:59:49 +00001023
1024 // End any existing sections.
1025 // TODO: Does this need to happen?
1026 endSections();
1027
1028 // Finalize the debug info for the module.
1029 finalizeModuleInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001030
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001031 emitDebugStr();
Eric Christopher9cd26af2013-09-20 23:22:52 +00001032
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001033 // Emit all the DIEs into a debug info section.
1034 emitDebugInfo();
Eric Christopher4c9b1192012-11-27 00:41:54 +00001035
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001036 // Corresponding abbreviations into a abbrev section.
1037 emitAbbreviations();
Eric Christopher95198f502012-11-27 22:43:42 +00001038
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001039 // Emit info into a debug aranges section.
Eric Christopher02dbadb2014-02-14 01:26:55 +00001040 if (GenerateARangeSection)
1041 emitDebugARanges();
Eric Christopher95198f502012-11-27 22:43:42 +00001042
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001043 // Emit info into a debug ranges section.
1044 emitDebugRanges();
Eric Christopher95198f502012-11-27 22:43:42 +00001045
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001046 if (useSplitDwarf()) {
1047 emitDebugStrDWO();
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001048 emitDebugInfoDWO();
Eric Christopher3c5a1912012-12-19 22:02:53 +00001049 emitDebugAbbrevDWO();
David Blaikie4a2f95f2014-03-18 01:17:26 +00001050 emitDebugLineDWO();
Eric Christopher962c9082013-01-15 23:56:56 +00001051 // Emit DWO addresses.
David Blaikied75fb282014-04-23 21:20:10 +00001052 AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection());
David Blaikie94c1d7f2014-04-02 01:50:20 +00001053 emitDebugLocDWO();
1054 } else
1055 // Emit info into a debug loc section.
1056 emitDebugLoc();
Bill Wendling2b128d72009-05-20 23:19:06 +00001057
Eric Christophera876b822012-08-23 07:32:06 +00001058 // Emit info into the dwarf accelerator table sections.
Eric Christopher20b76a72012-08-23 22:36:40 +00001059 if (useDwarfAccelTables()) {
Eric Christopher4996c702011-11-07 09:24:32 +00001060 emitAccelNames();
1061 emitAccelObjC();
1062 emitAccelNamespaces();
1063 emitAccelTypes();
1064 }
Eric Christopher6a841382012-11-19 22:42:10 +00001065
Eric Christopher4b358182013-08-30 00:40:17 +00001066 // Emit the pubnames and pubtypes sections if requested.
1067 if (HasDwarfPubSections) {
David Blaikie70a33202013-09-19 17:33:35 +00001068 emitDebugPubNames(GenerateGnuPubSections);
1069 emitDebugPubTypes(GenerateGnuPubSections);
Eric Christopher4b358182013-08-30 00:40:17 +00001070 }
Devang Patel04d2f2d2009-11-24 01:14:22 +00001071
Devang Pateld0701282010-08-02 17:32:15 +00001072 // clean up.
Devang Pateleb1bb4e2011-08-16 22:09:43 +00001073 SPMap.clear();
Eric Christopher8afd7b62012-12-10 19:51:18 +00001074
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001075 // Reset these for the next Module if we have one.
Craig Topper353eda42014-04-24 06:44:33 +00001076 FirstCU = nullptr;
Bill Wendling2b128d72009-05-20 23:19:06 +00001077}
1078
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001079// Find abstract variable, if any, associated with Var.
Devang Patelbb23a4a2011-08-10 21:50:54 +00001080DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattner915c5f92010-04-02 19:42:39 +00001081 DebugLoc ScopeLoc) {
Devang Patelbb23a4a2011-08-10 21:50:54 +00001082 LLVMContext &Ctx = DV->getContext();
1083 // More then one inlined variable corresponds to one abstract variable.
1084 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001085 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001086 if (AbsDbgVariable)
1087 return AbsDbgVariable;
1088
Devang Patel7e623022011-08-10 20:55:27 +00001089 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001090 if (!Scope)
Craig Topper353eda42014-04-24 06:44:33 +00001091 return nullptr;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001092
Craig Topper353eda42014-04-24 06:44:33 +00001093 AbsDbgVariable = new DbgVariable(Var, nullptr, this);
David Blaikieafd2c6b2014-04-22 05:41:06 +00001094 addScopeVariable(Scope, AbsDbgVariable);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001095 AbstractVariables[Var] = AbsDbgVariable;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001096 return AbsDbgVariable;
1097}
1098
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001099// If Var is a current function argument then add it to CurrentFnArguments list.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001100bool DwarfDebug::addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope) {
Devang Patel7e623022011-08-10 20:55:27 +00001101 if (!LScopes.isCurrentFunctionScope(Scope))
David Blaikieafd2c6b2014-04-22 05:41:06 +00001102 return false;
1103 DIVariable DV = Var->getVariable();
Devang Patel6c622ef2011-03-01 22:58:55 +00001104 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
David Blaikieafd2c6b2014-04-22 05:41:06 +00001105 return false;
Devang Patel6c622ef2011-03-01 22:58:55 +00001106 unsigned ArgNo = DV.getArgNumber();
Eric Christopher6a841382012-11-19 22:42:10 +00001107 if (ArgNo == 0)
David Blaikieafd2c6b2014-04-22 05:41:06 +00001108 return false;
Devang Patel6c622ef2011-03-01 22:58:55 +00001109
David Blaikieafd2c6b2014-04-22 05:41:06 +00001110 size_t Size = CurrentFnArguments.size();
1111 if (Size == 0)
1112 CurrentFnArguments.resize(CurFn->getFunction()->arg_size());
1113 // llvm::Function argument size is not good indicator of how many
1114 // arguments does the function have at source level.
1115 if (ArgNo > Size)
1116 CurrentFnArguments.resize(ArgNo * 2);
1117 CurrentFnArguments[ArgNo - 1] = Var;
1118 return true;
Devang Patel6c622ef2011-03-01 22:58:55 +00001119}
1120
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001121// Collect variable information from side table maintained by MMI.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001122void DwarfDebug::collectVariableInfoFromMMITable(
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001123 SmallPtrSet<const MDNode *, 16> &Processed) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00001124 for (const auto &VI : MMI->getVariableDbgInfo()) {
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001125 if (!VI.Var)
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001126 continue;
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001127 Processed.insert(VI.Var);
1128 DIVariable DV(VI.Var);
1129 LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001130
Devang Patelcdb7d442009-11-10 23:20:04 +00001131 // If variable scope is not found then skip this variable.
Craig Topper353eda42014-04-24 06:44:33 +00001132 if (!Scope)
Devang Patelcdb7d442009-11-10 23:20:04 +00001133 continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001134
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001135 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VI.Loc);
David Blaikieafd2c6b2014-04-22 05:41:06 +00001136 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable, this);
1137 RegVar->setFrameIndex(VI.Slot);
1138 if (!addCurrentFnArgument(RegVar, Scope))
1139 addScopeVariable(Scope, RegVar);
Devang Patel99819b52011-08-15 19:01:20 +00001140 if (AbsDbgVariable)
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001141 AbsDbgVariable->setFrameIndex(VI.Slot);
Devang Patel475d32a2009-10-06 01:26:37 +00001142 }
Devang Patel490c8ab2010-05-20 19:57:06 +00001143}
Devang Patela3e9c9c2010-03-15 18:33:46 +00001144
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001145// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1146// defined reg.
Devang Patel9fc11702010-05-25 23:40:22 +00001147static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001148 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001149 return MI->getNumOperands() == 3 && MI->getOperand(0).isReg() &&
1150 MI->getOperand(0).getReg() &&
Adrian Prantl418d1d12013-07-09 20:28:37 +00001151 (MI->getOperand(1).isImm() ||
1152 (MI->getOperand(1).isReg() && MI->getOperand(1).getReg() == 0U));
Devang Patel9fc11702010-05-25 23:40:22 +00001153}
1154
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001155// Get .debug_loc entry for the instruction range starting at MI.
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001156static DebugLocEntry::Value getDebugLocValue(const MachineInstr *MI) {
Adrian Prantl7f487772014-04-10 17:39:48 +00001157 const MDNode *Var = MI->getDebugVariable();
Devang Patel2442a892011-07-08 17:09:57 +00001158
David Blaikie0252265b2013-06-16 20:34:15 +00001159 assert(MI->getNumOperands() == 3);
Adrian Prantl418d1d12013-07-09 20:28:37 +00001160 if (MI->getOperand(0).isReg()) {
Devang Patel2442a892011-07-08 17:09:57 +00001161 MachineLocation MLoc;
Adrian Prantl418d1d12013-07-09 20:28:37 +00001162 // If the second operand is an immediate, this is a
1163 // register-indirect address.
1164 if (!MI->getOperand(1).isImm())
Adrian Prantld4c0dd42013-04-26 21:57:17 +00001165 MLoc.set(MI->getOperand(0).getReg());
1166 else
1167 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001168 return DebugLocEntry::Value(Var, MLoc);
Devang Patel2442a892011-07-08 17:09:57 +00001169 }
1170 if (MI->getOperand(0).isImm())
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001171 return DebugLocEntry::Value(Var, MI->getOperand(0).getImm());
Devang Patel2442a892011-07-08 17:09:57 +00001172 if (MI->getOperand(0).isFPImm())
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001173 return DebugLocEntry::Value(Var, MI->getOperand(0).getFPImm());
Devang Patel2442a892011-07-08 17:09:57 +00001174 if (MI->getOperand(0).isCImm())
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001175 return DebugLocEntry::Value(Var, MI->getOperand(0).getCImm());
Devang Patel2442a892011-07-08 17:09:57 +00001176
Craig Topperee4dab52012-02-05 08:31:47 +00001177 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel2442a892011-07-08 17:09:57 +00001178}
1179
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001180// Find variables for each lexical scope.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001181void
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001182DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &Processed) {
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001183 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1184 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001185
Eric Christopher270a12c2013-07-03 21:37:03 +00001186 // Grab the variable info that was squirreled away in the MMI side-table.
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001187 collectVariableInfoFromMMITable(Processed);
Devang Patel490c8ab2010-05-20 19:57:06 +00001188
Benjamin Kramer15596c72014-03-07 19:09:39 +00001189 for (const MDNode *Var : UserVariables) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001190 if (Processed.count(Var))
Devang Patel490c8ab2010-05-20 19:57:06 +00001191 continue;
1192
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001193 // History contains relevant DBG_VALUE instructions for Var and instructions
1194 // clobbering it.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001195 SmallVectorImpl<const MachineInstr *> &History = DbgValues[Var];
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001196 if (History.empty())
1197 continue;
1198 const MachineInstr *MInsn = History.front();
Devang Patel9fc11702010-05-25 23:40:22 +00001199
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001200 DIVariable DV(Var);
Craig Topper353eda42014-04-24 06:44:33 +00001201 LexicalScope *Scope = nullptr;
Devang Patel7a9dedf2010-05-27 20:25:04 +00001202 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001203 DISubprogram(DV.getContext()).describes(CurFn->getFunction()))
Devang Patel7e623022011-08-10 20:55:27 +00001204 Scope = LScopes.getCurrentFunctionScope();
David Blaikiedc69ebb2013-03-11 23:39:23 +00001205 else if (MDNode *IA = DV.getInlinedAt())
1206 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1207 else
1208 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patel490c8ab2010-05-20 19:57:06 +00001209 // If variable scope is not found then skip this variable.
Devang Patelfbd6c452010-05-21 00:10:20 +00001210 if (!Scope)
Devang Patel490c8ab2010-05-20 19:57:06 +00001211 continue;
1212
1213 Processed.insert(DV);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001214 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel99819b52011-08-15 19:01:20 +00001215 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
David Blaikieafd2c6b2014-04-22 05:41:06 +00001216 DbgVariable *RegVar = new DbgVariable(DV, AbsVar, this);
1217 if (!addCurrentFnArgument(RegVar, Scope))
1218 addScopeVariable(Scope, RegVar);
Devang Patel99819b52011-08-15 19:01:20 +00001219 if (AbsVar)
Devang Patel3e4a9652011-08-15 21:24:36 +00001220 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001221
Eric Christophercc10d202012-10-08 20:48:54 +00001222 // Simplify ranges that are fully coalesced.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001223 if (History.size() <= 1 ||
1224 (History.size() == 2 && MInsn->isIdenticalTo(History.back()))) {
David Blaikieafd2c6b2014-04-22 05:41:06 +00001225 RegVar->setMInsn(MInsn);
Devang Patel9fc11702010-05-25 23:40:22 +00001226 continue;
1227 }
1228
Eric Christopher59cc0712013-01-28 17:33:26 +00001229 // Handle multiple DBG_VALUE instructions describing one variable.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001230 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001231
David Blaikie0a456de2014-04-02 01:43:18 +00001232 DotDebugLocEntries.resize(DotDebugLocEntries.size() + 1);
1233 DebugLocList &LocList = DotDebugLocEntries.back();
1234 LocList.Label =
1235 Asm->GetTempSymbol("debug_loc", DotDebugLocEntries.size() - 1);
1236 SmallVector<DebugLocEntry, 4> &DebugLoc = LocList.List;
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001237 for (SmallVectorImpl<const MachineInstr *>::const_iterator
1238 HI = History.begin(),
1239 HE = History.end();
1240 HI != HE; ++HI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001241 const MachineInstr *Begin = *HI;
1242 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesen9c057ee2011-03-22 00:21:41 +00001243
Devang Patele7181b52011-06-01 23:00:17 +00001244 // Check if DBG_VALUE is truncating a range.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001245 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg() &&
1246 !Begin->getOperand(0).getReg())
Devang Patele7181b52011-06-01 23:00:17 +00001247 continue;
1248
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001249 // Compute the range for a register location.
1250 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
Craig Topper353eda42014-04-24 06:44:33 +00001251 const MCSymbol *SLabel = nullptr;
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001252
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001253 if (HI + 1 == HE)
1254 // If Begin is the last instruction in History then its value is valid
Chris Lattner0ab5e2c2011-04-15 05:18:47 +00001255 // until the end of the function.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001256 SLabel = FunctionEndSym;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001257 else {
1258 const MachineInstr *End = HI[1];
Eric Christopher6a841382012-11-19 22:42:10 +00001259 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001260 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001261 if (End->isDebugValue())
1262 SLabel = getLabelBeforeInsn(End);
1263 else {
1264 // End is a normal instruction clobbering the range.
1265 SLabel = getLabelAfterInsn(End);
1266 assert(SLabel && "Forgot label after clobber instruction");
1267 ++HI;
1268 }
1269 }
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001270
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001271 // The value is valid until the next DBG_VALUE or clobber.
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001272 DebugLocEntry Loc(FLabel, SLabel, getDebugLocValue(Begin), TheCU);
David Blaikie84d8e182014-03-24 22:38:38 +00001273 if (DebugLoc.empty() || !DebugLoc.back().Merge(Loc))
1274 DebugLoc.push_back(std::move(Loc));
Devang Patel9fc11702010-05-25 23:40:22 +00001275 }
Devang Patela3e9c9c2010-03-15 18:33:46 +00001276 }
Devang Patele0a94bf2010-05-14 21:01:35 +00001277
1278 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001279 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1280 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1281 DIVariable DV(Variables.getElement(i));
Manman Ren7504ed42013-07-08 18:33:29 +00001282 if (!DV || !DV.isVariable() || !Processed.insert(DV))
Devang Patel59e27c52011-08-19 23:28:12 +00001283 continue;
1284 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
Craig Topper353eda42014-04-24 06:44:33 +00001285 addScopeVariable(Scope, new DbgVariable(DV, nullptr, this));
Devang Patele0a94bf2010-05-14 21:01:35 +00001286 }
Devang Patel9fc11702010-05-25 23:40:22 +00001287}
Devang Patele0a94bf2010-05-14 21:01:35 +00001288
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001289// Return Label preceding the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001290MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001291 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1292 assert(Label && "Didn't insert label before instruction");
1293 return Label;
Devang Patel9fc11702010-05-25 23:40:22 +00001294}
1295
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001296// Return Label immediately following the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001297MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001298 return LabelsAfterInsn.lookup(MI);
Devang Patel475d32a2009-10-06 01:26:37 +00001299}
1300
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001301// Process beginning of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001302void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Craig Toppere73658d2014-04-28 04:05:08 +00001303 assert(CurMI == nullptr);
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001304 CurMI = MI;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001305 // Check if source location changes, but ignore DBG_VALUE locations.
1306 if (!MI->isDebugValue()) {
1307 DebugLoc DL = MI->getDebugLoc();
1308 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopheraec8a822012-04-05 20:39:05 +00001309 unsigned Flags = 0;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001310 PrevInstLoc = DL;
Devang Patel34a66202011-05-11 19:22:19 +00001311 if (DL == PrologEndLoc) {
1312 Flags |= DWARF2_FLAG_PROLOGUE_END;
1313 PrologEndLoc = DebugLoc();
1314 }
Eric Christopheraec8a822012-04-05 20:39:05 +00001315 if (PrologEndLoc.isUnknown())
1316 Flags |= DWARF2_FLAG_IS_STMT;
1317
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001318 if (!DL.isUnknown()) {
1319 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel34a66202011-05-11 19:22:19 +00001320 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001321 } else
Craig Topper353eda42014-04-24 06:44:33 +00001322 recordSourceLine(0, 0, nullptr, 0);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001323 }
Devang Patel9fc11702010-05-25 23:40:22 +00001324 }
Devang Patel23b2ae62010-03-29 22:59:58 +00001325
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001326 // Insert labels where requested.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001327 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
1328 LabelsBeforeInsn.find(MI);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001329
1330 // No label needed.
1331 if (I == LabelsBeforeInsn.end())
1332 return;
1333
1334 // Label already assigned.
1335 if (I->second)
Devang Patel002d54d2010-05-26 19:37:24 +00001336 return;
Devang Patelbd477be2010-03-29 17:20:31 +00001337
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001338 if (!PrevLabel) {
Devang Patelacc32a52010-05-26 21:23:46 +00001339 PrevLabel = MMI->getContext().CreateTempSymbol();
1340 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel002d54d2010-05-26 19:37:24 +00001341 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001342 I->second = PrevLabel;
Devang Patel8db360d2009-10-06 01:50:42 +00001343}
1344
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001345// Process end of an instruction.
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001346void DwarfDebug::endInstruction() {
Craig Toppere73658d2014-04-28 04:05:08 +00001347 assert(CurMI != nullptr);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001348 // Don't create a new label after DBG_VALUE instructions.
1349 // They don't generate code.
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001350 if (!CurMI->isDebugValue())
Craig Topper353eda42014-04-24 06:44:33 +00001351 PrevLabel = nullptr;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001352
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001353 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001354 LabelsAfterInsn.find(CurMI);
Craig Topper353eda42014-04-24 06:44:33 +00001355 CurMI = nullptr;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001356
1357 // No label needed.
1358 if (I == LabelsAfterInsn.end())
1359 return;
1360
1361 // Label already assigned.
1362 if (I->second)
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001363 return;
1364
1365 // We need a label after this instruction.
1366 if (!PrevLabel) {
1367 PrevLabel = MMI->getContext().CreateTempSymbol();
1368 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel3ebd8932010-04-08 16:50:29 +00001369 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001370 I->second = PrevLabel;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001371}
1372
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001373// Each LexicalScope has first instruction and last instruction to mark
1374// beginning and end of a scope respectively. Create an inverse map that list
1375// scopes starts (and ends) with an instruction. One instruction may start (or
1376// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patel359b0132010-04-08 18:43:56 +00001377void DwarfDebug::identifyScopeMarkers() {
Devang Patel7e623022011-08-10 20:55:27 +00001378 SmallVector<LexicalScope *, 4> WorkList;
1379 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel7771b7c2010-01-20 02:05:23 +00001380 while (!WorkList.empty()) {
Devang Patel7e623022011-08-10 20:55:27 +00001381 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001382
Craig Topper977e9cd2013-07-03 04:24:43 +00001383 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001384 if (!Children.empty())
Benjamin Kramer15596c72014-03-07 19:09:39 +00001385 WorkList.append(Children.begin(), Children.end());
Devang Patel7771b7c2010-01-20 02:05:23 +00001386
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001387 if (S->isAbstractScope())
1388 continue;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001389
Benjamin Kramer15596c72014-03-07 19:09:39 +00001390 for (const InsnRange &R : S->getRanges()) {
1391 assert(R.first && "InsnRange does not have first instruction!");
1392 assert(R.second && "InsnRange does not have second instruction!");
1393 requestLabelBeforeInsn(R.first);
1394 requestLabelAfterInsn(R.second);
Devang Patel6c74a872010-04-27 19:46:33 +00001395 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001396 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001397}
1398
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001399// Gather pre-function debug information. Assumes being called immediately
1400// after the function entry point has been emitted.
Chris Lattner76555b52010-01-26 23:18:02 +00001401void DwarfDebug::beginFunction(const MachineFunction *MF) {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001402 CurFn = MF;
Eric Christopherfedfa442013-11-01 23:14:17 +00001403
1404 // If there's no debug info for the function we're not going to do anything.
1405 if (!MMI->hasDebugInfo())
1406 return;
1407
1408 // Grab the lexical scopes for the function, if we don't have any of those
1409 // then we're not going to be able to do anything.
Devang Patel7e623022011-08-10 20:55:27 +00001410 LScopes.initialize(*MF);
Eric Christopher384f3fe2014-03-20 19:16:16 +00001411 if (LScopes.empty())
Eric Christopherfedfa442013-11-01 23:14:17 +00001412 return;
1413
1414 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1415
1416 // Make sure that each lexical scope will have a begin/end label.
Devang Patel7e623022011-08-10 20:55:27 +00001417 identifyScopeMarkers();
Devang Patel4598eb62009-10-06 18:37:31 +00001418
Eric Christopher4287a492013-12-09 23:57:44 +00001419 // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function
Eric Christopherfedfa442013-11-01 23:14:17 +00001420 // belongs to so that we add to the correct per-cu line table in the
1421 // non-asm case.
Manman Ren4e042a62013-02-05 21:52:47 +00001422 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Eric Christopher4287a492013-12-09 23:57:44 +00001423 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Manman Ren4e042a62013-02-05 21:52:47 +00001424 assert(TheCU && "Unable to find compile unit!");
Rafael Espindolab4eec1d2014-02-05 18:00:21 +00001425 if (Asm->OutStreamer.hasRawTextSupport())
1426 // Use a single line table if we are generating assembly.
Manman Ren9d4c7352013-05-21 00:57:22 +00001427 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1428 else
1429 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
Manman Ren4e042a62013-02-05 21:52:47 +00001430
Eric Christopherfedfa442013-11-01 23:14:17 +00001431 // Emit a label for the function so that we have a beginning address.
1432 FunctionBeginSym = Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber());
Bill Wendling2b128d72009-05-20 23:19:06 +00001433 // Assumes in correct section after the entry point.
Devang Patel6c74a872010-04-27 19:46:33 +00001434 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendling2b128d72009-05-20 23:19:06 +00001435
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001436 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001437 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Eric Christopherfedfa442013-11-01 23:14:17 +00001438 std::vector<const MDNode *> LiveUserVar(TRI->getNumRegs());
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001439
Eric Christopherfedfa442013-11-01 23:14:17 +00001440 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); I != E;
1441 ++I) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001442 bool AtBlockEntry = true;
Devang Patel002d54d2010-05-26 19:37:24 +00001443 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1444 II != IE; ++II) {
1445 const MachineInstr *MI = II;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001446
Devang Patel002d54d2010-05-26 19:37:24 +00001447 if (MI->isDebugValue()) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001448 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001449
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001450 // Keep track of user variables.
Adrian Prantl7f487772014-04-10 17:39:48 +00001451 const MDNode *Var = MI->getDebugVariable();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001452
1453 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001454 if (isDbgValueInDefinedReg(MI))
1455 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1456
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001457 // Check the history of this variable.
Eric Christopherfedfa442013-11-01 23:14:17 +00001458 SmallVectorImpl<const MachineInstr *> &History = DbgValues[Var];
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001459 if (History.empty()) {
1460 UserVariables.push_back(Var);
1461 // The first mention of a function argument gets the FunctionBeginSym
1462 // label, so arguments are visible when breaking at function entry.
1463 DIVariable DV(Var);
Manman Ren7504ed42013-07-08 18:33:29 +00001464 if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
David Blaikie5af2aca2013-11-18 23:57:26 +00001465 getDISubprogram(DV.getContext()).describes(MF->getFunction()))
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001466 LabelsBeforeInsn[MI] = FunctionBeginSym;
1467 } else {
1468 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1469 const MachineInstr *Prev = History.back();
1470 if (Prev->isDebugValue()) {
1471 // Coalesce identical entries at the end of History.
1472 if (History.size() >= 2 &&
Devang Patelb7a328e2011-07-07 00:14:27 +00001473 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher85a495e2012-10-08 20:48:49 +00001474 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopherfedfa442013-11-01 23:14:17 +00001475 << "\t" << *Prev << "\t"
1476 << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001477 History.pop_back();
Devang Patelb7a328e2011-07-07 00:14:27 +00001478 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001479
1480 // Terminate old register assignments that don't reach MI;
1481 MachineFunction::const_iterator PrevMBB = Prev->getParent();
Benjamin Kramerb6d0bd42014-03-02 12:27:27 +00001482 if (PrevMBB != I && (!AtBlockEntry || std::next(PrevMBB) != I) &&
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001483 isDbgValueInDefinedReg(Prev)) {
1484 // Previous register assignment needs to terminate at the end of
1485 // its basic block.
1486 MachineBasicBlock::const_iterator LastMI =
Eric Christopherfedfa442013-11-01 23:14:17 +00001487 PrevMBB->getLastNonDebugInstr();
Devang Patelb7a328e2011-07-07 00:14:27 +00001488 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001489 // Drop DBG_VALUE for empty range.
Eric Christopher85a495e2012-10-08 20:48:49 +00001490 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Eric Christopherfedfa442013-11-01 23:14:17 +00001491 << "\t" << *Prev << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001492 History.pop_back();
Benjamin Kramerb6d0bd42014-03-02 12:27:27 +00001493 } else if (std::next(PrevMBB) != PrevMBB->getParent()->end())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001494 // Terminate after LastMI.
1495 History.push_back(LastMI);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001496 }
1497 }
1498 }
1499 History.push_back(MI);
Devang Patel002d54d2010-05-26 19:37:24 +00001500 } else {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001501 // Not a DBG_VALUE instruction.
Rafael Espindolab1f25f12014-03-07 06:08:31 +00001502 if (!MI->isPosition())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001503 AtBlockEntry = false;
1504
Eric Christopher133195782012-10-04 20:46:14 +00001505 // First known non-DBG_VALUE and non-frame setup location marks
1506 // the beginning of the function body.
1507 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1508 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel34a66202011-05-11 19:22:19 +00001509 PrologEndLoc = MI->getDebugLoc();
1510
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001511 // Check if the instruction clobbers any registers with debug vars.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001512 for (const MachineOperand &MO : MI->operands()) {
1513 if (!MO.isReg() || !MO.isDef() || !MO.getReg())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001514 continue;
Benjamin Kramer15596c72014-03-07 19:09:39 +00001515 for (MCRegAliasIterator AI(MO.getReg(), TRI, true); AI.isValid();
Eric Christopherfedfa442013-11-01 23:14:17 +00001516 ++AI) {
Jakob Stoklund Olesen54038d72012-06-01 23:28:30 +00001517 unsigned Reg = *AI;
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001518 const MDNode *Var = LiveUserVar[Reg];
1519 if (!Var)
1520 continue;
1521 // Reg is now clobbered.
Craig Topper353eda42014-04-24 06:44:33 +00001522 LiveUserVar[Reg] = nullptr;
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001523
1524 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001525 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1526 if (HistI == DbgValues.end())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001527 continue;
Eric Christopherfedfa442013-11-01 23:14:17 +00001528 SmallVectorImpl<const MachineInstr *> &History = HistI->second;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001529 if (History.empty())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001530 continue;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001531 const MachineInstr *Prev = History.back();
1532 // Sanity-check: Register assignments are terminated at the end of
1533 // their block.
1534 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1535 continue;
1536 // Is the variable still in Reg?
1537 if (!isDbgValueInDefinedReg(Prev) ||
1538 Prev->getOperand(0).getReg() != Reg)
1539 continue;
1540 // Var is clobbered. Make sure the next instruction gets a label.
1541 History.push_back(MI);
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001542 }
1543 }
Devang Patel002d54d2010-05-26 19:37:24 +00001544 }
Devang Patel002d54d2010-05-26 19:37:24 +00001545 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001546 }
1547
Benjamin Kramer15596c72014-03-07 19:09:39 +00001548 for (auto &I : DbgValues) {
1549 SmallVectorImpl<const MachineInstr *> &History = I.second;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001550 if (History.empty())
1551 continue;
1552
1553 // Make sure the final register assignments are terminated.
1554 const MachineInstr *Prev = History.back();
1555 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1556 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher6a841382012-11-19 22:42:10 +00001557 MachineBasicBlock::const_iterator LastMI =
Eric Christopherfedfa442013-11-01 23:14:17 +00001558 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001559 if (LastMI == PrevMBB->end())
1560 // Drop DBG_VALUE for empty range.
1561 History.pop_back();
David Blaikieea2605d2013-06-20 00:25:24 +00001562 else if (PrevMBB != &PrevMBB->getParent()->back()) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001563 // Terminate after LastMI.
1564 History.push_back(LastMI);
1565 }
1566 }
1567 // Request labels for the full history.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001568 for (const MachineInstr *MI : History) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001569 if (MI->isDebugValue())
1570 requestLabelBeforeInsn(MI);
1571 else
1572 requestLabelAfterInsn(MI);
1573 }
1574 }
Devang Patel002d54d2010-05-26 19:37:24 +00001575
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001576 PrevInstLoc = DebugLoc();
Devang Patel002d54d2010-05-26 19:37:24 +00001577 PrevLabel = FunctionBeginSym;
Devang Patel34a66202011-05-11 19:22:19 +00001578
1579 // Record beginning of function.
1580 if (!PrologEndLoc.isUnknown()) {
Eric Christopherfedfa442013-11-01 23:14:17 +00001581 DebugLoc FnStartDL =
Timur Iskhodzhanovf166f6c2014-01-30 01:39:17 +00001582 PrologEndLoc.getFnDebugLoc(MF->getFunction()->getContext());
Eric Christopherfedfa442013-11-01 23:14:17 +00001583 recordSourceLine(
1584 FnStartDL.getLine(), FnStartDL.getCol(),
1585 FnStartDL.getScope(MF->getFunction()->getContext()),
1586 // We'd like to list the prologue as "not statements" but GDB behaves
1587 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
1588 DWARF2_FLAG_IS_STMT);
Devang Patel34a66202011-05-11 19:22:19 +00001589 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001590}
1591
David Blaikieafd2c6b2014-04-22 05:41:06 +00001592void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1593 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1594 DIVariable DV = Var->getVariable();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001595 // Variables with positive arg numbers are parameters.
1596 if (unsigned ArgNum = DV.getArgNumber()) {
1597 // Keep all parameters in order at the start of the variable list to ensure
1598 // function types are correct (no out-of-order parameters)
1599 //
1600 // This could be improved by only doing it for optimized builds (unoptimized
1601 // builds have the right order to begin with), searching from the back (this
1602 // would catch the unoptimized case quickly), or doing a binary search
1603 // rather than linear search.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001604 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001605 while (I != Vars.end()) {
David Blaikieafd2c6b2014-04-22 05:41:06 +00001606 unsigned CurNum = (*I)->getVariable().getArgNumber();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001607 // A local (non-parameter) variable has been found, insert immediately
1608 // before it.
1609 if (CurNum == 0)
1610 break;
1611 // A later indexed parameter has been found, insert immediately before it.
David Blaikieb272a752013-06-06 22:28:26 +00001612 if (CurNum > ArgNum)
David Blaikie36d5d2f2013-06-06 21:04:51 +00001613 break;
David Blaikieb272a752013-06-06 22:28:26 +00001614 ++I;
David Blaikie6f1a8062013-06-05 05:39:59 +00001615 }
David Blaikieafd2c6b2014-04-22 05:41:06 +00001616 Vars.insert(I, Var);
1617 return;
David Blaikie6f1a8062013-06-05 05:39:59 +00001618 }
1619
David Blaikieafd2c6b2014-04-22 05:41:06 +00001620 Vars.push_back(Var);
Devang Patel7e623022011-08-10 20:55:27 +00001621}
1622
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001623// Gather and emit post-function debug information.
NAKAMURA Takumib9271612013-12-03 13:15:54 +00001624void DwarfDebug::endFunction(const MachineFunction *MF) {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001625 // Every beginFunction(MF) call should be followed by an endFunction(MF) call,
1626 // though the beginFunction may not be called at all.
1627 // We should handle both cases.
Craig Topper353eda42014-04-24 06:44:33 +00001628 if (!CurFn)
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001629 CurFn = MF;
1630 else
1631 assert(CurFn == MF);
Craig Toppere73658d2014-04-28 04:05:08 +00001632 assert(CurFn != nullptr);
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001633
1634 if (!MMI->hasDebugInfo() || LScopes.empty()) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00001635 // If we don't have a lexical scope for this function then there will
1636 // be a hole in the range information. Keep note of this by setting the
1637 // previously used section to nullptr.
1638 PrevSection = nullptr;
1639 PrevCU = nullptr;
Craig Topper353eda42014-04-24 06:44:33 +00001640 CurFn = nullptr;
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001641 return;
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001642 }
Devang Patel2904aa92009-11-12 19:02:56 +00001643
Devang Patel7e623022011-08-10 20:55:27 +00001644 // Define end label for subprogram.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001645 FunctionEndSym = Asm->GetTempSymbol("func_end", Asm->getFunctionNumber());
Devang Patel7e623022011-08-10 20:55:27 +00001646 // Assumes in correct section after the entry point.
1647 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Eric Christopher1a972152014-01-29 23:05:43 +00001648
Eric Christopher4287a492013-12-09 23:57:44 +00001649 // Set DwarfDwarfCompileUnitID in MCContext to default value.
Manman Ren4e042a62013-02-05 21:52:47 +00001650 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher6a841382012-11-19 22:42:10 +00001651
Devang Patel7e623022011-08-10 20:55:27 +00001652 SmallPtrSet<const MDNode *, 16> ProcessedVars;
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001653 collectVariableInfo(ProcessedVars);
Eric Christopher6a841382012-11-19 22:42:10 +00001654
Devang Patel3acc70e2011-08-15 22:04:40 +00001655 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
David Blaikief9b6a552014-04-22 22:39:41 +00001656 DwarfCompileUnit &TheCU = *SPMap.lookup(FnScope->getScopeNode());
Devang Patel3acc70e2011-08-15 22:04:40 +00001657
Devang Patel7e623022011-08-10 20:55:27 +00001658 // Construct abstract scopes.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001659 for (LexicalScope *AScope : LScopes.getAbstractScopesList()) {
Devang Patel44403472011-08-12 18:10:19 +00001660 DISubprogram SP(AScope->getScopeNode());
Manman Ren7504ed42013-07-08 18:33:29 +00001661 if (SP.isSubprogram()) {
Devang Patel7e623022011-08-10 20:55:27 +00001662 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001663 DIArray Variables = SP.getVariables();
1664 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1665 DIVariable DV(Variables.getElement(i));
Manman Ren7504ed42013-07-08 18:33:29 +00001666 if (!DV || !DV.isVariable() || !ProcessedVars.insert(DV))
Devang Patel59e27c52011-08-19 23:28:12 +00001667 continue;
Alexey Samsonov39602782012-07-06 08:45:08 +00001668 // Check that DbgVariable for DV wasn't created earlier, when
1669 // findAbstractVariable() was called for inlined instance of DV.
1670 LLVMContext &Ctx = DV->getContext();
1671 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1672 if (AbstractVariables.lookup(CleanDV))
1673 continue;
Devang Patel59e27c52011-08-19 23:28:12 +00001674 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
Craig Topper353eda42014-04-24 06:44:33 +00001675 addScopeVariable(Scope, new DbgVariable(DV, nullptr, this));
Devang Patel5c0f85c2010-06-25 22:07:34 +00001676 }
1677 }
Devang Patel44403472011-08-12 18:10:19 +00001678 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
David Blaikied8f0ac72014-04-28 20:27:02 +00001679 constructSubprogramScopeDIE(TheCU, AScope);
Bill Wendling2b128d72009-05-20 23:19:06 +00001680 }
Eric Christopher6a841382012-11-19 22:42:10 +00001681
David Blaikied8f0ac72014-04-28 20:27:02 +00001682 DIE &CurFnDIE = *constructSubprogramScopeDIE(TheCU, FnScope);
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001683 if (!CurFn->getTarget().Options.DisableFramePointerElim(*CurFn))
David Blaikief9b6a552014-04-22 22:39:41 +00001684 TheCU.addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Patel3acc70e2011-08-15 22:04:40 +00001685
Eric Christopher1a972152014-01-29 23:05:43 +00001686 // Add the range of this function to the list of ranges for the CU.
1687 RangeSpan Span(FunctionBeginSym, FunctionEndSym);
David Blaikief9b6a552014-04-22 22:39:41 +00001688 TheCU.addRange(std::move(Span));
Eric Christopher384f3fe2014-03-20 19:16:16 +00001689 PrevSection = Asm->getCurrentSection();
David Blaikief9b6a552014-04-22 22:39:41 +00001690 PrevCU = &TheCU;
Eric Christopher1a972152014-01-29 23:05:43 +00001691
Bill Wendling2b128d72009-05-20 23:19:06 +00001692 // Clear debug info
David Blaikieafd2c6b2014-04-22 05:41:06 +00001693 for (auto &I : ScopeVariables)
1694 DeleteContainerPointers(I.second);
Devang Patel7e623022011-08-10 20:55:27 +00001695 ScopeVariables.clear();
David Blaikieafd2c6b2014-04-22 05:41:06 +00001696 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001697 UserVariables.clear();
1698 DbgValues.clear();
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00001699 AbstractVariables.clear();
Devang Patel6c74a872010-04-27 19:46:33 +00001700 LabelsBeforeInsn.clear();
1701 LabelsAfterInsn.clear();
Craig Topper353eda42014-04-24 06:44:33 +00001702 PrevLabel = nullptr;
1703 CurFn = nullptr;
Bill Wendling2b128d72009-05-20 23:19:06 +00001704}
1705
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001706// Register a source line with debug info. Returns the unique label that was
1707// emitted and which provides correspondence to the source line list.
Devang Patel34a66202011-05-11 19:22:19 +00001708void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1709 unsigned Flags) {
Devang Patel2d9caf92009-11-25 17:36:49 +00001710 StringRef Fn;
Devang Patele01b75c2011-03-24 20:30:50 +00001711 StringRef Dir;
Dan Gohman50849c62010-05-05 23:41:32 +00001712 unsigned Src = 1;
Diego Novillo282450d2014-03-03 18:53:17 +00001713 unsigned Discriminator = 0;
Dan Gohman50849c62010-05-05 23:41:32 +00001714 if (S) {
1715 DIDescriptor Scope(S);
Devang Patel2089d162009-10-05 18:03:19 +00001716
Dan Gohman50849c62010-05-05 23:41:32 +00001717 if (Scope.isCompileUnit()) {
1718 DICompileUnit CU(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001719 Fn = CU.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001720 Dir = CU.getDirectory();
Devang Patelc4b69052010-10-28 17:30:52 +00001721 } else if (Scope.isFile()) {
1722 DIFile F(S);
Devang Patelc4b69052010-10-28 17:30:52 +00001723 Fn = F.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001724 Dir = F.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001725 } else if (Scope.isSubprogram()) {
1726 DISubprogram SP(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001727 Fn = SP.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001728 Dir = SP.getDirectory();
Eric Christopher6647b832011-10-11 22:59:11 +00001729 } else if (Scope.isLexicalBlockFile()) {
1730 DILexicalBlockFile DBF(S);
1731 Fn = DBF.getFilename();
1732 Dir = DBF.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001733 } else if (Scope.isLexicalBlock()) {
1734 DILexicalBlock DB(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001735 Fn = DB.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001736 Dir = DB.getDirectory();
Diego Novillo282450d2014-03-03 18:53:17 +00001737 Discriminator = DB.getDiscriminator();
Dan Gohman50849c62010-05-05 23:41:32 +00001738 } else
Craig Topperee4dab52012-02-05 08:31:47 +00001739 llvm_unreachable("Unexpected scope info");
Dan Gohman50849c62010-05-05 23:41:32 +00001740
David Blaikie0e8d4012014-03-17 23:53:25 +00001741 unsigned CUID = Asm->OutStreamer.getContext().getDwarfCompileUnitID();
David Blaikiec33b3cd2014-04-22 21:27:37 +00001742 Src = static_cast<DwarfCompileUnit &>(*InfoHolder.getUnits()[CUID])
1743 .getOrCreateSourceID(Fn, Dir);
Dan Gohman50849c62010-05-05 23:41:32 +00001744 }
Diego Novillo282450d2014-03-03 18:53:17 +00001745 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0,
1746 Discriminator, Fn);
Bill Wendling2b128d72009-05-20 23:19:06 +00001747}
1748
Bill Wendling806535f2009-05-20 23:22:40 +00001749//===----------------------------------------------------------------------===//
1750// Emit Methods
1751//===----------------------------------------------------------------------===//
1752
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001753// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001754void DwarfDebug::emitSectionLabels() {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001755 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00001756
Bill Wendling480ff322009-05-20 23:21:38 +00001757 // Dwarf sections base addresses.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001758 DwarfInfoSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001759 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Eric Christopherd8667202013-12-30 17:22:27 +00001760 if (useSplitDwarf())
1761 DwarfInfoDWOSectionSym =
1762 emitSectionSym(Asm, TLOF.getDwarfInfoDWOSection(), "section_info_dwo");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001763 DwarfAbbrevSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001764 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher3c5a1912012-12-19 22:02:53 +00001765 if (useSplitDwarf())
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001766 DwarfAbbrevDWOSectionSym = emitSectionSym(
1767 Asm, TLOF.getDwarfAbbrevDWOSection(), "section_abbrev_dwo");
David Blaikie20474102014-02-25 22:46:44 +00001768 if (GenerateARangeSection)
1769 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001770
Eric Christopher74804332013-02-07 21:19:50 +00001771 DwarfLineSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001772 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher261d2342013-09-23 20:55:35 +00001773 if (GenerateGnuPubSections) {
Eric Christopher39eebfa2013-09-30 23:14:16 +00001774 DwarfGnuPubNamesSectionSym =
1775 emitSectionSym(Asm, TLOF.getDwarfGnuPubNamesSection());
1776 DwarfGnuPubTypesSectionSym =
1777 emitSectionSym(Asm, TLOF.getDwarfGnuPubTypesSection());
Eric Christopher261d2342013-09-23 20:55:35 +00001778 } else if (HasDwarfPubSections) {
1779 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
1780 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001781 }
Eric Christopherdd1a0122013-09-13 00:35:05 +00001782
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001783 DwarfStrSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001784 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001785 if (useSplitDwarf()) {
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001786 DwarfStrDWOSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001787 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001788 DwarfAddrSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001789 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
David Blaikiee12ab122014-04-01 16:09:49 +00001790 DwarfDebugLocSectionSym =
David Blaikie9c550ac2014-03-25 01:44:02 +00001791 emitSectionSym(Asm, TLOF.getDwarfLocDWOSection(), "skel_loc");
1792 } else
1793 DwarfDebugLocSectionSym =
1794 emitSectionSym(Asm, TLOF.getDwarfLocSection(), "section_debug_loc");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001795 DwarfDebugRangeSectionSym =
1796 emitSectionSym(Asm, TLOF.getDwarfRangesSection(), "debug_range");
Bill Wendling480ff322009-05-20 23:21:38 +00001797}
1798
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001799// Recursively emits a debug information entry.
David Blaikieb8184182014-04-14 22:45:02 +00001800void DwarfDebug::emitDIE(DIE &Die) {
Bill Wendling480ff322009-05-20 23:21:38 +00001801 // Get the abbreviation for this DIE.
David Blaikieb8184182014-04-14 22:45:02 +00001802 const DIEAbbrev &Abbrev = Die.getAbbrev();
Bill Wendling480ff322009-05-20 23:21:38 +00001803
Bill Wendling480ff322009-05-20 23:21:38 +00001804 // Emit the code (index) for the abbreviation.
Chris Lattner7bde8c02010-04-04 18:52:31 +00001805 if (Asm->isVerbose())
David Blaikieff3ab2c2013-12-05 01:01:41 +00001806 Asm->OutStreamer.AddComment("Abbrev [" + Twine(Abbrev.getNumber()) +
David Blaikieb8184182014-04-14 22:45:02 +00001807 "] 0x" + Twine::utohexstr(Die.getOffset()) +
1808 ":0x" + Twine::utohexstr(Die.getSize()) + " " +
David Blaikieff3ab2c2013-12-05 01:01:41 +00001809 dwarf::TagString(Abbrev.getTag()));
1810 Asm->EmitULEB128(Abbrev.getNumber());
Bill Wendling480ff322009-05-20 23:21:38 +00001811
David Blaikieb8184182014-04-14 22:45:02 +00001812 const SmallVectorImpl<DIEValue *> &Values = Die.getValues();
David Blaikieff3ab2c2013-12-05 01:01:41 +00001813 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
Bill Wendling480ff322009-05-20 23:21:38 +00001814
1815 // Emit the DIE attribute values.
1816 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
David Blaikief2443192013-10-21 17:28:37 +00001817 dwarf::Attribute Attr = AbbrevData[i].getAttribute();
1818 dwarf::Form Form = AbbrevData[i].getForm();
Bill Wendling480ff322009-05-20 23:21:38 +00001819 assert(Form && "Too many attributes for DIE (check abbreviation)");
1820
Eric Christopher13a1bb32014-03-06 00:00:49 +00001821 if (Asm->isVerbose()) {
Chris Lattner5adf9872010-01-24 18:54:17 +00001822 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Eric Christopher13a1bb32014-03-06 00:00:49 +00001823 if (Attr == dwarf::DW_AT_accessibility)
1824 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(
1825 cast<DIEInteger>(Values[i])->getValue()));
1826 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001827
Eric Christopherdd508382014-03-06 00:00:56 +00001828 // Emit an attribute using the defined form.
1829 Values[i]->EmitValue(Asm, Form);
Bill Wendling480ff322009-05-20 23:21:38 +00001830 }
1831
1832 // Emit the DIE children if any.
Eric Christophere8f10722014-03-05 01:44:58 +00001833 if (Abbrev.hasChildren()) {
David Blaikieb8184182014-04-14 22:45:02 +00001834 for (auto &Child : Die.getChildren())
1835 emitDIE(*Child);
Bill Wendling480ff322009-05-20 23:21:38 +00001836
David Blaikie155f8812013-12-04 21:51:05 +00001837 Asm->OutStreamer.AddComment("End Of Children Mark");
Chris Lattner566cae92010-03-09 23:52:58 +00001838 Asm->EmitInt8(0);
Bill Wendling480ff322009-05-20 23:21:38 +00001839 }
1840}
1841
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001842// Emit the debug info section.
1843void DwarfDebug::emitDebugInfo() {
Eric Christopherf8194852013-12-05 18:06:10 +00001844 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Eric Christophera2de8262012-12-15 00:04:07 +00001845
David Blaikief72ed5f2014-03-24 20:31:01 +00001846 Holder.emitUnits(this, DwarfAbbrevSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001847}
1848
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001849// Emit the abbreviation section.
Eric Christopher38371952012-11-20 23:30:11 +00001850void DwarfDebug::emitAbbreviations() {
Eric Christopherf8194852013-12-05 18:06:10 +00001851 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
David Blaikie0504cda2013-12-05 07:43:55 +00001852
1853 Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
Eric Christopher3c5a1912012-12-19 22:02:53 +00001854}
Bill Wendling480ff322009-05-20 23:21:38 +00001855
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001856// Emit the last address of the section and the end of the line matrix.
Devang Patel930143b2009-11-21 02:48:08 +00001857void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling480ff322009-05-20 23:21:38 +00001858 // Define last address of section.
Chris Lattner566cae92010-03-09 23:52:58 +00001859 Asm->OutStreamer.AddComment("Extended Op");
1860 Asm->EmitInt8(0);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001861
Chris Lattner566cae92010-03-09 23:52:58 +00001862 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth5da3f052012-11-01 09:14:31 +00001863 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner566cae92010-03-09 23:52:58 +00001864 Asm->OutStreamer.AddComment("DW_LNE_set_address");
1865 Asm->EmitInt8(dwarf::DW_LNE_set_address);
1866
1867 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerb245dfb2010-03-10 01:17:49 +00001868
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001869 Asm->OutStreamer.EmitSymbolValue(
1870 Asm->GetTempSymbol("section_end", SectionEnd),
1871 Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00001872
1873 // Mark end of matrix.
Chris Lattner566cae92010-03-09 23:52:58 +00001874 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1875 Asm->EmitInt8(0);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00001876 Asm->EmitInt8(1);
Chris Lattnerfa823552010-01-22 23:18:42 +00001877 Asm->EmitInt8(1);
Bill Wendling480ff322009-05-20 23:21:38 +00001878}
1879
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001880// Emit visible names into a hashed accelerator table section.
Eric Christopher4996c702011-11-07 09:24:32 +00001881void DwarfDebug::emitAccelNames() {
David Blaikie27931a42014-04-23 23:46:25 +00001882 AccelNames.FinalizeTable(Asm, "Names");
Eric Christopher4996c702011-11-07 09:24:32 +00001883 Asm->OutStreamer.SwitchSection(
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001884 Asm->getObjFileLowering().getDwarfAccelNamesSection());
Eric Christopher4996c702011-11-07 09:24:32 +00001885 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
1886 Asm->OutStreamer.EmitLabel(SectionBegin);
1887
1888 // Emit the full data.
David Blaikie27931a42014-04-23 23:46:25 +00001889 AccelNames.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00001890}
1891
Eric Christopher48fef592012-12-20 21:58:40 +00001892// Emit objective C classes and categories into a hashed accelerator table
1893// section.
Eric Christopher4996c702011-11-07 09:24:32 +00001894void DwarfDebug::emitAccelObjC() {
David Blaikie0ee82b92014-04-24 00:53:32 +00001895 AccelObjC.FinalizeTable(Asm, "ObjC");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001896 Asm->OutStreamer.SwitchSection(
1897 Asm->getObjFileLowering().getDwarfAccelObjCSection());
Eric Christopher4996c702011-11-07 09:24:32 +00001898 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
1899 Asm->OutStreamer.EmitLabel(SectionBegin);
1900
1901 // Emit the full data.
David Blaikie0ee82b92014-04-24 00:53:32 +00001902 AccelObjC.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00001903}
1904
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001905// Emit namespace dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00001906void DwarfDebug::emitAccelNamespaces() {
David Blaikieecf04152014-04-24 01:02:42 +00001907 AccelNamespace.FinalizeTable(Asm, "namespac");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001908 Asm->OutStreamer.SwitchSection(
1909 Asm->getObjFileLowering().getDwarfAccelNamespaceSection());
Eric Christopher4996c702011-11-07 09:24:32 +00001910 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
1911 Asm->OutStreamer.EmitLabel(SectionBegin);
1912
1913 // Emit the full data.
David Blaikieecf04152014-04-24 01:02:42 +00001914 AccelNamespace.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00001915}
1916
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001917// Emit type dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00001918void DwarfDebug::emitAccelTypes() {
Eric Christopher4996c702011-11-07 09:24:32 +00001919
David Blaikie18d33752014-04-24 01:23:49 +00001920 AccelTypes.FinalizeTable(Asm, "types");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001921 Asm->OutStreamer.SwitchSection(
1922 Asm->getObjFileLowering().getDwarfAccelTypesSection());
Eric Christopher4996c702011-11-07 09:24:32 +00001923 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
1924 Asm->OutStreamer.EmitLabel(SectionBegin);
1925
1926 // Emit the full data.
David Blaikie18d33752014-04-24 01:23:49 +00001927 AccelTypes.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00001928}
1929
Eric Christopherdd1a0122013-09-13 00:35:05 +00001930// Public name handling.
1931// The format for the various pubnames:
1932//
1933// dwarf pubnames - offset/name pairs where the offset is the offset into the CU
1934// for the DIE that is named.
1935//
1936// gnu pubnames - offset/index value/name tuples where the offset is the offset
1937// into the CU and the index value is computed according to the type of value
1938// for the DIE that is named.
1939//
1940// For type units the offset is the offset of the skeleton DIE. For split dwarf
1941// it's the offset within the debug_info/debug_types dwo section, however, the
1942// reference in the pubname header doesn't change.
1943
1944/// computeIndexValue - Compute the gdb index value for the DIE and CU.
Eric Christophera5a79422013-12-09 23:32:48 +00001945static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU,
Eric Christopher0fe676a2013-11-21 00:48:22 +00001946 const DIE *Die) {
Eric Christopherd2b497b2013-10-16 01:37:49 +00001947 dwarf::GDBIndexEntryLinkage Linkage = dwarf::GIEL_STATIC;
1948
1949 // We could have a specification DIE that has our most of our knowledge,
1950 // look for that now.
1951 DIEValue *SpecVal = Die->findAttribute(dwarf::DW_AT_specification);
1952 if (SpecVal) {
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001953 DIE &SpecDIE = cast<DIEEntry>(SpecVal)->getEntry();
1954 if (SpecDIE.findAttribute(dwarf::DW_AT_external))
Eric Christopherd2b497b2013-10-16 01:37:49 +00001955 Linkage = dwarf::GIEL_EXTERNAL;
1956 } else if (Die->findAttribute(dwarf::DW_AT_external))
1957 Linkage = dwarf::GIEL_EXTERNAL;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001958
1959 switch (Die->getTag()) {
1960 case dwarf::DW_TAG_class_type:
1961 case dwarf::DW_TAG_structure_type:
1962 case dwarf::DW_TAG_union_type:
1963 case dwarf::DW_TAG_enumeration_type:
Eric Christopher261d2342013-09-23 20:55:35 +00001964 return dwarf::PubIndexEntryDescriptor(
1965 dwarf::GIEK_TYPE, CU->getLanguage() != dwarf::DW_LANG_C_plus_plus
1966 ? dwarf::GIEL_STATIC
1967 : dwarf::GIEL_EXTERNAL);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001968 case dwarf::DW_TAG_typedef:
1969 case dwarf::DW_TAG_base_type:
1970 case dwarf::DW_TAG_subrange_type:
David Blaikie8dec4072013-09-19 20:40:26 +00001971 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE, dwarf::GIEL_STATIC);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001972 case dwarf::DW_TAG_namespace:
David Blaikie8dec4072013-09-19 20:40:26 +00001973 return dwarf::GIEK_TYPE;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001974 case dwarf::DW_TAG_subprogram:
Eric Christopherccac5c42013-09-23 22:59:14 +00001975 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_FUNCTION, Linkage);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001976 case dwarf::DW_TAG_constant:
1977 case dwarf::DW_TAG_variable:
Eric Christopherccac5c42013-09-23 22:59:14 +00001978 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, Linkage);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001979 case dwarf::DW_TAG_enumerator:
David Blaikie8dec4072013-09-19 20:40:26 +00001980 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE,
1981 dwarf::GIEL_STATIC);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001982 default:
David Blaikie8dec4072013-09-19 20:40:26 +00001983 return dwarf::GIEK_NONE;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001984 }
Eric Christopherdd1a0122013-09-13 00:35:05 +00001985}
1986
Eric Christopher5f93bb92013-09-09 20:03:17 +00001987/// emitDebugPubNames - Emit visible names into a debug pubnames section.
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001988///
Eric Christopherdd1a0122013-09-13 00:35:05 +00001989void DwarfDebug::emitDebugPubNames(bool GnuStyle) {
Eric Christopherdd1a0122013-09-13 00:35:05 +00001990 const MCSection *PSec =
1991 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection()
1992 : Asm->getObjFileLowering().getDwarfPubNamesSection();
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001993
David Blaikie0f55e832014-03-11 23:18:15 +00001994 emitDebugPubSection(GnuStyle, PSec, "Names", &DwarfUnit::getGlobalNames);
1995}
1996
1997void DwarfDebug::emitDebugPubSection(
1998 bool GnuStyle, const MCSection *PSec, StringRef Name,
1999 const StringMap<const DIE *> &(DwarfUnit::*Accessor)() const) {
David Blaikiec3d9e9e2014-03-06 01:42:00 +00002000 for (const auto &NU : CUMap) {
2001 DwarfCompileUnit *TheU = NU.second;
David Blaikie55bb8ac2014-03-11 23:23:39 +00002002
2003 const auto &Globals = (TheU->*Accessor)();
2004
David Blaikiece2f1cb2014-03-11 23:35:06 +00002005 if (Globals.empty())
2006 continue;
2007
David Blaikiec3d9e9e2014-03-06 01:42:00 +00002008 if (auto Skeleton = static_cast<DwarfCompileUnit *>(TheU->getSkeleton()))
2009 TheU = Skeleton;
David Blaikie2a80e442013-12-02 22:09:48 +00002010 unsigned ID = TheU->getUniqueID();
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002011
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002012 // Start the dwarf pubnames section.
Eric Christopher13b99d22013-09-10 21:49:37 +00002013 Asm->OutStreamer.SwitchSection(PSec);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002014
Eric Christopherdd1a0122013-09-13 00:35:05 +00002015 // Emit the header.
David Blaikie0f55e832014-03-11 23:18:15 +00002016 Asm->OutStreamer.AddComment("Length of Public " + Name + " Info");
2017 MCSymbol *BeginLabel = Asm->GetTempSymbol("pub" + Name + "_begin", ID);
2018 MCSymbol *EndLabel = Asm->GetTempSymbol("pub" + Name + "_end", ID);
David Blaikieb7a1c4d2013-12-04 17:55:41 +00002019 Asm->EmitLabelDifference(EndLabel, BeginLabel, 4);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002020
David Blaikieb7a1c4d2013-12-04 17:55:41 +00002021 Asm->OutStreamer.EmitLabel(BeginLabel);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002022
2023 Asm->OutStreamer.AddComment("DWARF Version");
David Majnemered89b5c2013-08-21 06:13:34 +00002024 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002025
2026 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
David Blaikie7d734602013-12-06 22:33:05 +00002027 Asm->EmitSectionOffset(TheU->getLabelBegin(), TheU->getSectionSym());
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002028
2029 Asm->OutStreamer.AddComment("Compilation Unit Length");
David Blaikie7d734602013-12-06 22:33:05 +00002030 Asm->EmitLabelDifference(TheU->getLabelEnd(), TheU->getLabelBegin(), 4);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002031
Eric Christopherdd1a0122013-09-13 00:35:05 +00002032 // Emit the pubnames for this compilation unit.
David Blaikie55bb8ac2014-03-11 23:23:39 +00002033 for (const auto &GI : Globals) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00002034 const char *Name = GI.getKeyData();
2035 const DIE *Entity = GI.second;
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002036
2037 Asm->OutStreamer.AddComment("DIE offset");
2038 Asm->EmitInt32(Entity->getOffset());
2039
Eric Christopherdd1a0122013-09-13 00:35:05 +00002040 if (GnuStyle) {
David Blaikie2a80e442013-12-02 22:09:48 +00002041 dwarf::PubIndexEntryDescriptor Desc = computeIndexValue(TheU, Entity);
David Blaikied0a869d2013-09-19 22:19:37 +00002042 Asm->OutStreamer.AddComment(
David Blaikieefd0bcb2013-09-20 00:33:15 +00002043 Twine("Kind: ") + dwarf::GDBIndexEntryKindString(Desc.Kind) + ", " +
David Blaikie404d3042013-09-19 23:01:29 +00002044 dwarf::GDBIndexEntryLinkageString(Desc.Linkage));
David Blaikied0a869d2013-09-19 22:19:37 +00002045 Asm->EmitInt8(Desc.toBits());
Eric Christopherdd1a0122013-09-13 00:35:05 +00002046 }
2047
David Blaikie155f8812013-12-04 21:51:05 +00002048 Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer15596c72014-03-07 19:09:39 +00002049 Asm->OutStreamer.EmitBytes(StringRef(Name, GI.getKeyLength() + 1));
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002050 }
2051
2052 Asm->OutStreamer.AddComment("End Mark");
2053 Asm->EmitInt32(0);
David Blaikieb7a1c4d2013-12-04 17:55:41 +00002054 Asm->OutStreamer.EmitLabel(EndLabel);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002055 }
2056}
2057
Eric Christopherdd1a0122013-09-13 00:35:05 +00002058void DwarfDebug::emitDebugPubTypes(bool GnuStyle) {
Eric Christopher261d2342013-09-23 20:55:35 +00002059 const MCSection *PSec =
2060 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
2061 : Asm->getObjFileLowering().getDwarfPubTypesSection();
Eric Christopher8b3737f2013-09-13 00:34:58 +00002062
David Blaikie0f55e832014-03-11 23:18:15 +00002063 emitDebugPubSection(GnuStyle, PSec, "Types", &DwarfUnit::getGlobalTypes);
Devang Patel04d2f2d2009-11-24 01:14:22 +00002064}
2065
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002066// Emit visible names into a debug str section.
2067void DwarfDebug::emitDebugStr() {
Eric Christopherf8194852013-12-05 18:06:10 +00002068 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002069 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2070}
2071
Eric Christopher29e874d2014-03-07 22:40:37 +00002072void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer,
Eric Christopher05135fb2014-03-18 02:18:24 +00002073 const DebugLocEntry &Entry) {
Adrian Prantle19e5ef2014-04-27 18:25:40 +00002074 assert(Entry.getValues().size() == 1 &&
Eric Christopher793c7472014-04-28 20:42:22 +00002075 "multi-value entries are not supported yet.");
Adrian Prantle19e5ef2014-04-27 18:25:40 +00002076 const DebugLocEntry::Value Value = Entry.getValues()[0];
2077 DIVariable DV(Value.getVariable());
2078 if (Value.isInt()) {
Adrian Prantl1a1647c2014-03-18 02:34:58 +00002079 DIBasicType BTy(resolve(DV.getType()));
Eric Christopher29e874d2014-03-07 22:40:37 +00002080 if (BTy.Verify() && (BTy.getEncoding() == dwarf::DW_ATE_signed ||
2081 BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2082 Streamer.EmitInt8(dwarf::DW_OP_consts, "DW_OP_consts");
Adrian Prantle19e5ef2014-04-27 18:25:40 +00002083 Streamer.EmitSLEB128(Value.getInt());
Eric Christopher29e874d2014-03-07 22:40:37 +00002084 } else {
2085 Streamer.EmitInt8(dwarf::DW_OP_constu, "DW_OP_constu");
Adrian Prantle19e5ef2014-04-27 18:25:40 +00002086 Streamer.EmitULEB128(Value.getInt());
Eric Christopher29e874d2014-03-07 22:40:37 +00002087 }
Adrian Prantle19e5ef2014-04-27 18:25:40 +00002088 } else if (Value.isLocation()) {
2089 MachineLocation Loc = Value.getLoc();
Eric Christopher29e874d2014-03-07 22:40:37 +00002090 if (!DV.hasComplexAddress())
2091 // Regular entry.
2092 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2093 else {
2094 // Complex address entry.
2095 unsigned N = DV.getNumAddrElements();
2096 unsigned i = 0;
2097 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2098 if (Loc.getOffset()) {
2099 i = 2;
2100 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2101 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
2102 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
2103 Streamer.EmitSLEB128(DV.getAddrElement(1));
2104 } else {
2105 // If first address element is OpPlus then emit
2106 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2107 MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));
2108 Asm->EmitDwarfRegOp(Streamer, TLoc, DV.isIndirect());
2109 i = 2;
2110 }
2111 } else {
2112 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2113 }
2114
2115 // Emit remaining complex address elements.
2116 for (; i < N; ++i) {
2117 uint64_t Element = DV.getAddrElement(i);
2118 if (Element == DIBuilder::OpPlus) {
2119 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
2120 Streamer.EmitULEB128(DV.getAddrElement(++i));
2121 } else if (Element == DIBuilder::OpDeref) {
2122 if (!Loc.isReg())
2123 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
2124 } else
2125 llvm_unreachable("unknown Opcode found in complex address");
2126 }
2127 }
2128 }
2129 // else ... ignore constant fp. There is not any good way to
2130 // to represent them here in dwarf.
2131 // FIXME: ^
2132}
2133
David Blaikie0e84adc2014-04-01 16:17:41 +00002134void DwarfDebug::emitDebugLocEntryLocation(const DebugLocEntry &Entry) {
2135 Asm->OutStreamer.AddComment("Loc expr size");
2136 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2137 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2138 Asm->EmitLabelDifference(end, begin, 2);
2139 Asm->OutStreamer.EmitLabel(begin);
2140 // Emit the entry.
2141 APByteStreamer Streamer(*Asm);
2142 emitDebugLocEntry(Streamer, Entry);
2143 // Close the range.
2144 Asm->OutStreamer.EmitLabel(end);
2145}
2146
Eric Christopher9046f942013-07-02 21:36:07 +00002147// Emit locations into the debug loc section.
Devang Patel930143b2009-11-21 02:48:08 +00002148void DwarfDebug::emitDebugLoc() {
Daniel Dunbarfd95b012011-03-16 22:16:39 +00002149 // Start the dwarf loc section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002150 Asm->OutStreamer.SwitchSection(
David Blaikie94c1d7f2014-04-02 01:50:20 +00002151 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth5da3f052012-11-01 09:14:31 +00002152 unsigned char Size = Asm->getDataLayout().getPointerSize();
David Blaikie84d8e182014-03-24 22:38:38 +00002153 for (const auto &DebugLoc : DotDebugLocEntries) {
David Blaikie0a456de2014-04-02 01:43:18 +00002154 Asm->OutStreamer.EmitLabel(DebugLoc.Label);
2155 for (const auto &Entry : DebugLoc.List) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00002156 // Set up the range. This range is relative to the entry point of the
2157 // compile unit. This is a hard coded 0 for low_pc when we're emitting
2158 // ranges, or the DW_AT_low_pc on the compile unit otherwise.
2159 const DwarfCompileUnit *CU = Entry.getCU();
David Blaikie94c1d7f2014-04-02 01:50:20 +00002160 if (CU->getRanges().size() == 1) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00002161 // Grab the begin symbol from the first range as our base.
2162 const MCSymbol *Base = CU->getRanges()[0].getStart();
2163 Asm->EmitLabelDifference(Entry.getBeginSym(), Base, Size);
2164 Asm->EmitLabelDifference(Entry.getEndSym(), Base, Size);
2165 } else {
2166 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
2167 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
2168 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002169
David Blaikie0e84adc2014-04-01 16:17:41 +00002170 emitDebugLocEntryLocation(Entry);
Devang Patel9fc11702010-05-25 23:40:22 +00002171 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002172 Asm->OutStreamer.EmitIntValue(0, Size);
2173 Asm->OutStreamer.EmitIntValue(0, Size);
2174 }
2175}
2176
2177void DwarfDebug::emitDebugLocDWO() {
2178 Asm->OutStreamer.SwitchSection(
2179 Asm->getObjFileLowering().getDwarfLocDWOSection());
2180 for (const auto &DebugLoc : DotDebugLocEntries) {
2181 Asm->OutStreamer.EmitLabel(DebugLoc.Label);
2182 for (const auto &Entry : DebugLoc.List) {
2183 // Just always use start_length for now - at least that's one address
2184 // rather than two. We could get fancier and try to, say, reuse an
2185 // address we know we've emitted elsewhere (the start of the function?
2186 // The start of the CU or CU subrange that encloses this range?)
2187 Asm->EmitInt8(dwarf::DW_LLE_start_length_entry);
David Blaikied75fb282014-04-23 21:20:10 +00002188 unsigned idx = AddrPool.getIndex(Entry.getBeginSym());
David Blaikie94c1d7f2014-04-02 01:50:20 +00002189 Asm->EmitULEB128(idx);
2190 Asm->EmitLabelDifference(Entry.getEndSym(), Entry.getBeginSym(), 4);
2191
2192 emitDebugLocEntryLocation(Entry);
David Blaikie9c550ac2014-03-25 01:44:02 +00002193 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002194 Asm->EmitInt8(dwarf::DW_LLE_end_of_list_entry);
Devang Patel9fc11702010-05-25 23:40:22 +00002195 }
Bill Wendling480ff322009-05-20 23:21:38 +00002196}
2197
Richard Mitton21101b32013-09-19 23:21:01 +00002198struct ArangeSpan {
2199 const MCSymbol *Start, *End;
2200};
2201
2202// Emit a debug aranges section, containing a CU lookup for any
2203// address we can tie back to a CU.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00002204void DwarfDebug::emitDebugARanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002205 // Start the dwarf aranges section.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002206 Asm->OutStreamer.SwitchSection(
2207 Asm->getObjFileLowering().getDwarfARangesSection());
Richard Mitton21101b32013-09-19 23:21:01 +00002208
Eric Christopher793c7472014-04-28 20:42:22 +00002209 typedef DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan>> SpansType;
Richard Mitton21101b32013-09-19 23:21:01 +00002210
2211 SpansType Spans;
2212
2213 // Build a list of sections used.
2214 std::vector<const MCSection *> Sections;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002215 for (const auto &it : SectionMap) {
2216 const MCSection *Section = it.first;
Richard Mitton21101b32013-09-19 23:21:01 +00002217 Sections.push_back(Section);
2218 }
2219
2220 // Sort the sections into order.
2221 // This is only done to ensure consistent output order across different runs.
2222 std::sort(Sections.begin(), Sections.end(), SectionSort);
2223
2224 // Build a set of address spans, sorted by CU.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002225 for (const MCSection *Section : Sections) {
David Blaikieafd2c6b2014-04-22 05:41:06 +00002226 SmallVector<SymbolCU, 8> &List = SectionMap[Section];
Richard Mitton21101b32013-09-19 23:21:01 +00002227 if (List.size() < 2)
2228 continue;
2229
2230 // Sort the symbols by offset within the section.
Benjamin Kramer571e2fe2014-03-07 19:41:22 +00002231 std::sort(List.begin(), List.end(),
2232 [&](const SymbolCU &A, const SymbolCU &B) {
2233 unsigned IA = A.Sym ? Asm->OutStreamer.GetSymbolOrder(A.Sym) : 0;
2234 unsigned IB = B.Sym ? Asm->OutStreamer.GetSymbolOrder(B.Sym) : 0;
2235
2236 // Symbols with no order assigned should be placed at the end.
2237 // (e.g. section end labels)
2238 if (IA == 0)
2239 return false;
2240 if (IB == 0)
2241 return true;
2242 return IA < IB;
2243 });
Richard Mitton21101b32013-09-19 23:21:01 +00002244
2245 // If we have no section (e.g. common), just write out
2246 // individual spans for each symbol.
Craig Topper353eda42014-04-24 06:44:33 +00002247 if (!Section) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00002248 for (const SymbolCU &Cur : List) {
Richard Mitton21101b32013-09-19 23:21:01 +00002249 ArangeSpan Span;
2250 Span.Start = Cur.Sym;
Craig Topper353eda42014-04-24 06:44:33 +00002251 Span.End = nullptr;
Richard Mitton21101b32013-09-19 23:21:01 +00002252 if (Cur.CU)
2253 Spans[Cur.CU].push_back(Span);
2254 }
2255 } else {
2256 // Build spans between each label.
2257 const MCSymbol *StartSym = List[0].Sym;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002258 for (size_t n = 1, e = List.size(); n < e; n++) {
Richard Mitton21101b32013-09-19 23:21:01 +00002259 const SymbolCU &Prev = List[n - 1];
2260 const SymbolCU &Cur = List[n];
2261
2262 // Try and build the longest span we can within the same CU.
2263 if (Cur.CU != Prev.CU) {
2264 ArangeSpan Span;
2265 Span.Start = StartSym;
2266 Span.End = Cur.Sym;
2267 Spans[Prev.CU].push_back(Span);
2268 StartSym = Cur.Sym;
2269 }
2270 }
2271 }
2272 }
2273
Richard Mitton21101b32013-09-19 23:21:01 +00002274 unsigned PtrSize = Asm->getDataLayout().getPointerSize();
2275
2276 // Build a list of CUs used.
Eric Christopher4287a492013-12-09 23:57:44 +00002277 std::vector<DwarfCompileUnit *> CUs;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002278 for (const auto &it : Spans) {
2279 DwarfCompileUnit *CU = it.first;
Richard Mitton21101b32013-09-19 23:21:01 +00002280 CUs.push_back(CU);
2281 }
2282
2283 // Sort the CU list (again, to ensure consistent output order).
Benjamin Kramer571e2fe2014-03-07 19:41:22 +00002284 std::sort(CUs.begin(), CUs.end(), [](const DwarfUnit *A, const DwarfUnit *B) {
2285 return A->getUniqueID() < B->getUniqueID();
2286 });
Richard Mitton21101b32013-09-19 23:21:01 +00002287
2288 // Emit an arange table for each CU we used.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002289 for (DwarfCompileUnit *CU : CUs) {
Richard Mitton21101b32013-09-19 23:21:01 +00002290 std::vector<ArangeSpan> &List = Spans[CU];
2291
2292 // Emit size of content not including length itself.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002293 unsigned ContentSize =
2294 sizeof(int16_t) + // DWARF ARange version number
2295 sizeof(int32_t) + // Offset of CU in the .debug_info section
2296 sizeof(int8_t) + // Pointer Size (in bytes)
2297 sizeof(int8_t); // Segment Size (in bytes)
Richard Mitton21101b32013-09-19 23:21:01 +00002298
2299 unsigned TupleSize = PtrSize * 2;
2300
2301 // 7.20 in the Dwarf specs requires the table to be aligned to a tuple.
Benjamin Kramer8a68ab32014-01-07 19:28:14 +00002302 unsigned Padding =
2303 OffsetToAlignment(sizeof(int32_t) + ContentSize, TupleSize);
Richard Mitton21101b32013-09-19 23:21:01 +00002304
2305 ContentSize += Padding;
2306 ContentSize += (List.size() + 1) * TupleSize;
2307
2308 // For each compile unit, write the list of spans it covers.
2309 Asm->OutStreamer.AddComment("Length of ARange Set");
2310 Asm->EmitInt32(ContentSize);
2311 Asm->OutStreamer.AddComment("DWARF Arange version number");
2312 Asm->EmitInt16(dwarf::DW_ARANGES_VERSION);
2313 Asm->OutStreamer.AddComment("Offset Into Debug Info Section");
Eric Christopherd8667202013-12-30 17:22:27 +00002314 Asm->EmitSectionOffset(CU->getLocalLabelBegin(), CU->getLocalSectionSym());
Richard Mitton21101b32013-09-19 23:21:01 +00002315 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2316 Asm->EmitInt8(PtrSize);
2317 Asm->OutStreamer.AddComment("Segment Size (in bytes)");
2318 Asm->EmitInt8(0);
2319
Benjamin Kramer8a68ab32014-01-07 19:28:14 +00002320 Asm->OutStreamer.EmitFill(Padding, 0xff);
Richard Mitton21101b32013-09-19 23:21:01 +00002321
Benjamin Kramer15596c72014-03-07 19:09:39 +00002322 for (const ArangeSpan &Span : List) {
Richard Mitton21101b32013-09-19 23:21:01 +00002323 Asm->EmitLabelReference(Span.Start, PtrSize);
2324
2325 // Calculate the size as being from the span start to it's end.
Richard Mitton089ed892013-09-23 17:56:20 +00002326 if (Span.End) {
Richard Mitton21101b32013-09-19 23:21:01 +00002327 Asm->EmitLabelDifference(Span.End, Span.Start, PtrSize);
Richard Mitton089ed892013-09-23 17:56:20 +00002328 } else {
2329 // For symbols without an end marker (e.g. common), we
2330 // write a single arange entry containing just that one symbol.
2331 uint64_t Size = SymSize[Span.Start];
2332 if (Size == 0)
2333 Size = 1;
2334
2335 Asm->OutStreamer.EmitIntValue(Size, PtrSize);
2336 }
Richard Mitton21101b32013-09-19 23:21:01 +00002337 }
2338
2339 Asm->OutStreamer.AddComment("ARange terminator");
2340 Asm->OutStreamer.EmitIntValue(0, PtrSize);
2341 Asm->OutStreamer.EmitIntValue(0, PtrSize);
2342 }
Bill Wendling480ff322009-05-20 23:21:38 +00002343}
2344
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002345// Emit visible names into a debug ranges section.
Devang Patel930143b2009-11-21 02:48:08 +00002346void DwarfDebug::emitDebugRanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002347 // Start the dwarf ranges section.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002348 Asm->OutStreamer.SwitchSection(
2349 Asm->getObjFileLowering().getDwarfRangesSection());
Eric Christopher4751d702013-11-23 00:05:29 +00002350
Eric Christopher0f63d062013-12-03 00:45:45 +00002351 // Size for our labels.
2352 unsigned char Size = Asm->getDataLayout().getPointerSize();
2353
2354 // Grab the specific ranges for the compile units in the module.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002355 for (const auto &I : CUMap) {
2356 DwarfCompileUnit *TheCU = I.second;
Eric Christopher0f63d062013-12-03 00:45:45 +00002357
2358 // Emit a symbol so we can find the beginning of our ranges.
David Blaikie1ab7c2d2013-12-09 17:51:30 +00002359 Asm->OutStreamer.EmitLabel(TheCU->getLabelRange());
Eric Christopher0f63d062013-12-03 00:45:45 +00002360
2361 // Iterate over the misc ranges for the compile units in the module.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002362 for (const RangeSpanList &List : TheCU->getRangeLists()) {
Eric Christopherf8790642013-12-04 22:04:50 +00002363 // Emit our symbol so we can find the beginning of the range.
2364 Asm->OutStreamer.EmitLabel(List.getSym());
Eric Christopher0f63d062013-12-03 00:45:45 +00002365
Benjamin Kramer15596c72014-03-07 19:09:39 +00002366 for (const RangeSpan &Range : List.getRanges()) {
Eric Christopher0f63d062013-12-03 00:45:45 +00002367 const MCSymbol *Begin = Range.getStart();
2368 const MCSymbol *End = Range.getEnd();
Eric Christopher565ab112013-12-20 04:34:22 +00002369 assert(Begin && "Range without a begin symbol?");
2370 assert(End && "Range without an end symbol?");
Eric Christopherece0e902014-04-25 22:23:54 +00002371 if (TheCU->getRanges().size() == 1) {
2372 // Grab the begin symbol from the first range as our base.
2373 const MCSymbol *Base = TheCU->getRanges()[0].getStart();
2374 Asm->EmitLabelDifference(Begin, Base, Size);
2375 Asm->EmitLabelDifference(End, Base, Size);
2376 } else {
2377 Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2378 Asm->OutStreamer.EmitSymbolValue(End, Size);
2379 }
Eric Christopher0f63d062013-12-03 00:45:45 +00002380 }
2381
2382 // And terminate the list with two 0 values.
Eric Christopherce0cfce2013-01-09 01:35:34 +00002383 Asm->OutStreamer.EmitIntValue(0, Size);
Eric Christopher0f63d062013-12-03 00:45:45 +00002384 Asm->OutStreamer.EmitIntValue(0, Size);
2385 }
Eric Christopher46e23432013-12-20 04:16:18 +00002386
2387 // Now emit a range for the CU itself.
Eric Christopher384f3fe2014-03-20 19:16:16 +00002388 if (TheCU->getRanges().size() > 1) {
Eric Christopher46e23432013-12-20 04:16:18 +00002389 Asm->OutStreamer.EmitLabel(
2390 Asm->GetTempSymbol("cu_ranges", TheCU->getUniqueID()));
Benjamin Kramer15596c72014-03-07 19:09:39 +00002391 for (const RangeSpan &Range : TheCU->getRanges()) {
Eric Christopher46e23432013-12-20 04:16:18 +00002392 const MCSymbol *Begin = Range.getStart();
2393 const MCSymbol *End = Range.getEnd();
Eric Christopher565ab112013-12-20 04:34:22 +00002394 assert(Begin && "Range without a begin symbol?");
2395 assert(End && "Range without an end symbol?");
2396 Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2397 Asm->OutStreamer.EmitSymbolValue(End, Size);
Eric Christopher46e23432013-12-20 04:16:18 +00002398 }
2399 // And terminate the list with two 0 values.
2400 Asm->OutStreamer.EmitIntValue(0, Size);
2401 Asm->OutStreamer.EmitIntValue(0, Size);
2402 }
Devang Patel12563b32010-04-16 23:33:45 +00002403 }
Bill Wendling480ff322009-05-20 23:21:38 +00002404}
2405
Eric Christopherd692c1d2012-12-11 19:42:09 +00002406// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002407
David Blaikie65a74662014-04-25 18:26:14 +00002408void DwarfDebug::initSkeletonUnit(const DwarfUnit &U, DIE &Die,
David Blaikief9b6a552014-04-22 22:39:41 +00002409 std::unique_ptr<DwarfUnit> NewU) {
David Blaikie38fe6342014-01-09 04:28:46 +00002410 NewU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
David Blaikief9b6a552014-04-22 22:39:41 +00002411 U.getCUNode().getSplitDebugFilename());
David Blaikie38fe6342014-01-09 04:28:46 +00002412
David Blaikie38fe6342014-01-09 04:28:46 +00002413 if (!CompilationDir.empty())
2414 NewU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
2415
David Blaikief9b6a552014-04-22 22:39:41 +00002416 addGnuPubAttributes(*NewU, Die);
David Blaikie38fe6342014-01-09 04:28:46 +00002417
David Blaikief9b6a552014-04-22 22:39:41 +00002418 SkeletonHolder.addUnit(std::move(NewU));
David Blaikie38fe6342014-01-09 04:28:46 +00002419}
2420
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002421// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2422// 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 +00002423// DW_AT_addr_base, DW_AT_ranges_base.
David Blaikief9b6a552014-04-22 22:39:41 +00002424DwarfCompileUnit &DwarfDebug::constructSkeletonCU(const DwarfCompileUnit &CU) {
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002425
2426 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
David Blaikief9b6a552014-04-22 22:39:41 +00002427 auto OwnedUnit = make_unique<DwarfCompileUnit>(
2428 CU.getUniqueID(), Die, CU.getCUNode(), Asm, this, &SkeletonHolder);
2429 DwarfCompileUnit &NewCU = *OwnedUnit;
2430 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
David Blaikie637cac42014-04-22 23:09:36 +00002431 DwarfInfoSectionSym);
Eric Christopher4c7765f2013-01-17 03:00:04 +00002432
David Blaikief9b6a552014-04-22 22:39:41 +00002433 NewCU.initStmtList(DwarfLineSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002434
David Blaikie65a74662014-04-25 18:26:14 +00002435 initSkeletonUnit(CU, *Die, std::move(OwnedUnit));
Eric Christopherc8a310e2012-12-10 23:34:43 +00002436
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002437 return NewCU;
2438}
2439
David Blaikie15ed5eb2014-01-10 01:38:41 +00002440// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_dwo_name,
2441// DW_AT_addr_base.
David Blaikief9b6a552014-04-22 22:39:41 +00002442DwarfTypeUnit &DwarfDebug::constructSkeletonTU(DwarfTypeUnit &TU) {
David Blaikie60e63862014-02-14 23:58:13 +00002443 DwarfCompileUnit &CU = static_cast<DwarfCompileUnit &>(
David Blaikief9b6a552014-04-22 22:39:41 +00002444 *SkeletonHolder.getUnits()[TU.getCU().getUniqueID()]);
David Blaikie15ed5eb2014-01-10 01:38:41 +00002445
2446 DIE *Die = new DIE(dwarf::DW_TAG_type_unit);
David Blaikief9b6a552014-04-22 22:39:41 +00002447 auto OwnedUnit = make_unique<DwarfTypeUnit>(TU.getUniqueID(), Die, CU, Asm,
2448 this, &SkeletonHolder);
2449 DwarfTypeUnit &NewTU = *OwnedUnit;
2450 NewTU.setTypeSignature(TU.getTypeSignature());
Craig Topper353eda42014-04-24 06:44:33 +00002451 NewTU.setType(nullptr);
David Blaikief9b6a552014-04-22 22:39:41 +00002452 NewTU.initSection(
2453 Asm->getObjFileLowering().getDwarfTypesSection(TU.getTypeSignature()));
David Blaikie15ed5eb2014-01-10 01:38:41 +00002454
David Blaikie65a74662014-04-25 18:26:14 +00002455 initSkeletonUnit(TU, *Die, std::move(OwnedUnit));
David Blaikie15ed5eb2014-01-10 01:38:41 +00002456 return NewTU;
2457}
2458
Eric Christopherd692c1d2012-12-11 19:42:09 +00002459// Emit the .debug_info.dwo section for separated dwarf. This contains the
2460// compile units that would normally be in debug_info.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002461void DwarfDebug::emitDebugInfoDWO() {
Eric Christophercdf218d2012-12-10 19:51:21 +00002462 assert(useSplitDwarf() && "No split dwarf debug info?");
David Blaikie326e1fa2014-04-02 02:04:51 +00002463 // Don't pass an abbrev symbol, using a constant zero instead so as not to
2464 // emit relocations into the dwo file.
Eric Christopher793c7472014-04-28 20:42:22 +00002465 InfoHolder.emitUnits(this, /* AbbrevSymbol */ nullptr);
Eric Christopher3c5a1912012-12-19 22:02:53 +00002466}
2467
2468// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2469// abbreviations for the .debug_info.dwo section.
2470void DwarfDebug::emitDebugAbbrevDWO() {
2471 assert(useSplitDwarf() && "No split dwarf?");
David Blaikie0504cda2013-12-05 07:43:55 +00002472 InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection());
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002473}
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002474
David Blaikie4a2f95f2014-03-18 01:17:26 +00002475void DwarfDebug::emitDebugLineDWO() {
2476 assert(useSplitDwarf() && "No split dwarf?");
2477 Asm->OutStreamer.SwitchSection(
2478 Asm->getObjFileLowering().getDwarfLineDWOSection());
David Blaikie8287aff2014-03-18 02:13:23 +00002479 SplitTypeUnitFileTable.Emit(Asm->OutStreamer);
David Blaikie4a2f95f2014-03-18 01:17:26 +00002480}
2481
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002482// Emit the .debug_str.dwo section for separated dwarf. This contains the
2483// string section and is identical in format to traditional .debug_str
2484// sections.
2485void DwarfDebug::emitDebugStrDWO() {
2486 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002487 const MCSection *OffSec =
2488 Asm->getObjFileLowering().getDwarfStrOffDWOSection();
Eric Christopher2cbd5762013-01-07 19:32:41 +00002489 const MCSymbol *StrSym = DwarfStrSectionSym;
2490 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2491 OffSec, StrSym);
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002492}
David Blaikie409dd9c2013-11-19 23:08:21 +00002493
David Blaikie47f4b822014-03-19 00:11:28 +00002494MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) {
2495 if (!useSplitDwarf())
2496 return nullptr;
2497 if (SingleCU)
2498 SplitTypeUnitFileTable.setCompilationDir(CU.getCUNode().getDirectory());
2499 return &SplitTypeUnitFileTable;
2500}
2501
David Blaikief3de2ab2014-04-26 16:26:41 +00002502static uint64_t makeTypeSignature(StringRef Identifier) {
2503 MD5 Hash;
2504 Hash.update(Identifier);
2505 // ... take the least significant 8 bytes and return those. Our MD5
2506 // implementation always returns its results in little endian, swap bytes
2507 // appropriately.
2508 MD5::MD5Result Result;
2509 Hash.final(Result);
2510 return *reinterpret_cast<support::ulittle64_t *>(Result + 8);
2511}
2512
David Blaikie15632ae2014-02-12 00:31:30 +00002513void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU,
David Blaikie65a74662014-04-25 18:26:14 +00002514 StringRef Identifier, DIE &RefDie,
David Blaikief645f962014-01-09 03:23:41 +00002515 DICompositeType CTy) {
David Blaikiee12b49a2014-04-26 17:27:38 +00002516 // Fast path if we're building some type units and one has already used the
2517 // address pool we know we're going to throw away all this work anyway, so
2518 // don't bother building dependent types.
2519 if (!TypeUnitsUnderConstruction.empty() && AddrPool.hasBeenUsed())
2520 return;
2521
David Blaikie47f615e2013-12-17 23:32:35 +00002522 const DwarfTypeUnit *&TU = DwarfTypeUnits[CTy];
Chandler Carruthb587ab62014-01-20 08:07:07 +00002523 if (TU) {
David Blaikie15632ae2014-02-12 00:31:30 +00002524 CU.addDIETypeSignature(RefDie, *TU);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002525 return;
David Blaikie409dd9c2013-11-19 23:08:21 +00002526 }
2527
David Blaikiee12b49a2014-04-26 17:27:38 +00002528 bool TopLevelType = TypeUnitsUnderConstruction.empty();
2529 AddrPool.resetUsedFlag();
2530
Chandler Carruthb587ab62014-01-20 08:07:07 +00002531 DIE *UnitDie = new DIE(dwarf::DW_TAG_type_unit);
David Blaikief9b6a552014-04-22 22:39:41 +00002532 auto OwnedUnit =
2533 make_unique<DwarfTypeUnit>(InfoHolder.getUnits().size(), UnitDie, CU, Asm,
2534 this, &InfoHolder, getDwoLineTable(CU));
2535 DwarfTypeUnit &NewTU = *OwnedUnit;
2536 TU = &NewTU;
Eric Christopher793c7472014-04-28 20:42:22 +00002537 TypeUnitsUnderConstruction.push_back(
2538 std::make_pair(std::move(OwnedUnit), CTy));
Chandler Carruthb587ab62014-01-20 08:07:07 +00002539
David Blaikie65a74662014-04-25 18:26:14 +00002540 NewTU.addUInt(*UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
David Blaikie637cac42014-04-22 23:09:36 +00002541 CU.getLanguage());
Chandler Carruthb587ab62014-01-20 08:07:07 +00002542
David Blaikief3de2ab2014-04-26 16:26:41 +00002543 uint64_t Signature = makeTypeSignature(Identifier);
David Blaikief9b6a552014-04-22 22:39:41 +00002544 NewTU.setTypeSignature(Signature);
David Blaikief3de2ab2014-04-26 16:26:41 +00002545
David Blaikiee12b49a2014-04-26 17:27:38 +00002546 if (!useSplitDwarf())
David Blaikie60e63862014-02-14 23:58:13 +00002547 CU.applyStmtList(*UnitDie);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002548
David Blaikief9b6a552014-04-22 22:39:41 +00002549 NewTU.initSection(
Chandler Carruthb587ab62014-01-20 08:07:07 +00002550 useSplitDwarf()
2551 ? Asm->getObjFileLowering().getDwarfTypesDWOSection(Signature)
2552 : Asm->getObjFileLowering().getDwarfTypesSection(Signature));
2553
David Blaikief3de2ab2014-04-26 16:26:41 +00002554 NewTU.setType(NewTU.createTypeDIE(CTy));
2555
David Blaikiee12b49a2014-04-26 17:27:38 +00002556 if (TopLevelType) {
2557 auto TypeUnitsToAdd = std::move(TypeUnitsUnderConstruction);
2558 TypeUnitsUnderConstruction.clear();
2559
2560 // Types referencing entries in the address table cannot be placed in type
2561 // units.
2562 if (AddrPool.hasBeenUsed()) {
2563
2564 // Remove all the types built while building this type.
2565 // This is pessimistic as some of these types might not be dependent on
2566 // the type that used an address.
2567 for (const auto &TU : TypeUnitsToAdd)
2568 DwarfTypeUnits.erase(TU.second);
2569
2570 // Construct this type in the CU directly.
2571 // This is inefficient because all the dependent types will be rebuilt
2572 // from scratch, including building them in type units, discovering that
2573 // they depend on addresses, throwing them out and rebuilding them.
2574 CU.constructTypeDIE(RefDie, CTy);
2575 return;
2576 }
2577
2578 // If the type wasn't dependent on fission addresses, finish adding the type
2579 // and all its dependent types.
2580 for (auto &TU : TypeUnitsToAdd) {
2581 if (useSplitDwarf())
2582 TU.first->setSkeleton(constructSkeletonTU(*TU.first));
2583 InfoHolder.addUnit(std::move(TU.first));
2584 }
2585 }
David Blaikief9b6a552014-04-22 22:39:41 +00002586 CU.addDIETypeSignature(RefDie, NewTU);
David Blaikie409dd9c2013-11-19 23:08:21 +00002587}
David Blaikie4bd13b72014-03-07 18:49:45 +00002588
David Blaikie65a74662014-04-25 18:26:14 +00002589void DwarfDebug::attachLowHighPC(DwarfCompileUnit &Unit, DIE &D,
David Blaikie4bd13b72014-03-07 18:49:45 +00002590 MCSymbol *Begin, MCSymbol *End) {
David Blaikief9b6a552014-04-22 22:39:41 +00002591 Unit.addLabelAddress(D, dwarf::DW_AT_low_pc, Begin);
Adrian Prantl887e7072014-03-07 23:07:21 +00002592 if (DwarfVersion < 4)
David Blaikief9b6a552014-04-22 22:39:41 +00002593 Unit.addLabelAddress(D, dwarf::DW_AT_high_pc, End);
David Blaikie4bd13b72014-03-07 18:49:45 +00002594 else
David Blaikief9b6a552014-04-22 22:39:41 +00002595 Unit.addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin);
David Blaikie4bd13b72014-03-07 18:49:45 +00002596}
David Blaikie2406a0622014-04-23 23:37:35 +00002597
2598// Accelerator table mutators - add each name along with its companion
2599// DIE to the proper table while ensuring that the name that we're going
2600// to reference is in the string table. We do this since the names we
2601// add may not only be identical to the names in the DIE.
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002602void DwarfDebug::addAccelName(StringRef Name, const DIE &Die) {
David Blaikie2406a0622014-04-23 23:37:35 +00002603 if (!useDwarfAccelTables())
2604 return;
David Blaikie772ab8a2014-04-25 22:21:35 +00002605 AccelNames.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2606 &Die);
David Blaikie2406a0622014-04-23 23:37:35 +00002607}
David Blaikie0ee82b92014-04-24 00:53:32 +00002608
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002609void DwarfDebug::addAccelObjC(StringRef Name, const DIE &Die) {
David Blaikie0ee82b92014-04-24 00:53:32 +00002610 if (!useDwarfAccelTables())
2611 return;
David Blaikie772ab8a2014-04-25 22:21:35 +00002612 AccelObjC.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2613 &Die);
David Blaikie0ee82b92014-04-24 00:53:32 +00002614}
David Blaikieecf04152014-04-24 01:02:42 +00002615
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002616void DwarfDebug::addAccelNamespace(StringRef Name, const DIE &Die) {
David Blaikieecf04152014-04-24 01:02:42 +00002617 if (!useDwarfAccelTables())
2618 return;
David Blaikie772ab8a2014-04-25 22:21:35 +00002619 AccelNamespace.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2620 &Die);
David Blaikieecf04152014-04-24 01:02:42 +00002621}
David Blaikie18d33752014-04-24 01:23:49 +00002622
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002623void DwarfDebug::addAccelType(StringRef Name, const DIE &Die, char Flags) {
David Blaikie18d33752014-04-24 01:23:49 +00002624 if (!useDwarfAccelTables())
2625 return;
David Blaikie772ab8a2014-04-25 22:21:35 +00002626 AccelTypes.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2627 &Die);
David Blaikie18d33752014-04-24 01:23:49 +00002628}