blob: 7b413519f301a679a4918b6dc9157988c52edca1 [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
Bill Wendling2f921f82009-05-15 09:23:25 +000014#include "DwarfDebug.h"
David Blaikie37c52312014-10-04 15:49:50 +000015
16#include "ByteStreamer.h"
17#include "DwarfCompileUnit.h"
Chris Lattner3f3fb972010-04-05 05:24:55 +000018#include "DIE.h"
Eric Christopher45731982013-08-08 23:45:55 +000019#include "DIEHash.h"
David Blaikie2c86a722013-12-02 19:33:15 +000020#include "DwarfUnit.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000021#include "llvm/ADT/STLExtras.h"
22#include "llvm/ADT/Statistic.h"
23#include "llvm/ADT/StringExtras.h"
24#include "llvm/ADT/Triple.h"
David Greene829b3e82009-08-19 21:52:55 +000025#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000026#include "llvm/CodeGen/MachineModuleInfo.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000027#include "llvm/IR/Constants.h"
Chandler Carruth12664a02014-03-06 00:22:06 +000028#include "llvm/IR/DIBuilder.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000029#include "llvm/IR/DataLayout.h"
Chandler Carruth9a4c9e52014-03-06 00:46:21 +000030#include "llvm/IR/DebugInfo.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000031#include "llvm/IR/Instructions.h"
32#include "llvm/IR/Module.h"
Chandler Carruth4220e9c2014-03-04 11:17:44 +000033#include "llvm/IR/ValueHandle.h"
Chris Lattnere13c3722010-03-09 01:58:53 +000034#include "llvm/MC/MCAsmInfo.h"
Chris Lattner4d2c0f92009-07-31 18:48:30 +000035#include "llvm/MC/MCSection.h"
Chris Lattner4b7dadb2009-08-19 05:49:37 +000036#include "llvm/MC/MCStreamer.h"
Chris Lattnere13c3722010-03-09 01:58:53 +000037#include "llvm/MC/MCSymbol.h"
Devang Patel6c74a872010-04-27 19:46:33 +000038#include "llvm/Support/CommandLine.h"
Daniel Dunbarcdf01b52009-10-13 06:47:08 +000039#include "llvm/Support/Debug.h"
David Majnemered89b5c2013-08-21 06:13:34 +000040#include "llvm/Support/Dwarf.h"
Saleem Abdulrasool271ac582014-07-14 16:28:09 +000041#include "llvm/Support/Endian.h"
Daniel Dunbarcdf01b52009-10-13 06:47:08 +000042#include "llvm/Support/ErrorHandling.h"
Chris Lattnerf5c834f2010-01-22 22:09:00 +000043#include "llvm/Support/FormattedStream.h"
Logan Chien5b776b72014-02-22 14:00:39 +000044#include "llvm/Support/LEB128.h"
Eric Christopher67646432013-07-26 17:02:41 +000045#include "llvm/Support/MD5.h"
Michael J. Spencer447762d2010-11-29 18:16:10 +000046#include "llvm/Support/Path.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000047#include "llvm/Support/Timer.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000048#include "llvm/Target/TargetFrameLowering.h"
49#include "llvm/Target/TargetLoweringObjectFile.h"
50#include "llvm/Target/TargetMachine.h"
51#include "llvm/Target/TargetOptions.h"
52#include "llvm/Target/TargetRegisterInfo.h"
Eric Christopherd9134482014-08-04 21:25:23 +000053#include "llvm/Target/TargetSubtargetInfo.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000054using namespace llvm;
55
Chandler Carruth1b9dde02014-04-22 02:02:50 +000056#define DEBUG_TYPE "dwarfdebug"
57
Eric Christopher7f2b5512013-07-23 22:16:41 +000058static cl::opt<bool>
59DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden,
60 cl::desc("Disable debug info printing"));
Devang Patel6c74a872010-04-27 19:46:33 +000061
Eric Christopher7f2b5512013-07-23 22:16:41 +000062static cl::opt<bool> UnknownLocations(
63 "use-unknown-locations", cl::Hidden,
64 cl::desc("Make an absence of debug location information explicit."),
65 cl::init(false));
Dan Gohman7421ae42010-05-07 01:08:53 +000066
Eric Christopherdd1a0122013-09-13 00:35:05 +000067static cl::opt<bool>
68GenerateGnuPubSections("generate-gnu-dwarf-pub-sections", cl::Hidden,
69 cl::desc("Generate GNU-style pubnames and pubtypes"),
70 cl::init(false));
71
Eric Christopher02dbadb2014-02-14 01:26:55 +000072static cl::opt<bool> GenerateARangeSection("generate-arange-section",
73 cl::Hidden,
74 cl::desc("Generate dwarf aranges"),
75 cl::init(false));
76
Eric Christopher20b76a72012-08-23 22:36:40 +000077namespace {
Eric Christopherf07ee3a2014-01-27 23:50:03 +000078enum DefaultOnOff { Default, Enable, Disable };
Eric Christopher20b76a72012-08-23 22:36:40 +000079}
Eric Christopher4996c702011-11-07 09:24:32 +000080
Eric Christopher7f2b5512013-07-23 22:16:41 +000081static cl::opt<DefaultOnOff>
82DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
83 cl::desc("Output prototype dwarf accelerator tables."),
84 cl::values(clEnumVal(Default, "Default for platform"),
85 clEnumVal(Enable, "Enabled"),
86 clEnumVal(Disable, "Disabled"), clEnumValEnd),
87 cl::init(Default));
Eric Christopher20b76a72012-08-23 22:36:40 +000088
Eric Christopher7f2b5512013-07-23 22:16:41 +000089static cl::opt<DefaultOnOff>
Eric Christopher7f2b5512013-07-23 22:16:41 +000090SplitDwarf("split-dwarf", cl::Hidden,
Eric Christopher5d008fe2013-12-04 23:24:28 +000091 cl::desc("Output DWARF5 split debug info."),
Eric Christopher7f2b5512013-07-23 22:16:41 +000092 cl::values(clEnumVal(Default, "Default for platform"),
93 clEnumVal(Enable, "Enabled"),
94 clEnumVal(Disable, "Disabled"), clEnumValEnd),
95 cl::init(Default));
Eric Christopher29424312012-11-12 22:22:20 +000096
Eric Christopher7da24882013-08-19 21:07:38 +000097static cl::opt<DefaultOnOff>
Eric Christopher4d36ca02013-08-26 23:24:35 +000098DwarfPubSections("generate-dwarf-pub-sections", cl::Hidden,
99 cl::desc("Generate DWARF pubnames and pubtypes sections"),
100 cl::values(clEnumVal(Default, "Default for platform"),
101 clEnumVal(Enable, "Enabled"),
102 clEnumVal(Disable, "Disabled"), clEnumValEnd),
103 cl::init(Default));
Eric Christopher7da24882013-08-19 21:07:38 +0000104
Benjamin Kramerb12cf012013-08-24 12:54:27 +0000105static const char *const DWARFGroupName = "DWARF Emission";
106static const char *const DbgTimerName = "DWARF Debug Writer";
Bill Wendlingfcc14142010-04-07 09:28:04 +0000107
Bill Wendling2f921f82009-05-15 09:23:25 +0000108//===----------------------------------------------------------------------===//
109
Manman Renbe5576f2013-10-08 19:07:44 +0000110/// resolve - Look in the DwarfDebug map for the MDNode that
111/// corresponds to the reference.
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000112template <typename T> T DbgVariable::resolve(DIRef<T> Ref) const {
Manman Renbe5576f2013-10-08 19:07:44 +0000113 return DD->resolve(Ref);
114}
115
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000116bool DbgVariable::isBlockByrefVariable() const {
117 assert(Var.isVariable() && "Invalid complex DbgVariable!");
118 return Var.isBlockByrefVariable(DD->getTypeIdentifierMap());
119}
120
Nick Lewycky019d2552011-07-29 03:49:23 +0000121DIType DbgVariable::getType() const {
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000122 DIType Ty = Var.getType().resolve(DD->getTypeIdentifierMap());
Devang Patelf20c4f72011-04-12 22:53:02 +0000123 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
124 // addresses instead.
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000125 if (Var.isBlockByrefVariable(DD->getTypeIdentifierMap())) {
Devang Patelf20c4f72011-04-12 22:53:02 +0000126 /* Byref variables, in Blocks, are declared by the programmer as
127 "SomeType VarName;", but the compiler creates a
128 __Block_byref_x_VarName struct, and gives the variable VarName
129 either the struct, or a pointer to the struct, as its type. This
130 is necessary for various behind-the-scenes things the compiler
131 needs to do with by-reference variables in blocks.
Eric Christopher6a841382012-11-19 22:42:10 +0000132
Devang Patelf20c4f72011-04-12 22:53:02 +0000133 However, as far as the original *programmer* is concerned, the
134 variable should still have type 'SomeType', as originally declared.
Eric Christopher6a841382012-11-19 22:42:10 +0000135
Devang Patelf20c4f72011-04-12 22:53:02 +0000136 The following function dives into the __Block_byref_x_VarName
137 struct to find the original type of the variable. This will be
138 passed back to the code generating the type for the Debug
139 Information Entry for the variable 'VarName'. 'VarName' will then
140 have the original type 'SomeType' in its debug information.
Eric Christopher6a841382012-11-19 22:42:10 +0000141
Devang Patelf20c4f72011-04-12 22:53:02 +0000142 The original type 'SomeType' will be the type of the field named
143 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher6a841382012-11-19 22:42:10 +0000144
Devang Patelf20c4f72011-04-12 22:53:02 +0000145 NOTE: In order for this to not completely fail on the debugger
146 side, the Debug Information Entry for the variable VarName needs to
147 have a DW_AT_location that tells the debugger how to unwind through
148 the pointers and __Block_byref_x_VarName struct to find the actual
149 value of the variable. The function addBlockByrefType does this. */
150 DIType subType = Ty;
Eric Christopher31b05762013-08-08 01:41:00 +0000151 uint16_t tag = Ty.getTag();
Eric Christopher6a841382012-11-19 22:42:10 +0000152
Eric Christopher9adc55f2013-09-04 19:53:21 +0000153 if (tag == dwarf::DW_TAG_pointer_type)
Manman Renbe5576f2013-10-08 19:07:44 +0000154 subType = resolve(DIDerivedType(Ty).getTypeDerivedFrom());
Eric Christopher6a841382012-11-19 22:42:10 +0000155
Manman Renab8ffba2014-07-28 19:14:13 +0000156 DIArray Elements = DICompositeType(subType).getElements();
Devang Patelf20c4f72011-04-12 22:53:02 +0000157 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
David Blaikie5af2aca2013-11-18 23:57:26 +0000158 DIDerivedType DT(Elements.getElement(i));
Devang Patelf20c4f72011-04-12 22:53:02 +0000159 if (getName() == DT.getName())
Manman Renbe5576f2013-10-08 19:07:44 +0000160 return (resolve(DT.getTypeDerivedFrom()));
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000161 }
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000162 }
Devang Patelf20c4f72011-04-12 22:53:02 +0000163 return Ty;
164}
Bill Wendling2f921f82009-05-15 09:23:25 +0000165
David Blaikie18d33752014-04-24 01:23:49 +0000166static LLVM_CONSTEXPR DwarfAccelTable::Atom TypeAtoms[] = {
167 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4),
168 DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag, dwarf::DW_FORM_data2),
169 DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags, dwarf::DW_FORM_data1)};
170
Chris Lattnerf0d6bd32010-04-05 05:11:15 +0000171DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Craig Topper353eda42014-04-24 06:44:33 +0000172 : Asm(A), MMI(Asm->MMI), FirstCU(nullptr), PrevLabel(nullptr),
173 GlobalRangeCount(0), InfoHolder(A, "info_string", DIEValueAllocator),
Eric Christopher2037caf2014-01-28 00:49:26 +0000174 UsedNonDefaultText(false),
David Blaikie2406a0622014-04-23 23:37:35 +0000175 SkeletonHolder(A, "skel_string", DIEValueAllocator),
David Blaikiee1c79742014-09-30 21:28:32 +0000176 IsDarwin(Triple(A->getTargetTriple()).isOSDarwin()),
David Blaikie2406a0622014-04-23 23:37:35 +0000177 AccelNames(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
David Blaikie0ee82b92014-04-24 00:53:32 +0000178 dwarf::DW_FORM_data4)),
179 AccelObjC(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
David Blaikieecf04152014-04-24 01:02:42 +0000180 dwarf::DW_FORM_data4)),
181 AccelNamespace(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
David Blaikie18d33752014-04-24 01:23:49 +0000182 dwarf::DW_FORM_data4)),
183 AccelTypes(TypeAtoms) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000184
Craig Topper353eda42014-04-24 06:44:33 +0000185 DwarfInfoSectionSym = DwarfAbbrevSectionSym = DwarfStrSectionSym = nullptr;
186 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = nullptr;
187 DwarfLineSectionSym = nullptr;
188 DwarfAddrSectionSym = nullptr;
189 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = nullptr;
190 FunctionBeginSym = FunctionEndSym = nullptr;
191 CurFn = nullptr;
192 CurMI = nullptr;
Eric Christopherad9fe892012-04-02 17:58:52 +0000193
Adrian Prantl5bf1d002013-10-15 20:26:37 +0000194 // Turn on accelerator tables for Darwin by default, pubnames by
195 // default for non-Darwin, and handle split dwarf.
Eric Christopher574b5c82013-08-19 21:41:38 +0000196 if (DwarfAccelTables == Default)
197 HasDwarfAccelTables = IsDarwin;
198 else
Eric Christopher5297df02013-08-26 20:58:35 +0000199 HasDwarfAccelTables = DwarfAccelTables == Enable;
Eric Christopher20b76a72012-08-23 22:36:40 +0000200
Eric Christophercdf218d2012-12-10 19:51:21 +0000201 if (SplitDwarf == Default)
202 HasSplitDwarf = false;
Eric Christopher29424312012-11-12 22:22:20 +0000203 else
Eric Christopher574b5c82013-08-19 21:41:38 +0000204 HasSplitDwarf = SplitDwarf == Enable;
Eric Christopher29424312012-11-12 22:22:20 +0000205
Eric Christopher4d36ca02013-08-26 23:24:35 +0000206 if (DwarfPubSections == Default)
207 HasDwarfPubSections = !IsDarwin;
Eric Christopher574b5c82013-08-19 21:41:38 +0000208 else
Eric Christopher4d36ca02013-08-26 23:24:35 +0000209 HasDwarfPubSections = DwarfPubSections == Enable;
Eric Christopher7da24882013-08-19 21:07:38 +0000210
Eric Christopher4c5bff32014-06-19 06:22:08 +0000211 unsigned DwarfVersionNumber = Asm->TM.Options.MCOptions.DwarfVersion;
Eric Christopher793c7472014-04-28 20:42:22 +0000212 DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber
213 : MMI->getModule()->getDwarfVersion();
Manman Renac8062b2013-07-02 23:40:10 +0000214
Oliver Stannardf7693f42014-06-19 15:39:33 +0000215 Asm->OutStreamer.getContext().setDwarfVersion(DwarfVersion);
216
Dan Gohman6e681a52010-06-18 15:56:31 +0000217 {
218 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopher58f41952012-11-19 22:42:15 +0000219 beginModule();
Torok Edwinf8dba242010-04-07 10:44:46 +0000220 }
Bill Wendling2f921f82009-05-15 09:23:25 +0000221}
Bill Wendling2f921f82009-05-15 09:23:25 +0000222
Reid Klecknerdd2647e2014-04-30 20:34:31 +0000223// Define out of line so we don't have to include DwarfUnit.h in DwarfDebug.h.
224DwarfDebug::~DwarfDebug() { }
225
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000226// Switch to the specified MCSection and emit an assembler
227// temporary label to it if SymbolStem is specified.
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000228static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Craig Topper353eda42014-04-24 06:44:33 +0000229 const char *SymbolStem = nullptr) {
Eric Christophera7b61892011-11-07 09:18:38 +0000230 Asm->OutStreamer.SwitchSection(Section);
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000231 if (!SymbolStem)
Craig Topper353eda42014-04-24 06:44:33 +0000232 return nullptr;
Eric Christophera7b61892011-11-07 09:18:38 +0000233
234 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
235 Asm->OutStreamer.EmitLabel(TmpSym);
236 return TmpSym;
237}
238
Eric Christopherd9843b32011-11-10 19:25:34 +0000239static bool isObjCClass(StringRef Name) {
240 return Name.startswith("+") || Name.startswith("-");
241}
242
243static bool hasObjCCategory(StringRef Name) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000244 if (!isObjCClass(Name))
245 return false;
Eric Christopherd9843b32011-11-10 19:25:34 +0000246
Benjamin Kramer260de742013-08-24 12:15:54 +0000247 return Name.find(") ") != StringRef::npos;
Eric Christopherd9843b32011-11-10 19:25:34 +0000248}
249
250static void getObjCClassCategory(StringRef In, StringRef &Class,
251 StringRef &Category) {
252 if (!hasObjCCategory(In)) {
253 Class = In.slice(In.find('[') + 1, In.find(' '));
254 Category = "";
255 return;
256 }
257
258 Class = In.slice(In.find('[') + 1, In.find('('));
259 Category = In.slice(In.find('[') + 1, In.find(' '));
260 return;
261}
262
263static StringRef getObjCMethodName(StringRef In) {
264 return In.slice(In.find(' ') + 1, In.find(']'));
265}
266
Richard Mittonc2508242013-10-03 22:07:08 +0000267// Helper for sorting sections into a stable output order.
268static bool SectionSort(const MCSection *A, const MCSection *B) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000269 std::string LA = (A ? A->getLabelBeginName() : "");
270 std::string LB = (B ? B->getLabelBeginName() : "");
271 return LA < LB;
Richard Mittonc2508242013-10-03 22:07:08 +0000272}
273
Eric Christopherd9843b32011-11-10 19:25:34 +0000274// Add the various names to the Dwarf accelerator table names.
Eric Christopher9cd26af2013-09-20 23:22:52 +0000275// TODO: Determine whether or not we should add names for programs
276// that do not have a DW_AT_name or DW_AT_linkage_name field - this
277// is only slightly different than the lookup of non-standard ObjC names.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000278void DwarfDebug::addSubprogramNames(DISubprogram SP, DIE &Die) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000279 if (!SP.isDefinition())
280 return;
David Blaikie2406a0622014-04-23 23:37:35 +0000281 addAccelName(SP.getName(), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000282
283 // If the linkage name is different than the name, go ahead and output
284 // that as well into the name table.
285 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
David Blaikie2406a0622014-04-23 23:37:35 +0000286 addAccelName(SP.getLinkageName(), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000287
288 // If this is an Objective-C selector name add it to the ObjC accelerator
289 // too.
290 if (isObjCClass(SP.getName())) {
291 StringRef Class, Category;
292 getObjCClassCategory(SP.getName(), Class, Category);
David Blaikie0ee82b92014-04-24 00:53:32 +0000293 addAccelObjC(Class, Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000294 if (Category != "")
David Blaikie0ee82b92014-04-24 00:53:32 +0000295 addAccelObjC(Category, Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000296 // Also add the base method name to the name table.
David Blaikie2406a0622014-04-23 23:37:35 +0000297 addAccelName(getObjCMethodName(SP.getName()), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000298 }
299}
300
Manman Ren3eb9dff2013-09-09 19:05:21 +0000301/// isSubprogramContext - Return true if Context is either a subprogram
302/// or another context nested inside a subprogram.
303bool DwarfDebug::isSubprogramContext(const MDNode *Context) {
304 if (!Context)
305 return false;
306 DIDescriptor D(Context);
307 if (D.isSubprogram())
308 return true;
309 if (D.isType())
Manman Ren116868e2013-09-09 19:47:11 +0000310 return isSubprogramContext(resolve(DIType(Context).getContext()));
Manman Ren3eb9dff2013-09-09 19:05:21 +0000311 return false;
312}
313
Manman Ren5b2f4b02013-09-11 19:40:28 +0000314/// Check whether we should create a DIE for the given Scope, return true
315/// if we don't create a DIE (the corresponding DIE is null).
Manman Ren2312ed32013-09-10 18:40:41 +0000316bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
317 if (Scope->isAbstractScope())
318 return false;
319
Manman Ren5b2f4b02013-09-11 19:40:28 +0000320 // We don't create a DIE if there is no Range.
Manman Ren2312ed32013-09-10 18:40:41 +0000321 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
322 if (Ranges.empty())
323 return true;
324
325 if (Ranges.size() > 1)
326 return false;
327
Manman Ren5b2f4b02013-09-11 19:40:28 +0000328 // We don't create a DIE if we have a single Range and the end label
329 // is null.
David Blaikiecd4b8a22014-08-31 02:14:26 +0000330 return !getLabelAfterInsn(Ranges.front().second);
Manman Ren2312ed32013-09-10 18:40:41 +0000331}
332
David Blaikie65a74662014-04-25 18:26:14 +0000333static void addSectionLabel(AsmPrinter &Asm, DwarfUnit &U, DIE &D,
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000334 dwarf::Attribute A, const MCSymbol *L,
335 const MCSymbol *Sec) {
David Blaikief9b6a552014-04-22 22:39:41 +0000336 if (Asm.MAI->doesDwarfUseRelocationsAcrossSections())
337 U.addSectionLabel(D, A, L);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000338 else
David Blaikief9b6a552014-04-22 22:39:41 +0000339 U.addSectionDelta(D, A, L, Sec);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000340}
341
David Blaikie65a74662014-04-25 18:26:14 +0000342void DwarfDebug::addScopeRangeList(DwarfCompileUnit &TheCU, DIE &ScopeDIE,
Eric Christopherbe2513e2013-12-03 00:45:59 +0000343 const SmallVectorImpl<InsnRange> &Range) {
344 // Emit offset in .debug_range as a relocatable label. emitDIE will handle
345 // emitting it appropriately.
Eric Christopherf8790642013-12-04 22:04:50 +0000346 MCSymbol *RangeSym = Asm->GetTempSymbol("debug_ranges", GlobalRangeCount++);
David Blaikie26b2bd02014-03-24 21:07:27 +0000347
348 // Under fission, ranges are specified by constant offsets relative to the
349 // CU's DW_AT_GNU_ranges_base.
350 if (useSplitDwarf())
David Blaikief9b6a552014-04-22 22:39:41 +0000351 TheCU.addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
David Blaikie637cac42014-04-22 23:09:36 +0000352 DwarfDebugRangeSectionSym);
David Blaikie26b2bd02014-03-24 21:07:27 +0000353 else
David Blaikief9b6a552014-04-22 22:39:41 +0000354 addSectionLabel(*Asm, TheCU, ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
David Blaikie26b2bd02014-03-24 21:07:27 +0000355 DwarfDebugRangeSectionSym);
Eric Christopherc31fe2d2013-12-05 00:36:17 +0000356
Eric Christopherf8790642013-12-04 22:04:50 +0000357 RangeSpanList List(RangeSym);
Benjamin Kramer15596c72014-03-07 19:09:39 +0000358 for (const InsnRange &R : Range) {
359 RangeSpan Span(getLabelBeforeInsn(R.first), getLabelAfterInsn(R.second));
Chandler Carruth002da5d2014-03-02 04:08:41 +0000360 List.addRange(std::move(Span));
Eric Christopherbe2513e2013-12-03 00:45:59 +0000361 }
362
363 // Add the range list to the set of ranges to be emitted.
David Blaikief9b6a552014-04-22 22:39:41 +0000364 TheCU.addRangeList(std::move(List));
Eric Christopherbe2513e2013-12-03 00:45:59 +0000365}
366
David Blaikie4a3b84d2014-05-16 16:42:40 +0000367void DwarfDebug::attachRangesOrLowHighPC(DwarfCompileUnit &TheCU, DIE &Die,
368 const SmallVectorImpl<InsnRange> &Ranges) {
369 assert(!Ranges.empty());
370 if (Ranges.size() == 1)
David Blaikie14499a72014-10-04 15:58:47 +0000371 TheCU.attachLowHighPC(Die, getLabelBeforeInsn(Ranges.front().first),
372 getLabelAfterInsn(Ranges.front().second));
David Blaikie4a3b84d2014-05-16 16:42:40 +0000373 else
374 addScopeRangeList(TheCU, Die, Ranges);
375}
376
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000377// Construct new DW_TAG_lexical_block for this scope and attach
378// DW_AT_low_pc/DW_AT_high_pc labels.
David Blaikief2449222014-04-28 20:36:45 +0000379std::unique_ptr<DIE>
380DwarfDebug::constructLexicalScopeDIE(DwarfCompileUnit &TheCU,
381 LexicalScope *Scope) {
Manman Ren2312ed32013-09-10 18:40:41 +0000382 if (isLexicalScopeDIENull(Scope))
Craig Topper353eda42014-04-24 06:44:33 +0000383 return nullptr;
Manman Ren2312ed32013-09-10 18:40:41 +0000384
David Blaikief2449222014-04-28 20:36:45 +0000385 auto ScopeDIE = make_unique<DIE>(dwarf::DW_TAG_lexical_block);
Devang Patel6c74a872010-04-27 19:46:33 +0000386 if (Scope->isAbstractScope())
387 return ScopeDIE;
388
David Blaikie4a3b84d2014-05-16 16:42:40 +0000389 attachRangesOrLowHighPC(TheCU, *ScopeDIE, Scope->getRanges());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000390
391 return ScopeDIE;
392}
393
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000394// This scope represents inlined body of a function. Construct DIE to
395// represent this concrete inlined copy of the function.
David Blaikief2449222014-04-28 20:36:45 +0000396std::unique_ptr<DIE>
397DwarfDebug::constructInlinedScopeDIE(DwarfCompileUnit &TheCU,
398 LexicalScope *Scope) {
David Blaikief662f0a2014-05-14 17:58:53 +0000399 assert(Scope->getScopeNode());
Devang Patelf098ce22011-07-27 00:34:13 +0000400 DIScope DS(Scope->getScopeNode());
401 DISubprogram InlinedSP = getDISubprogram(DS);
David Blaikie1ea9db22014-05-21 23:14:12 +0000402 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
403 // was inlined from another compile unit.
David Blaikie2910f622014-05-27 18:37:51 +0000404 DIE *OriginDIE = AbstractSPDies[InlinedSP];
David Blaikie1ea9db22014-05-21 23:14:12 +0000405 assert(OriginDIE && "Unable to find original DIE for an inlined subprogram.");
Devang Patelf098ce22011-07-27 00:34:13 +0000406
David Blaikief2449222014-04-28 20:36:45 +0000407 auto ScopeDIE = make_unique<DIE>(dwarf::DW_TAG_inlined_subroutine);
David Blaikie8dbcc3f2014-04-25 19:33:43 +0000408 TheCU.addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000409
David Blaikie4a3b84d2014-05-16 16:42:40 +0000410 attachRangesOrLowHighPC(TheCU, *ScopeDIE, Scope->getRanges());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000411
412 InlinedSubprogramDIEs.insert(OriginDIE);
413
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000414 // Add the call site information to the DIE.
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000415 DILocation DL(Scope->getInlinedAt());
David Blaikie65a74662014-04-25 18:26:14 +0000416 TheCU.addUInt(*ScopeDIE, dwarf::DW_AT_call_file, None,
David Blaikie637cac42014-04-22 23:09:36 +0000417 TheCU.getOrCreateSourceID(DL.getFilename(), DL.getDirectory()));
David Blaikie65a74662014-04-25 18:26:14 +0000418 TheCU.addUInt(*ScopeDIE, dwarf::DW_AT_call_line, None, DL.getLineNumber());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000419
Eric Christopher8dda5d02011-12-04 06:02:38 +0000420 // Add name to the name table, we do this here because we're guaranteed
421 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
David Blaikieb0b3fcf2014-04-25 18:52:29 +0000422 addSubprogramNames(InlinedSP, *ScopeDIE);
Eric Christopher6a841382012-11-19 22:42:10 +0000423
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000424 return ScopeDIE;
425}
426
David Blaikie44078b32014-04-30 22:41:33 +0000427static std::unique_ptr<DIE> constructVariableDIE(DwarfCompileUnit &TheCU,
428 DbgVariable &DV,
429 const LexicalScope &Scope,
430 DIE *&ObjectPointer) {
David Blaikieb85f0082014-05-27 19:34:32 +0000431 auto Var = TheCU.constructVariableDIE(DV, Scope.isAbstractScope());
David Blaikie44078b32014-04-30 22:41:33 +0000432 if (DV.isObjectPointer())
433 ObjectPointer = Var.get();
434 return Var;
435}
436
David Blaikie914046e2014-04-25 20:00:34 +0000437DIE *DwarfDebug::createScopeChildrenDIE(
438 DwarfCompileUnit &TheCU, LexicalScope *Scope,
David Blaikie6a150a82014-08-31 21:26:22 +0000439 SmallVectorImpl<std::unique_ptr<DIE>> &Children,
440 unsigned *ChildScopeCount) {
Craig Topper353eda42014-04-24 06:44:33 +0000441 DIE *ObjectPointer = nullptr;
Devang Patel6c622ef2011-03-01 22:58:55 +0000442
David Blaikie44078b32014-04-30 22:41:33 +0000443 for (DbgVariable *DV : ScopeVariables.lookup(Scope))
444 Children.push_back(constructVariableDIE(TheCU, *DV, *Scope, ObjectPointer));
445
David Blaikie6a150a82014-08-31 21:26:22 +0000446 unsigned ChildCountWithoutScopes = Children.size();
447
Benjamin Kramer15596c72014-03-07 19:09:39 +0000448 for (LexicalScope *LS : Scope->getChildren())
David Blaikie6a150a82014-08-31 21:26:22 +0000449 constructScopeDIE(TheCU, LS, Children);
450
451 if (ChildScopeCount)
452 *ChildScopeCount = Children.size() - ChildCountWithoutScopes;
453
Manman Ren2312ed32013-09-10 18:40:41 +0000454 return ObjectPointer;
455}
456
David Blaikie3fbf3b82014-08-31 18:04:28 +0000457DIE *DwarfDebug::createAndAddScopeChildren(DwarfCompileUnit &TheCU,
David Blaikie899ae612014-04-30 22:58:19 +0000458 LexicalScope *Scope, DIE &ScopeDIE) {
David Blaikied8f0ac72014-04-28 20:27:02 +0000459 // We create children when the scope DIE is not null.
David Blaikiee872a6e2014-04-29 15:58:35 +0000460 SmallVector<std::unique_ptr<DIE>, 8> Children;
David Blaikie3fbf3b82014-08-31 18:04:28 +0000461 DIE *ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children);
David Blaikied8f0ac72014-04-28 20:27:02 +0000462
463 // Add children
464 for (auto &I : Children)
David Blaikiee872a6e2014-04-29 15:58:35 +0000465 ScopeDIE.addChild(std::move(I));
David Blaikie3fbf3b82014-08-31 18:04:28 +0000466
467 return ObjectPointer;
David Blaikiee872a6e2014-04-29 15:58:35 +0000468}
469
David Blaikie4c1089d2014-04-29 23:43:06 +0000470void DwarfDebug::constructAbstractSubprogramScopeDIE(DwarfCompileUnit &TheCU,
471 LexicalScope *Scope) {
David Blaikiee872a6e2014-04-29 15:58:35 +0000472 assert(Scope && Scope->getScopeNode());
473 assert(Scope->isAbstractScope());
474 assert(!Scope->getInlinedAt());
475
David Blaikie48602252014-05-23 05:03:23 +0000476 DISubprogram SP(Scope->getScopeNode());
David Blaikiee872a6e2014-04-29 15:58:35 +0000477
David Blaikie482097d2014-05-27 18:37:55 +0000478 ProcessedSPNodes.insert(SP);
479
David Blaikie3c2fff32014-05-27 18:37:48 +0000480 DIE *&AbsDef = AbstractSPDies[SP];
481 if (AbsDef)
David Blaikie4abe19e2014-05-12 18:23:35 +0000482 return;
David Blaikiee872a6e2014-04-29 15:58:35 +0000483
David Blaikie1ea9db22014-05-21 23:14:12 +0000484 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
485 // was inlined from another compile unit.
David Blaikie48602252014-05-23 05:03:23 +0000486 DwarfCompileUnit &SPCU = *SPMap[SP];
David Blaikie482097d2014-05-27 18:37:55 +0000487 DIE *ContextDIE;
David Blaikie3c2fff32014-05-27 18:37:48 +0000488
David Blaikie482097d2014-05-27 18:37:55 +0000489 // Some of this is duplicated from DwarfUnit::getOrCreateSubprogramDIE, with
490 // the important distinction that the DIDescriptor is not associated with the
491 // DIE (since the DIDescriptor will be associated with the concrete DIE, if
492 // any). It could be refactored to some common utility function.
493 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
494 ContextDIE = &SPCU.getUnitDie();
495 SPCU.getOrCreateSubprogramDIE(SPDecl);
496 } else
497 ContextDIE = SPCU.getOrCreateContextDIE(resolve(SP.getContext()));
498
499 // Passing null as the associated DIDescriptor because the abstract definition
500 // shouldn't be found by lookup.
501 AbsDef = &SPCU.createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE,
502 DIDescriptor());
David Blaikie3dca5992014-06-06 22:29:05 +0000503 SPCU.applySubprogramAttributesToDefinition(SP, *AbsDef);
David Blaikie3c2fff32014-05-27 18:37:48 +0000504
David Blaikie6cca8102014-09-30 23:29:16 +0000505 if (TheCU.getCUNode().getEmissionKind() != DIBuilder::LineTablesOnly)
506 SPCU.addUInt(*AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
David Blaikie3fbf3b82014-08-31 18:04:28 +0000507 if (DIE *ObjectPointer = createAndAddScopeChildren(SPCU, Scope, *AbsDef))
508 SPCU.addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer);
David Blaikiee872a6e2014-04-29 15:58:35 +0000509}
510
David Blaikie1cae8492014-09-30 22:32:49 +0000511void DwarfDebug::constructSubprogramScopeDIE(DwarfCompileUnit &TheCU,
David Blaikiee872a6e2014-04-29 15:58:35 +0000512 LexicalScope *Scope) {
513 assert(Scope && Scope->getScopeNode());
514 assert(!Scope->getInlinedAt());
515 assert(!Scope->isAbstractScope());
David Blaikiee872a6e2014-04-29 15:58:35 +0000516 DISubprogram Sub(Scope->getScopeNode());
517
David Blaikie9ba72542014-05-14 21:52:46 +0000518 assert(Sub.isSubprogram());
519
David Blaikiee872a6e2014-04-29 15:58:35 +0000520 ProcessedSPNodes.insert(Sub);
521
David Blaikiecda2aa82014-10-04 16:24:00 +0000522 DIE &ScopeDIE = TheCU.updateSubprogramScopeDIE(Sub);
David Blaikiee872a6e2014-04-29 15:58:35 +0000523
David Blaikie3fbf3b82014-08-31 18:04:28 +0000524 // Collect arguments for current function.
525 assert(LScopes.isCurrentFunctionScope(Scope));
526 DIE *ObjectPointer = nullptr;
527 for (DbgVariable *ArgDV : CurrentFnArguments)
528 if (ArgDV)
529 ScopeDIE.addChild(
530 constructVariableDIE(TheCU, *ArgDV, *Scope, ObjectPointer));
531
532 // If this is a variadic function, add an unspecified parameter.
533 DITypeArray FnArgs = Sub.getType().getTypeArray();
534 // If we have a single element of null, it is a function that returns void.
535 // If we have more than one elements and the last one is null, it is a
536 // variadic function.
537 if (FnArgs.getNumElements() > 1 &&
538 !FnArgs.getElement(FnArgs.getNumElements() - 1))
539 ScopeDIE.addChild(make_unique<DIE>(dwarf::DW_TAG_unspecified_parameters));
540
541 // Collect lexical scope children first.
542 // ObjectPointer might be a local (non-argument) local variable if it's a
543 // block's synthetic this pointer.
544 if (DIE *BlockObjPtr = createAndAddScopeChildren(TheCU, Scope, ScopeDIE)) {
545 assert(!ObjectPointer && "multiple object pointers can't be described");
546 ObjectPointer = BlockObjPtr;
547 }
548
549 if (ObjectPointer)
550 TheCU.addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer);
David Blaikied8f0ac72014-04-28 20:27:02 +0000551}
552
Manman Ren2312ed32013-09-10 18:40:41 +0000553// Construct a DIE for this scope.
David Blaikie6a150a82014-08-31 21:26:22 +0000554void DwarfDebug::constructScopeDIE(
555 DwarfCompileUnit &TheCU, LexicalScope *Scope,
556 SmallVectorImpl<std::unique_ptr<DIE>> &FinalChildren) {
Manman Ren2312ed32013-09-10 18:40:41 +0000557 if (!Scope || !Scope->getScopeNode())
David Blaikie6a150a82014-08-31 21:26:22 +0000558 return;
Manman Ren2312ed32013-09-10 18:40:41 +0000559
Adrian Prantl78619f72014-03-21 22:16:32 +0000560 DIScope DS(Scope->getScopeNode());
Manman Ren2312ed32013-09-10 18:40:41 +0000561
David Blaikied67ffe82014-04-28 22:27:26 +0000562 assert((Scope->getInlinedAt() || !DS.isSubprogram()) &&
563 "Only handle inlined subprograms here, use "
564 "constructSubprogramScopeDIE for non-inlined "
565 "subprograms");
David Blaikied8f0ac72014-04-28 20:27:02 +0000566
David Blaikie914046e2014-04-25 20:00:34 +0000567 SmallVector<std::unique_ptr<DIE>, 8> Children;
Manman Ren2312ed32013-09-10 18:40:41 +0000568
Manman Ren5b2f4b02013-09-11 19:40:28 +0000569 // We try to create the scope DIE first, then the children DIEs. This will
570 // avoid creating un-used children then removing them later when we find out
571 // the scope DIE is null.
David Blaikief2449222014-04-28 20:36:45 +0000572 std::unique_ptr<DIE> ScopeDIE;
David Blaikie48b056b2014-05-19 21:54:31 +0000573 if (Scope->getParent() && DS.isSubprogram()) {
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000574 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
David Blaikied8f0ac72014-04-28 20:27:02 +0000575 if (!ScopeDIE)
David Blaikie6a150a82014-08-31 21:26:22 +0000576 return;
David Blaikied8f0ac72014-04-28 20:27:02 +0000577 // We create children when the scope DIE is not null.
578 createScopeChildrenDIE(TheCU, Scope, Children);
David Blaikiee26a3772013-11-18 23:59:04 +0000579 } else {
Manman Ren5b2f4b02013-09-11 19:40:28 +0000580 // Early exit when we know the scope DIE is going to be null.
Manman Ren2312ed32013-09-10 18:40:41 +0000581 if (isLexicalScopeDIENull(Scope))
David Blaikie6a150a82014-08-31 21:26:22 +0000582 return;
583
584 unsigned ChildScopeCount;
Manman Ren5b2f4b02013-09-11 19:40:28 +0000585
586 // We create children here when we know the scope DIE is not going to be
587 // null and the children will be added to the scope DIE.
David Blaikie6a150a82014-08-31 21:26:22 +0000588 createScopeChildrenDIE(TheCU, Scope, Children, &ChildScopeCount);
Manman Ren5b2f4b02013-09-11 19:40:28 +0000589
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000590 // There is no need to emit empty lexical block DIE.
David Blaikie684fc532013-05-06 23:33:07 +0000591 std::pair<ImportedEntityMap::const_iterator,
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000592 ImportedEntityMap::const_iterator> Range =
Eric Christopher793c7472014-04-28 20:42:22 +0000593 std::equal_range(ScopesWithImportedEntities.begin(),
594 ScopesWithImportedEntities.end(),
595 std::pair<const MDNode *, const MDNode *>(DS, nullptr),
596 less_first());
David Blaikie28127462014-08-31 05:46:17 +0000597 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
598 ++i)
599 Children.push_back(
600 constructImportedEntityDIE(TheCU, DIImportedEntity(i->second)));
David Blaikie6a150a82014-08-31 21:26:22 +0000601 // If there are only other scopes as children, put them directly in the
602 // parent instead, as this scope would serve no purpose.
603 if (Children.size() == ChildScopeCount) {
604 FinalChildren.insert(FinalChildren.end(),
605 std::make_move_iterator(Children.begin()),
606 std::make_move_iterator(Children.end()));
607 return;
608 }
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000609 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Manman Ren2312ed32013-09-10 18:40:41 +0000610 assert(ScopeDIE && "Scope DIE should not be null.");
Benjamin Kramer892daba2013-08-24 11:55:49 +0000611 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000612
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000613 // Add children
David Blaikie914046e2014-04-25 20:00:34 +0000614 for (auto &I : Children)
615 ScopeDIE->addChild(std::move(I));
Devang Patel04d2f2d2009-11-24 01:14:22 +0000616
David Blaikie6a150a82014-08-31 21:26:22 +0000617 FinalChildren.push_back(std::move(ScopeDIE));
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000618}
619
David Blaikie65a74662014-04-25 18:26:14 +0000620void DwarfDebug::addGnuPubAttributes(DwarfUnit &U, DIE &D) const {
David Blaikie3c842622013-12-04 21:31:26 +0000621 if (!GenerateGnuPubSections)
622 return;
623
David Blaikief9b6a552014-04-22 22:39:41 +0000624 U.addFlag(D, dwarf::DW_AT_GNU_pubnames);
David Blaikie3c842622013-12-04 21:31:26 +0000625}
626
Eric Christopher4287a492013-12-09 23:57:44 +0000627// Create new DwarfCompileUnit for the given metadata node with tag
Eric Christopher48fef592012-12-20 21:58:40 +0000628// DW_TAG_compile_unit.
David Blaikief9b6a552014-04-22 22:39:41 +0000629DwarfCompileUnit &DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) {
Devang Patel2d9caf92009-11-25 17:36:49 +0000630 StringRef FN = DIUnit.getFilename();
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000631 CompilationDir = DIUnit.getDirectory();
Bill Wendling2b128d72009-05-20 23:19:06 +0000632
David Blaikief9b6a552014-04-22 22:39:41 +0000633 auto OwnedUnit = make_unique<DwarfCompileUnit>(
David Blaikiebd579052014-04-28 21:14:27 +0000634 InfoHolder.getUnits().size(), DIUnit, Asm, this, &InfoHolder);
David Blaikief9b6a552014-04-22 22:39:41 +0000635 DwarfCompileUnit &NewCU = *OwnedUnit;
David Blaikie92a2f8a2014-04-28 21:04:29 +0000636 DIE &Die = NewCU.getUnitDie();
David Blaikief9b6a552014-04-22 22:39:41 +0000637 InfoHolder.addUnit(std::move(OwnedUnit));
638
David Blaikie7ac51492014-03-20 17:05:45 +0000639 // LTO with assembly output shares a single line table amongst multiple CUs.
640 // To avoid the compilation directory being ambiguous, let the line table
641 // explicitly describe the directory of all files, never relying on the
642 // compilation directory.
David Blaikie47f4b822014-03-19 00:11:28 +0000643 if (!Asm->OutStreamer.hasRawTextSupport() || SingleCU)
David Blaikiee05274d2014-03-18 00:11:48 +0000644 Asm->OutStreamer.getContext().setMCLineTableCompilationDir(
David Blaikief9b6a552014-04-22 22:39:41 +0000645 NewCU.getUniqueID(), CompilationDir);
David Blaikie2666e242013-12-06 19:38:46 +0000646
David Blaikie92a2f8a2014-04-28 21:04:29 +0000647 NewCU.addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
648 NewCU.addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
David Blaikie637cac42014-04-22 23:09:36 +0000649 DIUnit.getLanguage());
David Blaikie92a2f8a2014-04-28 21:04:29 +0000650 NewCU.addString(Die, dwarf::DW_AT_name, FN);
Eric Christopher52ce7182013-04-09 19:23:15 +0000651
Eric Christopher52ce7182013-04-09 19:23:15 +0000652 if (!useSplitDwarf()) {
David Blaikief9b6a552014-04-22 22:39:41 +0000653 NewCU.initStmtList(DwarfLineSectionSym);
Eric Christophera51d3fc2013-09-27 22:50:48 +0000654
655 // If we're using split dwarf the compilation dir is going to be in the
656 // skeleton CU and so we don't need to duplicate it here.
657 if (!CompilationDir.empty())
David Blaikie92a2f8a2014-04-28 21:04:29 +0000658 NewCU.addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christophera51d3fc2013-09-27 22:50:48 +0000659
David Blaikie92a2f8a2014-04-28 21:04:29 +0000660 addGnuPubAttributes(NewCU, Die);
Eric Christopher52ce7182013-04-09 19:23:15 +0000661 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000662
Bill Wendling2b128d72009-05-20 23:19:06 +0000663 if (DIUnit.isOptimized())
David Blaikie92a2f8a2014-04-28 21:04:29 +0000664 NewCU.addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendling2b128d72009-05-20 23:19:06 +0000665
Devang Patel2d9caf92009-11-25 17:36:49 +0000666 StringRef Flags = DIUnit.getFlags();
667 if (!Flags.empty())
David Blaikie92a2f8a2014-04-28 21:04:29 +0000668 NewCU.addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher6a841382012-11-19 22:42:10 +0000669
Nick Lewycky479a8fe2011-10-17 23:27:36 +0000670 if (unsigned RVer = DIUnit.getRunTimeVersion())
David Blaikie92a2f8a2014-04-28 21:04:29 +0000671 NewCU.addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
David Blaikie637cac42014-04-22 23:09:36 +0000672 dwarf::DW_FORM_data1, RVer);
Bill Wendling2b128d72009-05-20 23:19:06 +0000673
Devang Patel1a0df9a2010-05-10 22:49:55 +0000674 if (!FirstCU)
David Blaikief9b6a552014-04-22 22:39:41 +0000675 FirstCU = &NewCU;
Eric Christopher7a2cdf72013-02-05 07:31:55 +0000676
Eric Christopherd4368fd2014-01-02 21:03:28 +0000677 if (useSplitDwarf()) {
David Blaikief9b6a552014-04-22 22:39:41 +0000678 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoDWOSection(),
David Blaikie637cac42014-04-22 23:09:36 +0000679 DwarfInfoDWOSectionSym);
David Blaikief9b6a552014-04-22 22:39:41 +0000680 NewCU.setSkeleton(constructSkeletonCU(NewCU));
Eric Christopherd4368fd2014-01-02 21:03:28 +0000681 } else
David Blaikief9b6a552014-04-22 22:39:41 +0000682 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
David Blaikie637cac42014-04-22 23:09:36 +0000683 DwarfInfoSectionSym);
Eric Christopherd039baa2013-12-30 03:40:32 +0000684
David Blaikief9b6a552014-04-22 22:39:41 +0000685 CUMap.insert(std::make_pair(DIUnit, &NewCU));
David Blaikie92a2f8a2014-04-28 21:04:29 +0000686 CUDieMap.insert(std::make_pair(&Die, &NewCU));
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000687 return NewCU;
Devang Patel1a0df9a2010-05-10 22:49:55 +0000688}
689
David Blaikie8912df12014-08-31 05:41:15 +0000690void DwarfDebug::constructAndAddImportedEntityDIE(DwarfCompileUnit &TheCU,
691 const MDNode *N) {
David Blaikie1fd43652013-05-07 21:35:53 +0000692 DIImportedEntity Module(N);
David Blaikie5e390e42014-02-04 01:23:52 +0000693 assert(Module.Verify());
David Blaikief9b6a552014-04-22 22:39:41 +0000694 if (DIE *D = TheCU.getOrCreateContextDIE(Module.getContext()))
David Blaikiee0e8a3b2014-08-31 05:32:06 +0000695 D->addChild(constructImportedEntityDIE(TheCU, Module));
David Blaikie684fc532013-05-06 23:33:07 +0000696}
697
David Blaikiee0e8a3b2014-08-31 05:32:06 +0000698std::unique_ptr<DIE>
699DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
700 const DIImportedEntity &Module) {
David Blaikie684fc532013-05-06 23:33:07 +0000701 assert(Module.Verify() &&
702 "Use one of the MDNode * overloads to handle invalid metadata");
David Blaikiee0e8a3b2014-08-31 05:32:06 +0000703 std::unique_ptr<DIE> IMDie = make_unique<DIE>((dwarf::Tag)Module.getTag());
704 TheCU.insertDIE(Module, IMDie.get());
David Blaikie1fd43652013-05-07 21:35:53 +0000705 DIE *EntityDie;
Adrian Prantld09ba232014-04-01 03:41:04 +0000706 DIDescriptor Entity = resolve(Module.getEntity());
David Blaikie1fd43652013-05-07 21:35:53 +0000707 if (Entity.isNameSpace())
David Blaikief9b6a552014-04-22 22:39:41 +0000708 EntityDie = TheCU.getOrCreateNameSpace(DINameSpace(Entity));
David Blaikie1fd43652013-05-07 21:35:53 +0000709 else if (Entity.isSubprogram())
David Blaikief9b6a552014-04-22 22:39:41 +0000710 EntityDie = TheCU.getOrCreateSubprogramDIE(DISubprogram(Entity));
David Blaikie3b6038b2013-05-08 06:01:41 +0000711 else if (Entity.isType())
David Blaikief9b6a552014-04-22 22:39:41 +0000712 EntityDie = TheCU.getOrCreateTypeDIE(DIType(Entity));
David Blaikie1fd43652013-05-07 21:35:53 +0000713 else
David Blaikief9b6a552014-04-22 22:39:41 +0000714 EntityDie = TheCU.getDIE(Entity);
David Blaikiee0e8a3b2014-08-31 05:32:06 +0000715 assert(EntityDie);
716 TheCU.addSourceLine(*IMDie, Module.getLineNumber(),
David Blaikie637cac42014-04-22 23:09:36 +0000717 Module.getContext().getFilename(),
718 Module.getContext().getDirectory());
David Blaikiee0e8a3b2014-08-31 05:32:06 +0000719 TheCU.addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie);
David Blaikiee63d5d12013-05-20 22:50:35 +0000720 StringRef Name = Module.getName();
721 if (!Name.empty())
David Blaikiee0e8a3b2014-08-31 05:32:06 +0000722 TheCU.addString(*IMDie, dwarf::DW_AT_name, Name);
723
724 return IMDie;
David Blaikief55abea2013-04-22 06:12:31 +0000725}
726
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000727// Emit all Dwarf sections that should come prior to the content. Create
728// global DIEs and emit initial debug info sections. This is invoked by
729// the target AsmPrinter.
Eric Christopher58f41952012-11-19 22:42:15 +0000730void DwarfDebug::beginModule() {
Devang Patel6c74a872010-04-27 19:46:33 +0000731 if (DisableDebugInfoPrinting)
732 return;
733
Eric Christopher58f41952012-11-19 22:42:15 +0000734 const Module *M = MMI->getModule();
735
David Blaikie2f040112014-07-25 16:10:16 +0000736 FunctionDIs = makeSubprogramMap(*M);
737
Nick Lewycky019d2552011-07-29 03:49:23 +0000738 // If module has named metadata anchors then use them, otherwise scan the
739 // module using debug info finder to collect debug info.
Devang Patele02e5852011-05-03 16:45:22 +0000740 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiedc69ebb2013-03-11 23:39:23 +0000741 if (!CU_Nodes)
Devang Patel07bb9ee2011-08-15 23:47:24 +0000742 return;
Manman Ren60352032013-09-05 18:48:31 +0000743 TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
Devang Patele02e5852011-05-03 16:45:22 +0000744
David Blaikiedc69ebb2013-03-11 23:39:23 +0000745 // Emit initial sections so we can reference labels later.
746 emitSectionLabels();
747
David Blaikie47f4b822014-03-19 00:11:28 +0000748 SingleCU = CU_Nodes->getNumOperands() == 1;
David Blaikiee05274d2014-03-18 00:11:48 +0000749
David Blaikie47f4b822014-03-19 00:11:28 +0000750 for (MDNode *N : CU_Nodes->operands()) {
Benjamin Kramer15596c72014-03-07 19:09:39 +0000751 DICompileUnit CUNode(N);
David Blaikief9b6a552014-04-22 22:39:41 +0000752 DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode);
David Blaikie1fd43652013-05-07 21:35:53 +0000753 DIArray ImportedEntities = CUNode.getImportedEntities();
754 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikie684fc532013-05-06 23:33:07 +0000755 ScopesWithImportedEntities.push_back(std::make_pair(
David Blaikie1fd43652013-05-07 21:35:53 +0000756 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
757 ImportedEntities.getElement(i)));
David Blaikie684fc532013-05-06 23:33:07 +0000758 std::sort(ScopesWithImportedEntities.begin(),
Benjamin Kramerb12cf012013-08-24 12:54:27 +0000759 ScopesWithImportedEntities.end(), less_first());
David Blaikiedc69ebb2013-03-11 23:39:23 +0000760 DIArray GVs = CUNode.getGlobalVariables();
761 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
Frederic Riss9ba9eff2014-09-19 15:12:03 +0000762 CU.getOrCreateGlobalVariableDIE(DIGlobalVariable(GVs.getElement(i)));
David Blaikie6ba88e02014-08-29 22:10:52 +0000763 DIArray SPs = CUNode.getSubprograms();
764 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
765 SPMap.insert(std::make_pair(SPs.getElement(i), &CU));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000766 DIArray EnumTypes = CUNode.getEnumTypes();
Manman Renbd1628a2014-07-28 23:04:20 +0000767 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i) {
768 DIType Ty(EnumTypes.getElement(i));
769 // The enum types array by design contains pointers to
770 // MDNodes rather than DIRefs. Unique them here.
771 DIType UniqueTy(resolve(Ty.getRef()));
772 CU.getOrCreateTypeDIE(UniqueTy);
773 }
David Blaikiedc69ebb2013-03-11 23:39:23 +0000774 DIArray RetainedTypes = CUNode.getRetainedTypes();
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000775 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i) {
776 DIType Ty(RetainedTypes.getElement(i));
777 // The retained types array by design contains pointers to
778 // MDNodes rather than DIRefs. Unique them here.
779 DIType UniqueTy(resolve(Ty.getRef()));
David Blaikief9b6a552014-04-22 22:39:41 +0000780 CU.getOrCreateTypeDIE(UniqueTy);
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000781 }
David Blaikief55abea2013-04-22 06:12:31 +0000782 // Emit imported_modules last so that the relevant context is already
783 // available.
David Blaikie1fd43652013-05-07 21:35:53 +0000784 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikie8912df12014-08-31 05:41:15 +0000785 constructAndAddImportedEntityDIE(CU, ImportedEntities.getElement(i));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000786 }
Eric Christopher6a841382012-11-19 22:42:10 +0000787
Chris Lattner7cfa70e2010-04-05 02:19:28 +0000788 // Tell MMI that we have debug info.
789 MMI->setDebugInfoAvailability(true);
Eric Christopher6a841382012-11-19 22:42:10 +0000790
Bill Wendling2b128d72009-05-20 23:19:06 +0000791 // Prime section data.
Richard Mitton21101b32013-09-19 23:21:01 +0000792 SectionMap[Asm->getObjFileLowering().getTextSection()];
Bill Wendling2b128d72009-05-20 23:19:06 +0000793}
794
David Blaikieeb1a2722014-06-13 22:18:23 +0000795void DwarfDebug::finishVariableDefinitions() {
796 for (const auto &Var : ConcreteVariables) {
797 DIE *VariableDie = Var->getDIE();
David Blaikief73ae4f2014-08-12 00:00:31 +0000798 assert(VariableDie);
David Blaikieeb1a2722014-06-13 22:18:23 +0000799 // FIXME: Consider the time-space tradeoff of just storing the unit pointer
800 // in the ConcreteVariables list, rather than looking it up again here.
801 // DIE::getUnit isn't simple - it walks parent pointers, etc.
802 DwarfCompileUnit *Unit = lookupUnit(VariableDie->getUnit());
803 assert(Unit);
David Blaikiee847f132014-06-13 22:35:44 +0000804 DbgVariable *AbsVar = getExistingAbstractVariable(Var->getVariable());
David Blaikieeb1a2722014-06-13 22:18:23 +0000805 if (AbsVar && AbsVar->getDIE()) {
806 Unit->addDIEEntry(*VariableDie, dwarf::DW_AT_abstract_origin,
807 *AbsVar->getDIE());
808 } else
809 Unit->applyVariableAttributes(*Var, *VariableDie);
810 }
811}
812
David Blaikief7221ad2014-05-27 18:37:43 +0000813void DwarfDebug::finishSubprogramDefinitions() {
814 const Module *M = MMI->getModule();
815
816 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
817 for (MDNode *N : CU_Nodes->operands()) {
818 DICompileUnit TheCU(N);
819 // Construct subprogram DIE and add variables DIEs.
820 DwarfCompileUnit *SPCU =
821 static_cast<DwarfCompileUnit *>(CUMap.lookup(TheCU));
822 DIArray Subprograms = TheCU.getSubprograms();
823 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
824 DISubprogram SP(Subprograms.getElement(i));
David Blaikie3c2fff32014-05-27 18:37:48 +0000825 // Perhaps the subprogram is in another CU (such as due to comdat
826 // folding, etc), in which case ignore it here.
827 if (SPMap[SP] != SPCU)
828 continue;
829 DIE *D = SPCU->getDIE(SP);
David Blaikie482097d2014-05-27 18:37:55 +0000830 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SP)) {
831 if (D)
832 // If this subprogram has an abstract definition, reference that
833 SPCU->addDIEEntry(*D, dwarf::DW_AT_abstract_origin, *AbsSPDIE);
834 } else {
David Blaikie3a7ce252014-09-19 17:03:16 +0000835 if (!D && TheCU.getEmissionKind() != DIBuilder::LineTablesOnly)
David Blaikie482097d2014-05-27 18:37:55 +0000836 // Lazily construct the subprogram if we didn't see either concrete or
David Blaikie3a7ce252014-09-19 17:03:16 +0000837 // inlined versions during codegen. (except in -gmlt ^ where we want
838 // to omit these entirely)
David Blaikie482097d2014-05-27 18:37:55 +0000839 D = SPCU->getOrCreateSubprogramDIE(SP);
David Blaikie3a7ce252014-09-19 17:03:16 +0000840 if (D)
841 // And attach the attributes
842 SPCU->applySubprogramAttributesToDefinition(SP, *D);
David Blaikie482097d2014-05-27 18:37:55 +0000843 }
David Blaikief7221ad2014-05-27 18:37:43 +0000844 }
845 }
846}
847
848
Eric Christopher960ac372012-11-22 00:59:49 +0000849// Collect info for variables that were optimized out.
850void DwarfDebug::collectDeadVariables() {
851 const Module *M = MMI->getModule();
Eric Christopher960ac372012-11-22 00:59:49 +0000852
853 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
Benjamin Kramer15596c72014-03-07 19:09:39 +0000854 for (MDNode *N : CU_Nodes->operands()) {
855 DICompileUnit TheCU(N);
David Blaikie9ba72542014-05-14 21:52:46 +0000856 // Construct subprogram DIE and add variables DIEs.
857 DwarfCompileUnit *SPCU =
858 static_cast<DwarfCompileUnit *>(CUMap.lookup(TheCU));
859 assert(SPCU && "Unable to find Compile Unit!");
Eric Christopher960ac372012-11-22 00:59:49 +0000860 DIArray Subprograms = TheCU.getSubprograms();
861 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopher735401c2012-11-27 00:13:51 +0000862 DISubprogram SP(Subprograms.getElement(i));
Eric Christophera6c38a32013-10-15 23:31:38 +0000863 if (ProcessedSPNodes.count(SP) != 0)
864 continue;
David Blaikie7af6e6f2014-05-14 21:52:37 +0000865 assert(SP.isSubprogram() &&
866 "CU's subprogram list contains a non-subprogram");
David Blaikie48369d12014-05-16 22:21:45 +0000867 assert(SP.isDefinition() &&
868 "CU's subprogram list contains a subprogram declaration");
Eric Christopher735401c2012-11-27 00:13:51 +0000869 DIArray Variables = SP.getVariables();
Eric Christophera6c38a32013-10-15 23:31:38 +0000870 if (Variables.getNumElements() == 0)
871 continue;
Eric Christopher960ac372012-11-22 00:59:49 +0000872
David Blaikie482097d2014-05-27 18:37:55 +0000873 DIE *SPDIE = AbstractSPDies.lookup(SP);
874 if (!SPDIE)
875 SPDIE = SPCU->getDIE(SP);
David Blaikie8729bca2014-05-22 00:48:36 +0000876 assert(SPDIE);
Eric Christopher735401c2012-11-27 00:13:51 +0000877 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
878 DIVariable DV(Variables.getElement(vi));
David Blaikie9ba72542014-05-14 21:52:46 +0000879 assert(DV.isVariable());
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000880 DbgVariable NewVar(DV, DIExpression(nullptr), this);
David Blaikieeb1a2722014-06-13 22:18:23 +0000881 auto VariableDie = SPCU->constructVariableDIE(NewVar);
882 SPCU->applyVariableAttributes(NewVar, *VariableDie);
883 SPDIE->addChild(std::move(VariableDie));
Eric Christopher735401c2012-11-27 00:13:51 +0000884 }
Eric Christopher960ac372012-11-22 00:59:49 +0000885 }
886 }
887 }
Eric Christopher960ac372012-11-22 00:59:49 +0000888}
889
890void DwarfDebug::finalizeModuleInfo() {
David Blaikie3c2fff32014-05-27 18:37:48 +0000891 finishSubprogramDefinitions();
892
David Blaikieeb1a2722014-06-13 22:18:23 +0000893 finishVariableDefinitions();
894
Eric Christopher960ac372012-11-22 00:59:49 +0000895 // Collect info for variables that were optimized out.
896 collectDeadVariables();
897
Eric Christopherad10cb52013-12-04 23:24:38 +0000898 // Handle anything that needs to be done on a per-unit basis after
899 // all other generation.
David Blaikiec33b3cd2014-04-22 21:27:37 +0000900 for (const auto &TheU : getUnits()) {
Eric Christopher60eb7692013-08-12 20:27:48 +0000901 // Emit DW_AT_containing_type attribute to connect types with their
902 // vtable holding type.
David Blaikie2a80e442013-12-02 22:09:48 +0000903 TheU->constructContainingTypeDIEs();
Eric Christopher60eb7692013-08-12 20:27:48 +0000904
Eric Christopher46e23432013-12-20 04:16:18 +0000905 // Add CU specific attributes if we need to add any.
David Blaikieadcde362014-04-25 18:35:57 +0000906 if (TheU->getUnitDie().getTag() == dwarf::DW_TAG_compile_unit) {
Eric Christopher46e23432013-12-20 04:16:18 +0000907 // If we're splitting the dwarf out now that we've got the entire
Eric Christopherd8667202013-12-30 17:22:27 +0000908 // CU then add the dwo id to it.
909 DwarfCompileUnit *SkCU =
910 static_cast<DwarfCompileUnit *>(TheU->getSkeleton());
Eric Christopher46e23432013-12-20 04:16:18 +0000911 if (useSplitDwarf()) {
Eric Christopher09d1c0f2014-03-14 21:20:07 +0000912 // Emit a unique identifier for this CU.
David Blaikieadcde362014-04-25 18:35:57 +0000913 uint64_t ID = DIEHash(Asm).computeCUSignature(TheU->getUnitDie());
914 TheU->addUInt(TheU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher46e23432013-12-20 04:16:18 +0000915 dwarf::DW_FORM_data8, ID);
David Blaikieadcde362014-04-25 18:35:57 +0000916 SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher46e23432013-12-20 04:16:18 +0000917 dwarf::DW_FORM_data8, ID);
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000918
919 // We don't keep track of which addresses are used in which CU so this
920 // is a bit pessimistic under LTO.
David Blaikied75fb282014-04-23 21:20:10 +0000921 if (!AddrPool.isEmpty())
David Blaikieadcde362014-04-25 18:35:57 +0000922 addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000923 dwarf::DW_AT_GNU_addr_base, DwarfAddrSectionSym,
924 DwarfAddrSectionSym);
925 if (!TheU->getRangeLists().empty())
David Blaikieadcde362014-04-25 18:35:57 +0000926 addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000927 dwarf::DW_AT_GNU_ranges_base,
928 DwarfDebugRangeSectionSym, DwarfDebugRangeSectionSym);
Eric Christopherd29614f2013-08-13 01:21:55 +0000929 }
Eric Christopherd8667202013-12-30 17:22:27 +0000930
Eric Christopher384f3fe2014-03-20 19:16:16 +0000931 // If we have code split among multiple sections or non-contiguous
932 // ranges of code then emit a DW_AT_ranges attribute on the unit that will
933 // remain in the .o file, otherwise add a DW_AT_low_pc.
934 // FIXME: We should use ranges allow reordering of code ala
935 // .subsections_via_symbols in mach-o. This would mean turning on
936 // ranges for all subprogram DIEs for mach-o.
David Blaikiec33b3cd2014-04-22 21:27:37 +0000937 DwarfCompileUnit &U =
938 SkCU ? *SkCU : static_cast<DwarfCompileUnit &>(*TheU);
Eric Christopher384f3fe2014-03-20 19:16:16 +0000939 unsigned NumRanges = TheU->getRanges().size();
940 if (NumRanges) {
941 if (NumRanges > 1) {
David Blaikieadcde362014-04-25 18:35:57 +0000942 addSectionLabel(*Asm, U, U.getUnitDie(), dwarf::DW_AT_ranges,
David Blaikiec33b3cd2014-04-22 21:27:37 +0000943 Asm->GetTempSymbol("cu_ranges", U.getUniqueID()),
Eric Christopher384f3fe2014-03-20 19:16:16 +0000944 DwarfDebugRangeSectionSym);
Eric Christopher8873ada2014-01-29 22:22:56 +0000945
Eric Christopher384f3fe2014-03-20 19:16:16 +0000946 // A DW_AT_low_pc attribute may also be specified in combination with
947 // DW_AT_ranges to specify the default base address for use in
948 // location lists (see Section 2.6.2) and range lists (see Section
949 // 2.17.3).
David Blaikieadcde362014-04-25 18:35:57 +0000950 U.addUInt(U.getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
David Blaikiec33b3cd2014-04-22 21:27:37 +0000951 0);
Eric Christopher384f3fe2014-03-20 19:16:16 +0000952 } else {
953 RangeSpan &Range = TheU->getRanges().back();
David Blaikie14499a72014-10-04 15:58:47 +0000954 U.attachLowHighPC(U.getUnitDie(), Range.getStart(), Range.getEnd());
Eric Christopher384f3fe2014-03-20 19:16:16 +0000955 }
956 }
Eric Christopher60eb7692013-08-12 20:27:48 +0000957 }
958 }
959
960 // Compute DIE offsets and sizes.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000961 InfoHolder.computeSizeAndOffsets();
962 if (useSplitDwarf())
963 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher960ac372012-11-22 00:59:49 +0000964}
965
966void DwarfDebug::endSections() {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000967 // Filter labels by section.
Benjamin Kramer15596c72014-03-07 19:09:39 +0000968 for (const SymbolCU &SCU : ArangeLabels) {
Richard Mitton21101b32013-09-19 23:21:01 +0000969 if (SCU.Sym->isInSection()) {
970 // Make a note of this symbol and it's section.
971 const MCSection *Section = &SCU.Sym->getSection();
972 if (!Section->getKind().isMetadata())
973 SectionMap[Section].push_back(SCU);
974 } else {
975 // Some symbols (e.g. common/bss on mach-o) can have no section but still
976 // appear in the output. This sucks as we rely on sections to build
977 // arange spans. We can do it without, but it's icky.
Craig Topper353eda42014-04-24 06:44:33 +0000978 SectionMap[nullptr].push_back(SCU);
Richard Mitton21101b32013-09-19 23:21:01 +0000979 }
980 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000981
Richard Mittonc2508242013-10-03 22:07:08 +0000982 // Build a list of sections used.
983 std::vector<const MCSection *> Sections;
Benjamin Kramer15596c72014-03-07 19:09:39 +0000984 for (const auto &it : SectionMap) {
985 const MCSection *Section = it.first;
Richard Mittonc2508242013-10-03 22:07:08 +0000986 Sections.push_back(Section);
987 }
988
989 // Sort the sections into order.
990 // This is only done to ensure consistent output order across different runs.
991 std::sort(Sections.begin(), Sections.end(), SectionSort);
992
993 // Add terminating symbols for each section.
Benjamin Kramer15596c72014-03-07 19:09:39 +0000994 for (unsigned ID = 0, E = Sections.size(); ID != E; ID++) {
Richard Mittonc2508242013-10-03 22:07:08 +0000995 const MCSection *Section = Sections[ID];
Craig Topper353eda42014-04-24 06:44:33 +0000996 MCSymbol *Sym = nullptr;
Richard Mitton21101b32013-09-19 23:21:01 +0000997
998 if (Section) {
Richard Mittonc2508242013-10-03 22:07:08 +0000999 // We can't call MCSection::getLabelEndName, as it's only safe to do so
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001000 // if we know the section name up-front. For user-created sections, the
Eric Christopher95531b62014-01-29 22:06:21 +00001001 // resulting label may not be valid to use as a label. (section names can
1002 // use a greater set of characters on some systems)
Richard Mittonc2508242013-10-03 22:07:08 +00001003 Sym = Asm->GetTempSymbol("debug_end", ID);
Richard Mitton21101b32013-09-19 23:21:01 +00001004 Asm->OutStreamer.SwitchSection(Section);
1005 Asm->OutStreamer.EmitLabel(Sym);
1006 }
1007
1008 // Insert a final terminator.
Craig Topper353eda42014-04-24 06:44:33 +00001009 SectionMap[Section].push_back(SymbolCU(nullptr, Sym));
Bill Wendling2b128d72009-05-20 23:19:06 +00001010 }
Eric Christopher960ac372012-11-22 00:59:49 +00001011}
Bill Wendling2b128d72009-05-20 23:19:06 +00001012
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001013// Emit all Dwarf sections that should come after the content.
Eric Christopher960ac372012-11-22 00:59:49 +00001014void DwarfDebug::endModule() {
Craig Toppere73658d2014-04-28 04:05:08 +00001015 assert(CurFn == nullptr);
1016 assert(CurMI == nullptr);
Eric Christopher960ac372012-11-22 00:59:49 +00001017
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001018 if (!FirstCU)
1019 return;
Eric Christopher960ac372012-11-22 00:59:49 +00001020
1021 // End any existing sections.
1022 // TODO: Does this need to happen?
1023 endSections();
1024
1025 // Finalize the debug info for the module.
1026 finalizeModuleInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001027
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001028 emitDebugStr();
Eric Christopher9cd26af2013-09-20 23:22:52 +00001029
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001030 // Emit all the DIEs into a debug info section.
1031 emitDebugInfo();
Eric Christopher4c9b1192012-11-27 00:41:54 +00001032
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001033 // Corresponding abbreviations into a abbrev section.
1034 emitAbbreviations();
Eric Christopher95198f502012-11-27 22:43:42 +00001035
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001036 // Emit info into a debug aranges section.
Eric Christopher02dbadb2014-02-14 01:26:55 +00001037 if (GenerateARangeSection)
1038 emitDebugARanges();
Eric Christopher95198f502012-11-27 22:43:42 +00001039
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001040 // Emit info into a debug ranges section.
1041 emitDebugRanges();
Eric Christopher95198f502012-11-27 22:43:42 +00001042
Eric Christopher9a8f5ed2013-11-19 09:04:50 +00001043 if (useSplitDwarf()) {
1044 emitDebugStrDWO();
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001045 emitDebugInfoDWO();
Eric Christopher3c5a1912012-12-19 22:02:53 +00001046 emitDebugAbbrevDWO();
David Blaikie4a2f95f2014-03-18 01:17:26 +00001047 emitDebugLineDWO();
David Blaikiede8e12a2014-06-19 17:59:14 +00001048 emitDebugLocDWO();
Eric Christopher962c9082013-01-15 23:56:56 +00001049 // Emit DWO addresses.
David Blaikied75fb282014-04-23 21:20:10 +00001050 AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection());
David Blaikie94c1d7f2014-04-02 01:50:20 +00001051 } else
1052 // Emit info into a debug loc section.
1053 emitDebugLoc();
Bill Wendling2b128d72009-05-20 23:19:06 +00001054
Eric Christophera876b822012-08-23 07:32:06 +00001055 // Emit info into the dwarf accelerator table sections.
Eric Christopher20b76a72012-08-23 22:36:40 +00001056 if (useDwarfAccelTables()) {
Eric Christopher4996c702011-11-07 09:24:32 +00001057 emitAccelNames();
1058 emitAccelObjC();
1059 emitAccelNamespaces();
1060 emitAccelTypes();
1061 }
Eric Christopher6a841382012-11-19 22:42:10 +00001062
Eric Christopher4b358182013-08-30 00:40:17 +00001063 // Emit the pubnames and pubtypes sections if requested.
1064 if (HasDwarfPubSections) {
David Blaikie70a33202013-09-19 17:33:35 +00001065 emitDebugPubNames(GenerateGnuPubSections);
1066 emitDebugPubTypes(GenerateGnuPubSections);
Eric Christopher4b358182013-08-30 00:40:17 +00001067 }
Devang Patel04d2f2d2009-11-24 01:14:22 +00001068
Devang Pateld0701282010-08-02 17:32:15 +00001069 // clean up.
Devang Pateleb1bb4e2011-08-16 22:09:43 +00001070 SPMap.clear();
David Blaikie825bdd22014-05-21 22:41:17 +00001071 AbstractVariables.clear();
Eric Christopher8afd7b62012-12-10 19:51:18 +00001072
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001073 // Reset these for the next Module if we have one.
Craig Topper353eda42014-04-24 06:44:33 +00001074 FirstCU = nullptr;
Bill Wendling2b128d72009-05-20 23:19:06 +00001075}
1076
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001077// Find abstract variable, if any, associated with Var.
David Blaikiebe7c6772014-06-13 22:29:31 +00001078DbgVariable *DwarfDebug::getExistingAbstractVariable(const DIVariable &DV,
David Blaikie36408e72014-06-04 23:50:52 +00001079 DIVariable &Cleansed) {
Devang Patelbb23a4a2011-08-10 21:50:54 +00001080 LLVMContext &Ctx = DV->getContext();
1081 // More then one inlined variable corresponds to one abstract variable.
David Blaikie36408e72014-06-04 23:50:52 +00001082 // FIXME: This duplication of variables when inlining should probably be
1083 // removed. It's done to allow each DIVariable to describe its location
1084 // because the DebugLoc on the dbg.value/declare isn't accurate. We should
1085 // make it accurate then remove this duplication/cleansing stuff.
1086 Cleansed = cleanseInlinedVariable(DV, Ctx);
1087 auto I = AbstractVariables.find(Cleansed);
David Blaikie825bdd22014-05-21 22:41:17 +00001088 if (I != AbstractVariables.end())
1089 return I->second.get();
David Blaikie36408e72014-06-04 23:50:52 +00001090 return nullptr;
1091}
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001092
David Blaikiee847f132014-06-13 22:35:44 +00001093DbgVariable *DwarfDebug::getExistingAbstractVariable(const DIVariable &DV) {
1094 DIVariable Cleansed;
1095 return getExistingAbstractVariable(DV, Cleansed);
1096}
1097
David Blaikie6f9e8672014-06-13 23:52:55 +00001098void DwarfDebug::createAbstractVariable(const DIVariable &Var,
1099 LexicalScope *Scope) {
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001100 auto AbsDbgVariable = make_unique<DbgVariable>(Var, DIExpression(), this);
David Blaikie825bdd22014-05-21 22:41:17 +00001101 addScopeVariable(Scope, AbsDbgVariable.get());
David Blaikie6f9e8672014-06-13 23:52:55 +00001102 AbstractVariables[Var] = std::move(AbsDbgVariable);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001103}
1104
David Blaikie6f9e8672014-06-13 23:52:55 +00001105void DwarfDebug::ensureAbstractVariableIsCreated(const DIVariable &DV,
1106 const MDNode *ScopeNode) {
David Blaikie36408e72014-06-04 23:50:52 +00001107 DIVariable Cleansed = DV;
David Blaikie6f9e8672014-06-13 23:52:55 +00001108 if (getExistingAbstractVariable(DV, Cleansed))
1109 return;
David Blaikie36408e72014-06-04 23:50:52 +00001110
David Blaikie6f9e8672014-06-13 23:52:55 +00001111 createAbstractVariable(Cleansed, LScopes.getOrCreateAbstractScope(ScopeNode));
David Blaikie36408e72014-06-04 23:50:52 +00001112}
1113
David Blaikie6f9e8672014-06-13 23:52:55 +00001114void
1115DwarfDebug::ensureAbstractVariableIsCreatedIfScoped(const DIVariable &DV,
1116 const MDNode *ScopeNode) {
David Blaikie36408e72014-06-04 23:50:52 +00001117 DIVariable Cleansed = DV;
David Blaikie6f9e8672014-06-13 23:52:55 +00001118 if (getExistingAbstractVariable(DV, Cleansed))
1119 return;
David Blaikie36408e72014-06-04 23:50:52 +00001120
1121 if (LexicalScope *Scope = LScopes.findAbstractScope(ScopeNode))
David Blaikie6f9e8672014-06-13 23:52:55 +00001122 createAbstractVariable(Cleansed, Scope);
David Blaikie36408e72014-06-04 23:50:52 +00001123}
1124
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001125// If Var is a current function argument then add it to CurrentFnArguments list.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001126bool DwarfDebug::addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope) {
Devang Patel7e623022011-08-10 20:55:27 +00001127 if (!LScopes.isCurrentFunctionScope(Scope))
David Blaikieafd2c6b2014-04-22 05:41:06 +00001128 return false;
1129 DIVariable DV = Var->getVariable();
Devang Patel6c622ef2011-03-01 22:58:55 +00001130 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
David Blaikieafd2c6b2014-04-22 05:41:06 +00001131 return false;
Devang Patel6c622ef2011-03-01 22:58:55 +00001132 unsigned ArgNo = DV.getArgNumber();
Eric Christopher6a841382012-11-19 22:42:10 +00001133 if (ArgNo == 0)
David Blaikieafd2c6b2014-04-22 05:41:06 +00001134 return false;
Devang Patel6c622ef2011-03-01 22:58:55 +00001135
David Blaikieafd2c6b2014-04-22 05:41:06 +00001136 size_t Size = CurrentFnArguments.size();
1137 if (Size == 0)
1138 CurrentFnArguments.resize(CurFn->getFunction()->arg_size());
1139 // llvm::Function argument size is not good indicator of how many
1140 // arguments does the function have at source level.
1141 if (ArgNo > Size)
1142 CurrentFnArguments.resize(ArgNo * 2);
David Blaikiebd56fbb2014-08-08 17:12:35 +00001143 assert(!CurrentFnArguments[ArgNo - 1]);
David Blaikieafd2c6b2014-04-22 05:41:06 +00001144 CurrentFnArguments[ArgNo - 1] = Var;
1145 return true;
Devang Patel6c622ef2011-03-01 22:58:55 +00001146}
1147
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001148// Collect variable information from side table maintained by MMI.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001149void DwarfDebug::collectVariableInfoFromMMITable(
Craig Topper71b7b682014-08-21 05:55:13 +00001150 SmallPtrSetImpl<const MDNode *> &Processed) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00001151 for (const auto &VI : MMI->getVariableDbgInfo()) {
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001152 if (!VI.Var)
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001153 continue;
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001154 Processed.insert(VI.Var);
1155 DIVariable DV(VI.Var);
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001156 DIExpression Expr(VI.Expr);
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001157 LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001158
Devang Patelcdb7d442009-11-10 23:20:04 +00001159 // If variable scope is not found then skip this variable.
Craig Topper353eda42014-04-24 06:44:33 +00001160 if (!Scope)
Devang Patelcdb7d442009-11-10 23:20:04 +00001161 continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001162
David Blaikie6f9e8672014-06-13 23:52:55 +00001163 ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode());
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001164 ConcreteVariables.push_back(make_unique<DbgVariable>(DV, Expr, this));
David Blaikieeb1a2722014-06-13 22:18:23 +00001165 DbgVariable *RegVar = ConcreteVariables.back().get();
David Blaikieafd2c6b2014-04-22 05:41:06 +00001166 RegVar->setFrameIndex(VI.Slot);
David Blaikie087e7202014-06-05 01:04:20 +00001167 addScopeVariable(Scope, RegVar);
Devang Patel475d32a2009-10-06 01:26:37 +00001168 }
Devang Patel490c8ab2010-05-20 19:57:06 +00001169}
Devang Patela3e9c9c2010-03-15 18:33:46 +00001170
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001171// Get .debug_loc entry for the instruction range starting at MI.
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001172static DebugLocEntry::Value getDebugLocValue(const MachineInstr *MI) {
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001173 const MDNode *Expr = MI->getDebugExpression();
Adrian Prantl7f487772014-04-10 17:39:48 +00001174 const MDNode *Var = MI->getDebugVariable();
Devang Patel2442a892011-07-08 17:09:57 +00001175
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001176 assert(MI->getNumOperands() == 4);
Adrian Prantl418d1d12013-07-09 20:28:37 +00001177 if (MI->getOperand(0).isReg()) {
Devang Patel2442a892011-07-08 17:09:57 +00001178 MachineLocation MLoc;
Adrian Prantl418d1d12013-07-09 20:28:37 +00001179 // If the second operand is an immediate, this is a
1180 // register-indirect address.
1181 if (!MI->getOperand(1).isImm())
Adrian Prantld4c0dd42013-04-26 21:57:17 +00001182 MLoc.set(MI->getOperand(0).getReg());
1183 else
1184 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001185 return DebugLocEntry::Value(Var, Expr, MLoc);
Devang Patel2442a892011-07-08 17:09:57 +00001186 }
1187 if (MI->getOperand(0).isImm())
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001188 return DebugLocEntry::Value(Var, Expr, MI->getOperand(0).getImm());
Devang Patel2442a892011-07-08 17:09:57 +00001189 if (MI->getOperand(0).isFPImm())
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001190 return DebugLocEntry::Value(Var, Expr, MI->getOperand(0).getFPImm());
Devang Patel2442a892011-07-08 17:09:57 +00001191 if (MI->getOperand(0).isCImm())
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001192 return DebugLocEntry::Value(Var, Expr, MI->getOperand(0).getCImm());
Devang Patel2442a892011-07-08 17:09:57 +00001193
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001194 llvm_unreachable("Unexpected 4-operand DBG_VALUE instruction!");
Devang Patel2442a892011-07-08 17:09:57 +00001195}
1196
Adrian Prantlb1416832014-08-01 22:11:58 +00001197/// Determine whether two variable pieces overlap.
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001198static bool piecesOverlap(DIExpression P1, DIExpression P2) {
Adrian Prantlb1416832014-08-01 22:11:58 +00001199 if (!P1.isVariablePiece() || !P2.isVariablePiece())
1200 return true;
1201 unsigned l1 = P1.getPieceOffset();
1202 unsigned l2 = P2.getPieceOffset();
1203 unsigned r1 = l1 + P1.getPieceSize();
1204 unsigned r2 = l2 + P2.getPieceSize();
1205 // True where [l1,r1[ and [r1,r2[ overlap.
1206 return (l1 < r2) && (l2 < r1);
1207}
1208
1209/// Build the location list for all DBG_VALUEs in the function that
1210/// describe the same variable. If the ranges of several independent
1211/// pieces of the same variable overlap partially, split them up and
1212/// combine the ranges. The resulting DebugLocEntries are will have
1213/// strict monotonically increasing begin addresses and will never
1214/// overlap.
1215//
1216// Input:
1217//
1218// Ranges History [var, loc, piece ofs size]
1219// 0 | [x, (reg0, piece 0, 32)]
1220// 1 | | [x, (reg1, piece 32, 32)] <- IsPieceOfPrevEntry
1221// 2 | | ...
1222// 3 | [clobber reg0]
1223// 4 [x, (mem, piece 0, 64)] <- overlapping with both previous pieces of x.
1224//
1225// Output:
1226//
1227// [0-1] [x, (reg0, piece 0, 32)]
1228// [1-3] [x, (reg0, piece 0, 32), (reg1, piece 32, 32)]
1229// [3-4] [x, (reg1, piece 32, 32)]
1230// [4- ] [x, (mem, piece 0, 64)]
David Blaikiee1a26a62014-08-05 23:14:16 +00001231void
1232DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
1233 const DbgValueHistoryMap::InstrRanges &Ranges) {
Adrian Prantlcaaf0532014-08-11 21:05:57 +00001234 SmallVector<DebugLocEntry::Value, 4> OpenRanges;
Adrian Prantlb1416832014-08-01 22:11:58 +00001235
1236 for (auto I = Ranges.begin(), E = Ranges.end(); I != E; ++I) {
1237 const MachineInstr *Begin = I->first;
1238 const MachineInstr *End = I->second;
1239 assert(Begin->isDebugValue() && "Invalid History entry");
1240
1241 // Check if a variable is inaccessible in this range.
Adrian Prantl5e1fa852014-08-12 21:55:58 +00001242 if (Begin->getNumOperands() > 1 &&
1243 Begin->getOperand(0).isReg() && !Begin->getOperand(0).getReg()) {
Adrian Prantlb1416832014-08-01 22:11:58 +00001244 OpenRanges.clear();
1245 continue;
1246 }
1247
1248 // If this piece overlaps with any open ranges, truncate them.
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001249 DIExpression DIExpr = Begin->getDebugExpression();
Adrian Prantlcaaf0532014-08-11 21:05:57 +00001250 auto Last = std::remove_if(OpenRanges.begin(), OpenRanges.end(),
Adrian Prantl76502d82014-08-11 23:22:59 +00001251 [&](DebugLocEntry::Value R) {
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001252 return piecesOverlap(DIExpr, R.getExpression());
1253 });
Adrian Prantlb1416832014-08-01 22:11:58 +00001254 OpenRanges.erase(Last, OpenRanges.end());
1255
1256 const MCSymbol *StartLabel = getLabelBeforeInsn(Begin);
1257 assert(StartLabel && "Forgot label before DBG_VALUE starting a range!");
1258
1259 const MCSymbol *EndLabel;
1260 if (End != nullptr)
1261 EndLabel = getLabelAfterInsn(End);
1262 else if (std::next(I) == Ranges.end())
1263 EndLabel = FunctionEndSym;
1264 else
1265 EndLabel = getLabelBeforeInsn(std::next(I)->first);
1266 assert(EndLabel && "Forgot label after instruction ending a range!");
1267
1268 DEBUG(dbgs() << "DotDebugLoc: " << *Begin << "\n");
1269
1270 auto Value = getDebugLocValue(Begin);
David Blaikiee1a26a62014-08-05 23:14:16 +00001271 DebugLocEntry Loc(StartLabel, EndLabel, Value);
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001272 bool couldMerge = false;
1273
1274 // If this is a piece, it may belong to the current DebugLocEntry.
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001275 if (DIExpr.isVariablePiece()) {
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001276 // Add this value to the list of open ranges.
Adrian Prantlcaaf0532014-08-11 21:05:57 +00001277 OpenRanges.push_back(Value);
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001278
1279 // Attempt to add the piece to the last entry.
1280 if (!DebugLoc.empty())
1281 if (DebugLoc.back().MergeValues(Loc))
1282 couldMerge = true;
1283 }
1284
1285 if (!couldMerge) {
1286 // Need to add a new DebugLocEntry. Add all values from still
1287 // valid non-overlapping pieces.
Adrian Prantl1c6f2ec2014-08-11 21:06:00 +00001288 if (OpenRanges.size())
1289 Loc.addValues(OpenRanges);
1290
Adrian Prantlb1416832014-08-01 22:11:58 +00001291 DebugLoc.push_back(std::move(Loc));
1292 }
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001293
1294 // Attempt to coalesce the ranges of two otherwise identical
1295 // DebugLocEntries.
1296 auto CurEntry = DebugLoc.rbegin();
1297 auto PrevEntry = std::next(CurEntry);
1298 if (PrevEntry != DebugLoc.rend() && PrevEntry->MergeRanges(*CurEntry))
1299 DebugLoc.pop_back();
Adrian Prantlb1416832014-08-01 22:11:58 +00001300
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001301 DEBUG({
1302 dbgs() << CurEntry->getValues().size() << " Values:\n";
1303 for (auto Value : CurEntry->getValues()) {
1304 Value.getVariable()->dump();
1305 Value.getExpression()->dump();
1306 }
1307 dbgs() << "-----\n";
1308 });
Adrian Prantlb1416832014-08-01 22:11:58 +00001309 }
1310}
1311
1312
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001313// Find variables for each lexical scope.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001314void
Craig Topper71b7b682014-08-21 05:55:13 +00001315DwarfDebug::collectVariableInfo(SmallPtrSetImpl<const MDNode *> &Processed) {
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001316 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1317 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001318
Eric Christopher270a12c2013-07-03 21:37:03 +00001319 // Grab the variable info that was squirreled away in the MMI side-table.
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001320 collectVariableInfoFromMMITable(Processed);
Devang Patel490c8ab2010-05-20 19:57:06 +00001321
Alexey Samsonov0436caa2014-04-30 23:02:40 +00001322 for (const auto &I : DbgValues) {
1323 DIVariable DV(I.first);
1324 if (Processed.count(DV))
Devang Patel490c8ab2010-05-20 19:57:06 +00001325 continue;
1326
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001327 // Instruction ranges, specifying where DV is accessible.
1328 const auto &Ranges = I.second;
1329 if (Ranges.empty())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001330 continue;
Devang Patel9fc11702010-05-25 23:40:22 +00001331
Craig Topper353eda42014-04-24 06:44:33 +00001332 LexicalScope *Scope = nullptr;
David Blaikie09fdfab2014-08-07 22:22:49 +00001333 if (MDNode *IA = DV.getInlinedAt()) {
David Blaikie9b8c8cd2014-05-14 01:08:28 +00001334 DebugLoc DL = DebugLoc::getFromDILocation(IA);
1335 Scope = LScopes.findInlinedScope(DebugLoc::get(
1336 DL.getLine(), DL.getCol(), DV.getContext(), IA));
1337 } else
1338 Scope = LScopes.findLexicalScope(DV.getContext());
Devang Patel490c8ab2010-05-20 19:57:06 +00001339 // If variable scope is not found then skip this variable.
Devang Patelfbd6c452010-05-21 00:10:20 +00001340 if (!Scope)
Devang Patel490c8ab2010-05-20 19:57:06 +00001341 continue;
1342
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001343 Processed.insert(DV);
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001344 const MachineInstr *MInsn = Ranges.front().first;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001345 assert(MInsn->isDebugValue() && "History must begin with debug value");
David Blaikie6f9e8672014-06-13 23:52:55 +00001346 ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode());
1347 ConcreteVariables.push_back(make_unique<DbgVariable>(MInsn, this));
David Blaikieeb1a2722014-06-13 22:18:23 +00001348 DbgVariable *RegVar = ConcreteVariables.back().get();
David Blaikie087e7202014-06-05 01:04:20 +00001349 addScopeVariable(Scope, RegVar);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001350
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001351 // Check if the first DBG_VALUE is valid for the rest of the function.
Adrian Prantlc1197542014-05-30 21:10:13 +00001352 if (Ranges.size() == 1 && Ranges.front().second == nullptr)
Devang Patel9fc11702010-05-25 23:40:22 +00001353 continue;
Devang Patel9fc11702010-05-25 23:40:22 +00001354
Eric Christopher59cc0712013-01-28 17:33:26 +00001355 // Handle multiple DBG_VALUE instructions describing one variable.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001356 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001357
David Blaikie0a456de2014-04-02 01:43:18 +00001358 DotDebugLocEntries.resize(DotDebugLocEntries.size() + 1);
1359 DebugLocList &LocList = DotDebugLocEntries.back();
David Blaikiee1a26a62014-08-05 23:14:16 +00001360 LocList.CU = TheCU;
David Blaikie0a456de2014-04-02 01:43:18 +00001361 LocList.Label =
1362 Asm->GetTempSymbol("debug_loc", DotDebugLocEntries.size() - 1);
Jakob Stoklund Olesen9c057ee2011-03-22 00:21:41 +00001363
Adrian Prantlb1416832014-08-01 22:11:58 +00001364 // Build the location list for this variable.
David Blaikiee1a26a62014-08-05 23:14:16 +00001365 buildLocationList(LocList.List, Ranges);
Devang Patela3e9c9c2010-03-15 18:33:46 +00001366 }
Devang Patele0a94bf2010-05-14 21:01:35 +00001367
1368 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001369 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1370 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1371 DIVariable DV(Variables.getElement(i));
David Blaikie9ba72542014-05-14 21:52:46 +00001372 assert(DV.isVariable());
1373 if (!Processed.insert(DV))
Devang Patel59e27c52011-08-19 23:28:12 +00001374 continue;
David Blaikiebb6a4e22014-06-05 00:51:35 +00001375 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext())) {
David Blaikie6f9e8672014-06-13 23:52:55 +00001376 ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode());
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001377 DIExpression NoExpr;
1378 ConcreteVariables.push_back(make_unique<DbgVariable>(DV, NoExpr, this));
David Blaikieeb1a2722014-06-13 22:18:23 +00001379 addScopeVariable(Scope, ConcreteVariables.back().get());
David Blaikiebb6a4e22014-06-05 00:51:35 +00001380 }
Devang Patele0a94bf2010-05-14 21:01:35 +00001381 }
Devang Patel9fc11702010-05-25 23:40:22 +00001382}
Devang Patele0a94bf2010-05-14 21:01:35 +00001383
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001384// Return Label preceding the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001385MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001386 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1387 assert(Label && "Didn't insert label before instruction");
1388 return Label;
Devang Patel9fc11702010-05-25 23:40:22 +00001389}
1390
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001391// Return Label immediately following the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001392MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001393 return LabelsAfterInsn.lookup(MI);
Devang Patel475d32a2009-10-06 01:26:37 +00001394}
1395
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001396// Process beginning of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001397void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Craig Toppere73658d2014-04-28 04:05:08 +00001398 assert(CurMI == nullptr);
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001399 CurMI = MI;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001400 // Check if source location changes, but ignore DBG_VALUE locations.
1401 if (!MI->isDebugValue()) {
1402 DebugLoc DL = MI->getDebugLoc();
1403 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopheraec8a822012-04-05 20:39:05 +00001404 unsigned Flags = 0;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001405 PrevInstLoc = DL;
Devang Patel34a66202011-05-11 19:22:19 +00001406 if (DL == PrologEndLoc) {
1407 Flags |= DWARF2_FLAG_PROLOGUE_END;
1408 PrologEndLoc = DebugLoc();
1409 }
Eric Christopheraec8a822012-04-05 20:39:05 +00001410 if (PrologEndLoc.isUnknown())
1411 Flags |= DWARF2_FLAG_IS_STMT;
1412
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001413 if (!DL.isUnknown()) {
1414 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel34a66202011-05-11 19:22:19 +00001415 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001416 } else
Craig Topper353eda42014-04-24 06:44:33 +00001417 recordSourceLine(0, 0, nullptr, 0);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001418 }
Devang Patel9fc11702010-05-25 23:40:22 +00001419 }
Devang Patel23b2ae62010-03-29 22:59:58 +00001420
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001421 // Insert labels where requested.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001422 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
1423 LabelsBeforeInsn.find(MI);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001424
1425 // No label needed.
1426 if (I == LabelsBeforeInsn.end())
1427 return;
1428
1429 // Label already assigned.
1430 if (I->second)
Devang Patel002d54d2010-05-26 19:37:24 +00001431 return;
Devang Patelbd477be2010-03-29 17:20:31 +00001432
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001433 if (!PrevLabel) {
Devang Patelacc32a52010-05-26 21:23:46 +00001434 PrevLabel = MMI->getContext().CreateTempSymbol();
1435 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel002d54d2010-05-26 19:37:24 +00001436 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001437 I->second = PrevLabel;
Devang Patel8db360d2009-10-06 01:50:42 +00001438}
1439
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001440// Process end of an instruction.
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001441void DwarfDebug::endInstruction() {
Craig Toppere73658d2014-04-28 04:05:08 +00001442 assert(CurMI != nullptr);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001443 // Don't create a new label after DBG_VALUE instructions.
1444 // They don't generate code.
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001445 if (!CurMI->isDebugValue())
Craig Topper353eda42014-04-24 06:44:33 +00001446 PrevLabel = nullptr;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001447
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001448 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001449 LabelsAfterInsn.find(CurMI);
Craig Topper353eda42014-04-24 06:44:33 +00001450 CurMI = nullptr;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001451
1452 // No label needed.
1453 if (I == LabelsAfterInsn.end())
1454 return;
1455
1456 // Label already assigned.
1457 if (I->second)
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001458 return;
1459
1460 // We need a label after this instruction.
1461 if (!PrevLabel) {
1462 PrevLabel = MMI->getContext().CreateTempSymbol();
1463 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel3ebd8932010-04-08 16:50:29 +00001464 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001465 I->second = PrevLabel;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001466}
1467
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001468// Each LexicalScope has first instruction and last instruction to mark
1469// beginning and end of a scope respectively. Create an inverse map that list
1470// scopes starts (and ends) with an instruction. One instruction may start (or
1471// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patel359b0132010-04-08 18:43:56 +00001472void DwarfDebug::identifyScopeMarkers() {
Devang Patel7e623022011-08-10 20:55:27 +00001473 SmallVector<LexicalScope *, 4> WorkList;
1474 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel7771b7c2010-01-20 02:05:23 +00001475 while (!WorkList.empty()) {
Devang Patel7e623022011-08-10 20:55:27 +00001476 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001477
Craig Topper977e9cd2013-07-03 04:24:43 +00001478 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001479 if (!Children.empty())
Benjamin Kramer15596c72014-03-07 19:09:39 +00001480 WorkList.append(Children.begin(), Children.end());
Devang Patel7771b7c2010-01-20 02:05:23 +00001481
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001482 if (S->isAbstractScope())
1483 continue;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001484
Benjamin Kramer15596c72014-03-07 19:09:39 +00001485 for (const InsnRange &R : S->getRanges()) {
1486 assert(R.first && "InsnRange does not have first instruction!");
1487 assert(R.second && "InsnRange does not have second instruction!");
1488 requestLabelBeforeInsn(R.first);
1489 requestLabelAfterInsn(R.second);
Devang Patel6c74a872010-04-27 19:46:33 +00001490 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001491 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001492}
1493
Alexey Samsonov8a86d6d2014-05-27 22:47:41 +00001494static DebugLoc findPrologueEndLoc(const MachineFunction *MF) {
1495 // First known non-DBG_VALUE and non-frame setup location marks
1496 // the beginning of the function body.
1497 for (const auto &MBB : *MF)
1498 for (const auto &MI : MBB)
1499 if (!MI.isDebugValue() && !MI.getFlag(MachineInstr::FrameSetup) &&
1500 !MI.getDebugLoc().isUnknown())
1501 return MI.getDebugLoc();
1502 return DebugLoc();
1503}
1504
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001505// Gather pre-function debug information. Assumes being called immediately
1506// after the function entry point has been emitted.
Chris Lattner76555b52010-01-26 23:18:02 +00001507void DwarfDebug::beginFunction(const MachineFunction *MF) {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001508 CurFn = MF;
Eric Christopherfedfa442013-11-01 23:14:17 +00001509
1510 // If there's no debug info for the function we're not going to do anything.
1511 if (!MMI->hasDebugInfo())
1512 return;
1513
David Blaikie2f040112014-07-25 16:10:16 +00001514 auto DI = FunctionDIs.find(MF->getFunction());
1515 if (DI == FunctionDIs.end())
1516 return;
1517
Eric Christopherfedfa442013-11-01 23:14:17 +00001518 // Grab the lexical scopes for the function, if we don't have any of those
1519 // then we're not going to be able to do anything.
Devang Patel7e623022011-08-10 20:55:27 +00001520 LScopes.initialize(*MF);
Eric Christopher384f3fe2014-03-20 19:16:16 +00001521 if (LScopes.empty())
Eric Christopherfedfa442013-11-01 23:14:17 +00001522 return;
1523
Alexey Samsonov0436caa2014-04-30 23:02:40 +00001524 assert(DbgValues.empty() && "DbgValues map wasn't cleaned!");
Eric Christopherfedfa442013-11-01 23:14:17 +00001525
1526 // Make sure that each lexical scope will have a begin/end label.
Devang Patel7e623022011-08-10 20:55:27 +00001527 identifyScopeMarkers();
Devang Patel4598eb62009-10-06 18:37:31 +00001528
Eric Christopher4287a492013-12-09 23:57:44 +00001529 // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function
Eric Christopherfedfa442013-11-01 23:14:17 +00001530 // belongs to so that we add to the correct per-cu line table in the
1531 // non-asm case.
Manman Ren4e042a62013-02-05 21:52:47 +00001532 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
David Blaikie2f040112014-07-25 16:10:16 +00001533 // FnScope->getScopeNode() and DI->second should represent the same function,
1534 // though they may not be the same MDNode due to inline functions merged in
1535 // LTO where the debug info metadata still differs (either due to distinct
1536 // written differences - two versions of a linkonce_odr function
1537 // written/copied into two separate files, or some sub-optimal metadata that
1538 // isn't structurally identical (see: file path/name info from clang, which
1539 // includes the directory of the cpp file being built, even when the file name
1540 // is absolute (such as an <> lookup header)))
Eric Christopher4287a492013-12-09 23:57:44 +00001541 DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Manman Ren4e042a62013-02-05 21:52:47 +00001542 assert(TheCU && "Unable to find compile unit!");
Rafael Espindolab4eec1d2014-02-05 18:00:21 +00001543 if (Asm->OutStreamer.hasRawTextSupport())
1544 // Use a single line table if we are generating assembly.
Manman Ren9d4c7352013-05-21 00:57:22 +00001545 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1546 else
1547 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
Manman Ren4e042a62013-02-05 21:52:47 +00001548
Eric Christopherfedfa442013-11-01 23:14:17 +00001549 // Emit a label for the function so that we have a beginning address.
1550 FunctionBeginSym = Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber());
Bill Wendling2b128d72009-05-20 23:19:06 +00001551 // Assumes in correct section after the entry point.
Devang Patel6c74a872010-04-27 19:46:33 +00001552 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendling2b128d72009-05-20 23:19:06 +00001553
Alexey Samsonov414b6fb2014-04-30 21:34:11 +00001554 // Calculate history for local variables.
Eric Christopherd9134482014-08-04 21:25:23 +00001555 calculateDbgValueHistory(MF, Asm->TM.getSubtargetImpl()->getRegisterInfo(),
1556 DbgValues);
Alexey Samsonov414b6fb2014-04-30 21:34:11 +00001557
1558 // Request labels for the full history.
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001559 for (const auto &I : DbgValues) {
1560 const auto &Ranges = I.second;
1561 if (Ranges.empty())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001562 continue;
1563
Alexey Samsonov414b6fb2014-04-30 21:34:11 +00001564 // The first mention of a function argument gets the FunctionBeginSym
1565 // label, so arguments are visible when breaking at function entry.
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001566 DIVariable DIVar(Ranges.front().first->getDebugVariable());
1567 if (DIVar.isVariable() && DIVar.getTag() == dwarf::DW_TAG_arg_variable &&
1568 getDISubprogram(DIVar.getContext()).describes(MF->getFunction())) {
1569 LabelsBeforeInsn[Ranges.front().first] = FunctionBeginSym;
1570 if (Ranges.front().first->getDebugExpression().isVariablePiece()) {
Adrian Prantlb1416832014-08-01 22:11:58 +00001571 // Mark all non-overlapping initial pieces.
1572 for (auto I = Ranges.begin(); I != Ranges.end(); ++I) {
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001573 DIExpression Piece = I->first->getDebugExpression();
Adrian Prantlb1416832014-08-01 22:11:58 +00001574 if (std::all_of(Ranges.begin(), I,
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001575 [&](DbgValueHistoryMap::InstrRange Pred) {
1576 return !piecesOverlap(Piece, Pred.first->getDebugExpression());
Adrian Prantlb1416832014-08-01 22:11:58 +00001577 }))
1578 LabelsBeforeInsn[I->first] = FunctionBeginSym;
1579 else
1580 break;
1581 }
1582 }
1583 }
Alexey Samsonov414b6fb2014-04-30 21:34:11 +00001584
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001585 for (const auto &Range : Ranges) {
1586 requestLabelBeforeInsn(Range.first);
1587 if (Range.second)
1588 requestLabelAfterInsn(Range.second);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001589 }
1590 }
Devang Patel002d54d2010-05-26 19:37:24 +00001591
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001592 PrevInstLoc = DebugLoc();
Devang Patel002d54d2010-05-26 19:37:24 +00001593 PrevLabel = FunctionBeginSym;
Devang Patel34a66202011-05-11 19:22:19 +00001594
1595 // Record beginning of function.
Alexey Samsonov8a86d6d2014-05-27 22:47:41 +00001596 PrologEndLoc = findPrologueEndLoc(MF);
Devang Patel34a66202011-05-11 19:22:19 +00001597 if (!PrologEndLoc.isUnknown()) {
Eric Christopherfedfa442013-11-01 23:14:17 +00001598 DebugLoc FnStartDL =
Timur Iskhodzhanovf166f6c2014-01-30 01:39:17 +00001599 PrologEndLoc.getFnDebugLoc(MF->getFunction()->getContext());
Eric Christopherfedfa442013-11-01 23:14:17 +00001600 recordSourceLine(
1601 FnStartDL.getLine(), FnStartDL.getCol(),
1602 FnStartDL.getScope(MF->getFunction()->getContext()),
1603 // We'd like to list the prologue as "not statements" but GDB behaves
1604 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
1605 DWARF2_FLAG_IS_STMT);
Devang Patel34a66202011-05-11 19:22:19 +00001606 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001607}
1608
David Blaikieafd2c6b2014-04-22 05:41:06 +00001609void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
David Blaikie087e7202014-06-05 01:04:20 +00001610 if (addCurrentFnArgument(Var, LS))
1611 return;
David Blaikieafd2c6b2014-04-22 05:41:06 +00001612 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1613 DIVariable DV = Var->getVariable();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001614 // Variables with positive arg numbers are parameters.
1615 if (unsigned ArgNum = DV.getArgNumber()) {
1616 // Keep all parameters in order at the start of the variable list to ensure
1617 // function types are correct (no out-of-order parameters)
1618 //
1619 // This could be improved by only doing it for optimized builds (unoptimized
1620 // builds have the right order to begin with), searching from the back (this
1621 // would catch the unoptimized case quickly), or doing a binary search
1622 // rather than linear search.
David Blaikieafd2c6b2014-04-22 05:41:06 +00001623 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001624 while (I != Vars.end()) {
David Blaikieafd2c6b2014-04-22 05:41:06 +00001625 unsigned CurNum = (*I)->getVariable().getArgNumber();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001626 // A local (non-parameter) variable has been found, insert immediately
1627 // before it.
1628 if (CurNum == 0)
1629 break;
1630 // A later indexed parameter has been found, insert immediately before it.
David Blaikieb272a752013-06-06 22:28:26 +00001631 if (CurNum > ArgNum)
David Blaikie36d5d2f2013-06-06 21:04:51 +00001632 break;
David Blaikieb272a752013-06-06 22:28:26 +00001633 ++I;
David Blaikie6f1a8062013-06-05 05:39:59 +00001634 }
David Blaikieafd2c6b2014-04-22 05:41:06 +00001635 Vars.insert(I, Var);
1636 return;
David Blaikie6f1a8062013-06-05 05:39:59 +00001637 }
1638
David Blaikieafd2c6b2014-04-22 05:41:06 +00001639 Vars.push_back(Var);
Devang Patel7e623022011-08-10 20:55:27 +00001640}
1641
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001642// Gather and emit post-function debug information.
NAKAMURA Takumib9271612013-12-03 13:15:54 +00001643void DwarfDebug::endFunction(const MachineFunction *MF) {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001644 // Every beginFunction(MF) call should be followed by an endFunction(MF) call,
1645 // though the beginFunction may not be called at all.
1646 // We should handle both cases.
Craig Topper353eda42014-04-24 06:44:33 +00001647 if (!CurFn)
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001648 CurFn = MF;
1649 else
1650 assert(CurFn == MF);
Craig Toppere73658d2014-04-28 04:05:08 +00001651 assert(CurFn != nullptr);
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001652
David Blaikie2f040112014-07-25 16:10:16 +00001653 if (!MMI->hasDebugInfo() || LScopes.empty() ||
1654 !FunctionDIs.count(MF->getFunction())) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00001655 // If we don't have a lexical scope for this function then there will
1656 // be a hole in the range information. Keep note of this by setting the
1657 // previously used section to nullptr.
Eric Christopher384f3fe2014-03-20 19:16:16 +00001658 PrevCU = nullptr;
Craig Topper353eda42014-04-24 06:44:33 +00001659 CurFn = nullptr;
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001660 return;
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001661 }
Devang Patel2904aa92009-11-12 19:02:56 +00001662
Devang Patel7e623022011-08-10 20:55:27 +00001663 // Define end label for subprogram.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001664 FunctionEndSym = Asm->GetTempSymbol("func_end", Asm->getFunctionNumber());
Devang Patel7e623022011-08-10 20:55:27 +00001665 // Assumes in correct section after the entry point.
1666 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Eric Christopher1a972152014-01-29 23:05:43 +00001667
Eric Christopher4287a492013-12-09 23:57:44 +00001668 // Set DwarfDwarfCompileUnitID in MCContext to default value.
Manman Ren4e042a62013-02-05 21:52:47 +00001669 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher6a841382012-11-19 22:42:10 +00001670
Devang Patel7e623022011-08-10 20:55:27 +00001671 SmallPtrSet<const MDNode *, 16> ProcessedVars;
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001672 collectVariableInfo(ProcessedVars);
Eric Christopher6a841382012-11-19 22:42:10 +00001673
Devang Patel3acc70e2011-08-15 22:04:40 +00001674 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
David Blaikief9b6a552014-04-22 22:39:41 +00001675 DwarfCompileUnit &TheCU = *SPMap.lookup(FnScope->getScopeNode());
Devang Patel3acc70e2011-08-15 22:04:40 +00001676
David Blaikie3a7ce252014-09-19 17:03:16 +00001677 // Add the range of this function to the list of ranges for the CU.
1678 TheCU.addRange(RangeSpan(FunctionBeginSym, FunctionEndSym));
1679
1680 // Under -gmlt, skip building the subprogram if there are no inlined
1681 // subroutines inside it.
1682 if (TheCU.getCUNode().getEmissionKind() == DIBuilder::LineTablesOnly &&
David Blaikiee1c79742014-09-30 21:28:32 +00001683 LScopes.getAbstractScopesList().empty() && !IsDarwin) {
David Blaikie3a7ce252014-09-19 17:03:16 +00001684 assert(ScopeVariables.empty());
1685 assert(CurrentFnArguments.empty());
1686 assert(DbgValues.empty());
1687 assert(AbstractVariables.empty());
1688 LabelsBeforeInsn.clear();
1689 LabelsAfterInsn.clear();
1690 PrevLabel = nullptr;
1691 CurFn = nullptr;
1692 return;
1693 }
1694
Devang Patel7e623022011-08-10 20:55:27 +00001695 // Construct abstract scopes.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001696 for (LexicalScope *AScope : LScopes.getAbstractScopesList()) {
Devang Patel44403472011-08-12 18:10:19 +00001697 DISubprogram SP(AScope->getScopeNode());
David Blaikiedb5371b2014-07-18 22:26:59 +00001698 assert(SP.isSubprogram());
David Blaikie4abe19e2014-05-12 18:23:35 +00001699 // Collect info for variables that were optimized out.
1700 DIArray Variables = SP.getVariables();
1701 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1702 DIVariable DV(Variables.getElement(i));
1703 assert(DV && DV.isVariable());
1704 if (!ProcessedVars.insert(DV))
1705 continue;
David Blaikie6f9e8672014-06-13 23:52:55 +00001706 ensureAbstractVariableIsCreated(DV, DV.getContext());
Devang Patel5c0f85c2010-06-25 22:07:34 +00001707 }
David Blaikie4abe19e2014-05-12 18:23:35 +00001708 constructAbstractSubprogramScopeDIE(TheCU, AScope);
Bill Wendling2b128d72009-05-20 23:19:06 +00001709 }
Eric Christopher6a841382012-11-19 22:42:10 +00001710
David Blaikie1cae8492014-09-30 22:32:49 +00001711 constructSubprogramScopeDIE(TheCU, FnScope);
Devang Patel3acc70e2011-08-15 22:04:40 +00001712
Bill Wendling2b128d72009-05-20 23:19:06 +00001713 // Clear debug info
David Blaikie825bdd22014-05-21 22:41:17 +00001714 // Ownership of DbgVariables is a bit subtle - ScopeVariables owns all the
1715 // DbgVariables except those that are also in AbstractVariables (since they
1716 // can be used cross-function)
Devang Patel7e623022011-08-10 20:55:27 +00001717 ScopeVariables.clear();
David Blaikieeb1a2722014-06-13 22:18:23 +00001718 CurrentFnArguments.clear();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001719 DbgValues.clear();
Devang Patel6c74a872010-04-27 19:46:33 +00001720 LabelsBeforeInsn.clear();
1721 LabelsAfterInsn.clear();
Craig Topper353eda42014-04-24 06:44:33 +00001722 PrevLabel = nullptr;
1723 CurFn = nullptr;
Bill Wendling2b128d72009-05-20 23:19:06 +00001724}
1725
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001726// Register a source line with debug info. Returns the unique label that was
1727// emitted and which provides correspondence to the source line list.
Devang Patel34a66202011-05-11 19:22:19 +00001728void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1729 unsigned Flags) {
Devang Patel2d9caf92009-11-25 17:36:49 +00001730 StringRef Fn;
Devang Patele01b75c2011-03-24 20:30:50 +00001731 StringRef Dir;
Dan Gohman50849c62010-05-05 23:41:32 +00001732 unsigned Src = 1;
Diego Novillo282450d2014-03-03 18:53:17 +00001733 unsigned Discriminator = 0;
David Blaikie4c6d9872014-05-15 20:18:50 +00001734 if (DIScope Scope = DIScope(S)) {
1735 assert(Scope.isScope());
1736 Fn = Scope.getFilename();
1737 Dir = Scope.getDirectory();
David Blaikie2f3f76f2014-08-21 22:45:21 +00001738 if (Scope.isLexicalBlockFile())
1739 Discriminator = DILexicalBlockFile(S).getDiscriminator();
Dan Gohman50849c62010-05-05 23:41:32 +00001740
David Blaikie0e8d4012014-03-17 23:53:25 +00001741 unsigned CUID = Asm->OutStreamer.getContext().getDwarfCompileUnitID();
David Blaikiec33b3cd2014-04-22 21:27:37 +00001742 Src = static_cast<DwarfCompileUnit &>(*InfoHolder.getUnits()[CUID])
1743 .getOrCreateSourceID(Fn, Dir);
Dan Gohman50849c62010-05-05 23:41:32 +00001744 }
Diego Novillo282450d2014-03-03 18:53:17 +00001745 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0,
1746 Discriminator, Fn);
Bill Wendling2b128d72009-05-20 23:19:06 +00001747}
1748
Bill Wendling806535f2009-05-20 23:22:40 +00001749//===----------------------------------------------------------------------===//
1750// Emit Methods
1751//===----------------------------------------------------------------------===//
1752
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001753// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001754void DwarfDebug::emitSectionLabels() {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001755 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00001756
Bill Wendling480ff322009-05-20 23:21:38 +00001757 // Dwarf sections base addresses.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001758 DwarfInfoSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001759 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
David Blaikie29459ae2014-07-25 17:11:58 +00001760 if (useSplitDwarf()) {
Eric Christopherd8667202013-12-30 17:22:27 +00001761 DwarfInfoDWOSectionSym =
1762 emitSectionSym(Asm, TLOF.getDwarfInfoDWOSection(), "section_info_dwo");
David Blaikie29459ae2014-07-25 17:11:58 +00001763 DwarfTypesDWOSectionSym =
1764 emitSectionSym(Asm, TLOF.getDwarfTypesDWOSection(), "section_types_dwo");
1765 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001766 DwarfAbbrevSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001767 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher3c5a1912012-12-19 22:02:53 +00001768 if (useSplitDwarf())
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001769 DwarfAbbrevDWOSectionSym = emitSectionSym(
1770 Asm, TLOF.getDwarfAbbrevDWOSection(), "section_abbrev_dwo");
David Blaikie20474102014-02-25 22:46:44 +00001771 if (GenerateARangeSection)
1772 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001773
Eric Christopher74804332013-02-07 21:19:50 +00001774 DwarfLineSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001775 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher261d2342013-09-23 20:55:35 +00001776 if (GenerateGnuPubSections) {
Eric Christopher39eebfa2013-09-30 23:14:16 +00001777 DwarfGnuPubNamesSectionSym =
1778 emitSectionSym(Asm, TLOF.getDwarfGnuPubNamesSection());
1779 DwarfGnuPubTypesSectionSym =
1780 emitSectionSym(Asm, TLOF.getDwarfGnuPubTypesSection());
Eric Christopher261d2342013-09-23 20:55:35 +00001781 } else if (HasDwarfPubSections) {
1782 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
1783 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001784 }
Eric Christopherdd1a0122013-09-13 00:35:05 +00001785
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001786 DwarfStrSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001787 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001788 if (useSplitDwarf()) {
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001789 DwarfStrDWOSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001790 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001791 DwarfAddrSectionSym =
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001792 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
David Blaikiee12ab122014-04-01 16:09:49 +00001793 DwarfDebugLocSectionSym =
David Blaikie9c550ac2014-03-25 01:44:02 +00001794 emitSectionSym(Asm, TLOF.getDwarfLocDWOSection(), "skel_loc");
1795 } else
1796 DwarfDebugLocSectionSym =
1797 emitSectionSym(Asm, TLOF.getDwarfLocSection(), "section_debug_loc");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001798 DwarfDebugRangeSectionSym =
1799 emitSectionSym(Asm, TLOF.getDwarfRangesSection(), "debug_range");
Bill Wendling480ff322009-05-20 23:21:38 +00001800}
1801
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001802// Recursively emits a debug information entry.
David Blaikieb8184182014-04-14 22:45:02 +00001803void DwarfDebug::emitDIE(DIE &Die) {
Bill Wendling480ff322009-05-20 23:21:38 +00001804 // Get the abbreviation for this DIE.
David Blaikieb8184182014-04-14 22:45:02 +00001805 const DIEAbbrev &Abbrev = Die.getAbbrev();
Bill Wendling480ff322009-05-20 23:21:38 +00001806
Bill Wendling480ff322009-05-20 23:21:38 +00001807 // Emit the code (index) for the abbreviation.
Chris Lattner7bde8c02010-04-04 18:52:31 +00001808 if (Asm->isVerbose())
David Blaikieff3ab2c2013-12-05 01:01:41 +00001809 Asm->OutStreamer.AddComment("Abbrev [" + Twine(Abbrev.getNumber()) +
David Blaikieb8184182014-04-14 22:45:02 +00001810 "] 0x" + Twine::utohexstr(Die.getOffset()) +
1811 ":0x" + Twine::utohexstr(Die.getSize()) + " " +
David Blaikieff3ab2c2013-12-05 01:01:41 +00001812 dwarf::TagString(Abbrev.getTag()));
1813 Asm->EmitULEB128(Abbrev.getNumber());
Bill Wendling480ff322009-05-20 23:21:38 +00001814
David Blaikieb8184182014-04-14 22:45:02 +00001815 const SmallVectorImpl<DIEValue *> &Values = Die.getValues();
David Blaikieff3ab2c2013-12-05 01:01:41 +00001816 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
Bill Wendling480ff322009-05-20 23:21:38 +00001817
1818 // Emit the DIE attribute values.
1819 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
David Blaikief2443192013-10-21 17:28:37 +00001820 dwarf::Attribute Attr = AbbrevData[i].getAttribute();
1821 dwarf::Form Form = AbbrevData[i].getForm();
Bill Wendling480ff322009-05-20 23:21:38 +00001822 assert(Form && "Too many attributes for DIE (check abbreviation)");
1823
Eric Christopher13a1bb32014-03-06 00:00:49 +00001824 if (Asm->isVerbose()) {
Chris Lattner5adf9872010-01-24 18:54:17 +00001825 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Eric Christopher13a1bb32014-03-06 00:00:49 +00001826 if (Attr == dwarf::DW_AT_accessibility)
1827 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(
1828 cast<DIEInteger>(Values[i])->getValue()));
1829 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001830
Eric Christopherdd508382014-03-06 00:00:56 +00001831 // Emit an attribute using the defined form.
1832 Values[i]->EmitValue(Asm, Form);
Bill Wendling480ff322009-05-20 23:21:38 +00001833 }
1834
1835 // Emit the DIE children if any.
Eric Christophere8f10722014-03-05 01:44:58 +00001836 if (Abbrev.hasChildren()) {
David Blaikieb8184182014-04-14 22:45:02 +00001837 for (auto &Child : Die.getChildren())
1838 emitDIE(*Child);
Bill Wendling480ff322009-05-20 23:21:38 +00001839
David Blaikie155f8812013-12-04 21:51:05 +00001840 Asm->OutStreamer.AddComment("End Of Children Mark");
Chris Lattner566cae92010-03-09 23:52:58 +00001841 Asm->EmitInt8(0);
Bill Wendling480ff322009-05-20 23:21:38 +00001842 }
1843}
1844
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001845// Emit the debug info section.
1846void DwarfDebug::emitDebugInfo() {
Eric Christopherf8194852013-12-05 18:06:10 +00001847 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Eric Christophera2de8262012-12-15 00:04:07 +00001848
David Blaikief72ed5f2014-03-24 20:31:01 +00001849 Holder.emitUnits(this, DwarfAbbrevSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001850}
1851
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001852// Emit the abbreviation section.
Eric Christopher38371952012-11-20 23:30:11 +00001853void DwarfDebug::emitAbbreviations() {
Eric Christopherf8194852013-12-05 18:06:10 +00001854 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
David Blaikie0504cda2013-12-05 07:43:55 +00001855
1856 Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
Eric Christopher3c5a1912012-12-19 22:02:53 +00001857}
Bill Wendling480ff322009-05-20 23:21:38 +00001858
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001859// Emit the last address of the section and the end of the line matrix.
Devang Patel930143b2009-11-21 02:48:08 +00001860void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling480ff322009-05-20 23:21:38 +00001861 // Define last address of section.
Chris Lattner566cae92010-03-09 23:52:58 +00001862 Asm->OutStreamer.AddComment("Extended Op");
1863 Asm->EmitInt8(0);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001864
Chris Lattner566cae92010-03-09 23:52:58 +00001865 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth5da3f052012-11-01 09:14:31 +00001866 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner566cae92010-03-09 23:52:58 +00001867 Asm->OutStreamer.AddComment("DW_LNE_set_address");
1868 Asm->EmitInt8(dwarf::DW_LNE_set_address);
1869
1870 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerb245dfb2010-03-10 01:17:49 +00001871
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001872 Asm->OutStreamer.EmitSymbolValue(
1873 Asm->GetTempSymbol("section_end", SectionEnd),
1874 Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00001875
1876 // Mark end of matrix.
Chris Lattner566cae92010-03-09 23:52:58 +00001877 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1878 Asm->EmitInt8(0);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00001879 Asm->EmitInt8(1);
Chris Lattnerfa823552010-01-22 23:18:42 +00001880 Asm->EmitInt8(1);
Bill Wendling480ff322009-05-20 23:21:38 +00001881}
1882
David Blaikie6741bb02014-09-11 21:12:48 +00001883void DwarfDebug::emitAccel(DwarfAccelTable &Accel, const MCSection *Section,
1884 StringRef TableName, StringRef SymName) {
1885 Accel.FinalizeTable(Asm, TableName);
1886 Asm->OutStreamer.SwitchSection(Section);
1887 auto *SectionBegin = Asm->GetTempSymbol(SymName);
Eric Christopher4996c702011-11-07 09:24:32 +00001888 Asm->OutStreamer.EmitLabel(SectionBegin);
1889
1890 // Emit the full data.
David Blaikie6741bb02014-09-11 21:12:48 +00001891 Accel.Emit(Asm, SectionBegin, &InfoHolder, DwarfStrSectionSym);
1892}
1893
1894// Emit visible names into a hashed accelerator table section.
1895void DwarfDebug::emitAccelNames() {
1896 emitAccel(AccelNames, Asm->getObjFileLowering().getDwarfAccelNamesSection(),
1897 "Names", "names_begin");
Eric Christopher4996c702011-11-07 09:24:32 +00001898}
1899
Eric Christopher48fef592012-12-20 21:58:40 +00001900// Emit objective C classes and categories into a hashed accelerator table
1901// section.
Eric Christopher4996c702011-11-07 09:24:32 +00001902void DwarfDebug::emitAccelObjC() {
David Blaikie6741bb02014-09-11 21:12:48 +00001903 emitAccel(AccelObjC, Asm->getObjFileLowering().getDwarfAccelObjCSection(),
1904 "ObjC", "objc_begin");
Eric Christopher4996c702011-11-07 09:24:32 +00001905}
1906
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001907// Emit namespace dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00001908void DwarfDebug::emitAccelNamespaces() {
David Blaikie6741bb02014-09-11 21:12:48 +00001909 emitAccel(AccelNamespace,
1910 Asm->getObjFileLowering().getDwarfAccelNamespaceSection(),
1911 "namespac", "namespac_begin");
Eric Christopher4996c702011-11-07 09:24:32 +00001912}
1913
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001914// Emit type dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00001915void DwarfDebug::emitAccelTypes() {
David Blaikie6741bb02014-09-11 21:12:48 +00001916 emitAccel(AccelTypes, Asm->getObjFileLowering().getDwarfAccelTypesSection(),
1917 "types", "types_begin");
Eric Christopher4996c702011-11-07 09:24:32 +00001918}
1919
Eric Christopherdd1a0122013-09-13 00:35:05 +00001920// Public name handling.
1921// The format for the various pubnames:
1922//
1923// dwarf pubnames - offset/name pairs where the offset is the offset into the CU
1924// for the DIE that is named.
1925//
1926// gnu pubnames - offset/index value/name tuples where the offset is the offset
1927// into the CU and the index value is computed according to the type of value
1928// for the DIE that is named.
1929//
1930// For type units the offset is the offset of the skeleton DIE. For split dwarf
1931// it's the offset within the debug_info/debug_types dwo section, however, the
1932// reference in the pubname header doesn't change.
1933
1934/// computeIndexValue - Compute the gdb index value for the DIE and CU.
Eric Christophera5a79422013-12-09 23:32:48 +00001935static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU,
Eric Christopher0fe676a2013-11-21 00:48:22 +00001936 const DIE *Die) {
Eric Christopherd2b497b2013-10-16 01:37:49 +00001937 dwarf::GDBIndexEntryLinkage Linkage = dwarf::GIEL_STATIC;
1938
1939 // We could have a specification DIE that has our most of our knowledge,
1940 // look for that now.
1941 DIEValue *SpecVal = Die->findAttribute(dwarf::DW_AT_specification);
1942 if (SpecVal) {
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001943 DIE &SpecDIE = cast<DIEEntry>(SpecVal)->getEntry();
1944 if (SpecDIE.findAttribute(dwarf::DW_AT_external))
Eric Christopherd2b497b2013-10-16 01:37:49 +00001945 Linkage = dwarf::GIEL_EXTERNAL;
1946 } else if (Die->findAttribute(dwarf::DW_AT_external))
1947 Linkage = dwarf::GIEL_EXTERNAL;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001948
1949 switch (Die->getTag()) {
1950 case dwarf::DW_TAG_class_type:
1951 case dwarf::DW_TAG_structure_type:
1952 case dwarf::DW_TAG_union_type:
1953 case dwarf::DW_TAG_enumeration_type:
Eric Christopher261d2342013-09-23 20:55:35 +00001954 return dwarf::PubIndexEntryDescriptor(
1955 dwarf::GIEK_TYPE, CU->getLanguage() != dwarf::DW_LANG_C_plus_plus
1956 ? dwarf::GIEL_STATIC
1957 : dwarf::GIEL_EXTERNAL);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001958 case dwarf::DW_TAG_typedef:
1959 case dwarf::DW_TAG_base_type:
1960 case dwarf::DW_TAG_subrange_type:
David Blaikie8dec4072013-09-19 20:40:26 +00001961 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE, dwarf::GIEL_STATIC);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001962 case dwarf::DW_TAG_namespace:
David Blaikie8dec4072013-09-19 20:40:26 +00001963 return dwarf::GIEK_TYPE;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001964 case dwarf::DW_TAG_subprogram:
Eric Christopherccac5c42013-09-23 22:59:14 +00001965 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_FUNCTION, Linkage);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001966 case dwarf::DW_TAG_constant:
1967 case dwarf::DW_TAG_variable:
Eric Christopherccac5c42013-09-23 22:59:14 +00001968 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, Linkage);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001969 case dwarf::DW_TAG_enumerator:
David Blaikie8dec4072013-09-19 20:40:26 +00001970 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE,
1971 dwarf::GIEL_STATIC);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001972 default:
David Blaikie8dec4072013-09-19 20:40:26 +00001973 return dwarf::GIEK_NONE;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001974 }
Eric Christopherdd1a0122013-09-13 00:35:05 +00001975}
1976
Eric Christopher5f93bb92013-09-09 20:03:17 +00001977/// emitDebugPubNames - Emit visible names into a debug pubnames section.
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001978///
Eric Christopherdd1a0122013-09-13 00:35:05 +00001979void DwarfDebug::emitDebugPubNames(bool GnuStyle) {
Eric Christopherdd1a0122013-09-13 00:35:05 +00001980 const MCSection *PSec =
1981 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection()
1982 : Asm->getObjFileLowering().getDwarfPubNamesSection();
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001983
David Blaikie0f55e832014-03-11 23:18:15 +00001984 emitDebugPubSection(GnuStyle, PSec, "Names", &DwarfUnit::getGlobalNames);
1985}
1986
1987void DwarfDebug::emitDebugPubSection(
1988 bool GnuStyle, const MCSection *PSec, StringRef Name,
1989 const StringMap<const DIE *> &(DwarfUnit::*Accessor)() const) {
David Blaikiec3d9e9e2014-03-06 01:42:00 +00001990 for (const auto &NU : CUMap) {
1991 DwarfCompileUnit *TheU = NU.second;
David Blaikie55bb8ac2014-03-11 23:23:39 +00001992
1993 const auto &Globals = (TheU->*Accessor)();
1994
David Blaikiece2f1cb2014-03-11 23:35:06 +00001995 if (Globals.empty())
1996 continue;
1997
David Blaikiec3d9e9e2014-03-06 01:42:00 +00001998 if (auto Skeleton = static_cast<DwarfCompileUnit *>(TheU->getSkeleton()))
1999 TheU = Skeleton;
David Blaikie2a80e442013-12-02 22:09:48 +00002000 unsigned ID = TheU->getUniqueID();
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002001
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002002 // Start the dwarf pubnames section.
Eric Christopher13b99d22013-09-10 21:49:37 +00002003 Asm->OutStreamer.SwitchSection(PSec);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002004
Eric Christopherdd1a0122013-09-13 00:35:05 +00002005 // Emit the header.
David Blaikie0f55e832014-03-11 23:18:15 +00002006 Asm->OutStreamer.AddComment("Length of Public " + Name + " Info");
2007 MCSymbol *BeginLabel = Asm->GetTempSymbol("pub" + Name + "_begin", ID);
2008 MCSymbol *EndLabel = Asm->GetTempSymbol("pub" + Name + "_end", ID);
David Blaikieb7a1c4d2013-12-04 17:55:41 +00002009 Asm->EmitLabelDifference(EndLabel, BeginLabel, 4);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002010
David Blaikieb7a1c4d2013-12-04 17:55:41 +00002011 Asm->OutStreamer.EmitLabel(BeginLabel);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002012
2013 Asm->OutStreamer.AddComment("DWARF Version");
David Majnemered89b5c2013-08-21 06:13:34 +00002014 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002015
2016 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
David Blaikie7d734602013-12-06 22:33:05 +00002017 Asm->EmitSectionOffset(TheU->getLabelBegin(), TheU->getSectionSym());
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002018
2019 Asm->OutStreamer.AddComment("Compilation Unit Length");
David Blaikie7d734602013-12-06 22:33:05 +00002020 Asm->EmitLabelDifference(TheU->getLabelEnd(), TheU->getLabelBegin(), 4);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002021
Eric Christopherdd1a0122013-09-13 00:35:05 +00002022 // Emit the pubnames for this compilation unit.
David Blaikie55bb8ac2014-03-11 23:23:39 +00002023 for (const auto &GI : Globals) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00002024 const char *Name = GI.getKeyData();
2025 const DIE *Entity = GI.second;
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002026
2027 Asm->OutStreamer.AddComment("DIE offset");
2028 Asm->EmitInt32(Entity->getOffset());
2029
Eric Christopherdd1a0122013-09-13 00:35:05 +00002030 if (GnuStyle) {
David Blaikie2a80e442013-12-02 22:09:48 +00002031 dwarf::PubIndexEntryDescriptor Desc = computeIndexValue(TheU, Entity);
David Blaikied0a869d2013-09-19 22:19:37 +00002032 Asm->OutStreamer.AddComment(
David Blaikieefd0bcb2013-09-20 00:33:15 +00002033 Twine("Kind: ") + dwarf::GDBIndexEntryKindString(Desc.Kind) + ", " +
David Blaikie404d3042013-09-19 23:01:29 +00002034 dwarf::GDBIndexEntryLinkageString(Desc.Linkage));
David Blaikied0a869d2013-09-19 22:19:37 +00002035 Asm->EmitInt8(Desc.toBits());
Eric Christopherdd1a0122013-09-13 00:35:05 +00002036 }
2037
David Blaikie155f8812013-12-04 21:51:05 +00002038 Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer15596c72014-03-07 19:09:39 +00002039 Asm->OutStreamer.EmitBytes(StringRef(Name, GI.getKeyLength() + 1));
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002040 }
2041
2042 Asm->OutStreamer.AddComment("End Mark");
2043 Asm->EmitInt32(0);
David Blaikieb7a1c4d2013-12-04 17:55:41 +00002044 Asm->OutStreamer.EmitLabel(EndLabel);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002045 }
2046}
2047
Eric Christopherdd1a0122013-09-13 00:35:05 +00002048void DwarfDebug::emitDebugPubTypes(bool GnuStyle) {
Eric Christopher261d2342013-09-23 20:55:35 +00002049 const MCSection *PSec =
2050 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
2051 : Asm->getObjFileLowering().getDwarfPubTypesSection();
Eric Christopher8b3737f2013-09-13 00:34:58 +00002052
David Blaikie0f55e832014-03-11 23:18:15 +00002053 emitDebugPubSection(GnuStyle, PSec, "Types", &DwarfUnit::getGlobalTypes);
Devang Patel04d2f2d2009-11-24 01:14:22 +00002054}
2055
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002056// Emit visible names into a debug str section.
2057void DwarfDebug::emitDebugStr() {
Eric Christopherf8194852013-12-05 18:06:10 +00002058 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002059 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2060}
2061
Adrian Prantlb1416832014-08-01 22:11:58 +00002062/// Emits an optimal (=sorted) sequence of DW_OP_pieces.
2063void DwarfDebug::emitLocPieces(ByteStreamer &Streamer,
2064 const DITypeIdentifierMap &Map,
2065 ArrayRef<DebugLocEntry::Value> Values) {
Adrian Prantl293dd932014-08-11 21:05:55 +00002066 assert(std::all_of(Values.begin(), Values.end(), [](DebugLocEntry::Value P) {
Adrian Prantl76502d82014-08-11 23:22:59 +00002067 return P.isVariablePiece();
Adrian Prantlb1416832014-08-01 22:11:58 +00002068 }) && "all values are expected to be pieces");
Adrian Prantl293dd932014-08-11 21:05:55 +00002069 assert(std::is_sorted(Values.begin(), Values.end()) &&
2070 "pieces are expected to be sorted");
Adrian Prantlb1416832014-08-01 22:11:58 +00002071
2072 unsigned Offset = 0;
Adrian Prantl293dd932014-08-11 21:05:55 +00002073 for (auto Piece : Values) {
Adrian Prantl87b7eb92014-10-01 18:55:02 +00002074 DIExpression Expr = Piece.getExpression();
2075 unsigned PieceOffset = Expr.getPieceOffset();
2076 unsigned PieceSize = Expr.getPieceSize();
Adrian Prantl293dd932014-08-11 21:05:55 +00002077 assert(Offset <= PieceOffset && "overlapping or duplicate pieces");
Adrian Prantlb1416832014-08-01 22:11:58 +00002078 if (Offset < PieceOffset) {
2079 // The DWARF spec seriously mandates pieces with no locations for gaps.
2080 Asm->EmitDwarfOpPiece(Streamer, (PieceOffset-Offset)*8);
2081 Offset += PieceOffset-Offset;
2082 }
2083
2084 Offset += PieceSize;
2085
2086 const unsigned SizeOfByte = 8;
Adrian Prantlb458dc22014-10-01 18:10:54 +00002087#ifndef NDEBUG
Adrian Prantl87b7eb92014-10-01 18:55:02 +00002088 DIVariable Var = Piece.getVariable();
2089 assert(!Var.isIndirect() && "indirect address for piece");
Adrian Prantlb1416832014-08-01 22:11:58 +00002090 unsigned VarSize = Var.getSizeInBits(Map);
2091 assert(PieceSize+PieceOffset <= VarSize/SizeOfByte
2092 && "piece is larger than or outside of variable");
2093 assert(PieceSize*SizeOfByte != VarSize
2094 && "piece covers entire variable");
2095#endif
2096 if (Piece.isLocation() && Piece.getLoc().isReg())
2097 Asm->EmitDwarfRegOpPiece(Streamer,
2098 Piece.getLoc(),
2099 PieceSize*SizeOfByte);
2100 else {
2101 emitDebugLocValue(Streamer, Piece);
2102 Asm->EmitDwarfOpPiece(Streamer, PieceSize*SizeOfByte);
2103 }
2104 }
2105}
2106
2107
Eric Christopher29e874d2014-03-07 22:40:37 +00002108void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer,
Eric Christopher05135fb2014-03-18 02:18:24 +00002109 const DebugLocEntry &Entry) {
Adrian Prantle19e5ef2014-04-27 18:25:40 +00002110 const DebugLocEntry::Value Value = Entry.getValues()[0];
Adrian Prantl76502d82014-08-11 23:22:59 +00002111 if (Value.isVariablePiece())
Adrian Prantlb1416832014-08-01 22:11:58 +00002112 // Emit all pieces that belong to the same variable and range.
2113 return emitLocPieces(Streamer, TypeIdentifierMap, Entry.getValues());
2114
2115 assert(Entry.getValues().size() == 1 && "only pieces may have >1 value");
2116 emitDebugLocValue(Streamer, Value);
2117}
2118
2119void DwarfDebug::emitDebugLocValue(ByteStreamer &Streamer,
2120 const DebugLocEntry::Value &Value) {
Adrian Prantl76502d82014-08-11 23:22:59 +00002121 DIVariable DV = Value.getVariable();
Adrian Prantlb1416832014-08-01 22:11:58 +00002122 // Regular entry.
Adrian Prantle19e5ef2014-04-27 18:25:40 +00002123 if (Value.isInt()) {
Adrian Prantl1a1647c2014-03-18 02:34:58 +00002124 DIBasicType BTy(resolve(DV.getType()));
Eric Christopher29e874d2014-03-07 22:40:37 +00002125 if (BTy.Verify() && (BTy.getEncoding() == dwarf::DW_ATE_signed ||
2126 BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2127 Streamer.EmitInt8(dwarf::DW_OP_consts, "DW_OP_consts");
Adrian Prantle19e5ef2014-04-27 18:25:40 +00002128 Streamer.EmitSLEB128(Value.getInt());
Eric Christopher29e874d2014-03-07 22:40:37 +00002129 } else {
2130 Streamer.EmitInt8(dwarf::DW_OP_constu, "DW_OP_constu");
Adrian Prantle19e5ef2014-04-27 18:25:40 +00002131 Streamer.EmitULEB128(Value.getInt());
Eric Christopher29e874d2014-03-07 22:40:37 +00002132 }
Adrian Prantle19e5ef2014-04-27 18:25:40 +00002133 } else if (Value.isLocation()) {
2134 MachineLocation Loc = Value.getLoc();
Adrian Prantl87b7eb92014-10-01 18:55:02 +00002135 DIExpression Expr = Value.getExpression();
2136 if (!Expr)
Eric Christopher29e874d2014-03-07 22:40:37 +00002137 // Regular entry.
2138 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2139 else {
2140 // Complex address entry.
Adrian Prantl87b7eb92014-10-01 18:55:02 +00002141 unsigned N = Expr.getNumElements();
Eric Christopher29e874d2014-03-07 22:40:37 +00002142 unsigned i = 0;
Adrian Prantl87b7eb92014-10-01 18:55:02 +00002143 if (N >= 2 && Expr.getElement(0) == dwarf::DW_OP_plus) {
Eric Christopher29e874d2014-03-07 22:40:37 +00002144 if (Loc.getOffset()) {
2145 i = 2;
2146 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2147 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
2148 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
Adrian Prantl87b7eb92014-10-01 18:55:02 +00002149 Streamer.EmitSLEB128(Expr.getElement(1));
Eric Christopher29e874d2014-03-07 22:40:37 +00002150 } else {
2151 // If first address element is OpPlus then emit
2152 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Adrian Prantl87b7eb92014-10-01 18:55:02 +00002153 MachineLocation TLoc(Loc.getReg(), Expr.getElement(1));
Eric Christopher29e874d2014-03-07 22:40:37 +00002154 Asm->EmitDwarfRegOp(Streamer, TLoc, DV.isIndirect());
2155 i = 2;
2156 }
2157 } else {
2158 Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2159 }
2160
2161 // Emit remaining complex address elements.
2162 for (; i < N; ++i) {
Adrian Prantl87b7eb92014-10-01 18:55:02 +00002163 uint64_t Element = Expr.getElement(i);
2164 if (Element == dwarf::DW_OP_plus) {
Eric Christopher29e874d2014-03-07 22:40:37 +00002165 Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
Adrian Prantl87b7eb92014-10-01 18:55:02 +00002166 Streamer.EmitULEB128(Expr.getElement(++i));
2167 } else if (Element == dwarf::DW_OP_deref) {
Eric Christopher29e874d2014-03-07 22:40:37 +00002168 if (!Loc.isReg())
2169 Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
Adrian Prantl87b7eb92014-10-01 18:55:02 +00002170 } else if (Element == dwarf::DW_OP_piece) {
Adrian Prantlb1416832014-08-01 22:11:58 +00002171 i += 3;
2172 // handled in emitDebugLocEntry.
Eric Christopher29e874d2014-03-07 22:40:37 +00002173 } else
2174 llvm_unreachable("unknown Opcode found in complex address");
2175 }
2176 }
2177 }
2178 // else ... ignore constant fp. There is not any good way to
2179 // to represent them here in dwarf.
2180 // FIXME: ^
2181}
2182
David Blaikie0e84adc2014-04-01 16:17:41 +00002183void DwarfDebug::emitDebugLocEntryLocation(const DebugLocEntry &Entry) {
2184 Asm->OutStreamer.AddComment("Loc expr size");
2185 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2186 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2187 Asm->EmitLabelDifference(end, begin, 2);
2188 Asm->OutStreamer.EmitLabel(begin);
2189 // Emit the entry.
2190 APByteStreamer Streamer(*Asm);
2191 emitDebugLocEntry(Streamer, Entry);
2192 // Close the range.
2193 Asm->OutStreamer.EmitLabel(end);
2194}
2195
Eric Christopher9046f942013-07-02 21:36:07 +00002196// Emit locations into the debug loc section.
Devang Patel930143b2009-11-21 02:48:08 +00002197void DwarfDebug::emitDebugLoc() {
Daniel Dunbarfd95b012011-03-16 22:16:39 +00002198 // Start the dwarf loc section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002199 Asm->OutStreamer.SwitchSection(
David Blaikie94c1d7f2014-04-02 01:50:20 +00002200 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth5da3f052012-11-01 09:14:31 +00002201 unsigned char Size = Asm->getDataLayout().getPointerSize();
David Blaikie84d8e182014-03-24 22:38:38 +00002202 for (const auto &DebugLoc : DotDebugLocEntries) {
David Blaikie0a456de2014-04-02 01:43:18 +00002203 Asm->OutStreamer.EmitLabel(DebugLoc.Label);
David Blaikiee1a26a62014-08-05 23:14:16 +00002204 const DwarfCompileUnit *CU = DebugLoc.CU;
David Blaikiefb0412f2014-08-06 00:21:25 +00002205 assert(!CU->getRanges().empty());
David Blaikie0a456de2014-04-02 01:43:18 +00002206 for (const auto &Entry : DebugLoc.List) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00002207 // Set up the range. This range is relative to the entry point of the
2208 // compile unit. This is a hard coded 0 for low_pc when we're emitting
2209 // ranges, or the DW_AT_low_pc on the compile unit otherwise.
David Blaikie94c1d7f2014-04-02 01:50:20 +00002210 if (CU->getRanges().size() == 1) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00002211 // Grab the begin symbol from the first range as our base.
2212 const MCSymbol *Base = CU->getRanges()[0].getStart();
2213 Asm->EmitLabelDifference(Entry.getBeginSym(), Base, Size);
2214 Asm->EmitLabelDifference(Entry.getEndSym(), Base, Size);
2215 } else {
2216 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
2217 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
2218 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002219
David Blaikie0e84adc2014-04-01 16:17:41 +00002220 emitDebugLocEntryLocation(Entry);
Devang Patel9fc11702010-05-25 23:40:22 +00002221 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002222 Asm->OutStreamer.EmitIntValue(0, Size);
2223 Asm->OutStreamer.EmitIntValue(0, Size);
2224 }
2225}
2226
2227void DwarfDebug::emitDebugLocDWO() {
2228 Asm->OutStreamer.SwitchSection(
2229 Asm->getObjFileLowering().getDwarfLocDWOSection());
2230 for (const auto &DebugLoc : DotDebugLocEntries) {
2231 Asm->OutStreamer.EmitLabel(DebugLoc.Label);
2232 for (const auto &Entry : DebugLoc.List) {
2233 // Just always use start_length for now - at least that's one address
2234 // rather than two. We could get fancier and try to, say, reuse an
2235 // address we know we've emitted elsewhere (the start of the function?
2236 // The start of the CU or CU subrange that encloses this range?)
2237 Asm->EmitInt8(dwarf::DW_LLE_start_length_entry);
David Blaikied75fb282014-04-23 21:20:10 +00002238 unsigned idx = AddrPool.getIndex(Entry.getBeginSym());
David Blaikie94c1d7f2014-04-02 01:50:20 +00002239 Asm->EmitULEB128(idx);
2240 Asm->EmitLabelDifference(Entry.getEndSym(), Entry.getBeginSym(), 4);
2241
2242 emitDebugLocEntryLocation(Entry);
David Blaikie9c550ac2014-03-25 01:44:02 +00002243 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002244 Asm->EmitInt8(dwarf::DW_LLE_end_of_list_entry);
Devang Patel9fc11702010-05-25 23:40:22 +00002245 }
Bill Wendling480ff322009-05-20 23:21:38 +00002246}
2247
Richard Mitton21101b32013-09-19 23:21:01 +00002248struct ArangeSpan {
2249 const MCSymbol *Start, *End;
2250};
2251
2252// Emit a debug aranges section, containing a CU lookup for any
2253// address we can tie back to a CU.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00002254void DwarfDebug::emitDebugARanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002255 // Start the dwarf aranges section.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002256 Asm->OutStreamer.SwitchSection(
2257 Asm->getObjFileLowering().getDwarfARangesSection());
Richard Mitton21101b32013-09-19 23:21:01 +00002258
Eric Christopher793c7472014-04-28 20:42:22 +00002259 typedef DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan>> SpansType;
Richard Mitton21101b32013-09-19 23:21:01 +00002260
2261 SpansType Spans;
2262
2263 // Build a list of sections used.
2264 std::vector<const MCSection *> Sections;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002265 for (const auto &it : SectionMap) {
2266 const MCSection *Section = it.first;
Richard Mitton21101b32013-09-19 23:21:01 +00002267 Sections.push_back(Section);
2268 }
2269
2270 // Sort the sections into order.
2271 // This is only done to ensure consistent output order across different runs.
2272 std::sort(Sections.begin(), Sections.end(), SectionSort);
2273
2274 // Build a set of address spans, sorted by CU.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002275 for (const MCSection *Section : Sections) {
David Blaikieafd2c6b2014-04-22 05:41:06 +00002276 SmallVector<SymbolCU, 8> &List = SectionMap[Section];
Richard Mitton21101b32013-09-19 23:21:01 +00002277 if (List.size() < 2)
2278 continue;
2279
2280 // Sort the symbols by offset within the section.
Benjamin Kramer571e2fe2014-03-07 19:41:22 +00002281 std::sort(List.begin(), List.end(),
2282 [&](const SymbolCU &A, const SymbolCU &B) {
2283 unsigned IA = A.Sym ? Asm->OutStreamer.GetSymbolOrder(A.Sym) : 0;
2284 unsigned IB = B.Sym ? Asm->OutStreamer.GetSymbolOrder(B.Sym) : 0;
2285
2286 // Symbols with no order assigned should be placed at the end.
2287 // (e.g. section end labels)
2288 if (IA == 0)
2289 return false;
2290 if (IB == 0)
2291 return true;
2292 return IA < IB;
2293 });
Richard Mitton21101b32013-09-19 23:21:01 +00002294
2295 // If we have no section (e.g. common), just write out
2296 // individual spans for each symbol.
Craig Topper353eda42014-04-24 06:44:33 +00002297 if (!Section) {
Benjamin Kramer15596c72014-03-07 19:09:39 +00002298 for (const SymbolCU &Cur : List) {
Richard Mitton21101b32013-09-19 23:21:01 +00002299 ArangeSpan Span;
2300 Span.Start = Cur.Sym;
Craig Topper353eda42014-04-24 06:44:33 +00002301 Span.End = nullptr;
Richard Mitton21101b32013-09-19 23:21:01 +00002302 if (Cur.CU)
2303 Spans[Cur.CU].push_back(Span);
2304 }
2305 } else {
2306 // Build spans between each label.
2307 const MCSymbol *StartSym = List[0].Sym;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002308 for (size_t n = 1, e = List.size(); n < e; n++) {
Richard Mitton21101b32013-09-19 23:21:01 +00002309 const SymbolCU &Prev = List[n - 1];
2310 const SymbolCU &Cur = List[n];
2311
2312 // Try and build the longest span we can within the same CU.
2313 if (Cur.CU != Prev.CU) {
2314 ArangeSpan Span;
2315 Span.Start = StartSym;
2316 Span.End = Cur.Sym;
2317 Spans[Prev.CU].push_back(Span);
2318 StartSym = Cur.Sym;
2319 }
2320 }
2321 }
2322 }
2323
Richard Mitton21101b32013-09-19 23:21:01 +00002324 unsigned PtrSize = Asm->getDataLayout().getPointerSize();
2325
2326 // Build a list of CUs used.
Eric Christopher4287a492013-12-09 23:57:44 +00002327 std::vector<DwarfCompileUnit *> CUs;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002328 for (const auto &it : Spans) {
2329 DwarfCompileUnit *CU = it.first;
Richard Mitton21101b32013-09-19 23:21:01 +00002330 CUs.push_back(CU);
2331 }
2332
2333 // Sort the CU list (again, to ensure consistent output order).
Benjamin Kramer571e2fe2014-03-07 19:41:22 +00002334 std::sort(CUs.begin(), CUs.end(), [](const DwarfUnit *A, const DwarfUnit *B) {
2335 return A->getUniqueID() < B->getUniqueID();
2336 });
Richard Mitton21101b32013-09-19 23:21:01 +00002337
2338 // Emit an arange table for each CU we used.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002339 for (DwarfCompileUnit *CU : CUs) {
Richard Mitton21101b32013-09-19 23:21:01 +00002340 std::vector<ArangeSpan> &List = Spans[CU];
2341
2342 // Emit size of content not including length itself.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002343 unsigned ContentSize =
2344 sizeof(int16_t) + // DWARF ARange version number
2345 sizeof(int32_t) + // Offset of CU in the .debug_info section
2346 sizeof(int8_t) + // Pointer Size (in bytes)
2347 sizeof(int8_t); // Segment Size (in bytes)
Richard Mitton21101b32013-09-19 23:21:01 +00002348
2349 unsigned TupleSize = PtrSize * 2;
2350
2351 // 7.20 in the Dwarf specs requires the table to be aligned to a tuple.
Benjamin Kramer8a68ab32014-01-07 19:28:14 +00002352 unsigned Padding =
2353 OffsetToAlignment(sizeof(int32_t) + ContentSize, TupleSize);
Richard Mitton21101b32013-09-19 23:21:01 +00002354
2355 ContentSize += Padding;
2356 ContentSize += (List.size() + 1) * TupleSize;
2357
2358 // For each compile unit, write the list of spans it covers.
2359 Asm->OutStreamer.AddComment("Length of ARange Set");
2360 Asm->EmitInt32(ContentSize);
2361 Asm->OutStreamer.AddComment("DWARF Arange version number");
2362 Asm->EmitInt16(dwarf::DW_ARANGES_VERSION);
2363 Asm->OutStreamer.AddComment("Offset Into Debug Info Section");
Eric Christopherd8667202013-12-30 17:22:27 +00002364 Asm->EmitSectionOffset(CU->getLocalLabelBegin(), CU->getLocalSectionSym());
Richard Mitton21101b32013-09-19 23:21:01 +00002365 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2366 Asm->EmitInt8(PtrSize);
2367 Asm->OutStreamer.AddComment("Segment Size (in bytes)");
2368 Asm->EmitInt8(0);
2369
Benjamin Kramer8a68ab32014-01-07 19:28:14 +00002370 Asm->OutStreamer.EmitFill(Padding, 0xff);
Richard Mitton21101b32013-09-19 23:21:01 +00002371
Benjamin Kramer15596c72014-03-07 19:09:39 +00002372 for (const ArangeSpan &Span : List) {
Richard Mitton21101b32013-09-19 23:21:01 +00002373 Asm->EmitLabelReference(Span.Start, PtrSize);
2374
2375 // Calculate the size as being from the span start to it's end.
Richard Mitton089ed892013-09-23 17:56:20 +00002376 if (Span.End) {
Richard Mitton21101b32013-09-19 23:21:01 +00002377 Asm->EmitLabelDifference(Span.End, Span.Start, PtrSize);
Richard Mitton089ed892013-09-23 17:56:20 +00002378 } else {
2379 // For symbols without an end marker (e.g. common), we
2380 // write a single arange entry containing just that one symbol.
2381 uint64_t Size = SymSize[Span.Start];
2382 if (Size == 0)
2383 Size = 1;
2384
2385 Asm->OutStreamer.EmitIntValue(Size, PtrSize);
2386 }
Richard Mitton21101b32013-09-19 23:21:01 +00002387 }
2388
2389 Asm->OutStreamer.AddComment("ARange terminator");
2390 Asm->OutStreamer.EmitIntValue(0, PtrSize);
2391 Asm->OutStreamer.EmitIntValue(0, PtrSize);
2392 }
Bill Wendling480ff322009-05-20 23:21:38 +00002393}
2394
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002395// Emit visible names into a debug ranges section.
Devang Patel930143b2009-11-21 02:48:08 +00002396void DwarfDebug::emitDebugRanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002397 // Start the dwarf ranges section.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002398 Asm->OutStreamer.SwitchSection(
2399 Asm->getObjFileLowering().getDwarfRangesSection());
Eric Christopher4751d702013-11-23 00:05:29 +00002400
Eric Christopher0f63d062013-12-03 00:45:45 +00002401 // Size for our labels.
2402 unsigned char Size = Asm->getDataLayout().getPointerSize();
2403
2404 // Grab the specific ranges for the compile units in the module.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002405 for (const auto &I : CUMap) {
2406 DwarfCompileUnit *TheCU = I.second;
Eric Christopher0f63d062013-12-03 00:45:45 +00002407
Eric Christopher0f63d062013-12-03 00:45:45 +00002408 // Iterate over the misc ranges for the compile units in the module.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002409 for (const RangeSpanList &List : TheCU->getRangeLists()) {
Eric Christopherf8790642013-12-04 22:04:50 +00002410 // Emit our symbol so we can find the beginning of the range.
2411 Asm->OutStreamer.EmitLabel(List.getSym());
Eric Christopher0f63d062013-12-03 00:45:45 +00002412
Benjamin Kramer15596c72014-03-07 19:09:39 +00002413 for (const RangeSpan &Range : List.getRanges()) {
Eric Christopher0f63d062013-12-03 00:45:45 +00002414 const MCSymbol *Begin = Range.getStart();
2415 const MCSymbol *End = Range.getEnd();
Eric Christopher565ab112013-12-20 04:34:22 +00002416 assert(Begin && "Range without a begin symbol?");
2417 assert(End && "Range without an end symbol?");
Eric Christopherece0e902014-04-25 22:23:54 +00002418 if (TheCU->getRanges().size() == 1) {
2419 // Grab the begin symbol from the first range as our base.
2420 const MCSymbol *Base = TheCU->getRanges()[0].getStart();
2421 Asm->EmitLabelDifference(Begin, Base, Size);
2422 Asm->EmitLabelDifference(End, Base, Size);
2423 } else {
2424 Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2425 Asm->OutStreamer.EmitSymbolValue(End, Size);
2426 }
Eric Christopher0f63d062013-12-03 00:45:45 +00002427 }
2428
2429 // And terminate the list with two 0 values.
Eric Christopherce0cfce2013-01-09 01:35:34 +00002430 Asm->OutStreamer.EmitIntValue(0, Size);
Eric Christopher0f63d062013-12-03 00:45:45 +00002431 Asm->OutStreamer.EmitIntValue(0, Size);
2432 }
Eric Christopher46e23432013-12-20 04:16:18 +00002433
2434 // Now emit a range for the CU itself.
Eric Christopher384f3fe2014-03-20 19:16:16 +00002435 if (TheCU->getRanges().size() > 1) {
Eric Christopher46e23432013-12-20 04:16:18 +00002436 Asm->OutStreamer.EmitLabel(
2437 Asm->GetTempSymbol("cu_ranges", TheCU->getUniqueID()));
Benjamin Kramer15596c72014-03-07 19:09:39 +00002438 for (const RangeSpan &Range : TheCU->getRanges()) {
Eric Christopher46e23432013-12-20 04:16:18 +00002439 const MCSymbol *Begin = Range.getStart();
2440 const MCSymbol *End = Range.getEnd();
Eric Christopher565ab112013-12-20 04:34:22 +00002441 assert(Begin && "Range without a begin symbol?");
2442 assert(End && "Range without an end symbol?");
2443 Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2444 Asm->OutStreamer.EmitSymbolValue(End, Size);
Eric Christopher46e23432013-12-20 04:16:18 +00002445 }
2446 // And terminate the list with two 0 values.
2447 Asm->OutStreamer.EmitIntValue(0, Size);
2448 Asm->OutStreamer.EmitIntValue(0, Size);
2449 }
Devang Patel12563b32010-04-16 23:33:45 +00002450 }
Bill Wendling480ff322009-05-20 23:21:38 +00002451}
2452
Eric Christopherd692c1d2012-12-11 19:42:09 +00002453// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002454
David Blaikie65a74662014-04-25 18:26:14 +00002455void DwarfDebug::initSkeletonUnit(const DwarfUnit &U, DIE &Die,
David Blaikief9b6a552014-04-22 22:39:41 +00002456 std::unique_ptr<DwarfUnit> NewU) {
David Blaikie38fe6342014-01-09 04:28:46 +00002457 NewU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
David Blaikief9b6a552014-04-22 22:39:41 +00002458 U.getCUNode().getSplitDebugFilename());
David Blaikie38fe6342014-01-09 04:28:46 +00002459
David Blaikie38fe6342014-01-09 04:28:46 +00002460 if (!CompilationDir.empty())
2461 NewU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
2462
David Blaikief9b6a552014-04-22 22:39:41 +00002463 addGnuPubAttributes(*NewU, Die);
David Blaikie38fe6342014-01-09 04:28:46 +00002464
David Blaikief9b6a552014-04-22 22:39:41 +00002465 SkeletonHolder.addUnit(std::move(NewU));
David Blaikie38fe6342014-01-09 04:28:46 +00002466}
2467
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002468// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2469// 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 +00002470// DW_AT_addr_base, DW_AT_ranges_base.
David Blaikief9b6a552014-04-22 22:39:41 +00002471DwarfCompileUnit &DwarfDebug::constructSkeletonCU(const DwarfCompileUnit &CU) {
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002472
David Blaikief9b6a552014-04-22 22:39:41 +00002473 auto OwnedUnit = make_unique<DwarfCompileUnit>(
David Blaikiebd579052014-04-28 21:14:27 +00002474 CU.getUniqueID(), CU.getCUNode(), Asm, this, &SkeletonHolder);
David Blaikief9b6a552014-04-22 22:39:41 +00002475 DwarfCompileUnit &NewCU = *OwnedUnit;
2476 NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
David Blaikie637cac42014-04-22 23:09:36 +00002477 DwarfInfoSectionSym);
Eric Christopher4c7765f2013-01-17 03:00:04 +00002478
David Blaikief9b6a552014-04-22 22:39:41 +00002479 NewCU.initStmtList(DwarfLineSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002480
David Blaikie92a2f8a2014-04-28 21:04:29 +00002481 initSkeletonUnit(CU, NewCU.getUnitDie(), std::move(OwnedUnit));
Eric Christopherc8a310e2012-12-10 23:34:43 +00002482
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002483 return NewCU;
2484}
2485
Eric Christopherd692c1d2012-12-11 19:42:09 +00002486// Emit the .debug_info.dwo section for separated dwarf. This contains the
2487// compile units that would normally be in debug_info.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002488void DwarfDebug::emitDebugInfoDWO() {
Eric Christophercdf218d2012-12-10 19:51:21 +00002489 assert(useSplitDwarf() && "No split dwarf debug info?");
David Blaikie326e1fa2014-04-02 02:04:51 +00002490 // Don't pass an abbrev symbol, using a constant zero instead so as not to
2491 // emit relocations into the dwo file.
Eric Christopher793c7472014-04-28 20:42:22 +00002492 InfoHolder.emitUnits(this, /* AbbrevSymbol */ nullptr);
Eric Christopher3c5a1912012-12-19 22:02:53 +00002493}
2494
2495// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2496// abbreviations for the .debug_info.dwo section.
2497void DwarfDebug::emitDebugAbbrevDWO() {
2498 assert(useSplitDwarf() && "No split dwarf?");
David Blaikie0504cda2013-12-05 07:43:55 +00002499 InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection());
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002500}
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002501
David Blaikie4a2f95f2014-03-18 01:17:26 +00002502void DwarfDebug::emitDebugLineDWO() {
2503 assert(useSplitDwarf() && "No split dwarf?");
2504 Asm->OutStreamer.SwitchSection(
2505 Asm->getObjFileLowering().getDwarfLineDWOSection());
David Blaikie8287aff2014-03-18 02:13:23 +00002506 SplitTypeUnitFileTable.Emit(Asm->OutStreamer);
David Blaikie4a2f95f2014-03-18 01:17:26 +00002507}
2508
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002509// Emit the .debug_str.dwo section for separated dwarf. This contains the
2510// string section and is identical in format to traditional .debug_str
2511// sections.
2512void DwarfDebug::emitDebugStrDWO() {
2513 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002514 const MCSection *OffSec =
2515 Asm->getObjFileLowering().getDwarfStrOffDWOSection();
Eric Christopher2cbd5762013-01-07 19:32:41 +00002516 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
David Blaikie6741bb02014-09-11 21:12:48 +00002517 OffSec);
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002518}
David Blaikie409dd9c2013-11-19 23:08:21 +00002519
David Blaikie47f4b822014-03-19 00:11:28 +00002520MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) {
2521 if (!useSplitDwarf())
2522 return nullptr;
2523 if (SingleCU)
2524 SplitTypeUnitFileTable.setCompilationDir(CU.getCUNode().getDirectory());
2525 return &SplitTypeUnitFileTable;
2526}
2527
David Blaikief3de2ab2014-04-26 16:26:41 +00002528static uint64_t makeTypeSignature(StringRef Identifier) {
2529 MD5 Hash;
2530 Hash.update(Identifier);
2531 // ... take the least significant 8 bytes and return those. Our MD5
2532 // implementation always returns its results in little endian, swap bytes
2533 // appropriately.
2534 MD5::MD5Result Result;
2535 Hash.final(Result);
2536 return *reinterpret_cast<support::ulittle64_t *>(Result + 8);
2537}
2538
David Blaikie15632ae2014-02-12 00:31:30 +00002539void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU,
David Blaikie65a74662014-04-25 18:26:14 +00002540 StringRef Identifier, DIE &RefDie,
David Blaikief645f962014-01-09 03:23:41 +00002541 DICompositeType CTy) {
David Blaikiee12b49a2014-04-26 17:27:38 +00002542 // Fast path if we're building some type units and one has already used the
2543 // address pool we know we're going to throw away all this work anyway, so
2544 // don't bother building dependent types.
2545 if (!TypeUnitsUnderConstruction.empty() && AddrPool.hasBeenUsed())
2546 return;
2547
David Blaikie47f615e2013-12-17 23:32:35 +00002548 const DwarfTypeUnit *&TU = DwarfTypeUnits[CTy];
Chandler Carruthb587ab62014-01-20 08:07:07 +00002549 if (TU) {
David Blaikie15632ae2014-02-12 00:31:30 +00002550 CU.addDIETypeSignature(RefDie, *TU);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002551 return;
David Blaikie409dd9c2013-11-19 23:08:21 +00002552 }
2553
David Blaikiee12b49a2014-04-26 17:27:38 +00002554 bool TopLevelType = TypeUnitsUnderConstruction.empty();
2555 AddrPool.resetUsedFlag();
2556
David Blaikie29459ae2014-07-25 17:11:58 +00002557 auto OwnedUnit = make_unique<DwarfTypeUnit>(
2558 InfoHolder.getUnits().size() + TypeUnitsUnderConstruction.size(), CU, Asm,
2559 this, &InfoHolder, getDwoLineTable(CU));
David Blaikief9b6a552014-04-22 22:39:41 +00002560 DwarfTypeUnit &NewTU = *OwnedUnit;
David Blaikie92a2f8a2014-04-28 21:04:29 +00002561 DIE &UnitDie = NewTU.getUnitDie();
David Blaikief9b6a552014-04-22 22:39:41 +00002562 TU = &NewTU;
Eric Christopher793c7472014-04-28 20:42:22 +00002563 TypeUnitsUnderConstruction.push_back(
2564 std::make_pair(std::move(OwnedUnit), CTy));
Chandler Carruthb587ab62014-01-20 08:07:07 +00002565
David Blaikie92a2f8a2014-04-28 21:04:29 +00002566 NewTU.addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
David Blaikie637cac42014-04-22 23:09:36 +00002567 CU.getLanguage());
Chandler Carruthb587ab62014-01-20 08:07:07 +00002568
David Blaikief3de2ab2014-04-26 16:26:41 +00002569 uint64_t Signature = makeTypeSignature(Identifier);
David Blaikief9b6a552014-04-22 22:39:41 +00002570 NewTU.setTypeSignature(Signature);
David Blaikief3de2ab2014-04-26 16:26:41 +00002571
David Blaikie29459ae2014-07-25 17:11:58 +00002572 if (useSplitDwarf())
2573 NewTU.initSection(Asm->getObjFileLowering().getDwarfTypesDWOSection(),
2574 DwarfTypesDWOSectionSym);
2575 else {
David Blaikie92a2f8a2014-04-28 21:04:29 +00002576 CU.applyStmtList(UnitDie);
David Blaikie29459ae2014-07-25 17:11:58 +00002577 NewTU.initSection(
2578 Asm->getObjFileLowering().getDwarfTypesSection(Signature));
2579 }
Chandler Carruthb587ab62014-01-20 08:07:07 +00002580
David Blaikief3de2ab2014-04-26 16:26:41 +00002581 NewTU.setType(NewTU.createTypeDIE(CTy));
2582
David Blaikiee12b49a2014-04-26 17:27:38 +00002583 if (TopLevelType) {
2584 auto TypeUnitsToAdd = std::move(TypeUnitsUnderConstruction);
2585 TypeUnitsUnderConstruction.clear();
2586
2587 // Types referencing entries in the address table cannot be placed in type
2588 // units.
2589 if (AddrPool.hasBeenUsed()) {
2590
2591 // Remove all the types built while building this type.
2592 // This is pessimistic as some of these types might not be dependent on
2593 // the type that used an address.
2594 for (const auto &TU : TypeUnitsToAdd)
2595 DwarfTypeUnits.erase(TU.second);
2596
2597 // Construct this type in the CU directly.
2598 // This is inefficient because all the dependent types will be rebuilt
2599 // from scratch, including building them in type units, discovering that
2600 // they depend on addresses, throwing them out and rebuilding them.
2601 CU.constructTypeDIE(RefDie, CTy);
2602 return;
2603 }
2604
2605 // If the type wasn't dependent on fission addresses, finish adding the type
2606 // and all its dependent types.
David Blaikiec13bc972014-08-27 05:04:14 +00002607 for (auto &TU : TypeUnitsToAdd)
David Blaikiee12b49a2014-04-26 17:27:38 +00002608 InfoHolder.addUnit(std::move(TU.first));
David Blaikiee12b49a2014-04-26 17:27:38 +00002609 }
David Blaikief9b6a552014-04-22 22:39:41 +00002610 CU.addDIETypeSignature(RefDie, NewTU);
David Blaikie409dd9c2013-11-19 23:08:21 +00002611}
David Blaikie4bd13b72014-03-07 18:49:45 +00002612
David Blaikie2406a0622014-04-23 23:37:35 +00002613// Accelerator table mutators - add each name along with its companion
2614// DIE to the proper table while ensuring that the name that we're going
2615// to reference is in the string table. We do this since the names we
2616// add may not only be identical to the names in the DIE.
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002617void DwarfDebug::addAccelName(StringRef Name, const DIE &Die) {
David Blaikie2406a0622014-04-23 23:37:35 +00002618 if (!useDwarfAccelTables())
2619 return;
David Blaikie772ab8a2014-04-25 22:21:35 +00002620 AccelNames.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2621 &Die);
David Blaikie2406a0622014-04-23 23:37:35 +00002622}
David Blaikie0ee82b92014-04-24 00:53:32 +00002623
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002624void DwarfDebug::addAccelObjC(StringRef Name, const DIE &Die) {
David Blaikie0ee82b92014-04-24 00:53:32 +00002625 if (!useDwarfAccelTables())
2626 return;
David Blaikie772ab8a2014-04-25 22:21:35 +00002627 AccelObjC.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2628 &Die);
David Blaikie0ee82b92014-04-24 00:53:32 +00002629}
David Blaikieecf04152014-04-24 01:02:42 +00002630
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002631void DwarfDebug::addAccelNamespace(StringRef Name, const DIE &Die) {
David Blaikieecf04152014-04-24 01:02:42 +00002632 if (!useDwarfAccelTables())
2633 return;
David Blaikie772ab8a2014-04-25 22:21:35 +00002634 AccelNamespace.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2635 &Die);
David Blaikieecf04152014-04-24 01:02:42 +00002636}
David Blaikie18d33752014-04-24 01:23:49 +00002637
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002638void DwarfDebug::addAccelType(StringRef Name, const DIE &Die, char Flags) {
David Blaikie18d33752014-04-24 01:23:49 +00002639 if (!useDwarfAccelTables())
2640 return;
David Blaikie772ab8a2014-04-25 22:21:35 +00002641 AccelTypes.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2642 &Die);
David Blaikie18d33752014-04-24 01:23:49 +00002643}