blob: a88aebd2d22f248a1dca51a165fb8e9d70600cbd [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
Reid Klecknerdd2647e2014-04-30 20:34:31 +0000221// Define out of line so we don't have to include DwarfUnit.h in DwarfDebug.h.
222DwarfDebug::~DwarfDebug() { }
223
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000224// Switch to the specified MCSection and emit an assembler
225// temporary label to it if SymbolStem is specified.
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000226static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Craig Topper353eda42014-04-24 06:44:33 +0000227 const char *SymbolStem = nullptr) {
Eric Christophera7b61892011-11-07 09:18:38 +0000228 Asm->OutStreamer.SwitchSection(Section);
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000229 if (!SymbolStem)
Craig Topper353eda42014-04-24 06:44:33 +0000230 return nullptr;
Eric Christophera7b61892011-11-07 09:18:38 +0000231
232 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
233 Asm->OutStreamer.EmitLabel(TmpSym);
234 return TmpSym;
235}
236
Eric Christopherd9843b32011-11-10 19:25:34 +0000237static bool isObjCClass(StringRef Name) {
238 return Name.startswith("+") || Name.startswith("-");
239}
240
241static bool hasObjCCategory(StringRef Name) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000242 if (!isObjCClass(Name))
243 return false;
Eric Christopherd9843b32011-11-10 19:25:34 +0000244
Benjamin Kramer260de742013-08-24 12:15:54 +0000245 return Name.find(") ") != StringRef::npos;
Eric Christopherd9843b32011-11-10 19:25:34 +0000246}
247
248static void getObjCClassCategory(StringRef In, StringRef &Class,
249 StringRef &Category) {
250 if (!hasObjCCategory(In)) {
251 Class = In.slice(In.find('[') + 1, In.find(' '));
252 Category = "";
253 return;
254 }
255
256 Class = In.slice(In.find('[') + 1, In.find('('));
257 Category = In.slice(In.find('[') + 1, In.find(' '));
258 return;
259}
260
261static StringRef getObjCMethodName(StringRef In) {
262 return In.slice(In.find(' ') + 1, In.find(']'));
263}
264
Richard Mittonc2508242013-10-03 22:07:08 +0000265// Helper for sorting sections into a stable output order.
266static bool SectionSort(const MCSection *A, const MCSection *B) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000267 std::string LA = (A ? A->getLabelBeginName() : "");
268 std::string LB = (B ? B->getLabelBeginName() : "");
269 return LA < LB;
Richard Mittonc2508242013-10-03 22:07:08 +0000270}
271
Eric Christopherd9843b32011-11-10 19:25:34 +0000272// Add the various names to the Dwarf accelerator table names.
Eric Christopher9cd26af2013-09-20 23:22:52 +0000273// TODO: Determine whether or not we should add names for programs
274// that do not have a DW_AT_name or DW_AT_linkage_name field - this
275// is only slightly different than the lookup of non-standard ObjC names.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000276void DwarfDebug::addSubprogramNames(DISubprogram SP, DIE &Die) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000277 if (!SP.isDefinition())
278 return;
David Blaikie2406a0622014-04-23 23:37:35 +0000279 addAccelName(SP.getName(), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000280
281 // If the linkage name is different than the name, go ahead and output
282 // that as well into the name table.
283 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
David Blaikie2406a0622014-04-23 23:37:35 +0000284 addAccelName(SP.getLinkageName(), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000285
286 // If this is an Objective-C selector name add it to the ObjC accelerator
287 // too.
288 if (isObjCClass(SP.getName())) {
289 StringRef Class, Category;
290 getObjCClassCategory(SP.getName(), Class, Category);
David Blaikie0ee82b92014-04-24 00:53:32 +0000291 addAccelObjC(Class, Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000292 if (Category != "")
David Blaikie0ee82b92014-04-24 00:53:32 +0000293 addAccelObjC(Category, Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000294 // Also add the base method name to the name table.
David Blaikie2406a0622014-04-23 23:37:35 +0000295 addAccelName(getObjCMethodName(SP.getName()), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000296 }
297}
298
Manman Ren3eb9dff2013-09-09 19:05:21 +0000299/// isSubprogramContext - Return true if Context is either a subprogram
300/// or another context nested inside a subprogram.
301bool DwarfDebug::isSubprogramContext(const MDNode *Context) {
302 if (!Context)
303 return false;
304 DIDescriptor D(Context);
305 if (D.isSubprogram())
306 return true;
307 if (D.isType())
Manman Ren116868e2013-09-09 19:47:11 +0000308 return isSubprogramContext(resolve(DIType(Context).getContext()));
Manman Ren3eb9dff2013-09-09 19:05:21 +0000309 return false;
310}
311
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000312// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
313// and DW_AT_high_pc attributes. If there are global variables in this
314// scope then create and insert DIEs for these variables.
David Blaikiee872a6e2014-04-29 15:58:35 +0000315DIE &DwarfDebug::updateSubprogramScopeDIE(DwarfCompileUnit &SPCU,
Eric Christopher4287a492013-12-09 23:57:44 +0000316 DISubprogram SP) {
David Blaikie3c2fff32014-05-27 18:37:48 +0000317 DIE *SPDie = SPCU.getOrCreateSubprogramDIE(SP);
Devang Patela37a95e2010-07-07 22:20:57 +0000318
David Blaikie65a74662014-04-25 18:26:14 +0000319 attachLowHighPC(SPCU, *SPDie, FunctionBeginSym, FunctionEndSym);
Eric Christopher0f63d062013-12-03 00:45:45 +0000320
Chris Lattner3a383cb2010-04-05 00:13:49 +0000321 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
322 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
David Blaikie65a74662014-04-25 18:26:14 +0000323 SPCU.addAddress(*SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patel6efc8e52010-02-06 01:02:37 +0000324
Eric Christopherd9843b32011-11-10 19:25:34 +0000325 // Add name to the name table, we do this here because we're guaranteed
326 // to have concrete versions of our DW_TAG_subprogram nodes.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000327 addSubprogramNames(SP, *SPDie);
Eric Christopher6a841382012-11-19 22:42:10 +0000328
David Blaikiee872a6e2014-04-29 15:58:35 +0000329 return *SPDie;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000330}
331
Manman Ren5b2f4b02013-09-11 19:40:28 +0000332/// Check whether we should create a DIE for the given Scope, return true
333/// if we don't create a DIE (the corresponding DIE is null).
Manman Ren2312ed32013-09-10 18:40:41 +0000334bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
335 if (Scope->isAbstractScope())
336 return false;
337
Manman Ren5b2f4b02013-09-11 19:40:28 +0000338 // We don't create a DIE if there is no Range.
Manman Ren2312ed32013-09-10 18:40:41 +0000339 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
340 if (Ranges.empty())
341 return true;
342
343 if (Ranges.size() > 1)
344 return false;
345
Manman Ren5b2f4b02013-09-11 19:40:28 +0000346 // We don't create a DIE if we have a single Range and the end label
347 // is null.
Manman Ren2312ed32013-09-10 18:40:41 +0000348 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
349 MCSymbol *End = getLabelAfterInsn(RI->second);
350 return !End;
351}
352
David Blaikie65a74662014-04-25 18:26:14 +0000353static void addSectionLabel(AsmPrinter &Asm, DwarfUnit &U, DIE &D,
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000354 dwarf::Attribute A, const MCSymbol *L,
355 const MCSymbol *Sec) {
David Blaikief9b6a552014-04-22 22:39:41 +0000356 if (Asm.MAI->doesDwarfUseRelocationsAcrossSections())
357 U.addSectionLabel(D, A, L);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000358 else
David Blaikief9b6a552014-04-22 22:39:41 +0000359 U.addSectionDelta(D, A, L, Sec);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000360}
361
David Blaikie65a74662014-04-25 18:26:14 +0000362void DwarfDebug::addScopeRangeList(DwarfCompileUnit &TheCU, DIE &ScopeDIE,
Eric Christopherbe2513e2013-12-03 00:45:59 +0000363 const SmallVectorImpl<InsnRange> &Range) {
364 // Emit offset in .debug_range as a relocatable label. emitDIE will handle
365 // emitting it appropriately.
Eric Christopherf8790642013-12-04 22:04:50 +0000366 MCSymbol *RangeSym = Asm->GetTempSymbol("debug_ranges", GlobalRangeCount++);
David Blaikie26b2bd02014-03-24 21:07:27 +0000367
368 // Under fission, ranges are specified by constant offsets relative to the
369 // CU's DW_AT_GNU_ranges_base.
370 if (useSplitDwarf())
David Blaikief9b6a552014-04-22 22:39:41 +0000371 TheCU.addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
David Blaikie637cac42014-04-22 23:09:36 +0000372 DwarfDebugRangeSectionSym);
David Blaikie26b2bd02014-03-24 21:07:27 +0000373 else
David Blaikief9b6a552014-04-22 22:39:41 +0000374 addSectionLabel(*Asm, TheCU, ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
David Blaikie26b2bd02014-03-24 21:07:27 +0000375 DwarfDebugRangeSectionSym);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000376
Eric Christopherf8790642013-12-04 22:04:50 +0000377 RangeSpanList List(RangeSym);
Benjamin Kramer15596c72014-03-07 19:09:39 +0000378 for (const InsnRange &R : Range) {
379 RangeSpan Span(getLabelBeforeInsn(R.first), getLabelAfterInsn(R.second));
Chandler Carruth002da5d2014-03-02 04:08:41 +0000380 List.addRange(std::move(Span));
Eric Christopherbe2513e2013-12-03 00:45:59 +0000381 }
382
383 // Add the range list to the set of ranges to be emitted.
David Blaikief9b6a552014-04-22 22:39:41 +0000384 TheCU.addRangeList(std::move(List));
Eric Christopherbe2513e2013-12-03 00:45:59 +0000385}
386
David Blaikie4a3b84d2014-05-16 16:42:40 +0000387void DwarfDebug::attachRangesOrLowHighPC(DwarfCompileUnit &TheCU, DIE &Die,
388 const SmallVectorImpl<InsnRange> &Ranges) {
389 assert(!Ranges.empty());
390 if (Ranges.size() == 1)
391 attachLowHighPC(TheCU, Die, getLabelBeforeInsn(Ranges.front().first),
392 getLabelAfterInsn(Ranges.front().second));
393 else
394 addScopeRangeList(TheCU, Die, Ranges);
395}
396
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000397// Construct new DW_TAG_lexical_block for this scope and attach
398// DW_AT_low_pc/DW_AT_high_pc labels.
David Blaikief2449222014-04-28 20:36:45 +0000399std::unique_ptr<DIE>
400DwarfDebug::constructLexicalScopeDIE(DwarfCompileUnit &TheCU,
401 LexicalScope *Scope) {
Manman Ren2312ed32013-09-10 18:40:41 +0000402 if (isLexicalScopeDIENull(Scope))
Craig Topper353eda42014-04-24 06:44:33 +0000403 return nullptr;
Manman Ren2312ed32013-09-10 18:40:41 +0000404
David Blaikief2449222014-04-28 20:36:45 +0000405 auto ScopeDIE = make_unique<DIE>(dwarf::DW_TAG_lexical_block);
Devang Patel6c74a872010-04-27 19:46:33 +0000406 if (Scope->isAbstractScope())
407 return ScopeDIE;
408
David Blaikie4a3b84d2014-05-16 16:42:40 +0000409 attachRangesOrLowHighPC(TheCU, *ScopeDIE, Scope->getRanges());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000410
411 return ScopeDIE;
412}
413
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000414// This scope represents inlined body of a function. Construct DIE to
415// represent this concrete inlined copy of the function.
David Blaikief2449222014-04-28 20:36:45 +0000416std::unique_ptr<DIE>
417DwarfDebug::constructInlinedScopeDIE(DwarfCompileUnit &TheCU,
418 LexicalScope *Scope) {
David Blaikief662f0a2014-05-14 17:58:53 +0000419 assert(Scope->getScopeNode());
Devang Patelf098ce22011-07-27 00:34:13 +0000420 DIScope DS(Scope->getScopeNode());
421 DISubprogram InlinedSP = getDISubprogram(DS);
David Blaikie1ea9db22014-05-21 23:14:12 +0000422 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
423 // was inlined from another compile unit.
David Blaikie2910f622014-05-27 18:37:51 +0000424 DIE *OriginDIE = AbstractSPDies[InlinedSP];
David Blaikie1ea9db22014-05-21 23:14:12 +0000425 assert(OriginDIE && "Unable to find original DIE for an inlined subprogram.");
Devang Patelf098ce22011-07-27 00:34:13 +0000426
David Blaikief2449222014-04-28 20:36:45 +0000427 auto ScopeDIE = make_unique<DIE>(dwarf::DW_TAG_inlined_subroutine);
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000428 TheCU.addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000429
David Blaikie4a3b84d2014-05-16 16:42:40 +0000430 attachRangesOrLowHighPC(TheCU, *ScopeDIE, Scope->getRanges());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000431
432 InlinedSubprogramDIEs.insert(OriginDIE);
433
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000434 // Add the call site information to the DIE.
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000435 DILocation DL(Scope->getInlinedAt());
David Blaikie65a74662014-04-25 18:26:14 +0000436 TheCU.addUInt(*ScopeDIE, dwarf::DW_AT_call_file, None,
David Blaikie637cac42014-04-22 23:09:36 +0000437 TheCU.getOrCreateSourceID(DL.getFilename(), DL.getDirectory()));
David Blaikie65a74662014-04-25 18:26:14 +0000438 TheCU.addUInt(*ScopeDIE, dwarf::DW_AT_call_line, None, DL.getLineNumber());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000439
Eric Christopher8dda5d02011-12-04 06:02:38 +0000440 // Add name to the name table, we do this here because we're guaranteed
441 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000442 addSubprogramNames(InlinedSP, *ScopeDIE);
Eric Christopher6a841382012-11-19 22:42:10 +0000443
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000444 return ScopeDIE;
445}
446
David Blaikie44078b32014-04-30 22:41:33 +0000447static std::unique_ptr<DIE> constructVariableDIE(DwarfCompileUnit &TheCU,
448 DbgVariable &DV,
449 const LexicalScope &Scope,
450 DIE *&ObjectPointer) {
David Blaikieb85f0082014-05-27 19:34:32 +0000451 auto Var = TheCU.constructVariableDIE(DV, Scope.isAbstractScope());
David Blaikie44078b32014-04-30 22:41:33 +0000452 if (DV.isObjectPointer())
453 ObjectPointer = Var.get();
454 return Var;
455}
456
David Blaikie914046e2014-04-25 20:00:34 +0000457DIE *DwarfDebug::createScopeChildrenDIE(
458 DwarfCompileUnit &TheCU, LexicalScope *Scope,
459 SmallVectorImpl<std::unique_ptr<DIE>> &Children) {
Craig Topper353eda42014-04-24 06:44:33 +0000460 DIE *ObjectPointer = nullptr;
Devang Patel6c622ef2011-03-01 22:58:55 +0000461
462 // Collect arguments for current function.
Adrian Prantl3f49c892014-02-25 19:57:42 +0000463 if (LScopes.isCurrentFunctionScope(Scope)) {
David Blaikieafd2c6b2014-04-22 05:41:06 +0000464 for (DbgVariable *ArgDV : CurrentFnArguments)
David Blaikie44078b32014-04-30 22:41:33 +0000465 if (ArgDV)
David Blaikie45aa56b2014-04-26 22:37:45 +0000466 Children.push_back(
David Blaikie44078b32014-04-30 22:41:33 +0000467 constructVariableDIE(TheCU, *ArgDV, *Scope, ObjectPointer));
Devang Patel6c622ef2011-03-01 22:58:55 +0000468
Adrian Prantl69140d22014-02-25 22:27:14 +0000469 // If this is a variadic function, add an unspecified parameter.
Adrian Prantl3f49c892014-02-25 19:57:42 +0000470 DISubprogram SP(Scope->getScopeNode());
Adrian Prantl3f49c892014-02-25 19:57:42 +0000471 DIArray FnArgs = SP.getType().getTypeArray();
Eric Christopher73ffdb82014-02-26 02:50:56 +0000472 if (FnArgs.getElement(FnArgs.getNumElements() - 1)
473 .isUnspecifiedParameter()) {
David Blaikie914046e2014-04-25 20:00:34 +0000474 Children.push_back(
475 make_unique<DIE>(dwarf::DW_TAG_unspecified_parameters));
Adrian Prantl3f49c892014-02-25 19:57:42 +0000476 }
477 }
478
Eric Christopherf84354b2011-10-03 15:49:16 +0000479 // Collect lexical scope children first.
David Blaikie44078b32014-04-30 22:41:33 +0000480 for (DbgVariable *DV : ScopeVariables.lookup(Scope))
481 Children.push_back(constructVariableDIE(TheCU, *DV, *Scope, ObjectPointer));
482
Benjamin Kramer15596c72014-03-07 19:09:39 +0000483 for (LexicalScope *LS : Scope->getChildren())
David Blaikief2449222014-04-28 20:36:45 +0000484 if (std::unique_ptr<DIE> Nested = constructScopeDIE(TheCU, LS))
485 Children.push_back(std::move(Nested));
Manman Ren2312ed32013-09-10 18:40:41 +0000486 return ObjectPointer;
487}
488
David Blaikie4c1089d2014-04-29 23:43:06 +0000489void DwarfDebug::createAndAddScopeChildren(DwarfCompileUnit &TheCU,
David Blaikie899ae612014-04-30 22:58:19 +0000490 LexicalScope *Scope, DIE &ScopeDIE) {
David Blaikied8f0ac72014-04-28 20:27:02 +0000491 // We create children when the scope DIE is not null.
David Blaikiee872a6e2014-04-29 15:58:35 +0000492 SmallVector<std::unique_ptr<DIE>, 8> Children;
David Blaikied8f0ac72014-04-28 20:27:02 +0000493 if (DIE *ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children))
David Blaikie899ae612014-04-30 22:58:19 +0000494 TheCU.addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer);
David Blaikied8f0ac72014-04-28 20:27:02 +0000495
496 // Add children
497 for (auto &I : Children)
David Blaikiee872a6e2014-04-29 15:58:35 +0000498 ScopeDIE.addChild(std::move(I));
499}
500
David Blaikie4c1089d2014-04-29 23:43:06 +0000501void DwarfDebug::constructAbstractSubprogramScopeDIE(DwarfCompileUnit &TheCU,
502 LexicalScope *Scope) {
David Blaikiee872a6e2014-04-29 15:58:35 +0000503 assert(Scope && Scope->getScopeNode());
504 assert(Scope->isAbstractScope());
505 assert(!Scope->getInlinedAt());
506
David Blaikie48602252014-05-23 05:03:23 +0000507 DISubprogram SP(Scope->getScopeNode());
David Blaikiee872a6e2014-04-29 15:58:35 +0000508
David Blaikie482097d2014-05-27 18:37:55 +0000509 ProcessedSPNodes.insert(SP);
510
David Blaikie3c2fff32014-05-27 18:37:48 +0000511 DIE *&AbsDef = AbstractSPDies[SP];
512 if (AbsDef)
David Blaikie4abe19e2014-05-12 18:23:35 +0000513 return;
David Blaikiee872a6e2014-04-29 15:58:35 +0000514
David Blaikie1ea9db22014-05-21 23:14:12 +0000515 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
516 // was inlined from another compile unit.
David Blaikie48602252014-05-23 05:03:23 +0000517 DwarfCompileUnit &SPCU = *SPMap[SP];
David Blaikie482097d2014-05-27 18:37:55 +0000518 DIE *ContextDIE;
David Blaikie3c2fff32014-05-27 18:37:48 +0000519
David Blaikie482097d2014-05-27 18:37:55 +0000520 // Some of this is duplicated from DwarfUnit::getOrCreateSubprogramDIE, with
521 // the important distinction that the DIDescriptor is not associated with the
522 // DIE (since the DIDescriptor will be associated with the concrete DIE, if
523 // any). It could be refactored to some common utility function.
524 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
525 ContextDIE = &SPCU.getUnitDie();
526 SPCU.getOrCreateSubprogramDIE(SPDecl);
527 } else
528 ContextDIE = SPCU.getOrCreateContextDIE(resolve(SP.getContext()));
529
530 // Passing null as the associated DIDescriptor because the abstract definition
531 // shouldn't be found by lookup.
532 AbsDef = &SPCU.createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE,
533 DIDescriptor());
David Blaikie3dca5992014-06-06 22:29:05 +0000534 SPCU.applySubprogramAttributesToDefinition(SP, *AbsDef);
David Blaikie3c2fff32014-05-27 18:37:48 +0000535
David Blaikie48602252014-05-23 05:03:23 +0000536 SPCU.addUInt(*AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
537 createAndAddScopeChildren(SPCU, Scope, *AbsDef);
David Blaikiee872a6e2014-04-29 15:58:35 +0000538}
539
540DIE &DwarfDebug::constructSubprogramScopeDIE(DwarfCompileUnit &TheCU,
541 LexicalScope *Scope) {
542 assert(Scope && Scope->getScopeNode());
543 assert(!Scope->getInlinedAt());
544 assert(!Scope->isAbstractScope());
David Blaikiee872a6e2014-04-29 15:58:35 +0000545 DISubprogram Sub(Scope->getScopeNode());
546
David Blaikie9ba72542014-05-14 21:52:46 +0000547 assert(Sub.isSubprogram());
548
David Blaikiee872a6e2014-04-29 15:58:35 +0000549 ProcessedSPNodes.insert(Sub);
550
551 DIE &ScopeDIE = updateSubprogramScopeDIE(TheCU, Sub);
552
David Blaikie899ae612014-04-30 22:58:19 +0000553 createAndAddScopeChildren(TheCU, Scope, ScopeDIE);
David Blaikied8f0ac72014-04-28 20:27:02 +0000554
555 return ScopeDIE;
556}
557
Manman Ren2312ed32013-09-10 18:40:41 +0000558// Construct a DIE for this scope.
David Blaikief2449222014-04-28 20:36:45 +0000559std::unique_ptr<DIE> DwarfDebug::constructScopeDIE(DwarfCompileUnit &TheCU,
560 LexicalScope *Scope) {
Manman Ren2312ed32013-09-10 18:40:41 +0000561 if (!Scope || !Scope->getScopeNode())
Craig Topper353eda42014-04-24 06:44:33 +0000562 return nullptr;
Manman Ren2312ed32013-09-10 18:40:41 +0000563
Adrian Prantl78619f72014-03-21 22:16:32 +0000564 DIScope DS(Scope->getScopeNode());
Manman Ren2312ed32013-09-10 18:40:41 +0000565
David Blaikied67ffe82014-04-28 22:27:26 +0000566 assert((Scope->getInlinedAt() || !DS.isSubprogram()) &&
567 "Only handle inlined subprograms here, use "
568 "constructSubprogramScopeDIE for non-inlined "
569 "subprograms");
David Blaikied8f0ac72014-04-28 20:27:02 +0000570
David Blaikie914046e2014-04-25 20:00:34 +0000571 SmallVector<std::unique_ptr<DIE>, 8> Children;
Manman Ren2312ed32013-09-10 18:40:41 +0000572
Manman Ren5b2f4b02013-09-11 19:40:28 +0000573 // We try to create the scope DIE first, then the children DIEs. This will
574 // avoid creating un-used children then removing them later when we find out
575 // the scope DIE is null.
David Blaikief2449222014-04-28 20:36:45 +0000576 std::unique_ptr<DIE> ScopeDIE;
David Blaikie48b056b2014-05-19 21:54:31 +0000577 if (Scope->getParent() && DS.isSubprogram()) {
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000578 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
David Blaikied8f0ac72014-04-28 20:27:02 +0000579 if (!ScopeDIE)
580 return nullptr;
581 // We create children when the scope DIE is not null.
582 createScopeChildrenDIE(TheCU, Scope, Children);
David Blaikiee26a3772013-11-18 23:59:04 +0000583 } else {
Manman Ren5b2f4b02013-09-11 19:40:28 +0000584 // Early exit when we know the scope DIE is going to be null.
Manman Ren2312ed32013-09-10 18:40:41 +0000585 if (isLexicalScopeDIENull(Scope))
Craig Topper353eda42014-04-24 06:44:33 +0000586 return nullptr;
Manman Ren5b2f4b02013-09-11 19:40:28 +0000587
588 // We create children here when we know the scope DIE is not going to be
589 // null and the children will be added to the scope DIE.
David Blaikied8f0ac72014-04-28 20:27:02 +0000590 createScopeChildrenDIE(TheCU, Scope, Children);
Manman Ren5b2f4b02013-09-11 19:40:28 +0000591
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000592 // There is no need to emit empty lexical block DIE.
David Blaikie684fc532013-05-06 23:33:07 +0000593 std::pair<ImportedEntityMap::const_iterator,
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000594 ImportedEntityMap::const_iterator> Range =
Eric Christopher793c7472014-04-28 20:42:22 +0000595 std::equal_range(ScopesWithImportedEntities.begin(),
596 ScopesWithImportedEntities.end(),
597 std::pair<const MDNode *, const MDNode *>(DS, nullptr),
598 less_first());
David Blaikie684fc532013-05-06 23:33:07 +0000599 if (Children.empty() && Range.first == Range.second)
Craig Topper353eda42014-04-24 06:44:33 +0000600 return nullptr;
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000601 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Manman Ren2312ed32013-09-10 18:40:41 +0000602 assert(ScopeDIE && "Scope DIE should not be null.");
Eric Christopher5fdd68e2013-06-24 23:20:02 +0000603 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
604 ++i)
David Blaikief2449222014-04-28 20:36:45 +0000605 constructImportedEntityDIE(TheCU, i->second, *ScopeDIE);
Benjamin Kramer892daba2013-08-24 11:55:49 +0000606 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000607
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000608 // Add children
David Blaikie914046e2014-04-25 20:00:34 +0000609 for (auto &I : Children)
610 ScopeDIE->addChild(std::move(I));
Devang Patel04d2f2d2009-11-24 01:14:22 +0000611
Eric Christopherd9843b32011-11-10 19:25:34 +0000612 return ScopeDIE;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000613}
614
David Blaikie65a74662014-04-25 18:26:14 +0000615void DwarfDebug::addGnuPubAttributes(DwarfUnit &U, DIE &D) const {
David Blaikie3c842622013-12-04 21:31:26 +0000616 if (!GenerateGnuPubSections)
617 return;
618
David Blaikief9b6a552014-04-22 22:39:41 +0000619 U.addFlag(D, dwarf::DW_AT_GNU_pubnames);
David Blaikie3c842622013-12-04 21:31:26 +0000620}
621
Eric Christopher4287a492013-12-09 23:57:44 +0000622// Create new DwarfCompileUnit for the given metadata node with tag
Eric Christopher48fef592012-12-20 21:58:40 +0000623// DW_TAG_compile_unit.
David Blaikief9b6a552014-04-22 22:39:41 +0000624DwarfCompileUnit &DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) {
Devang Patel2d9caf92009-11-25 17:36:49 +0000625 StringRef FN = DIUnit.getFilename();
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000626 CompilationDir = DIUnit.getDirectory();
Bill Wendling2b128d72009-05-20 23:19:06 +0000627
David Blaikief9b6a552014-04-22 22:39:41 +0000628 auto OwnedUnit = make_unique<DwarfCompileUnit>(
David Blaikiebd579052014-04-28 21:14:27 +0000629 InfoHolder.getUnits().size(), DIUnit, Asm, this, &InfoHolder);
David Blaikief9b6a552014-04-22 22:39:41 +0000630 DwarfCompileUnit &NewCU = *OwnedUnit;
David Blaikie92a2f8a2014-04-28 21:04:29 +0000631 DIE &Die = NewCU.getUnitDie();
David Blaikief9b6a552014-04-22 22:39:41 +0000632 InfoHolder.addUnit(std::move(OwnedUnit));
633
David Blaikie7ac51492014-03-20 17:05:45 +0000634 // LTO with assembly output shares a single line table amongst multiple CUs.
635 // To avoid the compilation directory being ambiguous, let the line table
636 // explicitly describe the directory of all files, never relying on the
637 // compilation directory.
David Blaikie47f4b822014-03-19 00:11:28 +0000638 if (!Asm->OutStreamer.hasRawTextSupport() || SingleCU)
David Blaikiee05274d2014-03-18 00:11:48 +0000639 Asm->OutStreamer.getContext().setMCLineTableCompilationDir(
David Blaikief9b6a552014-04-22 22:39:41 +0000640 NewCU.getUniqueID(), CompilationDir);
David Blaikie2666e242013-12-06 19:38:46 +0000641
David Blaikie92a2f8a2014-04-28 21:04:29 +0000642 NewCU.addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
643 NewCU.addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
David Blaikie637cac42014-04-22 23:09:36 +0000644 DIUnit.getLanguage());
David Blaikie92a2f8a2014-04-28 21:04:29 +0000645 NewCU.addString(Die, dwarf::DW_AT_name, FN);
Eric Christopher52ce7182013-04-09 19:23:15 +0000646
Eric Christopher52ce7182013-04-09 19:23:15 +0000647 if (!useSplitDwarf()) {
David Blaikief9b6a552014-04-22 22:39:41 +0000648 NewCU.initStmtList(DwarfLineSectionSym);
Eric Christophera51d3fc2013-09-27 22:50:48 +0000649
650 // If we're using split dwarf the compilation dir is going to be in the
651 // skeleton CU and so we don't need to duplicate it here.
652 if (!CompilationDir.empty())
David Blaikie92a2f8a2014-04-28 21:04:29 +0000653 NewCU.addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christophera51d3fc2013-09-27 22:50:48 +0000654
David Blaikie92a2f8a2014-04-28 21:04:29 +0000655 addGnuPubAttributes(NewCU, Die);
Eric Christopher52ce7182013-04-09 19:23:15 +0000656 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000657
Bill Wendling2b128d72009-05-20 23:19:06 +0000658 if (DIUnit.isOptimized())
David Blaikie92a2f8a2014-04-28 21:04:29 +0000659 NewCU.addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendling2b128d72009-05-20 23:19:06 +0000660
Devang Patel2d9caf92009-11-25 17:36:49 +0000661 StringRef Flags = DIUnit.getFlags();
662 if (!Flags.empty())
David Blaikie92a2f8a2014-04-28 21:04:29 +0000663 NewCU.addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher6a841382012-11-19 22:42:10 +0000664
Nick Lewycky479a8fe2011-10-17 23:27:36 +0000665 if (unsigned RVer = DIUnit.getRunTimeVersion())
David Blaikie92a2f8a2014-04-28 21:04:29 +0000666 NewCU.addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
David Blaikie637cac42014-04-22 23:09:36 +0000667 dwarf::DW_FORM_data1, RVer);
Bill Wendling2b128d72009-05-20 23:19:06 +0000668
Devang Patel1a0df9a2010-05-10 22:49:55 +0000669 if (!FirstCU)
David Blaikief9b6a552014-04-22 22:39:41 +0000670 FirstCU = &NewCU;
Eric Christopher7a2cdf72013-02-05 07:31:55 +0000671
Eric Christopherd4368fd2014-01-02 21:03:28 +0000672 if (useSplitDwarf()) {
David Blaikief9b6a552014-04-22 22:39:41 +0000673 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoDWOSection(),
David Blaikie637cac42014-04-22 23:09:36 +0000674 DwarfInfoDWOSectionSym);
David Blaikief9b6a552014-04-22 22:39:41 +0000675 NewCU.setSkeleton(constructSkeletonCU(NewCU));
Eric Christopherd4368fd2014-01-02 21:03:28 +0000676 } else
David Blaikief9b6a552014-04-22 22:39:41 +0000677 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
David Blaikie637cac42014-04-22 23:09:36 +0000678 DwarfInfoSectionSym);
Eric Christopherd039baa2013-12-30 03:40:32 +0000679
David Blaikief9b6a552014-04-22 22:39:41 +0000680 CUMap.insert(std::make_pair(DIUnit, &NewCU));
David Blaikie92a2f8a2014-04-28 21:04:29 +0000681 CUDieMap.insert(std::make_pair(&Die, &NewCU));
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000682 return NewCU;
Devang Patel1a0df9a2010-05-10 22:49:55 +0000683}
684
David Blaikief9b6a552014-04-22 22:39:41 +0000685void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
David Blaikief55abea2013-04-22 06:12:31 +0000686 const MDNode *N) {
David Blaikie1fd43652013-05-07 21:35:53 +0000687 DIImportedEntity Module(N);
David Blaikie5e390e42014-02-04 01:23:52 +0000688 assert(Module.Verify());
David Blaikief9b6a552014-04-22 22:39:41 +0000689 if (DIE *D = TheCU.getOrCreateContextDIE(Module.getContext()))
David Blaikief2449222014-04-28 20:36:45 +0000690 constructImportedEntityDIE(TheCU, Module, *D);
David Blaikie684fc532013-05-06 23:33:07 +0000691}
692
David Blaikief9b6a552014-04-22 22:39:41 +0000693void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
David Blaikief2449222014-04-28 20:36:45 +0000694 const MDNode *N, DIE &Context) {
David Blaikie1fd43652013-05-07 21:35:53 +0000695 DIImportedEntity Module(N);
David Blaikie5e390e42014-02-04 01:23:52 +0000696 assert(Module.Verify());
David Blaikie4dd2de72013-05-08 06:01:38 +0000697 return constructImportedEntityDIE(TheCU, Module, Context);
David Blaikie684fc532013-05-06 23:33:07 +0000698}
699
David Blaikief9b6a552014-04-22 22:39:41 +0000700void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
David Blaikie1fd43652013-05-07 21:35:53 +0000701 const DIImportedEntity &Module,
David Blaikief2449222014-04-28 20:36:45 +0000702 DIE &Context) {
David Blaikie684fc532013-05-06 23:33:07 +0000703 assert(Module.Verify() &&
704 "Use one of the MDNode * overloads to handle invalid metadata");
David Blaikief2449222014-04-28 20:36:45 +0000705 DIE &IMDie = TheCU.createAndAddDIE(Module.getTag(), Context, Module);
David Blaikie1fd43652013-05-07 21:35:53 +0000706 DIE *EntityDie;
Adrian Prantld09ba232014-04-01 03:41:04 +0000707 DIDescriptor Entity = resolve(Module.getEntity());
David Blaikie1fd43652013-05-07 21:35:53 +0000708 if (Entity.isNameSpace())
David Blaikief9b6a552014-04-22 22:39:41 +0000709 EntityDie = TheCU.getOrCreateNameSpace(DINameSpace(Entity));
David Blaikie1fd43652013-05-07 21:35:53 +0000710 else if (Entity.isSubprogram())
David Blaikief9b6a552014-04-22 22:39:41 +0000711 EntityDie = TheCU.getOrCreateSubprogramDIE(DISubprogram(Entity));
David Blaikie3b6038b2013-05-08 06:01:41 +0000712 else if (Entity.isType())
David Blaikief9b6a552014-04-22 22:39:41 +0000713 EntityDie = TheCU.getOrCreateTypeDIE(DIType(Entity));
David Blaikie1fd43652013-05-07 21:35:53 +0000714 else
David Blaikief9b6a552014-04-22 22:39:41 +0000715 EntityDie = TheCU.getDIE(Entity);
716 TheCU.addSourceLine(IMDie, Module.getLineNumber(),
David Blaikie637cac42014-04-22 23:09:36 +0000717 Module.getContext().getFilename(),
718 Module.getContext().getDirectory());
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000719 TheCU.addDIEEntry(IMDie, dwarf::DW_AT_import, *EntityDie);
David Blaikiee63d5d12013-05-20 22:50:35 +0000720 StringRef Name = Module.getName();
721 if (!Name.empty())
David Blaikief9b6a552014-04-22 22:39:41 +0000722 TheCU.addString(IMDie, dwarf::DW_AT_name, Name);
David Blaikief55abea2013-04-22 06:12:31 +0000723}
724
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000725// Emit all Dwarf sections that should come prior to the content. Create
726// global DIEs and emit initial debug info sections. This is invoked by
727// the target AsmPrinter.
Eric Christopher58f41952012-11-19 22:42:15 +0000728void DwarfDebug::beginModule() {
Devang Patel6c74a872010-04-27 19:46:33 +0000729 if (DisableDebugInfoPrinting)
730 return;
731
Eric Christopher58f41952012-11-19 22:42:15 +0000732 const Module *M = MMI->getModule();
733
Nick Lewycky019d2552011-07-29 03:49:23 +0000734 // If module has named metadata anchors then use them, otherwise scan the
735 // module using debug info finder to collect debug info.
Devang Patele02e5852011-05-03 16:45:22 +0000736 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiedc69ebb2013-03-11 23:39:23 +0000737 if (!CU_Nodes)
Devang Patel07bb9ee2011-08-15 23:47:24 +0000738 return;
Manman Ren60352032013-09-05 18:48:31 +0000739 TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
Devang Patele02e5852011-05-03 16:45:22 +0000740
David Blaikiedc69ebb2013-03-11 23:39:23 +0000741 // Emit initial sections so we can reference labels later.
742 emitSectionLabels();
743
David Blaikie47f4b822014-03-19 00:11:28 +0000744 SingleCU = CU_Nodes->getNumOperands() == 1;
David Blaikiee05274d2014-03-18 00:11:48 +0000745
David Blaikie47f4b822014-03-19 00:11:28 +0000746 for (MDNode *N : CU_Nodes->operands()) {
Benjamin Kramer15596c72014-03-07 19:09:39 +0000747 DICompileUnit CUNode(N);
David Blaikief9b6a552014-04-22 22:39:41 +0000748 DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode);
David Blaikie1fd43652013-05-07 21:35:53 +0000749 DIArray ImportedEntities = CUNode.getImportedEntities();
750 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikie684fc532013-05-06 23:33:07 +0000751 ScopesWithImportedEntities.push_back(std::make_pair(
David Blaikie1fd43652013-05-07 21:35:53 +0000752 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
753 ImportedEntities.getElement(i)));
David Blaikie684fc532013-05-06 23:33:07 +0000754 std::sort(ScopesWithImportedEntities.begin(),
Benjamin Kramerb12cf012013-08-24 12:54:27 +0000755 ScopesWithImportedEntities.end(), less_first());
David Blaikiedc69ebb2013-03-11 23:39:23 +0000756 DIArray GVs = CUNode.getGlobalVariables();
757 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
David Blaikief9b6a552014-04-22 22:39:41 +0000758 CU.createGlobalVariableDIE(DIGlobalVariable(GVs.getElement(i)));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000759 DIArray SPs = CUNode.getSubprograms();
760 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
David Blaikie3c2fff32014-05-27 18:37:48 +0000761 SPMap.insert(std::make_pair(SPs.getElement(i), &CU));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000762 DIArray EnumTypes = CUNode.getEnumTypes();
763 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
David Blaikief9b6a552014-04-22 22:39:41 +0000764 CU.getOrCreateTypeDIE(EnumTypes.getElement(i));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000765 DIArray RetainedTypes = CUNode.getRetainedTypes();
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000766 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i) {
767 DIType Ty(RetainedTypes.getElement(i));
768 // The retained types array by design contains pointers to
769 // MDNodes rather than DIRefs. Unique them here.
770 DIType UniqueTy(resolve(Ty.getRef()));
David Blaikief9b6a552014-04-22 22:39:41 +0000771 CU.getOrCreateTypeDIE(UniqueTy);
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000772 }
David Blaikief55abea2013-04-22 06:12:31 +0000773 // Emit imported_modules last so that the relevant context is already
774 // available.
David Blaikie1fd43652013-05-07 21:35:53 +0000775 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
776 constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000777 }
Eric Christopher6a841382012-11-19 22:42:10 +0000778
Chris Lattner7cfa70e2010-04-05 02:19:28 +0000779 // Tell MMI that we have debug info.
780 MMI->setDebugInfoAvailability(true);
Eric Christopher6a841382012-11-19 22:42:10 +0000781
Bill Wendling2b128d72009-05-20 23:19:06 +0000782 // Prime section data.
Richard Mitton21101b32013-09-19 23:21:01 +0000783 SectionMap[Asm->getObjFileLowering().getTextSection()];
Bill Wendling2b128d72009-05-20 23:19:06 +0000784}
785
David Blaikieeb1a2722014-06-13 22:18:23 +0000786void DwarfDebug::finishVariableDefinitions() {
787 for (const auto &Var : ConcreteVariables) {
788 DIE *VariableDie = Var->getDIE();
David Blaikieb9597a82014-06-15 19:34:26 +0000789 // FIXME: There shouldn't be any variables without DIEs.
790 if (!VariableDie)
791 continue;
David Blaikieeb1a2722014-06-13 22:18:23 +0000792 // FIXME: Consider the time-space tradeoff of just storing the unit pointer
793 // in the ConcreteVariables list, rather than looking it up again here.
794 // DIE::getUnit isn't simple - it walks parent pointers, etc.
795 DwarfCompileUnit *Unit = lookupUnit(VariableDie->getUnit());
796 assert(Unit);
David Blaikiee847f132014-06-13 22:35:44 +0000797 DbgVariable *AbsVar = getExistingAbstractVariable(Var->getVariable());
David Blaikieeb1a2722014-06-13 22:18:23 +0000798 if (AbsVar && AbsVar->getDIE()) {
799 Unit->addDIEEntry(*VariableDie, dwarf::DW_AT_abstract_origin,
800 *AbsVar->getDIE());
801 } else
802 Unit->applyVariableAttributes(*Var, *VariableDie);
803 }
804}
805
David Blaikief7221ad2014-05-27 18:37:43 +0000806void DwarfDebug::finishSubprogramDefinitions() {
807 const Module *M = MMI->getModule();
808
809 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
810 for (MDNode *N : CU_Nodes->operands()) {
811 DICompileUnit TheCU(N);
812 // Construct subprogram DIE and add variables DIEs.
813 DwarfCompileUnit *SPCU =
814 static_cast<DwarfCompileUnit *>(CUMap.lookup(TheCU));
815 DIArray Subprograms = TheCU.getSubprograms();
816 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
817 DISubprogram SP(Subprograms.getElement(i));
David Blaikie3c2fff32014-05-27 18:37:48 +0000818 // Perhaps the subprogram is in another CU (such as due to comdat
819 // folding, etc), in which case ignore it here.
820 if (SPMap[SP] != SPCU)
821 continue;
822 DIE *D = SPCU->getDIE(SP);
David Blaikie482097d2014-05-27 18:37:55 +0000823 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SP)) {
824 if (D)
825 // If this subprogram has an abstract definition, reference that
826 SPCU->addDIEEntry(*D, dwarf::DW_AT_abstract_origin, *AbsSPDIE);
827 } else {
828 if (!D)
829 // Lazily construct the subprogram if we didn't see either concrete or
830 // inlined versions during codegen.
831 D = SPCU->getOrCreateSubprogramDIE(SP);
832 // And attach the attributes
David Blaikie3dca5992014-06-06 22:29:05 +0000833 SPCU->applySubprogramAttributesToDefinition(SP, *D);
David Blaikie482097d2014-05-27 18:37:55 +0000834 }
David Blaikief7221ad2014-05-27 18:37:43 +0000835 }
836 }
837}
838
839
Eric Christopher960ac372012-11-22 00:59:49 +0000840// Collect info for variables that were optimized out.
841void DwarfDebug::collectDeadVariables() {
842 const Module *M = MMI->getModule();
Eric Christopher960ac372012-11-22 00:59:49 +0000843
844 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
Benjamin Kramer15596c72014-03-07 19:09:39 +0000845 for (MDNode *N : CU_Nodes->operands()) {
846 DICompileUnit TheCU(N);
David Blaikie9ba72542014-05-14 21:52:46 +0000847 // Construct subprogram DIE and add variables DIEs.
848 DwarfCompileUnit *SPCU =
849 static_cast<DwarfCompileUnit *>(CUMap.lookup(TheCU));
850 assert(SPCU && "Unable to find Compile Unit!");
Eric Christopher960ac372012-11-22 00:59:49 +0000851 DIArray Subprograms = TheCU.getSubprograms();
852 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopher735401c2012-11-27 00:13:51 +0000853 DISubprogram SP(Subprograms.getElement(i));
Eric Christophera6c38a32013-10-15 23:31:38 +0000854 if (ProcessedSPNodes.count(SP) != 0)
855 continue;
David Blaikie7af6e6f2014-05-14 21:52:37 +0000856 assert(SP.isSubprogram() &&
857 "CU's subprogram list contains a non-subprogram");
David Blaikie48369d12014-05-16 22:21:45 +0000858 assert(SP.isDefinition() &&
859 "CU's subprogram list contains a subprogram declaration");
Eric Christopher735401c2012-11-27 00:13:51 +0000860 DIArray Variables = SP.getVariables();
Eric Christophera6c38a32013-10-15 23:31:38 +0000861 if (Variables.getNumElements() == 0)
862 continue;
Eric Christopher960ac372012-11-22 00:59:49 +0000863
David Blaikie482097d2014-05-27 18:37:55 +0000864 DIE *SPDIE = AbstractSPDies.lookup(SP);
865 if (!SPDIE)
866 SPDIE = SPCU->getDIE(SP);
David Blaikie8729bca2014-05-22 00:48:36 +0000867 assert(SPDIE);
Eric Christopher735401c2012-11-27 00:13:51 +0000868 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
869 DIVariable DV(Variables.getElement(vi));
David Blaikie9ba72542014-05-14 21:52:46 +0000870 assert(DV.isVariable());
David Blaikie6f9e8672014-06-13 23:52:55 +0000871 DbgVariable NewVar(DV, this);
David Blaikieeb1a2722014-06-13 22:18:23 +0000872 auto VariableDie = SPCU->constructVariableDIE(NewVar);
873 SPCU->applyVariableAttributes(NewVar, *VariableDie);
874 SPDIE->addChild(std::move(VariableDie));
Eric Christopher735401c2012-11-27 00:13:51 +0000875 }
Eric Christopher960ac372012-11-22 00:59:49 +0000876 }
877 }
878 }
Eric Christopher960ac372012-11-22 00:59:49 +0000879}
880
881void DwarfDebug::finalizeModuleInfo() {
David Blaikie3c2fff32014-05-27 18:37:48 +0000882 finishSubprogramDefinitions();
883
David Blaikieeb1a2722014-06-13 22:18:23 +0000884 finishVariableDefinitions();
885
Eric Christopher960ac372012-11-22 00:59:49 +0000886 // Collect info for variables that were optimized out.
887 collectDeadVariables();
888
Eric Christopherad10cb52013-12-04 23:24:38 +0000889 // Handle anything that needs to be done on a per-unit basis after
890 // all other generation.
David Blaikiec33b3cd2014-04-22 21:27:37 +0000891 for (const auto &TheU : getUnits()) {
Eric Christopher60eb7692013-08-12 20:27:48 +0000892 // Emit DW_AT_containing_type attribute to connect types with their
893 // vtable holding type.
David Blaikie2a80e442013-12-02 22:09:48 +0000894 TheU->constructContainingTypeDIEs();
Eric Christopher60eb7692013-08-12 20:27:48 +0000895
Eric Christopher46e23432013-12-20 04:16:18 +0000896 // Add CU specific attributes if we need to add any.
David Blaikieadcde362014-04-25 18:35:57 +0000897 if (TheU->getUnitDie().getTag() == dwarf::DW_TAG_compile_unit) {
Eric Christopher46e23432013-12-20 04:16:18 +0000898 // If we're splitting the dwarf out now that we've got the entire
Eric Christopherd8667202013-12-30 17:22:27 +0000899 // CU then add the dwo id to it.
900 DwarfCompileUnit *SkCU =
901 static_cast<DwarfCompileUnit *>(TheU->getSkeleton());
Eric Christopher46e23432013-12-20 04:16:18 +0000902 if (useSplitDwarf()) {
Eric Christopher09d1c0f2014-03-14 21:20:07 +0000903 // Emit a unique identifier for this CU.
David Blaikieadcde362014-04-25 18:35:57 +0000904 uint64_t ID = DIEHash(Asm).computeCUSignature(TheU->getUnitDie());
905 TheU->addUInt(TheU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher46e23432013-12-20 04:16:18 +0000906 dwarf::DW_FORM_data8, ID);
David Blaikieadcde362014-04-25 18:35:57 +0000907 SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher46e23432013-12-20 04:16:18 +0000908 dwarf::DW_FORM_data8, ID);
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000909
910 // We don't keep track of which addresses are used in which CU so this
911 // is a bit pessimistic under LTO.
David Blaikied75fb282014-04-23 21:20:10 +0000912 if (!AddrPool.isEmpty())
David Blaikieadcde362014-04-25 18:35:57 +0000913 addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000914 dwarf::DW_AT_GNU_addr_base, DwarfAddrSectionSym,
915 DwarfAddrSectionSym);
916 if (!TheU->getRangeLists().empty())
David Blaikieadcde362014-04-25 18:35:57 +0000917 addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000918 dwarf::DW_AT_GNU_ranges_base,
919 DwarfDebugRangeSectionSym, DwarfDebugRangeSectionSym);
Eric Christopherd29614f2013-08-13 01:21:55 +0000920 }
Eric Christopherd8667202013-12-30 17:22:27 +0000921
Eric Christopher384f3fe2014-03-20 19:16:16 +0000922 // If we have code split among multiple sections or non-contiguous
923 // ranges of code then emit a DW_AT_ranges attribute on the unit that will
924 // remain in the .o file, otherwise add a DW_AT_low_pc.
925 // FIXME: We should use ranges allow reordering of code ala
926 // .subsections_via_symbols in mach-o. This would mean turning on
927 // ranges for all subprogram DIEs for mach-o.
David Blaikiec33b3cd2014-04-22 21:27:37 +0000928 DwarfCompileUnit &U =
929 SkCU ? *SkCU : static_cast<DwarfCompileUnit &>(*TheU);
Eric Christopher384f3fe2014-03-20 19:16:16 +0000930 unsigned NumRanges = TheU->getRanges().size();
931 if (NumRanges) {
932 if (NumRanges > 1) {
David Blaikieadcde362014-04-25 18:35:57 +0000933 addSectionLabel(*Asm, U, U.getUnitDie(), dwarf::DW_AT_ranges,
David Blaikiec33b3cd2014-04-22 21:27:37 +0000934 Asm->GetTempSymbol("cu_ranges", U.getUniqueID()),
Eric Christopher384f3fe2014-03-20 19:16:16 +0000935 DwarfDebugRangeSectionSym);
Eric Christopher8873ada2014-01-29 22:22:56 +0000936
Eric Christopher384f3fe2014-03-20 19:16:16 +0000937 // A DW_AT_low_pc attribute may also be specified in combination with
938 // DW_AT_ranges to specify the default base address for use in
939 // location lists (see Section 2.6.2) and range lists (see Section
940 // 2.17.3).
David Blaikieadcde362014-04-25 18:35:57 +0000941 U.addUInt(U.getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
David Blaikiec33b3cd2014-04-22 21:27:37 +0000942 0);
Eric Christopher384f3fe2014-03-20 19:16:16 +0000943 } else {
944 RangeSpan &Range = TheU->getRanges().back();
David Blaikieadcde362014-04-25 18:35:57 +0000945 U.addLocalLabelAddress(U.getUnitDie(), dwarf::DW_AT_low_pc,
David Blaikiec33b3cd2014-04-22 21:27:37 +0000946 Range.getStart());
David Blaikieadcde362014-04-25 18:35:57 +0000947 U.addLabelDelta(U.getUnitDie(), dwarf::DW_AT_high_pc, Range.getEnd(),
David Blaikiec33b3cd2014-04-22 21:27:37 +0000948 Range.getStart());
Eric Christopher384f3fe2014-03-20 19:16:16 +0000949 }
950 }
Eric Christopher60eb7692013-08-12 20:27:48 +0000951 }
952 }
953
954 // Compute DIE offsets and sizes.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000955 InfoHolder.computeSizeAndOffsets();
956 if (useSplitDwarf())
957 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher960ac372012-11-22 00:59:49 +0000958}
959
960void DwarfDebug::endSections() {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000961 // Filter labels by section.
Benjamin Kramer15596c72014-03-07 19:09:39 +0000962 for (const SymbolCU &SCU : ArangeLabels) {
Richard Mitton21101b32013-09-19 23:21:01 +0000963 if (SCU.Sym->isInSection()) {
964 // Make a note of this symbol and it's section.
965 const MCSection *Section = &SCU.Sym->getSection();
966 if (!Section->getKind().isMetadata())
967 SectionMap[Section].push_back(SCU);
968 } else {
969 // Some symbols (e.g. common/bss on mach-o) can have no section but still
970 // appear in the output. This sucks as we rely on sections to build
971 // arange spans. We can do it without, but it's icky.
Craig Topper353eda42014-04-24 06:44:33 +0000972 SectionMap[nullptr].push_back(SCU);
Richard Mitton21101b32013-09-19 23:21:01 +0000973 }
974 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000975
Richard Mittonc2508242013-10-03 22:07:08 +0000976 // Build a list of sections used.
977 std::vector<const MCSection *> Sections;
Benjamin Kramer15596c72014-03-07 19:09:39 +0000978 for (const auto &it : SectionMap) {
979 const MCSection *Section = it.first;
Richard Mittonc2508242013-10-03 22:07:08 +0000980 Sections.push_back(Section);
981 }
982
983 // Sort the sections into order.
984 // This is only done to ensure consistent output order across different runs.
985 std::sort(Sections.begin(), Sections.end(), SectionSort);
986
987 // Add terminating symbols for each section.
Benjamin Kramer15596c72014-03-07 19:09:39 +0000988 for (unsigned ID = 0, E = Sections.size(); ID != E; ID++) {
Richard Mittonc2508242013-10-03 22:07:08 +0000989 const MCSection *Section = Sections[ID];
Craig Topper353eda42014-04-24 06:44:33 +0000990 MCSymbol *Sym = nullptr;
Richard Mitton21101b32013-09-19 23:21:01 +0000991
992 if (Section) {
Richard Mittonc2508242013-10-03 22:07:08 +0000993 // We can't call MCSection::getLabelEndName, as it's only safe to do so
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000994 // if we know the section name up-front. For user-created sections, the
Eric Christopher95531b62014-01-29 22:06:21 +0000995 // resulting label may not be valid to use as a label. (section names can
996 // use a greater set of characters on some systems)
Richard Mittonc2508242013-10-03 22:07:08 +0000997 Sym = Asm->GetTempSymbol("debug_end", ID);
Richard Mitton21101b32013-09-19 23:21:01 +0000998 Asm->OutStreamer.SwitchSection(Section);
999 Asm->OutStreamer.EmitLabel(Sym);
1000 }
1001
1002 // Insert a final terminator.
Craig Topper353eda42014-04-24 06:44:33 +00001003 SectionMap[Section].push_back(SymbolCU(nullptr, Sym));
Bill Wendling2b128d72009-05-20 23:19:06 +00001004 }
Eric Christopher960ac372012-11-22 00:59:49 +00001005}
Bill Wendling2b128d72009-05-20 23:19:06 +00001006
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001007// Emit all Dwarf sections that should come after the content.
Eric Christopher960ac372012-11-22 00:59:49 +00001008void DwarfDebug::endModule() {
Craig Toppere73658d2014-04-28 04:05:08 +00001009 assert(CurFn == nullptr);
1010 assert(CurMI == nullptr);
Eric Christopher960ac372012-11-22 00:59:49 +00001011
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001012 if (!FirstCU)
1013 return;
Eric Christopher960ac372012-11-22 00:59:49 +00001014
1015 // End any existing sections.
1016 // TODO: Does this need to happen?
1017 endSections();
1018
1019 // Finalize the debug info for the module.
1020 finalizeModuleInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001021
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001022 emitDebugStr();
Eric Christopher9cd26af2013-09-20 23:22:52 +00001023
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001024 // Emit all the DIEs into a debug info section.
1025 emitDebugInfo();
Eric Christopher4c9b1192012-11-27 00:41:54 +00001026
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001027 // Corresponding abbreviations into a abbrev section.
1028 emitAbbreviations();
Eric Christopher95198f502012-11-27 22:43:42 +00001029
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001030 // Emit info into a debug aranges section.
Eric Christopher02dbadb2014-02-14 01:26:55 +00001031 if (GenerateARangeSection)
1032 emitDebugARanges();
Eric Christopher95198f502012-11-27 22:43:42 +00001033
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001034 // Emit info into a debug ranges section.
1035 emitDebugRanges();
Eric Christopher95198f502012-11-27 22:43:42 +00001036
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001037 if (useSplitDwarf()) {
1038 emitDebugStrDWO();
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001039 emitDebugInfoDWO();
Eric Christopher3c5a1912012-12-19 22:02:53 +00001040 emitDebugAbbrevDWO();
David Blaikie4a2f95f2014-03-18 01:17:26 +00001041 emitDebugLineDWO();
Eric Christopher962c9082013-01-15 23:56:56 +00001042 // Emit DWO addresses.
David Blaikied75fb282014-04-23 21:20:10 +00001043 AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection());
David Blaikie94c1d7f2014-04-02 01:50:20 +00001044 emitDebugLocDWO();
1045 } else
1046 // Emit info into a debug loc section.
1047 emitDebugLoc();
Bill Wendling2b128d72009-05-20 23:19:06 +00001048
Eric Christophera876b822012-08-23 07:32:06 +00001049 // Emit info into the dwarf accelerator table sections.
Eric Christopher20b76a72012-08-23 22:36:40 +00001050 if (useDwarfAccelTables()) {
Eric Christopher4996c702011-11-07 09:24:32 +00001051 emitAccelNames();
1052 emitAccelObjC();
1053 emitAccelNamespaces();
1054 emitAccelTypes();
1055 }
Eric Christopher6a841382012-11-19 22:42:10 +00001056
Eric Christopher4b358182013-08-30 00:40:17 +00001057 // Emit the pubnames and pubtypes sections if requested.
1058 if (HasDwarfPubSections) {
David Blaikie70a33202013-09-19 17:33:35 +00001059 emitDebugPubNames(GenerateGnuPubSections);
1060 emitDebugPubTypes(GenerateGnuPubSections);
Eric Christopher4b358182013-08-30 00:40:17 +00001061 }
Devang Patel04d2f2d2009-11-24 01:14:22 +00001062
Devang Pateld0701282010-08-02 17:32:15 +00001063 // clean up.
Devang Pateleb1bb4e2011-08-16 22:09:43 +00001064 SPMap.clear();
David Blaikie825bdd22014-05-21 22:41:17 +00001065 AbstractVariables.clear();
Eric Christopher8afd7b62012-12-10 19:51:18 +00001066
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001067 // Reset these for the next Module if we have one.
Craig Topper353eda42014-04-24 06:44:33 +00001068 FirstCU = nullptr;
Bill Wendling2b128d72009-05-20 23:19:06 +00001069}
1070
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001071// Find abstract variable, if any, associated with Var.
David Blaikiebe7c6772014-06-13 22:29:31 +00001072DbgVariable *DwarfDebug::getExistingAbstractVariable(const DIVariable &DV,
David Blaikie36408e72014-06-04 23:50:52 +00001073 DIVariable &Cleansed) {
Devang Patelbb23a4a2011-08-10 21:50:54 +00001074 LLVMContext &Ctx = DV->getContext();
1075 // More then one inlined variable corresponds to one abstract variable.
David Blaikie36408e72014-06-04 23:50:52 +00001076 // FIXME: This duplication of variables when inlining should probably be
1077 // removed. It's done to allow each DIVariable to describe its location
1078 // because the DebugLoc on the dbg.value/declare isn't accurate. We should
1079 // make it accurate then remove this duplication/cleansing stuff.
1080 Cleansed = cleanseInlinedVariable(DV, Ctx);
1081 auto I = AbstractVariables.find(Cleansed);
David Blaikie825bdd22014-05-21 22:41:17 +00001082 if (I != AbstractVariables.end())
1083 return I->second.get();
David Blaikie36408e72014-06-04 23:50:52 +00001084 return nullptr;
1085}
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001086
David Blaikiee847f132014-06-13 22:35:44 +00001087DbgVariable *DwarfDebug::getExistingAbstractVariable(const DIVariable &DV) {
1088 DIVariable Cleansed;
1089 return getExistingAbstractVariable(DV, Cleansed);
1090}
1091
David Blaikie6f9e8672014-06-13 23:52:55 +00001092void DwarfDebug::createAbstractVariable(const DIVariable &Var,
1093 LexicalScope *Scope) {
1094 auto AbsDbgVariable = make_unique<DbgVariable>(Var, this);
David Blaikie825bdd22014-05-21 22:41:17 +00001095 addScopeVariable(Scope, AbsDbgVariable.get());
David Blaikie6f9e8672014-06-13 23:52:55 +00001096 AbstractVariables[Var] = std::move(AbsDbgVariable);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001097}
1098
David Blaikie6f9e8672014-06-13 23:52:55 +00001099void DwarfDebug::ensureAbstractVariableIsCreated(const DIVariable &DV,
1100 const MDNode *ScopeNode) {
David Blaikie36408e72014-06-04 23:50:52 +00001101 DIVariable Cleansed = DV;
David Blaikie6f9e8672014-06-13 23:52:55 +00001102 if (getExistingAbstractVariable(DV, Cleansed))
1103 return;
David Blaikie36408e72014-06-04 23:50:52 +00001104
David Blaikie6f9e8672014-06-13 23:52:55 +00001105 createAbstractVariable(Cleansed, LScopes.getOrCreateAbstractScope(ScopeNode));
David Blaikie36408e72014-06-04 23:50:52 +00001106}
1107
David Blaikie6f9e8672014-06-13 23:52:55 +00001108void
1109DwarfDebug::ensureAbstractVariableIsCreatedIfScoped(const DIVariable &DV,
1110 const MDNode *ScopeNode) {
David Blaikie36408e72014-06-04 23:50:52 +00001111 DIVariable Cleansed = DV;
David Blaikie6f9e8672014-06-13 23:52:55 +00001112 if (getExistingAbstractVariable(DV, Cleansed))
1113 return;
David Blaikie36408e72014-06-04 23:50:52 +00001114
1115 if (LexicalScope *Scope = LScopes.findAbstractScope(ScopeNode))
David Blaikie6f9e8672014-06-13 23:52:55 +00001116 createAbstractVariable(Cleansed, Scope);
David Blaikie36408e72014-06-04 23:50:52 +00001117}
1118
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001119// If Var is a current function argument then add it to CurrentFnArguments list.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001120bool DwarfDebug::addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope) {
Devang Patel7e623022011-08-10 20:55:27 +00001121 if (!LScopes.isCurrentFunctionScope(Scope))
David Blaikieafd2c6b2014-04-22 05:41:06 +00001122 return false;
1123 DIVariable DV = Var->getVariable();
Devang Patel6c622ef2011-03-01 22:58:55 +00001124 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
David Blaikieafd2c6b2014-04-22 05:41:06 +00001125 return false;
Devang Patel6c622ef2011-03-01 22:58:55 +00001126 unsigned ArgNo = DV.getArgNumber();
Eric Christopher6a841382012-11-19 22:42:10 +00001127 if (ArgNo == 0)
David Blaikieafd2c6b2014-04-22 05:41:06 +00001128 return false;
Devang Patel6c622ef2011-03-01 22:58:55 +00001129
David Blaikieafd2c6b2014-04-22 05:41:06 +00001130 size_t Size = CurrentFnArguments.size();
1131 if (Size == 0)
1132 CurrentFnArguments.resize(CurFn->getFunction()->arg_size());
1133 // llvm::Function argument size is not good indicator of how many
1134 // arguments does the function have at source level.
1135 if (ArgNo > Size)
1136 CurrentFnArguments.resize(ArgNo * 2);
1137 CurrentFnArguments[ArgNo - 1] = Var;
1138 return true;
Devang Patel6c622ef2011-03-01 22:58:55 +00001139}
1140
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001141// Collect variable information from side table maintained by MMI.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001142void DwarfDebug::collectVariableInfoFromMMITable(
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001143 SmallPtrSet<const MDNode *, 16> &Processed) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00001144 for (const auto &VI : MMI->getVariableDbgInfo()) {
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001145 if (!VI.Var)
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001146 continue;
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001147 Processed.insert(VI.Var);
1148 DIVariable DV(VI.Var);
1149 LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001150
Devang Patelcdb7d442009-11-10 23:20:04 +00001151 // If variable scope is not found then skip this variable.
Craig Topper353eda42014-04-24 06:44:33 +00001152 if (!Scope)
Devang Patelcdb7d442009-11-10 23:20:04 +00001153 continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001154
David Blaikie6f9e8672014-06-13 23:52:55 +00001155 ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode());
1156 ConcreteVariables.push_back(make_unique<DbgVariable>(DV, this));
David Blaikieeb1a2722014-06-13 22:18:23 +00001157 DbgVariable *RegVar = ConcreteVariables.back().get();
David Blaikieafd2c6b2014-04-22 05:41:06 +00001158 RegVar->setFrameIndex(VI.Slot);
David Blaikie087e7202014-06-05 01:04:20 +00001159 addScopeVariable(Scope, RegVar);
Devang Patel475d32a2009-10-06 01:26:37 +00001160 }
Devang Patel490c8ab2010-05-20 19:57:06 +00001161}
Devang Patela3e9c9c2010-03-15 18:33:46 +00001162
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001163// Get .debug_loc entry for the instruction range starting at MI.
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001164static DebugLocEntry::Value getDebugLocValue(const MachineInstr *MI) {
Adrian Prantl7f487772014-04-10 17:39:48 +00001165 const MDNode *Var = MI->getDebugVariable();
Devang Patel2442a892011-07-08 17:09:57 +00001166
David Blaikie0252265b2013-06-16 20:34:15 +00001167 assert(MI->getNumOperands() == 3);
Adrian Prantl418d1d12013-07-09 20:28:37 +00001168 if (MI->getOperand(0).isReg()) {
Devang Patel2442a892011-07-08 17:09:57 +00001169 MachineLocation MLoc;
Adrian Prantl418d1d12013-07-09 20:28:37 +00001170 // If the second operand is an immediate, this is a
1171 // register-indirect address.
1172 if (!MI->getOperand(1).isImm())
Adrian Prantld4c0dd42013-04-26 21:57:17 +00001173 MLoc.set(MI->getOperand(0).getReg());
1174 else
1175 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001176 return DebugLocEntry::Value(Var, MLoc);
Devang Patel2442a892011-07-08 17:09:57 +00001177 }
1178 if (MI->getOperand(0).isImm())
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001179 return DebugLocEntry::Value(Var, MI->getOperand(0).getImm());
Devang Patel2442a892011-07-08 17:09:57 +00001180 if (MI->getOperand(0).isFPImm())
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001181 return DebugLocEntry::Value(Var, MI->getOperand(0).getFPImm());
Devang Patel2442a892011-07-08 17:09:57 +00001182 if (MI->getOperand(0).isCImm())
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001183 return DebugLocEntry::Value(Var, MI->getOperand(0).getCImm());
Devang Patel2442a892011-07-08 17:09:57 +00001184
Craig Topperee4dab52012-02-05 08:31:47 +00001185 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel2442a892011-07-08 17:09:57 +00001186}
1187
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001188// Find variables for each lexical scope.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001189void
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001190DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &Processed) {
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001191 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1192 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001193
Eric Christopher270a12c2013-07-03 21:37:03 +00001194 // Grab the variable info that was squirreled away in the MMI side-table.
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001195 collectVariableInfoFromMMITable(Processed);
Devang Patel490c8ab2010-05-20 19:57:06 +00001196
Alexey Samsonov0436caa2014-04-30 23:02:40 +00001197 for (const auto &I : DbgValues) {
1198 DIVariable DV(I.first);
1199 if (Processed.count(DV))
Devang Patel490c8ab2010-05-20 19:57:06 +00001200 continue;
1201
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001202 // Instruction ranges, specifying where DV is accessible.
1203 const auto &Ranges = I.second;
1204 if (Ranges.empty())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001205 continue;
Devang Patel9fc11702010-05-25 23:40:22 +00001206
Craig Topper353eda42014-04-24 06:44:33 +00001207 LexicalScope *Scope = nullptr;
Devang Patel7a9dedf2010-05-27 20:25:04 +00001208 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001209 DISubprogram(DV.getContext()).describes(CurFn->getFunction()))
Devang Patel7e623022011-08-10 20:55:27 +00001210 Scope = LScopes.getCurrentFunctionScope();
David Blaikie9b8c8cd2014-05-14 01:08:28 +00001211 else if (MDNode *IA = DV.getInlinedAt()) {
1212 DebugLoc DL = DebugLoc::getFromDILocation(IA);
1213 Scope = LScopes.findInlinedScope(DebugLoc::get(
1214 DL.getLine(), DL.getCol(), DV.getContext(), IA));
1215 } else
1216 Scope = LScopes.findLexicalScope(DV.getContext());
Devang Patel490c8ab2010-05-20 19:57:06 +00001217 // If variable scope is not found then skip this variable.
Devang Patelfbd6c452010-05-21 00:10:20 +00001218 if (!Scope)
Devang Patel490c8ab2010-05-20 19:57:06 +00001219 continue;
1220
1221 Processed.insert(DV);
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001222 const MachineInstr *MInsn = Ranges.front().first;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001223 assert(MInsn->isDebugValue() && "History must begin with debug value");
David Blaikie6f9e8672014-06-13 23:52:55 +00001224 ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode());
1225 ConcreteVariables.push_back(make_unique<DbgVariable>(MInsn, this));
David Blaikieeb1a2722014-06-13 22:18:23 +00001226 DbgVariable *RegVar = ConcreteVariables.back().get();
David Blaikie087e7202014-06-05 01:04:20 +00001227 addScopeVariable(Scope, RegVar);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001228
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001229 // Check if the first DBG_VALUE is valid for the rest of the function.
Adrian Prantlc1197542014-05-30 21:10:13 +00001230 if (Ranges.size() == 1 && Ranges.front().second == nullptr)
Devang Patel9fc11702010-05-25 23:40:22 +00001231 continue;
Devang Patel9fc11702010-05-25 23:40:22 +00001232
Eric Christopher59cc0712013-01-28 17:33:26 +00001233 // Handle multiple DBG_VALUE instructions describing one variable.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001234 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001235
David Blaikie0a456de2014-04-02 01:43:18 +00001236 DotDebugLocEntries.resize(DotDebugLocEntries.size() + 1);
1237 DebugLocList &LocList = DotDebugLocEntries.back();
1238 LocList.Label =
1239 Asm->GetTempSymbol("debug_loc", DotDebugLocEntries.size() - 1);
1240 SmallVector<DebugLocEntry, 4> &DebugLoc = LocList.List;
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001241 for (auto I = Ranges.begin(), E = Ranges.end(); I != E; ++I) {
1242 const MachineInstr *Begin = I->first;
1243 const MachineInstr *End = I->second;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001244 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesen9c057ee2011-03-22 00:21:41 +00001245
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001246 // Check if a variable is unaccessible in this range.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001247 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg() &&
1248 !Begin->getOperand(0).getReg())
Devang Patele7181b52011-06-01 23:00:17 +00001249 continue;
Alexey Samsonov45d638a2014-06-05 23:10:19 +00001250 DEBUG(dbgs() << "DotDebugLoc Pair:\n" << "\t" << *Begin);
1251 if (End != nullptr)
1252 DEBUG(dbgs() << "\t" << *End);
1253 else
1254 DEBUG(dbgs() << "\tNULL\n");
Devang Patele7181b52011-06-01 23:00:17 +00001255
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001256 const MCSymbol *StartLabel = getLabelBeforeInsn(Begin);
1257 assert(StartLabel && "Forgot label before DBG_VALUE starting a range!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001258
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001259 const MCSymbol *EndLabel;
1260 if (End != nullptr)
1261 EndLabel = getLabelAfterInsn(End);
1262 else if (std::next(I) == Ranges.end())
1263 EndLabel = FunctionEndSym;
1264 else
1265 EndLabel = getLabelBeforeInsn(std::next(I)->first);
1266 assert(EndLabel && "Forgot label after instruction ending a range!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001267
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001268 DebugLocEntry Loc(StartLabel, EndLabel, getDebugLocValue(Begin), TheCU);
David Blaikie84d8e182014-03-24 22:38:38 +00001269 if (DebugLoc.empty() || !DebugLoc.back().Merge(Loc))
1270 DebugLoc.push_back(std::move(Loc));
Devang Patel9fc11702010-05-25 23:40:22 +00001271 }
Devang Patela3e9c9c2010-03-15 18:33:46 +00001272 }
Devang Patele0a94bf2010-05-14 21:01:35 +00001273
1274 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001275 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1276 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1277 DIVariable DV(Variables.getElement(i));
David Blaikie9ba72542014-05-14 21:52:46 +00001278 assert(DV.isVariable());
1279 if (!Processed.insert(DV))
Devang Patel59e27c52011-08-19 23:28:12 +00001280 continue;
David Blaikiebb6a4e22014-06-05 00:51:35 +00001281 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext())) {
David Blaikie6f9e8672014-06-13 23:52:55 +00001282 ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode());
1283 ConcreteVariables.push_back(make_unique<DbgVariable>(DV, this));
David Blaikieeb1a2722014-06-13 22:18:23 +00001284 addScopeVariable(Scope, ConcreteVariables.back().get());
David Blaikiebb6a4e22014-06-05 00:51:35 +00001285 }
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
Alexey Samsonov8a86d6d2014-05-27 22:47:41 +00001399static DebugLoc findPrologueEndLoc(const MachineFunction *MF) {
1400 // First known non-DBG_VALUE and non-frame setup location marks
1401 // the beginning of the function body.
1402 for (const auto &MBB : *MF)
1403 for (const auto &MI : MBB)
1404 if (!MI.isDebugValue() && !MI.getFlag(MachineInstr::FrameSetup) &&
1405 !MI.getDebugLoc().isUnknown())
1406 return MI.getDebugLoc();
1407 return DebugLoc();
1408}
1409
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001410// Gather pre-function debug information. Assumes being called immediately
1411// after the function entry point has been emitted.
Chris Lattner76555b52010-01-26 23:18:02 +00001412void DwarfDebug::beginFunction(const MachineFunction *MF) {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001413 CurFn = MF;
Eric Christopherfedfa442013-11-01 23:14:17 +00001414
1415 // If there's no debug info for the function we're not going to do anything.
1416 if (!MMI->hasDebugInfo())
1417 return;
1418
1419 // Grab the lexical scopes for the function, if we don't have any of those
1420 // then we're not going to be able to do anything.
Devang Patel7e623022011-08-10 20:55:27 +00001421 LScopes.initialize(*MF);
Eric Christopher384f3fe2014-03-20 19:16:16 +00001422 if (LScopes.empty())
Eric Christopherfedfa442013-11-01 23:14:17 +00001423 return;
1424
Alexey Samsonov0436caa2014-04-30 23:02:40 +00001425 assert(DbgValues.empty() && "DbgValues map wasn't cleaned!");
Eric Christopherfedfa442013-11-01 23:14:17 +00001426
1427 // Make sure that each lexical scope will have a begin/end label.
Devang Patel7e623022011-08-10 20:55:27 +00001428 identifyScopeMarkers();
Devang Patel4598eb62009-10-06 18:37:31 +00001429
Eric Christopher4287a492013-12-09 23:57:44 +00001430 // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function
Eric Christopherfedfa442013-11-01 23:14:17 +00001431 // belongs to so that we add to the correct per-cu line table in the
1432 // non-asm case.
Manman Ren4e042a62013-02-05 21:52:47 +00001433 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Eric Christopher4287a492013-12-09 23:57:44 +00001434 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Manman Ren4e042a62013-02-05 21:52:47 +00001435 assert(TheCU && "Unable to find compile unit!");
Rafael Espindolab4eec1d2014-02-05 18:00:21 +00001436 if (Asm->OutStreamer.hasRawTextSupport())
1437 // Use a single line table if we are generating assembly.
Manman Ren9d4c7352013-05-21 00:57:22 +00001438 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1439 else
1440 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
Manman Ren4e042a62013-02-05 21:52:47 +00001441
Eric Christopherfedfa442013-11-01 23:14:17 +00001442 // Emit a label for the function so that we have a beginning address.
1443 FunctionBeginSym = Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber());
Bill Wendling2b128d72009-05-20 23:19:06 +00001444 // Assumes in correct section after the entry point.
Devang Patel6c74a872010-04-27 19:46:33 +00001445 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendling2b128d72009-05-20 23:19:06 +00001446
Alexey Samsonov414b6fb2014-04-30 21:34:11 +00001447 // Calculate history for local variables.
1448 calculateDbgValueHistory(MF, Asm->TM.getRegisterInfo(), DbgValues);
1449
1450 // Request labels for the full history.
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001451 for (const auto &I : DbgValues) {
1452 const auto &Ranges = I.second;
1453 if (Ranges.empty())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001454 continue;
1455
Alexey Samsonov414b6fb2014-04-30 21:34:11 +00001456 // The first mention of a function argument gets the FunctionBeginSym
1457 // label, so arguments are visible when breaking at function entry.
1458 DIVariable DV(I.first);
1459 if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1460 getDISubprogram(DV.getContext()).describes(MF->getFunction()))
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001461 LabelsBeforeInsn[Ranges.front().first] = FunctionBeginSym;
Alexey Samsonov414b6fb2014-04-30 21:34:11 +00001462
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001463 for (const auto &Range : Ranges) {
1464 requestLabelBeforeInsn(Range.first);
1465 if (Range.second)
1466 requestLabelAfterInsn(Range.second);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001467 }
1468 }
Devang Patel002d54d2010-05-26 19:37:24 +00001469
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001470 PrevInstLoc = DebugLoc();
Devang Patel002d54d2010-05-26 19:37:24 +00001471 PrevLabel = FunctionBeginSym;
Devang Patel34a66202011-05-11 19:22:19 +00001472
1473 // Record beginning of function.
Alexey Samsonov8a86d6d2014-05-27 22:47:41 +00001474 PrologEndLoc = findPrologueEndLoc(MF);
Devang Patel34a66202011-05-11 19:22:19 +00001475 if (!PrologEndLoc.isUnknown()) {
Eric Christopherfedfa442013-11-01 23:14:17 +00001476 DebugLoc FnStartDL =
Timur Iskhodzhanovf166f6c2014-01-30 01:39:17 +00001477 PrologEndLoc.getFnDebugLoc(MF->getFunction()->getContext());
Eric Christopherfedfa442013-11-01 23:14:17 +00001478 recordSourceLine(
1479 FnStartDL.getLine(), FnStartDL.getCol(),
1480 FnStartDL.getScope(MF->getFunction()->getContext()),
1481 // We'd like to list the prologue as "not statements" but GDB behaves
1482 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
1483 DWARF2_FLAG_IS_STMT);
Devang Patel34a66202011-05-11 19:22:19 +00001484 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001485}
1486
David Blaikieafd2c6b2014-04-22 05:41:06 +00001487void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
David Blaikie087e7202014-06-05 01:04:20 +00001488 if (addCurrentFnArgument(Var, LS))
1489 return;
David Blaikieafd2c6b2014-04-22 05:41:06 +00001490 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1491 DIVariable DV = Var->getVariable();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001492 // Variables with positive arg numbers are parameters.
1493 if (unsigned ArgNum = DV.getArgNumber()) {
1494 // Keep all parameters in order at the start of the variable list to ensure
1495 // function types are correct (no out-of-order parameters)
1496 //
1497 // This could be improved by only doing it for optimized builds (unoptimized
1498 // builds have the right order to begin with), searching from the back (this
1499 // would catch the unoptimized case quickly), or doing a binary search
1500 // rather than linear search.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001501 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001502 while (I != Vars.end()) {
David Blaikieafd2c6b2014-04-22 05:41:06 +00001503 unsigned CurNum = (*I)->getVariable().getArgNumber();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001504 // A local (non-parameter) variable has been found, insert immediately
1505 // before it.
1506 if (CurNum == 0)
1507 break;
1508 // A later indexed parameter has been found, insert immediately before it.
David Blaikieb272a752013-06-06 22:28:26 +00001509 if (CurNum > ArgNum)
David Blaikie36d5d2f2013-06-06 21:04:51 +00001510 break;
David Blaikieb272a752013-06-06 22:28:26 +00001511 ++I;
David Blaikie6f1a8062013-06-05 05:39:59 +00001512 }
David Blaikieafd2c6b2014-04-22 05:41:06 +00001513 Vars.insert(I, Var);
1514 return;
David Blaikie6f1a8062013-06-05 05:39:59 +00001515 }
1516
David Blaikieafd2c6b2014-04-22 05:41:06 +00001517 Vars.push_back(Var);
Devang Patel7e623022011-08-10 20:55:27 +00001518}
1519
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001520// Gather and emit post-function debug information.
NAKAMURA Takumib9271612013-12-03 13:15:54 +00001521void DwarfDebug::endFunction(const MachineFunction *MF) {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001522 // Every beginFunction(MF) call should be followed by an endFunction(MF) call,
1523 // though the beginFunction may not be called at all.
1524 // We should handle both cases.
Craig Topper353eda42014-04-24 06:44:33 +00001525 if (!CurFn)
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001526 CurFn = MF;
1527 else
1528 assert(CurFn == MF);
Craig Toppere73658d2014-04-28 04:05:08 +00001529 assert(CurFn != nullptr);
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001530
1531 if (!MMI->hasDebugInfo() || LScopes.empty()) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00001532 // If we don't have a lexical scope for this function then there will
1533 // be a hole in the range information. Keep note of this by setting the
1534 // previously used section to nullptr.
1535 PrevSection = nullptr;
1536 PrevCU = nullptr;
Craig Topper353eda42014-04-24 06:44:33 +00001537 CurFn = nullptr;
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001538 return;
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001539 }
Devang Patel2904aa92009-11-12 19:02:56 +00001540
Devang Patel7e623022011-08-10 20:55:27 +00001541 // Define end label for subprogram.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001542 FunctionEndSym = Asm->GetTempSymbol("func_end", Asm->getFunctionNumber());
Devang Patel7e623022011-08-10 20:55:27 +00001543 // Assumes in correct section after the entry point.
1544 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Eric Christopher1a972152014-01-29 23:05:43 +00001545
Eric Christopher4287a492013-12-09 23:57:44 +00001546 // Set DwarfDwarfCompileUnitID in MCContext to default value.
Manman Ren4e042a62013-02-05 21:52:47 +00001547 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher6a841382012-11-19 22:42:10 +00001548
Devang Patel7e623022011-08-10 20:55:27 +00001549 SmallPtrSet<const MDNode *, 16> ProcessedVars;
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001550 collectVariableInfo(ProcessedVars);
Eric Christopher6a841382012-11-19 22:42:10 +00001551
Devang Patel3acc70e2011-08-15 22:04:40 +00001552 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
David Blaikief9b6a552014-04-22 22:39:41 +00001553 DwarfCompileUnit &TheCU = *SPMap.lookup(FnScope->getScopeNode());
Devang Patel3acc70e2011-08-15 22:04:40 +00001554
Devang Patel7e623022011-08-10 20:55:27 +00001555 // Construct abstract scopes.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001556 for (LexicalScope *AScope : LScopes.getAbstractScopesList()) {
Devang Patel44403472011-08-12 18:10:19 +00001557 DISubprogram SP(AScope->getScopeNode());
David Blaikie4abe19e2014-05-12 18:23:35 +00001558 if (!SP.isSubprogram())
1559 continue;
1560 // Collect info for variables that were optimized out.
1561 DIArray Variables = SP.getVariables();
1562 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1563 DIVariable DV(Variables.getElement(i));
1564 assert(DV && DV.isVariable());
1565 if (!ProcessedVars.insert(DV))
1566 continue;
David Blaikie6f9e8672014-06-13 23:52:55 +00001567 ensureAbstractVariableIsCreated(DV, DV.getContext());
Devang Patel5c0f85c2010-06-25 22:07:34 +00001568 }
David Blaikie4abe19e2014-05-12 18:23:35 +00001569 constructAbstractSubprogramScopeDIE(TheCU, AScope);
Bill Wendling2b128d72009-05-20 23:19:06 +00001570 }
Eric Christopher6a841382012-11-19 22:42:10 +00001571
David Blaikiee872a6e2014-04-29 15:58:35 +00001572 DIE &CurFnDIE = constructSubprogramScopeDIE(TheCU, FnScope);
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001573 if (!CurFn->getTarget().Options.DisableFramePointerElim(*CurFn))
David Blaikief9b6a552014-04-22 22:39:41 +00001574 TheCU.addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Patel3acc70e2011-08-15 22:04:40 +00001575
Eric Christopher1a972152014-01-29 23:05:43 +00001576 // Add the range of this function to the list of ranges for the CU.
1577 RangeSpan Span(FunctionBeginSym, FunctionEndSym);
David Blaikief9b6a552014-04-22 22:39:41 +00001578 TheCU.addRange(std::move(Span));
Eric Christopher384f3fe2014-03-20 19:16:16 +00001579 PrevSection = Asm->getCurrentSection();
David Blaikief9b6a552014-04-22 22:39:41 +00001580 PrevCU = &TheCU;
Eric Christopher1a972152014-01-29 23:05:43 +00001581
Bill Wendling2b128d72009-05-20 23:19:06 +00001582 // Clear debug info
David Blaikie825bdd22014-05-21 22:41:17 +00001583 // Ownership of DbgVariables is a bit subtle - ScopeVariables owns all the
1584 // DbgVariables except those that are also in AbstractVariables (since they
1585 // can be used cross-function)
Devang Patel7e623022011-08-10 20:55:27 +00001586 ScopeVariables.clear();
David Blaikieeb1a2722014-06-13 22:18:23 +00001587 CurrentFnArguments.clear();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001588 DbgValues.clear();
Devang Patel6c74a872010-04-27 19:46:33 +00001589 LabelsBeforeInsn.clear();
1590 LabelsAfterInsn.clear();
Craig Topper353eda42014-04-24 06:44:33 +00001591 PrevLabel = nullptr;
1592 CurFn = nullptr;
Bill Wendling2b128d72009-05-20 23:19:06 +00001593}
1594
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001595// Register a source line with debug info. Returns the unique label that was
1596// emitted and which provides correspondence to the source line list.
Devang Patel34a66202011-05-11 19:22:19 +00001597void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1598 unsigned Flags) {
Devang Patel2d9caf92009-11-25 17:36:49 +00001599 StringRef Fn;
Devang Patele01b75c2011-03-24 20:30:50 +00001600 StringRef Dir;
Dan Gohman50849c62010-05-05 23:41:32 +00001601 unsigned Src = 1;
Diego Novillo282450d2014-03-03 18:53:17 +00001602 unsigned Discriminator = 0;
David Blaikie4c6d9872014-05-15 20:18:50 +00001603 if (DIScope Scope = DIScope(S)) {
1604 assert(Scope.isScope());
1605 Fn = Scope.getFilename();
1606 Dir = Scope.getDirectory();
1607 if (Scope.isLexicalBlock())
1608 Discriminator = DILexicalBlock(S).getDiscriminator();
Dan Gohman50849c62010-05-05 23:41:32 +00001609
David Blaikie0e8d4012014-03-17 23:53:25 +00001610 unsigned CUID = Asm->OutStreamer.getContext().getDwarfCompileUnitID();
David Blaikiec33b3cd2014-04-22 21:27:37 +00001611 Src = static_cast<DwarfCompileUnit &>(*InfoHolder.getUnits()[CUID])
1612 .getOrCreateSourceID(Fn, Dir);
Dan Gohman50849c62010-05-05 23:41:32 +00001613 }
Diego Novillo282450d2014-03-03 18:53:17 +00001614 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0,
1615 Discriminator, Fn);
Bill Wendling2b128d72009-05-20 23:19:06 +00001616}
1617
Bill Wendling806535f2009-05-20 23:22:40 +00001618//===----------------------------------------------------------------------===//
1619// Emit Methods
1620//===----------------------------------------------------------------------===//
1621
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001622// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001623void DwarfDebug::emitSectionLabels() {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001624 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00001625
Bill Wendling480ff322009-05-20 23:21:38 +00001626 // Dwarf sections base addresses.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001627 DwarfInfoSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001628 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
David Blaikie2da282b2014-05-21 23:27:41 +00001629 if (useSplitDwarf())
Eric Christopherd8667202013-12-30 17:22:27 +00001630 DwarfInfoDWOSectionSym =
1631 emitSectionSym(Asm, TLOF.getDwarfInfoDWOSection(), "section_info_dwo");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001632 DwarfAbbrevSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001633 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher3c5a1912012-12-19 22:02:53 +00001634 if (useSplitDwarf())
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001635 DwarfAbbrevDWOSectionSym = emitSectionSym(
1636 Asm, TLOF.getDwarfAbbrevDWOSection(), "section_abbrev_dwo");
David Blaikie20474102014-02-25 22:46:44 +00001637 if (GenerateARangeSection)
1638 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001639
Eric Christopher74804332013-02-07 21:19:50 +00001640 DwarfLineSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001641 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher261d2342013-09-23 20:55:35 +00001642 if (GenerateGnuPubSections) {
Eric Christopher39eebfa2013-09-30 23:14:16 +00001643 DwarfGnuPubNamesSectionSym =
1644 emitSectionSym(Asm, TLOF.getDwarfGnuPubNamesSection());
1645 DwarfGnuPubTypesSectionSym =
1646 emitSectionSym(Asm, TLOF.getDwarfGnuPubTypesSection());
Eric Christopher261d2342013-09-23 20:55:35 +00001647 } else if (HasDwarfPubSections) {
1648 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
1649 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001650 }
Eric Christopherdd1a0122013-09-13 00:35:05 +00001651
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001652 DwarfStrSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001653 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001654 if (useSplitDwarf()) {
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001655 DwarfStrDWOSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001656 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001657 DwarfAddrSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001658 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
David Blaikiee12ab122014-04-01 16:09:49 +00001659 DwarfDebugLocSectionSym =
David Blaikie9c550ac2014-03-25 01:44:02 +00001660 emitSectionSym(Asm, TLOF.getDwarfLocDWOSection(), "skel_loc");
1661 } else
1662 DwarfDebugLocSectionSym =
1663 emitSectionSym(Asm, TLOF.getDwarfLocSection(), "section_debug_loc");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001664 DwarfDebugRangeSectionSym =
1665 emitSectionSym(Asm, TLOF.getDwarfRangesSection(), "debug_range");
Bill Wendling480ff322009-05-20 23:21:38 +00001666}
1667
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001668// Recursively emits a debug information entry.
David Blaikieb8184182014-04-14 22:45:02 +00001669void DwarfDebug::emitDIE(DIE &Die) {
Bill Wendling480ff322009-05-20 23:21:38 +00001670 // Get the abbreviation for this DIE.
David Blaikieb8184182014-04-14 22:45:02 +00001671 const DIEAbbrev &Abbrev = Die.getAbbrev();
Bill Wendling480ff322009-05-20 23:21:38 +00001672
Bill Wendling480ff322009-05-20 23:21:38 +00001673 // Emit the code (index) for the abbreviation.
Chris Lattner7bde8c02010-04-04 18:52:31 +00001674 if (Asm->isVerbose())
David Blaikieff3ab2c2013-12-05 01:01:41 +00001675 Asm->OutStreamer.AddComment("Abbrev [" + Twine(Abbrev.getNumber()) +
David Blaikieb8184182014-04-14 22:45:02 +00001676 "] 0x" + Twine::utohexstr(Die.getOffset()) +
1677 ":0x" + Twine::utohexstr(Die.getSize()) + " " +
David Blaikieff3ab2c2013-12-05 01:01:41 +00001678 dwarf::TagString(Abbrev.getTag()));
1679 Asm->EmitULEB128(Abbrev.getNumber());
Bill Wendling480ff322009-05-20 23:21:38 +00001680
David Blaikieb8184182014-04-14 22:45:02 +00001681 const SmallVectorImpl<DIEValue *> &Values = Die.getValues();
David Blaikieff3ab2c2013-12-05 01:01:41 +00001682 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
Bill Wendling480ff322009-05-20 23:21:38 +00001683
1684 // Emit the DIE attribute values.
1685 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
David Blaikief2443192013-10-21 17:28:37 +00001686 dwarf::Attribute Attr = AbbrevData[i].getAttribute();
1687 dwarf::Form Form = AbbrevData[i].getForm();
Bill Wendling480ff322009-05-20 23:21:38 +00001688 assert(Form && "Too many attributes for DIE (check abbreviation)");
1689
Eric Christopher13a1bb32014-03-06 00:00:49 +00001690 if (Asm->isVerbose()) {
Chris Lattner5adf9872010-01-24 18:54:17 +00001691 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Eric Christopher13a1bb32014-03-06 00:00:49 +00001692 if (Attr == dwarf::DW_AT_accessibility)
1693 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(
1694 cast<DIEInteger>(Values[i])->getValue()));
1695 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001696
Eric Christopherdd508382014-03-06 00:00:56 +00001697 // Emit an attribute using the defined form.
1698 Values[i]->EmitValue(Asm, Form);
Bill Wendling480ff322009-05-20 23:21:38 +00001699 }
1700
1701 // Emit the DIE children if any.
Eric Christophere8f10722014-03-05 01:44:58 +00001702 if (Abbrev.hasChildren()) {
David Blaikieb8184182014-04-14 22:45:02 +00001703 for (auto &Child : Die.getChildren())
1704 emitDIE(*Child);
Bill Wendling480ff322009-05-20 23:21:38 +00001705
David Blaikie155f8812013-12-04 21:51:05 +00001706 Asm->OutStreamer.AddComment("End Of Children Mark");
Chris Lattner566cae92010-03-09 23:52:58 +00001707 Asm->EmitInt8(0);
Bill Wendling480ff322009-05-20 23:21:38 +00001708 }
1709}
1710
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001711// Emit the debug info section.
1712void DwarfDebug::emitDebugInfo() {
Eric Christopherf8194852013-12-05 18:06:10 +00001713 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Eric Christophera2de8262012-12-15 00:04:07 +00001714
David Blaikief72ed5f2014-03-24 20:31:01 +00001715 Holder.emitUnits(this, DwarfAbbrevSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001716}
1717
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001718// Emit the abbreviation section.
Eric Christopher38371952012-11-20 23:30:11 +00001719void DwarfDebug::emitAbbreviations() {
Eric Christopherf8194852013-12-05 18:06:10 +00001720 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
David Blaikie0504cda2013-12-05 07:43:55 +00001721
1722 Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
Eric Christopher3c5a1912012-12-19 22:02:53 +00001723}
Bill Wendling480ff322009-05-20 23:21:38 +00001724
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001725// Emit the last address of the section and the end of the line matrix.
Devang Patel930143b2009-11-21 02:48:08 +00001726void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling480ff322009-05-20 23:21:38 +00001727 // Define last address of section.
Chris Lattner566cae92010-03-09 23:52:58 +00001728 Asm->OutStreamer.AddComment("Extended Op");
1729 Asm->EmitInt8(0);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001730
Chris Lattner566cae92010-03-09 23:52:58 +00001731 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth5da3f052012-11-01 09:14:31 +00001732 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner566cae92010-03-09 23:52:58 +00001733 Asm->OutStreamer.AddComment("DW_LNE_set_address");
1734 Asm->EmitInt8(dwarf::DW_LNE_set_address);
1735
1736 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerb245dfb2010-03-10 01:17:49 +00001737
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001738 Asm->OutStreamer.EmitSymbolValue(
1739 Asm->GetTempSymbol("section_end", SectionEnd),
1740 Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00001741
1742 // Mark end of matrix.
Chris Lattner566cae92010-03-09 23:52:58 +00001743 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1744 Asm->EmitInt8(0);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00001745 Asm->EmitInt8(1);
Chris Lattnerfa823552010-01-22 23:18:42 +00001746 Asm->EmitInt8(1);
Bill Wendling480ff322009-05-20 23:21:38 +00001747}
1748
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001749// Emit visible names into a hashed accelerator table section.
Eric Christopher4996c702011-11-07 09:24:32 +00001750void DwarfDebug::emitAccelNames() {
David Blaikie27931a42014-04-23 23:46:25 +00001751 AccelNames.FinalizeTable(Asm, "Names");
Eric Christopher4996c702011-11-07 09:24:32 +00001752 Asm->OutStreamer.SwitchSection(
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001753 Asm->getObjFileLowering().getDwarfAccelNamesSection());
Eric Christopher4996c702011-11-07 09:24:32 +00001754 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
1755 Asm->OutStreamer.EmitLabel(SectionBegin);
1756
1757 // Emit the full data.
David Blaikie27931a42014-04-23 23:46:25 +00001758 AccelNames.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00001759}
1760
Eric Christopher48fef592012-12-20 21:58:40 +00001761// Emit objective C classes and categories into a hashed accelerator table
1762// section.
Eric Christopher4996c702011-11-07 09:24:32 +00001763void DwarfDebug::emitAccelObjC() {
David Blaikie0ee82b92014-04-24 00:53:32 +00001764 AccelObjC.FinalizeTable(Asm, "ObjC");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001765 Asm->OutStreamer.SwitchSection(
1766 Asm->getObjFileLowering().getDwarfAccelObjCSection());
Eric Christopher4996c702011-11-07 09:24:32 +00001767 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
1768 Asm->OutStreamer.EmitLabel(SectionBegin);
1769
1770 // Emit the full data.
David Blaikie0ee82b92014-04-24 00:53:32 +00001771 AccelObjC.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00001772}
1773
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001774// Emit namespace dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00001775void DwarfDebug::emitAccelNamespaces() {
David Blaikieecf04152014-04-24 01:02:42 +00001776 AccelNamespace.FinalizeTable(Asm, "namespac");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001777 Asm->OutStreamer.SwitchSection(
1778 Asm->getObjFileLowering().getDwarfAccelNamespaceSection());
Eric Christopher4996c702011-11-07 09:24:32 +00001779 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
1780 Asm->OutStreamer.EmitLabel(SectionBegin);
1781
1782 // Emit the full data.
David Blaikieecf04152014-04-24 01:02:42 +00001783 AccelNamespace.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00001784}
1785
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001786// Emit type dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00001787void DwarfDebug::emitAccelTypes() {
Eric Christopher4996c702011-11-07 09:24:32 +00001788
David Blaikie18d33752014-04-24 01:23:49 +00001789 AccelTypes.FinalizeTable(Asm, "types");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001790 Asm->OutStreamer.SwitchSection(
1791 Asm->getObjFileLowering().getDwarfAccelTypesSection());
Eric Christopher4996c702011-11-07 09:24:32 +00001792 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
1793 Asm->OutStreamer.EmitLabel(SectionBegin);
1794
1795 // Emit the full data.
David Blaikie18d33752014-04-24 01:23:49 +00001796 AccelTypes.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00001797}
1798
Eric Christopherdd1a0122013-09-13 00:35:05 +00001799// Public name handling.
1800// The format for the various pubnames:
1801//
1802// dwarf pubnames - offset/name pairs where the offset is the offset into the CU
1803// for the DIE that is named.
1804//
1805// gnu pubnames - offset/index value/name tuples where the offset is the offset
1806// into the CU and the index value is computed according to the type of value
1807// for the DIE that is named.
1808//
1809// For type units the offset is the offset of the skeleton DIE. For split dwarf
1810// it's the offset within the debug_info/debug_types dwo section, however, the
1811// reference in the pubname header doesn't change.
1812
1813/// computeIndexValue - Compute the gdb index value for the DIE and CU.
Eric Christophera5a79422013-12-09 23:32:48 +00001814static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU,
Eric Christopher0fe676a2013-11-21 00:48:22 +00001815 const DIE *Die) {
Eric Christopherd2b497b2013-10-16 01:37:49 +00001816 dwarf::GDBIndexEntryLinkage Linkage = dwarf::GIEL_STATIC;
1817
1818 // We could have a specification DIE that has our most of our knowledge,
1819 // look for that now.
1820 DIEValue *SpecVal = Die->findAttribute(dwarf::DW_AT_specification);
1821 if (SpecVal) {
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001822 DIE &SpecDIE = cast<DIEEntry>(SpecVal)->getEntry();
1823 if (SpecDIE.findAttribute(dwarf::DW_AT_external))
Eric Christopherd2b497b2013-10-16 01:37:49 +00001824 Linkage = dwarf::GIEL_EXTERNAL;
1825 } else if (Die->findAttribute(dwarf::DW_AT_external))
1826 Linkage = dwarf::GIEL_EXTERNAL;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001827
1828 switch (Die->getTag()) {
1829 case dwarf::DW_TAG_class_type:
1830 case dwarf::DW_TAG_structure_type:
1831 case dwarf::DW_TAG_union_type:
1832 case dwarf::DW_TAG_enumeration_type:
Eric Christopher261d2342013-09-23 20:55:35 +00001833 return dwarf::PubIndexEntryDescriptor(
1834 dwarf::GIEK_TYPE, CU->getLanguage() != dwarf::DW_LANG_C_plus_plus
1835 ? dwarf::GIEL_STATIC
1836 : dwarf::GIEL_EXTERNAL);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001837 case dwarf::DW_TAG_typedef:
1838 case dwarf::DW_TAG_base_type:
1839 case dwarf::DW_TAG_subrange_type:
David Blaikie8dec4072013-09-19 20:40:26 +00001840 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE, dwarf::GIEL_STATIC);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001841 case dwarf::DW_TAG_namespace:
David Blaikie8dec4072013-09-19 20:40:26 +00001842 return dwarf::GIEK_TYPE;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001843 case dwarf::DW_TAG_subprogram:
Eric Christopherccac5c42013-09-23 22:59:14 +00001844 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_FUNCTION, Linkage);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001845 case dwarf::DW_TAG_constant:
1846 case dwarf::DW_TAG_variable:
Eric Christopherccac5c42013-09-23 22:59:14 +00001847 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, Linkage);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001848 case dwarf::DW_TAG_enumerator:
David Blaikie8dec4072013-09-19 20:40:26 +00001849 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE,
1850 dwarf::GIEL_STATIC);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001851 default:
David Blaikie8dec4072013-09-19 20:40:26 +00001852 return dwarf::GIEK_NONE;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001853 }
Eric Christopherdd1a0122013-09-13 00:35:05 +00001854}
1855
Eric Christopher5f93bb92013-09-09 20:03:17 +00001856/// emitDebugPubNames - Emit visible names into a debug pubnames section.
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001857///
Eric Christopherdd1a0122013-09-13 00:35:05 +00001858void DwarfDebug::emitDebugPubNames(bool GnuStyle) {
Eric Christopherdd1a0122013-09-13 00:35:05 +00001859 const MCSection *PSec =
1860 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection()
1861 : Asm->getObjFileLowering().getDwarfPubNamesSection();
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001862
David Blaikie0f55e832014-03-11 23:18:15 +00001863 emitDebugPubSection(GnuStyle, PSec, "Names", &DwarfUnit::getGlobalNames);
1864}
1865
1866void DwarfDebug::emitDebugPubSection(
1867 bool GnuStyle, const MCSection *PSec, StringRef Name,
1868 const StringMap<const DIE *> &(DwarfUnit::*Accessor)() const) {
David Blaikiec3d9e9e2014-03-06 01:42:00 +00001869 for (const auto &NU : CUMap) {
1870 DwarfCompileUnit *TheU = NU.second;
David Blaikie55bb8ac2014-03-11 23:23:39 +00001871
1872 const auto &Globals = (TheU->*Accessor)();
1873
David Blaikiece2f1cb2014-03-11 23:35:06 +00001874 if (Globals.empty())
1875 continue;
1876
David Blaikiec3d9e9e2014-03-06 01:42:00 +00001877 if (auto Skeleton = static_cast<DwarfCompileUnit *>(TheU->getSkeleton()))
1878 TheU = Skeleton;
David Blaikie2a80e442013-12-02 22:09:48 +00001879 unsigned ID = TheU->getUniqueID();
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001880
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001881 // Start the dwarf pubnames section.
Eric Christopher13b99d22013-09-10 21:49:37 +00001882 Asm->OutStreamer.SwitchSection(PSec);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001883
Eric Christopherdd1a0122013-09-13 00:35:05 +00001884 // Emit the header.
David Blaikie0f55e832014-03-11 23:18:15 +00001885 Asm->OutStreamer.AddComment("Length of Public " + Name + " Info");
1886 MCSymbol *BeginLabel = Asm->GetTempSymbol("pub" + Name + "_begin", ID);
1887 MCSymbol *EndLabel = Asm->GetTempSymbol("pub" + Name + "_end", ID);
David Blaikieb7a1c4d2013-12-04 17:55:41 +00001888 Asm->EmitLabelDifference(EndLabel, BeginLabel, 4);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001889
David Blaikieb7a1c4d2013-12-04 17:55:41 +00001890 Asm->OutStreamer.EmitLabel(BeginLabel);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001891
1892 Asm->OutStreamer.AddComment("DWARF Version");
David Majnemered89b5c2013-08-21 06:13:34 +00001893 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001894
1895 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
David Blaikie7d734602013-12-06 22:33:05 +00001896 Asm->EmitSectionOffset(TheU->getLabelBegin(), TheU->getSectionSym());
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001897
1898 Asm->OutStreamer.AddComment("Compilation Unit Length");
David Blaikie7d734602013-12-06 22:33:05 +00001899 Asm->EmitLabelDifference(TheU->getLabelEnd(), TheU->getLabelBegin(), 4);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001900
Eric Christopherdd1a0122013-09-13 00:35:05 +00001901 // Emit the pubnames for this compilation unit.
David Blaikie55bb8ac2014-03-11 23:23:39 +00001902 for (const auto &GI : Globals) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00001903 const char *Name = GI.getKeyData();
1904 const DIE *Entity = GI.second;
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001905
1906 Asm->OutStreamer.AddComment("DIE offset");
1907 Asm->EmitInt32(Entity->getOffset());
1908
Eric Christopherdd1a0122013-09-13 00:35:05 +00001909 if (GnuStyle) {
David Blaikie2a80e442013-12-02 22:09:48 +00001910 dwarf::PubIndexEntryDescriptor Desc = computeIndexValue(TheU, Entity);
David Blaikied0a869d2013-09-19 22:19:37 +00001911 Asm->OutStreamer.AddComment(
David Blaikieefd0bcb2013-09-20 00:33:15 +00001912 Twine("Kind: ") + dwarf::GDBIndexEntryKindString(Desc.Kind) + ", " +
David Blaikie404d3042013-09-19 23:01:29 +00001913 dwarf::GDBIndexEntryLinkageString(Desc.Linkage));
David Blaikied0a869d2013-09-19 22:19:37 +00001914 Asm->EmitInt8(Desc.toBits());
Eric Christopherdd1a0122013-09-13 00:35:05 +00001915 }
1916
David Blaikie155f8812013-12-04 21:51:05 +00001917 Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer15596c72014-03-07 19:09:39 +00001918 Asm->OutStreamer.EmitBytes(StringRef(Name, GI.getKeyLength() + 1));
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001919 }
1920
1921 Asm->OutStreamer.AddComment("End Mark");
1922 Asm->EmitInt32(0);
David Blaikieb7a1c4d2013-12-04 17:55:41 +00001923 Asm->OutStreamer.EmitLabel(EndLabel);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001924 }
1925}
1926
Eric Christopherdd1a0122013-09-13 00:35:05 +00001927void DwarfDebug::emitDebugPubTypes(bool GnuStyle) {
Eric Christopher261d2342013-09-23 20:55:35 +00001928 const MCSection *PSec =
1929 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
1930 : Asm->getObjFileLowering().getDwarfPubTypesSection();
Eric Christopher8b3737f2013-09-13 00:34:58 +00001931
David Blaikie0f55e832014-03-11 23:18:15 +00001932 emitDebugPubSection(GnuStyle, PSec, "Types", &DwarfUnit::getGlobalTypes);
Devang Patel04d2f2d2009-11-24 01:14:22 +00001933}
1934
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001935// Emit visible names into a debug str section.
1936void DwarfDebug::emitDebugStr() {
Eric Christopherf8194852013-12-05 18:06:10 +00001937 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001938 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
1939}
1940
Eric Christopher29e874d2014-03-07 22:40:37 +00001941void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer,
Eric Christopher05135fb2014-03-18 02:18:24 +00001942 const DebugLocEntry &Entry) {
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001943 assert(Entry.getValues().size() == 1 &&
Eric Christopher793c7472014-04-28 20:42:22 +00001944 "multi-value entries are not supported yet.");
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001945 const DebugLocEntry::Value Value = Entry.getValues()[0];
1946 DIVariable DV(Value.getVariable());
1947 if (Value.isInt()) {
Adrian Prantl1a1647c2014-03-18 02:34:58 +00001948 DIBasicType BTy(resolve(DV.getType()));
Eric Christopher29e874d2014-03-07 22:40:37 +00001949 if (BTy.Verify() && (BTy.getEncoding() == dwarf::DW_ATE_signed ||
1950 BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
1951 Streamer.EmitInt8(dwarf::DW_OP_consts, "DW_OP_consts");
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001952 Streamer.EmitSLEB128(Value.getInt());
Eric Christopher29e874d2014-03-07 22:40:37 +00001953 } else {
1954 Streamer.EmitInt8(dwarf::DW_OP_constu, "DW_OP_constu");
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001955 Streamer.EmitULEB128(Value.getInt());
Eric Christopher29e874d2014-03-07 22:40:37 +00001956 }
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001957 } else if (Value.isLocation()) {
1958 MachineLocation Loc = Value.getLoc();
Eric Christopher29e874d2014-03-07 22:40:37 +00001959 if (!DV.hasComplexAddress())
1960 // Regular entry.
1961 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
1962 else {
1963 // Complex address entry.
1964 unsigned N = DV.getNumAddrElements();
1965 unsigned i = 0;
1966 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
1967 if (Loc.getOffset()) {
1968 i = 2;
1969 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
1970 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
1971 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
1972 Streamer.EmitSLEB128(DV.getAddrElement(1));
1973 } else {
1974 // If first address element is OpPlus then emit
1975 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
1976 MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));
1977 Asm->EmitDwarfRegOp(Streamer, TLoc, DV.isIndirect());
1978 i = 2;
1979 }
1980 } else {
1981 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
1982 }
1983
1984 // Emit remaining complex address elements.
1985 for (; i < N; ++i) {
1986 uint64_t Element = DV.getAddrElement(i);
1987 if (Element == DIBuilder::OpPlus) {
1988 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
1989 Streamer.EmitULEB128(DV.getAddrElement(++i));
1990 } else if (Element == DIBuilder::OpDeref) {
1991 if (!Loc.isReg())
1992 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
1993 } else
1994 llvm_unreachable("unknown Opcode found in complex address");
1995 }
1996 }
1997 }
1998 // else ... ignore constant fp. There is not any good way to
1999 // to represent them here in dwarf.
2000 // FIXME: ^
2001}
2002
David Blaikie0e84adc2014-04-01 16:17:41 +00002003void DwarfDebug::emitDebugLocEntryLocation(const DebugLocEntry &Entry) {
2004 Asm->OutStreamer.AddComment("Loc expr size");
2005 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2006 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2007 Asm->EmitLabelDifference(end, begin, 2);
2008 Asm->OutStreamer.EmitLabel(begin);
2009 // Emit the entry.
2010 APByteStreamer Streamer(*Asm);
2011 emitDebugLocEntry(Streamer, Entry);
2012 // Close the range.
2013 Asm->OutStreamer.EmitLabel(end);
2014}
2015
Eric Christopher9046f942013-07-02 21:36:07 +00002016// Emit locations into the debug loc section.
Devang Patel930143b2009-11-21 02:48:08 +00002017void DwarfDebug::emitDebugLoc() {
Daniel Dunbarfd95b012011-03-16 22:16:39 +00002018 // Start the dwarf loc section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002019 Asm->OutStreamer.SwitchSection(
David Blaikie94c1d7f2014-04-02 01:50:20 +00002020 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth5da3f052012-11-01 09:14:31 +00002021 unsigned char Size = Asm->getDataLayout().getPointerSize();
David Blaikie84d8e182014-03-24 22:38:38 +00002022 for (const auto &DebugLoc : DotDebugLocEntries) {
David Blaikie0a456de2014-04-02 01:43:18 +00002023 Asm->OutStreamer.EmitLabel(DebugLoc.Label);
2024 for (const auto &Entry : DebugLoc.List) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00002025 // Set up the range. This range is relative to the entry point of the
2026 // compile unit. This is a hard coded 0 for low_pc when we're emitting
2027 // ranges, or the DW_AT_low_pc on the compile unit otherwise.
2028 const DwarfCompileUnit *CU = Entry.getCU();
David Blaikie94c1d7f2014-04-02 01:50:20 +00002029 if (CU->getRanges().size() == 1) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00002030 // Grab the begin symbol from the first range as our base.
2031 const MCSymbol *Base = CU->getRanges()[0].getStart();
2032 Asm->EmitLabelDifference(Entry.getBeginSym(), Base, Size);
2033 Asm->EmitLabelDifference(Entry.getEndSym(), Base, Size);
2034 } else {
2035 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
2036 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
2037 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002038
David Blaikie0e84adc2014-04-01 16:17:41 +00002039 emitDebugLocEntryLocation(Entry);
Devang Patel9fc11702010-05-25 23:40:22 +00002040 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002041 Asm->OutStreamer.EmitIntValue(0, Size);
2042 Asm->OutStreamer.EmitIntValue(0, Size);
2043 }
2044}
2045
2046void DwarfDebug::emitDebugLocDWO() {
2047 Asm->OutStreamer.SwitchSection(
2048 Asm->getObjFileLowering().getDwarfLocDWOSection());
2049 for (const auto &DebugLoc : DotDebugLocEntries) {
2050 Asm->OutStreamer.EmitLabel(DebugLoc.Label);
2051 for (const auto &Entry : DebugLoc.List) {
2052 // Just always use start_length for now - at least that's one address
2053 // rather than two. We could get fancier and try to, say, reuse an
2054 // address we know we've emitted elsewhere (the start of the function?
2055 // The start of the CU or CU subrange that encloses this range?)
2056 Asm->EmitInt8(dwarf::DW_LLE_start_length_entry);
David Blaikied75fb282014-04-23 21:20:10 +00002057 unsigned idx = AddrPool.getIndex(Entry.getBeginSym());
David Blaikie94c1d7f2014-04-02 01:50:20 +00002058 Asm->EmitULEB128(idx);
2059 Asm->EmitLabelDifference(Entry.getEndSym(), Entry.getBeginSym(), 4);
2060
2061 emitDebugLocEntryLocation(Entry);
David Blaikie9c550ac2014-03-25 01:44:02 +00002062 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002063 Asm->EmitInt8(dwarf::DW_LLE_end_of_list_entry);
Devang Patel9fc11702010-05-25 23:40:22 +00002064 }
Bill Wendling480ff322009-05-20 23:21:38 +00002065}
2066
Richard Mitton21101b32013-09-19 23:21:01 +00002067struct ArangeSpan {
2068 const MCSymbol *Start, *End;
2069};
2070
2071// Emit a debug aranges section, containing a CU lookup for any
2072// address we can tie back to a CU.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00002073void DwarfDebug::emitDebugARanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002074 // Start the dwarf aranges section.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002075 Asm->OutStreamer.SwitchSection(
2076 Asm->getObjFileLowering().getDwarfARangesSection());
Richard Mitton21101b32013-09-19 23:21:01 +00002077
Eric Christopher793c7472014-04-28 20:42:22 +00002078 typedef DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan>> SpansType;
Richard Mitton21101b32013-09-19 23:21:01 +00002079
2080 SpansType Spans;
2081
2082 // Build a list of sections used.
2083 std::vector<const MCSection *> Sections;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002084 for (const auto &it : SectionMap) {
2085 const MCSection *Section = it.first;
Richard Mitton21101b32013-09-19 23:21:01 +00002086 Sections.push_back(Section);
2087 }
2088
2089 // Sort the sections into order.
2090 // This is only done to ensure consistent output order across different runs.
2091 std::sort(Sections.begin(), Sections.end(), SectionSort);
2092
2093 // Build a set of address spans, sorted by CU.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002094 for (const MCSection *Section : Sections) {
David Blaikieafd2c6b2014-04-22 05:41:06 +00002095 SmallVector<SymbolCU, 8> &List = SectionMap[Section];
Richard Mitton21101b32013-09-19 23:21:01 +00002096 if (List.size() < 2)
2097 continue;
2098
2099 // Sort the symbols by offset within the section.
Benjamin Kramer571e2fe2014-03-07 19:41:22 +00002100 std::sort(List.begin(), List.end(),
2101 [&](const SymbolCU &A, const SymbolCU &B) {
2102 unsigned IA = A.Sym ? Asm->OutStreamer.GetSymbolOrder(A.Sym) : 0;
2103 unsigned IB = B.Sym ? Asm->OutStreamer.GetSymbolOrder(B.Sym) : 0;
2104
2105 // Symbols with no order assigned should be placed at the end.
2106 // (e.g. section end labels)
2107 if (IA == 0)
2108 return false;
2109 if (IB == 0)
2110 return true;
2111 return IA < IB;
2112 });
Richard Mitton21101b32013-09-19 23:21:01 +00002113
2114 // If we have no section (e.g. common), just write out
2115 // individual spans for each symbol.
Craig Topper353eda42014-04-24 06:44:33 +00002116 if (!Section) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00002117 for (const SymbolCU &Cur : List) {
Richard Mitton21101b32013-09-19 23:21:01 +00002118 ArangeSpan Span;
2119 Span.Start = Cur.Sym;
Craig Topper353eda42014-04-24 06:44:33 +00002120 Span.End = nullptr;
Richard Mitton21101b32013-09-19 23:21:01 +00002121 if (Cur.CU)
2122 Spans[Cur.CU].push_back(Span);
2123 }
2124 } else {
2125 // Build spans between each label.
2126 const MCSymbol *StartSym = List[0].Sym;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002127 for (size_t n = 1, e = List.size(); n < e; n++) {
Richard Mitton21101b32013-09-19 23:21:01 +00002128 const SymbolCU &Prev = List[n - 1];
2129 const SymbolCU &Cur = List[n];
2130
2131 // Try and build the longest span we can within the same CU.
2132 if (Cur.CU != Prev.CU) {
2133 ArangeSpan Span;
2134 Span.Start = StartSym;
2135 Span.End = Cur.Sym;
2136 Spans[Prev.CU].push_back(Span);
2137 StartSym = Cur.Sym;
2138 }
2139 }
2140 }
2141 }
2142
Richard Mitton21101b32013-09-19 23:21:01 +00002143 unsigned PtrSize = Asm->getDataLayout().getPointerSize();
2144
2145 // Build a list of CUs used.
Eric Christopher4287a492013-12-09 23:57:44 +00002146 std::vector<DwarfCompileUnit *> CUs;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002147 for (const auto &it : Spans) {
2148 DwarfCompileUnit *CU = it.first;
Richard Mitton21101b32013-09-19 23:21:01 +00002149 CUs.push_back(CU);
2150 }
2151
2152 // Sort the CU list (again, to ensure consistent output order).
Benjamin Kramer571e2fe2014-03-07 19:41:22 +00002153 std::sort(CUs.begin(), CUs.end(), [](const DwarfUnit *A, const DwarfUnit *B) {
2154 return A->getUniqueID() < B->getUniqueID();
2155 });
Richard Mitton21101b32013-09-19 23:21:01 +00002156
2157 // Emit an arange table for each CU we used.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002158 for (DwarfCompileUnit *CU : CUs) {
Richard Mitton21101b32013-09-19 23:21:01 +00002159 std::vector<ArangeSpan> &List = Spans[CU];
2160
2161 // Emit size of content not including length itself.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002162 unsigned ContentSize =
2163 sizeof(int16_t) + // DWARF ARange version number
2164 sizeof(int32_t) + // Offset of CU in the .debug_info section
2165 sizeof(int8_t) + // Pointer Size (in bytes)
2166 sizeof(int8_t); // Segment Size (in bytes)
Richard Mitton21101b32013-09-19 23:21:01 +00002167
2168 unsigned TupleSize = PtrSize * 2;
2169
2170 // 7.20 in the Dwarf specs requires the table to be aligned to a tuple.
Benjamin Kramer8a68ab32014-01-07 19:28:14 +00002171 unsigned Padding =
2172 OffsetToAlignment(sizeof(int32_t) + ContentSize, TupleSize);
Richard Mitton21101b32013-09-19 23:21:01 +00002173
2174 ContentSize += Padding;
2175 ContentSize += (List.size() + 1) * TupleSize;
2176
2177 // For each compile unit, write the list of spans it covers.
2178 Asm->OutStreamer.AddComment("Length of ARange Set");
2179 Asm->EmitInt32(ContentSize);
2180 Asm->OutStreamer.AddComment("DWARF Arange version number");
2181 Asm->EmitInt16(dwarf::DW_ARANGES_VERSION);
2182 Asm->OutStreamer.AddComment("Offset Into Debug Info Section");
Eric Christopherd8667202013-12-30 17:22:27 +00002183 Asm->EmitSectionOffset(CU->getLocalLabelBegin(), CU->getLocalSectionSym());
Richard Mitton21101b32013-09-19 23:21:01 +00002184 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2185 Asm->EmitInt8(PtrSize);
2186 Asm->OutStreamer.AddComment("Segment Size (in bytes)");
2187 Asm->EmitInt8(0);
2188
Benjamin Kramer8a68ab32014-01-07 19:28:14 +00002189 Asm->OutStreamer.EmitFill(Padding, 0xff);
Richard Mitton21101b32013-09-19 23:21:01 +00002190
Benjamin Kramer15596c72014-03-07 19:09:39 +00002191 for (const ArangeSpan &Span : List) {
Richard Mitton21101b32013-09-19 23:21:01 +00002192 Asm->EmitLabelReference(Span.Start, PtrSize);
2193
2194 // Calculate the size as being from the span start to it's end.
Richard Mitton089ed892013-09-23 17:56:20 +00002195 if (Span.End) {
Richard Mitton21101b32013-09-19 23:21:01 +00002196 Asm->EmitLabelDifference(Span.End, Span.Start, PtrSize);
Richard Mitton089ed892013-09-23 17:56:20 +00002197 } else {
2198 // For symbols without an end marker (e.g. common), we
2199 // write a single arange entry containing just that one symbol.
2200 uint64_t Size = SymSize[Span.Start];
2201 if (Size == 0)
2202 Size = 1;
2203
2204 Asm->OutStreamer.EmitIntValue(Size, PtrSize);
2205 }
Richard Mitton21101b32013-09-19 23:21:01 +00002206 }
2207
2208 Asm->OutStreamer.AddComment("ARange terminator");
2209 Asm->OutStreamer.EmitIntValue(0, PtrSize);
2210 Asm->OutStreamer.EmitIntValue(0, PtrSize);
2211 }
Bill Wendling480ff322009-05-20 23:21:38 +00002212}
2213
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002214// Emit visible names into a debug ranges section.
Devang Patel930143b2009-11-21 02:48:08 +00002215void DwarfDebug::emitDebugRanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002216 // Start the dwarf ranges section.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002217 Asm->OutStreamer.SwitchSection(
2218 Asm->getObjFileLowering().getDwarfRangesSection());
Eric Christopher4751d702013-11-23 00:05:29 +00002219
Eric Christopher0f63d062013-12-03 00:45:45 +00002220 // Size for our labels.
2221 unsigned char Size = Asm->getDataLayout().getPointerSize();
2222
2223 // Grab the specific ranges for the compile units in the module.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002224 for (const auto &I : CUMap) {
2225 DwarfCompileUnit *TheCU = I.second;
Eric Christopher0f63d062013-12-03 00:45:45 +00002226
Eric Christopher0f63d062013-12-03 00:45:45 +00002227 // Iterate over the misc ranges for the compile units in the module.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002228 for (const RangeSpanList &List : TheCU->getRangeLists()) {
Eric Christopherf8790642013-12-04 22:04:50 +00002229 // Emit our symbol so we can find the beginning of the range.
2230 Asm->OutStreamer.EmitLabel(List.getSym());
Eric Christopher0f63d062013-12-03 00:45:45 +00002231
Benjamin Kramer15596c72014-03-07 19:09:39 +00002232 for (const RangeSpan &Range : List.getRanges()) {
Eric Christopher0f63d062013-12-03 00:45:45 +00002233 const MCSymbol *Begin = Range.getStart();
2234 const MCSymbol *End = Range.getEnd();
Eric Christopher565ab112013-12-20 04:34:22 +00002235 assert(Begin && "Range without a begin symbol?");
2236 assert(End && "Range without an end symbol?");
Eric Christopherece0e902014-04-25 22:23:54 +00002237 if (TheCU->getRanges().size() == 1) {
2238 // Grab the begin symbol from the first range as our base.
2239 const MCSymbol *Base = TheCU->getRanges()[0].getStart();
2240 Asm->EmitLabelDifference(Begin, Base, Size);
2241 Asm->EmitLabelDifference(End, Base, Size);
2242 } else {
2243 Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2244 Asm->OutStreamer.EmitSymbolValue(End, Size);
2245 }
Eric Christopher0f63d062013-12-03 00:45:45 +00002246 }
2247
2248 // And terminate the list with two 0 values.
Eric Christopherce0cfce2013-01-09 01:35:34 +00002249 Asm->OutStreamer.EmitIntValue(0, Size);
Eric Christopher0f63d062013-12-03 00:45:45 +00002250 Asm->OutStreamer.EmitIntValue(0, Size);
2251 }
Eric Christopher46e23432013-12-20 04:16:18 +00002252
2253 // Now emit a range for the CU itself.
Eric Christopher384f3fe2014-03-20 19:16:16 +00002254 if (TheCU->getRanges().size() > 1) {
Eric Christopher46e23432013-12-20 04:16:18 +00002255 Asm->OutStreamer.EmitLabel(
2256 Asm->GetTempSymbol("cu_ranges", TheCU->getUniqueID()));
Benjamin Kramer15596c72014-03-07 19:09:39 +00002257 for (const RangeSpan &Range : TheCU->getRanges()) {
Eric Christopher46e23432013-12-20 04:16:18 +00002258 const MCSymbol *Begin = Range.getStart();
2259 const MCSymbol *End = Range.getEnd();
Eric Christopher565ab112013-12-20 04:34:22 +00002260 assert(Begin && "Range without a begin symbol?");
2261 assert(End && "Range without an end symbol?");
2262 Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2263 Asm->OutStreamer.EmitSymbolValue(End, Size);
Eric Christopher46e23432013-12-20 04:16:18 +00002264 }
2265 // And terminate the list with two 0 values.
2266 Asm->OutStreamer.EmitIntValue(0, Size);
2267 Asm->OutStreamer.EmitIntValue(0, Size);
2268 }
Devang Patel12563b32010-04-16 23:33:45 +00002269 }
Bill Wendling480ff322009-05-20 23:21:38 +00002270}
2271
Eric Christopherd692c1d2012-12-11 19:42:09 +00002272// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002273
David Blaikie65a74662014-04-25 18:26:14 +00002274void DwarfDebug::initSkeletonUnit(const DwarfUnit &U, DIE &Die,
David Blaikief9b6a552014-04-22 22:39:41 +00002275 std::unique_ptr<DwarfUnit> NewU) {
David Blaikie38fe6342014-01-09 04:28:46 +00002276 NewU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
David Blaikief9b6a552014-04-22 22:39:41 +00002277 U.getCUNode().getSplitDebugFilename());
David Blaikie38fe6342014-01-09 04:28:46 +00002278
David Blaikie38fe6342014-01-09 04:28:46 +00002279 if (!CompilationDir.empty())
2280 NewU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
2281
David Blaikief9b6a552014-04-22 22:39:41 +00002282 addGnuPubAttributes(*NewU, Die);
David Blaikie38fe6342014-01-09 04:28:46 +00002283
David Blaikief9b6a552014-04-22 22:39:41 +00002284 SkeletonHolder.addUnit(std::move(NewU));
David Blaikie38fe6342014-01-09 04:28:46 +00002285}
2286
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002287// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2288// 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 +00002289// DW_AT_addr_base, DW_AT_ranges_base.
David Blaikief9b6a552014-04-22 22:39:41 +00002290DwarfCompileUnit &DwarfDebug::constructSkeletonCU(const DwarfCompileUnit &CU) {
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002291
David Blaikief9b6a552014-04-22 22:39:41 +00002292 auto OwnedUnit = make_unique<DwarfCompileUnit>(
David Blaikiebd579052014-04-28 21:14:27 +00002293 CU.getUniqueID(), CU.getCUNode(), Asm, this, &SkeletonHolder);
David Blaikief9b6a552014-04-22 22:39:41 +00002294 DwarfCompileUnit &NewCU = *OwnedUnit;
2295 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
David Blaikie637cac42014-04-22 23:09:36 +00002296 DwarfInfoSectionSym);
Eric Christopher4c7765f2013-01-17 03:00:04 +00002297
David Blaikief9b6a552014-04-22 22:39:41 +00002298 NewCU.initStmtList(DwarfLineSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002299
David Blaikie92a2f8a2014-04-28 21:04:29 +00002300 initSkeletonUnit(CU, NewCU.getUnitDie(), std::move(OwnedUnit));
Eric Christopherc8a310e2012-12-10 23:34:43 +00002301
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002302 return NewCU;
2303}
2304
David Blaikie15ed5eb2014-01-10 01:38:41 +00002305// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_dwo_name,
2306// DW_AT_addr_base.
David Blaikief9b6a552014-04-22 22:39:41 +00002307DwarfTypeUnit &DwarfDebug::constructSkeletonTU(DwarfTypeUnit &TU) {
David Blaikie60e63862014-02-14 23:58:13 +00002308 DwarfCompileUnit &CU = static_cast<DwarfCompileUnit &>(
David Blaikief9b6a552014-04-22 22:39:41 +00002309 *SkeletonHolder.getUnits()[TU.getCU().getUniqueID()]);
David Blaikie15ed5eb2014-01-10 01:38:41 +00002310
David Blaikiebd579052014-04-28 21:14:27 +00002311 auto OwnedUnit = make_unique<DwarfTypeUnit>(TU.getUniqueID(), CU, Asm, this,
2312 &SkeletonHolder);
David Blaikief9b6a552014-04-22 22:39:41 +00002313 DwarfTypeUnit &NewTU = *OwnedUnit;
2314 NewTU.setTypeSignature(TU.getTypeSignature());
Craig Topper353eda42014-04-24 06:44:33 +00002315 NewTU.setType(nullptr);
David Blaikief9b6a552014-04-22 22:39:41 +00002316 NewTU.initSection(
2317 Asm->getObjFileLowering().getDwarfTypesSection(TU.getTypeSignature()));
David Blaikie15ed5eb2014-01-10 01:38:41 +00002318
David Blaikie92a2f8a2014-04-28 21:04:29 +00002319 initSkeletonUnit(TU, NewTU.getUnitDie(), std::move(OwnedUnit));
David Blaikie15ed5eb2014-01-10 01:38:41 +00002320 return NewTU;
2321}
2322
Eric Christopherd692c1d2012-12-11 19:42:09 +00002323// Emit the .debug_info.dwo section for separated dwarf. This contains the
2324// compile units that would normally be in debug_info.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002325void DwarfDebug::emitDebugInfoDWO() {
Eric Christophercdf218d2012-12-10 19:51:21 +00002326 assert(useSplitDwarf() && "No split dwarf debug info?");
David Blaikie326e1fa2014-04-02 02:04:51 +00002327 // Don't pass an abbrev symbol, using a constant zero instead so as not to
2328 // emit relocations into the dwo file.
Eric Christopher793c7472014-04-28 20:42:22 +00002329 InfoHolder.emitUnits(this, /* AbbrevSymbol */ nullptr);
Eric Christopher3c5a1912012-12-19 22:02:53 +00002330}
2331
2332// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2333// abbreviations for the .debug_info.dwo section.
2334void DwarfDebug::emitDebugAbbrevDWO() {
2335 assert(useSplitDwarf() && "No split dwarf?");
David Blaikie0504cda2013-12-05 07:43:55 +00002336 InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection());
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002337}
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002338
David Blaikie4a2f95f2014-03-18 01:17:26 +00002339void DwarfDebug::emitDebugLineDWO() {
2340 assert(useSplitDwarf() && "No split dwarf?");
2341 Asm->OutStreamer.SwitchSection(
2342 Asm->getObjFileLowering().getDwarfLineDWOSection());
David Blaikie8287aff2014-03-18 02:13:23 +00002343 SplitTypeUnitFileTable.Emit(Asm->OutStreamer);
David Blaikie4a2f95f2014-03-18 01:17:26 +00002344}
2345
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002346// Emit the .debug_str.dwo section for separated dwarf. This contains the
2347// string section and is identical in format to traditional .debug_str
2348// sections.
2349void DwarfDebug::emitDebugStrDWO() {
2350 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002351 const MCSection *OffSec =
2352 Asm->getObjFileLowering().getDwarfStrOffDWOSection();
Eric Christopher2cbd5762013-01-07 19:32:41 +00002353 const MCSymbol *StrSym = DwarfStrSectionSym;
2354 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2355 OffSec, StrSym);
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002356}
David Blaikie409dd9c2013-11-19 23:08:21 +00002357
David Blaikie47f4b822014-03-19 00:11:28 +00002358MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) {
2359 if (!useSplitDwarf())
2360 return nullptr;
2361 if (SingleCU)
2362 SplitTypeUnitFileTable.setCompilationDir(CU.getCUNode().getDirectory());
2363 return &SplitTypeUnitFileTable;
2364}
2365
David Blaikief3de2ab2014-04-26 16:26:41 +00002366static uint64_t makeTypeSignature(StringRef Identifier) {
2367 MD5 Hash;
2368 Hash.update(Identifier);
2369 // ... take the least significant 8 bytes and return those. Our MD5
2370 // implementation always returns its results in little endian, swap bytes
2371 // appropriately.
2372 MD5::MD5Result Result;
2373 Hash.final(Result);
2374 return *reinterpret_cast<support::ulittle64_t *>(Result + 8);
2375}
2376
David Blaikie15632ae2014-02-12 00:31:30 +00002377void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU,
David Blaikie65a74662014-04-25 18:26:14 +00002378 StringRef Identifier, DIE &RefDie,
David Blaikief645f962014-01-09 03:23:41 +00002379 DICompositeType CTy) {
David Blaikiee12b49a2014-04-26 17:27:38 +00002380 // Fast path if we're building some type units and one has already used the
2381 // address pool we know we're going to throw away all this work anyway, so
2382 // don't bother building dependent types.
2383 if (!TypeUnitsUnderConstruction.empty() && AddrPool.hasBeenUsed())
2384 return;
2385
David Blaikie47f615e2013-12-17 23:32:35 +00002386 const DwarfTypeUnit *&TU = DwarfTypeUnits[CTy];
Chandler Carruthb587ab62014-01-20 08:07:07 +00002387 if (TU) {
David Blaikie15632ae2014-02-12 00:31:30 +00002388 CU.addDIETypeSignature(RefDie, *TU);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002389 return;
David Blaikie409dd9c2013-11-19 23:08:21 +00002390 }
2391
David Blaikiee12b49a2014-04-26 17:27:38 +00002392 bool TopLevelType = TypeUnitsUnderConstruction.empty();
2393 AddrPool.resetUsedFlag();
2394
David Blaikie2da282b2014-05-21 23:27:41 +00002395 auto OwnedUnit =
2396 make_unique<DwarfTypeUnit>(InfoHolder.getUnits().size(), CU, Asm, this,
2397 &InfoHolder, getDwoLineTable(CU));
David Blaikief9b6a552014-04-22 22:39:41 +00002398 DwarfTypeUnit &NewTU = *OwnedUnit;
David Blaikie92a2f8a2014-04-28 21:04:29 +00002399 DIE &UnitDie = NewTU.getUnitDie();
David Blaikief9b6a552014-04-22 22:39:41 +00002400 TU = &NewTU;
Eric Christopher793c7472014-04-28 20:42:22 +00002401 TypeUnitsUnderConstruction.push_back(
2402 std::make_pair(std::move(OwnedUnit), CTy));
Chandler Carruthb587ab62014-01-20 08:07:07 +00002403
David Blaikie92a2f8a2014-04-28 21:04:29 +00002404 NewTU.addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
David Blaikie637cac42014-04-22 23:09:36 +00002405 CU.getLanguage());
Chandler Carruthb587ab62014-01-20 08:07:07 +00002406
David Blaikief3de2ab2014-04-26 16:26:41 +00002407 uint64_t Signature = makeTypeSignature(Identifier);
David Blaikief9b6a552014-04-22 22:39:41 +00002408 NewTU.setTypeSignature(Signature);
David Blaikief3de2ab2014-04-26 16:26:41 +00002409
David Blaikie2da282b2014-05-21 23:27:41 +00002410 if (!useSplitDwarf())
David Blaikie92a2f8a2014-04-28 21:04:29 +00002411 CU.applyStmtList(UnitDie);
David Blaikie2da282b2014-05-21 23:27:41 +00002412
David Blaikie05b85842014-05-23 16:53:14 +00002413 // FIXME: Skip using COMDAT groups for type units in the .dwo file once tools
2414 // such as DWP ( http://gcc.gnu.org/wiki/DebugFissionDWP ) can cope with it.
David Blaikie2da282b2014-05-21 23:27:41 +00002415 NewTU.initSection(
2416 useSplitDwarf()
2417 ? Asm->getObjFileLowering().getDwarfTypesDWOSection(Signature)
2418 : Asm->getObjFileLowering().getDwarfTypesSection(Signature));
Chandler Carruthb587ab62014-01-20 08:07:07 +00002419
David Blaikief3de2ab2014-04-26 16:26:41 +00002420 NewTU.setType(NewTU.createTypeDIE(CTy));
2421
David Blaikiee12b49a2014-04-26 17:27:38 +00002422 if (TopLevelType) {
2423 auto TypeUnitsToAdd = std::move(TypeUnitsUnderConstruction);
2424 TypeUnitsUnderConstruction.clear();
2425
2426 // Types referencing entries in the address table cannot be placed in type
2427 // units.
2428 if (AddrPool.hasBeenUsed()) {
2429
2430 // Remove all the types built while building this type.
2431 // This is pessimistic as some of these types might not be dependent on
2432 // the type that used an address.
2433 for (const auto &TU : TypeUnitsToAdd)
2434 DwarfTypeUnits.erase(TU.second);
2435
2436 // Construct this type in the CU directly.
2437 // This is inefficient because all the dependent types will be rebuilt
2438 // from scratch, including building them in type units, discovering that
2439 // they depend on addresses, throwing them out and rebuilding them.
2440 CU.constructTypeDIE(RefDie, CTy);
2441 return;
2442 }
2443
2444 // If the type wasn't dependent on fission addresses, finish adding the type
2445 // and all its dependent types.
2446 for (auto &TU : TypeUnitsToAdd) {
2447 if (useSplitDwarf())
2448 TU.first->setSkeleton(constructSkeletonTU(*TU.first));
2449 InfoHolder.addUnit(std::move(TU.first));
2450 }
2451 }
David Blaikief9b6a552014-04-22 22:39:41 +00002452 CU.addDIETypeSignature(RefDie, NewTU);
David Blaikie409dd9c2013-11-19 23:08:21 +00002453}
David Blaikie4bd13b72014-03-07 18:49:45 +00002454
David Blaikie65a74662014-04-25 18:26:14 +00002455void DwarfDebug::attachLowHighPC(DwarfCompileUnit &Unit, DIE &D,
David Blaikie4bd13b72014-03-07 18:49:45 +00002456 MCSymbol *Begin, MCSymbol *End) {
David Blaikie4a3b84d2014-05-16 16:42:40 +00002457 assert(Begin && "Begin label should not be null!");
2458 assert(End && "End label should not be null!");
2459 assert(Begin->isDefined() && "Invalid starting label");
2460 assert(End->isDefined() && "Invalid end label");
2461
David Blaikief9b6a552014-04-22 22:39:41 +00002462 Unit.addLabelAddress(D, dwarf::DW_AT_low_pc, Begin);
Adrian Prantl887e7072014-03-07 23:07:21 +00002463 if (DwarfVersion < 4)
David Blaikief9b6a552014-04-22 22:39:41 +00002464 Unit.addLabelAddress(D, dwarf::DW_AT_high_pc, End);
David Blaikie4bd13b72014-03-07 18:49:45 +00002465 else
David Blaikief9b6a552014-04-22 22:39:41 +00002466 Unit.addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin);
David Blaikie4bd13b72014-03-07 18:49:45 +00002467}
David Blaikie2406a0622014-04-23 23:37:35 +00002468
2469// Accelerator table mutators - add each name along with its companion
2470// DIE to the proper table while ensuring that the name that we're going
2471// to reference is in the string table. We do this since the names we
2472// add may not only be identical to the names in the DIE.
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002473void DwarfDebug::addAccelName(StringRef Name, const DIE &Die) {
David Blaikie2406a0622014-04-23 23:37:35 +00002474 if (!useDwarfAccelTables())
2475 return;
David Blaikie772ab8a2014-04-25 22:21:35 +00002476 AccelNames.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2477 &Die);
David Blaikie2406a0622014-04-23 23:37:35 +00002478}
David Blaikie0ee82b92014-04-24 00:53:32 +00002479
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002480void DwarfDebug::addAccelObjC(StringRef Name, const DIE &Die) {
David Blaikie0ee82b92014-04-24 00:53:32 +00002481 if (!useDwarfAccelTables())
2482 return;
David Blaikie772ab8a2014-04-25 22:21:35 +00002483 AccelObjC.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2484 &Die);
David Blaikie0ee82b92014-04-24 00:53:32 +00002485}
David Blaikieecf04152014-04-24 01:02:42 +00002486
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002487void DwarfDebug::addAccelNamespace(StringRef Name, const DIE &Die) {
David Blaikieecf04152014-04-24 01:02:42 +00002488 if (!useDwarfAccelTables())
2489 return;
David Blaikie772ab8a2014-04-25 22:21:35 +00002490 AccelNamespace.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2491 &Die);
David Blaikieecf04152014-04-24 01:02:42 +00002492}
David Blaikie18d33752014-04-24 01:23:49 +00002493
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002494void DwarfDebug::addAccelType(StringRef Name, const DIE &Die, char Flags) {
David Blaikie18d33752014-04-24 01:23:49 +00002495 if (!useDwarfAccelTables())
2496 return;
David Blaikie772ab8a2014-04-25 22:21:35 +00002497 AccelTypes.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2498 &Die);
David Blaikie18d33752014-04-24 01:23:49 +00002499}