blob: b392586ef10aeff942bf7555316bf3ff02975160 [file] [log] [blame]
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +00001//===- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ----------------===//
Bill Wendling2f921f82009-05-15 09:23:25 +00002//
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#include "ByteStreamer.h"
Eric Christopher45731982013-08-08 23:45:55 +000016#include "DIEHash.h"
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +000017#include "DebugLocEntry.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000018#include "DebugLocStream.h"
Chandler Carruthd9903882015-01-14 11:23:27 +000019#include "DwarfCompileUnit.h"
20#include "DwarfExpression.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000021#include "DwarfFile.h"
David Blaikie2c86a722013-12-02 19:33:15 +000022#include "DwarfUnit.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000023#include "llvm/ADT/APInt.h"
24#include "llvm/ADT/DenseMap.h"
25#include "llvm/ADT/DenseSet.h"
26#include "llvm/ADT/MapVector.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000027#include "llvm/ADT/STLExtras.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000028#include "llvm/ADT/SmallVector.h"
29#include "llvm/ADT/StringRef.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000030#include "llvm/ADT/Triple.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000031#include "llvm/ADT/Twine.h"
Zachary Turner264b5d92017-06-07 03:48:56 +000032#include "llvm/BinaryFormat/Dwarf.h"
Jonas Devlieghere855fc3b2018-01-29 14:52:41 +000033#include "llvm/CodeGen/AccelTable.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000034#include "llvm/CodeGen/AsmPrinter.h"
Frederic Risse541e0b2015-01-05 21:29:41 +000035#include "llvm/CodeGen/DIE.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000036#include "llvm/CodeGen/LexicalScopes.h"
37#include "llvm/CodeGen/MachineBasicBlock.h"
David Greene829b3e82009-08-19 21:52:55 +000038#include "llvm/CodeGen/MachineFunction.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000039#include "llvm/CodeGen/MachineInstr.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000040#include "llvm/CodeGen/MachineModuleInfo.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000041#include "llvm/CodeGen/MachineOperand.h"
David Blaikieb3bde2e2017-11-17 01:07:10 +000042#include "llvm/CodeGen/TargetRegisterInfo.h"
43#include "llvm/CodeGen/TargetSubtargetInfo.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000044#include "llvm/IR/Constants.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000045#include "llvm/IR/DebugInfoMetadata.h"
46#include "llvm/IR/DebugLoc.h"
47#include "llvm/IR/Function.h"
48#include "llvm/IR/GlobalVariable.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000049#include "llvm/IR/Module.h"
Chris Lattnere13c3722010-03-09 01:58:53 +000050#include "llvm/MC/MCAsmInfo.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000051#include "llvm/MC/MCContext.h"
Frederic Rissa5ab8442015-08-07 15:14:08 +000052#include "llvm/MC/MCDwarf.h"
Chris Lattner4d2c0f92009-07-31 18:48:30 +000053#include "llvm/MC/MCSection.h"
Chris Lattner4b7dadb2009-08-19 05:49:37 +000054#include "llvm/MC/MCStreamer.h"
Chris Lattnere13c3722010-03-09 01:58:53 +000055#include "llvm/MC/MCSymbol.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000056#include "llvm/MC/MCTargetOptions.h"
57#include "llvm/MC/MachineLocation.h"
58#include "llvm/MC/SectionKind.h"
59#include "llvm/Pass.h"
60#include "llvm/Support/Casting.h"
Devang Patel6c74a872010-04-27 19:46:33 +000061#include "llvm/Support/CommandLine.h"
Daniel Dunbarcdf01b52009-10-13 06:47:08 +000062#include "llvm/Support/Debug.h"
63#include "llvm/Support/ErrorHandling.h"
Eric Christopher67646432013-07-26 17:02:41 +000064#include "llvm/Support/MD5.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000065#include "llvm/Support/MathExtras.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000066#include "llvm/Support/Timer.h"
Benjamin Kramer799003b2015-03-23 19:32:43 +000067#include "llvm/Support/raw_ostream.h"
David Blaikie6054e652018-03-23 23:58:19 +000068#include "llvm/Target/TargetLoweringObjectFile.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000069#include "llvm/Target/TargetMachine.h"
70#include "llvm/Target/TargetOptions.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000071#include <algorithm>
72#include <cassert>
73#include <cstddef>
74#include <cstdint>
75#include <iterator>
76#include <string>
77#include <utility>
78#include <vector>
Eugene Zelenkoecefe5a2016-02-02 18:20:45 +000079
Bill Wendling2f921f82009-05-15 09:23:25 +000080using namespace llvm;
81
Chandler Carruth1b9dde02014-04-22 02:02:50 +000082#define DEBUG_TYPE "dwarfdebug"
83
Eric Christopher7f2b5512013-07-23 22:16:41 +000084static cl::opt<bool>
85DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden,
86 cl::desc("Disable debug info printing"));
Devang Patel6c74a872010-04-27 19:46:33 +000087
David Blaikie038e28a2017-07-31 21:48:42 +000088static cl::opt<bool> UseDwarfRangesBaseAddressSpecifier(
89 "use-dwarf-ranges-base-address-specifier", cl::Hidden,
David Blaikiec2be8632017-08-01 14:50:50 +000090 cl::desc("Use base address specifiers in debug_ranges"), cl::init(false));
David Blaikie038e28a2017-07-31 21:48:42 +000091
Eric Christopher02dbadb2014-02-14 01:26:55 +000092static cl::opt<bool> GenerateARangeSection("generate-arange-section",
93 cl::Hidden,
94 cl::desc("Generate dwarf aranges"),
95 cl::init(false));
96
David Blaikie488393f2017-05-12 01:13:45 +000097static cl::opt<bool> SplitDwarfCrossCuReferences(
98 "split-dwarf-cross-cu-references", cl::Hidden,
99 cl::desc("Enable cross-cu references in DWO files"), cl::init(false));
100
Eric Christopherf07ee3a2014-01-27 23:50:03 +0000101enum DefaultOnOff { Default, Enable, Disable };
Eric Christopher4996c702011-11-07 09:24:32 +0000102
Paul Robinsonac7fe5e2016-12-12 20:49:11 +0000103static cl::opt<DefaultOnOff> UnknownLocations(
104 "use-unknown-locations", cl::Hidden,
105 cl::desc("Make an absence of debug location information explicit."),
106 cl::values(clEnumVal(Default, "At top of block or after label"),
107 clEnumVal(Enable, "In all cases"), clEnumVal(Disable, "Never")),
108 cl::init(Default));
109
Eric Christopher7f2b5512013-07-23 22:16:41 +0000110static cl::opt<DefaultOnOff>
111DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
112 cl::desc("Output prototype dwarf accelerator tables."),
113 cl::values(clEnumVal(Default, "Default for platform"),
114 clEnumVal(Enable, "Enabled"),
Mehdi Amini732afdd2016-10-08 19:41:06 +0000115 clEnumVal(Disable, "Disabled")),
Eric Christopher7f2b5512013-07-23 22:16:41 +0000116 cl::init(Default));
Eric Christopher20b76a72012-08-23 22:36:40 +0000117
Alexey Bataev0d6aead2018-02-20 15:28:08 +0000118static cl::opt<DefaultOnOff>
119DwarfInlinedStrings("dwarf-inlined-strings", cl::Hidden,
120 cl::desc("Use inlined strings rather than string section."),
121 cl::values(clEnumVal(Default, "Default for platform"),
122 clEnumVal(Enable, "Enabled"),
123 clEnumVal(Disable, "Disabled")),
124 cl::init(Default));
125
Alexey Bataev648ed2d2018-03-20 16:04:40 +0000126static cl::opt<bool>
127 NoDwarfPubSections("no-dwarf-pub-sections", cl::Hidden,
128 cl::desc("Disable emission of DWARF pub sections."),
129 cl::init(false));
130
Alexey Bataev858a7dd2018-03-20 20:21:38 +0000131static cl::opt<bool>
132 NoDwarfRangesSection("no-dwarf-ranges-section", cl::Hidden,
133 cl::desc("Disable emission .debug_ranges section."),
134 cl::init(false));
135
Alexey Bataevbff36082018-03-23 13:35:54 +0000136static cl::opt<DefaultOnOff> DwarfSectionsAsReferences(
137 "dwarf-sections-as-references", cl::Hidden,
138 cl::desc("Use sections+offset as references rather than labels."),
139 cl::values(clEnumVal(Default, "Default for platform"),
140 clEnumVal(Enable, "Enabled"), clEnumVal(Disable, "Disabled")),
141 cl::init(Default));
142
Paul Robinson43d1e452016-04-18 22:41:41 +0000143enum LinkageNameOption {
144 DefaultLinkageNames,
145 AllLinkageNames,
146 AbstractLinkageNames
147};
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +0000148
Paul Robinson43d1e452016-04-18 22:41:41 +0000149static cl::opt<LinkageNameOption>
150 DwarfLinkageNames("dwarf-linkage-names", cl::Hidden,
151 cl::desc("Which DWARF linkage-name attributes to emit."),
152 cl::values(clEnumValN(DefaultLinkageNames, "Default",
153 "Default for platform"),
154 clEnumValN(AllLinkageNames, "All", "All"),
155 clEnumValN(AbstractLinkageNames, "Abstract",
Mehdi Amini732afdd2016-10-08 19:41:06 +0000156 "Abstract subprograms")),
Paul Robinson43d1e452016-04-18 22:41:41 +0000157 cl::init(DefaultLinkageNames));
Paul Robinson78046b42015-08-11 21:36:45 +0000158
Matthias Braun9f15a792016-11-18 19:43:18 +0000159static const char *const DWARFGroupName = "dwarf";
160static const char *const DWARFGroupDescription = "DWARF Emission";
161static const char *const DbgTimerName = "writer";
162static const char *const DbgTimerDescription = "DWARF Debug Writer";
Bill Wendlingfcc14142010-04-07 09:28:04 +0000163
Adrian Prantla63b8e82017-03-16 17:42:45 +0000164void DebugLocDwarfExpression::emitOp(uint8_t Op, const char *Comment) {
Adrian Prantl92da14b2015-03-02 22:02:33 +0000165 BS.EmitInt8(
166 Op, Comment ? Twine(Comment) + " " + dwarf::OperationEncodingString(Op)
167 : dwarf::OperationEncodingString(Op));
168}
169
Adrian Prantla63b8e82017-03-16 17:42:45 +0000170void DebugLocDwarfExpression::emitSigned(int64_t Value) {
Adrian Prantl92da14b2015-03-02 22:02:33 +0000171 BS.EmitSLEB128(Value, Twine(Value));
172}
173
Adrian Prantla63b8e82017-03-16 17:42:45 +0000174void DebugLocDwarfExpression::emitUnsigned(uint64_t Value) {
Adrian Prantl92da14b2015-03-02 22:02:33 +0000175 BS.EmitULEB128(Value, Twine(Value));
176}
177
Peter Collingbourne96c9ae62016-05-20 19:35:17 +0000178bool DebugLocDwarfExpression::isFrameRegister(const TargetRegisterInfo &TRI,
179 unsigned MachineReg) {
Adrian Prantl92da14b2015-03-02 22:02:33 +0000180 // This information is not available while emitting .debug_loc entries.
181 return false;
182}
183
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000184bool DbgVariable::isBlockByrefVariable() const {
Duncan P. N. Exon Smithe686f152015-04-06 23:27:40 +0000185 assert(Var && "Invalid complex DbgVariable!");
Duncan P. N. Exon Smitha59d3e52016-04-23 21:08:00 +0000186 return Var->getType().resolve()->isBlockByrefStruct();
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000187}
188
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000189const DIType *DbgVariable::getType() const {
Duncan P. N. Exon Smitha59d3e52016-04-23 21:08:00 +0000190 DIType *Ty = Var->getType().resolve();
Devang Patelf20c4f72011-04-12 22:53:02 +0000191 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
192 // addresses instead.
Duncan P. N. Exon Smith571baeb2015-04-14 01:59:58 +0000193 if (Ty->isBlockByrefStruct()) {
Devang Patelf20c4f72011-04-12 22:53:02 +0000194 /* Byref variables, in Blocks, are declared by the programmer as
195 "SomeType VarName;", but the compiler creates a
196 __Block_byref_x_VarName struct, and gives the variable VarName
197 either the struct, or a pointer to the struct, as its type. This
198 is necessary for various behind-the-scenes things the compiler
199 needs to do with by-reference variables in blocks.
Eric Christopher6a841382012-11-19 22:42:10 +0000200
Devang Patelf20c4f72011-04-12 22:53:02 +0000201 However, as far as the original *programmer* is concerned, the
202 variable should still have type 'SomeType', as originally declared.
Eric Christopher6a841382012-11-19 22:42:10 +0000203
Devang Patelf20c4f72011-04-12 22:53:02 +0000204 The following function dives into the __Block_byref_x_VarName
205 struct to find the original type of the variable. This will be
206 passed back to the code generating the type for the Debug
207 Information Entry for the variable 'VarName'. 'VarName' will then
208 have the original type 'SomeType' in its debug information.
Eric Christopher6a841382012-11-19 22:42:10 +0000209
Devang Patelf20c4f72011-04-12 22:53:02 +0000210 The original type 'SomeType' will be the type of the field named
211 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher6a841382012-11-19 22:42:10 +0000212
Devang Patelf20c4f72011-04-12 22:53:02 +0000213 NOTE: In order for this to not completely fail on the debugger
214 side, the Debug Information Entry for the variable VarName needs to
215 have a DW_AT_location that tells the debugger how to unwind through
216 the pointers and __Block_byref_x_VarName struct to find the actual
217 value of the variable. The function addBlockByrefType does this. */
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000218 DIType *subType = Ty;
Duncan P. N. Exon Smithb1055642015-04-16 01:01:28 +0000219 uint16_t tag = Ty->getTag();
Eric Christopher6a841382012-11-19 22:42:10 +0000220
Eric Christopher9adc55f2013-09-04 19:53:21 +0000221 if (tag == dwarf::DW_TAG_pointer_type)
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000222 subType = resolve(cast<DIDerivedType>(Ty)->getBaseType());
Eric Christopher6a841382012-11-19 22:42:10 +0000223
Duncan P. N. Exon Smith6ac940d2015-07-24 18:17:17 +0000224 auto Elements = cast<DICompositeType>(subType)->getElements();
Duncan P. N. Exon Smith000fa2c2015-04-07 04:14:33 +0000225 for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
Duncan P. N. Exon Smith099ea1c2015-07-24 18:58:32 +0000226 auto *DT = cast<DIDerivedType>(Elements[i]);
Duncan P. N. Exon Smithb1055642015-04-16 01:01:28 +0000227 if (getName() == DT->getName())
Duncan P. N. Exon Smith848af382015-04-20 18:20:03 +0000228 return resolve(DT->getBaseType());
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000229 }
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000230 }
Devang Patelf20c4f72011-04-12 22:53:02 +0000231 return Ty;
232}
Bill Wendling2f921f82009-05-15 09:23:25 +0000233
Adrian Prantl67c24422017-02-17 19:42:32 +0000234ArrayRef<DbgVariable::FrameIndexExpr> DbgVariable::getFrameIndexExprs() const {
Adrian Prantl55030772017-03-22 16:50:16 +0000235 if (FrameIndexExprs.size() == 1)
236 return FrameIndexExprs;
237
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +0000238 assert(llvm::all_of(FrameIndexExprs,
239 [](const FrameIndexExpr &A) {
240 return A.Expr->isFragment();
241 }) &&
Adrian Prantl55030772017-03-22 16:50:16 +0000242 "multiple FI expressions without DW_OP_LLVM_fragment");
Adrian Prantl67c24422017-02-17 19:42:32 +0000243 std::sort(FrameIndexExprs.begin(), FrameIndexExprs.end(),
244 [](const FrameIndexExpr &A, const FrameIndexExpr &B) -> bool {
245 return A.Expr->getFragmentInfo()->OffsetInBits <
246 B.Expr->getFragmentInfo()->OffsetInBits;
247 });
Bjorn Steinbrinkd36bbe92017-10-10 07:46:17 +0000248
Adrian Prantl67c24422017-02-17 19:42:32 +0000249 return FrameIndexExprs;
250}
251
Bjorn Steinbrinkd36bbe92017-10-10 07:46:17 +0000252void DbgVariable::addMMIEntry(const DbgVariable &V) {
253 assert(DebugLocListIndex == ~0U && !MInsn && "not an MMI entry");
254 assert(V.DebugLocListIndex == ~0U && !V.MInsn && "not an MMI entry");
255 assert(V.Var == Var && "conflicting variable");
256 assert(V.IA == IA && "conflicting inlined-at location");
257
258 assert(!FrameIndexExprs.empty() && "Expected an MMI entry");
259 assert(!V.FrameIndexExprs.empty() && "Expected an MMI entry");
260
Daniel Jasper4d931202017-10-12 13:25:05 +0000261 // FIXME: This logic should not be necessary anymore, as we now have proper
262 // deduplication. However, without it, we currently run into the assertion
263 // below, which means that we are likely dealing with broken input, i.e. two
264 // non-fragment entries for the same variable at different frame indices.
265 if (FrameIndexExprs.size()) {
266 auto *Expr = FrameIndexExprs.back().Expr;
267 if (!Expr || !Expr->isFragment())
268 return;
269 }
270
Bjorn Steinbrinkd36bbe92017-10-10 07:46:17 +0000271 for (const auto &FIE : V.FrameIndexExprs)
272 // Ignore duplicate entries.
273 if (llvm::none_of(FrameIndexExprs, [&](const FrameIndexExpr &Other) {
274 return FIE.FI == Other.FI && FIE.Expr == Other.Expr;
275 }))
276 FrameIndexExprs.push_back(FIE);
277
278 assert((FrameIndexExprs.size() == 1 ||
279 llvm::all_of(FrameIndexExprs,
280 [](FrameIndexExpr &FIE) {
281 return FIE.Expr && FIE.Expr->isFragment();
282 })) &&
283 "conflicting locations for variable");
284}
285
Chris Lattnerf0d6bd32010-04-05 05:11:15 +0000286DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Reid Klecknerf9c275f2016-02-10 20:55:49 +0000287 : DebugHandlerBase(A), DebugLocs(A->OutStreamer->isVerboseAsm()),
288 InfoHolder(A, "info_string", DIEValueAllocator),
Frederic Riss9412d632015-03-04 02:30:17 +0000289 SkeletonHolder(A, "skel_string", DIEValueAllocator),
Pavel Labatha7c457d2018-02-19 16:12:20 +0000290 IsDarwin(A->TM.getTargetTriple().isOSDarwin()) {
Eric Christopher364dbe02016-10-01 01:50:29 +0000291 const Triple &TT = Asm->TM.getTargetTriple();
Eric Christopherad9fe892012-04-02 17:58:52 +0000292
Paul Robinson6c27a2c2015-12-16 19:58:30 +0000293 // Make sure we know our "debugger tuning." The target option takes
Paul Robinsonb9de1062015-07-15 22:04:54 +0000294 // precedence; fall back to triple-based defaults.
Paul Robinson6c27a2c2015-12-16 19:58:30 +0000295 if (Asm->TM.Options.DebuggerTuning != DebuggerKind::Default)
296 DebuggerTuning = Asm->TM.Options.DebuggerTuning;
Dimitry Andric2c364212016-01-07 22:09:12 +0000297 else if (IsDarwin)
Paul Robinsonb9de1062015-07-15 22:04:54 +0000298 DebuggerTuning = DebuggerKind::LLDB;
299 else if (TT.isPS4CPU())
300 DebuggerTuning = DebuggerKind::SCE;
301 else
302 DebuggerTuning = DebuggerKind::GDB;
303
Pavel Labath67530e42018-01-17 11:52:13 +0000304 // Turn on accelerator tables by default, if tuning for LLDB and the target is
305 // supported.
Eric Christopher574b5c82013-08-19 21:41:38 +0000306 if (DwarfAccelTables == Default)
Pavel Labath67530e42018-01-17 11:52:13 +0000307 HasDwarfAccelTables =
308 tuneForLLDB() && A->TM.getTargetTriple().isOSBinFormatMachO();
Eric Christopher574b5c82013-08-19 21:41:38 +0000309 else
Eric Christopher5297df02013-08-26 20:58:35 +0000310 HasDwarfAccelTables = DwarfAccelTables == Enable;
Eric Christopher20b76a72012-08-23 22:36:40 +0000311
Alexey Bataev0d6aead2018-02-20 15:28:08 +0000312 UseInlineStrings = DwarfInlinedStrings == Enable;
David Blaikiec53e18d2016-05-24 21:19:28 +0000313 HasAppleExtensionAttributes = tuneForLLDB();
314
David Blaikie96b1ed52017-04-21 23:35:26 +0000315 // Handle split DWARF.
316 HasSplitDwarf = !Asm->TM.Options.MCOptions.SplitDwarfFile.empty();
Eric Christopher29424312012-11-12 22:22:20 +0000317
Paul Robinson43d1e452016-04-18 22:41:41 +0000318 // SCE defaults to linkage names only for abstract subprograms.
319 if (DwarfLinkageNames == DefaultLinkageNames)
320 UseAllLinkageNames = !tuneForSCE();
Paul Robinson78046b42015-08-11 21:36:45 +0000321 else
Paul Robinson43d1e452016-04-18 22:41:41 +0000322 UseAllLinkageNames = DwarfLinkageNames == AllLinkageNames;
Paul Robinson78046b42015-08-11 21:36:45 +0000323
Eric Christopher4c5bff32014-06-19 06:22:08 +0000324 unsigned DwarfVersionNumber = Asm->TM.Options.MCOptions.DwarfVersion;
Greg Claytone6543972016-11-23 23:30:37 +0000325 unsigned DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber
Eric Christopher793c7472014-04-28 20:42:22 +0000326 : MMI->getModule()->getDwarfVersion();
Reid Kleckner12d2c122015-08-05 22:26:20 +0000327 // Use dwarf 4 by default if nothing is requested.
328 DwarfVersion = DwarfVersion ? DwarfVersion : dwarf::DWARF_VERSION;
Manman Renac8062b2013-07-02 23:40:10 +0000329
Alexey Bataev648ed2d2018-03-20 16:04:40 +0000330 UsePubSections = !NoDwarfPubSections;
Alexey Bataev858a7dd2018-03-20 20:21:38 +0000331 UseRangesSection = !NoDwarfRangesSection;
Alexey Bataev648ed2d2018-03-20 16:04:40 +0000332
Alexey Bataevbff36082018-03-23 13:35:54 +0000333 // Use sections as references.
334 UseSectionsAsReferences = DwarfSectionsAsReferences == Enable;
335
Paul Robinsonb9de1062015-07-15 22:04:54 +0000336 // Work around a GDB bug. GDB doesn't support the standard opcode;
337 // SCE doesn't support GNU's; LLDB prefers the standard opcode, which
338 // is defined as of DWARF 3.
339 // See GDB bug 11616 - DW_OP_form_tls_address is unimplemented
340 // https://sourceware.org/bugzilla/show_bug.cgi?id=11616
341 UseGNUTLSOpcode = tuneForGDB() || DwarfVersion < 3;
Paul Robinson78cc0822015-03-04 20:55:11 +0000342
Adrian Prantl6323ddf2016-05-17 21:07:16 +0000343 // GDB does not fully support the DWARF 4 representation for bitfields.
344 UseDWARF2Bitfields = (DwarfVersion < 4) || tuneForGDB();
345
Wolfgang Pieb456b5552018-01-26 18:52:58 +0000346 // The DWARF v5 string offsets table has - possibly shared - contributions
347 // from each compile and type unit each preceded by a header. The string
348 // offsets table used by the pre-DWARF v5 split-DWARF implementation uses
349 // a monolithic string offsets table without any header.
350 UseSegmentedStringOffsetsTable = DwarfVersion >= 5;
351
Lang Hames9ff69c82015-04-24 19:11:51 +0000352 Asm->OutStreamer->getContext().setDwarfVersion(DwarfVersion);
Bill Wendling2f921f82009-05-15 09:23:25 +0000353}
Bill Wendling2f921f82009-05-15 09:23:25 +0000354
Reid Klecknerdd2647e2014-04-30 20:34:31 +0000355// Define out of line so we don't have to include DwarfUnit.h in DwarfDebug.h.
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +0000356DwarfDebug::~DwarfDebug() = default;
Reid Klecknerdd2647e2014-04-30 20:34:31 +0000357
Eric Christopherd9843b32011-11-10 19:25:34 +0000358static bool isObjCClass(StringRef Name) {
359 return Name.startswith("+") || Name.startswith("-");
360}
361
362static bool hasObjCCategory(StringRef Name) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000363 if (!isObjCClass(Name))
364 return false;
Eric Christopherd9843b32011-11-10 19:25:34 +0000365
Benjamin Kramer260de742013-08-24 12:15:54 +0000366 return Name.find(") ") != StringRef::npos;
Eric Christopherd9843b32011-11-10 19:25:34 +0000367}
368
369static void getObjCClassCategory(StringRef In, StringRef &Class,
370 StringRef &Category) {
371 if (!hasObjCCategory(In)) {
372 Class = In.slice(In.find('[') + 1, In.find(' '));
373 Category = "";
374 return;
375 }
376
377 Class = In.slice(In.find('[') + 1, In.find('('));
378 Category = In.slice(In.find('[') + 1, In.find(' '));
Eric Christopherd9843b32011-11-10 19:25:34 +0000379}
380
381static StringRef getObjCMethodName(StringRef In) {
382 return In.slice(In.find(' ') + 1, In.find(']'));
383}
384
385// Add the various names to the Dwarf accelerator table names.
Eric Christopher9cd26af2013-09-20 23:22:52 +0000386// TODO: Determine whether or not we should add names for programs
387// that do not have a DW_AT_name or DW_AT_linkage_name field - this
388// is only slightly different than the lookup of non-standard ObjC names.
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000389void DwarfDebug::addSubprogramNames(const DISubprogram *SP, DIE &Die) {
Duncan P. N. Exon Smith537b4a82015-04-14 03:40:37 +0000390 if (!SP->isDefinition())
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000391 return;
Duncan P. N. Exon Smith537b4a82015-04-14 03:40:37 +0000392 addAccelName(SP->getName(), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000393
394 // If the linkage name is different than the name, go ahead and output
395 // that as well into the name table.
Duncan P. N. Exon Smith537b4a82015-04-14 03:40:37 +0000396 if (SP->getLinkageName() != "" && SP->getName() != SP->getLinkageName())
397 addAccelName(SP->getLinkageName(), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000398
399 // If this is an Objective-C selector name add it to the ObjC accelerator
400 // too.
Duncan P. N. Exon Smith537b4a82015-04-14 03:40:37 +0000401 if (isObjCClass(SP->getName())) {
Eric Christopherd9843b32011-11-10 19:25:34 +0000402 StringRef Class, Category;
Duncan P. N. Exon Smith537b4a82015-04-14 03:40:37 +0000403 getObjCClassCategory(SP->getName(), Class, Category);
David Blaikie0ee82b92014-04-24 00:53:32 +0000404 addAccelObjC(Class, Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000405 if (Category != "")
David Blaikie0ee82b92014-04-24 00:53:32 +0000406 addAccelObjC(Category, Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000407 // Also add the base method name to the name table.
Duncan P. N. Exon Smith537b4a82015-04-14 03:40:37 +0000408 addAccelName(getObjCMethodName(SP->getName()), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000409 }
410}
411
Manman Ren5b2f4b02013-09-11 19:40:28 +0000412/// Check whether we should create a DIE for the given Scope, return true
413/// if we don't create a DIE (the corresponding DIE is null).
Manman Ren2312ed32013-09-10 18:40:41 +0000414bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
415 if (Scope->isAbstractScope())
416 return false;
417
Manman Ren5b2f4b02013-09-11 19:40:28 +0000418 // We don't create a DIE if there is no Range.
Manman Ren2312ed32013-09-10 18:40:41 +0000419 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
420 if (Ranges.empty())
421 return true;
422
423 if (Ranges.size() > 1)
424 return false;
425
Manman Ren5b2f4b02013-09-11 19:40:28 +0000426 // We don't create a DIE if we have a single Range and the end label
427 // is null.
David Blaikiecd4b8a22014-08-31 02:14:26 +0000428 return !getLabelAfterInsn(Ranges.front().second);
Manman Ren2312ed32013-09-10 18:40:41 +0000429}
430
Benjamin Kramerb7d33112016-08-06 11:13:10 +0000431template <typename Func> static void forBothCUs(DwarfCompileUnit &CU, Func F) {
David Blaikie3a443c22014-11-04 22:12:25 +0000432 F(CU);
433 if (auto *SkelCU = CU.getSkeleton())
David Blaikiea01f2952016-08-24 18:29:49 +0000434 if (CU.getCUNode()->getSplitDebugInlining())
435 F(*SkelCU);
David Blaikie3a443c22014-11-04 22:12:25 +0000436}
437
David Blaikie488393f2017-05-12 01:13:45 +0000438bool DwarfDebug::shareAcrossDWOCUs() const {
439 return SplitDwarfCrossCuReferences;
440}
441
442void DwarfDebug::constructAbstractSubprogramScopeDIE(DwarfCompileUnit &SrcCU,
443 LexicalScope *Scope) {
David Blaikiee872a6e2014-04-29 15:58:35 +0000444 assert(Scope && Scope->getScopeNode());
445 assert(Scope->isAbstractScope());
446 assert(!Scope->getInlinedAt());
447
David Blaikieb4614682016-12-14 19:38:39 +0000448 auto *SP = cast<DISubprogram>(Scope->getScopeNode());
David Blaikiee872a6e2014-04-29 15:58:35 +0000449
David Blaikie1ea9db22014-05-21 23:14:12 +0000450 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
451 // was inlined from another compile unit.
Mehdi Amini41812052017-05-29 06:25:30 +0000452 if (useSplitDwarf() && !shareAcrossDWOCUs() && !SP->getUnit()->getSplitDebugInlining())
453 // Avoid building the original CU if it won't be used
454 SrcCU.constructAbstractSubprogramScopeDIE(Scope);
455 else {
456 auto &CU = getOrCreateDwarfCompileUnit(SP->getUnit());
457 if (auto *SkelCU = CU.getSkeleton()) {
458 (shareAcrossDWOCUs() ? CU : SrcCU)
459 .constructAbstractSubprogramScopeDIE(Scope);
460 if (CU.getCUNode()->getSplitDebugInlining())
461 SkelCU->constructAbstractSubprogramScopeDIE(Scope);
462 } else
463 CU.constructAbstractSubprogramScopeDIE(Scope);
David Blaikie488393f2017-05-12 01:13:45 +0000464 }
David Blaikiee872a6e2014-04-29 15:58:35 +0000465}
466
David Blaikieb3cee2f2017-05-25 18:50:28 +0000467void DwarfDebug::addGnuPubAttributes(DwarfCompileUnit &U, DIE &D) const {
Peter Collingbourneb52e2362017-09-12 21:50:41 +0000468 if (!U.hasDwarfPubSections())
David Blaikie3c842622013-12-04 21:31:26 +0000469 return;
470
David Blaikief9b6a552014-04-22 22:39:41 +0000471 U.addFlag(D, dwarf::DW_AT_GNU_pubnames);
David Blaikie3c842622013-12-04 21:31:26 +0000472}
473
Eric Christopher4287a492013-12-09 23:57:44 +0000474// Create new DwarfCompileUnit for the given metadata node with tag
Eric Christopher48fef592012-12-20 21:58:40 +0000475// DW_TAG_compile_unit.
Duncan P. N. Exon Smith2fbe1352015-04-20 22:10:08 +0000476DwarfCompileUnit &
David Blaikie07963bd2017-05-26 18:52:56 +0000477DwarfDebug::getOrCreateDwarfCompileUnit(const DICompileUnit *DIUnit) {
478 if (auto *CU = CUMap.lookup(DIUnit))
479 return *CU;
Duncan P. N. Exon Smith35ef22c2015-04-15 23:19:27 +0000480 StringRef FN = DIUnit->getFilename();
481 CompilationDir = DIUnit->getDirectory();
Bill Wendling2b128d72009-05-20 23:19:06 +0000482
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +0000483 auto OwnedUnit = llvm::make_unique<DwarfCompileUnit>(
David Blaikiebd579052014-04-28 21:14:27 +0000484 InfoHolder.getUnits().size(), DIUnit, Asm, this, &InfoHolder);
David Blaikief9b6a552014-04-22 22:39:41 +0000485 DwarfCompileUnit &NewCU = *OwnedUnit;
David Blaikie92a2f8a2014-04-28 21:04:29 +0000486 DIE &Die = NewCU.getUnitDie();
David Blaikief9b6a552014-04-22 22:39:41 +0000487 InfoHolder.addUnit(std::move(OwnedUnit));
David Blaikie0b214e42016-03-24 18:37:08 +0000488 if (useSplitDwarf()) {
David Blaikiecafd9622014-11-02 08:51:37 +0000489 NewCU.setSkeleton(constructSkeletonCU(NewCU));
David Blaikie0b214e42016-03-24 18:37:08 +0000490 NewCU.addString(Die, dwarf::DW_AT_GNU_dwo_name,
David Blaikie96b1ed52017-04-21 23:35:26 +0000491 Asm->TM.Options.MCOptions.SplitDwarfFile);
David Blaikie0b214e42016-03-24 18:37:08 +0000492 }
David Blaikief9b6a552014-04-22 22:39:41 +0000493
David Blaikie89daf772017-07-28 03:06:25 +0000494 for (auto *IE : DIUnit->getImportedEntities())
495 NewCU.addImportedEntity(IE);
496
David Blaikie7ac51492014-03-20 17:05:45 +0000497 // LTO with assembly output shares a single line table amongst multiple CUs.
498 // To avoid the compilation directory being ambiguous, let the line table
499 // explicitly describe the directory of all files, never relying on the
500 // compilation directory.
Lang Hames9ff69c82015-04-24 19:11:51 +0000501 if (!Asm->OutStreamer->hasRawTextSupport() || SingleCU)
Alexander Kornienkoe12a48b2018-03-07 16:27:44 +0000502 Asm->OutStreamer->getContext().setMCLineTableCompilationDir(
503 NewCU.getUniqueID(), CompilationDir);
David Blaikie2666e242013-12-06 19:38:46 +0000504
Eric Christopher9ea300f2017-03-29 23:34:27 +0000505 StringRef Producer = DIUnit->getProducer();
506 StringRef Flags = DIUnit->getFlags();
507 if (!Flags.empty()) {
508 std::string ProducerWithFlags = Producer.str() + " " + Flags.str();
509 NewCU.addString(Die, dwarf::DW_AT_producer, ProducerWithFlags);
510 } else
511 NewCU.addString(Die, dwarf::DW_AT_producer, Producer);
512
David Blaikie92a2f8a2014-04-28 21:04:29 +0000513 NewCU.addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
Duncan P. N. Exon Smith35ef22c2015-04-15 23:19:27 +0000514 DIUnit->getSourceLanguage());
David Blaikie92a2f8a2014-04-28 21:04:29 +0000515 NewCU.addString(Die, dwarf::DW_AT_name, FN);
Eric Christopher52ce7182013-04-09 19:23:15 +0000516
Wolfgang Pieb456b5552018-01-26 18:52:58 +0000517 // Add DW_str_offsets_base to the unit DIE, except for split units.
518 if (useSegmentedStringOffsetsTable() && !useSplitDwarf())
519 NewCU.addStringOffsetsStart();
520
Eric Christopher52ce7182013-04-09 19:23:15 +0000521 if (!useSplitDwarf()) {
Rafael Espindola063d7252015-03-10 16:58:10 +0000522 NewCU.initStmtList();
Eric Christophera51d3fc2013-09-27 22:50:48 +0000523
524 // If we're using split dwarf the compilation dir is going to be in the
525 // skeleton CU and so we don't need to duplicate it here.
526 if (!CompilationDir.empty())
David Blaikie92a2f8a2014-04-28 21:04:29 +0000527 NewCU.addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christophera51d3fc2013-09-27 22:50:48 +0000528
David Blaikie92a2f8a2014-04-28 21:04:29 +0000529 addGnuPubAttributes(NewCU, Die);
Eric Christopher52ce7182013-04-09 19:23:15 +0000530 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000531
David Blaikiec53e18d2016-05-24 21:19:28 +0000532 if (useAppleExtensionAttributes()) {
533 if (DIUnit->isOptimized())
534 NewCU.addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendling2b128d72009-05-20 23:19:06 +0000535
David Blaikiec53e18d2016-05-24 21:19:28 +0000536 StringRef Flags = DIUnit->getFlags();
537 if (!Flags.empty())
538 NewCU.addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher6a841382012-11-19 22:42:10 +0000539
David Blaikiec53e18d2016-05-24 21:19:28 +0000540 if (unsigned RVer = DIUnit->getRuntimeVersion())
541 NewCU.addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
542 dwarf::DW_FORM_data1, RVer);
543 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000544
David Blaikiecafd9622014-11-02 08:51:37 +0000545 if (useSplitDwarf())
Greg Clayton35630c32016-12-01 18:56:29 +0000546 NewCU.setSection(Asm->getObjFileLowering().getDwarfInfoDWOSection());
David Blaikiecafd9622014-11-02 08:51:37 +0000547 else
Greg Clayton35630c32016-12-01 18:56:29 +0000548 NewCU.setSection(Asm->getObjFileLowering().getDwarfInfoSection());
Eric Christopherd039baa2013-12-30 03:40:32 +0000549
Adrian Prantldeef90d2015-09-14 22:10:22 +0000550 if (DIUnit->getDWOId()) {
Adrian Prantl77fefeb2015-09-22 23:21:00 +0000551 // This CU is either a clang module DWO or a skeleton CU.
Adrian Prantldeef90d2015-09-14 22:10:22 +0000552 NewCU.addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8,
553 DIUnit->getDWOId());
Adrian Prantl77fefeb2015-09-22 23:21:00 +0000554 if (!DIUnit->getSplitDebugFilename().empty())
555 // This is a prefabricated skeleton CU.
556 NewCU.addString(Die, dwarf::DW_AT_GNU_dwo_name,
557 DIUnit->getSplitDebugFilename());
Adrian Prantldeef90d2015-09-14 22:10:22 +0000558 }
559
David Majnemer0a16c222016-08-11 21:15:00 +0000560 CUMap.insert({DIUnit, &NewCU});
561 CUDieMap.insert({&Die, &NewCU});
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000562 return NewCU;
Devang Patel1a0df9a2010-05-10 22:49:55 +0000563}
564
David Blaikie8912df12014-08-31 05:41:15 +0000565void DwarfDebug::constructAndAddImportedEntityDIE(DwarfCompileUnit &TheCU,
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000566 const DIImportedEntity *N) {
David Blaikie2195e132017-07-27 00:06:53 +0000567 if (isa<DILocalScope>(N->getScope()))
568 return;
Duncan P. N. Exon Smith60635e32015-04-21 18:44:06 +0000569 if (DIE *D = TheCU.getOrCreateContextDIE(N->getScope()))
570 D->addChild(TheCU.constructImportedEntityDIE(N));
David Blaikief55abea2013-04-22 06:12:31 +0000571}
572
Adrian Prantlbceaaa92016-12-20 02:09:43 +0000573/// Sort and unique GVEs by comparing their fragment offset.
574static SmallVectorImpl<DwarfCompileUnit::GlobalExpr> &
575sortGlobalExprs(SmallVectorImpl<DwarfCompileUnit::GlobalExpr> &GVEs) {
576 std::sort(GVEs.begin(), GVEs.end(),
577 [](DwarfCompileUnit::GlobalExpr A, DwarfCompileUnit::GlobalExpr B) {
Eli Friedman48e75492017-10-12 20:54:08 +0000578 // Sort order: first null exprs, then exprs without fragment
579 // info, then sort by fragment offset in bits.
580 // FIXME: Come up with a more comprehensive comparator so
581 // the sorting isn't non-deterministic, and so the following
582 // std::unique call works correctly.
583 if (!A.Expr || !B.Expr)
584 return !!B.Expr;
585 auto FragmentA = A.Expr->getFragmentInfo();
586 auto FragmentB = B.Expr->getFragmentInfo();
587 if (!FragmentA || !FragmentB)
588 return !!FragmentB;
589 return FragmentA->OffsetInBits < FragmentB->OffsetInBits;
Adrian Prantlbceaaa92016-12-20 02:09:43 +0000590 });
591 GVEs.erase(std::unique(GVEs.begin(), GVEs.end(),
592 [](DwarfCompileUnit::GlobalExpr A,
593 DwarfCompileUnit::GlobalExpr B) {
594 return A.Expr == B.Expr;
595 }),
596 GVEs.end());
597 return GVEs;
598}
599
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000600// Emit all Dwarf sections that should come prior to the content. Create
601// global DIEs and emit initial debug info sections. This is invoked by
602// the target AsmPrinter.
Eric Christopher58f41952012-11-19 22:42:15 +0000603void DwarfDebug::beginModule() {
Matthias Braun9f15a792016-11-18 19:43:18 +0000604 NamedRegionTimer T(DbgTimerName, DbgTimerDescription, DWARFGroupName,
605 DWARFGroupDescription, TimePassesIsEnabled);
Devang Patel6c74a872010-04-27 19:46:33 +0000606 if (DisableDebugInfoPrinting)
607 return;
608
Eric Christopher58f41952012-11-19 22:42:15 +0000609 const Module *M = MMI->getModule();
610
Peter Collingbourneb3269862016-06-01 02:58:40 +0000611 unsigned NumDebugCUs = std::distance(M->debug_compile_units_begin(),
612 M->debug_compile_units_end());
Adrian Prantl5992a722016-04-08 22:43:03 +0000613 // Tell MMI whether we have debug info.
614 MMI->setDebugInfoAvailability(NumDebugCUs > 0);
615 SingleCU = NumDebugCUs == 1;
Adrian Prantlbceaaa92016-12-20 02:09:43 +0000616 DenseMap<DIGlobalVariable *, SmallVector<DwarfCompileUnit::GlobalExpr, 1>>
617 GVMap;
Peter Collingbourned4135bb2016-09-13 01:12:59 +0000618 for (const GlobalVariable &Global : M->globals()) {
Adrian Prantlbceaaa92016-12-20 02:09:43 +0000619 SmallVector<DIGlobalVariableExpression *, 1> GVs;
Peter Collingbourned4135bb2016-09-13 01:12:59 +0000620 Global.getDebugInfo(GVs);
Adrian Prantlbceaaa92016-12-20 02:09:43 +0000621 for (auto *GVE : GVs)
622 GVMap[GVE->getVariable()].push_back({&Global, GVE->getExpression()});
Peter Collingbourned4135bb2016-09-13 01:12:59 +0000623 }
624
Wolfgang Pieb456b5552018-01-26 18:52:58 +0000625 // Create the symbol that designates the start of the unit's contribution
626 // to the string offsets table. In a split DWARF scenario, only the skeleton
627 // unit has the DW_AT_str_offsets_base attribute (and hence needs the symbol).
628 if (useSegmentedStringOffsetsTable())
629 (useSplitDwarf() ? SkeletonHolder : InfoHolder)
630 .setStringOffsetsStartSym(Asm->createTempSymbol("str_offsets_base"));
631
Adrian Prantl5992a722016-04-08 22:43:03 +0000632 for (DICompileUnit *CUNode : M->debug_compile_units()) {
David Blaikie89daf772017-07-28 03:06:25 +0000633 // FIXME: Move local imported entities into a list attached to the
634 // subprogram, then this search won't be needed and a
635 // getImportedEntities().empty() test should go below with the rest.
636 bool HasNonLocalImportedEntities = llvm::any_of(
637 CUNode->getImportedEntities(), [](const DIImportedEntity *IE) {
638 return !isa<DILocalScope>(IE->getScope());
639 });
640
641 if (!HasNonLocalImportedEntities && CUNode->getEnumTypes().empty() &&
642 CUNode->getRetainedTypes().empty() &&
643 CUNode->getGlobalVariables().empty() && CUNode->getMacros().empty())
David Blaikie07963bd2017-05-26 18:52:56 +0000644 continue;
645
646 DwarfCompileUnit &CU = getOrCreateDwarfCompileUnit(CUNode);
Adrian Prantlbceaaa92016-12-20 02:09:43 +0000647
648 // Global Variables.
Adrian Prantl2116dd32017-08-19 01:15:06 +0000649 for (auto *GVE : CUNode->getGlobalVariables()) {
650 // Don't bother adding DIGlobalVariableExpressions listed in the CU if we
651 // already know about the variable and it isn't adding a constant
652 // expression.
653 auto &GVMapEntry = GVMap[GVE->getVariable()];
654 auto *Expr = GVE->getExpression();
655 if (!GVMapEntry.size() || (Expr && Expr->isConstant()))
656 GVMapEntry.push_back({nullptr, Expr});
657 }
Adrian Prantlbceaaa92016-12-20 02:09:43 +0000658 DenseSet<DIGlobalVariable *> Processed;
659 for (auto *GVE : CUNode->getGlobalVariables()) {
660 DIGlobalVariable *GV = GVE->getVariable();
661 if (Processed.insert(GV).second)
662 CU.getOrCreateGlobalVariableDIE(GV, sortGlobalExprs(GVMap[GV]));
663 }
664
Duncan P. N. Exon Smith9928a902015-04-20 18:52:06 +0000665 for (auto *Ty : CUNode->getEnumTypes()) {
Manman Renbd1628a2014-07-28 23:04:20 +0000666 // The enum types array by design contains pointers to
667 // MDNodes rather than DIRefs. Unique them here.
Duncan P. N. Exon Smitha59d3e52016-04-23 21:08:00 +0000668 CU.getOrCreateTypeDIE(cast<DIType>(Ty));
Manman Renbd1628a2014-07-28 23:04:20 +0000669 }
Duncan P. N. Exon Smith9928a902015-04-20 18:52:06 +0000670 for (auto *Ty : CUNode->getRetainedTypes()) {
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000671 // The retained types array by design contains pointers to
672 // MDNodes rather than DIRefs. Unique them here.
Amjad Aboud72da9392016-04-30 01:44:07 +0000673 if (DIType *RT = dyn_cast<DIType>(Ty))
Adrian Prantl75819ae2016-04-15 15:57:41 +0000674 // There is no point in force-emitting a forward declaration.
675 CU.getOrCreateTypeDIE(RT);
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000676 }
David Blaikief55abea2013-04-22 06:12:31 +0000677 // Emit imported_modules last so that the relevant context is already
678 // available.
Duncan P. N. Exon Smith000fa2c2015-04-07 04:14:33 +0000679 for (auto *IE : CUNode->getImportedEntities())
Amjad Aboud72da9392016-04-30 01:44:07 +0000680 constructAndAddImportedEntityDIE(CU, IE);
David Blaikiedc69ebb2013-03-11 23:39:23 +0000681 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000682}
683
David Blaikieeb1a2722014-06-13 22:18:23 +0000684void DwarfDebug::finishVariableDefinitions() {
685 for (const auto &Var : ConcreteVariables) {
686 DIE *VariableDie = Var->getDIE();
David Blaikief73ae4f2014-08-12 00:00:31 +0000687 assert(VariableDie);
David Blaikieeb1a2722014-06-13 22:18:23 +0000688 // FIXME: Consider the time-space tradeoff of just storing the unit pointer
689 // in the ConcreteVariables list, rather than looking it up again here.
690 // DIE::getUnit isn't simple - it walks parent pointers, etc.
Greg Clayton35630c32016-12-01 18:56:29 +0000691 DwarfCompileUnit *Unit = CUDieMap.lookup(VariableDie->getUnitDie());
David Blaikieeb1a2722014-06-13 22:18:23 +0000692 assert(Unit);
David Blaikie488393f2017-05-12 01:13:45 +0000693 Unit->finishVariableDefinition(*Var);
David Blaikieeb1a2722014-06-13 22:18:23 +0000694 }
695}
696
David Blaikief7221ad2014-05-27 18:37:43 +0000697void DwarfDebug::finishSubprogramDefinitions() {
David Blaikie07963bd2017-05-26 18:52:56 +0000698 for (const DISubprogram *SP : ProcessedSPNodes) {
699 assert(SP->getUnit()->getEmissionKind() != DICompileUnit::NoDebug);
700 forBothCUs(
701 getOrCreateDwarfCompileUnit(SP->getUnit()),
702 [&](DwarfCompileUnit &CU) { CU.finishSubprogramDefinition(SP); });
703 }
Eric Christopher960ac372012-11-22 00:59:49 +0000704}
705
706void DwarfDebug::finalizeModuleInfo() {
Rafael Espindola063d7252015-03-10 16:58:10 +0000707 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
708
David Blaikie3c2fff32014-05-27 18:37:48 +0000709 finishSubprogramDefinitions();
710
David Blaikieeb1a2722014-06-13 22:18:23 +0000711 finishVariableDefinitions();
712
Mehdi Amini96ab48f2017-05-29 06:32:34 +0000713 // Include the DWO file name in the hash if there's more than one CU.
714 // This handles ThinLTO's situation where imported CUs may very easily be
715 // duplicate with the same CU partially imported into another ThinLTO unit.
716 StringRef DWOName;
717 if (CUMap.size() > 1)
718 DWOName = Asm->TM.Options.MCOptions.SplitDwarfFile;
719
Eric Christopherad10cb52013-12-04 23:24:38 +0000720 // Handle anything that needs to be done on a per-unit basis after
721 // all other generation.
David Blaikie1998a2e2014-11-01 01:11:19 +0000722 for (const auto &P : CUMap) {
723 auto &TheCU = *P.second;
Eric Christopher60eb7692013-08-12 20:27:48 +0000724 // Emit DW_AT_containing_type attribute to connect types with their
725 // vtable holding type.
David Blaikie1998a2e2014-11-01 01:11:19 +0000726 TheCU.constructContainingTypeDIEs();
Eric Christopher60eb7692013-08-12 20:27:48 +0000727
Eric Christopher46e23432013-12-20 04:16:18 +0000728 // Add CU specific attributes if we need to add any.
David Blaikie1998a2e2014-11-01 01:11:19 +0000729 // If we're splitting the dwarf out now that we've got the entire
730 // CU then add the dwo id to it.
731 auto *SkCU = TheCU.getSkeleton();
732 if (useSplitDwarf()) {
733 // Emit a unique identifier for this CU.
Mehdi Amini96ab48f2017-05-29 06:32:34 +0000734 uint64_t ID =
735 DIEHash(Asm).computeCUSignature(DWOName, TheCU.getUnitDie());
David Blaikie1998a2e2014-11-01 01:11:19 +0000736 TheCU.addUInt(TheCU.getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
737 dwarf::DW_FORM_data8, ID);
738 SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
739 dwarf::DW_FORM_data8, ID);
David Blaikie3ffe4dd2014-03-25 05:34:24 +0000740
David Blaikie1998a2e2014-11-01 01:11:19 +0000741 // We don't keep track of which addresses are used in which CU so this
742 // is a bit pessimistic under LTO.
Rafael Espindola063d7252015-03-10 16:58:10 +0000743 if (!AddrPool.isEmpty()) {
744 const MCSymbol *Sym = TLOF.getDwarfAddrSection()->getBeginSymbol();
David Blaikie1998a2e2014-11-01 01:11:19 +0000745 SkCU->addSectionLabel(SkCU->getUnitDie(), dwarf::DW_AT_GNU_addr_base,
Rafael Espindola063d7252015-03-10 16:58:10 +0000746 Sym, Sym);
747 }
748 if (!SkCU->getRangeLists().empty()) {
749 const MCSymbol *Sym = TLOF.getDwarfRangesSection()->getBeginSymbol();
David Blaikie1998a2e2014-11-01 01:11:19 +0000750 SkCU->addSectionLabel(SkCU->getUnitDie(), dwarf::DW_AT_GNU_ranges_base,
Rafael Espindola063d7252015-03-10 16:58:10 +0000751 Sym, Sym);
752 }
David Blaikie1998a2e2014-11-01 01:11:19 +0000753 }
Eric Christopherd8667202013-12-30 17:22:27 +0000754
David Blaikie1998a2e2014-11-01 01:11:19 +0000755 // If we have code split among multiple sections or non-contiguous
756 // ranges of code then emit a DW_AT_ranges attribute on the unit that will
757 // remain in the .o file, otherwise add a DW_AT_low_pc.
758 // FIXME: We should use ranges allow reordering of code ala
759 // .subsections_via_symbols in mach-o. This would mean turning on
760 // ranges for all subprogram DIEs for mach-o.
David Blaikiea8be0a72014-11-01 01:15:24 +0000761 DwarfCompileUnit &U = SkCU ? *SkCU : TheCU;
David Blaikie5b02a192014-11-03 23:10:59 +0000762 if (unsigned NumRanges = TheCU.getRanges().size()) {
Alexey Bataev858a7dd2018-03-20 20:21:38 +0000763 if (NumRanges > 1 && useRangesSection())
David Blaikie1998a2e2014-11-01 01:11:19 +0000764 // A DW_AT_low_pc attribute may also be specified in combination with
765 // DW_AT_ranges to specify the default base address for use in
766 // location lists (see Section 2.6.2) and range lists (see Section
767 // 2.17.3).
768 U.addUInt(U.getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
David Blaikie5b02a192014-11-03 23:10:59 +0000769 else
David Blaikie72d03ef2015-05-02 02:31:49 +0000770 U.setBaseAddress(TheCU.getRanges().front().getStart());
David Blaikie5b02a192014-11-03 23:10:59 +0000771 U.attachRangesOrLowHighPC(U.getUnitDie(), TheCU.takeRanges());
Eric Christopher60eb7692013-08-12 20:27:48 +0000772 }
Amjad Aboudd7cfb482016-01-07 14:28:20 +0000773
774 auto *CUNode = cast<DICompileUnit>(P.first);
Amjad Aboud8bbce8a2016-02-01 14:09:41 +0000775 // If compile Unit has macros, emit "DW_AT_macro_info" attribute.
776 if (CUNode->getMacros())
777 U.addSectionLabel(U.getUnitDie(), dwarf::DW_AT_macro_info,
778 U.getMacroLabelBegin(),
779 TLOF.getDwarfMacinfoSection()->getBeginSymbol());
Eric Christopher60eb7692013-08-12 20:27:48 +0000780 }
781
Adrian Prantl833ad372017-07-26 18:48:32 +0000782 // Emit all frontend-produced Skeleton CUs, i.e., Clang modules.
783 for (auto *CUNode : MMI->getModule()->debug_compile_units())
Adrian Prantl960e7662017-07-27 15:24:20 +0000784 if (CUNode->getDWOId())
Adrian Prantl833ad372017-07-26 18:48:32 +0000785 getOrCreateDwarfCompileUnit(CUNode);
786
Eric Christopher60eb7692013-08-12 20:27:48 +0000787 // Compute DIE offsets and sizes.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000788 InfoHolder.computeSizeAndOffsets();
789 if (useSplitDwarf())
790 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher960ac372012-11-22 00:59:49 +0000791}
792
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000793// Emit all Dwarf sections that should come after the content.
Eric Christopher960ac372012-11-22 00:59:49 +0000794void DwarfDebug::endModule() {
Craig Toppere73658d2014-04-28 04:05:08 +0000795 assert(CurFn == nullptr);
796 assert(CurMI == nullptr);
Eric Christopher960ac372012-11-22 00:59:49 +0000797
David Blaikie0dc623c2014-10-24 17:53:38 +0000798 // If we aren't actually generating debug info (check beginModule -
799 // conditionalized on !DisableDebugInfoPrinting and the presence of the
800 // llvm.dbg.cu metadata node)
Rafael Espindolaf1a13f52015-03-11 00:51:37 +0000801 if (!MMI->hasDebugInfo())
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000802 return;
Eric Christopher960ac372012-11-22 00:59:49 +0000803
Eric Christopher960ac372012-11-22 00:59:49 +0000804 // Finalize the debug info for the module.
805 finalizeModuleInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +0000806
Eric Christopher9a8f5ed2013-11-19 09:04:50 +0000807 emitDebugStr();
Eric Christopher9cd26af2013-09-20 23:22:52 +0000808
Rafael Espindola063d7252015-03-10 16:58:10 +0000809 if (useSplitDwarf())
810 emitDebugLocDWO();
811 else
812 // Emit info into a debug loc section.
813 emitDebugLoc();
814
Eric Christopher9a8f5ed2013-11-19 09:04:50 +0000815 // Corresponding abbreviations into a abbrev section.
816 emitAbbreviations();
Eric Christopher95198f502012-11-27 22:43:42 +0000817
Rafael Espindolaf1a13f52015-03-11 00:51:37 +0000818 // Emit all the DIEs into a debug info section.
819 emitDebugInfo();
820
Eric Christopher9a8f5ed2013-11-19 09:04:50 +0000821 // Emit info into a debug aranges section.
Eric Christopher02dbadb2014-02-14 01:26:55 +0000822 if (GenerateARangeSection)
823 emitDebugARanges();
Eric Christopher95198f502012-11-27 22:43:42 +0000824
Eric Christopher9a8f5ed2013-11-19 09:04:50 +0000825 // Emit info into a debug ranges section.
826 emitDebugRanges();
Eric Christopher95198f502012-11-27 22:43:42 +0000827
Amjad Aboudd7cfb482016-01-07 14:28:20 +0000828 // Emit info into a debug macinfo section.
829 emitDebugMacinfo();
830
Eric Christopher9a8f5ed2013-11-19 09:04:50 +0000831 if (useSplitDwarf()) {
832 emitDebugStrDWO();
Eric Christopher9c2ecd92012-11-30 23:59:06 +0000833 emitDebugInfoDWO();
Eric Christopher3c5a1912012-12-19 22:02:53 +0000834 emitDebugAbbrevDWO();
David Blaikie4a2f95f2014-03-18 01:17:26 +0000835 emitDebugLineDWO();
Eric Christopher962c9082013-01-15 23:56:56 +0000836 // Emit DWO addresses.
David Blaikied75fb282014-04-23 21:20:10 +0000837 AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection());
Rafael Espindola063d7252015-03-10 16:58:10 +0000838 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000839
Eric Christophera876b822012-08-23 07:32:06 +0000840 // Emit info into the dwarf accelerator table sections.
Eric Christopher20b76a72012-08-23 22:36:40 +0000841 if (useDwarfAccelTables()) {
Eric Christopher4996c702011-11-07 09:24:32 +0000842 emitAccelNames();
843 emitAccelObjC();
844 emitAccelNamespaces();
845 emitAccelTypes();
846 }
Eric Christopher6a841382012-11-19 22:42:10 +0000847
Eric Christopher4b358182013-08-30 00:40:17 +0000848 // Emit the pubnames and pubtypes sections if requested.
Peter Collingbourneb52e2362017-09-12 21:50:41 +0000849 emitDebugPubSections();
Devang Patel04d2f2d2009-11-24 01:14:22 +0000850
Devang Pateld0701282010-08-02 17:32:15 +0000851 // clean up.
David Blaikie488393f2017-05-12 01:13:45 +0000852 // FIXME: AbstractVariables.clear();
Bill Wendling2b128d72009-05-20 23:19:06 +0000853}
854
David Blaikie488393f2017-05-12 01:13:45 +0000855void DwarfDebug::ensureAbstractVariableIsCreated(DwarfCompileUnit &CU, InlinedVariable IV,
David Blaikie6f9e8672014-06-13 23:52:55 +0000856 const MDNode *ScopeNode) {
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000857 const DILocalVariable *Cleansed = nullptr;
David Blaikie488393f2017-05-12 01:13:45 +0000858 if (CU.getExistingAbstractVariable(IV, Cleansed))
David Blaikie6f9e8672014-06-13 23:52:55 +0000859 return;
David Blaikie36408e72014-06-04 23:50:52 +0000860
David Blaikie488393f2017-05-12 01:13:45 +0000861 CU.createAbstractVariable(Cleansed, LScopes.getOrCreateAbstractScope(
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000862 cast<DILocalScope>(ScopeNode)));
David Blaikie36408e72014-06-04 23:50:52 +0000863}
864
David Blaikie488393f2017-05-12 01:13:45 +0000865void DwarfDebug::ensureAbstractVariableIsCreatedIfScoped(DwarfCompileUnit &CU,
Duncan P. N. Exon Smith62e0f452015-04-15 22:29:27 +0000866 InlinedVariable IV, const MDNode *ScopeNode) {
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000867 const DILocalVariable *Cleansed = nullptr;
David Blaikie488393f2017-05-12 01:13:45 +0000868 if (CU.getExistingAbstractVariable(IV, Cleansed))
David Blaikie6f9e8672014-06-13 23:52:55 +0000869 return;
David Blaikie36408e72014-06-04 23:50:52 +0000870
Duncan P. N. Exon Smith33af7a82015-03-30 23:21:21 +0000871 if (LexicalScope *Scope =
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000872 LScopes.findAbstractScope(cast_or_null<DILocalScope>(ScopeNode)))
David Blaikie488393f2017-05-12 01:13:45 +0000873 CU.createAbstractVariable(Cleansed, Scope);
David Blaikie36408e72014-06-04 23:50:52 +0000874}
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +0000875
Matthias Braunef331ef2016-11-30 23:48:50 +0000876// Collect variable information from side table maintained by MF.
877void DwarfDebug::collectVariableInfoFromMFTable(
David Blaikie488393f2017-05-12 01:13:45 +0000878 DwarfCompileUnit &TheCU, DenseSet<InlinedVariable> &Processed) {
Adrian Prantlbe662712017-07-25 23:32:59 +0000879 SmallDenseMap<InlinedVariable, DbgVariable *> MFVars;
Matthias Braunef331ef2016-11-30 23:48:50 +0000880 for (const auto &VI : Asm->MF->getVariableDbgInfo()) {
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +0000881 if (!VI.Var)
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000882 continue;
Duncan P. N. Exon Smith78a95272015-04-16 22:12:59 +0000883 assert(VI.Var->isValidLocationForIntrinsic(VI.Loc) &&
884 "Expected inlined-at fields to agree");
885
886 InlinedVariable Var(VI.Var, VI.Loc->getInlinedAt());
Duncan P. N. Exon Smith62e0f452015-04-15 22:29:27 +0000887 Processed.insert(Var);
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +0000888 LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc);
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000889
Devang Patelcdb7d442009-11-10 23:20:04 +0000890 // If variable scope is not found then skip this variable.
Craig Topper353eda42014-04-24 06:44:33 +0000891 if (!Scope)
Devang Patelcdb7d442009-11-10 23:20:04 +0000892 continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000893
David Blaikie488393f2017-05-12 01:13:45 +0000894 ensureAbstractVariableIsCreatedIfScoped(TheCU, Var, Scope->getScopeNode());
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +0000895 auto RegVar = llvm::make_unique<DbgVariable>(Var.first, Var.second);
Duncan P. N. Exon Smithe6cc5312015-06-21 16:50:43 +0000896 RegVar->initializeMMI(VI.Expr, VI.Slot);
Adrian Prantlbe662712017-07-25 23:32:59 +0000897 if (DbgVariable *DbgVar = MFVars.lookup(Var))
898 DbgVar->addMMIEntry(*RegVar);
899 else if (InfoHolder.addScopeVariable(Scope, RegVar.get())) {
900 MFVars.insert({Var, RegVar.get()});
Adrian Prantlca7e4702015-02-10 23:18:28 +0000901 ConcreteVariables.push_back(std::move(RegVar));
Adrian Prantlbe662712017-07-25 23:32:59 +0000902 }
Devang Patel475d32a2009-10-06 01:26:37 +0000903 }
Devang Patel490c8ab2010-05-20 19:57:06 +0000904}
Devang Patela3e9c9c2010-03-15 18:33:46 +0000905
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000906// Get .debug_loc entry for the instruction range starting at MI.
Adrian Prantle19e5ef2014-04-27 18:25:40 +0000907static DebugLocEntry::Value getDebugLocValue(const MachineInstr *MI) {
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000908 const DIExpression *Expr = MI->getDebugExpression();
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000909 assert(MI->getNumOperands() == 4);
Adrian Prantl418d1d12013-07-09 20:28:37 +0000910 if (MI->getOperand(0).isReg()) {
Adrian Prantlbd6d2912017-08-02 17:19:13 +0000911 auto RegOp = MI->getOperand(0);
912 auto Op1 = MI->getOperand(1);
Adrian Prantl418d1d12013-07-09 20:28:37 +0000913 // If the second operand is an immediate, this is a
914 // register-indirect address.
Adrian Prantlbd6d2912017-08-02 17:19:13 +0000915 assert((!Op1.isImm() || (Op1.getImm() == 0)) && "unexpected offset");
916 MachineLocation MLoc(RegOp.getReg(), Op1.isImm());
Duncan P. N. Exon Smith546c8be2015-04-17 16:33:37 +0000917 return DebugLocEntry::Value(Expr, MLoc);
Devang Patel2442a892011-07-08 17:09:57 +0000918 }
919 if (MI->getOperand(0).isImm())
Duncan P. N. Exon Smith546c8be2015-04-17 16:33:37 +0000920 return DebugLocEntry::Value(Expr, MI->getOperand(0).getImm());
Devang Patel2442a892011-07-08 17:09:57 +0000921 if (MI->getOperand(0).isFPImm())
Duncan P. N. Exon Smith546c8be2015-04-17 16:33:37 +0000922 return DebugLocEntry::Value(Expr, MI->getOperand(0).getFPImm());
Devang Patel2442a892011-07-08 17:09:57 +0000923 if (MI->getOperand(0).isCImm())
Duncan P. N. Exon Smith546c8be2015-04-17 16:33:37 +0000924 return DebugLocEntry::Value(Expr, MI->getOperand(0).getCImm());
Devang Patel2442a892011-07-08 17:09:57 +0000925
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000926 llvm_unreachable("Unexpected 4-operand DBG_VALUE instruction!");
Devang Patel2442a892011-07-08 17:09:57 +0000927}
928
Adrian Prantl941fa752016-12-05 18:04:47 +0000929/// \brief If this and Next are describing different fragments of the same
Keno Fischerf8eb6a12016-01-16 01:11:33 +0000930/// variable, merge them by appending Next's values to the current
931/// list of values.
932/// Return true if the merge was successful.
933bool DebugLocEntry::MergeValues(const DebugLocEntry &Next) {
934 if (Begin == Next.Begin) {
Keno Fischer6c1e47a2016-02-03 21:13:33 +0000935 auto *FirstExpr = cast<DIExpression>(Values[0].Expression);
936 auto *FirstNextExpr = cast<DIExpression>(Next.Values[0].Expression);
Adrian Prantl941fa752016-12-05 18:04:47 +0000937 if (!FirstExpr->isFragment() || !FirstNextExpr->isFragment())
Keno Fischer6c1e47a2016-02-03 21:13:33 +0000938 return false;
939
Adrian Prantl941fa752016-12-05 18:04:47 +0000940 // We can only merge entries if none of the fragments overlap any others.
Keno Fischer6c1e47a2016-02-03 21:13:33 +0000941 // In doing so, we can take advantage of the fact that both lists are
942 // sorted.
943 for (unsigned i = 0, j = 0; i < Values.size(); ++i) {
944 for (; j < Next.Values.size(); ++j) {
Bjorn Petterssona223f8152018-03-12 18:02:39 +0000945 int res = cast<DIExpression>(Values[i].Expression)->fragmentCmp(
Reid Klecknerf9c275f2016-02-10 20:55:49 +0000946 cast<DIExpression>(Next.Values[j].Expression));
Keno Fischer6c1e47a2016-02-03 21:13:33 +0000947 if (res == 0) // The two expressions overlap, we can't merge.
948 return false;
949 // Values[i] is entirely before Next.Values[j],
950 // so go back to the next entry of Values.
951 else if (res == -1)
952 break;
953 // Next.Values[j] is entirely before Values[i], so go on to the
954 // next entry of Next.Values.
955 }
Keno Fischerf8eb6a12016-01-16 01:11:33 +0000956 }
Keno Fischer6c1e47a2016-02-03 21:13:33 +0000957
958 addValues(Next.Values);
959 End = Next.End;
960 return true;
Keno Fischerf8eb6a12016-01-16 01:11:33 +0000961 }
962 return false;
963}
964
Adrian Prantlb1416832014-08-01 22:11:58 +0000965/// Build the location list for all DBG_VALUEs in the function that
966/// describe the same variable. If the ranges of several independent
Adrian Prantl941fa752016-12-05 18:04:47 +0000967/// fragments of the same variable overlap partially, split them up and
Adrian Prantlb1416832014-08-01 22:11:58 +0000968/// combine the ranges. The resulting DebugLocEntries are will have
969/// strict monotonically increasing begin addresses and will never
970/// overlap.
971//
972// Input:
973//
Adrian Prantl941fa752016-12-05 18:04:47 +0000974// Ranges History [var, loc, fragment ofs size]
975// 0 | [x, (reg0, fragment 0, 32)]
976// 1 | | [x, (reg1, fragment 32, 32)] <- IsFragmentOfPrevEntry
Adrian Prantlb1416832014-08-01 22:11:58 +0000977// 2 | | ...
978// 3 | [clobber reg0]
Adrian Prantl941fa752016-12-05 18:04:47 +0000979// 4 [x, (mem, fragment 0, 64)] <- overlapping with both previous fragments of
Eric Christopherffc5ff32015-02-17 20:02:28 +0000980// x.
Adrian Prantlb1416832014-08-01 22:11:58 +0000981//
982// Output:
983//
Adrian Prantl941fa752016-12-05 18:04:47 +0000984// [0-1] [x, (reg0, fragment 0, 32)]
985// [1-3] [x, (reg0, fragment 0, 32), (reg1, fragment 32, 32)]
986// [3-4] [x, (reg1, fragment 32, 32)]
987// [4- ] [x, (mem, fragment 0, 64)]
David Blaikiee1a26a62014-08-05 23:14:16 +0000988void
989DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
990 const DbgValueHistoryMap::InstrRanges &Ranges) {
Adrian Prantlcaaf0532014-08-11 21:05:57 +0000991 SmallVector<DebugLocEntry::Value, 4> OpenRanges;
Adrian Prantlb1416832014-08-01 22:11:58 +0000992
993 for (auto I = Ranges.begin(), E = Ranges.end(); I != E; ++I) {
994 const MachineInstr *Begin = I->first;
995 const MachineInstr *End = I->second;
996 assert(Begin->isDebugValue() && "Invalid History entry");
997
998 // Check if a variable is inaccessible in this range.
Adrian Prantl5e1fa852014-08-12 21:55:58 +0000999 if (Begin->getNumOperands() > 1 &&
1000 Begin->getOperand(0).isReg() && !Begin->getOperand(0).getReg()) {
Adrian Prantlb1416832014-08-01 22:11:58 +00001001 OpenRanges.clear();
1002 continue;
1003 }
1004
Adrian Prantl941fa752016-12-05 18:04:47 +00001005 // If this fragment overlaps with any open ranges, truncate them.
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001006 const DIExpression *DIExpr = Begin->getDebugExpression();
David Majnemer0a16c222016-08-11 21:15:00 +00001007 auto Last = remove_if(OpenRanges, [&](DebugLocEntry::Value R) {
Bjorn Petterssona223f8152018-03-12 18:02:39 +00001008 return DIExpr->fragmentsOverlap(R.getExpression());
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001009 });
Adrian Prantlb1416832014-08-01 22:11:58 +00001010 OpenRanges.erase(Last, OpenRanges.end());
1011
1012 const MCSymbol *StartLabel = getLabelBeforeInsn(Begin);
1013 assert(StartLabel && "Forgot label before DBG_VALUE starting a range!");
1014
1015 const MCSymbol *EndLabel;
1016 if (End != nullptr)
1017 EndLabel = getLabelAfterInsn(End);
1018 else if (std::next(I) == Ranges.end())
Rafael Espindola07c03d32015-03-05 02:05:42 +00001019 EndLabel = Asm->getFunctionEnd();
Adrian Prantlb1416832014-08-01 22:11:58 +00001020 else
1021 EndLabel = getLabelBeforeInsn(std::next(I)->first);
1022 assert(EndLabel && "Forgot label after instruction ending a range!");
1023
1024 DEBUG(dbgs() << "DotDebugLoc: " << *Begin << "\n");
1025
1026 auto Value = getDebugLocValue(Begin);
David Blaikiee1a26a62014-08-05 23:14:16 +00001027 DebugLocEntry Loc(StartLabel, EndLabel, Value);
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001028 bool couldMerge = false;
1029
Adrian Prantl941fa752016-12-05 18:04:47 +00001030 // If this is a fragment, it may belong to the current DebugLocEntry.
1031 if (DIExpr->isFragment()) {
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001032 // Add this value to the list of open ranges.
Adrian Prantlcaaf0532014-08-11 21:05:57 +00001033 OpenRanges.push_back(Value);
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001034
Adrian Prantl941fa752016-12-05 18:04:47 +00001035 // Attempt to add the fragment to the last entry.
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001036 if (!DebugLoc.empty())
1037 if (DebugLoc.back().MergeValues(Loc))
1038 couldMerge = true;
1039 }
1040
1041 if (!couldMerge) {
1042 // Need to add a new DebugLocEntry. Add all values from still
Adrian Prantl941fa752016-12-05 18:04:47 +00001043 // valid non-overlapping fragments.
Adrian Prantl1c6f2ec2014-08-11 21:06:00 +00001044 if (OpenRanges.size())
1045 Loc.addValues(OpenRanges);
1046
Adrian Prantlb1416832014-08-01 22:11:58 +00001047 DebugLoc.push_back(std::move(Loc));
1048 }
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001049
1050 // Attempt to coalesce the ranges of two otherwise identical
1051 // DebugLocEntries.
1052 auto CurEntry = DebugLoc.rbegin();
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001053 DEBUG({
1054 dbgs() << CurEntry->getValues().size() << " Values:\n";
Adrian Prantl6f8c1b62015-05-26 20:06:51 +00001055 for (auto &Value : CurEntry->getValues())
Adrian Prantldba58fb2016-02-29 22:28:22 +00001056 Value.dump();
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001057 dbgs() << "-----\n";
1058 });
Adrian Prantl75707312015-05-26 20:06:48 +00001059
1060 auto PrevEntry = std::next(CurEntry);
1061 if (PrevEntry != DebugLoc.rend() && PrevEntry->MergeRanges(*CurEntry))
1062 DebugLoc.pop_back();
Adrian Prantlb1416832014-08-01 22:11:58 +00001063 }
1064}
1065
David Blaikie488393f2017-05-12 01:13:45 +00001066DbgVariable *DwarfDebug::createConcreteVariable(DwarfCompileUnit &TheCU,
1067 LexicalScope &Scope,
Duncan P. N. Exon Smithe6cc5312015-06-21 16:50:43 +00001068 InlinedVariable IV) {
David Blaikie488393f2017-05-12 01:13:45 +00001069 ensureAbstractVariableIsCreatedIfScoped(TheCU, IV, Scope.getScopeNode());
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +00001070 ConcreteVariables.push_back(
1071 llvm::make_unique<DbgVariable>(IV.first, IV.second));
Duncan P. N. Exon Smithe6cc5312015-06-21 16:50:43 +00001072 InfoHolder.addScopeVariable(&Scope, ConcreteVariables.back().get());
1073 return ConcreteVariables.back().get();
1074}
Adrian Prantlb1416832014-08-01 22:11:58 +00001075
Adrian Prantl274bcbc2017-06-16 22:40:04 +00001076/// Determine whether a *singular* DBG_VALUE is valid for the entirety of its
1077/// enclosing lexical scope. The check ensures there are no other instructions
1078/// in the same lexical scope preceding the DBG_VALUE and that its range is
1079/// either open or otherwise rolls off the end of the scope.
1080static bool validThroughout(LexicalScopes &LScopes,
1081 const MachineInstr *DbgValue,
1082 const MachineInstr *RangeEnd) {
1083 assert(DbgValue->getDebugLoc() && "DBG_VALUE without a debug location");
1084 auto MBB = DbgValue->getParent();
1085 auto DL = DbgValue->getDebugLoc();
1086 auto *LScope = LScopes.findLexicalScope(DL);
1087 // Scope doesn't exist; this is a dead DBG_VALUE.
1088 if (!LScope)
Adrian Prantlfb2add22016-02-29 19:49:46 +00001089 return false;
Adrian Prantl274bcbc2017-06-16 22:40:04 +00001090 auto &LSRange = LScope->getRanges();
1091 if (LSRange.size() == 0)
1092 return false;
1093
1094 // Determine if the DBG_VALUE is valid at the beginning of its lexical block.
1095 const MachineInstr *LScopeBegin = LSRange.front().first;
1096 // Early exit if the lexical scope begins outside of the current block.
1097 if (LScopeBegin->getParent() != MBB)
1098 return false;
1099 MachineBasicBlock::const_reverse_iterator Pred(DbgValue);
1100 for (++Pred; Pred != MBB->rend(); ++Pred) {
1101 if (Pred->getFlag(MachineInstr::FrameSetup))
1102 break;
1103 auto PredDL = Pred->getDebugLoc();
Adrian Prantl25422dc2017-06-20 21:08:52 +00001104 if (!PredDL || Pred->isMetaInstruction())
Adrian Prantl274bcbc2017-06-16 22:40:04 +00001105 continue;
1106 // Check whether the instruction preceding the DBG_VALUE is in the same
1107 // (sub)scope as the DBG_VALUE.
Adrian Prantl25422dc2017-06-20 21:08:52 +00001108 if (DL->getScope() == PredDL->getScope())
1109 return false;
1110 auto *PredScope = LScopes.findLexicalScope(PredDL);
1111 if (!PredScope || LScope->dominates(PredScope))
Adrian Prantlfb2add22016-02-29 19:49:46 +00001112 return false;
Adrian Prantl274bcbc2017-06-16 22:40:04 +00001113 }
1114
1115 // If the range of the DBG_VALUE is open-ended, report success.
1116 if (!RangeEnd)
1117 return true;
1118
1119 // Fail if there are instructions belonging to our scope in another block.
1120 const MachineInstr *LScopeEnd = LSRange.back().second;
1121 if (LScopeEnd->getParent() != MBB)
1122 return false;
1123
1124 // Single, constant DBG_VALUEs in the prologue are promoted to be live
1125 // throughout the function. This is a hack, presumably for DWARF v2 and not
1126 // necessarily correct. It would be much better to use a dbg.declare instead
1127 // if we know the constant is live throughout the scope.
1128 if (DbgValue->getOperand(0).isImm() && MBB->pred_empty())
1129 return true;
1130
1131 return false;
Adrian Prantlfb2add22016-02-29 19:49:46 +00001132}
1133
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001134// Find variables for each lexical scope.
Duncan P. N. Exon Smith2fbe1352015-04-20 22:10:08 +00001135void DwarfDebug::collectVariableInfo(DwarfCompileUnit &TheCU,
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001136 const DISubprogram *SP,
Duncan P. N. Exon Smith62e0f452015-04-15 22:29:27 +00001137 DenseSet<InlinedVariable> &Processed) {
Eric Christopher270a12c2013-07-03 21:37:03 +00001138 // Grab the variable info that was squirreled away in the MMI side-table.
David Blaikie488393f2017-05-12 01:13:45 +00001139 collectVariableInfoFromMFTable(TheCU, Processed);
Devang Patel490c8ab2010-05-20 19:57:06 +00001140
Alexey Samsonov0436caa2014-04-30 23:02:40 +00001141 for (const auto &I : DbgValues) {
Duncan P. N. Exon Smith62e0f452015-04-15 22:29:27 +00001142 InlinedVariable IV = I.first;
1143 if (Processed.count(IV))
Devang Patel490c8ab2010-05-20 19:57:06 +00001144 continue;
1145
Duncan P. N. Exon Smith62e0f452015-04-15 22:29:27 +00001146 // Instruction ranges, specifying where IV is accessible.
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001147 const auto &Ranges = I.second;
1148 if (Ranges.empty())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001149 continue;
Devang Patel9fc11702010-05-25 23:40:22 +00001150
Craig Topper353eda42014-04-24 06:44:33 +00001151 LexicalScope *Scope = nullptr;
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001152 if (const DILocation *IA = IV.second)
Duncan P. N. Exon Smith62e0f452015-04-15 22:29:27 +00001153 Scope = LScopes.findInlinedScope(IV.first->getScope(), IA);
Duncan P. N. Exon Smithb4749372015-02-17 00:02:27 +00001154 else
Duncan P. N. Exon Smith62e0f452015-04-15 22:29:27 +00001155 Scope = LScopes.findLexicalScope(IV.first->getScope());
Devang Patel490c8ab2010-05-20 19:57:06 +00001156 // If variable scope is not found then skip this variable.
Devang Patelfbd6c452010-05-21 00:10:20 +00001157 if (!Scope)
Devang Patel490c8ab2010-05-20 19:57:06 +00001158 continue;
1159
Duncan P. N. Exon Smith62e0f452015-04-15 22:29:27 +00001160 Processed.insert(IV);
David Blaikie488393f2017-05-12 01:13:45 +00001161 DbgVariable *RegVar = createConcreteVariable(TheCU, *Scope, IV);
Duncan P. N. Exon Smithe6cc5312015-06-21 16:50:43 +00001162
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001163 const MachineInstr *MInsn = Ranges.front().first;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001164 assert(MInsn->isDebugValue() && "History must begin with debug value");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001165
Adrian Prantl274bcbc2017-06-16 22:40:04 +00001166 // Check if there is a single DBG_VALUE, valid throughout the var's scope.
Adrian Prantlfb2add22016-02-29 19:49:46 +00001167 if (Ranges.size() == 1 &&
Adrian Prantl274bcbc2017-06-16 22:40:04 +00001168 validThroughout(LScopes, MInsn, Ranges.front().second)) {
Duncan P. N. Exon Smith3a73d9e2015-06-21 16:54:56 +00001169 RegVar->initializeDbgValue(MInsn);
Devang Patel9fc11702010-05-25 23:40:22 +00001170 continue;
Duncan P. N. Exon Smith3a73d9e2015-06-21 16:54:56 +00001171 }
Devang Patel9fc11702010-05-25 23:40:22 +00001172
Eric Christopher59cc0712013-01-28 17:33:26 +00001173 // Handle multiple DBG_VALUE instructions describing one variable.
Duncan P. N. Exon Smith3a73d9e2015-06-21 16:54:56 +00001174 DebugLocStream::ListBuilder List(DebugLocs, TheCU, *Asm, *RegVar, *MInsn);
Jakob Stoklund Olesen9c057ee2011-03-22 00:21:41 +00001175
Adrian Prantlb1416832014-08-01 22:11:58 +00001176 // Build the location list for this variable.
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001177 SmallVector<DebugLocEntry, 8> Entries;
1178 buildLocationList(Entries, Ranges);
Duncan P. N. Exon Smithfba25d62015-04-17 16:28:58 +00001179
Adrian Prantl693e8de2016-02-29 17:06:46 +00001180 // If the variable has a DIBasicType, extract it. Basic types cannot have
Duncan P. N. Exon Smithfba25d62015-04-17 16:28:58 +00001181 // unique identifiers, so don't bother resolving the type with the
1182 // identifier map.
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001183 const DIBasicType *BT = dyn_cast<DIBasicType>(
Duncan P. N. Exon Smithfba25d62015-04-17 16:28:58 +00001184 static_cast<const Metadata *>(IV.first->getType()));
1185
Adrian Prantl92da14b2015-03-02 22:02:33 +00001186 // Finalize the entry by lowering it into a DWARF bytestream.
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001187 for (auto &Entry : Entries)
Duncan P. N. Exon Smith3a73d9e2015-06-21 16:54:56 +00001188 Entry.finalize(*Asm, List, BT);
Devang Patela3e9c9c2010-03-15 18:33:46 +00001189 }
Devang Patele0a94bf2010-05-14 21:01:35 +00001190
1191 // Collect info for variables that were optimized out.
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001192 for (const DILocalVariable *DV : SP->getVariables()) {
Duncan P. N. Exon Smithe6cc5312015-06-21 16:50:43 +00001193 if (Processed.insert(InlinedVariable(DV, nullptr)).second)
1194 if (LexicalScope *Scope = LScopes.findLexicalScope(DV->getScope()))
David Blaikie488393f2017-05-12 01:13:45 +00001195 createConcreteVariable(TheCU, *Scope, InlinedVariable(DV, nullptr));
Devang Patele0a94bf2010-05-14 21:01:35 +00001196 }
Devang Patel9fc11702010-05-25 23:40:22 +00001197}
Devang Patele0a94bf2010-05-14 21:01:35 +00001198
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001199// Process beginning of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001200void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Reid Klecknerf9c275f2016-02-10 20:55:49 +00001201 DebugHandlerBase::beginInstruction(MI);
1202 assert(CurMI);
1203
Matthias Braunf1caa282017-12-15 22:22:58 +00001204 const auto *SP = MI->getMF()->getFunction().getSubprogram();
David Blaikie7f2b7172017-05-26 17:05:15 +00001205 if (!SP || SP->getUnit()->getEmissionKind() == DICompileUnit::NoDebug)
1206 return;
1207
Paul Robinson4fa7b57a2016-12-09 19:15:32 +00001208 // Check if source location changes, but ignore DBG_VALUE and CFI locations.
Paul Robinsonee88ed62018-02-14 17:35:52 +00001209 // If the instruction is part of the function frame setup code, do not emit
1210 // any line record, as there is no correspondence with any user code.
1211 if (MI->isMetaInstruction() || MI->getFlag(MachineInstr::FrameSetup))
Paul Robinsonf428c9b2016-11-22 19:46:51 +00001212 return;
1213 const DebugLoc &DL = MI->getDebugLoc();
Paul Robinsonac7fe5e2016-12-12 20:49:11 +00001214 // When we emit a line-0 record, we don't update PrevInstLoc; so look at
1215 // the last line number actually emitted, to see if it was line 0.
1216 unsigned LastAsmLine =
1217 Asm->OutStreamer->getContext().getCurrentDwarfLoc().getLine();
Paul Robinson96de8c72016-11-29 22:41:16 +00001218
Paul Robinsonac7fe5e2016-12-12 20:49:11 +00001219 if (DL == PrevInstLoc) {
1220 // If we have an ongoing unspecified location, nothing to do here.
1221 if (!DL)
1222 return;
1223 // We have an explicit location, same as the previous location.
1224 // But we might be coming back to it after a line 0 record.
1225 if (LastAsmLine == 0 && DL.getLine() != 0) {
1226 // Reinstate the source location but not marked as a statement.
1227 const MDNode *Scope = DL.getScope();
1228 recordSourceLine(DL.getLine(), DL.getCol(), Scope, /*Flags=*/0);
Paul Robinson37a13dd2016-11-30 22:49:55 +00001229 }
1230 return;
1231 }
1232
Paul Robinsonac7fe5e2016-12-12 20:49:11 +00001233 if (!DL) {
1234 // We have an unspecified location, which might want to be line 0.
1235 // If we have already emitted a line-0 record, don't repeat it.
1236 if (LastAsmLine == 0)
1237 return;
1238 // If user said Don't Do That, don't do that.
1239 if (UnknownLocations == Disable)
1240 return;
1241 // See if we have a reason to emit a line-0 record now.
1242 // Reasons to emit a line-0 record include:
1243 // - User asked for it (UnknownLocations).
1244 // - Instruction has a label, so it's referenced from somewhere else,
1245 // possibly debug information; we want it to have a source location.
1246 // - Instruction is at the top of a block; we don't want to inherit the
1247 // location from the physically previous (maybe unrelated) block.
1248 if (UnknownLocations == Enable || PrevLabel ||
1249 (PrevInstBB && PrevInstBB != MI->getParent())) {
Paul Robinson8fec3da2016-12-14 00:27:35 +00001250 // Preserve the file and column numbers, if we can, to save space in
1251 // the encoded line table.
Paul Robinsonac7fe5e2016-12-12 20:49:11 +00001252 // Do not update PrevInstLoc, it remembers the last non-0 line.
Paul Robinson8fec3da2016-12-14 00:27:35 +00001253 const MDNode *Scope = nullptr;
1254 unsigned Column = 0;
1255 if (PrevInstLoc) {
1256 Scope = PrevInstLoc.getScope();
1257 Column = PrevInstLoc.getCol();
1258 }
1259 recordSourceLine(/*Line=*/0, Column, Scope, /*Flags=*/0);
Paul Robinsonac7fe5e2016-12-12 20:49:11 +00001260 }
1261 return;
1262 }
1263
1264 // We have an explicit location, different from the previous location.
1265 // Don't repeat a line-0 record, but otherwise emit the new location.
1266 // (The new location might be an explicit line 0, which we do emit.)
Paul Robinson2dfb6882016-12-16 23:54:33 +00001267 if (PrevInstLoc && DL.getLine() == 0 && LastAsmLine == 0)
Paul Robinsonac7fe5e2016-12-12 20:49:11 +00001268 return;
Paul Robinsonf428c9b2016-11-22 19:46:51 +00001269 unsigned Flags = 0;
Paul Robinsonf428c9b2016-11-22 19:46:51 +00001270 if (DL == PrologEndLoc) {
1271 Flags |= DWARF2_FLAG_PROLOGUE_END | DWARF2_FLAG_IS_STMT;
1272 PrologEndLoc = DebugLoc();
1273 }
Paul Robinsonac7fe5e2016-12-12 20:49:11 +00001274 // If the line changed, we call that a new statement; unless we went to
1275 // line 0 and came back, in which case it is not a new statement.
1276 unsigned OldLine = PrevInstLoc ? PrevInstLoc.getLine() : LastAsmLine;
1277 if (DL.getLine() && DL.getLine() != OldLine)
Paul Robinsonf428c9b2016-11-22 19:46:51 +00001278 Flags |= DWARF2_FLAG_IS_STMT;
1279
1280 const MDNode *Scope = DL.getScope();
1281 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Paul Robinsonac7fe5e2016-12-12 20:49:11 +00001282
1283 // If we're not at line 0, remember this location.
1284 if (DL.getLine())
1285 PrevInstLoc = DL;
Devang Patel75cc16c2009-10-01 20:31:14 +00001286}
1287
Alexey Samsonov8a86d6d2014-05-27 22:47:41 +00001288static DebugLoc findPrologueEndLoc(const MachineFunction *MF) {
1289 // First known non-DBG_VALUE and non-frame setup location marks
1290 // the beginning of the function body.
1291 for (const auto &MBB : *MF)
1292 for (const auto &MI : MBB)
Adrian Prantlfb31da12017-05-22 20:47:09 +00001293 if (!MI.isMetaInstruction() && !MI.getFlag(MachineInstr::FrameSetup) &&
Michael Kuperstein2b3c16c2015-10-08 07:48:49 +00001294 MI.getDebugLoc())
Alexey Samsonov8a86d6d2014-05-27 22:47:41 +00001295 return MI.getDebugLoc();
1296 return DebugLoc();
1297}
1298
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001299// Gather pre-function debug information. Assumes being called immediately
1300// after the function entry point has been emitted.
David Blaikieb2fbb4b2017-02-16 18:48:33 +00001301void DwarfDebug::beginFunctionImpl(const MachineFunction *MF) {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001302 CurFn = MF;
Eric Christopherfedfa442013-11-01 23:14:17 +00001303
Matthias Braunf1caa282017-12-15 22:22:58 +00001304 auto *SP = MF->getFunction().getSubprogram();
David Blaikie2c78f182017-05-25 23:11:28 +00001305 assert(LScopes.empty() || SP == LScopes.getCurrentFunctionScope()->getScopeNode());
David Blaikie07963bd2017-05-26 18:52:56 +00001306 if (SP->getUnit()->getEmissionKind() == DICompileUnit::NoDebug)
Adrian Prantl5992a722016-04-08 22:43:03 +00001307 return;
David Blaikie07963bd2017-05-26 18:52:56 +00001308
1309 DwarfCompileUnit &CU = getOrCreateDwarfCompileUnit(SP->getUnit());
David Blaikie2c78f182017-05-25 23:11:28 +00001310
1311 // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function
1312 // belongs to so that we add to the correct per-cu line table in the
1313 // non-asm case.
Lang Hames9ff69c82015-04-24 19:11:51 +00001314 if (Asm->OutStreamer->hasRawTextSupport())
Rafael Espindolab4eec1d2014-02-05 18:00:21 +00001315 // Use a single line table if we are generating assembly.
Lang Hames9ff69c82015-04-24 19:11:51 +00001316 Asm->OutStreamer->getContext().setDwarfCompileUnitID(0);
Manman Ren9d4c7352013-05-21 00:57:22 +00001317 else
David Blaikie07963bd2017-05-26 18:52:56 +00001318 Asm->OutStreamer->getContext().setDwarfCompileUnitID(CU.getUniqueID());
Manman Ren4e042a62013-02-05 21:52:47 +00001319
Devang Patel34a66202011-05-11 19:22:19 +00001320 // Record beginning of function.
Alexey Samsonov8a86d6d2014-05-27 22:47:41 +00001321 PrologEndLoc = findPrologueEndLoc(MF);
David Blaikie2c78f182017-05-25 23:11:28 +00001322 if (PrologEndLoc) {
Saleem Abdulrasoolfc07c722015-01-24 20:19:45 +00001323 // We'd like to list the prologue as "not statements" but GDB behaves
1324 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikie2c78f182017-05-25 23:11:28 +00001325 auto *SP = PrologEndLoc->getInlinedAtScope()->getSubprogram();
Duncan P. N. Exon Smithfd07a2a2015-03-30 21:32:28 +00001326 recordSourceLine(SP->getScopeLine(), 0, SP, DWARF2_FLAG_IS_STMT);
Devang Patel34a66202011-05-11 19:22:19 +00001327 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001328}
1329
David Blaikieb2fbb4b2017-02-16 18:48:33 +00001330void DwarfDebug::skippedNonDebugFunction() {
1331 // If we don't have a subprogram for this function then there will be a hole
1332 // in the range information. Keep note of this by setting the previously used
1333 // section to nullptr.
1334 PrevCU = nullptr;
1335 CurFn = nullptr;
1336}
1337
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001338// Gather and emit post-function debug information.
David Blaikieb2fbb4b2017-02-16 18:48:33 +00001339void DwarfDebug::endFunctionImpl(const MachineFunction *MF) {
Matthias Braunf1caa282017-12-15 22:22:58 +00001340 const DISubprogram *SP = MF->getFunction().getSubprogram();
David Blaikieb2fbb4b2017-02-16 18:48:33 +00001341
David Blaikiee75f9632014-10-14 17:12:02 +00001342 assert(CurFn == MF &&
1343 "endFunction should be called with the same function as beginFunction");
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001344
Eric Christopher4287a492013-12-09 23:57:44 +00001345 // Set DwarfDwarfCompileUnitID in MCContext to default value.
Lang Hames9ff69c82015-04-24 19:11:51 +00001346 Asm->OutStreamer->getContext().setDwarfCompileUnitID(0);
Eric Christopher6a841382012-11-19 22:42:10 +00001347
Devang Patel3acc70e2011-08-15 22:04:40 +00001348 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
David Blaikie3e3eb332016-12-15 23:17:52 +00001349 assert(!FnScope || SP == FnScope->getScopeNode());
Adrian Prantl75819ae2016-04-15 15:57:41 +00001350 DwarfCompileUnit &TheCU = *CUMap.lookup(SP->getUnit());
David Blaikie263a0082014-10-23 00:06:27 +00001351
Duncan P. N. Exon Smith62e0f452015-04-15 22:29:27 +00001352 DenseSet<InlinedVariable> ProcessedVars;
David Blaikie263a0082014-10-23 00:06:27 +00001353 collectVariableInfo(TheCU, SP, ProcessedVars);
Devang Patel3acc70e2011-08-15 22:04:40 +00001354
David Blaikie3a7ce252014-09-19 17:03:16 +00001355 // Add the range of this function to the list of ranges for the CU.
Rafael Espindola07c03d32015-03-05 02:05:42 +00001356 TheCU.addRange(RangeSpan(Asm->getFunctionBegin(), Asm->getFunctionEnd()));
David Blaikie3a7ce252014-09-19 17:03:16 +00001357
1358 // Under -gmlt, skip building the subprogram if there are no inlined
Dehao Chen1ce8d6c2017-01-19 00:44:11 +00001359 // subroutines inside it. But with -fdebug-info-for-profiling, the subprogram
1360 // is still needed as we need its source location.
Dehao Chen0944a8c2017-02-01 22:45:09 +00001361 if (!TheCU.getCUNode()->getDebugInfoForProfiling() &&
Dehao Chen1ce8d6c2017-01-19 00:44:11 +00001362 TheCU.getCUNode()->getEmissionKind() == DICompileUnit::LineTablesOnly &&
David Blaikiee1c79742014-09-30 21:28:32 +00001363 LScopes.getAbstractScopesList().empty() && !IsDarwin) {
David Blaikie80e5b1e2014-10-24 17:57:34 +00001364 assert(InfoHolder.getScopeVariables().empty());
David Blaikie3a7ce252014-09-19 17:03:16 +00001365 PrevLabel = nullptr;
1366 CurFn = nullptr;
1367 return;
1368 }
1369
Adrian Prantl049d21c2014-10-13 20:44:58 +00001370#ifndef NDEBUG
1371 size_t NumAbstractScopes = LScopes.getAbstractScopesList().size();
1372#endif
Devang Patel7e623022011-08-10 20:55:27 +00001373 // Construct abstract scopes.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001374 for (LexicalScope *AScope : LScopes.getAbstractScopesList()) {
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001375 auto *SP = cast<DISubprogram>(AScope->getScopeNode());
David Blaikie4abe19e2014-05-12 18:23:35 +00001376 // Collect info for variables that were optimized out.
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001377 for (const DILocalVariable *DV : SP->getVariables()) {
Duncan P. N. Exon Smith62e0f452015-04-15 22:29:27 +00001378 if (!ProcessedVars.insert(InlinedVariable(DV, nullptr)).second)
David Blaikie4abe19e2014-05-12 18:23:35 +00001379 continue;
David Blaikie488393f2017-05-12 01:13:45 +00001380 ensureAbstractVariableIsCreated(TheCU, InlinedVariable(DV, nullptr),
Duncan P. N. Exon Smith62e0f452015-04-15 22:29:27 +00001381 DV->getScope());
Adrian Prantl049d21c2014-10-13 20:44:58 +00001382 assert(LScopes.getAbstractScopesList().size() == NumAbstractScopes
1383 && "ensureAbstractVariableIsCreated inserted abstract scopes");
Devang Patel5c0f85c2010-06-25 22:07:34 +00001384 }
David Blaikie488393f2017-05-12 01:13:45 +00001385 constructAbstractSubprogramScopeDIE(TheCU, AScope);
Bill Wendling2b128d72009-05-20 23:19:06 +00001386 }
Eric Christopher6a841382012-11-19 22:42:10 +00001387
David Blaikie38b74bf2016-12-15 23:37:38 +00001388 ProcessedSPNodes.insert(SP);
David Blaikie3e3eb332016-12-15 23:17:52 +00001389 TheCU.constructSubprogramScopeDIE(SP, FnScope);
David Blaikie3a443c22014-11-04 22:12:25 +00001390 if (auto *SkelCU = TheCU.getSkeleton())
David Blaikiea01f2952016-08-24 18:29:49 +00001391 if (!LScopes.getAbstractScopesList().empty() &&
1392 TheCU.getCUNode()->getSplitDebugInlining())
David Blaikie3e3eb332016-12-15 23:17:52 +00001393 SkelCU->constructSubprogramScopeDIE(SP, FnScope);
Devang Patel3acc70e2011-08-15 22:04:40 +00001394
Bill Wendling2b128d72009-05-20 23:19:06 +00001395 // Clear debug info
David Blaikie825bdd22014-05-21 22:41:17 +00001396 // Ownership of DbgVariables is a bit subtle - ScopeVariables owns all the
1397 // DbgVariables except those that are also in AbstractVariables (since they
1398 // can be used cross-function)
David Blaikie80e5b1e2014-10-24 17:57:34 +00001399 InfoHolder.getScopeVariables().clear();
Craig Topper353eda42014-04-24 06:44:33 +00001400 PrevLabel = nullptr;
1401 CurFn = nullptr;
Bill Wendling2b128d72009-05-20 23:19:06 +00001402}
1403
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001404// Register a source line with debug info. Returns the unique label that was
1405// emitted and which provides correspondence to the source line list.
Devang Patel34a66202011-05-11 19:22:19 +00001406void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1407 unsigned Flags) {
Devang Patel2d9caf92009-11-25 17:36:49 +00001408 StringRef Fn;
Scott Linder16c7bda2018-02-23 23:01:06 +00001409 unsigned FileNo = 1;
Diego Novillo282450d2014-03-03 18:53:17 +00001410 unsigned Discriminator = 0;
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001411 if (auto *Scope = cast_or_null<DIScope>(S)) {
Duncan P. N. Exon Smithb273d062015-04-16 01:37:00 +00001412 Fn = Scope->getFilename();
Paul Robinsonbb921372017-09-07 22:15:44 +00001413 if (Line != 0 && getDwarfVersion() >= 4)
1414 if (auto *LBF = dyn_cast<DILexicalBlockFile>(Scope))
Dehao Chen6e0c8442016-10-07 15:21:31 +00001415 Discriminator = LBF->getDiscriminator();
Dan Gohman50849c62010-05-05 23:41:32 +00001416
Lang Hames9ff69c82015-04-24 19:11:51 +00001417 unsigned CUID = Asm->OutStreamer->getContext().getDwarfCompileUnitID();
Scott Linder16c7bda2018-02-23 23:01:06 +00001418 FileNo = static_cast<DwarfCompileUnit &>(*InfoHolder.getUnits()[CUID])
Paul Robinson612e89d2018-01-12 19:17:50 +00001419 .getOrCreateSourceID(Scope->getFile());
Dan Gohman50849c62010-05-05 23:41:32 +00001420 }
Scott Linder16c7bda2018-02-23 23:01:06 +00001421 Asm->OutStreamer->EmitDwarfLocDirective(FileNo, Line, Col, Flags, 0,
Lang Hames9ff69c82015-04-24 19:11:51 +00001422 Discriminator, Fn);
Bill Wendling2b128d72009-05-20 23:19:06 +00001423}
1424
Bill Wendling806535f2009-05-20 23:22:40 +00001425//===----------------------------------------------------------------------===//
1426// Emit Methods
1427//===----------------------------------------------------------------------===//
1428
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001429// Emit the debug info section.
1430void DwarfDebug::emitDebugInfo() {
Eric Christopherf8194852013-12-05 18:06:10 +00001431 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Rafael Espindola063d7252015-03-10 16:58:10 +00001432 Holder.emitUnits(/* UseOffsets */ false);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001433}
1434
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001435// Emit the abbreviation section.
Eric Christopher38371952012-11-20 23:30:11 +00001436void DwarfDebug::emitAbbreviations() {
Eric Christopherf8194852013-12-05 18:06:10 +00001437 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
David Blaikie0504cda2013-12-05 07:43:55 +00001438
1439 Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
Eric Christopher3c5a1912012-12-19 22:02:53 +00001440}
Bill Wendling480ff322009-05-20 23:21:38 +00001441
Wolfgang Pieb456b5552018-01-26 18:52:58 +00001442void DwarfDebug::emitStringOffsetsTableHeader() {
1443 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1444 Holder.emitStringOffsetsTableHeader(
1445 Asm->getObjFileLowering().getDwarfStrOffSection());
1446}
1447
Jonas Devliegheree699dfa2018-01-29 14:52:34 +00001448template <typename AccelTableT>
1449void DwarfDebug::emitAccel(AccelTableT &Accel, MCSection *Section,
Rafael Espindola6b9998b2015-03-10 22:00:25 +00001450 StringRef TableName) {
Lang Hames9ff69c82015-04-24 19:11:51 +00001451 Asm->OutStreamer->SwitchSection(Section);
Eric Christopher4996c702011-11-07 09:24:32 +00001452
1453 // Emit the full data.
Pavel Labatha7c457d2018-02-19 16:12:20 +00001454 emitAppleAccelTable(Asm, Accel, TableName, Section->getBeginSymbol());
David Blaikie6741bb02014-09-11 21:12:48 +00001455}
1456
1457// Emit visible names into a hashed accelerator table section.
1458void DwarfDebug::emitAccelNames() {
1459 emitAccel(AccelNames, Asm->getObjFileLowering().getDwarfAccelNamesSection(),
Rafael Espindola6b9998b2015-03-10 22:00:25 +00001460 "Names");
Eric Christopher4996c702011-11-07 09:24:32 +00001461}
1462
Eric Christopher48fef592012-12-20 21:58:40 +00001463// Emit objective C classes and categories into a hashed accelerator table
1464// section.
Eric Christopher4996c702011-11-07 09:24:32 +00001465void DwarfDebug::emitAccelObjC() {
David Blaikie6741bb02014-09-11 21:12:48 +00001466 emitAccel(AccelObjC, Asm->getObjFileLowering().getDwarfAccelObjCSection(),
Rafael Espindola6b9998b2015-03-10 22:00:25 +00001467 "ObjC");
Eric Christopher4996c702011-11-07 09:24:32 +00001468}
1469
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001470// Emit namespace dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00001471void DwarfDebug::emitAccelNamespaces() {
David Blaikie6741bb02014-09-11 21:12:48 +00001472 emitAccel(AccelNamespace,
1473 Asm->getObjFileLowering().getDwarfAccelNamespaceSection(),
Rafael Espindola6b9998b2015-03-10 22:00:25 +00001474 "namespac");
Eric Christopher4996c702011-11-07 09:24:32 +00001475}
1476
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001477// Emit type dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00001478void DwarfDebug::emitAccelTypes() {
David Blaikie6741bb02014-09-11 21:12:48 +00001479 emitAccel(AccelTypes, Asm->getObjFileLowering().getDwarfAccelTypesSection(),
Rafael Espindola6b9998b2015-03-10 22:00:25 +00001480 "types");
Eric Christopher4996c702011-11-07 09:24:32 +00001481}
1482
Eric Christopherdd1a0122013-09-13 00:35:05 +00001483// Public name handling.
1484// The format for the various pubnames:
1485//
1486// dwarf pubnames - offset/name pairs where the offset is the offset into the CU
1487// for the DIE that is named.
1488//
1489// gnu pubnames - offset/index value/name tuples where the offset is the offset
1490// into the CU and the index value is computed according to the type of value
1491// for the DIE that is named.
1492//
1493// For type units the offset is the offset of the skeleton DIE. For split dwarf
1494// it's the offset within the debug_info/debug_types dwo section, however, the
1495// reference in the pubname header doesn't change.
1496
1497/// computeIndexValue - Compute the gdb index value for the DIE and CU.
Eric Christophera5a79422013-12-09 23:32:48 +00001498static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU,
Eric Christopher0fe676a2013-11-21 00:48:22 +00001499 const DIE *Die) {
David Blaikiea0e3c752017-02-03 00:44:18 +00001500 // Entities that ended up only in a Type Unit reference the CU instead (since
1501 // the pub entry has offsets within the CU there's no real offset that can be
1502 // provided anyway). As it happens all such entities (namespaces and types,
1503 // types only in C++ at that) are rendered as TYPE+EXTERNAL. If this turns out
1504 // not to be true it would be necessary to persist this information from the
1505 // point at which the entry is added to the index data structure - since by
1506 // the time the index is built from that, the original type/namespace DIE in a
1507 // type unit has already been destroyed so it can't be queried for properties
1508 // like tag, etc.
1509 if (Die->getTag() == dwarf::DW_TAG_compile_unit)
1510 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE,
1511 dwarf::GIEL_EXTERNAL);
Eric Christopherd2b497b2013-10-16 01:37:49 +00001512 dwarf::GDBIndexEntryLinkage Linkage = dwarf::GIEL_STATIC;
1513
1514 // We could have a specification DIE that has our most of our knowledge,
1515 // look for that now.
Duncan P. N. Exon Smithe7e1d0c2015-05-27 22:14:58 +00001516 if (DIEValue SpecVal = Die->findAttribute(dwarf::DW_AT_specification)) {
1517 DIE &SpecDIE = SpecVal.getDIEEntry().getEntry();
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001518 if (SpecDIE.findAttribute(dwarf::DW_AT_external))
Eric Christopherd2b497b2013-10-16 01:37:49 +00001519 Linkage = dwarf::GIEL_EXTERNAL;
1520 } else if (Die->findAttribute(dwarf::DW_AT_external))
1521 Linkage = dwarf::GIEL_EXTERNAL;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001522
1523 switch (Die->getTag()) {
1524 case dwarf::DW_TAG_class_type:
1525 case dwarf::DW_TAG_structure_type:
1526 case dwarf::DW_TAG_union_type:
1527 case dwarf::DW_TAG_enumeration_type:
Eric Christopher261d2342013-09-23 20:55:35 +00001528 return dwarf::PubIndexEntryDescriptor(
1529 dwarf::GIEK_TYPE, CU->getLanguage() != dwarf::DW_LANG_C_plus_plus
1530 ? dwarf::GIEL_STATIC
1531 : dwarf::GIEL_EXTERNAL);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001532 case dwarf::DW_TAG_typedef:
1533 case dwarf::DW_TAG_base_type:
1534 case dwarf::DW_TAG_subrange_type:
David Blaikie8dec4072013-09-19 20:40:26 +00001535 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE, dwarf::GIEL_STATIC);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001536 case dwarf::DW_TAG_namespace:
David Blaikie8dec4072013-09-19 20:40:26 +00001537 return dwarf::GIEK_TYPE;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001538 case dwarf::DW_TAG_subprogram:
Eric Christopherccac5c42013-09-23 22:59:14 +00001539 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_FUNCTION, Linkage);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001540 case dwarf::DW_TAG_variable:
Eric Christopherccac5c42013-09-23 22:59:14 +00001541 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, Linkage);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001542 case dwarf::DW_TAG_enumerator:
David Blaikie8dec4072013-09-19 20:40:26 +00001543 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE,
1544 dwarf::GIEL_STATIC);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001545 default:
David Blaikie8dec4072013-09-19 20:40:26 +00001546 return dwarf::GIEK_NONE;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001547 }
Eric Christopherdd1a0122013-09-13 00:35:05 +00001548}
1549
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001550/// emitDebugPubSections - Emit visible names and types into debug pubnames and
1551/// pubtypes sections.
1552void DwarfDebug::emitDebugPubSections() {
David Blaikiec3d9e9e2014-03-06 01:42:00 +00001553 for (const auto &NU : CUMap) {
1554 DwarfCompileUnit *TheU = NU.second;
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001555 if (!TheU->hasDwarfPubSections())
David Blaikiece2f1cb2014-03-11 23:35:06 +00001556 continue;
1557
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001558 bool GnuStyle = TheU->getCUNode()->getGnuPubnames();
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001559
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001560 Asm->OutStreamer->SwitchSection(
1561 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection()
1562 : Asm->getObjFileLowering().getDwarfPubNamesSection());
1563 emitDebugPubSection(GnuStyle, "Names", TheU, TheU->getGlobalNames());
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001564
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001565 Asm->OutStreamer->SwitchSection(
1566 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
1567 : Asm->getObjFileLowering().getDwarfPubTypesSection());
1568 emitDebugPubSection(GnuStyle, "Types", TheU, TheU->getGlobalTypes());
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001569 }
1570}
1571
Alexey Bataevbff36082018-03-23 13:35:54 +00001572void DwarfDebug::emitSectionReference(const DwarfCompileUnit &CU) {
1573 if (useSectionsAsReferences())
1574 Asm->EmitDwarfOffset(CU.getSection()->getBeginSymbol(),
1575 CU.getDebugSectionOffset());
1576 else
1577 Asm->emitDwarfSymbolReference(CU.getLabelBegin());
1578}
1579
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001580void DwarfDebug::emitDebugPubSection(bool GnuStyle, StringRef Name,
1581 DwarfCompileUnit *TheU,
1582 const StringMap<const DIE *> &Globals) {
1583 if (auto *Skeleton = TheU->getSkeleton())
1584 TheU = Skeleton;
Eric Christopher8b3737f2013-09-13 00:34:58 +00001585
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001586 // Emit the header.
1587 Asm->OutStreamer->AddComment("Length of Public " + Name + " Info");
1588 MCSymbol *BeginLabel = Asm->createTempSymbol("pub" + Name + "_begin");
1589 MCSymbol *EndLabel = Asm->createTempSymbol("pub" + Name + "_end");
1590 Asm->EmitLabelDifference(EndLabel, BeginLabel, 4);
1591
1592 Asm->OutStreamer->EmitLabel(BeginLabel);
1593
1594 Asm->OutStreamer->AddComment("DWARF Version");
1595 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
1596
1597 Asm->OutStreamer->AddComment("Offset of Compilation Unit Info");
Alexey Bataevbff36082018-03-23 13:35:54 +00001598 emitSectionReference(*TheU);
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001599
1600 Asm->OutStreamer->AddComment("Compilation Unit Length");
1601 Asm->EmitInt32(TheU->getLength());
1602
1603 // Emit the pubnames for this compilation unit.
1604 for (const auto &GI : Globals) {
1605 const char *Name = GI.getKeyData();
1606 const DIE *Entity = GI.second;
1607
1608 Asm->OutStreamer->AddComment("DIE offset");
1609 Asm->EmitInt32(Entity->getOffset());
1610
1611 if (GnuStyle) {
1612 dwarf::PubIndexEntryDescriptor Desc = computeIndexValue(TheU, Entity);
1613 Asm->OutStreamer->AddComment(
1614 Twine("Kind: ") + dwarf::GDBIndexEntryKindString(Desc.Kind) + ", " +
1615 dwarf::GDBIndexEntryLinkageString(Desc.Linkage));
1616 Asm->EmitInt8(Desc.toBits());
1617 }
1618
1619 Asm->OutStreamer->AddComment("External Name");
1620 Asm->OutStreamer->EmitBytes(StringRef(Name, GI.getKeyLength() + 1));
1621 }
1622
1623 Asm->OutStreamer->AddComment("End Mark");
1624 Asm->EmitInt32(0);
1625 Asm->OutStreamer->EmitLabel(EndLabel);
Devang Patel04d2f2d2009-11-24 01:14:22 +00001626}
1627
Amjad Aboudc0778412016-01-24 08:18:55 +00001628/// Emit null-terminated strings into a debug str section.
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001629void DwarfDebug::emitDebugStr() {
Wolfgang Pieb456b5552018-01-26 18:52:58 +00001630 MCSection *StringOffsetsSection = nullptr;
1631 if (useSegmentedStringOffsetsTable()) {
1632 emitStringOffsetsTableHeader();
1633 StringOffsetsSection = Asm->getObjFileLowering().getDwarfStrOffSection();
1634 }
Eric Christopherf8194852013-12-05 18:06:10 +00001635 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Wolfgang Pieb456b5552018-01-26 18:52:58 +00001636 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection(),
1637 StringOffsetsSection, /* UseRelativeOffsets = */ true);
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001638}
1639
Eric Christopher29e874d2014-03-07 22:40:37 +00001640void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer,
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001641 const DebugLocStream::Entry &Entry) {
1642 auto &&Comments = DebugLocs.getComments(Entry);
1643 auto Comment = Comments.begin();
1644 auto End = Comments.end();
1645 for (uint8_t Byte : DebugLocs.getBytes(Entry))
Adrian Prantl92da14b2015-03-02 22:02:33 +00001646 Streamer.EmitInt8(Byte, Comment != End ? *(Comment++) : "");
Adrian Prantlb1416832014-08-01 22:11:58 +00001647}
1648
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001649static void emitDebugLocValue(const AsmPrinter &AP, const DIBasicType *BT,
Adrian Prantl92da14b2015-03-02 22:02:33 +00001650 ByteStreamer &Streamer,
1651 const DebugLocEntry::Value &Value,
Adrian Prantl8fafb8d2016-12-09 20:43:40 +00001652 DwarfExpression &DwarfExpr) {
Adrian Prantl956484b2017-03-20 21:35:09 +00001653 auto *DIExpr = Value.getExpression();
1654 DIExpressionCursor ExprCursor(DIExpr);
1655 DwarfExpr.addFragmentOffset(DIExpr);
Adrian Prantlb1416832014-08-01 22:11:58 +00001656 // Regular entry.
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001657 if (Value.isInt()) {
Duncan P. N. Exon Smithfba25d62015-04-17 16:28:58 +00001658 if (BT && (BT->getEncoding() == dwarf::DW_ATE_signed ||
1659 BT->getEncoding() == dwarf::DW_ATE_signed_char))
Adrian Prantla63b8e82017-03-16 17:42:45 +00001660 DwarfExpr.addSignedConstant(Value.getInt());
Adrian Prantl66f25952015-01-13 00:04:06 +00001661 else
Adrian Prantla63b8e82017-03-16 17:42:45 +00001662 DwarfExpr.addUnsignedConstant(Value.getInt());
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001663 } else if (Value.isLocation()) {
Adrian Prantl956484b2017-03-20 21:35:09 +00001664 MachineLocation Location = Value.getLoc();
Adrian Prantlc12cee32017-04-19 23:42:25 +00001665 if (Location.isIndirect())
1666 DwarfExpr.setMemoryLocationKind();
Adrian Prantl2049c0d2017-08-02 15:22:17 +00001667 DIExpressionCursor Cursor(DIExpr);
Adrian Prantl8fafb8d2016-12-09 20:43:40 +00001668 const TargetRegisterInfo &TRI = *AP.MF->getSubtarget().getRegisterInfo();
Adrian Prantlc12cee32017-04-19 23:42:25 +00001669 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg()))
Adrian Prantl956484b2017-03-20 21:35:09 +00001670 return;
1671 return DwarfExpr.addExpression(std::move(Cursor));
Adrian Prantl3e9c8872016-04-08 00:38:37 +00001672 } else if (Value.isConstantFP()) {
1673 APInt RawBytes = Value.getConstantFP()->getValueAPF().bitcastToAPInt();
Adrian Prantla63b8e82017-03-16 17:42:45 +00001674 DwarfExpr.addUnsignedConstant(RawBytes);
Eric Christopher29e874d2014-03-07 22:40:37 +00001675 }
Adrian Prantla63b8e82017-03-16 17:42:45 +00001676 DwarfExpr.addExpression(std::move(ExprCursor));
Eric Christopher29e874d2014-03-07 22:40:37 +00001677}
1678
Duncan P. N. Exon Smith3a73d9e2015-06-21 16:54:56 +00001679void DebugLocEntry::finalize(const AsmPrinter &AP,
1680 DebugLocStream::ListBuilder &List,
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001681 const DIBasicType *BT) {
Duncan P. N. Exon Smith3a73d9e2015-06-21 16:54:56 +00001682 DebugLocStream::EntryBuilder Entry(List, Begin, End);
1683 BufferByteStreamer Streamer = Entry.getStreamer();
Adrian Prantl8fafb8d2016-12-09 20:43:40 +00001684 DebugLocDwarfExpression DwarfExpr(AP.getDwarfVersion(), Streamer);
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001685 const DebugLocEntry::Value &Value = Values[0];
Adrian Prantl941fa752016-12-05 18:04:47 +00001686 if (Value.isFragment()) {
1687 // Emit all fragments that belong to the same variable and range.
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +00001688 assert(llvm::all_of(Values, [](DebugLocEntry::Value P) {
Adrian Prantl941fa752016-12-05 18:04:47 +00001689 return P.isFragment();
1690 }) && "all values are expected to be fragments");
Adrian Prantl92da14b2015-03-02 22:02:33 +00001691 assert(std::is_sorted(Values.begin(), Values.end()) &&
Adrian Prantl941fa752016-12-05 18:04:47 +00001692 "fragments are expected to be sorted");
Duncan P. N. Exon Smithc82570b2015-04-13 18:53:11 +00001693
Adrian Prantl8fafb8d2016-12-09 20:43:40 +00001694 for (auto Fragment : Values)
1695 emitDebugLocValue(AP, BT, Streamer, Fragment, DwarfExpr);
1696
Adrian Prantl92da14b2015-03-02 22:02:33 +00001697 } else {
Adrian Prantl941fa752016-12-05 18:04:47 +00001698 assert(Values.size() == 1 && "only fragments may have >1 value");
Adrian Prantl8fafb8d2016-12-09 20:43:40 +00001699 emitDebugLocValue(AP, BT, Streamer, Value, DwarfExpr);
Adrian Prantl92da14b2015-03-02 22:02:33 +00001700 }
Adrian Prantl8fafb8d2016-12-09 20:43:40 +00001701 DwarfExpr.finalize();
Adrian Prantl92da14b2015-03-02 22:02:33 +00001702}
1703
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001704void DwarfDebug::emitDebugLocEntryLocation(const DebugLocStream::Entry &Entry) {
Duncan P. N. Exon Smith653c1092015-05-06 19:11:20 +00001705 // Emit the size.
Lang Hames9ff69c82015-04-24 19:11:51 +00001706 Asm->OutStreamer->AddComment("Loc expr size");
Duncan P. N. Exon Smith653c1092015-05-06 19:11:20 +00001707 Asm->EmitInt16(DebugLocs.getBytes(Entry).size());
1708
David Blaikie0e84adc2014-04-01 16:17:41 +00001709 // Emit the entry.
1710 APByteStreamer Streamer(*Asm);
1711 emitDebugLocEntry(Streamer, Entry);
David Blaikie0e84adc2014-04-01 16:17:41 +00001712}
1713
Eric Christopher9046f942013-07-02 21:36:07 +00001714// Emit locations into the debug loc section.
Devang Patel930143b2009-11-21 02:48:08 +00001715void DwarfDebug::emitDebugLoc() {
David Blaikie07963bd2017-05-26 18:52:56 +00001716 if (DebugLocs.getLists().empty())
1717 return;
1718
Daniel Dunbarfd95b012011-03-16 22:16:39 +00001719 // Start the dwarf loc section.
Lang Hames9ff69c82015-04-24 19:11:51 +00001720 Asm->OutStreamer->SwitchSection(
David Blaikie94c1d7f2014-04-02 01:50:20 +00001721 Asm->getObjFileLowering().getDwarfLocSection());
Konstantin Zhuravlyovdc77b2e2017-04-17 17:41:25 +00001722 unsigned char Size = Asm->MAI->getCodePointerSize();
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001723 for (const auto &List : DebugLocs.getLists()) {
Lang Hames9ff69c82015-04-24 19:11:51 +00001724 Asm->OutStreamer->EmitLabel(List.Label);
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001725 const DwarfCompileUnit *CU = List.CU;
1726 for (const auto &Entry : DebugLocs.getEntries(List)) {
Eric Christopher384f3fe2014-03-20 19:16:16 +00001727 // Set up the range. This range is relative to the entry point of the
1728 // compile unit. This is a hard coded 0 for low_pc when we're emitting
1729 // ranges, or the DW_AT_low_pc on the compile unit otherwise.
David Blaikiece343492014-11-03 21:15:30 +00001730 if (auto *Base = CU->getBaseAddress()) {
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001731 Asm->EmitLabelDifference(Entry.BeginSym, Base, Size);
1732 Asm->EmitLabelDifference(Entry.EndSym, Base, Size);
Eric Christopher384f3fe2014-03-20 19:16:16 +00001733 } else {
Lang Hames9ff69c82015-04-24 19:11:51 +00001734 Asm->OutStreamer->EmitSymbolValue(Entry.BeginSym, Size);
1735 Asm->OutStreamer->EmitSymbolValue(Entry.EndSym, Size);
Eric Christopher384f3fe2014-03-20 19:16:16 +00001736 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00001737
David Blaikie0e84adc2014-04-01 16:17:41 +00001738 emitDebugLocEntryLocation(Entry);
Devang Patel9fc11702010-05-25 23:40:22 +00001739 }
Lang Hames9ff69c82015-04-24 19:11:51 +00001740 Asm->OutStreamer->EmitIntValue(0, Size);
1741 Asm->OutStreamer->EmitIntValue(0, Size);
David Blaikie94c1d7f2014-04-02 01:50:20 +00001742 }
1743}
1744
1745void DwarfDebug::emitDebugLocDWO() {
Lang Hames9ff69c82015-04-24 19:11:51 +00001746 Asm->OutStreamer->SwitchSection(
David Blaikie94c1d7f2014-04-02 01:50:20 +00001747 Asm->getObjFileLowering().getDwarfLocDWOSection());
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001748 for (const auto &List : DebugLocs.getLists()) {
Lang Hames9ff69c82015-04-24 19:11:51 +00001749 Asm->OutStreamer->EmitLabel(List.Label);
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001750 for (const auto &Entry : DebugLocs.getEntries(List)) {
David Blaikie94c1d7f2014-04-02 01:50:20 +00001751 // Just always use start_length for now - at least that's one address
1752 // rather than two. We could get fancier and try to, say, reuse an
1753 // address we know we've emitted elsewhere (the start of the function?
1754 // The start of the CU or CU subrange that encloses this range?)
Adrian Prantlc4fbbcf2016-10-28 17:59:50 +00001755 Asm->EmitInt8(dwarf::DW_LLE_startx_length);
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001756 unsigned idx = AddrPool.getIndex(Entry.BeginSym);
David Blaikie94c1d7f2014-04-02 01:50:20 +00001757 Asm->EmitULEB128(idx);
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001758 Asm->EmitLabelDifference(Entry.EndSym, Entry.BeginSym, 4);
David Blaikie94c1d7f2014-04-02 01:50:20 +00001759
1760 emitDebugLocEntryLocation(Entry);
David Blaikie9c550ac2014-03-25 01:44:02 +00001761 }
Adrian Prantlc4fbbcf2016-10-28 17:59:50 +00001762 Asm->EmitInt8(dwarf::DW_LLE_end_of_list);
Devang Patel9fc11702010-05-25 23:40:22 +00001763 }
Bill Wendling480ff322009-05-20 23:21:38 +00001764}
1765
Richard Mitton21101b32013-09-19 23:21:01 +00001766struct ArangeSpan {
1767 const MCSymbol *Start, *End;
1768};
1769
1770// Emit a debug aranges section, containing a CU lookup for any
1771// address we can tie back to a CU.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001772void DwarfDebug::emitDebugARanges() {
Rafael Espindolae8fd00d2015-02-26 22:02:02 +00001773 // Provides a unique id per text section.
Rafael Espindola0709a7b2015-05-21 19:20:38 +00001774 MapVector<MCSection *, SmallVector<SymbolCU, 8>> SectionMap;
Richard Mitton21101b32013-09-19 23:21:01 +00001775
Rafael Espindolae8fd00d2015-02-26 22:02:02 +00001776 // Filter labels by section.
1777 for (const SymbolCU &SCU : ArangeLabels) {
1778 if (SCU.Sym->isInSection()) {
1779 // Make a note of this symbol and it's section.
Rafael Espindola0709a7b2015-05-21 19:20:38 +00001780 MCSection *Section = &SCU.Sym->getSection();
Rafael Espindolae8fd00d2015-02-26 22:02:02 +00001781 if (!Section->getKind().isMetadata())
1782 SectionMap[Section].push_back(SCU);
1783 } else {
1784 // Some symbols (e.g. common/bss on mach-o) can have no section but still
1785 // appear in the output. This sucks as we rely on sections to build
1786 // arange spans. We can do it without, but it's icky.
1787 SectionMap[nullptr].push_back(SCU);
1788 }
1789 }
Richard Mitton21101b32013-09-19 23:21:01 +00001790
Rafael Espindolae8fd00d2015-02-26 22:02:02 +00001791 DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan>> Spans;
1792
Rafael Espindola4f4ef152015-03-09 22:08:37 +00001793 for (auto &I : SectionMap) {
Rafael Espindola78d947b2016-05-20 00:38:28 +00001794 MCSection *Section = I.first;
Rafael Espindola4f4ef152015-03-09 22:08:37 +00001795 SmallVector<SymbolCU, 8> &List = I.second;
Rafael Espindola78d947b2016-05-20 00:38:28 +00001796 if (List.size() < 1)
Richard Mitton21101b32013-09-19 23:21:01 +00001797 continue;
1798
Rafael Espindola6ffb1d72015-02-02 19:22:51 +00001799 // If we have no section (e.g. common), just write out
1800 // individual spans for each symbol.
1801 if (!Section) {
1802 for (const SymbolCU &Cur : List) {
1803 ArangeSpan Span;
1804 Span.Start = Cur.Sym;
1805 Span.End = nullptr;
Rafael Espindola78d947b2016-05-20 00:38:28 +00001806 assert(Cur.CU);
1807 Spans[Cur.CU].push_back(Span);
Rafael Espindola6ffb1d72015-02-02 19:22:51 +00001808 }
1809 continue;
1810 }
1811
Richard Mitton21101b32013-09-19 23:21:01 +00001812 // Sort the symbols by offset within the section.
Mandeep Singh Grang46d02de2018-02-25 19:52:34 +00001813 std::stable_sort(
Rafael Espindola0a78f8c2016-05-19 23:17:37 +00001814 List.begin(), List.end(), [&](const SymbolCU &A, const SymbolCU &B) {
1815 unsigned IA = A.Sym ? Asm->OutStreamer->GetSymbolOrder(A.Sym) : 0;
1816 unsigned IB = B.Sym ? Asm->OutStreamer->GetSymbolOrder(B.Sym) : 0;
Benjamin Kramer571e2fe2014-03-07 19:41:22 +00001817
Rafael Espindola0a78f8c2016-05-19 23:17:37 +00001818 // Symbols with no order assigned should be placed at the end.
1819 // (e.g. section end labels)
1820 if (IA == 0)
1821 return false;
1822 if (IB == 0)
1823 return true;
1824 return IA < IB;
1825 });
Richard Mitton21101b32013-09-19 23:21:01 +00001826
Rafael Espindola78d947b2016-05-20 00:38:28 +00001827 // Insert a final terminator.
1828 List.push_back(SymbolCU(nullptr, Asm->OutStreamer->endSection(Section)));
1829
Rafael Espindola6ffb1d72015-02-02 19:22:51 +00001830 // Build spans between each label.
1831 const MCSymbol *StartSym = List[0].Sym;
1832 for (size_t n = 1, e = List.size(); n < e; n++) {
1833 const SymbolCU &Prev = List[n - 1];
1834 const SymbolCU &Cur = List[n];
Richard Mitton21101b32013-09-19 23:21:01 +00001835
Rafael Espindola6ffb1d72015-02-02 19:22:51 +00001836 // Try and build the longest span we can within the same CU.
1837 if (Cur.CU != Prev.CU) {
1838 ArangeSpan Span;
1839 Span.Start = StartSym;
1840 Span.End = Cur.Sym;
Rafael Espindola78d947b2016-05-20 00:38:28 +00001841 assert(Prev.CU);
Rafael Espindola6ffb1d72015-02-02 19:22:51 +00001842 Spans[Prev.CU].push_back(Span);
1843 StartSym = Cur.Sym;
Richard Mitton21101b32013-09-19 23:21:01 +00001844 }
1845 }
1846 }
1847
Rafael Espindolae8fd00d2015-02-26 22:02:02 +00001848 // Start the dwarf aranges section.
Lang Hames9ff69c82015-04-24 19:11:51 +00001849 Asm->OutStreamer->SwitchSection(
Rafael Espindolae8fd00d2015-02-26 22:02:02 +00001850 Asm->getObjFileLowering().getDwarfARangesSection());
1851
Konstantin Zhuravlyovdc77b2e2017-04-17 17:41:25 +00001852 unsigned PtrSize = Asm->MAI->getCodePointerSize();
Richard Mitton21101b32013-09-19 23:21:01 +00001853
1854 // Build a list of CUs used.
Eric Christopher4287a492013-12-09 23:57:44 +00001855 std::vector<DwarfCompileUnit *> CUs;
Benjamin Kramer15596c72014-03-07 19:09:39 +00001856 for (const auto &it : Spans) {
1857 DwarfCompileUnit *CU = it.first;
Richard Mitton21101b32013-09-19 23:21:01 +00001858 CUs.push_back(CU);
1859 }
1860
1861 // Sort the CU list (again, to ensure consistent output order).
Peter Collingbourne7c384cc2016-02-11 19:57:46 +00001862 std::sort(CUs.begin(), CUs.end(),
1863 [](const DwarfCompileUnit *A, const DwarfCompileUnit *B) {
1864 return A->getUniqueID() < B->getUniqueID();
1865 });
Richard Mitton21101b32013-09-19 23:21:01 +00001866
1867 // Emit an arange table for each CU we used.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001868 for (DwarfCompileUnit *CU : CUs) {
Richard Mitton21101b32013-09-19 23:21:01 +00001869 std::vector<ArangeSpan> &List = Spans[CU];
1870
David Blaikie27e35f22014-11-02 01:21:43 +00001871 // Describe the skeleton CU's offset and length, not the dwo file's.
1872 if (auto *Skel = CU->getSkeleton())
1873 CU = Skel;
1874
Richard Mitton21101b32013-09-19 23:21:01 +00001875 // Emit size of content not including length itself.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001876 unsigned ContentSize =
1877 sizeof(int16_t) + // DWARF ARange version number
1878 sizeof(int32_t) + // Offset of CU in the .debug_info section
1879 sizeof(int8_t) + // Pointer Size (in bytes)
1880 sizeof(int8_t); // Segment Size (in bytes)
Richard Mitton21101b32013-09-19 23:21:01 +00001881
1882 unsigned TupleSize = PtrSize * 2;
1883
1884 // 7.20 in the Dwarf specs requires the table to be aligned to a tuple.
Benjamin Kramer8a68ab32014-01-07 19:28:14 +00001885 unsigned Padding =
1886 OffsetToAlignment(sizeof(int32_t) + ContentSize, TupleSize);
Richard Mitton21101b32013-09-19 23:21:01 +00001887
1888 ContentSize += Padding;
1889 ContentSize += (List.size() + 1) * TupleSize;
1890
1891 // For each compile unit, write the list of spans it covers.
Lang Hames9ff69c82015-04-24 19:11:51 +00001892 Asm->OutStreamer->AddComment("Length of ARange Set");
Richard Mitton21101b32013-09-19 23:21:01 +00001893 Asm->EmitInt32(ContentSize);
Lang Hames9ff69c82015-04-24 19:11:51 +00001894 Asm->OutStreamer->AddComment("DWARF Arange version number");
Richard Mitton21101b32013-09-19 23:21:01 +00001895 Asm->EmitInt16(dwarf::DW_ARANGES_VERSION);
Lang Hames9ff69c82015-04-24 19:11:51 +00001896 Asm->OutStreamer->AddComment("Offset Into Debug Info Section");
Alexey Bataevbff36082018-03-23 13:35:54 +00001897 emitSectionReference(*CU);
Lang Hames9ff69c82015-04-24 19:11:51 +00001898 Asm->OutStreamer->AddComment("Address Size (in bytes)");
Richard Mitton21101b32013-09-19 23:21:01 +00001899 Asm->EmitInt8(PtrSize);
Lang Hames9ff69c82015-04-24 19:11:51 +00001900 Asm->OutStreamer->AddComment("Segment Size (in bytes)");
Richard Mitton21101b32013-09-19 23:21:01 +00001901 Asm->EmitInt8(0);
1902
Petr Hosekfaef3202016-06-01 01:59:58 +00001903 Asm->OutStreamer->emitFill(Padding, 0xff);
Richard Mitton21101b32013-09-19 23:21:01 +00001904
Benjamin Kramer15596c72014-03-07 19:09:39 +00001905 for (const ArangeSpan &Span : List) {
Richard Mitton21101b32013-09-19 23:21:01 +00001906 Asm->EmitLabelReference(Span.Start, PtrSize);
1907
1908 // Calculate the size as being from the span start to it's end.
Richard Mitton089ed892013-09-23 17:56:20 +00001909 if (Span.End) {
Richard Mitton21101b32013-09-19 23:21:01 +00001910 Asm->EmitLabelDifference(Span.End, Span.Start, PtrSize);
Richard Mitton089ed892013-09-23 17:56:20 +00001911 } else {
1912 // For symbols without an end marker (e.g. common), we
1913 // write a single arange entry containing just that one symbol.
1914 uint64_t Size = SymSize[Span.Start];
1915 if (Size == 0)
1916 Size = 1;
1917
Lang Hames9ff69c82015-04-24 19:11:51 +00001918 Asm->OutStreamer->EmitIntValue(Size, PtrSize);
Richard Mitton089ed892013-09-23 17:56:20 +00001919 }
Richard Mitton21101b32013-09-19 23:21:01 +00001920 }
1921
Lang Hames9ff69c82015-04-24 19:11:51 +00001922 Asm->OutStreamer->AddComment("ARange terminator");
1923 Asm->OutStreamer->EmitIntValue(0, PtrSize);
1924 Asm->OutStreamer->EmitIntValue(0, PtrSize);
Richard Mitton21101b32013-09-19 23:21:01 +00001925 }
Bill Wendling480ff322009-05-20 23:21:38 +00001926}
1927
Amjad Aboudc0778412016-01-24 08:18:55 +00001928/// Emit address ranges into a debug ranges section.
Devang Patel930143b2009-11-21 02:48:08 +00001929void DwarfDebug::emitDebugRanges() {
David Blaikie07963bd2017-05-26 18:52:56 +00001930 if (CUMap.empty())
1931 return;
1932
Alexey Bataev858a7dd2018-03-20 20:21:38 +00001933 if (!useRangesSection()) {
1934 assert(llvm::all_of(
1935 CUMap,
1936 [](const decltype(CUMap)::const_iterator::value_type &Pair) {
1937 return Pair.second->getRangeLists().empty();
1938 }) &&
1939 "No debug ranges expected.");
1940 return;
1941 }
1942
Bill Wendling480ff322009-05-20 23:21:38 +00001943 // Start the dwarf ranges section.
Lang Hames9ff69c82015-04-24 19:11:51 +00001944 Asm->OutStreamer->SwitchSection(
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001945 Asm->getObjFileLowering().getDwarfRangesSection());
Eric Christopher4751d702013-11-23 00:05:29 +00001946
Eric Christopher0f63d062013-12-03 00:45:45 +00001947 // Size for our labels.
Konstantin Zhuravlyovdc77b2e2017-04-17 17:41:25 +00001948 unsigned char Size = Asm->MAI->getCodePointerSize();
Eric Christopher0f63d062013-12-03 00:45:45 +00001949
1950 // Grab the specific ranges for the compile units in the module.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001951 for (const auto &I : CUMap) {
1952 DwarfCompileUnit *TheCU = I.second;
Eric Christopher0f63d062013-12-03 00:45:45 +00001953
David Blaikie3a443c22014-11-04 22:12:25 +00001954 if (auto *Skel = TheCU->getSkeleton())
1955 TheCU = Skel;
1956
Eric Christopher0f63d062013-12-03 00:45:45 +00001957 // Iterate over the misc ranges for the compile units in the module.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001958 for (const RangeSpanList &List : TheCU->getRangeLists()) {
Eric Christopherf8790642013-12-04 22:04:50 +00001959 // Emit our symbol so we can find the beginning of the range.
Lang Hames9ff69c82015-04-24 19:11:51 +00001960 Asm->OutStreamer->EmitLabel(List.getSym());
Eric Christopher0f63d062013-12-03 00:45:45 +00001961
David Blaikie89c81a02017-07-30 22:10:00 +00001962 // Gather all the ranges that apply to the same section so they can share
1963 // a base address entry.
1964 MapVector<const MCSection *, std::vector<const RangeSpan *>> MV;
Benjamin Kramer15596c72014-03-07 19:09:39 +00001965 for (const RangeSpan &Range : List.getRanges()) {
David Blaikie89c81a02017-07-30 22:10:00 +00001966 MV[&Range.getStart()->getSection()].push_back(&Range);
1967 }
1968
1969 auto *CUBase = TheCU->getBaseAddress();
David Blaikie4dd66372017-07-31 00:18:24 +00001970 bool BaseIsSet = false;
David Blaikie89c81a02017-07-30 22:10:00 +00001971 for (const auto &P : MV) {
1972 // Don't bother with a base address entry if there's only one range in
1973 // this section in this range list - for example ranges for a CU will
1974 // usually consist of single regions from each of many sections
1975 // (-ffunction-sections, or just C++ inline functions) except under LTO
1976 // or optnone where there may be holes in a single CU's section
1977 // contrubutions.
1978 auto *Base = CUBase;
David Blaikie038e28a2017-07-31 21:48:42 +00001979 if (!Base && P.second.size() > 1 &&
1980 UseDwarfRangesBaseAddressSpecifier) {
David Blaikie4dd66372017-07-31 00:18:24 +00001981 BaseIsSet = true;
David Blaikie89c81a02017-07-30 22:10:00 +00001982 // FIXME/use care: This may not be a useful base address if it's not
1983 // the lowest address/range in this object.
1984 Base = P.second.front()->getStart();
1985 Asm->OutStreamer->EmitIntValue(-1, Size);
1986 Asm->OutStreamer->EmitSymbolValue(Base, Size);
David Blaikie4dd66372017-07-31 00:18:24 +00001987 } else if (BaseIsSet) {
1988 BaseIsSet = false;
1989 Asm->OutStreamer->EmitIntValue(-1, Size);
1990 Asm->OutStreamer->EmitIntValue(0, Size);
David Blaikie89c81a02017-07-30 22:10:00 +00001991 }
1992
1993 for (const auto *RS : P.second) {
1994 const MCSymbol *Begin = RS->getStart();
1995 const MCSymbol *End = RS->getEnd();
1996 assert(Begin && "Range without a begin symbol?");
1997 assert(End && "Range without an end symbol?");
1998 if (Base) {
1999 Asm->EmitLabelDifference(Begin, Base, Size);
2000 Asm->EmitLabelDifference(End, Base, Size);
2001 } else {
2002 Asm->OutStreamer->EmitSymbolValue(Begin, Size);
2003 Asm->OutStreamer->EmitSymbolValue(End, Size);
2004 }
Eric Christopherece0e902014-04-25 22:23:54 +00002005 }
Eric Christopher0f63d062013-12-03 00:45:45 +00002006 }
2007
2008 // And terminate the list with two 0 values.
Lang Hames9ff69c82015-04-24 19:11:51 +00002009 Asm->OutStreamer->EmitIntValue(0, Size);
2010 Asm->OutStreamer->EmitIntValue(0, Size);
Eric Christopher0f63d062013-12-03 00:45:45 +00002011 }
Devang Patel12563b32010-04-16 23:33:45 +00002012 }
Bill Wendling480ff322009-05-20 23:21:38 +00002013}
2014
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002015void DwarfDebug::handleMacroNodes(DIMacroNodeArray Nodes, DwarfCompileUnit &U) {
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002016 for (auto *MN : Nodes) {
2017 if (auto *M = dyn_cast<DIMacro>(MN))
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002018 emitMacro(*M);
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002019 else if (auto *F = dyn_cast<DIMacroFile>(MN))
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002020 emitMacroFile(*F, U);
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002021 else
2022 llvm_unreachable("Unexpected DI type!");
2023 }
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002024}
2025
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002026void DwarfDebug::emitMacro(DIMacro &M) {
2027 Asm->EmitULEB128(M.getMacinfoType());
2028 Asm->EmitULEB128(M.getLine());
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002029 StringRef Name = M.getName();
2030 StringRef Value = M.getValue();
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002031 Asm->OutStreamer->EmitBytes(Name);
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002032 if (!Value.empty()) {
2033 // There should be one space between macro name and macro value.
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002034 Asm->EmitInt8(' ');
2035 Asm->OutStreamer->EmitBytes(Value);
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002036 }
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002037 Asm->EmitInt8('\0');
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002038}
2039
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002040void DwarfDebug::emitMacroFile(DIMacroFile &F, DwarfCompileUnit &U) {
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002041 assert(F.getMacinfoType() == dwarf::DW_MACINFO_start_file);
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002042 Asm->EmitULEB128(dwarf::DW_MACINFO_start_file);
2043 Asm->EmitULEB128(F.getLine());
Paul Robinson612e89d2018-01-12 19:17:50 +00002044 Asm->EmitULEB128(U.getOrCreateSourceID(F.getFile()));
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002045 handleMacroNodes(F.getElements(), U);
2046 Asm->EmitULEB128(dwarf::DW_MACINFO_end_file);
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002047}
2048
Amjad Aboudc0778412016-01-24 08:18:55 +00002049/// Emit macros into a debug macinfo section.
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002050void DwarfDebug::emitDebugMacinfo() {
David Blaikie07963bd2017-05-26 18:52:56 +00002051 if (CUMap.empty())
2052 return;
2053
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002054 // Start the dwarf macinfo section.
2055 Asm->OutStreamer->SwitchSection(
2056 Asm->getObjFileLowering().getDwarfMacinfoSection());
2057
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002058 for (const auto &P : CUMap) {
2059 auto &TheCU = *P.second;
2060 auto *SkCU = TheCU.getSkeleton();
2061 DwarfCompileUnit &U = SkCU ? *SkCU : TheCU;
2062 auto *CUNode = cast<DICompileUnit>(P.first);
Alexey Bataevbd7869442018-02-22 16:20:30 +00002063 DIMacroNodeArray Macros = CUNode->getMacros();
2064 if (!Macros.empty()) {
2065 Asm->OutStreamer->EmitLabel(U.getMacroLabelBegin());
2066 handleMacroNodes(Macros, U);
2067 }
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002068 }
2069 Asm->OutStreamer->AddComment("End Of Macro List Mark");
2070 Asm->EmitInt8(0);
2071}
2072
Eric Christopherd692c1d2012-12-11 19:42:09 +00002073// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002074
David Blaikie65a74662014-04-25 18:26:14 +00002075void DwarfDebug::initSkeletonUnit(const DwarfUnit &U, DIE &Die,
Peter Collingbourne7c384cc2016-02-11 19:57:46 +00002076 std::unique_ptr<DwarfCompileUnit> NewU) {
David Blaikiecafd9622014-11-02 08:51:37 +00002077 NewU->addString(Die, dwarf::DW_AT_GNU_dwo_name,
David Blaikie96b1ed52017-04-21 23:35:26 +00002078 Asm->TM.Options.MCOptions.SplitDwarfFile);
David Blaikie38fe6342014-01-09 04:28:46 +00002079
David Blaikie38fe6342014-01-09 04:28:46 +00002080 if (!CompilationDir.empty())
David Blaikiecafd9622014-11-02 08:51:37 +00002081 NewU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
David Blaikie38fe6342014-01-09 04:28:46 +00002082
David Blaikief9b6a552014-04-22 22:39:41 +00002083 addGnuPubAttributes(*NewU, Die);
David Blaikie38fe6342014-01-09 04:28:46 +00002084
David Blaikief9b6a552014-04-22 22:39:41 +00002085 SkeletonHolder.addUnit(std::move(NewU));
David Blaikie38fe6342014-01-09 04:28:46 +00002086}
2087
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002088// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2089// 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 +00002090// DW_AT_addr_base, DW_AT_ranges_base.
David Blaikief9b6a552014-04-22 22:39:41 +00002091DwarfCompileUnit &DwarfDebug::constructSkeletonCU(const DwarfCompileUnit &CU) {
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002092
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +00002093 auto OwnedUnit = llvm::make_unique<DwarfCompileUnit>(
David Blaikiebd579052014-04-28 21:14:27 +00002094 CU.getUniqueID(), CU.getCUNode(), Asm, this, &SkeletonHolder);
David Blaikief9b6a552014-04-22 22:39:41 +00002095 DwarfCompileUnit &NewCU = *OwnedUnit;
Greg Clayton35630c32016-12-01 18:56:29 +00002096 NewCU.setSection(Asm->getObjFileLowering().getDwarfInfoSection());
Eric Christopher4c7765f2013-01-17 03:00:04 +00002097
Rafael Espindola063d7252015-03-10 16:58:10 +00002098 NewCU.initStmtList();
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002099
Wolfgang Pieb456b5552018-01-26 18:52:58 +00002100 if (useSegmentedStringOffsetsTable())
2101 NewCU.addStringOffsetsStart();
2102
David Blaikie92a2f8a2014-04-28 21:04:29 +00002103 initSkeletonUnit(CU, NewCU.getUnitDie(), std::move(OwnedUnit));
Eric Christopherc8a310e2012-12-10 23:34:43 +00002104
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002105 return NewCU;
2106}
2107
Eric Christopherd692c1d2012-12-11 19:42:09 +00002108// Emit the .debug_info.dwo section for separated dwarf. This contains the
2109// compile units that would normally be in debug_info.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002110void DwarfDebug::emitDebugInfoDWO() {
Eric Christophercdf218d2012-12-10 19:51:21 +00002111 assert(useSplitDwarf() && "No split dwarf debug info?");
Rafael Espindola063d7252015-03-10 16:58:10 +00002112 // Don't emit relocations into the dwo file.
2113 InfoHolder.emitUnits(/* UseOffsets */ true);
Eric Christopher3c5a1912012-12-19 22:02:53 +00002114}
2115
2116// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2117// abbreviations for the .debug_info.dwo section.
2118void DwarfDebug::emitDebugAbbrevDWO() {
2119 assert(useSplitDwarf() && "No split dwarf?");
David Blaikie0504cda2013-12-05 07:43:55 +00002120 InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection());
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002121}
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002122
David Blaikie4a2f95f2014-03-18 01:17:26 +00002123void DwarfDebug::emitDebugLineDWO() {
2124 assert(useSplitDwarf() && "No split dwarf?");
Paul Robinson1e0116c2018-03-01 00:12:35 +00002125 if (!HasSplitTypeUnits)
2126 return;
Lang Hames9ff69c82015-04-24 19:11:51 +00002127 Asm->OutStreamer->SwitchSection(
David Blaikie4a2f95f2014-03-18 01:17:26 +00002128 Asm->getObjFileLowering().getDwarfLineDWOSection());
Frederic Rissa5ab8442015-08-07 15:14:08 +00002129 SplitTypeUnitFileTable.Emit(*Asm->OutStreamer, MCDwarfLineTableParams());
David Blaikie4a2f95f2014-03-18 01:17:26 +00002130}
2131
Wolfgang Pieb456b5552018-01-26 18:52:58 +00002132void DwarfDebug::emitStringOffsetsTableHeaderDWO() {
2133 assert(useSplitDwarf() && "No split dwarf?");
2134 InfoHolder.emitStringOffsetsTableHeader(
2135 Asm->getObjFileLowering().getDwarfStrOffDWOSection());
2136}
2137
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002138// Emit the .debug_str.dwo section for separated dwarf. This contains the
2139// string section and is identical in format to traditional .debug_str
2140// sections.
2141void DwarfDebug::emitDebugStrDWO() {
Wolfgang Pieb456b5552018-01-26 18:52:58 +00002142 if (useSegmentedStringOffsetsTable())
2143 emitStringOffsetsTableHeaderDWO();
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002144 assert(useSplitDwarf() && "No split dwarf?");
Rafael Espindola0709a7b2015-05-21 19:20:38 +00002145 MCSection *OffSec = Asm->getObjFileLowering().getDwarfStrOffDWOSection();
Eric Christopher2cbd5762013-01-07 19:32:41 +00002146 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
Wolfgang Pieb456b5552018-01-26 18:52:58 +00002147 OffSec, /* UseRelativeOffsets = */ false);
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002148}
David Blaikie409dd9c2013-11-19 23:08:21 +00002149
David Blaikie47f4b822014-03-19 00:11:28 +00002150MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) {
2151 if (!useSplitDwarf())
2152 return nullptr;
Alexander Kornienkoe12a48b2018-03-07 16:27:44 +00002153 if (SingleCU)
2154 SplitTypeUnitFileTable.setCompilationDir(CU.getCUNode()->getDirectory());
David Blaikie47f4b822014-03-19 00:11:28 +00002155 return &SplitTypeUnitFileTable;
2156}
2157
Adrian Prantlee5feaf2015-07-15 17:01:41 +00002158uint64_t DwarfDebug::makeTypeSignature(StringRef Identifier) {
David Blaikief3de2ab2014-04-26 16:26:41 +00002159 MD5 Hash;
2160 Hash.update(Identifier);
2161 // ... take the least significant 8 bytes and return those. Our MD5
Zachary Turner82a0c972017-03-20 23:33:18 +00002162 // implementation always returns its results in little endian, so we actually
2163 // need the "high" word.
David Blaikief3de2ab2014-04-26 16:26:41 +00002164 MD5::MD5Result Result;
2165 Hash.final(Result);
Zachary Turner82a0c972017-03-20 23:33:18 +00002166 return Result.high();
David Blaikief3de2ab2014-04-26 16:26:41 +00002167}
2168
David Blaikie15632ae2014-02-12 00:31:30 +00002169void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU,
David Blaikie65a74662014-04-25 18:26:14 +00002170 StringRef Identifier, DIE &RefDie,
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00002171 const DICompositeType *CTy) {
David Blaikiee12b49a2014-04-26 17:27:38 +00002172 // Fast path if we're building some type units and one has already used the
2173 // address pool we know we're going to throw away all this work anyway, so
2174 // don't bother building dependent types.
2175 if (!TypeUnitsUnderConstruction.empty() && AddrPool.hasBeenUsed())
2176 return;
2177
Peter Collingbourne7c384cc2016-02-11 19:57:46 +00002178 auto Ins = TypeSignatures.insert(std::make_pair(CTy, 0));
2179 if (!Ins.second) {
2180 CU.addDIETypeSignature(RefDie, Ins.first->second);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002181 return;
David Blaikie409dd9c2013-11-19 23:08:21 +00002182 }
2183
David Blaikiee12b49a2014-04-26 17:27:38 +00002184 bool TopLevelType = TypeUnitsUnderConstruction.empty();
2185 AddrPool.resetUsedFlag();
2186
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +00002187 auto OwnedUnit = llvm::make_unique<DwarfTypeUnit>(CU, Asm, this, &InfoHolder,
2188 getDwoLineTable(CU));
David Blaikief9b6a552014-04-22 22:39:41 +00002189 DwarfTypeUnit &NewTU = *OwnedUnit;
David Blaikie92a2f8a2014-04-28 21:04:29 +00002190 DIE &UnitDie = NewTU.getUnitDie();
David Majnemer0a16c222016-08-11 21:15:00 +00002191 TypeUnitsUnderConstruction.emplace_back(std::move(OwnedUnit), CTy);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002192
David Blaikie92a2f8a2014-04-28 21:04:29 +00002193 NewTU.addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
David Blaikie637cac42014-04-22 23:09:36 +00002194 CU.getLanguage());
Chandler Carruthb587ab62014-01-20 08:07:07 +00002195
David Blaikief3de2ab2014-04-26 16:26:41 +00002196 uint64_t Signature = makeTypeSignature(Identifier);
David Blaikief9b6a552014-04-22 22:39:41 +00002197 NewTU.setTypeSignature(Signature);
Peter Collingbourne7c384cc2016-02-11 19:57:46 +00002198 Ins.first->second = Signature;
David Blaikief3de2ab2014-04-26 16:26:41 +00002199
David Blaikie29459ae2014-07-25 17:11:58 +00002200 if (useSplitDwarf())
Greg Clayton35630c32016-12-01 18:56:29 +00002201 NewTU.setSection(Asm->getObjFileLowering().getDwarfTypesDWOSection());
David Blaikie29459ae2014-07-25 17:11:58 +00002202 else {
David Blaikie92a2f8a2014-04-28 21:04:29 +00002203 CU.applyStmtList(UnitDie);
Greg Clayton35630c32016-12-01 18:56:29 +00002204 NewTU.setSection(Asm->getObjFileLowering().getDwarfTypesSection(Signature));
David Blaikie29459ae2014-07-25 17:11:58 +00002205 }
Chandler Carruthb587ab62014-01-20 08:07:07 +00002206
Wolfgang Pieb456b5552018-01-26 18:52:58 +00002207 // Add DW_AT_str_offsets_base to the type unit DIE, but not for split type
2208 // units.
2209 if (useSegmentedStringOffsetsTable() && !useSplitDwarf())
2210 NewTU.addStringOffsetsStart();
2211
David Blaikief3de2ab2014-04-26 16:26:41 +00002212 NewTU.setType(NewTU.createTypeDIE(CTy));
2213
David Blaikiee12b49a2014-04-26 17:27:38 +00002214 if (TopLevelType) {
2215 auto TypeUnitsToAdd = std::move(TypeUnitsUnderConstruction);
2216 TypeUnitsUnderConstruction.clear();
2217
2218 // Types referencing entries in the address table cannot be placed in type
2219 // units.
2220 if (AddrPool.hasBeenUsed()) {
2221
2222 // Remove all the types built while building this type.
2223 // This is pessimistic as some of these types might not be dependent on
2224 // the type that used an address.
2225 for (const auto &TU : TypeUnitsToAdd)
Peter Collingbourne7c384cc2016-02-11 19:57:46 +00002226 TypeSignatures.erase(TU.second);
David Blaikiee12b49a2014-04-26 17:27:38 +00002227
2228 // Construct this type in the CU directly.
2229 // This is inefficient because all the dependent types will be rebuilt
2230 // from scratch, including building them in type units, discovering that
2231 // they depend on addresses, throwing them out and rebuilding them.
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00002232 CU.constructTypeDIE(RefDie, cast<DICompositeType>(CTy));
David Blaikiee12b49a2014-04-26 17:27:38 +00002233 return;
2234 }
2235
2236 // If the type wasn't dependent on fission addresses, finish adding the type
2237 // and all its dependent types.
Peter Collingbourne7c384cc2016-02-11 19:57:46 +00002238 for (auto &TU : TypeUnitsToAdd) {
2239 InfoHolder.computeSizeAndOffsetsForUnit(TU.first.get());
2240 InfoHolder.emitUnit(TU.first.get(), useSplitDwarf());
2241 }
Paul Robinson1e0116c2018-03-01 00:12:35 +00002242 HasSplitTypeUnits = useSplitDwarf();
David Blaikiee12b49a2014-04-26 17:27:38 +00002243 }
Peter Collingbourne7c384cc2016-02-11 19:57:46 +00002244 CU.addDIETypeSignature(RefDie, Signature);
David Blaikie409dd9c2013-11-19 23:08:21 +00002245}
David Blaikie4bd13b72014-03-07 18:49:45 +00002246
David Blaikie2406a0622014-04-23 23:37:35 +00002247// Accelerator table mutators - add each name along with its companion
2248// DIE to the proper table while ensuring that the name that we're going
2249// to reference is in the string table. We do this since the names we
2250// add may not only be identical to the names in the DIE.
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002251void DwarfDebug::addAccelName(StringRef Name, const DIE &Die) {
David Blaikie2406a0622014-04-23 23:37:35 +00002252 if (!useDwarfAccelTables())
2253 return;
Jonas Devliegheree699dfa2018-01-29 14:52:34 +00002254 AccelNames.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), &Die);
David Blaikie2406a0622014-04-23 23:37:35 +00002255}
David Blaikie0ee82b92014-04-24 00:53:32 +00002256
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002257void DwarfDebug::addAccelObjC(StringRef Name, const DIE &Die) {
David Blaikie0ee82b92014-04-24 00:53:32 +00002258 if (!useDwarfAccelTables())
2259 return;
Jonas Devliegheree699dfa2018-01-29 14:52:34 +00002260 AccelObjC.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), &Die);
David Blaikie0ee82b92014-04-24 00:53:32 +00002261}
David Blaikieecf04152014-04-24 01:02:42 +00002262
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002263void DwarfDebug::addAccelNamespace(StringRef Name, const DIE &Die) {
David Blaikieecf04152014-04-24 01:02:42 +00002264 if (!useDwarfAccelTables())
2265 return;
Jonas Devliegheree699dfa2018-01-29 14:52:34 +00002266 AccelNamespace.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), &Die);
David Blaikieecf04152014-04-24 01:02:42 +00002267}
David Blaikie18d33752014-04-24 01:23:49 +00002268
David Blaikieb0b3fcf2014-04-25 18:52:29 +00002269void DwarfDebug::addAccelType(StringRef Name, const DIE &Die, char Flags) {
David Blaikie18d33752014-04-24 01:23:49 +00002270 if (!useDwarfAccelTables())
2271 return;
Jonas Devliegheree699dfa2018-01-29 14:52:34 +00002272 AccelTypes.addName(InfoHolder.getStringPool().getEntry(*Asm, Name), &Die);
David Blaikie18d33752014-04-24 01:23:49 +00002273}
Greg Claytone6543972016-11-23 23:30:37 +00002274
2275uint16_t DwarfDebug::getDwarfVersion() const {
2276 return Asm->OutStreamer->getContext().getDwarfVersion();
2277}