blob: 549e991829e7f689143f121a5763c3692a6a8e39 [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
121
Nick Lewycky019d2552011-07-29 03:49:23 +0000122DIType DbgVariable::getType() const {
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000123 DIType Ty = Var.getType().resolve(DD->getTypeIdentifierMap());
Devang Patelf20c4f72011-04-12 22:53:02 +0000124 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
125 // addresses instead.
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000126 if (Var.isBlockByrefVariable(DD->getTypeIdentifierMap())) {
Devang Patelf20c4f72011-04-12 22:53:02 +0000127 /* Byref variables, in Blocks, are declared by the programmer as
128 "SomeType VarName;", but the compiler creates a
129 __Block_byref_x_VarName struct, and gives the variable VarName
130 either the struct, or a pointer to the struct, as its type. This
131 is necessary for various behind-the-scenes things the compiler
132 needs to do with by-reference variables in blocks.
Eric Christopher6a841382012-11-19 22:42:10 +0000133
Devang Patelf20c4f72011-04-12 22:53:02 +0000134 However, as far as the original *programmer* is concerned, the
135 variable should still have type 'SomeType', as originally declared.
Eric Christopher6a841382012-11-19 22:42:10 +0000136
Devang Patelf20c4f72011-04-12 22:53:02 +0000137 The following function dives into the __Block_byref_x_VarName
138 struct to find the original type of the variable. This will be
139 passed back to the code generating the type for the Debug
140 Information Entry for the variable 'VarName'. 'VarName' will then
141 have the original type 'SomeType' in its debug information.
Eric Christopher6a841382012-11-19 22:42:10 +0000142
Devang Patelf20c4f72011-04-12 22:53:02 +0000143 The original type 'SomeType' will be the type of the field named
144 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher6a841382012-11-19 22:42:10 +0000145
Devang Patelf20c4f72011-04-12 22:53:02 +0000146 NOTE: In order for this to not completely fail on the debugger
147 side, the Debug Information Entry for the variable VarName needs to
148 have a DW_AT_location that tells the debugger how to unwind through
149 the pointers and __Block_byref_x_VarName struct to find the actual
150 value of the variable. The function addBlockByrefType does this. */
151 DIType subType = Ty;
Eric Christopher31b05762013-08-08 01:41:00 +0000152 uint16_t tag = Ty.getTag();
Eric Christopher6a841382012-11-19 22:42:10 +0000153
Eric Christopher9adc55f2013-09-04 19:53:21 +0000154 if (tag == dwarf::DW_TAG_pointer_type)
Manman Renbe5576f2013-10-08 19:07:44 +0000155 subType = resolve(DIDerivedType(Ty).getTypeDerivedFrom());
Eric Christopher6a841382012-11-19 22:42:10 +0000156
Eric Christopher9adc55f2013-09-04 19:53:21 +0000157 DIArray Elements = DICompositeType(subType).getTypeArray();
Devang Patelf20c4f72011-04-12 22:53:02 +0000158 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
David Blaikie5af2aca2013-11-18 23:57:26 +0000159 DIDerivedType DT(Elements.getElement(i));
Devang Patelf20c4f72011-04-12 22:53:02 +0000160 if (getName() == DT.getName())
Manman Renbe5576f2013-10-08 19:07:44 +0000161 return (resolve(DT.getTypeDerivedFrom()));
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000162 }
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000163 }
Devang Patelf20c4f72011-04-12 22:53:02 +0000164 return Ty;
165}
Bill Wendling2f921f82009-05-15 09:23:25 +0000166
Chris Lattnerf0d6bd32010-04-05 05:11:15 +0000167DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
David Blaikiec2df16b2014-03-17 18:13:58 +0000168 : Asm(A), MMI(Asm->MMI), FirstCU(0), PrevLabel(NULL), GlobalRangeCount(0),
Eric Christopher384f3fe2014-03-20 19:16:16 +0000169 InfoHolder(A, "info_string", DIEValueAllocator),
Eric Christopher2037caf2014-01-28 00:49:26 +0000170 UsedNonDefaultText(false),
David Blaikie2406a0622014-04-23 23:37:35 +0000171 SkeletonHolder(A, "skel_string", DIEValueAllocator),
172 AccelNames(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
David Blaikie0ee82b92014-04-24 00:53:32 +0000173 dwarf::DW_FORM_data4)),
174 AccelObjC(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
175 dwarf::DW_FORM_data4)) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000176
Eric Christopher50effa02014-01-03 02:16:44 +0000177 DwarfInfoSectionSym = DwarfAbbrevSectionSym = DwarfStrSectionSym = 0;
Eric Christopher74804332013-02-07 21:19:50 +0000178 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = DwarfLineSectionSym = 0;
David Blaikie7f1f8742014-04-01 16:13:29 +0000179 DwarfAddrSectionSym = 0;
Eric Christopher3bf29fd2012-12-27 02:14:01 +0000180 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
Devang Patel9fc11702010-05-25 23:40:22 +0000181 FunctionBeginSym = FunctionEndSym = 0;
Eric Christophera5a79422013-12-09 23:32:48 +0000182 CurFn = 0;
183 CurMI = 0;
Eric Christopherad9fe892012-04-02 17:58:52 +0000184
Adrian Prantl5bf1d002013-10-15 20:26:37 +0000185 // Turn on accelerator tables for Darwin by default, pubnames by
186 // default for non-Darwin, and handle split dwarf.
Eric Christopher203e12b2013-04-27 01:07:52 +0000187 bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin();
Eric Christopher4977f212012-08-23 22:36:36 +0000188
Eric Christopher574b5c82013-08-19 21:41:38 +0000189 if (DwarfAccelTables == Default)
190 HasDwarfAccelTables = IsDarwin;
191 else
Eric Christopher5297df02013-08-26 20:58:35 +0000192 HasDwarfAccelTables = DwarfAccelTables == Enable;
Eric Christopher20b76a72012-08-23 22:36:40 +0000193
Eric Christophercdf218d2012-12-10 19:51:21 +0000194 if (SplitDwarf == Default)
195 HasSplitDwarf = false;
Eric Christopher29424312012-11-12 22:22:20 +0000196 else
Eric Christopher574b5c82013-08-19 21:41:38 +0000197 HasSplitDwarf = SplitDwarf == Enable;
Eric Christopher29424312012-11-12 22:22:20 +0000198
Eric Christopher4d36ca02013-08-26 23:24:35 +0000199 if (DwarfPubSections == Default)
200 HasDwarfPubSections = !IsDarwin;
Eric Christopher574b5c82013-08-19 21:41:38 +0000201 else
Eric Christopher4d36ca02013-08-26 23:24:35 +0000202 HasDwarfPubSections = DwarfPubSections == Enable;
Eric Christopher7da24882013-08-19 21:07:38 +0000203
Eric Christopher942f22c2014-01-11 00:28:12 +0000204 DwarfVersion = DwarfVersionNumber
205 ? DwarfVersionNumber
Diego Novillo0915c042014-04-17 22:33:50 +0000206 : MMI->getModule()->getDwarfVersion();
Manman Renac8062b2013-07-02 23:40:10 +0000207
Dan Gohman6e681a52010-06-18 15:56:31 +0000208 {
209 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopher58f41952012-11-19 22:42:15 +0000210 beginModule();
Torok Edwinf8dba242010-04-07 10:44:46 +0000211 }
Bill Wendling2f921f82009-05-15 09:23:25 +0000212}
Bill Wendling2f921f82009-05-15 09:23:25 +0000213
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000214// Switch to the specified MCSection and emit an assembler
215// temporary label to it if SymbolStem is specified.
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000216static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Eric Christophera7b61892011-11-07 09:18:38 +0000217 const char *SymbolStem = 0) {
218 Asm->OutStreamer.SwitchSection(Section);
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000219 if (!SymbolStem)
220 return 0;
Eric Christophera7b61892011-11-07 09:18:38 +0000221
222 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
223 Asm->OutStreamer.EmitLabel(TmpSym);
224 return TmpSym;
225}
226
Eric Christopherd9843b32011-11-10 19:25:34 +0000227static bool isObjCClass(StringRef Name) {
228 return Name.startswith("+") || Name.startswith("-");
229}
230
231static bool hasObjCCategory(StringRef Name) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000232 if (!isObjCClass(Name))
233 return false;
Eric Christopherd9843b32011-11-10 19:25:34 +0000234
Benjamin Kramer260de742013-08-24 12:15:54 +0000235 return Name.find(") ") != StringRef::npos;
Eric Christopherd9843b32011-11-10 19:25:34 +0000236}
237
238static void getObjCClassCategory(StringRef In, StringRef &Class,
239 StringRef &Category) {
240 if (!hasObjCCategory(In)) {
241 Class = In.slice(In.find('[') + 1, In.find(' '));
242 Category = "";
243 return;
244 }
245
246 Class = In.slice(In.find('[') + 1, In.find('('));
247 Category = In.slice(In.find('[') + 1, In.find(' '));
248 return;
249}
250
251static StringRef getObjCMethodName(StringRef In) {
252 return In.slice(In.find(' ') + 1, In.find(']'));
253}
254
Richard Mittonc2508242013-10-03 22:07:08 +0000255// Helper for sorting sections into a stable output order.
256static bool SectionSort(const MCSection *A, const MCSection *B) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000257 std::string LA = (A ? A->getLabelBeginName() : "");
258 std::string LB = (B ? B->getLabelBeginName() : "");
259 return LA < LB;
Richard Mittonc2508242013-10-03 22:07:08 +0000260}
261
Eric Christopherd9843b32011-11-10 19:25:34 +0000262// Add the various names to the Dwarf accelerator table names.
Eric Christopher9cd26af2013-09-20 23:22:52 +0000263// TODO: Determine whether or not we should add names for programs
264// that do not have a DW_AT_name or DW_AT_linkage_name field - this
265// is only slightly different than the lookup of non-standard ObjC names.
David Blaikief2505d62014-04-23 23:38:39 +0000266void DwarfDebug::addSubprogramNames(DwarfUnit &TheU, DISubprogram SP,
267 DIE *Die) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000268 if (!SP.isDefinition())
269 return;
David Blaikie2406a0622014-04-23 23:37:35 +0000270 addAccelName(SP.getName(), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000271
272 // If the linkage name is different than the name, go ahead and output
273 // that as well into the name table.
274 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
David Blaikie2406a0622014-04-23 23:37:35 +0000275 addAccelName(SP.getLinkageName(), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000276
277 // If this is an Objective-C selector name add it to the ObjC accelerator
278 // too.
279 if (isObjCClass(SP.getName())) {
280 StringRef Class, Category;
281 getObjCClassCategory(SP.getName(), Class, Category);
David Blaikie0ee82b92014-04-24 00:53:32 +0000282 addAccelObjC(Class, Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000283 if (Category != "")
David Blaikie0ee82b92014-04-24 00:53:32 +0000284 addAccelObjC(Category, Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000285 // Also add the base method name to the name table.
David Blaikie2406a0622014-04-23 23:37:35 +0000286 addAccelName(getObjCMethodName(SP.getName()), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000287 }
288}
289
Manman Ren3eb9dff2013-09-09 19:05:21 +0000290/// isSubprogramContext - Return true if Context is either a subprogram
291/// or another context nested inside a subprogram.
292bool DwarfDebug::isSubprogramContext(const MDNode *Context) {
293 if (!Context)
294 return false;
295 DIDescriptor D(Context);
296 if (D.isSubprogram())
297 return true;
298 if (D.isType())
Manman Ren116868e2013-09-09 19:47:11 +0000299 return isSubprogramContext(resolve(DIType(Context).getContext()));
Manman Ren3eb9dff2013-09-09 19:05:21 +0000300 return false;
301}
302
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000303// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
304// and DW_AT_high_pc attributes. If there are global variables in this
305// scope then create and insert DIEs for these variables.
David Blaikief9b6a552014-04-22 22:39:41 +0000306DIE *DwarfDebug::updateSubprogramScopeDIE(DwarfCompileUnit &SPCU,
Eric Christopher4287a492013-12-09 23:57:44 +0000307 DISubprogram SP) {
David Blaikief9b6a552014-04-22 22:39:41 +0000308 DIE *SPDie = SPCU.getDIE(SP);
Devang Patela37a95e2010-07-07 22:20:57 +0000309
Chris Lattner3a383cb2010-04-05 00:13:49 +0000310 assert(SPDie && "Unable to find subprogram DIE!");
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000311
Bill Wendlingf720bf62012-11-07 05:19:04 +0000312 // If we're updating an abstract DIE, then we will be adding the children and
313 // object pointer later on. But what we don't want to do is process the
314 // concrete DIE twice.
David Blaikie25bc7192013-11-15 23:13:08 +0000315 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SP)) {
Bill Wendlingf720bf62012-11-07 05:19:04 +0000316 // Pick up abstract subprogram DIE.
David Blaikie637cac42014-04-22 23:09:36 +0000317 SPDie = SPCU.createAndAddDIE(dwarf::DW_TAG_subprogram, *SPCU.getUnitDie());
David Blaikief9b6a552014-04-22 22:39:41 +0000318 SPCU.addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin, AbsSPDIE);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000319 } else {
320 DISubprogram SPDecl = SP.getFunctionDeclaration();
321 if (!SPDecl.isSubprogram()) {
322 // There is not any need to generate specification DIE for a function
323 // defined at compile unit level. If a function is defined inside another
324 // function then gdb prefers the definition at top level and but does not
325 // expect specification DIE in parent function. So avoid creating
326 // specification DIE for a function defined inside a function.
Manman Renc50fa112013-10-10 18:40:01 +0000327 DIScope SPContext = resolve(SP.getContext());
328 if (SP.isDefinition() && !SPContext.isCompileUnit() &&
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000329 !SPContext.isFile() && !isSubprogramContext(SPContext)) {
David Blaikief9b6a552014-04-22 22:39:41 +0000330 SPCU.addFlag(SPDie, dwarf::DW_AT_declaration);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000331
332 // Add arguments.
333 DICompositeType SPTy = SP.getType();
334 DIArray Args = SPTy.getTypeArray();
Eric Christopher31b05762013-08-08 01:41:00 +0000335 uint16_t SPTag = SPTy.getTag();
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000336 if (SPTag == dwarf::DW_TAG_subroutine_type)
David Blaikief9b6a552014-04-22 22:39:41 +0000337 SPCU.constructSubprogramArguments(*SPDie, Args);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000338 DIE *SPDeclDie = SPDie;
David Blaikie637cac42014-04-22 23:09:36 +0000339 SPDie =
340 SPCU.createAndAddDIE(dwarf::DW_TAG_subprogram, *SPCU.getUnitDie());
David Blaikief9b6a552014-04-22 22:39:41 +0000341 SPCU.addDIEEntry(SPDie, dwarf::DW_AT_specification, SPDeclDie);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000342 }
343 }
Devang Patela37a95e2010-07-07 22:20:57 +0000344 }
345
David Blaikie4bd13b72014-03-07 18:49:45 +0000346 attachLowHighPC(SPCU, SPDie, FunctionBeginSym, FunctionEndSym);
Eric Christopher0f63d062013-12-03 00:45:45 +0000347
Chris Lattner3a383cb2010-04-05 00:13:49 +0000348 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
349 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
David Blaikief9b6a552014-04-22 22:39:41 +0000350 SPCU.addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patel6efc8e52010-02-06 01:02:37 +0000351
Eric Christopherd9843b32011-11-10 19:25:34 +0000352 // Add name to the name table, we do this here because we're guaranteed
353 // to have concrete versions of our DW_TAG_subprogram nodes.
354 addSubprogramNames(SPCU, SP, SPDie);
Eric Christopher6a841382012-11-19 22:42:10 +0000355
Chris Lattner3a383cb2010-04-05 00:13:49 +0000356 return SPDie;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000357}
358
Manman Ren5b2f4b02013-09-11 19:40:28 +0000359/// Check whether we should create a DIE for the given Scope, return true
360/// if we don't create a DIE (the corresponding DIE is null).
Manman Ren2312ed32013-09-10 18:40:41 +0000361bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
362 if (Scope->isAbstractScope())
363 return false;
364
Manman Ren5b2f4b02013-09-11 19:40:28 +0000365 // We don't create a DIE if there is no Range.
Manman Ren2312ed32013-09-10 18:40:41 +0000366 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
367 if (Ranges.empty())
368 return true;
369
370 if (Ranges.size() > 1)
371 return false;
372
Manman Ren5b2f4b02013-09-11 19:40:28 +0000373 // We don't create a DIE if we have a single Range and the end label
374 // is null.
Manman Ren2312ed32013-09-10 18:40:41 +0000375 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
376 MCSymbol *End = getLabelAfterInsn(RI->second);
377 return !End;
378}
379
David Blaikief9b6a552014-04-22 22:39:41 +0000380static void addSectionLabel(AsmPrinter &Asm, DwarfUnit &U, DIE *D,
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000381 dwarf::Attribute A, const MCSymbol *L,
382 const MCSymbol *Sec) {
David Blaikief9b6a552014-04-22 22:39:41 +0000383 if (Asm.MAI->doesDwarfUseRelocationsAcrossSections())
384 U.addSectionLabel(D, A, L);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000385 else
David Blaikief9b6a552014-04-22 22:39:41 +0000386 U.addSectionDelta(D, A, L, Sec);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000387}
388
David Blaikief9b6a552014-04-22 22:39:41 +0000389void DwarfDebug::addScopeRangeList(DwarfCompileUnit &TheCU, DIE *ScopeDIE,
Eric Christopherbe2513e2013-12-03 00:45:59 +0000390 const SmallVectorImpl<InsnRange> &Range) {
391 // Emit offset in .debug_range as a relocatable label. emitDIE will handle
392 // emitting it appropriately.
Eric Christopherf8790642013-12-04 22:04:50 +0000393 MCSymbol *RangeSym = Asm->GetTempSymbol("debug_ranges", GlobalRangeCount++);
David Blaikie26b2bd02014-03-24 21:07:27 +0000394
395 // Under fission, ranges are specified by constant offsets relative to the
396 // CU's DW_AT_GNU_ranges_base.
397 if (useSplitDwarf())
David Blaikief9b6a552014-04-22 22:39:41 +0000398 TheCU.addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
David Blaikie637cac42014-04-22 23:09:36 +0000399 DwarfDebugRangeSectionSym);
David Blaikie26b2bd02014-03-24 21:07:27 +0000400 else
David Blaikief9b6a552014-04-22 22:39:41 +0000401 addSectionLabel(*Asm, TheCU, ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
David Blaikie26b2bd02014-03-24 21:07:27 +0000402 DwarfDebugRangeSectionSym);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000403
Eric Christopherf8790642013-12-04 22:04:50 +0000404 RangeSpanList List(RangeSym);
Benjamin Kramer15596c72014-03-07 19:09:39 +0000405 for (const InsnRange &R : Range) {
406 RangeSpan Span(getLabelBeforeInsn(R.first), getLabelAfterInsn(R.second));
Chandler Carruth002da5d2014-03-02 04:08:41 +0000407 List.addRange(std::move(Span));
Eric Christopherbe2513e2013-12-03 00:45:59 +0000408 }
409
410 // Add the range list to the set of ranges to be emitted.
David Blaikief9b6a552014-04-22 22:39:41 +0000411 TheCU.addRangeList(std::move(List));
Eric Christopherbe2513e2013-12-03 00:45:59 +0000412}
413
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000414// Construct new DW_TAG_lexical_block for this scope and attach
415// DW_AT_low_pc/DW_AT_high_pc labels.
David Blaikief9b6a552014-04-22 22:39:41 +0000416DIE *DwarfDebug::constructLexicalScopeDIE(DwarfCompileUnit &TheCU,
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000417 LexicalScope *Scope) {
Manman Ren2312ed32013-09-10 18:40:41 +0000418 if (isLexicalScopeDIENull(Scope))
419 return 0;
420
Devang Patel6c74a872010-04-27 19:46:33 +0000421 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
422 if (Scope->isAbstractScope())
423 return ScopeDIE;
424
Eric Christopher0f63d062013-12-03 00:45:45 +0000425 const SmallVectorImpl<InsnRange> &ScopeRanges = Scope->getRanges();
Eric Christopherbe2513e2013-12-03 00:45:59 +0000426
Eric Christopherdc42ea82013-07-03 01:57:28 +0000427 // If we have multiple ranges, emit them into the range section.
Eric Christopher0f63d062013-12-03 00:45:45 +0000428 if (ScopeRanges.size() > 1) {
Eric Christopherbe2513e2013-12-03 00:45:59 +0000429 addScopeRangeList(TheCU, ScopeDIE, ScopeRanges);
Devang Patel6c74a872010-04-27 19:46:33 +0000430 return ScopeDIE;
431 }
432
Eric Christopherdc42ea82013-07-03 01:57:28 +0000433 // Construct the address range for this DIE.
Eric Christopher0f63d062013-12-03 00:45:45 +0000434 SmallVectorImpl<InsnRange>::const_iterator RI = ScopeRanges.begin();
Eric Christopher962c9082013-01-15 23:56:56 +0000435 MCSymbol *Start = getLabelBeforeInsn(RI->first);
436 MCSymbol *End = getLabelAfterInsn(RI->second);
Manman Ren2312ed32013-09-10 18:40:41 +0000437 assert(End && "End label should not be null!");
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000438
Chris Lattnere13c3722010-03-09 01:58:53 +0000439 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
440 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000441
David Blaikie26ab6c62014-03-08 00:58:20 +0000442 attachLowHighPC(TheCU, ScopeDIE, Start, End);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000443
444 return ScopeDIE;
445}
446
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000447// This scope represents inlined body of a function. Construct DIE to
448// represent this concrete inlined copy of the function.
David Blaikief9b6a552014-04-22 22:39:41 +0000449DIE *DwarfDebug::constructInlinedScopeDIE(DwarfCompileUnit &TheCU,
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000450 LexicalScope *Scope) {
Eric Christopher0f63d062013-12-03 00:45:45 +0000451 const SmallVectorImpl<InsnRange> &ScopeRanges = Scope->getRanges();
Eric Christopher1cdb63d2013-12-04 21:20:15 +0000452 assert(!ScopeRanges.empty() &&
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000453 "LexicalScope does not have instruction markers!");
Devang Patel6c74a872010-04-27 19:46:33 +0000454
Devang Patelf098ce22011-07-27 00:34:13 +0000455 if (!Scope->getScopeNode())
456 return NULL;
457 DIScope DS(Scope->getScopeNode());
458 DISubprogram InlinedSP = getDISubprogram(DS);
David Blaikief9b6a552014-04-22 22:39:41 +0000459 DIE *OriginDIE = TheCU.getDIE(InlinedSP);
Devang Patelf098ce22011-07-27 00:34:13 +0000460 if (!OriginDIE) {
Bill Wendling10e0e2e2012-10-30 17:51:02 +0000461 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Devang Patelf098ce22011-07-27 00:34:13 +0000462 return NULL;
463 }
464
Devang Patel73bc1722011-05-05 17:54:26 +0000465 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
David Blaikief9b6a552014-04-22 22:39:41 +0000466 TheCU.addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin, OriginDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000467
Eric Christopherbe2513e2013-12-03 00:45:59 +0000468 // If we have multiple ranges, emit them into the range section.
469 if (ScopeRanges.size() > 1)
470 addScopeRangeList(TheCU, ScopeDIE, ScopeRanges);
471 else {
Eric Christopher0f63d062013-12-03 00:45:45 +0000472 SmallVectorImpl<InsnRange>::const_iterator RI = ScopeRanges.begin();
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000473 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
474 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
475
476 if (StartLabel == 0 || EndLabel == 0)
477 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
478
479 assert(StartLabel->isDefined() &&
480 "Invalid starting label for an inlined scope!");
481 assert(EndLabel->isDefined() && "Invalid end label for an inlined scope!");
482
David Blaikie555e79a2014-03-07 22:00:56 +0000483 attachLowHighPC(TheCU, ScopeDIE, StartLabel, EndLabel);
Devang Patelf098ce22011-07-27 00:34:13 +0000484 }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000485
486 InlinedSubprogramDIEs.insert(OriginDIE);
487
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000488 // Add the call site information to the DIE.
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000489 DILocation DL(Scope->getInlinedAt());
David Blaikie637cac42014-04-22 23:09:36 +0000490 TheCU.addUInt(ScopeDIE, dwarf::DW_AT_call_file, None,
491 TheCU.getOrCreateSourceID(DL.getFilename(), DL.getDirectory()));
David Blaikief9b6a552014-04-22 22:39:41 +0000492 TheCU.addUInt(ScopeDIE, dwarf::DW_AT_call_line, None, DL.getLineNumber());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000493
Eric Christopher8dda5d02011-12-04 06:02:38 +0000494 // Add name to the name table, we do this here because we're guaranteed
495 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
496 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
Eric Christopher6a841382012-11-19 22:42:10 +0000497
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000498 return ScopeDIE;
499}
500
David Blaikief9b6a552014-04-22 22:39:41 +0000501DIE *DwarfDebug::createScopeChildrenDIE(DwarfCompileUnit &TheCU,
Eric Christopher4287a492013-12-09 23:57:44 +0000502 LexicalScope *Scope,
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000503 SmallVectorImpl<DIE *> &Children) {
504 DIE *ObjectPointer = NULL;
Devang Patel6c622ef2011-03-01 22:58:55 +0000505
506 // Collect arguments for current function.
Adrian Prantl3f49c892014-02-25 19:57:42 +0000507 if (LScopes.isCurrentFunctionScope(Scope)) {
David Blaikieafd2c6b2014-04-22 05:41:06 +0000508 for (DbgVariable *ArgDV : CurrentFnArguments)
509 if (ArgDV)
510 if (DIE *Arg =
David Blaikief9b6a552014-04-22 22:39:41 +0000511 TheCU.constructVariableDIE(*ArgDV, Scope->isAbstractScope())) {
David Blaikieafd2c6b2014-04-22 05:41:06 +0000512 Children.push_back(Arg);
513 if (ArgDV->isObjectPointer())
514 ObjectPointer = Arg;
515 }
Devang Patel6c622ef2011-03-01 22:58:55 +0000516
Adrian Prantl69140d22014-02-25 22:27:14 +0000517 // If this is a variadic function, add an unspecified parameter.
Adrian Prantl3f49c892014-02-25 19:57:42 +0000518 DISubprogram SP(Scope->getScopeNode());
Adrian Prantl3f49c892014-02-25 19:57:42 +0000519 DIArray FnArgs = SP.getType().getTypeArray();
Eric Christopher73ffdb82014-02-26 02:50:56 +0000520 if (FnArgs.getElement(FnArgs.getNumElements() - 1)
521 .isUnspecifiedParameter()) {
Adrian Prantl3f49c892014-02-25 19:57:42 +0000522 DIE *Ellipsis = new DIE(dwarf::DW_TAG_unspecified_parameters);
523 Children.push_back(Ellipsis);
524 }
525 }
526
Eric Christopherf84354b2011-10-03 15:49:16 +0000527 // Collect lexical scope children first.
David Blaikieafd2c6b2014-04-22 05:41:06 +0000528 for (DbgVariable *DV : ScopeVariables.lookup(Scope))
David Blaikie637cac42014-04-22 23:09:36 +0000529 if (DIE *Variable =
530 TheCU.constructVariableDIE(*DV, Scope->isAbstractScope())) {
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000531 Children.push_back(Variable);
David Blaikieafd2c6b2014-04-22 05:41:06 +0000532 if (DV->isObjectPointer())
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000533 ObjectPointer = Variable;
Eric Christopherc1c8a1b2012-09-21 22:18:52 +0000534 }
Benjamin Kramer15596c72014-03-07 19:09:39 +0000535 for (LexicalScope *LS : Scope->getChildren())
536 if (DIE *Nested = constructScopeDIE(TheCU, LS))
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000537 Children.push_back(Nested);
Manman Ren2312ed32013-09-10 18:40:41 +0000538 return ObjectPointer;
539}
540
541// Construct a DIE for this scope.
David Blaikief9b6a552014-04-22 22:39:41 +0000542DIE *DwarfDebug::constructScopeDIE(DwarfCompileUnit &TheCU,
Eric Christopher4287a492013-12-09 23:57:44 +0000543 LexicalScope *Scope) {
Manman Ren2312ed32013-09-10 18:40:41 +0000544 if (!Scope || !Scope->getScopeNode())
545 return NULL;
546
Adrian Prantl78619f72014-03-21 22:16:32 +0000547 DIScope DS(Scope->getScopeNode());
Manman Ren2312ed32013-09-10 18:40:41 +0000548
549 SmallVector<DIE *, 8> Children;
550 DIE *ObjectPointer = NULL;
551 bool ChildrenCreated = false;
552
Manman Ren5b2f4b02013-09-11 19:40:28 +0000553 // We try to create the scope DIE first, then the children DIEs. This will
554 // avoid creating un-used children then removing them later when we find out
555 // the scope DIE is null.
Devang Patel3b548aa2010-03-08 20:52:55 +0000556 DIE *ScopeDIE = NULL;
557 if (Scope->getInlinedAt())
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000558 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3b548aa2010-03-08 20:52:55 +0000559 else if (DS.isSubprogram()) {
Devang Pateld10b2af2010-06-28 20:53:04 +0000560 ProcessedSPNodes.insert(DS);
Devang Patela37a95e2010-07-07 22:20:57 +0000561 if (Scope->isAbstractScope()) {
David Blaikief9b6a552014-04-22 22:39:41 +0000562 ScopeDIE = TheCU.getDIE(DS);
Devang Patela37a95e2010-07-07 22:20:57 +0000563 // Note down abstract DIE.
564 if (ScopeDIE)
565 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
David Blaikiee26a3772013-11-18 23:59:04 +0000566 } else
David Blaikie25bc7192013-11-15 23:13:08 +0000567 ScopeDIE = updateSubprogramScopeDIE(TheCU, DISubprogram(DS));
David Blaikiee26a3772013-11-18 23:59:04 +0000568 } else {
Manman Ren5b2f4b02013-09-11 19:40:28 +0000569 // Early exit when we know the scope DIE is going to be null.
Manman Ren2312ed32013-09-10 18:40:41 +0000570 if (isLexicalScopeDIENull(Scope))
571 return NULL;
Manman Ren5b2f4b02013-09-11 19:40:28 +0000572
573 // We create children here when we know the scope DIE is not going to be
574 // null and the children will be added to the scope DIE.
Manman Ren2312ed32013-09-10 18:40:41 +0000575 ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children);
576 ChildrenCreated = true;
Manman Ren5b2f4b02013-09-11 19:40:28 +0000577
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000578 // There is no need to emit empty lexical block DIE.
David Blaikie684fc532013-05-06 23:33:07 +0000579 std::pair<ImportedEntityMap::const_iterator,
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000580 ImportedEntityMap::const_iterator> Range =
581 std::equal_range(
582 ScopesWithImportedEntities.begin(),
583 ScopesWithImportedEntities.end(),
584 std::pair<const MDNode *, const MDNode *>(DS, (const MDNode *)0),
585 less_first());
David Blaikie684fc532013-05-06 23:33:07 +0000586 if (Children.empty() && Range.first == Range.second)
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000587 return NULL;
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000588 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Manman Ren2312ed32013-09-10 18:40:41 +0000589 assert(ScopeDIE && "Scope DIE should not be null.");
Eric Christopher5fdd68e2013-06-24 23:20:02 +0000590 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
591 ++i)
David Blaikie4dd2de72013-05-08 06:01:38 +0000592 constructImportedEntityDIE(TheCU, i->second, ScopeDIE);
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000593 }
Eric Christopher6a841382012-11-19 22:42:10 +0000594
Benjamin Kramer892daba2013-08-24 11:55:49 +0000595 if (!ScopeDIE) {
Manman Ren2312ed32013-09-10 18:40:41 +0000596 assert(Children.empty() &&
597 "We create children only when the scope DIE is not null.");
Benjamin Kramer892daba2013-08-24 11:55:49 +0000598 return NULL;
599 }
Manman Ren2312ed32013-09-10 18:40:41 +0000600 if (!ChildrenCreated)
Manman Ren5b2f4b02013-09-11 19:40:28 +0000601 // We create children when the scope DIE is not null.
Manman Ren2312ed32013-09-10 18:40:41 +0000602 ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children);
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000603
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000604 // Add children
Benjamin Kramer15596c72014-03-07 19:09:39 +0000605 for (DIE *I : Children)
606 ScopeDIE->addChild(I);
Devang Patel04d2f2d2009-11-24 01:14:22 +0000607
Eric Christophere3417762012-09-12 23:36:19 +0000608 if (DS.isSubprogram() && ObjectPointer != NULL)
David Blaikief9b6a552014-04-22 22:39:41 +0000609 TheCU.addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, ObjectPointer);
Eric Christophere3417762012-09-12 23:36:19 +0000610
Eric Christopherd9843b32011-11-10 19:25:34 +0000611 return ScopeDIE;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000612}
613
David Blaikief9b6a552014-04-22 22:39:41 +0000614void DwarfDebug::addGnuPubAttributes(DwarfUnit &U, DIE *D) const {
David Blaikie3c842622013-12-04 21:31:26 +0000615 if (!GenerateGnuPubSections)
616 return;
617
David Blaikief9b6a552014-04-22 22:39:41 +0000618 U.addFlag(D, dwarf::DW_AT_GNU_pubnames);
David Blaikie3c842622013-12-04 21:31:26 +0000619}
620
Eric Christopher4287a492013-12-09 23:57:44 +0000621// Create new DwarfCompileUnit for the given metadata node with tag
Eric Christopher48fef592012-12-20 21:58:40 +0000622// DW_TAG_compile_unit.
David Blaikief9b6a552014-04-22 22:39:41 +0000623DwarfCompileUnit &DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) {
Devang Patel2d9caf92009-11-25 17:36:49 +0000624 StringRef FN = DIUnit.getFilename();
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000625 CompilationDir = DIUnit.getDirectory();
Bill Wendling2b128d72009-05-20 23:19:06 +0000626
627 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
David Blaikief9b6a552014-04-22 22:39:41 +0000628 auto OwnedUnit = make_unique<DwarfCompileUnit>(
Eric Christopher4287a492013-12-09 23:57:44 +0000629 InfoHolder.getUnits().size(), Die, DIUnit, Asm, this, &InfoHolder);
David Blaikief9b6a552014-04-22 22:39:41 +0000630 DwarfCompileUnit &NewCU = *OwnedUnit;
631 InfoHolder.addUnit(std::move(OwnedUnit));
632
David Blaikie7ac51492014-03-20 17:05:45 +0000633 // LTO with assembly output shares a single line table amongst multiple CUs.
634 // To avoid the compilation directory being ambiguous, let the line table
635 // explicitly describe the directory of all files, never relying on the
636 // compilation directory.
David Blaikie47f4b822014-03-19 00:11:28 +0000637 if (!Asm->OutStreamer.hasRawTextSupport() || SingleCU)
David Blaikiee05274d2014-03-18 00:11:48 +0000638 Asm->OutStreamer.getContext().setMCLineTableCompilationDir(
David Blaikief9b6a552014-04-22 22:39:41 +0000639 NewCU.getUniqueID(), CompilationDir);
David Blaikie2666e242013-12-06 19:38:46 +0000640
David Blaikief9b6a552014-04-22 22:39:41 +0000641 NewCU.addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
642 NewCU.addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
David Blaikie637cac42014-04-22 23:09:36 +0000643 DIUnit.getLanguage());
David Blaikief9b6a552014-04-22 22:39:41 +0000644 NewCU.addString(Die, dwarf::DW_AT_name, FN);
Eric Christopher52ce7182013-04-09 19:23:15 +0000645
Eric Christopher52ce7182013-04-09 19:23:15 +0000646 if (!useSplitDwarf()) {
David Blaikief9b6a552014-04-22 22:39:41 +0000647 NewCU.initStmtList(DwarfLineSectionSym);
Eric Christophera51d3fc2013-09-27 22:50:48 +0000648
649 // If we're using split dwarf the compilation dir is going to be in the
650 // skeleton CU and so we don't need to duplicate it here.
651 if (!CompilationDir.empty())
David Blaikief9b6a552014-04-22 22:39:41 +0000652 NewCU.addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christophera51d3fc2013-09-27 22:50:48 +0000653
David Blaikie3c842622013-12-04 21:31:26 +0000654 addGnuPubAttributes(NewCU, Die);
Eric Christopher52ce7182013-04-09 19:23:15 +0000655 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000656
Bill Wendling2b128d72009-05-20 23:19:06 +0000657 if (DIUnit.isOptimized())
David Blaikief9b6a552014-04-22 22:39:41 +0000658 NewCU.addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendling2b128d72009-05-20 23:19:06 +0000659
Devang Patel2d9caf92009-11-25 17:36:49 +0000660 StringRef Flags = DIUnit.getFlags();
661 if (!Flags.empty())
David Blaikief9b6a552014-04-22 22:39:41 +0000662 NewCU.addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher6a841382012-11-19 22:42:10 +0000663
Nick Lewycky479a8fe2011-10-17 23:27:36 +0000664 if (unsigned RVer = DIUnit.getRunTimeVersion())
David Blaikief9b6a552014-04-22 22:39:41 +0000665 NewCU.addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
David Blaikie637cac42014-04-22 23:09:36 +0000666 dwarf::DW_FORM_data1, RVer);
Bill Wendling2b128d72009-05-20 23:19:06 +0000667
Devang Patel1a0df9a2010-05-10 22:49:55 +0000668 if (!FirstCU)
David Blaikief9b6a552014-04-22 22:39:41 +0000669 FirstCU = &NewCU;
Eric Christopher7a2cdf72013-02-05 07:31:55 +0000670
Eric Christopherd4368fd2014-01-02 21:03:28 +0000671 if (useSplitDwarf()) {
David Blaikief9b6a552014-04-22 22:39:41 +0000672 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoDWOSection(),
David Blaikie637cac42014-04-22 23:09:36 +0000673 DwarfInfoDWOSectionSym);
David Blaikief9b6a552014-04-22 22:39:41 +0000674 NewCU.setSkeleton(constructSkeletonCU(NewCU));
Eric Christopherd4368fd2014-01-02 21:03:28 +0000675 } else
David Blaikief9b6a552014-04-22 22:39:41 +0000676 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
David Blaikie637cac42014-04-22 23:09:36 +0000677 DwarfInfoSectionSym);
Eric Christopherd039baa2013-12-30 03:40:32 +0000678
David Blaikief9b6a552014-04-22 22:39:41 +0000679 CUMap.insert(std::make_pair(DIUnit, &NewCU));
680 CUDieMap.insert(std::make_pair(Die, &NewCU));
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000681 return NewCU;
Devang Patel1a0df9a2010-05-10 22:49:55 +0000682}
683
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000684// Construct subprogram DIE.
David Blaikief9b6a552014-04-22 22:39:41 +0000685void DwarfDebug::constructSubprogramDIE(DwarfCompileUnit &TheCU,
Eric Christopher4287a492013-12-09 23:57:44 +0000686 const MDNode *N) {
Eric Christopherffbc4de2013-10-18 01:57:30 +0000687 // FIXME: We should only call this routine once, however, during LTO if a
688 // program is defined in multiple CUs we could end up calling it out of
689 // beginModule as we walk the CUs.
690
Eric Christopher4287a492013-12-09 23:57:44 +0000691 DwarfCompileUnit *&CURef = SPMap[N];
Eric Christopherffbc4de2013-10-18 01:57:30 +0000692 if (CURef)
693 return;
David Blaikief9b6a552014-04-22 22:39:41 +0000694 CURef = &TheCU;
Rafael Espindola6cf4e832011-11-04 19:00:29 +0000695
Devang Patel80ae3492009-08-28 23:24:31 +0000696 DISubprogram SP(N);
Bill Wendling2b128d72009-05-20 23:19:06 +0000697 if (!SP.isDefinition())
698 // This is a method declaration which will be handled while constructing
699 // class type.
Devang Patel0751a282009-06-26 01:49:18 +0000700 return;
Bill Wendling2b128d72009-05-20 23:19:06 +0000701
David Blaikief9b6a552014-04-22 22:39:41 +0000702 DIE *SubprogramDie = TheCU.getOrCreateSubprogramDIE(SP);
Stuart Hastings4bd3dd92010-04-06 21:38:29 +0000703
Eric Christopherba506db2013-09-09 20:03:20 +0000704 // Expose as a global name.
David Blaikief9b6a552014-04-22 22:39:41 +0000705 TheCU.addGlobalName(SP.getName(), SubprogramDie, resolve(SP.getContext()));
Bill Wendling2b128d72009-05-20 23:19:06 +0000706}
707
David Blaikief9b6a552014-04-22 22:39:41 +0000708void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
David Blaikief55abea2013-04-22 06:12:31 +0000709 const MDNode *N) {
David Blaikie1fd43652013-05-07 21:35:53 +0000710 DIImportedEntity Module(N);
David Blaikie5e390e42014-02-04 01:23:52 +0000711 assert(Module.Verify());
David Blaikief9b6a552014-04-22 22:39:41 +0000712 if (DIE *D = TheCU.getOrCreateContextDIE(Module.getContext()))
David Blaikie4dd2de72013-05-08 06:01:38 +0000713 constructImportedEntityDIE(TheCU, Module, D);
David Blaikie684fc532013-05-06 23:33:07 +0000714}
715
David Blaikief9b6a552014-04-22 22:39:41 +0000716void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
Eric Christopher4287a492013-12-09 23:57:44 +0000717 const MDNode *N, DIE *Context) {
David Blaikie1fd43652013-05-07 21:35:53 +0000718 DIImportedEntity Module(N);
David Blaikie5e390e42014-02-04 01:23:52 +0000719 assert(Module.Verify());
David Blaikie4dd2de72013-05-08 06:01:38 +0000720 return constructImportedEntityDIE(TheCU, Module, Context);
David Blaikie684fc532013-05-06 23:33:07 +0000721}
722
David Blaikief9b6a552014-04-22 22:39:41 +0000723void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
David Blaikie1fd43652013-05-07 21:35:53 +0000724 const DIImportedEntity &Module,
David Blaikie684fc532013-05-06 23:33:07 +0000725 DIE *Context) {
726 assert(Module.Verify() &&
727 "Use one of the MDNode * overloads to handle invalid metadata");
728 assert(Context && "Should always have a context for an imported_module");
David Blaikief9b6a552014-04-22 22:39:41 +0000729 DIE *IMDie = TheCU.createAndAddDIE(Module.getTag(), *Context, Module);
David Blaikie1fd43652013-05-07 21:35:53 +0000730 DIE *EntityDie;
Adrian Prantld09ba232014-04-01 03:41:04 +0000731 DIDescriptor Entity = resolve(Module.getEntity());
David Blaikie1fd43652013-05-07 21:35:53 +0000732 if (Entity.isNameSpace())
David Blaikief9b6a552014-04-22 22:39:41 +0000733 EntityDie = TheCU.getOrCreateNameSpace(DINameSpace(Entity));
David Blaikie1fd43652013-05-07 21:35:53 +0000734 else if (Entity.isSubprogram())
David Blaikief9b6a552014-04-22 22:39:41 +0000735 EntityDie = TheCU.getOrCreateSubprogramDIE(DISubprogram(Entity));
David Blaikie3b6038b2013-05-08 06:01:41 +0000736 else if (Entity.isType())
David Blaikief9b6a552014-04-22 22:39:41 +0000737 EntityDie = TheCU.getOrCreateTypeDIE(DIType(Entity));
David Blaikie1fd43652013-05-07 21:35:53 +0000738 else
David Blaikief9b6a552014-04-22 22:39:41 +0000739 EntityDie = TheCU.getDIE(Entity);
740 TheCU.addSourceLine(IMDie, Module.getLineNumber(),
David Blaikie637cac42014-04-22 23:09:36 +0000741 Module.getContext().getFilename(),
742 Module.getContext().getDirectory());
David Blaikief9b6a552014-04-22 22:39:41 +0000743 TheCU.addDIEEntry(IMDie, dwarf::DW_AT_import, EntityDie);
David Blaikiee63d5d12013-05-20 22:50:35 +0000744 StringRef Name = Module.getName();
745 if (!Name.empty())
David Blaikief9b6a552014-04-22 22:39:41 +0000746 TheCU.addString(IMDie, dwarf::DW_AT_name, Name);
David Blaikief55abea2013-04-22 06:12:31 +0000747}
748
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000749// Emit all Dwarf sections that should come prior to the content. Create
750// global DIEs and emit initial debug info sections. This is invoked by
751// the target AsmPrinter.
Eric Christopher58f41952012-11-19 22:42:15 +0000752void DwarfDebug::beginModule() {
Devang Patel6c74a872010-04-27 19:46:33 +0000753 if (DisableDebugInfoPrinting)
754 return;
755
Eric Christopher58f41952012-11-19 22:42:15 +0000756 const Module *M = MMI->getModule();
757
Nick Lewycky019d2552011-07-29 03:49:23 +0000758 // If module has named metadata anchors then use them, otherwise scan the
759 // module using debug info finder to collect debug info.
Devang Patele02e5852011-05-03 16:45:22 +0000760 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiedc69ebb2013-03-11 23:39:23 +0000761 if (!CU_Nodes)
Devang Patel07bb9ee2011-08-15 23:47:24 +0000762 return;
Manman Ren60352032013-09-05 18:48:31 +0000763 TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
Devang Patele02e5852011-05-03 16:45:22 +0000764
David Blaikiedc69ebb2013-03-11 23:39:23 +0000765 // Emit initial sections so we can reference labels later.
766 emitSectionLabels();
767
David Blaikie47f4b822014-03-19 00:11:28 +0000768 SingleCU = CU_Nodes->getNumOperands() == 1;
David Blaikiee05274d2014-03-18 00:11:48 +0000769
David Blaikie47f4b822014-03-19 00:11:28 +0000770 for (MDNode *N : CU_Nodes->operands()) {
Benjamin Kramer15596c72014-03-07 19:09:39 +0000771 DICompileUnit CUNode(N);
David Blaikief9b6a552014-04-22 22:39:41 +0000772 DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode);
David Blaikie1fd43652013-05-07 21:35:53 +0000773 DIArray ImportedEntities = CUNode.getImportedEntities();
774 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikie684fc532013-05-06 23:33:07 +0000775 ScopesWithImportedEntities.push_back(std::make_pair(
David Blaikie1fd43652013-05-07 21:35:53 +0000776 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
777 ImportedEntities.getElement(i)));
David Blaikie684fc532013-05-06 23:33:07 +0000778 std::sort(ScopesWithImportedEntities.begin(),
Benjamin Kramerb12cf012013-08-24 12:54:27 +0000779 ScopesWithImportedEntities.end(), less_first());
David Blaikiedc69ebb2013-03-11 23:39:23 +0000780 DIArray GVs = CUNode.getGlobalVariables();
781 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
David Blaikief9b6a552014-04-22 22:39:41 +0000782 CU.createGlobalVariableDIE(DIGlobalVariable(GVs.getElement(i)));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000783 DIArray SPs = CUNode.getSubprograms();
784 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
785 constructSubprogramDIE(CU, SPs.getElement(i));
786 DIArray EnumTypes = CUNode.getEnumTypes();
787 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
David Blaikief9b6a552014-04-22 22:39:41 +0000788 CU.getOrCreateTypeDIE(EnumTypes.getElement(i));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000789 DIArray RetainedTypes = CUNode.getRetainedTypes();
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000790 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i) {
791 DIType Ty(RetainedTypes.getElement(i));
792 // The retained types array by design contains pointers to
793 // MDNodes rather than DIRefs. Unique them here.
794 DIType UniqueTy(resolve(Ty.getRef()));
David Blaikief9b6a552014-04-22 22:39:41 +0000795 CU.getOrCreateTypeDIE(UniqueTy);
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000796 }
David Blaikief55abea2013-04-22 06:12:31 +0000797 // Emit imported_modules last so that the relevant context is already
798 // available.
David Blaikie1fd43652013-05-07 21:35:53 +0000799 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
800 constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000801 }
Eric Christopher6a841382012-11-19 22:42:10 +0000802
Chris Lattner7cfa70e2010-04-05 02:19:28 +0000803 // Tell MMI that we have debug info.
804 MMI->setDebugInfoAvailability(true);
Eric Christopher6a841382012-11-19 22:42:10 +0000805
Bill Wendling2b128d72009-05-20 23:19:06 +0000806 // Prime section data.
Richard Mitton21101b32013-09-19 23:21:01 +0000807 SectionMap[Asm->getObjFileLowering().getTextSection()];
Bill Wendling2b128d72009-05-20 23:19:06 +0000808}
809
Eric Christopher960ac372012-11-22 00:59:49 +0000810// Attach DW_AT_inline attribute with inlined subprogram DIEs.
811void DwarfDebug::computeInlinedDIEs() {
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000812 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
Benjamin Kramer15596c72014-03-07 19:09:39 +0000813 for (DIE *ISP : InlinedSubprogramDIEs)
David Blaikief2443192013-10-21 17:28:37 +0000814 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
Benjamin Kramer15596c72014-03-07 19:09:39 +0000815
816 for (const auto &AI : AbstractSPDies) {
817 DIE *ISP = AI.second;
Rafael Espindolae7cc8bf2011-11-12 01:57:54 +0000818 if (InlinedSubprogramDIEs.count(ISP))
819 continue;
David Blaikief2443192013-10-21 17:28:37 +0000820 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
Rafael Espindolae7cc8bf2011-11-12 01:57:54 +0000821 }
Eric Christopher960ac372012-11-22 00:59:49 +0000822}
823
824// Collect info for variables that were optimized out.
825void DwarfDebug::collectDeadVariables() {
826 const Module *M = MMI->getModule();
Eric Christopher960ac372012-11-22 00:59:49 +0000827
828 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
Benjamin Kramer15596c72014-03-07 19:09:39 +0000829 for (MDNode *N : CU_Nodes->operands()) {
830 DICompileUnit TheCU(N);
Eric Christopher960ac372012-11-22 00:59:49 +0000831 DIArray Subprograms = TheCU.getSubprograms();
832 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopher735401c2012-11-27 00:13:51 +0000833 DISubprogram SP(Subprograms.getElement(i));
Eric Christophera6c38a32013-10-15 23:31:38 +0000834 if (ProcessedSPNodes.count(SP) != 0)
835 continue;
836 if (!SP.isSubprogram())
837 continue;
838 if (!SP.isDefinition())
839 continue;
Eric Christopher735401c2012-11-27 00:13:51 +0000840 DIArray Variables = SP.getVariables();
Eric Christophera6c38a32013-10-15 23:31:38 +0000841 if (Variables.getNumElements() == 0)
842 continue;
Eric Christopher960ac372012-11-22 00:59:49 +0000843
Eric Christopher735401c2012-11-27 00:13:51 +0000844 // Construct subprogram DIE and add variables DIEs.
Eric Christopher4287a492013-12-09 23:57:44 +0000845 DwarfCompileUnit *SPCU =
846 static_cast<DwarfCompileUnit *>(CUMap.lookup(TheCU));
Eric Christopher735401c2012-11-27 00:13:51 +0000847 assert(SPCU && "Unable to find Compile Unit!");
Eric Christopherc798d8a2013-10-22 00:22:39 +0000848 // FIXME: See the comment in constructSubprogramDIE about duplicate
849 // subprogram DIEs.
David Blaikief9b6a552014-04-22 22:39:41 +0000850 constructSubprogramDIE(*SPCU, SP);
Eric Christopherc798d8a2013-10-22 00:22:39 +0000851 DIE *SPDIE = SPCU->getDIE(SP);
Eric Christopher735401c2012-11-27 00:13:51 +0000852 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
853 DIVariable DV(Variables.getElement(vi));
Eric Christophera6c38a32013-10-15 23:31:38 +0000854 if (!DV.isVariable())
855 continue;
Manman Renb3388602013-10-05 01:43:03 +0000856 DbgVariable NewVar(DV, NULL, this);
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000857 if (DIE *VariableDIE = SPCU->constructVariableDIE(NewVar, false))
Eric Christophera6c38a32013-10-15 23:31:38 +0000858 SPDIE->addChild(VariableDIE);
Eric Christopher735401c2012-11-27 00:13:51 +0000859 }
Eric Christopher960ac372012-11-22 00:59:49 +0000860 }
861 }
862 }
Eric Christopher960ac372012-11-22 00:59:49 +0000863}
864
865void DwarfDebug::finalizeModuleInfo() {
866 // Collect info for variables that were optimized out.
867 collectDeadVariables();
868
869 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
870 computeInlinedDIEs();
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000871
Eric Christopherad10cb52013-12-04 23:24:38 +0000872 // Handle anything that needs to be done on a per-unit basis after
873 // all other generation.
David Blaikiec33b3cd2014-04-22 21:27:37 +0000874 for (const auto &TheU : getUnits()) {
Eric Christopher60eb7692013-08-12 20:27:48 +0000875 // Emit DW_AT_containing_type attribute to connect types with their
876 // vtable holding type.
David Blaikie2a80e442013-12-02 22:09:48 +0000877 TheU->constructContainingTypeDIEs();
Eric Christopher60eb7692013-08-12 20:27:48 +0000878
Eric Christopher46e23432013-12-20 04:16:18 +0000879 // Add CU specific attributes if we need to add any.
880 if (TheU->getUnitDie()->getTag() == dwarf::DW_TAG_compile_unit) {
881 // If we're splitting the dwarf out now that we've got the entire
Eric Christopherd8667202013-12-30 17:22:27 +0000882 // CU then add the dwo id to it.
883 DwarfCompileUnit *SkCU =
884 static_cast<DwarfCompileUnit *>(TheU->getSkeleton());
Eric Christopher46e23432013-12-20 04:16:18 +0000885 if (useSplitDwarf()) {
Eric Christopher09d1c0f2014-03-14 21:20:07 +0000886 // Emit a unique identifier for this CU.
887 uint64_t ID = DIEHash(Asm).computeCUSignature(*TheU->getUnitDie());
Eric Christopher46e23432013-12-20 04:16:18 +0000888 TheU->addUInt(TheU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
889 dwarf::DW_FORM_data8, ID);
Eric Christopher46e23432013-12-20 04:16:18 +0000890 SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
891 dwarf::DW_FORM_data8, ID);
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000892
893 // We don't keep track of which addresses are used in which CU so this
894 // is a bit pessimistic under LTO.
David Blaikied75fb282014-04-23 21:20:10 +0000895 if (!AddrPool.isEmpty())
David Blaikief9b6a552014-04-22 22:39:41 +0000896 addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000897 dwarf::DW_AT_GNU_addr_base, DwarfAddrSectionSym,
898 DwarfAddrSectionSym);
899 if (!TheU->getRangeLists().empty())
David Blaikief9b6a552014-04-22 22:39:41 +0000900 addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000901 dwarf::DW_AT_GNU_ranges_base,
902 DwarfDebugRangeSectionSym, DwarfDebugRangeSectionSym);
Eric Christopherd29614f2013-08-13 01:21:55 +0000903 }
Eric Christopherd8667202013-12-30 17:22:27 +0000904
Eric Christopher384f3fe2014-03-20 19:16:16 +0000905 // If we have code split among multiple sections or non-contiguous
906 // ranges of code then emit a DW_AT_ranges attribute on the unit that will
907 // remain in the .o file, otherwise add a DW_AT_low_pc.
908 // FIXME: We should use ranges allow reordering of code ala
909 // .subsections_via_symbols in mach-o. This would mean turning on
910 // ranges for all subprogram DIEs for mach-o.
David Blaikiec33b3cd2014-04-22 21:27:37 +0000911 DwarfCompileUnit &U =
912 SkCU ? *SkCU : static_cast<DwarfCompileUnit &>(*TheU);
Eric Christopher384f3fe2014-03-20 19:16:16 +0000913 unsigned NumRanges = TheU->getRanges().size();
914 if (NumRanges) {
915 if (NumRanges > 1) {
David Blaikief9b6a552014-04-22 22:39:41 +0000916 addSectionLabel(*Asm, U, U.getUnitDie(), dwarf::DW_AT_ranges,
David Blaikiec33b3cd2014-04-22 21:27:37 +0000917 Asm->GetTempSymbol("cu_ranges", U.getUniqueID()),
Eric Christopher384f3fe2014-03-20 19:16:16 +0000918 DwarfDebugRangeSectionSym);
Eric Christopher8873ada2014-01-29 22:22:56 +0000919
Eric Christopher384f3fe2014-03-20 19:16:16 +0000920 // A DW_AT_low_pc attribute may also be specified in combination with
921 // DW_AT_ranges to specify the default base address for use in
922 // location lists (see Section 2.6.2) and range lists (see Section
923 // 2.17.3).
David Blaikiec33b3cd2014-04-22 21:27:37 +0000924 U.addUInt(U.getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
925 0);
Eric Christopher384f3fe2014-03-20 19:16:16 +0000926 } else {
927 RangeSpan &Range = TheU->getRanges().back();
David Blaikiec33b3cd2014-04-22 21:27:37 +0000928 U.addLocalLabelAddress(U.getUnitDie(), dwarf::DW_AT_low_pc,
929 Range.getStart());
930 U.addLabelDelta(U.getUnitDie(), dwarf::DW_AT_high_pc, Range.getEnd(),
931 Range.getStart());
Eric Christopher384f3fe2014-03-20 19:16:16 +0000932 }
933 }
Eric Christopher60eb7692013-08-12 20:27:48 +0000934 }
935 }
936
937 // Compute DIE offsets and sizes.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000938 InfoHolder.computeSizeAndOffsets();
939 if (useSplitDwarf())
940 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher960ac372012-11-22 00:59:49 +0000941}
942
943void DwarfDebug::endSections() {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000944 // Filter labels by section.
Benjamin Kramer15596c72014-03-07 19:09:39 +0000945 for (const SymbolCU &SCU : ArangeLabels) {
Richard Mitton21101b32013-09-19 23:21:01 +0000946 if (SCU.Sym->isInSection()) {
947 // Make a note of this symbol and it's section.
948 const MCSection *Section = &SCU.Sym->getSection();
949 if (!Section->getKind().isMetadata())
950 SectionMap[Section].push_back(SCU);
951 } else {
952 // Some symbols (e.g. common/bss on mach-o) can have no section but still
953 // appear in the output. This sucks as we rely on sections to build
954 // arange spans. We can do it without, but it's icky.
955 SectionMap[NULL].push_back(SCU);
956 }
957 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000958
Richard Mittonc2508242013-10-03 22:07:08 +0000959 // Build a list of sections used.
960 std::vector<const MCSection *> Sections;
Benjamin Kramer15596c72014-03-07 19:09:39 +0000961 for (const auto &it : SectionMap) {
962 const MCSection *Section = it.first;
Richard Mittonc2508242013-10-03 22:07:08 +0000963 Sections.push_back(Section);
964 }
965
966 // Sort the sections into order.
967 // This is only done to ensure consistent output order across different runs.
968 std::sort(Sections.begin(), Sections.end(), SectionSort);
969
970 // Add terminating symbols for each section.
Benjamin Kramer15596c72014-03-07 19:09:39 +0000971 for (unsigned ID = 0, E = Sections.size(); ID != E; ID++) {
Richard Mittonc2508242013-10-03 22:07:08 +0000972 const MCSection *Section = Sections[ID];
Richard Mitton21101b32013-09-19 23:21:01 +0000973 MCSymbol *Sym = NULL;
974
975 if (Section) {
Richard Mittonc2508242013-10-03 22:07:08 +0000976 // We can't call MCSection::getLabelEndName, as it's only safe to do so
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000977 // if we know the section name up-front. For user-created sections, the
Eric Christopher95531b62014-01-29 22:06:21 +0000978 // resulting label may not be valid to use as a label. (section names can
979 // use a greater set of characters on some systems)
Richard Mittonc2508242013-10-03 22:07:08 +0000980 Sym = Asm->GetTempSymbol("debug_end", ID);
Richard Mitton21101b32013-09-19 23:21:01 +0000981 Asm->OutStreamer.SwitchSection(Section);
982 Asm->OutStreamer.EmitLabel(Sym);
983 }
984
985 // Insert a final terminator.
Alexey Samsonov4436bf02013-10-03 08:54:43 +0000986 SectionMap[Section].push_back(SymbolCU(NULL, Sym));
Bill Wendling2b128d72009-05-20 23:19:06 +0000987 }
Eric Christopher960ac372012-11-22 00:59:49 +0000988}
Bill Wendling2b128d72009-05-20 23:19:06 +0000989
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000990// Emit all Dwarf sections that should come after the content.
Eric Christopher960ac372012-11-22 00:59:49 +0000991void DwarfDebug::endModule() {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +0000992 assert(CurFn == 0);
993 assert(CurMI == 0);
Eric Christopher960ac372012-11-22 00:59:49 +0000994
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000995 if (!FirstCU)
996 return;
Eric Christopher960ac372012-11-22 00:59:49 +0000997
998 // End any existing sections.
999 // TODO: Does this need to happen?
1000 endSections();
1001
1002 // Finalize the debug info for the module.
1003 finalizeModuleInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001004
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001005 emitDebugStr();
Eric Christopher9cd26af2013-09-20 23:22:52 +00001006
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001007 // Emit all the DIEs into a debug info section.
1008 emitDebugInfo();
Eric Christopher4c9b1192012-11-27 00:41:54 +00001009
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001010 // Corresponding abbreviations into a abbrev section.
1011 emitAbbreviations();
Eric Christopher95198f502012-11-27 22:43:42 +00001012
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001013 // Emit info into a debug aranges section.
Eric Christopher02dbadb2014-02-14 01:26:55 +00001014 if (GenerateARangeSection)
1015 emitDebugARanges();
Eric Christopher95198f502012-11-27 22:43:42 +00001016
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001017 // Emit info into a debug ranges section.
1018 emitDebugRanges();
Eric Christopher95198f502012-11-27 22:43:42 +00001019
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001020 if (useSplitDwarf()) {
1021 emitDebugStrDWO();
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001022 emitDebugInfoDWO();
Eric Christopher3c5a1912012-12-19 22:02:53 +00001023 emitDebugAbbrevDWO();
David Blaikie4a2f95f2014-03-18 01:17:26 +00001024 emitDebugLineDWO();
Eric Christopher962c9082013-01-15 23:56:56 +00001025 // Emit DWO addresses.
David Blaikied75fb282014-04-23 21:20:10 +00001026 AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection());
David Blaikie94c1d7f2014-04-02 01:50:20 +00001027 emitDebugLocDWO();
1028 } else
1029 // Emit info into a debug loc section.
1030 emitDebugLoc();
Bill Wendling2b128d72009-05-20 23:19:06 +00001031
Eric Christophera876b822012-08-23 07:32:06 +00001032 // Emit info into the dwarf accelerator table sections.
Eric Christopher20b76a72012-08-23 22:36:40 +00001033 if (useDwarfAccelTables()) {
Eric Christopher4996c702011-11-07 09:24:32 +00001034 emitAccelNames();
1035 emitAccelObjC();
1036 emitAccelNamespaces();
1037 emitAccelTypes();
1038 }
Eric Christopher6a841382012-11-19 22:42:10 +00001039
Eric Christopher4b358182013-08-30 00:40:17 +00001040 // Emit the pubnames and pubtypes sections if requested.
1041 if (HasDwarfPubSections) {
David Blaikie70a33202013-09-19 17:33:35 +00001042 emitDebugPubNames(GenerateGnuPubSections);
1043 emitDebugPubTypes(GenerateGnuPubSections);
Eric Christopher4b358182013-08-30 00:40:17 +00001044 }
Devang Patel04d2f2d2009-11-24 01:14:22 +00001045
Devang Pateld0701282010-08-02 17:32:15 +00001046 // clean up.
Devang Pateleb1bb4e2011-08-16 22:09:43 +00001047 SPMap.clear();
Eric Christopher8afd7b62012-12-10 19:51:18 +00001048
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001049 // Reset these for the next Module if we have one.
1050 FirstCU = NULL;
Bill Wendling2b128d72009-05-20 23:19:06 +00001051}
1052
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001053// Find abstract variable, if any, associated with Var.
Devang Patelbb23a4a2011-08-10 21:50:54 +00001054DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattner915c5f92010-04-02 19:42:39 +00001055 DebugLoc ScopeLoc) {
Devang Patelbb23a4a2011-08-10 21:50:54 +00001056 LLVMContext &Ctx = DV->getContext();
1057 // More then one inlined variable corresponds to one abstract variable.
1058 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001059 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001060 if (AbsDbgVariable)
1061 return AbsDbgVariable;
1062
Devang Patel7e623022011-08-10 20:55:27 +00001063 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001064 if (!Scope)
1065 return NULL;
1066
David Blaikieafd2c6b2014-04-22 05:41:06 +00001067 AbsDbgVariable = new DbgVariable(Var, NULL, this);
1068 addScopeVariable(Scope, AbsDbgVariable);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001069 AbstractVariables[Var] = AbsDbgVariable;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001070 return AbsDbgVariable;
1071}
1072
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001073// If Var is a current function argument then add it to CurrentFnArguments list.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001074bool DwarfDebug::addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope) {
Devang Patel7e623022011-08-10 20:55:27 +00001075 if (!LScopes.isCurrentFunctionScope(Scope))
David Blaikieafd2c6b2014-04-22 05:41:06 +00001076 return false;
1077 DIVariable DV = Var->getVariable();
Devang Patel6c622ef2011-03-01 22:58:55 +00001078 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
David Blaikieafd2c6b2014-04-22 05:41:06 +00001079 return false;
Devang Patel6c622ef2011-03-01 22:58:55 +00001080 unsigned ArgNo = DV.getArgNumber();
Eric Christopher6a841382012-11-19 22:42:10 +00001081 if (ArgNo == 0)
David Blaikieafd2c6b2014-04-22 05:41:06 +00001082 return false;
Devang Patel6c622ef2011-03-01 22:58:55 +00001083
David Blaikieafd2c6b2014-04-22 05:41:06 +00001084 size_t Size = CurrentFnArguments.size();
1085 if (Size == 0)
1086 CurrentFnArguments.resize(CurFn->getFunction()->arg_size());
1087 // llvm::Function argument size is not good indicator of how many
1088 // arguments does the function have at source level.
1089 if (ArgNo > Size)
1090 CurrentFnArguments.resize(ArgNo * 2);
1091 CurrentFnArguments[ArgNo - 1] = Var;
1092 return true;
Devang Patel6c622ef2011-03-01 22:58:55 +00001093}
1094
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001095// Collect variable information from side table maintained by MMI.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001096void DwarfDebug::collectVariableInfoFromMMITable(
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001097 SmallPtrSet<const MDNode *, 16> &Processed) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00001098 for (const auto &VI : MMI->getVariableDbgInfo()) {
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001099 if (!VI.Var)
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001100 continue;
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001101 Processed.insert(VI.Var);
1102 DIVariable DV(VI.Var);
1103 LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001104
Devang Patelcdb7d442009-11-10 23:20:04 +00001105 // If variable scope is not found then skip this variable.
Chris Lattner915c5f92010-04-02 19:42:39 +00001106 if (Scope == 0)
Devang Patelcdb7d442009-11-10 23:20:04 +00001107 continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001108
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001109 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VI.Loc);
David Blaikieafd2c6b2014-04-22 05:41:06 +00001110 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable, this);
1111 RegVar->setFrameIndex(VI.Slot);
1112 if (!addCurrentFnArgument(RegVar, Scope))
1113 addScopeVariable(Scope, RegVar);
Devang Patel99819b52011-08-15 19:01:20 +00001114 if (AbsDbgVariable)
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001115 AbsDbgVariable->setFrameIndex(VI.Slot);
Devang Patel475d32a2009-10-06 01:26:37 +00001116 }
Devang Patel490c8ab2010-05-20 19:57:06 +00001117}
Devang Patela3e9c9c2010-03-15 18:33:46 +00001118
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001119// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1120// defined reg.
Devang Patel9fc11702010-05-25 23:40:22 +00001121static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001122 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001123 return MI->getNumOperands() == 3 && MI->getOperand(0).isReg() &&
1124 MI->getOperand(0).getReg() &&
Adrian Prantl418d1d12013-07-09 20:28:37 +00001125 (MI->getOperand(1).isImm() ||
1126 (MI->getOperand(1).isReg() && MI->getOperand(1).getReg() == 0U));
Devang Patel9fc11702010-05-25 23:40:22 +00001127}
1128
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001129// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher05135fb2014-03-18 02:18:24 +00001130static DebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
Eric Christopher384f3fe2014-03-20 19:16:16 +00001131 const MCSymbol *FLabel,
1132 const MCSymbol *SLabel,
1133 const MachineInstr *MI,
1134 DwarfCompileUnit *Unit) {
Adrian Prantl7f487772014-04-10 17:39:48 +00001135 const MDNode *Var = MI->getDebugVariable();
Devang Patel2442a892011-07-08 17:09:57 +00001136
David Blaikie0252265b2013-06-16 20:34:15 +00001137 assert(MI->getNumOperands() == 3);
Adrian Prantl418d1d12013-07-09 20:28:37 +00001138 if (MI->getOperand(0).isReg()) {
Devang Patel2442a892011-07-08 17:09:57 +00001139 MachineLocation MLoc;
Adrian Prantl418d1d12013-07-09 20:28:37 +00001140 // If the second operand is an immediate, this is a
1141 // register-indirect address.
1142 if (!MI->getOperand(1).isImm())
Adrian Prantld4c0dd42013-04-26 21:57:17 +00001143 MLoc.set(MI->getOperand(0).getReg());
1144 else
1145 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Eric Christopher384f3fe2014-03-20 19:16:16 +00001146 return DebugLocEntry(FLabel, SLabel, MLoc, Var, Unit);
Devang Patel2442a892011-07-08 17:09:57 +00001147 }
1148 if (MI->getOperand(0).isImm())
Adrian Prantl3bdcb522014-04-11 17:49:47 +00001149 return DebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm(), Var, Unit);
Devang Patel2442a892011-07-08 17:09:57 +00001150 if (MI->getOperand(0).isFPImm())
Adrian Prantl3bdcb522014-04-11 17:49:47 +00001151 return DebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm(),
1152 Var, Unit);
Devang Patel2442a892011-07-08 17:09:57 +00001153 if (MI->getOperand(0).isCImm())
Adrian Prantl3bdcb522014-04-11 17:49:47 +00001154 return DebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm(),
1155 Var, Unit);
Devang Patel2442a892011-07-08 17:09:57 +00001156
Craig Topperee4dab52012-02-05 08:31:47 +00001157 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel2442a892011-07-08 17:09:57 +00001158}
1159
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001160// Find variables for each lexical scope.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001161void
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001162DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001163
Eric Christopher270a12c2013-07-03 21:37:03 +00001164 // Grab the variable info that was squirreled away in the MMI side-table.
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001165 collectVariableInfoFromMMITable(Processed);
Devang Patel490c8ab2010-05-20 19:57:06 +00001166
Benjamin Kramer15596c72014-03-07 19:09:39 +00001167 for (const MDNode *Var : UserVariables) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001168 if (Processed.count(Var))
Devang Patel490c8ab2010-05-20 19:57:06 +00001169 continue;
1170
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001171 // History contains relevant DBG_VALUE instructions for Var and instructions
1172 // clobbering it.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001173 SmallVectorImpl<const MachineInstr *> &History = DbgValues[Var];
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001174 if (History.empty())
1175 continue;
1176 const MachineInstr *MInsn = History.front();
Devang Patel9fc11702010-05-25 23:40:22 +00001177
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001178 DIVariable DV(Var);
Devang Patel7e623022011-08-10 20:55:27 +00001179 LexicalScope *Scope = NULL;
Devang Patel7a9dedf2010-05-27 20:25:04 +00001180 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001181 DISubprogram(DV.getContext()).describes(CurFn->getFunction()))
Devang Patel7e623022011-08-10 20:55:27 +00001182 Scope = LScopes.getCurrentFunctionScope();
David Blaikiedc69ebb2013-03-11 23:39:23 +00001183 else if (MDNode *IA = DV.getInlinedAt())
1184 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1185 else
1186 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patel490c8ab2010-05-20 19:57:06 +00001187 // If variable scope is not found then skip this variable.
Devang Patelfbd6c452010-05-21 00:10:20 +00001188 if (!Scope)
Devang Patel490c8ab2010-05-20 19:57:06 +00001189 continue;
1190
1191 Processed.insert(DV);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001192 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel99819b52011-08-15 19:01:20 +00001193 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
David Blaikieafd2c6b2014-04-22 05:41:06 +00001194 DbgVariable *RegVar = new DbgVariable(DV, AbsVar, this);
1195 if (!addCurrentFnArgument(RegVar, Scope))
1196 addScopeVariable(Scope, RegVar);
Devang Patel99819b52011-08-15 19:01:20 +00001197 if (AbsVar)
Devang Patel3e4a9652011-08-15 21:24:36 +00001198 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001199
Eric Christophercc10d202012-10-08 20:48:54 +00001200 // Simplify ranges that are fully coalesced.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001201 if (History.size() <= 1 ||
1202 (History.size() == 2 && MInsn->isIdenticalTo(History.back()))) {
David Blaikieafd2c6b2014-04-22 05:41:06 +00001203 RegVar->setMInsn(MInsn);
Devang Patel9fc11702010-05-25 23:40:22 +00001204 continue;
1205 }
1206
Eric Christopher59cc0712013-01-28 17:33:26 +00001207 // Handle multiple DBG_VALUE instructions describing one variable.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001208 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001209
David Blaikie0a456de2014-04-02 01:43:18 +00001210 DotDebugLocEntries.resize(DotDebugLocEntries.size() + 1);
1211 DebugLocList &LocList = DotDebugLocEntries.back();
1212 LocList.Label =
1213 Asm->GetTempSymbol("debug_loc", DotDebugLocEntries.size() - 1);
1214 SmallVector<DebugLocEntry, 4> &DebugLoc = LocList.List;
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001215 for (SmallVectorImpl<const MachineInstr *>::const_iterator
1216 HI = History.begin(),
1217 HE = History.end();
1218 HI != HE; ++HI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001219 const MachineInstr *Begin = *HI;
1220 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesen9c057ee2011-03-22 00:21:41 +00001221
Devang Patele7181b52011-06-01 23:00:17 +00001222 // Check if DBG_VALUE is truncating a range.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001223 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg() &&
1224 !Begin->getOperand(0).getReg())
Devang Patele7181b52011-06-01 23:00:17 +00001225 continue;
1226
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001227 // Compute the range for a register location.
1228 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1229 const MCSymbol *SLabel = 0;
1230
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001231 if (HI + 1 == HE)
1232 // If Begin is the last instruction in History then its value is valid
Chris Lattner0ab5e2c2011-04-15 05:18:47 +00001233 // until the end of the function.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001234 SLabel = FunctionEndSym;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001235 else {
1236 const MachineInstr *End = HI[1];
Eric Christopher6a841382012-11-19 22:42:10 +00001237 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001238 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001239 if (End->isDebugValue())
1240 SLabel = getLabelBeforeInsn(End);
1241 else {
1242 // End is a normal instruction clobbering the range.
1243 SLabel = getLabelAfterInsn(End);
1244 assert(SLabel && "Forgot label after clobber instruction");
1245 ++HI;
1246 }
1247 }
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001248
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001249 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopher384f3fe2014-03-20 19:16:16 +00001250 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1251 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
David Blaikie34ec5d02014-03-24 22:27:06 +00001252 DebugLocEntry Loc = getDebugLocEntry(Asm, FLabel, SLabel, Begin, TheCU);
David Blaikie84d8e182014-03-24 22:38:38 +00001253 if (DebugLoc.empty() || !DebugLoc.back().Merge(Loc))
1254 DebugLoc.push_back(std::move(Loc));
Devang Patel9fc11702010-05-25 23:40:22 +00001255 }
Devang Patela3e9c9c2010-03-15 18:33:46 +00001256 }
Devang Patele0a94bf2010-05-14 21:01:35 +00001257
1258 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001259 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1260 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1261 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1262 DIVariable DV(Variables.getElement(i));
Manman Ren7504ed42013-07-08 18:33:29 +00001263 if (!DV || !DV.isVariable() || !Processed.insert(DV))
Devang Patel59e27c52011-08-19 23:28:12 +00001264 continue;
1265 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
David Blaikieafd2c6b2014-04-22 05:41:06 +00001266 addScopeVariable(Scope, new DbgVariable(DV, NULL, this));
Devang Patele0a94bf2010-05-14 21:01:35 +00001267 }
Devang Patel9fc11702010-05-25 23:40:22 +00001268}
Devang Patele0a94bf2010-05-14 21:01:35 +00001269
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001270// Return Label preceding the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001271MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001272 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1273 assert(Label && "Didn't insert label before instruction");
1274 return Label;
Devang Patel9fc11702010-05-25 23:40:22 +00001275}
1276
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001277// Return Label immediately following the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001278MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001279 return LabelsAfterInsn.lookup(MI);
Devang Patel475d32a2009-10-06 01:26:37 +00001280}
1281
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001282// Process beginning of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001283void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001284 assert(CurMI == 0);
1285 CurMI = MI;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001286 // Check if source location changes, but ignore DBG_VALUE locations.
1287 if (!MI->isDebugValue()) {
1288 DebugLoc DL = MI->getDebugLoc();
1289 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopheraec8a822012-04-05 20:39:05 +00001290 unsigned Flags = 0;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001291 PrevInstLoc = DL;
Devang Patel34a66202011-05-11 19:22:19 +00001292 if (DL == PrologEndLoc) {
1293 Flags |= DWARF2_FLAG_PROLOGUE_END;
1294 PrologEndLoc = DebugLoc();
1295 }
Eric Christopheraec8a822012-04-05 20:39:05 +00001296 if (PrologEndLoc.isUnknown())
1297 Flags |= DWARF2_FLAG_IS_STMT;
1298
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001299 if (!DL.isUnknown()) {
1300 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel34a66202011-05-11 19:22:19 +00001301 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001302 } else
Devang Patel34a66202011-05-11 19:22:19 +00001303 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001304 }
Devang Patel9fc11702010-05-25 23:40:22 +00001305 }
Devang Patel23b2ae62010-03-29 22:59:58 +00001306
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001307 // Insert labels where requested.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001308 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
1309 LabelsBeforeInsn.find(MI);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001310
1311 // No label needed.
1312 if (I == LabelsBeforeInsn.end())
1313 return;
1314
1315 // Label already assigned.
1316 if (I->second)
Devang Patel002d54d2010-05-26 19:37:24 +00001317 return;
Devang Patelbd477be2010-03-29 17:20:31 +00001318
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001319 if (!PrevLabel) {
Devang Patelacc32a52010-05-26 21:23:46 +00001320 PrevLabel = MMI->getContext().CreateTempSymbol();
1321 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel002d54d2010-05-26 19:37:24 +00001322 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001323 I->second = PrevLabel;
Devang Patel8db360d2009-10-06 01:50:42 +00001324}
1325
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001326// Process end of an instruction.
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001327void DwarfDebug::endInstruction() {
1328 assert(CurMI != 0);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001329 // Don't create a new label after DBG_VALUE instructions.
1330 // They don't generate code.
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001331 if (!CurMI->isDebugValue())
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001332 PrevLabel = 0;
1333
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001334 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001335 LabelsAfterInsn.find(CurMI);
1336 CurMI = 0;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001337
1338 // No label needed.
1339 if (I == LabelsAfterInsn.end())
1340 return;
1341
1342 // Label already assigned.
1343 if (I->second)
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001344 return;
1345
1346 // We need a label after this instruction.
1347 if (!PrevLabel) {
1348 PrevLabel = MMI->getContext().CreateTempSymbol();
1349 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel3ebd8932010-04-08 16:50:29 +00001350 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001351 I->second = PrevLabel;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001352}
1353
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001354// Each LexicalScope has first instruction and last instruction to mark
1355// beginning and end of a scope respectively. Create an inverse map that list
1356// scopes starts (and ends) with an instruction. One instruction may start (or
1357// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patel359b0132010-04-08 18:43:56 +00001358void DwarfDebug::identifyScopeMarkers() {
Devang Patel7e623022011-08-10 20:55:27 +00001359 SmallVector<LexicalScope *, 4> WorkList;
1360 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel7771b7c2010-01-20 02:05:23 +00001361 while (!WorkList.empty()) {
Devang Patel7e623022011-08-10 20:55:27 +00001362 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001363
Craig Topper977e9cd2013-07-03 04:24:43 +00001364 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001365 if (!Children.empty())
Benjamin Kramer15596c72014-03-07 19:09:39 +00001366 WorkList.append(Children.begin(), Children.end());
Devang Patel7771b7c2010-01-20 02:05:23 +00001367
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001368 if (S->isAbstractScope())
1369 continue;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001370
Benjamin Kramer15596c72014-03-07 19:09:39 +00001371 for (const InsnRange &R : S->getRanges()) {
1372 assert(R.first && "InsnRange does not have first instruction!");
1373 assert(R.second && "InsnRange does not have second instruction!");
1374 requestLabelBeforeInsn(R.first);
1375 requestLabelAfterInsn(R.second);
Devang Patel6c74a872010-04-27 19:46:33 +00001376 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001377 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001378}
1379
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001380// Gather pre-function debug information. Assumes being called immediately
1381// after the function entry point has been emitted.
Chris Lattner76555b52010-01-26 23:18:02 +00001382void DwarfDebug::beginFunction(const MachineFunction *MF) {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001383 CurFn = MF;
Eric Christopherfedfa442013-11-01 23:14:17 +00001384
1385 // If there's no debug info for the function we're not going to do anything.
1386 if (!MMI->hasDebugInfo())
1387 return;
1388
1389 // Grab the lexical scopes for the function, if we don't have any of those
1390 // then we're not going to be able to do anything.
Devang Patel7e623022011-08-10 20:55:27 +00001391 LScopes.initialize(*MF);
Eric Christopher384f3fe2014-03-20 19:16:16 +00001392 if (LScopes.empty())
Eric Christopherfedfa442013-11-01 23:14:17 +00001393 return;
1394
1395 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1396
1397 // Make sure that each lexical scope will have a begin/end label.
Devang Patel7e623022011-08-10 20:55:27 +00001398 identifyScopeMarkers();
Devang Patel4598eb62009-10-06 18:37:31 +00001399
Eric Christopher4287a492013-12-09 23:57:44 +00001400 // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function
Eric Christopherfedfa442013-11-01 23:14:17 +00001401 // belongs to so that we add to the correct per-cu line table in the
1402 // non-asm case.
Manman Ren4e042a62013-02-05 21:52:47 +00001403 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Eric Christopher4287a492013-12-09 23:57:44 +00001404 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Manman Ren4e042a62013-02-05 21:52:47 +00001405 assert(TheCU && "Unable to find compile unit!");
Rafael Espindolab4eec1d2014-02-05 18:00:21 +00001406 if (Asm->OutStreamer.hasRawTextSupport())
1407 // Use a single line table if we are generating assembly.
Manman Ren9d4c7352013-05-21 00:57:22 +00001408 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1409 else
1410 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
Manman Ren4e042a62013-02-05 21:52:47 +00001411
Eric Christopherfedfa442013-11-01 23:14:17 +00001412 // Emit a label for the function so that we have a beginning address.
1413 FunctionBeginSym = Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber());
Bill Wendling2b128d72009-05-20 23:19:06 +00001414 // Assumes in correct section after the entry point.
Devang Patel6c74a872010-04-27 19:46:33 +00001415 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendling2b128d72009-05-20 23:19:06 +00001416
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001417 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001418 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Eric Christopherfedfa442013-11-01 23:14:17 +00001419 std::vector<const MDNode *> LiveUserVar(TRI->getNumRegs());
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001420
Eric Christopherfedfa442013-11-01 23:14:17 +00001421 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); I != E;
1422 ++I) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001423 bool AtBlockEntry = true;
Devang Patel002d54d2010-05-26 19:37:24 +00001424 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1425 II != IE; ++II) {
1426 const MachineInstr *MI = II;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001427
Devang Patel002d54d2010-05-26 19:37:24 +00001428 if (MI->isDebugValue()) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001429 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001430
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001431 // Keep track of user variables.
Adrian Prantl7f487772014-04-10 17:39:48 +00001432 const MDNode *Var = MI->getDebugVariable();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001433
1434 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001435 if (isDbgValueInDefinedReg(MI))
1436 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1437
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001438 // Check the history of this variable.
Eric Christopherfedfa442013-11-01 23:14:17 +00001439 SmallVectorImpl<const MachineInstr *> &History = DbgValues[Var];
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001440 if (History.empty()) {
1441 UserVariables.push_back(Var);
1442 // The first mention of a function argument gets the FunctionBeginSym
1443 // label, so arguments are visible when breaking at function entry.
1444 DIVariable DV(Var);
Manman Ren7504ed42013-07-08 18:33:29 +00001445 if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
David Blaikie5af2aca2013-11-18 23:57:26 +00001446 getDISubprogram(DV.getContext()).describes(MF->getFunction()))
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001447 LabelsBeforeInsn[MI] = FunctionBeginSym;
1448 } else {
1449 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1450 const MachineInstr *Prev = History.back();
1451 if (Prev->isDebugValue()) {
1452 // Coalesce identical entries at the end of History.
1453 if (History.size() >= 2 &&
Devang Patelb7a328e2011-07-07 00:14:27 +00001454 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher85a495e2012-10-08 20:48:49 +00001455 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopherfedfa442013-11-01 23:14:17 +00001456 << "\t" << *Prev << "\t"
1457 << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001458 History.pop_back();
Devang Patelb7a328e2011-07-07 00:14:27 +00001459 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001460
1461 // Terminate old register assignments that don't reach MI;
1462 MachineFunction::const_iterator PrevMBB = Prev->getParent();
Benjamin Kramerb6d0bd42014-03-02 12:27:27 +00001463 if (PrevMBB != I && (!AtBlockEntry || std::next(PrevMBB) != I) &&
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001464 isDbgValueInDefinedReg(Prev)) {
1465 // Previous register assignment needs to terminate at the end of
1466 // its basic block.
1467 MachineBasicBlock::const_iterator LastMI =
Eric Christopherfedfa442013-11-01 23:14:17 +00001468 PrevMBB->getLastNonDebugInstr();
Devang Patelb7a328e2011-07-07 00:14:27 +00001469 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001470 // Drop DBG_VALUE for empty range.
Eric Christopher85a495e2012-10-08 20:48:49 +00001471 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Eric Christopherfedfa442013-11-01 23:14:17 +00001472 << "\t" << *Prev << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001473 History.pop_back();
Benjamin Kramerb6d0bd42014-03-02 12:27:27 +00001474 } else if (std::next(PrevMBB) != PrevMBB->getParent()->end())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001475 // Terminate after LastMI.
1476 History.push_back(LastMI);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001477 }
1478 }
1479 }
1480 History.push_back(MI);
Devang Patel002d54d2010-05-26 19:37:24 +00001481 } else {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001482 // Not a DBG_VALUE instruction.
Rafael Espindolab1f25f12014-03-07 06:08:31 +00001483 if (!MI->isPosition())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001484 AtBlockEntry = false;
1485
Eric Christopher133195782012-10-04 20:46:14 +00001486 // First known non-DBG_VALUE and non-frame setup location marks
1487 // the beginning of the function body.
1488 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1489 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel34a66202011-05-11 19:22:19 +00001490 PrologEndLoc = MI->getDebugLoc();
1491
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001492 // Check if the instruction clobbers any registers with debug vars.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001493 for (const MachineOperand &MO : MI->operands()) {
1494 if (!MO.isReg() || !MO.isDef() || !MO.getReg())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001495 continue;
Benjamin Kramer15596c72014-03-07 19:09:39 +00001496 for (MCRegAliasIterator AI(MO.getReg(), TRI, true); AI.isValid();
Eric Christopherfedfa442013-11-01 23:14:17 +00001497 ++AI) {
Jakob Stoklund Olesen54038d72012-06-01 23:28:30 +00001498 unsigned Reg = *AI;
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001499 const MDNode *Var = LiveUserVar[Reg];
1500 if (!Var)
1501 continue;
1502 // Reg is now clobbered.
1503 LiveUserVar[Reg] = 0;
1504
1505 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001506 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1507 if (HistI == DbgValues.end())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001508 continue;
Eric Christopherfedfa442013-11-01 23:14:17 +00001509 SmallVectorImpl<const MachineInstr *> &History = HistI->second;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001510 if (History.empty())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001511 continue;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001512 const MachineInstr *Prev = History.back();
1513 // Sanity-check: Register assignments are terminated at the end of
1514 // their block.
1515 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1516 continue;
1517 // Is the variable still in Reg?
1518 if (!isDbgValueInDefinedReg(Prev) ||
1519 Prev->getOperand(0).getReg() != Reg)
1520 continue;
1521 // Var is clobbered. Make sure the next instruction gets a label.
1522 History.push_back(MI);
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001523 }
1524 }
Devang Patel002d54d2010-05-26 19:37:24 +00001525 }
Devang Patel002d54d2010-05-26 19:37:24 +00001526 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001527 }
1528
Benjamin Kramer15596c72014-03-07 19:09:39 +00001529 for (auto &I : DbgValues) {
1530 SmallVectorImpl<const MachineInstr *> &History = I.second;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001531 if (History.empty())
1532 continue;
1533
1534 // Make sure the final register assignments are terminated.
1535 const MachineInstr *Prev = History.back();
1536 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1537 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher6a841382012-11-19 22:42:10 +00001538 MachineBasicBlock::const_iterator LastMI =
Eric Christopherfedfa442013-11-01 23:14:17 +00001539 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001540 if (LastMI == PrevMBB->end())
1541 // Drop DBG_VALUE for empty range.
1542 History.pop_back();
David Blaikieea2605d2013-06-20 00:25:24 +00001543 else if (PrevMBB != &PrevMBB->getParent()->back()) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001544 // Terminate after LastMI.
1545 History.push_back(LastMI);
1546 }
1547 }
1548 // Request labels for the full history.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001549 for (const MachineInstr *MI : History) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001550 if (MI->isDebugValue())
1551 requestLabelBeforeInsn(MI);
1552 else
1553 requestLabelAfterInsn(MI);
1554 }
1555 }
Devang Patel002d54d2010-05-26 19:37:24 +00001556
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001557 PrevInstLoc = DebugLoc();
Devang Patel002d54d2010-05-26 19:37:24 +00001558 PrevLabel = FunctionBeginSym;
Devang Patel34a66202011-05-11 19:22:19 +00001559
1560 // Record beginning of function.
1561 if (!PrologEndLoc.isUnknown()) {
Eric Christopherfedfa442013-11-01 23:14:17 +00001562 DebugLoc FnStartDL =
Timur Iskhodzhanovf166f6c2014-01-30 01:39:17 +00001563 PrologEndLoc.getFnDebugLoc(MF->getFunction()->getContext());
Eric Christopherfedfa442013-11-01 23:14:17 +00001564 recordSourceLine(
1565 FnStartDL.getLine(), FnStartDL.getCol(),
1566 FnStartDL.getScope(MF->getFunction()->getContext()),
1567 // We'd like to list the prologue as "not statements" but GDB behaves
1568 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
1569 DWARF2_FLAG_IS_STMT);
Devang Patel34a66202011-05-11 19:22:19 +00001570 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001571}
1572
David Blaikieafd2c6b2014-04-22 05:41:06 +00001573void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1574 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1575 DIVariable DV = Var->getVariable();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001576 // Variables with positive arg numbers are parameters.
1577 if (unsigned ArgNum = DV.getArgNumber()) {
1578 // Keep all parameters in order at the start of the variable list to ensure
1579 // function types are correct (no out-of-order parameters)
1580 //
1581 // This could be improved by only doing it for optimized builds (unoptimized
1582 // builds have the right order to begin with), searching from the back (this
1583 // would catch the unoptimized case quickly), or doing a binary search
1584 // rather than linear search.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001585 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001586 while (I != Vars.end()) {
David Blaikieafd2c6b2014-04-22 05:41:06 +00001587 unsigned CurNum = (*I)->getVariable().getArgNumber();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001588 // A local (non-parameter) variable has been found, insert immediately
1589 // before it.
1590 if (CurNum == 0)
1591 break;
1592 // A later indexed parameter has been found, insert immediately before it.
David Blaikieb272a752013-06-06 22:28:26 +00001593 if (CurNum > ArgNum)
David Blaikie36d5d2f2013-06-06 21:04:51 +00001594 break;
David Blaikieb272a752013-06-06 22:28:26 +00001595 ++I;
David Blaikie6f1a8062013-06-05 05:39:59 +00001596 }
David Blaikieafd2c6b2014-04-22 05:41:06 +00001597 Vars.insert(I, Var);
1598 return;
David Blaikie6f1a8062013-06-05 05:39:59 +00001599 }
1600
David Blaikieafd2c6b2014-04-22 05:41:06 +00001601 Vars.push_back(Var);
Devang Patel7e623022011-08-10 20:55:27 +00001602}
1603
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001604// Gather and emit post-function debug information.
NAKAMURA Takumib9271612013-12-03 13:15:54 +00001605void DwarfDebug::endFunction(const MachineFunction *MF) {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001606 // Every beginFunction(MF) call should be followed by an endFunction(MF) call,
1607 // though the beginFunction may not be called at all.
1608 // We should handle both cases.
1609 if (CurFn == 0)
1610 CurFn = MF;
1611 else
1612 assert(CurFn == MF);
1613 assert(CurFn != 0);
1614
1615 if (!MMI->hasDebugInfo() || LScopes.empty()) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00001616 // If we don't have a lexical scope for this function then there will
1617 // be a hole in the range information. Keep note of this by setting the
1618 // previously used section to nullptr.
1619 PrevSection = nullptr;
1620 PrevCU = nullptr;
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001621 CurFn = 0;
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001622 return;
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001623 }
Devang Patel2904aa92009-11-12 19:02:56 +00001624
Devang Patel7e623022011-08-10 20:55:27 +00001625 // Define end label for subprogram.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001626 FunctionEndSym = Asm->GetTempSymbol("func_end", Asm->getFunctionNumber());
Devang Patel7e623022011-08-10 20:55:27 +00001627 // Assumes in correct section after the entry point.
1628 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Eric Christopher1a972152014-01-29 23:05:43 +00001629
Eric Christopher4287a492013-12-09 23:57:44 +00001630 // Set DwarfDwarfCompileUnitID in MCContext to default value.
Manman Ren4e042a62013-02-05 21:52:47 +00001631 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher6a841382012-11-19 22:42:10 +00001632
Devang Patel7e623022011-08-10 20:55:27 +00001633 SmallPtrSet<const MDNode *, 16> ProcessedVars;
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001634 collectVariableInfo(ProcessedVars);
Eric Christopher6a841382012-11-19 22:42:10 +00001635
Devang Patel3acc70e2011-08-15 22:04:40 +00001636 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
David Blaikief9b6a552014-04-22 22:39:41 +00001637 DwarfCompileUnit &TheCU = *SPMap.lookup(FnScope->getScopeNode());
Devang Patel3acc70e2011-08-15 22:04:40 +00001638
Devang Patel7e623022011-08-10 20:55:27 +00001639 // Construct abstract scopes.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001640 for (LexicalScope *AScope : LScopes.getAbstractScopesList()) {
Devang Patel44403472011-08-12 18:10:19 +00001641 DISubprogram SP(AScope->getScopeNode());
Manman Ren7504ed42013-07-08 18:33:29 +00001642 if (SP.isSubprogram()) {
Devang Patel7e623022011-08-10 20:55:27 +00001643 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001644 DIArray Variables = SP.getVariables();
1645 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1646 DIVariable DV(Variables.getElement(i));
Manman Ren7504ed42013-07-08 18:33:29 +00001647 if (!DV || !DV.isVariable() || !ProcessedVars.insert(DV))
Devang Patel59e27c52011-08-19 23:28:12 +00001648 continue;
Alexey Samsonov39602782012-07-06 08:45:08 +00001649 // Check that DbgVariable for DV wasn't created earlier, when
1650 // findAbstractVariable() was called for inlined instance of DV.
1651 LLVMContext &Ctx = DV->getContext();
1652 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1653 if (AbstractVariables.lookup(CleanDV))
1654 continue;
Devang Patel59e27c52011-08-19 23:28:12 +00001655 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
David Blaikieafd2c6b2014-04-22 05:41:06 +00001656 addScopeVariable(Scope, new DbgVariable(DV, NULL, this));
Devang Patel5c0f85c2010-06-25 22:07:34 +00001657 }
1658 }
Devang Patel44403472011-08-12 18:10:19 +00001659 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Manman Ren4213c392013-05-29 17:16:59 +00001660 constructScopeDIE(TheCU, AScope);
Bill Wendling2b128d72009-05-20 23:19:06 +00001661 }
Eric Christopher6a841382012-11-19 22:42:10 +00001662
Devang Patel3acc70e2011-08-15 22:04:40 +00001663 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001664 if (!CurFn->getTarget().Options.DisableFramePointerElim(*CurFn))
David Blaikief9b6a552014-04-22 22:39:41 +00001665 TheCU.addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Patel3acc70e2011-08-15 22:04:40 +00001666
Eric Christopher1a972152014-01-29 23:05:43 +00001667 // Add the range of this function to the list of ranges for the CU.
1668 RangeSpan Span(FunctionBeginSym, FunctionEndSym);
David Blaikief9b6a552014-04-22 22:39:41 +00001669 TheCU.addRange(std::move(Span));
Eric Christopher384f3fe2014-03-20 19:16:16 +00001670 PrevSection = Asm->getCurrentSection();
David Blaikief9b6a552014-04-22 22:39:41 +00001671 PrevCU = &TheCU;
Eric Christopher1a972152014-01-29 23:05:43 +00001672
Bill Wendling2b128d72009-05-20 23:19:06 +00001673 // Clear debug info
David Blaikieafd2c6b2014-04-22 05:41:06 +00001674 for (auto &I : ScopeVariables)
1675 DeleteContainerPointers(I.second);
Devang Patel7e623022011-08-10 20:55:27 +00001676 ScopeVariables.clear();
David Blaikieafd2c6b2014-04-22 05:41:06 +00001677 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001678 UserVariables.clear();
1679 DbgValues.clear();
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00001680 AbstractVariables.clear();
Devang Patel6c74a872010-04-27 19:46:33 +00001681 LabelsBeforeInsn.clear();
1682 LabelsAfterInsn.clear();
Devang Patel12563b32010-04-16 23:33:45 +00001683 PrevLabel = NULL;
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001684 CurFn = 0;
Bill Wendling2b128d72009-05-20 23:19:06 +00001685}
1686
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001687// Register a source line with debug info. Returns the unique label that was
1688// emitted and which provides correspondence to the source line list.
Devang Patel34a66202011-05-11 19:22:19 +00001689void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1690 unsigned Flags) {
Devang Patel2d9caf92009-11-25 17:36:49 +00001691 StringRef Fn;
Devang Patele01b75c2011-03-24 20:30:50 +00001692 StringRef Dir;
Dan Gohman50849c62010-05-05 23:41:32 +00001693 unsigned Src = 1;
Diego Novillo282450d2014-03-03 18:53:17 +00001694 unsigned Discriminator = 0;
Dan Gohman50849c62010-05-05 23:41:32 +00001695 if (S) {
1696 DIDescriptor Scope(S);
Devang Patel2089d162009-10-05 18:03:19 +00001697
Dan Gohman50849c62010-05-05 23:41:32 +00001698 if (Scope.isCompileUnit()) {
1699 DICompileUnit CU(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001700 Fn = CU.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001701 Dir = CU.getDirectory();
Devang Patelc4b69052010-10-28 17:30:52 +00001702 } else if (Scope.isFile()) {
1703 DIFile F(S);
Devang Patelc4b69052010-10-28 17:30:52 +00001704 Fn = F.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001705 Dir = F.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001706 } else if (Scope.isSubprogram()) {
1707 DISubprogram SP(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001708 Fn = SP.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001709 Dir = SP.getDirectory();
Eric Christopher6647b832011-10-11 22:59:11 +00001710 } else if (Scope.isLexicalBlockFile()) {
1711 DILexicalBlockFile DBF(S);
1712 Fn = DBF.getFilename();
1713 Dir = DBF.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001714 } else if (Scope.isLexicalBlock()) {
1715 DILexicalBlock DB(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001716 Fn = DB.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001717 Dir = DB.getDirectory();
Diego Novillo282450d2014-03-03 18:53:17 +00001718 Discriminator = DB.getDiscriminator();
Dan Gohman50849c62010-05-05 23:41:32 +00001719 } else
Craig Topperee4dab52012-02-05 08:31:47 +00001720 llvm_unreachable("Unexpected scope info");
Dan Gohman50849c62010-05-05 23:41:32 +00001721
David Blaikie0e8d4012014-03-17 23:53:25 +00001722 unsigned CUID = Asm->OutStreamer.getContext().getDwarfCompileUnitID();
David Blaikiec33b3cd2014-04-22 21:27:37 +00001723 Src = static_cast<DwarfCompileUnit &>(*InfoHolder.getUnits()[CUID])
1724 .getOrCreateSourceID(Fn, Dir);
Dan Gohman50849c62010-05-05 23:41:32 +00001725 }
Diego Novillo282450d2014-03-03 18:53:17 +00001726 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0,
1727 Discriminator, Fn);
Bill Wendling2b128d72009-05-20 23:19:06 +00001728}
1729
Bill Wendling806535f2009-05-20 23:22:40 +00001730//===----------------------------------------------------------------------===//
1731// Emit Methods
1732//===----------------------------------------------------------------------===//
1733
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001734// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001735void DwarfDebug::emitSectionLabels() {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001736 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00001737
Bill Wendling480ff322009-05-20 23:21:38 +00001738 // Dwarf sections base addresses.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001739 DwarfInfoSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001740 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Eric Christopherd8667202013-12-30 17:22:27 +00001741 if (useSplitDwarf())
1742 DwarfInfoDWOSectionSym =
1743 emitSectionSym(Asm, TLOF.getDwarfInfoDWOSection(), "section_info_dwo");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001744 DwarfAbbrevSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001745 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher3c5a1912012-12-19 22:02:53 +00001746 if (useSplitDwarf())
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001747 DwarfAbbrevDWOSectionSym = emitSectionSym(
1748 Asm, TLOF.getDwarfAbbrevDWOSection(), "section_abbrev_dwo");
David Blaikie20474102014-02-25 22:46:44 +00001749 if (GenerateARangeSection)
1750 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001751
Eric Christopher74804332013-02-07 21:19:50 +00001752 DwarfLineSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001753 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher261d2342013-09-23 20:55:35 +00001754 if (GenerateGnuPubSections) {
Eric Christopher39eebfa2013-09-30 23:14:16 +00001755 DwarfGnuPubNamesSectionSym =
1756 emitSectionSym(Asm, TLOF.getDwarfGnuPubNamesSection());
1757 DwarfGnuPubTypesSectionSym =
1758 emitSectionSym(Asm, TLOF.getDwarfGnuPubTypesSection());
Eric Christopher261d2342013-09-23 20:55:35 +00001759 } else if (HasDwarfPubSections) {
1760 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
1761 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001762 }
Eric Christopherdd1a0122013-09-13 00:35:05 +00001763
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001764 DwarfStrSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001765 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001766 if (useSplitDwarf()) {
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001767 DwarfStrDWOSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001768 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001769 DwarfAddrSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001770 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
David Blaikiee12ab122014-04-01 16:09:49 +00001771 DwarfDebugLocSectionSym =
David Blaikie9c550ac2014-03-25 01:44:02 +00001772 emitSectionSym(Asm, TLOF.getDwarfLocDWOSection(), "skel_loc");
1773 } else
1774 DwarfDebugLocSectionSym =
1775 emitSectionSym(Asm, TLOF.getDwarfLocSection(), "section_debug_loc");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001776 DwarfDebugRangeSectionSym =
1777 emitSectionSym(Asm, TLOF.getDwarfRangesSection(), "debug_range");
Bill Wendling480ff322009-05-20 23:21:38 +00001778}
1779
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001780// Recursively emits a debug information entry.
David Blaikieb8184182014-04-14 22:45:02 +00001781void DwarfDebug::emitDIE(DIE &Die) {
Bill Wendling480ff322009-05-20 23:21:38 +00001782 // Get the abbreviation for this DIE.
David Blaikieb8184182014-04-14 22:45:02 +00001783 const DIEAbbrev &Abbrev = Die.getAbbrev();
Bill Wendling480ff322009-05-20 23:21:38 +00001784
Bill Wendling480ff322009-05-20 23:21:38 +00001785 // Emit the code (index) for the abbreviation.
Chris Lattner7bde8c02010-04-04 18:52:31 +00001786 if (Asm->isVerbose())
David Blaikieff3ab2c2013-12-05 01:01:41 +00001787 Asm->OutStreamer.AddComment("Abbrev [" + Twine(Abbrev.getNumber()) +
David Blaikieb8184182014-04-14 22:45:02 +00001788 "] 0x" + Twine::utohexstr(Die.getOffset()) +
1789 ":0x" + Twine::utohexstr(Die.getSize()) + " " +
David Blaikieff3ab2c2013-12-05 01:01:41 +00001790 dwarf::TagString(Abbrev.getTag()));
1791 Asm->EmitULEB128(Abbrev.getNumber());
Bill Wendling480ff322009-05-20 23:21:38 +00001792
David Blaikieb8184182014-04-14 22:45:02 +00001793 const SmallVectorImpl<DIEValue *> &Values = Die.getValues();
David Blaikieff3ab2c2013-12-05 01:01:41 +00001794 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
Bill Wendling480ff322009-05-20 23:21:38 +00001795
1796 // Emit the DIE attribute values.
1797 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
David Blaikief2443192013-10-21 17:28:37 +00001798 dwarf::Attribute Attr = AbbrevData[i].getAttribute();
1799 dwarf::Form Form = AbbrevData[i].getForm();
Bill Wendling480ff322009-05-20 23:21:38 +00001800 assert(Form && "Too many attributes for DIE (check abbreviation)");
1801
Eric Christopher13a1bb32014-03-06 00:00:49 +00001802 if (Asm->isVerbose()) {
Chris Lattner5adf9872010-01-24 18:54:17 +00001803 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Eric Christopher13a1bb32014-03-06 00:00:49 +00001804 if (Attr == dwarf::DW_AT_accessibility)
1805 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(
1806 cast<DIEInteger>(Values[i])->getValue()));
1807 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001808
Eric Christopherdd508382014-03-06 00:00:56 +00001809 // Emit an attribute using the defined form.
1810 Values[i]->EmitValue(Asm, Form);
Bill Wendling480ff322009-05-20 23:21:38 +00001811 }
1812
1813 // Emit the DIE children if any.
Eric Christophere8f10722014-03-05 01:44:58 +00001814 if (Abbrev.hasChildren()) {
David Blaikieb8184182014-04-14 22:45:02 +00001815 for (auto &Child : Die.getChildren())
1816 emitDIE(*Child);
Bill Wendling480ff322009-05-20 23:21:38 +00001817
David Blaikie155f8812013-12-04 21:51:05 +00001818 Asm->OutStreamer.AddComment("End Of Children Mark");
Chris Lattner566cae92010-03-09 23:52:58 +00001819 Asm->EmitInt8(0);
Bill Wendling480ff322009-05-20 23:21:38 +00001820 }
1821}
1822
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001823// Emit the debug info section.
1824void DwarfDebug::emitDebugInfo() {
Eric Christopherf8194852013-12-05 18:06:10 +00001825 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Eric Christophera2de8262012-12-15 00:04:07 +00001826
David Blaikief72ed5f2014-03-24 20:31:01 +00001827 Holder.emitUnits(this, DwarfAbbrevSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001828}
1829
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001830// Emit the abbreviation section.
Eric Christopher38371952012-11-20 23:30:11 +00001831void DwarfDebug::emitAbbreviations() {
Eric Christopherf8194852013-12-05 18:06:10 +00001832 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
David Blaikie0504cda2013-12-05 07:43:55 +00001833
1834 Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
Eric Christopher3c5a1912012-12-19 22:02:53 +00001835}
Bill Wendling480ff322009-05-20 23:21:38 +00001836
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001837// Emit the last address of the section and the end of the line matrix.
Devang Patel930143b2009-11-21 02:48:08 +00001838void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling480ff322009-05-20 23:21:38 +00001839 // Define last address of section.
Chris Lattner566cae92010-03-09 23:52:58 +00001840 Asm->OutStreamer.AddComment("Extended Op");
1841 Asm->EmitInt8(0);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001842
Chris Lattner566cae92010-03-09 23:52:58 +00001843 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth5da3f052012-11-01 09:14:31 +00001844 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner566cae92010-03-09 23:52:58 +00001845 Asm->OutStreamer.AddComment("DW_LNE_set_address");
1846 Asm->EmitInt8(dwarf::DW_LNE_set_address);
1847
1848 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerb245dfb2010-03-10 01:17:49 +00001849
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001850 Asm->OutStreamer.EmitSymbolValue(
1851 Asm->GetTempSymbol("section_end", SectionEnd),
1852 Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00001853
1854 // Mark end of matrix.
Chris Lattner566cae92010-03-09 23:52:58 +00001855 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1856 Asm->EmitInt8(0);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00001857 Asm->EmitInt8(1);
Chris Lattnerfa823552010-01-22 23:18:42 +00001858 Asm->EmitInt8(1);
Bill Wendling480ff322009-05-20 23:21:38 +00001859}
1860
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001861// Emit visible names into a hashed accelerator table section.
Eric Christopher4996c702011-11-07 09:24:32 +00001862void DwarfDebug::emitAccelNames() {
David Blaikie27931a42014-04-23 23:46:25 +00001863 AccelNames.FinalizeTable(Asm, "Names");
Eric Christopher4996c702011-11-07 09:24:32 +00001864 Asm->OutStreamer.SwitchSection(
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001865 Asm->getObjFileLowering().getDwarfAccelNamesSection());
Eric Christopher4996c702011-11-07 09:24:32 +00001866 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
1867 Asm->OutStreamer.EmitLabel(SectionBegin);
1868
1869 // Emit the full data.
David Blaikie27931a42014-04-23 23:46:25 +00001870 AccelNames.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00001871}
1872
Eric Christopher48fef592012-12-20 21:58:40 +00001873// Emit objective C classes and categories into a hashed accelerator table
1874// section.
Eric Christopher4996c702011-11-07 09:24:32 +00001875void DwarfDebug::emitAccelObjC() {
David Blaikie0ee82b92014-04-24 00:53:32 +00001876 AccelObjC.FinalizeTable(Asm, "ObjC");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001877 Asm->OutStreamer.SwitchSection(
1878 Asm->getObjFileLowering().getDwarfAccelObjCSection());
Eric Christopher4996c702011-11-07 09:24:32 +00001879 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
1880 Asm->OutStreamer.EmitLabel(SectionBegin);
1881
1882 // Emit the full data.
David Blaikie0ee82b92014-04-24 00:53:32 +00001883 AccelObjC.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00001884}
1885
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001886// Emit namespace dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00001887void DwarfDebug::emitAccelNamespaces() {
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001888 DwarfAccelTable AT(
1889 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4));
David Blaikiec33b3cd2014-04-22 21:27:37 +00001890 for (const auto &TheU : getUnits()) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00001891 for (const auto &GI : TheU->getAccelNamespace()) {
1892 StringRef Name = GI.getKey();
1893 for (const DIE *D : GI.second)
1894 AT.AddName(Name, D);
Eric Christopher4996c702011-11-07 09:24:32 +00001895 }
1896 }
1897
1898 AT.FinalizeTable(Asm, "namespac");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001899 Asm->OutStreamer.SwitchSection(
1900 Asm->getObjFileLowering().getDwarfAccelNamespaceSection());
Eric Christopher4996c702011-11-07 09:24:32 +00001901 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
1902 Asm->OutStreamer.EmitLabel(SectionBegin);
1903
1904 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00001905 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00001906}
1907
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001908// Emit type dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00001909void DwarfDebug::emitAccelTypes() {
David Blaikie2c0f4ef2014-04-23 23:03:45 +00001910 DwarfAccelTable::Atom Atoms[] = {
1911 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4),
1912 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag, dwarf::DW_FORM_data2),
1913 DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags, dwarf::DW_FORM_data1)};
Eric Christopher21bde872012-01-06 04:35:23 +00001914 DwarfAccelTable AT(Atoms);
David Blaikiec33b3cd2014-04-22 21:27:37 +00001915 for (const auto &TheU : getUnits()) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00001916 for (const auto &GI : TheU->getAccelTypes()) {
1917 StringRef Name = GI.getKey();
1918 for (const auto &DI : GI.second)
1919 AT.AddName(Name, DI.first, DI.second);
Eric Christopher4996c702011-11-07 09:24:32 +00001920 }
1921 }
1922
1923 AT.FinalizeTable(Asm, "types");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001924 Asm->OutStreamer.SwitchSection(
1925 Asm->getObjFileLowering().getDwarfAccelTypesSection());
Eric Christopher4996c702011-11-07 09:24:32 +00001926 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
1927 Asm->OutStreamer.EmitLabel(SectionBegin);
1928
1929 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00001930 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00001931}
1932
Eric Christopherdd1a0122013-09-13 00:35:05 +00001933// Public name handling.
1934// The format for the various pubnames:
1935//
1936// dwarf pubnames - offset/name pairs where the offset is the offset into the CU
1937// for the DIE that is named.
1938//
1939// gnu pubnames - offset/index value/name tuples where the offset is the offset
1940// into the CU and the index value is computed according to the type of value
1941// for the DIE that is named.
1942//
1943// For type units the offset is the offset of the skeleton DIE. For split dwarf
1944// it's the offset within the debug_info/debug_types dwo section, however, the
1945// reference in the pubname header doesn't change.
1946
1947/// computeIndexValue - Compute the gdb index value for the DIE and CU.
Eric Christophera5a79422013-12-09 23:32:48 +00001948static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU,
Eric Christopher0fe676a2013-11-21 00:48:22 +00001949 const DIE *Die) {
Eric Christopherd2b497b2013-10-16 01:37:49 +00001950 dwarf::GDBIndexEntryLinkage Linkage = dwarf::GIEL_STATIC;
1951
1952 // We could have a specification DIE that has our most of our knowledge,
1953 // look for that now.
1954 DIEValue *SpecVal = Die->findAttribute(dwarf::DW_AT_specification);
1955 if (SpecVal) {
1956 DIE *SpecDIE = cast<DIEEntry>(SpecVal)->getEntry();
1957 if (SpecDIE->findAttribute(dwarf::DW_AT_external))
1958 Linkage = dwarf::GIEL_EXTERNAL;
1959 } else if (Die->findAttribute(dwarf::DW_AT_external))
1960 Linkage = dwarf::GIEL_EXTERNAL;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001961
1962 switch (Die->getTag()) {
1963 case dwarf::DW_TAG_class_type:
1964 case dwarf::DW_TAG_structure_type:
1965 case dwarf::DW_TAG_union_type:
1966 case dwarf::DW_TAG_enumeration_type:
Eric Christopher261d2342013-09-23 20:55:35 +00001967 return dwarf::PubIndexEntryDescriptor(
1968 dwarf::GIEK_TYPE, CU->getLanguage() != dwarf::DW_LANG_C_plus_plus
1969 ? dwarf::GIEL_STATIC
1970 : dwarf::GIEL_EXTERNAL);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001971 case dwarf::DW_TAG_typedef:
1972 case dwarf::DW_TAG_base_type:
1973 case dwarf::DW_TAG_subrange_type:
David Blaikie8dec4072013-09-19 20:40:26 +00001974 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE, dwarf::GIEL_STATIC);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001975 case dwarf::DW_TAG_namespace:
David Blaikie8dec4072013-09-19 20:40:26 +00001976 return dwarf::GIEK_TYPE;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001977 case dwarf::DW_TAG_subprogram:
Eric Christopherccac5c42013-09-23 22:59:14 +00001978 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_FUNCTION, Linkage);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001979 case dwarf::DW_TAG_constant:
1980 case dwarf::DW_TAG_variable:
Eric Christopherccac5c42013-09-23 22:59:14 +00001981 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, Linkage);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001982 case dwarf::DW_TAG_enumerator:
David Blaikie8dec4072013-09-19 20:40:26 +00001983 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE,
1984 dwarf::GIEL_STATIC);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001985 default:
David Blaikie8dec4072013-09-19 20:40:26 +00001986 return dwarf::GIEK_NONE;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001987 }
Eric Christopherdd1a0122013-09-13 00:35:05 +00001988}
1989
Eric Christopher5f93bb92013-09-09 20:03:17 +00001990/// emitDebugPubNames - Emit visible names into a debug pubnames section.
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001991///
Eric Christopherdd1a0122013-09-13 00:35:05 +00001992void DwarfDebug::emitDebugPubNames(bool GnuStyle) {
Eric Christopherdd1a0122013-09-13 00:35:05 +00001993 const MCSection *PSec =
1994 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection()
1995 : Asm->getObjFileLowering().getDwarfPubNamesSection();
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001996
David Blaikie0f55e832014-03-11 23:18:15 +00001997 emitDebugPubSection(GnuStyle, PSec, "Names", &DwarfUnit::getGlobalNames);
1998}
1999
2000void DwarfDebug::emitDebugPubSection(
2001 bool GnuStyle, const MCSection *PSec, StringRef Name,
2002 const StringMap<const DIE *> &(DwarfUnit::*Accessor)() const) {
David Blaikiec3d9e9e2014-03-06 01:42:00 +00002003 for (const auto &NU : CUMap) {
2004 DwarfCompileUnit *TheU = NU.second;
David Blaikie55bb8ac2014-03-11 23:23:39 +00002005
2006 const auto &Globals = (TheU->*Accessor)();
2007
David Blaikiece2f1cb2014-03-11 23:35:06 +00002008 if (Globals.empty())
2009 continue;
2010
David Blaikiec3d9e9e2014-03-06 01:42:00 +00002011 if (auto Skeleton = static_cast<DwarfCompileUnit *>(TheU->getSkeleton()))
2012 TheU = Skeleton;
David Blaikie2a80e442013-12-02 22:09:48 +00002013 unsigned ID = TheU->getUniqueID();
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002014
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002015 // Start the dwarf pubnames section.
Eric Christopher13b99d22013-09-10 21:49:37 +00002016 Asm->OutStreamer.SwitchSection(PSec);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002017
Eric Christopherdd1a0122013-09-13 00:35:05 +00002018 // Emit the header.
David Blaikie0f55e832014-03-11 23:18:15 +00002019 Asm->OutStreamer.AddComment("Length of Public " + Name + " Info");
2020 MCSymbol *BeginLabel = Asm->GetTempSymbol("pub" + Name + "_begin", ID);
2021 MCSymbol *EndLabel = Asm->GetTempSymbol("pub" + Name + "_end", ID);
David Blaikieb7a1c4d2013-12-04 17:55:41 +00002022 Asm->EmitLabelDifference(EndLabel, BeginLabel, 4);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002023
David Blaikieb7a1c4d2013-12-04 17:55:41 +00002024 Asm->OutStreamer.EmitLabel(BeginLabel);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002025
2026 Asm->OutStreamer.AddComment("DWARF Version");
David Majnemered89b5c2013-08-21 06:13:34 +00002027 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002028
2029 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
David Blaikie7d734602013-12-06 22:33:05 +00002030 Asm->EmitSectionOffset(TheU->getLabelBegin(), TheU->getSectionSym());
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002031
2032 Asm->OutStreamer.AddComment("Compilation Unit Length");
David Blaikie7d734602013-12-06 22:33:05 +00002033 Asm->EmitLabelDifference(TheU->getLabelEnd(), TheU->getLabelBegin(), 4);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002034
Eric Christopherdd1a0122013-09-13 00:35:05 +00002035 // Emit the pubnames for this compilation unit.
David Blaikie55bb8ac2014-03-11 23:23:39 +00002036 for (const auto &GI : Globals) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00002037 const char *Name = GI.getKeyData();
2038 const DIE *Entity = GI.second;
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002039
2040 Asm->OutStreamer.AddComment("DIE offset");
2041 Asm->EmitInt32(Entity->getOffset());
2042
Eric Christopherdd1a0122013-09-13 00:35:05 +00002043 if (GnuStyle) {
David Blaikie2a80e442013-12-02 22:09:48 +00002044 dwarf::PubIndexEntryDescriptor Desc = computeIndexValue(TheU, Entity);
David Blaikied0a869d2013-09-19 22:19:37 +00002045 Asm->OutStreamer.AddComment(
David Blaikieefd0bcb2013-09-20 00:33:15 +00002046 Twine("Kind: ") + dwarf::GDBIndexEntryKindString(Desc.Kind) + ", " +
David Blaikie404d3042013-09-19 23:01:29 +00002047 dwarf::GDBIndexEntryLinkageString(Desc.Linkage));
David Blaikied0a869d2013-09-19 22:19:37 +00002048 Asm->EmitInt8(Desc.toBits());
Eric Christopherdd1a0122013-09-13 00:35:05 +00002049 }
2050
David Blaikie155f8812013-12-04 21:51:05 +00002051 Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer15596c72014-03-07 19:09:39 +00002052 Asm->OutStreamer.EmitBytes(StringRef(Name, GI.getKeyLength() + 1));
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002053 }
2054
2055 Asm->OutStreamer.AddComment("End Mark");
2056 Asm->EmitInt32(0);
David Blaikieb7a1c4d2013-12-04 17:55:41 +00002057 Asm->OutStreamer.EmitLabel(EndLabel);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002058 }
2059}
2060
Eric Christopherdd1a0122013-09-13 00:35:05 +00002061void DwarfDebug::emitDebugPubTypes(bool GnuStyle) {
Eric Christopher261d2342013-09-23 20:55:35 +00002062 const MCSection *PSec =
2063 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
2064 : Asm->getObjFileLowering().getDwarfPubTypesSection();
Eric Christopher8b3737f2013-09-13 00:34:58 +00002065
David Blaikie0f55e832014-03-11 23:18:15 +00002066 emitDebugPubSection(GnuStyle, PSec, "Types", &DwarfUnit::getGlobalTypes);
Devang Patel04d2f2d2009-11-24 01:14:22 +00002067}
2068
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002069// Emit visible names into a debug str section.
2070void DwarfDebug::emitDebugStr() {
Eric Christopherf8194852013-12-05 18:06:10 +00002071 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002072 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2073}
2074
Eric Christopher29e874d2014-03-07 22:40:37 +00002075void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer,
Eric Christopher05135fb2014-03-18 02:18:24 +00002076 const DebugLocEntry &Entry) {
Eric Christopher29e874d2014-03-07 22:40:37 +00002077 DIVariable DV(Entry.getVariable());
2078 if (Entry.isInt()) {
Adrian Prantl1a1647c2014-03-18 02:34:58 +00002079 DIBasicType BTy(resolve(DV.getType()));
Eric Christopher29e874d2014-03-07 22:40:37 +00002080 if (BTy.Verify() && (BTy.getEncoding() == dwarf::DW_ATE_signed ||
2081 BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2082 Streamer.EmitInt8(dwarf::DW_OP_consts, "DW_OP_consts");
2083 Streamer.EmitSLEB128(Entry.getInt());
2084 } else {
2085 Streamer.EmitInt8(dwarf::DW_OP_constu, "DW_OP_constu");
2086 Streamer.EmitULEB128(Entry.getInt());
2087 }
2088 } else if (Entry.isLocation()) {
2089 MachineLocation Loc = Entry.getLoc();
2090 if (!DV.hasComplexAddress())
2091 // Regular entry.
2092 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2093 else {
2094 // Complex address entry.
2095 unsigned N = DV.getNumAddrElements();
2096 unsigned i = 0;
2097 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2098 if (Loc.getOffset()) {
2099 i = 2;
2100 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2101 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
2102 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
2103 Streamer.EmitSLEB128(DV.getAddrElement(1));
2104 } else {
2105 // If first address element is OpPlus then emit
2106 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2107 MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));
2108 Asm->EmitDwarfRegOp(Streamer, TLoc, DV.isIndirect());
2109 i = 2;
2110 }
2111 } else {
2112 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2113 }
2114
2115 // Emit remaining complex address elements.
2116 for (; i < N; ++i) {
2117 uint64_t Element = DV.getAddrElement(i);
2118 if (Element == DIBuilder::OpPlus) {
2119 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
2120 Streamer.EmitULEB128(DV.getAddrElement(++i));
2121 } else if (Element == DIBuilder::OpDeref) {
2122 if (!Loc.isReg())
2123 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
2124 } else
2125 llvm_unreachable("unknown Opcode found in complex address");
2126 }
2127 }
2128 }
2129 // else ... ignore constant fp. There is not any good way to
2130 // to represent them here in dwarf.
2131 // FIXME: ^
2132}
2133
David Blaikie0e84adc2014-04-01 16:17:41 +00002134void DwarfDebug::emitDebugLocEntryLocation(const DebugLocEntry &Entry) {
2135 Asm->OutStreamer.AddComment("Loc expr size");
2136 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2137 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2138 Asm->EmitLabelDifference(end, begin, 2);
2139 Asm->OutStreamer.EmitLabel(begin);
2140 // Emit the entry.
2141 APByteStreamer Streamer(*Asm);
2142 emitDebugLocEntry(Streamer, Entry);
2143 // Close the range.
2144 Asm->OutStreamer.EmitLabel(end);
2145}
2146
Eric Christopher9046f942013-07-02 21:36:07 +00002147// Emit locations into the debug loc section.
Devang Patel930143b2009-11-21 02:48:08 +00002148void DwarfDebug::emitDebugLoc() {
Daniel Dunbarfd95b012011-03-16 22:16:39 +00002149 // Start the dwarf loc section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002150 Asm->OutStreamer.SwitchSection(
David Blaikie94c1d7f2014-04-02 01:50:20 +00002151 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth5da3f052012-11-01 09:14:31 +00002152 unsigned char Size = Asm->getDataLayout().getPointerSize();
David Blaikie84d8e182014-03-24 22:38:38 +00002153 for (const auto &DebugLoc : DotDebugLocEntries) {
David Blaikie0a456de2014-04-02 01:43:18 +00002154 Asm->OutStreamer.EmitLabel(DebugLoc.Label);
2155 for (const auto &Entry : DebugLoc.List) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00002156 // Set up the range. This range is relative to the entry point of the
2157 // compile unit. This is a hard coded 0 for low_pc when we're emitting
2158 // ranges, or the DW_AT_low_pc on the compile unit otherwise.
2159 const DwarfCompileUnit *CU = Entry.getCU();
David Blaikie94c1d7f2014-04-02 01:50:20 +00002160 if (CU->getRanges().size() == 1) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00002161 // Grab the begin symbol from the first range as our base.
2162 const MCSymbol *Base = CU->getRanges()[0].getStart();
2163 Asm->EmitLabelDifference(Entry.getBeginSym(), Base, Size);
2164 Asm->EmitLabelDifference(Entry.getEndSym(), Base, Size);
2165 } else {
2166 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
2167 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
2168 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002169
David Blaikie0e84adc2014-04-01 16:17:41 +00002170 emitDebugLocEntryLocation(Entry);
Devang Patel9fc11702010-05-25 23:40:22 +00002171 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002172 Asm->OutStreamer.EmitIntValue(0, Size);
2173 Asm->OutStreamer.EmitIntValue(0, Size);
2174 }
2175}
2176
2177void DwarfDebug::emitDebugLocDWO() {
2178 Asm->OutStreamer.SwitchSection(
2179 Asm->getObjFileLowering().getDwarfLocDWOSection());
2180 for (const auto &DebugLoc : DotDebugLocEntries) {
2181 Asm->OutStreamer.EmitLabel(DebugLoc.Label);
2182 for (const auto &Entry : DebugLoc.List) {
2183 // Just always use start_length for now - at least that's one address
2184 // rather than two. We could get fancier and try to, say, reuse an
2185 // address we know we've emitted elsewhere (the start of the function?
2186 // The start of the CU or CU subrange that encloses this range?)
2187 Asm->EmitInt8(dwarf::DW_LLE_start_length_entry);
David Blaikied75fb282014-04-23 21:20:10 +00002188 unsigned idx = AddrPool.getIndex(Entry.getBeginSym());
David Blaikie94c1d7f2014-04-02 01:50:20 +00002189 Asm->EmitULEB128(idx);
2190 Asm->EmitLabelDifference(Entry.getEndSym(), Entry.getBeginSym(), 4);
2191
2192 emitDebugLocEntryLocation(Entry);
David Blaikie9c550ac2014-03-25 01:44:02 +00002193 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002194 Asm->EmitInt8(dwarf::DW_LLE_end_of_list_entry);
Devang Patel9fc11702010-05-25 23:40:22 +00002195 }
Bill Wendling480ff322009-05-20 23:21:38 +00002196}
2197
Richard Mitton21101b32013-09-19 23:21:01 +00002198struct ArangeSpan {
2199 const MCSymbol *Start, *End;
2200};
2201
2202// Emit a debug aranges section, containing a CU lookup for any
2203// address we can tie back to a CU.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00002204void DwarfDebug::emitDebugARanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002205 // Start the dwarf aranges section.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002206 Asm->OutStreamer.SwitchSection(
2207 Asm->getObjFileLowering().getDwarfARangesSection());
Richard Mitton21101b32013-09-19 23:21:01 +00002208
Eric Christopher4287a492013-12-09 23:57:44 +00002209 typedef DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan> > SpansType;
Richard Mitton21101b32013-09-19 23:21:01 +00002210
2211 SpansType Spans;
2212
2213 // Build a list of sections used.
2214 std::vector<const MCSection *> Sections;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002215 for (const auto &it : SectionMap) {
2216 const MCSection *Section = it.first;
Richard Mitton21101b32013-09-19 23:21:01 +00002217 Sections.push_back(Section);
2218 }
2219
2220 // Sort the sections into order.
2221 // This is only done to ensure consistent output order across different runs.
2222 std::sort(Sections.begin(), Sections.end(), SectionSort);
2223
2224 // Build a set of address spans, sorted by CU.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002225 for (const MCSection *Section : Sections) {
David Blaikieafd2c6b2014-04-22 05:41:06 +00002226 SmallVector<SymbolCU, 8> &List = SectionMap[Section];
Richard Mitton21101b32013-09-19 23:21:01 +00002227 if (List.size() < 2)
2228 continue;
2229
2230 // Sort the symbols by offset within the section.
Benjamin Kramer571e2fe2014-03-07 19:41:22 +00002231 std::sort(List.begin(), List.end(),
2232 [&](const SymbolCU &A, const SymbolCU &B) {
2233 unsigned IA = A.Sym ? Asm->OutStreamer.GetSymbolOrder(A.Sym) : 0;
2234 unsigned IB = B.Sym ? Asm->OutStreamer.GetSymbolOrder(B.Sym) : 0;
2235
2236 // Symbols with no order assigned should be placed at the end.
2237 // (e.g. section end labels)
2238 if (IA == 0)
2239 return false;
2240 if (IB == 0)
2241 return true;
2242 return IA < IB;
2243 });
Richard Mitton21101b32013-09-19 23:21:01 +00002244
2245 // If we have no section (e.g. common), just write out
2246 // individual spans for each symbol.
2247 if (Section == NULL) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00002248 for (const SymbolCU &Cur : List) {
Richard Mitton21101b32013-09-19 23:21:01 +00002249 ArangeSpan Span;
2250 Span.Start = Cur.Sym;
2251 Span.End = NULL;
2252 if (Cur.CU)
2253 Spans[Cur.CU].push_back(Span);
2254 }
2255 } else {
2256 // Build spans between each label.
2257 const MCSymbol *StartSym = List[0].Sym;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002258 for (size_t n = 1, e = List.size(); n < e; n++) {
Richard Mitton21101b32013-09-19 23:21:01 +00002259 const SymbolCU &Prev = List[n - 1];
2260 const SymbolCU &Cur = List[n];
2261
2262 // Try and build the longest span we can within the same CU.
2263 if (Cur.CU != Prev.CU) {
2264 ArangeSpan Span;
2265 Span.Start = StartSym;
2266 Span.End = Cur.Sym;
2267 Spans[Prev.CU].push_back(Span);
2268 StartSym = Cur.Sym;
2269 }
2270 }
2271 }
2272 }
2273
Richard Mitton21101b32013-09-19 23:21:01 +00002274 unsigned PtrSize = Asm->getDataLayout().getPointerSize();
2275
2276 // Build a list of CUs used.
Eric Christopher4287a492013-12-09 23:57:44 +00002277 std::vector<DwarfCompileUnit *> CUs;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002278 for (const auto &it : Spans) {
2279 DwarfCompileUnit *CU = it.first;
Richard Mitton21101b32013-09-19 23:21:01 +00002280 CUs.push_back(CU);
2281 }
2282
2283 // Sort the CU list (again, to ensure consistent output order).
Benjamin Kramer571e2fe2014-03-07 19:41:22 +00002284 std::sort(CUs.begin(), CUs.end(), [](const DwarfUnit *A, const DwarfUnit *B) {
2285 return A->getUniqueID() < B->getUniqueID();
2286 });
Richard Mitton21101b32013-09-19 23:21:01 +00002287
2288 // Emit an arange table for each CU we used.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002289 for (DwarfCompileUnit *CU : CUs) {
Richard Mitton21101b32013-09-19 23:21:01 +00002290 std::vector<ArangeSpan> &List = Spans[CU];
2291
2292 // Emit size of content not including length itself.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002293 unsigned ContentSize =
2294 sizeof(int16_t) + // DWARF ARange version number
2295 sizeof(int32_t) + // Offset of CU in the .debug_info section
2296 sizeof(int8_t) + // Pointer Size (in bytes)
2297 sizeof(int8_t); // Segment Size (in bytes)
Richard Mitton21101b32013-09-19 23:21:01 +00002298
2299 unsigned TupleSize = PtrSize * 2;
2300
2301 // 7.20 in the Dwarf specs requires the table to be aligned to a tuple.
Benjamin Kramer8a68ab32014-01-07 19:28:14 +00002302 unsigned Padding =
2303 OffsetToAlignment(sizeof(int32_t) + ContentSize, TupleSize);
Richard Mitton21101b32013-09-19 23:21:01 +00002304
2305 ContentSize += Padding;
2306 ContentSize += (List.size() + 1) * TupleSize;
2307
2308 // For each compile unit, write the list of spans it covers.
2309 Asm->OutStreamer.AddComment("Length of ARange Set");
2310 Asm->EmitInt32(ContentSize);
2311 Asm->OutStreamer.AddComment("DWARF Arange version number");
2312 Asm->EmitInt16(dwarf::DW_ARANGES_VERSION);
2313 Asm->OutStreamer.AddComment("Offset Into Debug Info Section");
Eric Christopherd8667202013-12-30 17:22:27 +00002314 Asm->EmitSectionOffset(CU->getLocalLabelBegin(), CU->getLocalSectionSym());
Richard Mitton21101b32013-09-19 23:21:01 +00002315 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2316 Asm->EmitInt8(PtrSize);
2317 Asm->OutStreamer.AddComment("Segment Size (in bytes)");
2318 Asm->EmitInt8(0);
2319
Benjamin Kramer8a68ab32014-01-07 19:28:14 +00002320 Asm->OutStreamer.EmitFill(Padding, 0xff);
Richard Mitton21101b32013-09-19 23:21:01 +00002321
Benjamin Kramer15596c72014-03-07 19:09:39 +00002322 for (const ArangeSpan &Span : List) {
Richard Mitton21101b32013-09-19 23:21:01 +00002323 Asm->EmitLabelReference(Span.Start, PtrSize);
2324
2325 // Calculate the size as being from the span start to it's end.
Richard Mitton089ed892013-09-23 17:56:20 +00002326 if (Span.End) {
Richard Mitton21101b32013-09-19 23:21:01 +00002327 Asm->EmitLabelDifference(Span.End, Span.Start, PtrSize);
Richard Mitton089ed892013-09-23 17:56:20 +00002328 } else {
2329 // For symbols without an end marker (e.g. common), we
2330 // write a single arange entry containing just that one symbol.
2331 uint64_t Size = SymSize[Span.Start];
2332 if (Size == 0)
2333 Size = 1;
2334
2335 Asm->OutStreamer.EmitIntValue(Size, PtrSize);
2336 }
Richard Mitton21101b32013-09-19 23:21:01 +00002337 }
2338
2339 Asm->OutStreamer.AddComment("ARange terminator");
2340 Asm->OutStreamer.EmitIntValue(0, PtrSize);
2341 Asm->OutStreamer.EmitIntValue(0, PtrSize);
2342 }
Bill Wendling480ff322009-05-20 23:21:38 +00002343}
2344
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002345// Emit visible names into a debug ranges section.
Devang Patel930143b2009-11-21 02:48:08 +00002346void DwarfDebug::emitDebugRanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002347 // Start the dwarf ranges section.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002348 Asm->OutStreamer.SwitchSection(
2349 Asm->getObjFileLowering().getDwarfRangesSection());
Eric Christopher4751d702013-11-23 00:05:29 +00002350
Eric Christopher0f63d062013-12-03 00:45:45 +00002351 // Size for our labels.
2352 unsigned char Size = Asm->getDataLayout().getPointerSize();
2353
2354 // Grab the specific ranges for the compile units in the module.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002355 for (const auto &I : CUMap) {
2356 DwarfCompileUnit *TheCU = I.second;
Eric Christopher0f63d062013-12-03 00:45:45 +00002357
2358 // Emit a symbol so we can find the beginning of our ranges.
David Blaikie1ab7c2d2013-12-09 17:51:30 +00002359 Asm->OutStreamer.EmitLabel(TheCU->getLabelRange());
Eric Christopher0f63d062013-12-03 00:45:45 +00002360
2361 // Iterate over the misc ranges for the compile units in the module.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002362 for (const RangeSpanList &List : TheCU->getRangeLists()) {
Eric Christopherf8790642013-12-04 22:04:50 +00002363 // Emit our symbol so we can find the beginning of the range.
2364 Asm->OutStreamer.EmitLabel(List.getSym());
Eric Christopher0f63d062013-12-03 00:45:45 +00002365
Benjamin Kramer15596c72014-03-07 19:09:39 +00002366 for (const RangeSpan &Range : List.getRanges()) {
Eric Christopher0f63d062013-12-03 00:45:45 +00002367 const MCSymbol *Begin = Range.getStart();
2368 const MCSymbol *End = Range.getEnd();
Eric Christopher565ab112013-12-20 04:34:22 +00002369 assert(Begin && "Range without a begin symbol?");
2370 assert(End && "Range without an end symbol?");
2371 Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2372 Asm->OutStreamer.EmitSymbolValue(End, Size);
Eric Christopher0f63d062013-12-03 00:45:45 +00002373 }
2374
2375 // And terminate the list with two 0 values.
Eric Christopherce0cfce2013-01-09 01:35:34 +00002376 Asm->OutStreamer.EmitIntValue(0, Size);
Eric Christopher0f63d062013-12-03 00:45:45 +00002377 Asm->OutStreamer.EmitIntValue(0, Size);
2378 }
Eric Christopher46e23432013-12-20 04:16:18 +00002379
2380 // Now emit a range for the CU itself.
Eric Christopher384f3fe2014-03-20 19:16:16 +00002381 if (TheCU->getRanges().size() > 1) {
Eric Christopher46e23432013-12-20 04:16:18 +00002382 Asm->OutStreamer.EmitLabel(
2383 Asm->GetTempSymbol("cu_ranges", TheCU->getUniqueID()));
Benjamin Kramer15596c72014-03-07 19:09:39 +00002384 for (const RangeSpan &Range : TheCU->getRanges()) {
Eric Christopher46e23432013-12-20 04:16:18 +00002385 const MCSymbol *Begin = Range.getStart();
2386 const MCSymbol *End = Range.getEnd();
Eric Christopher565ab112013-12-20 04:34:22 +00002387 assert(Begin && "Range without a begin symbol?");
2388 assert(End && "Range without an end symbol?");
2389 Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2390 Asm->OutStreamer.EmitSymbolValue(End, Size);
Eric Christopher46e23432013-12-20 04:16:18 +00002391 }
2392 // And terminate the list with two 0 values.
2393 Asm->OutStreamer.EmitIntValue(0, Size);
2394 Asm->OutStreamer.EmitIntValue(0, Size);
2395 }
Devang Patel12563b32010-04-16 23:33:45 +00002396 }
Bill Wendling480ff322009-05-20 23:21:38 +00002397}
2398
Eric Christopherd692c1d2012-12-11 19:42:09 +00002399// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002400
David Blaikief9b6a552014-04-22 22:39:41 +00002401void DwarfDebug::initSkeletonUnit(const DwarfUnit &U, DIE *Die,
2402 std::unique_ptr<DwarfUnit> NewU) {
David Blaikie38fe6342014-01-09 04:28:46 +00002403 NewU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
David Blaikief9b6a552014-04-22 22:39:41 +00002404 U.getCUNode().getSplitDebugFilename());
David Blaikie38fe6342014-01-09 04:28:46 +00002405
David Blaikie38fe6342014-01-09 04:28:46 +00002406 if (!CompilationDir.empty())
2407 NewU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
2408
David Blaikief9b6a552014-04-22 22:39:41 +00002409 addGnuPubAttributes(*NewU, Die);
David Blaikie38fe6342014-01-09 04:28:46 +00002410
David Blaikief9b6a552014-04-22 22:39:41 +00002411 SkeletonHolder.addUnit(std::move(NewU));
David Blaikie38fe6342014-01-09 04:28:46 +00002412}
2413
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002414// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2415// 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 +00002416// DW_AT_addr_base, DW_AT_ranges_base.
David Blaikief9b6a552014-04-22 22:39:41 +00002417DwarfCompileUnit &DwarfDebug::constructSkeletonCU(const DwarfCompileUnit &CU) {
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002418
2419 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
David Blaikief9b6a552014-04-22 22:39:41 +00002420 auto OwnedUnit = make_unique<DwarfCompileUnit>(
2421 CU.getUniqueID(), Die, CU.getCUNode(), Asm, this, &SkeletonHolder);
2422 DwarfCompileUnit &NewCU = *OwnedUnit;
2423 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
David Blaikie637cac42014-04-22 23:09:36 +00002424 DwarfInfoSectionSym);
Eric Christopher4c7765f2013-01-17 03:00:04 +00002425
David Blaikief9b6a552014-04-22 22:39:41 +00002426 NewCU.initStmtList(DwarfLineSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002427
David Blaikief9b6a552014-04-22 22:39:41 +00002428 initSkeletonUnit(CU, Die, std::move(OwnedUnit));
Eric Christopherc8a310e2012-12-10 23:34:43 +00002429
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002430 return NewCU;
2431}
2432
David Blaikie15ed5eb2014-01-10 01:38:41 +00002433// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_dwo_name,
2434// DW_AT_addr_base.
David Blaikief9b6a552014-04-22 22:39:41 +00002435DwarfTypeUnit &DwarfDebug::constructSkeletonTU(DwarfTypeUnit &TU) {
David Blaikie60e63862014-02-14 23:58:13 +00002436 DwarfCompileUnit &CU = static_cast<DwarfCompileUnit &>(
David Blaikief9b6a552014-04-22 22:39:41 +00002437 *SkeletonHolder.getUnits()[TU.getCU().getUniqueID()]);
David Blaikie15ed5eb2014-01-10 01:38:41 +00002438
2439 DIE *Die = new DIE(dwarf::DW_TAG_type_unit);
David Blaikief9b6a552014-04-22 22:39:41 +00002440 auto OwnedUnit = make_unique<DwarfTypeUnit>(TU.getUniqueID(), Die, CU, Asm,
2441 this, &SkeletonHolder);
2442 DwarfTypeUnit &NewTU = *OwnedUnit;
2443 NewTU.setTypeSignature(TU.getTypeSignature());
2444 NewTU.setType(NULL);
2445 NewTU.initSection(
2446 Asm->getObjFileLowering().getDwarfTypesSection(TU.getTypeSignature()));
David Blaikie15ed5eb2014-01-10 01:38:41 +00002447
David Blaikief9b6a552014-04-22 22:39:41 +00002448 initSkeletonUnit(TU, Die, std::move(OwnedUnit));
David Blaikie15ed5eb2014-01-10 01:38:41 +00002449 return NewTU;
2450}
2451
Eric Christopherd692c1d2012-12-11 19:42:09 +00002452// Emit the .debug_info.dwo section for separated dwarf. This contains the
2453// compile units that would normally be in debug_info.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002454void DwarfDebug::emitDebugInfoDWO() {
Eric Christophercdf218d2012-12-10 19:51:21 +00002455 assert(useSplitDwarf() && "No split dwarf debug info?");
David Blaikie326e1fa2014-04-02 02:04:51 +00002456 // Don't pass an abbrev symbol, using a constant zero instead so as not to
2457 // emit relocations into the dwo file.
2458 InfoHolder.emitUnits(this, /* AbbrevSymbol */nullptr);
Eric Christopher3c5a1912012-12-19 22:02:53 +00002459}
2460
2461// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2462// abbreviations for the .debug_info.dwo section.
2463void DwarfDebug::emitDebugAbbrevDWO() {
2464 assert(useSplitDwarf() && "No split dwarf?");
David Blaikie0504cda2013-12-05 07:43:55 +00002465 InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection());
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002466}
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002467
David Blaikie4a2f95f2014-03-18 01:17:26 +00002468void DwarfDebug::emitDebugLineDWO() {
2469 assert(useSplitDwarf() && "No split dwarf?");
2470 Asm->OutStreamer.SwitchSection(
2471 Asm->getObjFileLowering().getDwarfLineDWOSection());
David Blaikie8287aff2014-03-18 02:13:23 +00002472 SplitTypeUnitFileTable.Emit(Asm->OutStreamer);
David Blaikie4a2f95f2014-03-18 01:17:26 +00002473}
2474
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002475// Emit the .debug_str.dwo section for separated dwarf. This contains the
2476// string section and is identical in format to traditional .debug_str
2477// sections.
2478void DwarfDebug::emitDebugStrDWO() {
2479 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002480 const MCSection *OffSec =
2481 Asm->getObjFileLowering().getDwarfStrOffDWOSection();
Eric Christopher2cbd5762013-01-07 19:32:41 +00002482 const MCSymbol *StrSym = DwarfStrSectionSym;
2483 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2484 OffSec, StrSym);
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002485}
David Blaikie409dd9c2013-11-19 23:08:21 +00002486
David Blaikie47f4b822014-03-19 00:11:28 +00002487MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) {
2488 if (!useSplitDwarf())
2489 return nullptr;
2490 if (SingleCU)
2491 SplitTypeUnitFileTable.setCompilationDir(CU.getCUNode().getDirectory());
2492 return &SplitTypeUnitFileTable;
2493}
2494
David Blaikie15632ae2014-02-12 00:31:30 +00002495void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU,
David Blaikief645f962014-01-09 03:23:41 +00002496 StringRef Identifier, DIE *RefDie,
2497 DICompositeType CTy) {
David Blaikie322d79b2014-01-31 19:52:26 +00002498 // Flag the type unit reference as a declaration so that if it contains
2499 // members (implicit special members, static data member definitions, member
2500 // declarations for definitions in this CU, etc) consumers don't get confused
2501 // and think this is a full definition.
David Blaikie15632ae2014-02-12 00:31:30 +00002502 CU.addFlag(RefDie, dwarf::DW_AT_declaration);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002503
David Blaikie47f615e2013-12-17 23:32:35 +00002504 const DwarfTypeUnit *&TU = DwarfTypeUnits[CTy];
Chandler Carruthb587ab62014-01-20 08:07:07 +00002505 if (TU) {
David Blaikie15632ae2014-02-12 00:31:30 +00002506 CU.addDIETypeSignature(RefDie, *TU);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002507 return;
David Blaikie409dd9c2013-11-19 23:08:21 +00002508 }
2509
Chandler Carruthb587ab62014-01-20 08:07:07 +00002510 DIE *UnitDie = new DIE(dwarf::DW_TAG_type_unit);
David Blaikief9b6a552014-04-22 22:39:41 +00002511 auto OwnedUnit =
2512 make_unique<DwarfTypeUnit>(InfoHolder.getUnits().size(), UnitDie, CU, Asm,
2513 this, &InfoHolder, getDwoLineTable(CU));
2514 DwarfTypeUnit &NewTU = *OwnedUnit;
2515 TU = &NewTU;
2516 InfoHolder.addUnit(std::move(OwnedUnit));
Chandler Carruthb587ab62014-01-20 08:07:07 +00002517
David Blaikief9b6a552014-04-22 22:39:41 +00002518 NewTU.addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
David Blaikie637cac42014-04-22 23:09:36 +00002519 CU.getLanguage());
Chandler Carruthb587ab62014-01-20 08:07:07 +00002520
2521 MD5 Hash;
2522 Hash.update(Identifier);
2523 // ... take the least significant 8 bytes and return those. Our MD5
2524 // implementation always returns its results in little endian, swap bytes
2525 // appropriately.
2526 MD5::MD5Result Result;
2527 Hash.final(Result);
2528 uint64_t Signature = *reinterpret_cast<support::ulittle64_t *>(Result + 8);
David Blaikief9b6a552014-04-22 22:39:41 +00002529 NewTU.setTypeSignature(Signature);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002530 if (useSplitDwarf())
David Blaikief9b6a552014-04-22 22:39:41 +00002531 NewTU.setSkeleton(constructSkeletonTU(NewTU));
David Blaikie60e63862014-02-14 23:58:13 +00002532 else
2533 CU.applyStmtList(*UnitDie);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002534
David Blaikief9b6a552014-04-22 22:39:41 +00002535 NewTU.setType(NewTU.createTypeDIE(CTy));
Chandler Carruthb587ab62014-01-20 08:07:07 +00002536
David Blaikief9b6a552014-04-22 22:39:41 +00002537 NewTU.initSection(
Chandler Carruthb587ab62014-01-20 08:07:07 +00002538 useSplitDwarf()
2539 ? Asm->getObjFileLowering().getDwarfTypesDWOSection(Signature)
2540 : Asm->getObjFileLowering().getDwarfTypesSection(Signature));
2541
David Blaikief9b6a552014-04-22 22:39:41 +00002542 CU.addDIETypeSignature(RefDie, NewTU);
David Blaikie409dd9c2013-11-19 23:08:21 +00002543}
David Blaikie4bd13b72014-03-07 18:49:45 +00002544
David Blaikief9b6a552014-04-22 22:39:41 +00002545void DwarfDebug::attachLowHighPC(DwarfCompileUnit &Unit, DIE *D,
David Blaikie4bd13b72014-03-07 18:49:45 +00002546 MCSymbol *Begin, MCSymbol *End) {
David Blaikief9b6a552014-04-22 22:39:41 +00002547 Unit.addLabelAddress(D, dwarf::DW_AT_low_pc, Begin);
Adrian Prantl887e7072014-03-07 23:07:21 +00002548 if (DwarfVersion < 4)
David Blaikief9b6a552014-04-22 22:39:41 +00002549 Unit.addLabelAddress(D, dwarf::DW_AT_high_pc, End);
David Blaikie4bd13b72014-03-07 18:49:45 +00002550 else
David Blaikief9b6a552014-04-22 22:39:41 +00002551 Unit.addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin);
David Blaikie4bd13b72014-03-07 18:49:45 +00002552}
David Blaikie2406a0622014-04-23 23:37:35 +00002553
2554// Accelerator table mutators - add each name along with its companion
2555// DIE to the proper table while ensuring that the name that we're going
2556// to reference is in the string table. We do this since the names we
2557// add may not only be identical to the names in the DIE.
2558void DwarfDebug::addAccelName(StringRef Name, const DIE *Die) {
2559 if (!useDwarfAccelTables())
2560 return;
2561 InfoHolder.getStringPoolEntry(Name);
2562 AccelNames.AddName(Name, Die);
2563}
David Blaikie0ee82b92014-04-24 00:53:32 +00002564
2565void DwarfDebug::addAccelObjC(StringRef Name, const DIE *Die) {
2566 if (!useDwarfAccelTables())
2567 return;
2568 InfoHolder.getStringPoolEntry(Name);
2569 AccelObjC.AddName(Name, Die);
2570}