blob: 0bbd54f5411d1c444d51c1de156a4d27d7abd32c [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//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Bill Wendling2f921f82009-05-15 09:23:25 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This file contains support for writing dwarf debug info into asm files.
10//
11//===----------------------------------------------------------------------===//
Chris Lattnerb14490d2010-03-09 00:39:24 +000012
Bill Wendling2f921f82009-05-15 09:23:25 +000013#include "DwarfDebug.h"
David Blaikie37c52312014-10-04 15:49:50 +000014#include "ByteStreamer.h"
Eric Christopher45731982013-08-08 23:45:55 +000015#include "DIEHash.h"
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +000016#include "DebugLocEntry.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000017#include "DebugLocStream.h"
Chandler Carruthd9903882015-01-14 11:23:27 +000018#include "DwarfCompileUnit.h"
19#include "DwarfExpression.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000020#include "DwarfFile.h"
David Blaikie2c86a722013-12-02 19:33:15 +000021#include "DwarfUnit.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000022#include "llvm/ADT/APInt.h"
23#include "llvm/ADT/DenseMap.h"
24#include "llvm/ADT/DenseSet.h"
25#include "llvm/ADT/MapVector.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000026#include "llvm/ADT/STLExtras.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000027#include "llvm/ADT/SmallVector.h"
28#include "llvm/ADT/StringRef.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000029#include "llvm/ADT/Triple.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000030#include "llvm/ADT/Twine.h"
Zachary Turner264b5d92017-06-07 03:48:56 +000031#include "llvm/BinaryFormat/Dwarf.h"
Jonas Devlieghere855fc3b2018-01-29 14:52:41 +000032#include "llvm/CodeGen/AccelTable.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000033#include "llvm/CodeGen/AsmPrinter.h"
Frederic Risse541e0b2015-01-05 21:29:41 +000034#include "llvm/CodeGen/DIE.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000035#include "llvm/CodeGen/LexicalScopes.h"
36#include "llvm/CodeGen/MachineBasicBlock.h"
David Greene829b3e82009-08-19 21:52:55 +000037#include "llvm/CodeGen/MachineFunction.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000038#include "llvm/CodeGen/MachineInstr.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000039#include "llvm/CodeGen/MachineModuleInfo.h"
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +000040#include "llvm/CodeGen/MachineOperand.h"
Vedant Kumar5931b4e2018-10-05 20:37:17 +000041#include "llvm/CodeGen/TargetInstrInfo.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
Pavel Labathf9adc202018-07-20 12:59:05 +000097static cl::opt<bool>
98 GenerateDwarfTypeUnits("generate-type-units", cl::Hidden,
99 cl::desc("Generate DWARF4 type units."),
100 cl::init(false));
101
David Blaikie488393f2017-05-12 01:13:45 +0000102static cl::opt<bool> SplitDwarfCrossCuReferences(
103 "split-dwarf-cross-cu-references", cl::Hidden,
104 cl::desc("Enable cross-cu references in DWO files"), cl::init(false));
105
Eric Christopherf07ee3a2014-01-27 23:50:03 +0000106enum DefaultOnOff { Default, Enable, Disable };
Eric Christopher4996c702011-11-07 09:24:32 +0000107
Paul Robinsonac7fe5e2016-12-12 20:49:11 +0000108static cl::opt<DefaultOnOff> UnknownLocations(
109 "use-unknown-locations", cl::Hidden,
110 cl::desc("Make an absence of debug location information explicit."),
111 cl::values(clEnumVal(Default, "At top of block or after label"),
112 clEnumVal(Enable, "In all cases"), clEnumVal(Disable, "Never")),
113 cl::init(Default));
114
Pavel Labath6088c232018-04-04 14:42:14 +0000115static cl::opt<AccelTableKind> AccelTables(
116 "accel-tables", cl::Hidden, cl::desc("Output dwarf accelerator tables."),
117 cl::values(clEnumValN(AccelTableKind::Default, "Default",
118 "Default for platform"),
119 clEnumValN(AccelTableKind::None, "Disable", "Disabled."),
120 clEnumValN(AccelTableKind::Apple, "Apple", "Apple"),
121 clEnumValN(AccelTableKind::Dwarf, "Dwarf", "DWARF")),
122 cl::init(AccelTableKind::Default));
Eric Christopher20b76a72012-08-23 22:36:40 +0000123
Alexey Bataev0d6aead2018-02-20 15:28:08 +0000124static cl::opt<DefaultOnOff>
125DwarfInlinedStrings("dwarf-inlined-strings", cl::Hidden,
126 cl::desc("Use inlined strings rather than string section."),
127 cl::values(clEnumVal(Default, "Default for platform"),
128 clEnumVal(Enable, "Enabled"),
129 clEnumVal(Disable, "Disabled")),
130 cl::init(Default));
131
Alexey Bataev648ed2d2018-03-20 16:04:40 +0000132static cl::opt<bool>
Alexey Bataev858a7dd2018-03-20 20:21:38 +0000133 NoDwarfRangesSection("no-dwarf-ranges-section", cl::Hidden,
134 cl::desc("Disable emission .debug_ranges section."),
135 cl::init(false));
136
Alexey Bataevbff36082018-03-23 13:35:54 +0000137static cl::opt<DefaultOnOff> DwarfSectionsAsReferences(
138 "dwarf-sections-as-references", cl::Hidden,
139 cl::desc("Use sections+offset as references rather than labels."),
140 cl::values(clEnumVal(Default, "Default for platform"),
141 clEnumVal(Enable, "Enabled"), clEnumVal(Disable, "Disabled")),
142 cl::init(Default));
143
Paul Robinson43d1e452016-04-18 22:41:41 +0000144enum LinkageNameOption {
145 DefaultLinkageNames,
146 AllLinkageNames,
147 AbstractLinkageNames
148};
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +0000149
Paul Robinson43d1e452016-04-18 22:41:41 +0000150static cl::opt<LinkageNameOption>
151 DwarfLinkageNames("dwarf-linkage-names", cl::Hidden,
152 cl::desc("Which DWARF linkage-name attributes to emit."),
153 cl::values(clEnumValN(DefaultLinkageNames, "Default",
154 "Default for platform"),
155 clEnumValN(AllLinkageNames, "All", "All"),
156 clEnumValN(AbstractLinkageNames, "Abstract",
Mehdi Amini732afdd2016-10-08 19:41:06 +0000157 "Abstract subprograms")),
Paul Robinson43d1e452016-04-18 22:41:41 +0000158 cl::init(DefaultLinkageNames));
Paul Robinson78046b42015-08-11 21:36:45 +0000159
Matthias Braun9f15a792016-11-18 19:43:18 +0000160static const char *const DWARFGroupName = "dwarf";
161static const char *const DWARFGroupDescription = "DWARF Emission";
162static const char *const DbgTimerName = "writer";
163static const char *const DbgTimerDescription = "DWARF Debug Writer";
Bill Wendlingfcc14142010-04-07 09:28:04 +0000164
Adrian Prantla63b8e82017-03-16 17:42:45 +0000165void DebugLocDwarfExpression::emitOp(uint8_t Op, const char *Comment) {
Adrian Prantl92da14b2015-03-02 22:02:33 +0000166 BS.EmitInt8(
167 Op, Comment ? Twine(Comment) + " " + dwarf::OperationEncodingString(Op)
168 : dwarf::OperationEncodingString(Op));
169}
170
Adrian Prantla63b8e82017-03-16 17:42:45 +0000171void DebugLocDwarfExpression::emitSigned(int64_t Value) {
Adrian Prantl92da14b2015-03-02 22:02:33 +0000172 BS.EmitSLEB128(Value, Twine(Value));
173}
174
Adrian Prantla63b8e82017-03-16 17:42:45 +0000175void DebugLocDwarfExpression::emitUnsigned(uint64_t Value) {
Adrian Prantl92da14b2015-03-02 22:02:33 +0000176 BS.EmitULEB128(Value, Twine(Value));
177}
178
Peter Collingbourne96c9ae62016-05-20 19:35:17 +0000179bool DebugLocDwarfExpression::isFrameRegister(const TargetRegisterInfo &TRI,
180 unsigned MachineReg) {
Adrian Prantl92da14b2015-03-02 22:02:33 +0000181 // This information is not available while emitting .debug_loc entries.
182 return false;
183}
184
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000185bool DbgVariable::isBlockByrefVariable() const {
Hsiangkai Wang2532ac82018-08-17 15:22:04 +0000186 assert(getVariable() && "Invalid complex DbgVariable!");
187 return getVariable()->getType().resolve()->isBlockByrefStruct();
Adrian Prantl1a1647c2014-03-18 02:34:58 +0000188}
189
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000190const DIType *DbgVariable::getType() const {
Hsiangkai Wang2532ac82018-08-17 15:22:04 +0000191 DIType *Ty = getVariable()->getType().resolve();
Devang Patelf20c4f72011-04-12 22:53:02 +0000192 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
193 // addresses instead.
Duncan P. N. Exon Smith571baeb2015-04-14 01:59:58 +0000194 if (Ty->isBlockByrefStruct()) {
Devang Patelf20c4f72011-04-12 22:53:02 +0000195 /* Byref variables, in Blocks, are declared by the programmer as
196 "SomeType VarName;", but the compiler creates a
197 __Block_byref_x_VarName struct, and gives the variable VarName
198 either the struct, or a pointer to the struct, as its type. This
199 is necessary for various behind-the-scenes things the compiler
200 needs to do with by-reference variables in blocks.
Eric Christopher6a841382012-11-19 22:42:10 +0000201
Devang Patelf20c4f72011-04-12 22:53:02 +0000202 However, as far as the original *programmer* is concerned, the
203 variable should still have type 'SomeType', as originally declared.
Eric Christopher6a841382012-11-19 22:42:10 +0000204
Devang Patelf20c4f72011-04-12 22:53:02 +0000205 The following function dives into the __Block_byref_x_VarName
206 struct to find the original type of the variable. This will be
207 passed back to the code generating the type for the Debug
208 Information Entry for the variable 'VarName'. 'VarName' will then
209 have the original type 'SomeType' in its debug information.
Eric Christopher6a841382012-11-19 22:42:10 +0000210
Devang Patelf20c4f72011-04-12 22:53:02 +0000211 The original type 'SomeType' will be the type of the field named
212 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher6a841382012-11-19 22:42:10 +0000213
Devang Patelf20c4f72011-04-12 22:53:02 +0000214 NOTE: In order for this to not completely fail on the debugger
215 side, the Debug Information Entry for the variable VarName needs to
216 have a DW_AT_location that tells the debugger how to unwind through
217 the pointers and __Block_byref_x_VarName struct to find the actual
218 value of the variable. The function addBlockByrefType does this. */
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000219 DIType *subType = Ty;
Duncan P. N. Exon Smithb1055642015-04-16 01:01:28 +0000220 uint16_t tag = Ty->getTag();
Eric Christopher6a841382012-11-19 22:42:10 +0000221
Eric Christopher9adc55f2013-09-04 19:53:21 +0000222 if (tag == dwarf::DW_TAG_pointer_type)
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000223 subType = resolve(cast<DIDerivedType>(Ty)->getBaseType());
Eric Christopher6a841382012-11-19 22:42:10 +0000224
Duncan P. N. Exon Smith6ac940d2015-07-24 18:17:17 +0000225 auto Elements = cast<DICompositeType>(subType)->getElements();
Duncan P. N. Exon Smith000fa2c2015-04-07 04:14:33 +0000226 for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
Duncan P. N. Exon Smith099ea1c2015-07-24 18:58:32 +0000227 auto *DT = cast<DIDerivedType>(Elements[i]);
Duncan P. N. Exon Smithb1055642015-04-16 01:01:28 +0000228 if (getName() == DT->getName())
Duncan P. N. Exon Smith848af382015-04-20 18:20:03 +0000229 return resolve(DT->getBaseType());
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000230 }
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000231 }
Devang Patelf20c4f72011-04-12 22:53:02 +0000232 return Ty;
233}
Bill Wendling2f921f82009-05-15 09:23:25 +0000234
Adrian Prantl67c24422017-02-17 19:42:32 +0000235ArrayRef<DbgVariable::FrameIndexExpr> DbgVariable::getFrameIndexExprs() const {
Adrian Prantl55030772017-03-22 16:50:16 +0000236 if (FrameIndexExprs.size() == 1)
237 return FrameIndexExprs;
238
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +0000239 assert(llvm::all_of(FrameIndexExprs,
240 [](const FrameIndexExpr &A) {
241 return A.Expr->isFragment();
242 }) &&
Adrian Prantl55030772017-03-22 16:50:16 +0000243 "multiple FI expressions without DW_OP_LLVM_fragment");
Fangrui Song0cac7262018-09-27 02:13:45 +0000244 llvm::sort(FrameIndexExprs,
Mandeep Singh Grange92f0cf2018-04-06 18:08:42 +0000245 [](const FrameIndexExpr &A, const FrameIndexExpr &B) -> bool {
246 return A.Expr->getFragmentInfo()->OffsetInBits <
247 B.Expr->getFragmentInfo()->OffsetInBits;
248 });
Bjorn Steinbrinkd36bbe92017-10-10 07:46:17 +0000249
Adrian Prantl67c24422017-02-17 19:42:32 +0000250 return FrameIndexExprs;
251}
252
Bjorn Steinbrinkd36bbe92017-10-10 07:46:17 +0000253void DbgVariable::addMMIEntry(const DbgVariable &V) {
254 assert(DebugLocListIndex == ~0U && !MInsn && "not an MMI entry");
255 assert(V.DebugLocListIndex == ~0U && !V.MInsn && "not an MMI entry");
Hsiangkai Wang2532ac82018-08-17 15:22:04 +0000256 assert(V.getVariable() == getVariable() && "conflicting variable");
257 assert(V.getInlinedAt() == getInlinedAt() && "conflicting inlined-at location");
Bjorn Steinbrinkd36bbe92017-10-10 07:46:17 +0000258
259 assert(!FrameIndexExprs.empty() && "Expected an MMI entry");
260 assert(!V.FrameIndexExprs.empty() && "Expected an MMI entry");
261
Daniel Jasper4d931202017-10-12 13:25:05 +0000262 // FIXME: This logic should not be necessary anymore, as we now have proper
263 // deduplication. However, without it, we currently run into the assertion
264 // below, which means that we are likely dealing with broken input, i.e. two
265 // non-fragment entries for the same variable at different frame indices.
266 if (FrameIndexExprs.size()) {
267 auto *Expr = FrameIndexExprs.back().Expr;
268 if (!Expr || !Expr->isFragment())
269 return;
270 }
271
Bjorn Steinbrinkd36bbe92017-10-10 07:46:17 +0000272 for (const auto &FIE : V.FrameIndexExprs)
273 // Ignore duplicate entries.
274 if (llvm::none_of(FrameIndexExprs, [&](const FrameIndexExpr &Other) {
275 return FIE.FI == Other.FI && FIE.Expr == Other.Expr;
276 }))
277 FrameIndexExprs.push_back(FIE);
278
279 assert((FrameIndexExprs.size() == 1 ||
280 llvm::all_of(FrameIndexExprs,
281 [](FrameIndexExpr &FIE) {
282 return FIE.Expr && FIE.Expr->isFragment();
283 })) &&
284 "conflicting locations for variable");
285}
286
Pavel Labathf9adc202018-07-20 12:59:05 +0000287static AccelTableKind computeAccelTableKind(unsigned DwarfVersion,
288 bool GenerateTypeUnits,
289 DebuggerKind Tuning,
290 const Triple &TT) {
291 // Honor an explicit request.
292 if (AccelTables != AccelTableKind::Default)
293 return AccelTables;
294
295 // Accelerator tables with type units are currently not supported.
296 if (GenerateTypeUnits)
297 return AccelTableKind::None;
298
299 // Accelerator tables get emitted if targetting DWARF v5 or LLDB. DWARF v5
300 // always implies debug_names. For lower standard versions we use apple
301 // accelerator tables on apple platforms and debug_names elsewhere.
302 if (DwarfVersion >= 5)
303 return AccelTableKind::Dwarf;
304 if (Tuning == DebuggerKind::LLDB)
305 return TT.isOSBinFormatMachO() ? AccelTableKind::Apple
306 : AccelTableKind::Dwarf;
307 return AccelTableKind::None;
308}
309
Chris Lattnerf0d6bd32010-04-05 05:11:15 +0000310DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Reid Klecknerf9c275f2016-02-10 20:55:49 +0000311 : DebugHandlerBase(A), DebugLocs(A->OutStreamer->isVerboseAsm()),
312 InfoHolder(A, "info_string", DIEValueAllocator),
Frederic Riss9412d632015-03-04 02:30:17 +0000313 SkeletonHolder(A, "skel_string", DIEValueAllocator),
Pavel Labatha7c457d2018-02-19 16:12:20 +0000314 IsDarwin(A->TM.getTargetTriple().isOSDarwin()) {
Eric Christopher364dbe02016-10-01 01:50:29 +0000315 const Triple &TT = Asm->TM.getTargetTriple();
Eric Christopherad9fe892012-04-02 17:58:52 +0000316
Tom Weaver4db70d92019-01-25 16:29:35 +0000317 // Make sure we know our "debugger tuning". The target option takes
Paul Robinsonb9de1062015-07-15 22:04:54 +0000318 // precedence; fall back to triple-based defaults.
Paul Robinson6c27a2c2015-12-16 19:58:30 +0000319 if (Asm->TM.Options.DebuggerTuning != DebuggerKind::Default)
320 DebuggerTuning = Asm->TM.Options.DebuggerTuning;
Dimitry Andric2c364212016-01-07 22:09:12 +0000321 else if (IsDarwin)
Paul Robinsonb9de1062015-07-15 22:04:54 +0000322 DebuggerTuning = DebuggerKind::LLDB;
323 else if (TT.isPS4CPU())
324 DebuggerTuning = DebuggerKind::SCE;
325 else
326 DebuggerTuning = DebuggerKind::GDB;
327
Eric Christopher68f22182018-05-18 03:13:08 +0000328 if (DwarfInlinedStrings == Default)
329 UseInlineStrings = TT.isNVPTX();
330 else
331 UseInlineStrings = DwarfInlinedStrings == Enable;
332
Alexey Bataev2a03d422018-06-29 14:23:28 +0000333 UseLocSection = !TT.isNVPTX();
334
David Blaikiec53e18d2016-05-24 21:19:28 +0000335 HasAppleExtensionAttributes = tuneForLLDB();
336
David Blaikie96b1ed52017-04-21 23:35:26 +0000337 // Handle split DWARF.
338 HasSplitDwarf = !Asm->TM.Options.MCOptions.SplitDwarfFile.empty();
Eric Christopher29424312012-11-12 22:22:20 +0000339
Paul Robinson43d1e452016-04-18 22:41:41 +0000340 // SCE defaults to linkage names only for abstract subprograms.
341 if (DwarfLinkageNames == DefaultLinkageNames)
342 UseAllLinkageNames = !tuneForSCE();
Paul Robinson78046b42015-08-11 21:36:45 +0000343 else
Paul Robinson43d1e452016-04-18 22:41:41 +0000344 UseAllLinkageNames = DwarfLinkageNames == AllLinkageNames;
Paul Robinson78046b42015-08-11 21:36:45 +0000345
Eric Christopher4c5bff32014-06-19 06:22:08 +0000346 unsigned DwarfVersionNumber = Asm->TM.Options.MCOptions.DwarfVersion;
Greg Claytone6543972016-11-23 23:30:37 +0000347 unsigned DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber
Eric Christopher793c7472014-04-28 20:42:22 +0000348 : MMI->getModule()->getDwarfVersion();
Eric Christopher68f22182018-05-18 03:13:08 +0000349 // Use dwarf 4 by default if nothing is requested. For NVPTX, use dwarf 2.
350 DwarfVersion =
351 TT.isNVPTX() ? 2 : (DwarfVersion ? DwarfVersion : dwarf::DWARF_VERSION);
Manman Renac8062b2013-07-02 23:40:10 +0000352
Eric Christopher68f22182018-05-18 03:13:08 +0000353 UseRangesSection = !NoDwarfRangesSection && !TT.isNVPTX();
Alexey Bataev648ed2d2018-03-20 16:04:40 +0000354
Eric Christopher68f22182018-05-18 03:13:08 +0000355 // Use sections as references. Force for NVPTX.
356 if (DwarfSectionsAsReferences == Default)
357 UseSectionsAsReferences = TT.isNVPTX();
358 else
359 UseSectionsAsReferences = DwarfSectionsAsReferences == Enable;
Alexey Bataevbff36082018-03-23 13:35:54 +0000360
Jonas Devlieghere8acb74e2018-08-01 12:53:06 +0000361 // Don't generate type units for unsupported object file formats.
362 GenerateTypeUnits =
363 A->TM.getTargetTriple().isOSBinFormatELF() && GenerateDwarfTypeUnits;
Pavel Labathf9adc202018-07-20 12:59:05 +0000364
365 TheAccelTableKind = computeAccelTableKind(
366 DwarfVersion, GenerateTypeUnits, DebuggerTuning, A->TM.getTargetTriple());
367
Paul Robinsonb9de1062015-07-15 22:04:54 +0000368 // Work around a GDB bug. GDB doesn't support the standard opcode;
369 // SCE doesn't support GNU's; LLDB prefers the standard opcode, which
370 // is defined as of DWARF 3.
371 // See GDB bug 11616 - DW_OP_form_tls_address is unimplemented
372 // https://sourceware.org/bugzilla/show_bug.cgi?id=11616
373 UseGNUTLSOpcode = tuneForGDB() || DwarfVersion < 3;
Paul Robinson78cc0822015-03-04 20:55:11 +0000374
Adrian Prantl6323ddf2016-05-17 21:07:16 +0000375 // GDB does not fully support the DWARF 4 representation for bitfields.
376 UseDWARF2Bitfields = (DwarfVersion < 4) || tuneForGDB();
377
Wolfgang Pieb456b5552018-01-26 18:52:58 +0000378 // The DWARF v5 string offsets table has - possibly shared - contributions
379 // from each compile and type unit each preceded by a header. The string
380 // offsets table used by the pre-DWARF v5 split-DWARF implementation uses
381 // a monolithic string offsets table without any header.
382 UseSegmentedStringOffsetsTable = DwarfVersion >= 5;
383
Lang Hames9ff69c82015-04-24 19:11:51 +0000384 Asm->OutStreamer->getContext().setDwarfVersion(DwarfVersion);
Bill Wendling2f921f82009-05-15 09:23:25 +0000385}
Bill Wendling2f921f82009-05-15 09:23:25 +0000386
Reid Klecknerdd2647e2014-04-30 20:34:31 +0000387// Define out of line so we don't have to include DwarfUnit.h in DwarfDebug.h.
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +0000388DwarfDebug::~DwarfDebug() = default;
Reid Klecknerdd2647e2014-04-30 20:34:31 +0000389
Eric Christopherd9843b32011-11-10 19:25:34 +0000390static bool isObjCClass(StringRef Name) {
391 return Name.startswith("+") || Name.startswith("-");
392}
393
394static bool hasObjCCategory(StringRef Name) {
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000395 if (!isObjCClass(Name))
396 return false;
Eric Christopherd9843b32011-11-10 19:25:34 +0000397
Benjamin Kramer260de742013-08-24 12:15:54 +0000398 return Name.find(") ") != StringRef::npos;
Eric Christopherd9843b32011-11-10 19:25:34 +0000399}
400
401static void getObjCClassCategory(StringRef In, StringRef &Class,
402 StringRef &Category) {
403 if (!hasObjCCategory(In)) {
404 Class = In.slice(In.find('[') + 1, In.find(' '));
405 Category = "";
406 return;
407 }
408
409 Class = In.slice(In.find('[') + 1, In.find('('));
410 Category = In.slice(In.find('[') + 1, In.find(' '));
Eric Christopherd9843b32011-11-10 19:25:34 +0000411}
412
413static StringRef getObjCMethodName(StringRef In) {
414 return In.slice(In.find(' ') + 1, In.find(']'));
415}
416
417// Add the various names to the Dwarf accelerator table names.
David Blaikie66cf14d2018-08-16 21:29:55 +0000418void DwarfDebug::addSubprogramNames(const DICompileUnit &CU,
419 const DISubprogram *SP, DIE &Die) {
420 if (getAccelTableKind() != AccelTableKind::Apple &&
421 CU.getNameTableKind() == DICompileUnit::DebugNameTableKind::None)
422 return;
423
Duncan P. N. Exon Smith537b4a82015-04-14 03:40:37 +0000424 if (!SP->isDefinition())
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000425 return;
Pavel Labath889bf9f2018-04-09 08:41:57 +0000426
427 if (SP->getName() != "")
David Blaikie66cf14d2018-08-16 21:29:55 +0000428 addAccelName(CU, SP->getName(), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000429
Pavel Labath2a6afe52018-05-14 14:13:20 +0000430 // If the linkage name is different than the name, go ahead and output that as
431 // well into the name table. Only do that if we are going to actually emit
432 // that name.
433 if (SP->getLinkageName() != "" && SP->getName() != SP->getLinkageName() &&
434 (useAllLinkageNames() || InfoHolder.getAbstractSPDies().lookup(SP)))
David Blaikie66cf14d2018-08-16 21:29:55 +0000435 addAccelName(CU, SP->getLinkageName(), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000436
437 // If this is an Objective-C selector name add it to the ObjC accelerator
438 // too.
Duncan P. N. Exon Smith537b4a82015-04-14 03:40:37 +0000439 if (isObjCClass(SP->getName())) {
Eric Christopherd9843b32011-11-10 19:25:34 +0000440 StringRef Class, Category;
Duncan P. N. Exon Smith537b4a82015-04-14 03:40:37 +0000441 getObjCClassCategory(SP->getName(), Class, Category);
David Blaikie66cf14d2018-08-16 21:29:55 +0000442 addAccelObjC(CU, Class, Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000443 if (Category != "")
David Blaikie66cf14d2018-08-16 21:29:55 +0000444 addAccelObjC(CU, Category, Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000445 // Also add the base method name to the name table.
David Blaikie66cf14d2018-08-16 21:29:55 +0000446 addAccelName(CU, getObjCMethodName(SP->getName()), Die);
Eric Christopherd9843b32011-11-10 19:25:34 +0000447 }
448}
449
Manman Ren5b2f4b02013-09-11 19:40:28 +0000450/// Check whether we should create a DIE for the given Scope, return true
451/// if we don't create a DIE (the corresponding DIE is null).
Manman Ren2312ed32013-09-10 18:40:41 +0000452bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
453 if (Scope->isAbstractScope())
454 return false;
455
Manman Ren5b2f4b02013-09-11 19:40:28 +0000456 // We don't create a DIE if there is no Range.
Manman Ren2312ed32013-09-10 18:40:41 +0000457 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
458 if (Ranges.empty())
459 return true;
460
461 if (Ranges.size() > 1)
462 return false;
463
Manman Ren5b2f4b02013-09-11 19:40:28 +0000464 // We don't create a DIE if we have a single Range and the end label
465 // is null.
David Blaikiecd4b8a22014-08-31 02:14:26 +0000466 return !getLabelAfterInsn(Ranges.front().second);
Manman Ren2312ed32013-09-10 18:40:41 +0000467}
468
Benjamin Kramerb7d33112016-08-06 11:13:10 +0000469template <typename Func> static void forBothCUs(DwarfCompileUnit &CU, Func F) {
David Blaikie3a443c22014-11-04 22:12:25 +0000470 F(CU);
471 if (auto *SkelCU = CU.getSkeleton())
David Blaikiea01f2952016-08-24 18:29:49 +0000472 if (CU.getCUNode()->getSplitDebugInlining())
473 F(*SkelCU);
David Blaikie3a443c22014-11-04 22:12:25 +0000474}
475
David Blaikie488393f2017-05-12 01:13:45 +0000476bool DwarfDebug::shareAcrossDWOCUs() const {
477 return SplitDwarfCrossCuReferences;
478}
479
480void DwarfDebug::constructAbstractSubprogramScopeDIE(DwarfCompileUnit &SrcCU,
481 LexicalScope *Scope) {
David Blaikiee872a6e2014-04-29 15:58:35 +0000482 assert(Scope && Scope->getScopeNode());
483 assert(Scope->isAbstractScope());
484 assert(!Scope->getInlinedAt());
485
David Blaikieb4614682016-12-14 19:38:39 +0000486 auto *SP = cast<DISubprogram>(Scope->getScopeNode());
David Blaikiee872a6e2014-04-29 15:58:35 +0000487
David Blaikie1ea9db22014-05-21 23:14:12 +0000488 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
489 // was inlined from another compile unit.
Mehdi Amini41812052017-05-29 06:25:30 +0000490 if (useSplitDwarf() && !shareAcrossDWOCUs() && !SP->getUnit()->getSplitDebugInlining())
491 // Avoid building the original CU if it won't be used
492 SrcCU.constructAbstractSubprogramScopeDIE(Scope);
493 else {
494 auto &CU = getOrCreateDwarfCompileUnit(SP->getUnit());
495 if (auto *SkelCU = CU.getSkeleton()) {
496 (shareAcrossDWOCUs() ? CU : SrcCU)
497 .constructAbstractSubprogramScopeDIE(Scope);
498 if (CU.getCUNode()->getSplitDebugInlining())
499 SkelCU->constructAbstractSubprogramScopeDIE(Scope);
500 } else
501 CU.constructAbstractSubprogramScopeDIE(Scope);
David Blaikie488393f2017-05-12 01:13:45 +0000502 }
David Blaikiee872a6e2014-04-29 15:58:35 +0000503}
504
Vedant Kumar5931b4e2018-10-05 20:37:17 +0000505void DwarfDebug::constructCallSiteEntryDIEs(const DISubprogram &SP,
506 DwarfCompileUnit &CU, DIE &ScopeDIE,
507 const MachineFunction &MF) {
508 // Add a call site-related attribute (DWARF5, Sec. 3.3.1.3). Do this only if
509 // the subprogram is required to have one.
510 if (!SP.areAllCallsDescribed() || !SP.isDefinition())
511 return;
512
513 // Use DW_AT_call_all_calls to express that call site entries are present
514 // for both tail and non-tail calls. Don't use DW_AT_call_all_source_calls
515 // because one of its requirements is not met: call site entries for
516 // optimized-out calls are elided.
517 CU.addFlag(ScopeDIE, dwarf::DW_AT_call_all_calls);
518
519 const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
520 assert(TII && "TargetInstrInfo not found: cannot label tail calls");
521
522 // Emit call site entries for each call or tail call in the function.
523 for (const MachineBasicBlock &MBB : MF) {
524 for (const MachineInstr &MI : MBB.instrs()) {
525 // Skip instructions which aren't calls. Both calls and tail-calling jump
526 // instructions (e.g TAILJMPd64) are classified correctly here.
527 if (!MI.isCall())
528 continue;
529
530 // TODO: Add support for targets with delay slots (see: beginInstruction).
531 if (MI.hasDelaySlot())
532 return;
533
534 // If this is a direct call, find the callee's subprogram.
535 const MachineOperand &CalleeOp = MI.getOperand(0);
536 if (!CalleeOp.isGlobal())
537 continue;
538 const Function *CalleeDecl = dyn_cast<Function>(CalleeOp.getGlobal());
539 if (!CalleeDecl || !CalleeDecl->getSubprogram())
540 continue;
541
542 // TODO: Omit call site entries for runtime calls (objc_msgSend, etc).
543 // TODO: Add support for indirect calls.
544
545 bool IsTail = TII->isTailCall(MI);
546
547 // For tail calls, no return PC information is needed. For regular calls,
548 // the return PC is needed to disambiguate paths in the call graph which
549 // could lead to some target function.
Vedant Kumar74533bd2018-10-22 21:44:21 +0000550 const MCExpr *PCOffset =
551 IsTail ? nullptr : getFunctionLocalOffsetAfterInsn(&MI);
Vedant Kumar5931b4e2018-10-05 20:37:17 +0000552
Vedant Kumar74533bd2018-10-22 21:44:21 +0000553 assert((IsTail || PCOffset) && "Call without return PC information");
Vedant Kumar5931b4e2018-10-05 20:37:17 +0000554 LLVM_DEBUG(dbgs() << "CallSiteEntry: " << MF.getName() << " -> "
555 << CalleeDecl->getName() << (IsTail ? " [tail]" : "")
556 << "\n");
557 CU.constructCallSiteEntryDIE(ScopeDIE, *CalleeDecl->getSubprogram(),
Vedant Kumar74533bd2018-10-22 21:44:21 +0000558 IsTail, PCOffset);
Vedant Kumar5931b4e2018-10-05 20:37:17 +0000559 }
560 }
561}
562
David Blaikieb3cee2f2017-05-25 18:50:28 +0000563void DwarfDebug::addGnuPubAttributes(DwarfCompileUnit &U, DIE &D) const {
Peter Collingbourneb52e2362017-09-12 21:50:41 +0000564 if (!U.hasDwarfPubSections())
David Blaikie3c842622013-12-04 21:31:26 +0000565 return;
566
David Blaikief9b6a552014-04-22 22:39:41 +0000567 U.addFlag(D, dwarf::DW_AT_GNU_pubnames);
David Blaikie3c842622013-12-04 21:31:26 +0000568}
569
David Blaikie560ff352018-12-14 22:44:46 +0000570void DwarfDebug::finishUnitAttributes(const DICompileUnit *DIUnit,
571 DwarfCompileUnit &NewCU) {
David Blaikie92a2f8a2014-04-28 21:04:29 +0000572 DIE &Die = NewCU.getUnitDie();
David Blaikie560ff352018-12-14 22:44:46 +0000573 StringRef FN = DIUnit->getFilename();
David Blaikief9b6a552014-04-22 22:39:41 +0000574
Eric Christopher9ea300f2017-03-29 23:34:27 +0000575 StringRef Producer = DIUnit->getProducer();
576 StringRef Flags = DIUnit->getFlags();
Jonas Devliegherecaacedb2018-08-08 16:33:22 +0000577 if (!Flags.empty() && !useAppleExtensionAttributes()) {
Eric Christopher9ea300f2017-03-29 23:34:27 +0000578 std::string ProducerWithFlags = Producer.str() + " " + Flags.str();
579 NewCU.addString(Die, dwarf::DW_AT_producer, ProducerWithFlags);
580 } else
581 NewCU.addString(Die, dwarf::DW_AT_producer, Producer);
582
David Blaikie92a2f8a2014-04-28 21:04:29 +0000583 NewCU.addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
Duncan P. N. Exon Smith35ef22c2015-04-15 23:19:27 +0000584 DIUnit->getSourceLanguage());
David Blaikie92a2f8a2014-04-28 21:04:29 +0000585 NewCU.addString(Die, dwarf::DW_AT_name, FN);
Eric Christopher52ce7182013-04-09 19:23:15 +0000586
Wolfgang Pieb456b5552018-01-26 18:52:58 +0000587 // Add DW_str_offsets_base to the unit DIE, except for split units.
588 if (useSegmentedStringOffsetsTable() && !useSplitDwarf())
589 NewCU.addStringOffsetsStart();
590
Eric Christopher52ce7182013-04-09 19:23:15 +0000591 if (!useSplitDwarf()) {
Rafael Espindola063d7252015-03-10 16:58:10 +0000592 NewCU.initStmtList();
Eric Christophera51d3fc2013-09-27 22:50:48 +0000593
594 // If we're using split dwarf the compilation dir is going to be in the
595 // skeleton CU and so we don't need to duplicate it here.
596 if (!CompilationDir.empty())
David Blaikie92a2f8a2014-04-28 21:04:29 +0000597 NewCU.addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christophera51d3fc2013-09-27 22:50:48 +0000598
David Blaikie92a2f8a2014-04-28 21:04:29 +0000599 addGnuPubAttributes(NewCU, Die);
Eric Christopher52ce7182013-04-09 19:23:15 +0000600 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000601
David Blaikiec53e18d2016-05-24 21:19:28 +0000602 if (useAppleExtensionAttributes()) {
603 if (DIUnit->isOptimized())
604 NewCU.addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendling2b128d72009-05-20 23:19:06 +0000605
David Blaikiec53e18d2016-05-24 21:19:28 +0000606 StringRef Flags = DIUnit->getFlags();
607 if (!Flags.empty())
608 NewCU.addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher6a841382012-11-19 22:42:10 +0000609
David Blaikiec53e18d2016-05-24 21:19:28 +0000610 if (unsigned RVer = DIUnit->getRuntimeVersion())
611 NewCU.addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
612 dwarf::DW_FORM_data1, RVer);
613 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000614
Adrian Prantldeef90d2015-09-14 22:10:22 +0000615 if (DIUnit->getDWOId()) {
Adrian Prantl77fefeb2015-09-22 23:21:00 +0000616 // This CU is either a clang module DWO or a skeleton CU.
Adrian Prantldeef90d2015-09-14 22:10:22 +0000617 NewCU.addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8,
618 DIUnit->getDWOId());
Adrian Prantl77fefeb2015-09-22 23:21:00 +0000619 if (!DIUnit->getSplitDebugFilename().empty())
620 // This is a prefabricated skeleton CU.
621 NewCU.addString(Die, dwarf::DW_AT_GNU_dwo_name,
622 DIUnit->getSplitDebugFilename());
Adrian Prantldeef90d2015-09-14 22:10:22 +0000623 }
David Blaikie560ff352018-12-14 22:44:46 +0000624}
625// Create new DwarfCompileUnit for the given metadata node with tag
626// DW_TAG_compile_unit.
627DwarfCompileUnit &
628DwarfDebug::getOrCreateDwarfCompileUnit(const DICompileUnit *DIUnit) {
629 if (auto *CU = CUMap.lookup(DIUnit))
630 return *CU;
631
632 CompilationDir = DIUnit->getDirectory();
633
634 auto OwnedUnit = llvm::make_unique<DwarfCompileUnit>(
635 InfoHolder.getUnits().size(), DIUnit, Asm, this, &InfoHolder);
636 DwarfCompileUnit &NewCU = *OwnedUnit;
637 InfoHolder.addUnit(std::move(OwnedUnit));
638
David Blaikie693f6172018-12-18 19:40:22 +0000639 for (auto *IE : DIUnit->getImportedEntities())
640 NewCU.addImportedEntity(IE);
641
David Blaikieb3c56af2018-12-20 20:46:55 +0000642 // LTO with assembly output shares a single line table amongst multiple CUs.
643 // To avoid the compilation directory being ambiguous, let the line table
644 // explicitly describe the directory of all files, never relying on the
645 // compilation directory.
646 if (!Asm->OutStreamer->hasRawTextSupport() || SingleCU)
647 Asm->OutStreamer->emitDwarfFile0Directive(
648 CompilationDir, DIUnit->getFilename(),
649 NewCU.getMD5AsBytes(DIUnit->getFile()), DIUnit->getSource(),
650 NewCU.getUniqueID());
651
David Blaikie560ff352018-12-14 22:44:46 +0000652 if (useSplitDwarf()) {
653 NewCU.setSkeleton(constructSkeletonCU(NewCU));
654 NewCU.setSection(Asm->getObjFileLowering().getDwarfInfoDWOSection());
655 } else {
656 finishUnitAttributes(DIUnit, NewCU);
657 NewCU.setSection(Asm->getObjFileLowering().getDwarfInfoSection());
658 }
Adrian Prantldeef90d2015-09-14 22:10:22 +0000659
David Majnemer0a16c222016-08-11 21:15:00 +0000660 CUMap.insert({DIUnit, &NewCU});
David Blaikie560ff352018-12-14 22:44:46 +0000661 CUDieMap.insert({&NewCU.getUnitDie(), &NewCU});
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000662 return NewCU;
Devang Patel1a0df9a2010-05-10 22:49:55 +0000663}
664
David Blaikie8912df12014-08-31 05:41:15 +0000665void DwarfDebug::constructAndAddImportedEntityDIE(DwarfCompileUnit &TheCU,
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000666 const DIImportedEntity *N) {
David Blaikie2195e132017-07-27 00:06:53 +0000667 if (isa<DILocalScope>(N->getScope()))
668 return;
Duncan P. N. Exon Smith60635e32015-04-21 18:44:06 +0000669 if (DIE *D = TheCU.getOrCreateContextDIE(N->getScope()))
670 D->addChild(TheCU.constructImportedEntityDIE(N));
David Blaikief55abea2013-04-22 06:12:31 +0000671}
672
Adrian Prantlbceaaa92016-12-20 02:09:43 +0000673/// Sort and unique GVEs by comparing their fragment offset.
674static SmallVectorImpl<DwarfCompileUnit::GlobalExpr> &
675sortGlobalExprs(SmallVectorImpl<DwarfCompileUnit::GlobalExpr> &GVEs) {
Fangrui Song0cac7262018-09-27 02:13:45 +0000676 llvm::sort(
677 GVEs, [](DwarfCompileUnit::GlobalExpr A, DwarfCompileUnit::GlobalExpr B) {
678 // Sort order: first null exprs, then exprs without fragment
679 // info, then sort by fragment offset in bits.
680 // FIXME: Come up with a more comprehensive comparator so
681 // the sorting isn't non-deterministic, and so the following
682 // std::unique call works correctly.
683 if (!A.Expr || !B.Expr)
684 return !!B.Expr;
685 auto FragmentA = A.Expr->getFragmentInfo();
686 auto FragmentB = B.Expr->getFragmentInfo();
687 if (!FragmentA || !FragmentB)
688 return !!FragmentB;
689 return FragmentA->OffsetInBits < FragmentB->OffsetInBits;
690 });
Adrian Prantlbceaaa92016-12-20 02:09:43 +0000691 GVEs.erase(std::unique(GVEs.begin(), GVEs.end(),
692 [](DwarfCompileUnit::GlobalExpr A,
693 DwarfCompileUnit::GlobalExpr B) {
694 return A.Expr == B.Expr;
695 }),
696 GVEs.end());
697 return GVEs;
698}
699
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000700// Emit all Dwarf sections that should come prior to the content. Create
701// global DIEs and emit initial debug info sections. This is invoked by
702// the target AsmPrinter.
Eric Christopher58f41952012-11-19 22:42:15 +0000703void DwarfDebug::beginModule() {
Matthias Braun9f15a792016-11-18 19:43:18 +0000704 NamedRegionTimer T(DbgTimerName, DbgTimerDescription, DWARFGroupName,
705 DWARFGroupDescription, TimePassesIsEnabled);
Matthias Braun8763c0c2018-10-31 17:18:41 +0000706 if (DisableDebugInfoPrinting) {
707 MMI->setDebugInfoAvailability(false);
Devang Patel6c74a872010-04-27 19:46:33 +0000708 return;
Matthias Braun8763c0c2018-10-31 17:18:41 +0000709 }
Devang Patel6c74a872010-04-27 19:46:33 +0000710
Eric Christopher58f41952012-11-19 22:42:15 +0000711 const Module *M = MMI->getModule();
712
Peter Collingbourneb3269862016-06-01 02:58:40 +0000713 unsigned NumDebugCUs = std::distance(M->debug_compile_units_begin(),
714 M->debug_compile_units_end());
Adrian Prantl5992a722016-04-08 22:43:03 +0000715 // Tell MMI whether we have debug info.
Matthias Braun8763c0c2018-10-31 17:18:41 +0000716 assert(MMI->hasDebugInfo() == (NumDebugCUs > 0) &&
717 "DebugInfoAvailabilty initialized unexpectedly");
Adrian Prantl5992a722016-04-08 22:43:03 +0000718 SingleCU = NumDebugCUs == 1;
Adrian Prantlbceaaa92016-12-20 02:09:43 +0000719 DenseMap<DIGlobalVariable *, SmallVector<DwarfCompileUnit::GlobalExpr, 1>>
720 GVMap;
Peter Collingbourned4135bb2016-09-13 01:12:59 +0000721 for (const GlobalVariable &Global : M->globals()) {
Adrian Prantlbceaaa92016-12-20 02:09:43 +0000722 SmallVector<DIGlobalVariableExpression *, 1> GVs;
Peter Collingbourned4135bb2016-09-13 01:12:59 +0000723 Global.getDebugInfo(GVs);
Adrian Prantlbceaaa92016-12-20 02:09:43 +0000724 for (auto *GVE : GVs)
725 GVMap[GVE->getVariable()].push_back({&Global, GVE->getExpression()});
Peter Collingbourned4135bb2016-09-13 01:12:59 +0000726 }
727
Wolfgang Pieb456b5552018-01-26 18:52:58 +0000728 // Create the symbol that designates the start of the unit's contribution
729 // to the string offsets table. In a split DWARF scenario, only the skeleton
730 // unit has the DW_AT_str_offsets_base attribute (and hence needs the symbol).
731 if (useSegmentedStringOffsetsTable())
732 (useSplitDwarf() ? SkeletonHolder : InfoHolder)
733 .setStringOffsetsStartSym(Asm->createTempSymbol("str_offsets_base"));
734
George Rimar088d96b2018-10-26 11:25:12 +0000735
736 // Create the symbols that designates the start of the DWARF v5 range list
737 // and locations list tables. They are located past the table headers.
David Blaikiec4af8bf2018-10-20 07:36:39 +0000738 if (getDwarfVersion() >= 5) {
George Rimar088d96b2018-10-26 11:25:12 +0000739 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
740 Holder.setRnglistsTableBaseSym(
741 Asm->createTempSymbol("rnglists_table_base"));
742 Holder.setLoclistsTableBaseSym(
743 Asm->createTempSymbol("loclists_table_base"));
744
David Blaikiec4af8bf2018-10-20 07:36:39 +0000745 if (useSplitDwarf())
746 InfoHolder.setRnglistsTableBaseSym(
747 Asm->createTempSymbol("rnglists_dwo_table_base"));
748 }
Wolfgang Piebfcf38102018-07-12 18:18:21 +0000749
George Rimar425f7512018-09-20 09:17:36 +0000750 // Create the symbol that points to the first entry following the debug
751 // address table (.debug_addr) header.
752 AddrPool.setLabel(Asm->createTempSymbol("addr_table_base"));
753
Adrian Prantl5992a722016-04-08 22:43:03 +0000754 for (DICompileUnit *CUNode : M->debug_compile_units()) {
David Blaikie89daf772017-07-28 03:06:25 +0000755 // FIXME: Move local imported entities into a list attached to the
756 // subprogram, then this search won't be needed and a
757 // getImportedEntities().empty() test should go below with the rest.
758 bool HasNonLocalImportedEntities = llvm::any_of(
759 CUNode->getImportedEntities(), [](const DIImportedEntity *IE) {
760 return !isa<DILocalScope>(IE->getScope());
761 });
762
763 if (!HasNonLocalImportedEntities && CUNode->getEnumTypes().empty() &&
764 CUNode->getRetainedTypes().empty() &&
765 CUNode->getGlobalVariables().empty() && CUNode->getMacros().empty())
David Blaikie07963bd2017-05-26 18:52:56 +0000766 continue;
767
768 DwarfCompileUnit &CU = getOrCreateDwarfCompileUnit(CUNode);
Adrian Prantlbceaaa92016-12-20 02:09:43 +0000769
770 // Global Variables.
Adrian Prantl2116dd32017-08-19 01:15:06 +0000771 for (auto *GVE : CUNode->getGlobalVariables()) {
772 // Don't bother adding DIGlobalVariableExpressions listed in the CU if we
773 // already know about the variable and it isn't adding a constant
774 // expression.
775 auto &GVMapEntry = GVMap[GVE->getVariable()];
776 auto *Expr = GVE->getExpression();
777 if (!GVMapEntry.size() || (Expr && Expr->isConstant()))
778 GVMapEntry.push_back({nullptr, Expr});
779 }
Adrian Prantlbceaaa92016-12-20 02:09:43 +0000780 DenseSet<DIGlobalVariable *> Processed;
781 for (auto *GVE : CUNode->getGlobalVariables()) {
782 DIGlobalVariable *GV = GVE->getVariable();
783 if (Processed.insert(GV).second)
784 CU.getOrCreateGlobalVariableDIE(GV, sortGlobalExprs(GVMap[GV]));
785 }
786
Duncan P. N. Exon Smith9928a902015-04-20 18:52:06 +0000787 for (auto *Ty : CUNode->getEnumTypes()) {
Manman Renbd1628a2014-07-28 23:04:20 +0000788 // The enum types array by design contains pointers to
789 // MDNodes rather than DIRefs. Unique them here.
Duncan P. N. Exon Smitha59d3e52016-04-23 21:08:00 +0000790 CU.getOrCreateTypeDIE(cast<DIType>(Ty));
Manman Renbd1628a2014-07-28 23:04:20 +0000791 }
Duncan P. N. Exon Smith9928a902015-04-20 18:52:06 +0000792 for (auto *Ty : CUNode->getRetainedTypes()) {
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000793 // The retained types array by design contains pointers to
794 // MDNodes rather than DIRefs. Unique them here.
Amjad Aboud72da9392016-04-30 01:44:07 +0000795 if (DIType *RT = dyn_cast<DIType>(Ty))
Adrian Prantl75819ae2016-04-15 15:57:41 +0000796 // There is no point in force-emitting a forward declaration.
797 CU.getOrCreateTypeDIE(RT);
Adrian Prantl0aa1aa22014-03-18 02:35:03 +0000798 }
David Blaikief55abea2013-04-22 06:12:31 +0000799 // Emit imported_modules last so that the relevant context is already
800 // available.
Duncan P. N. Exon Smith000fa2c2015-04-07 04:14:33 +0000801 for (auto *IE : CUNode->getImportedEntities())
Amjad Aboud72da9392016-04-30 01:44:07 +0000802 constructAndAddImportedEntityDIE(CU, IE);
David Blaikiedc69ebb2013-03-11 23:39:23 +0000803 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000804}
805
Hsiangkai Wang2532ac82018-08-17 15:22:04 +0000806void DwarfDebug::finishEntityDefinitions() {
807 for (const auto &Entity : ConcreteEntities) {
808 DIE *Die = Entity->getDIE();
809 assert(Die);
David Blaikieeb1a2722014-06-13 22:18:23 +0000810 // FIXME: Consider the time-space tradeoff of just storing the unit pointer
Hsiangkai Wang2532ac82018-08-17 15:22:04 +0000811 // in the ConcreteEntities list, rather than looking it up again here.
David Blaikieeb1a2722014-06-13 22:18:23 +0000812 // DIE::getUnit isn't simple - it walks parent pointers, etc.
Hsiangkai Wang2532ac82018-08-17 15:22:04 +0000813 DwarfCompileUnit *Unit = CUDieMap.lookup(Die->getUnitDie());
David Blaikieeb1a2722014-06-13 22:18:23 +0000814 assert(Unit);
Hsiangkai Wang2532ac82018-08-17 15:22:04 +0000815 Unit->finishEntityDefinition(Entity.get());
David Blaikieeb1a2722014-06-13 22:18:23 +0000816 }
817}
818
David Blaikief7221ad2014-05-27 18:37:43 +0000819void DwarfDebug::finishSubprogramDefinitions() {
David Blaikie07963bd2017-05-26 18:52:56 +0000820 for (const DISubprogram *SP : ProcessedSPNodes) {
821 assert(SP->getUnit()->getEmissionKind() != DICompileUnit::NoDebug);
822 forBothCUs(
823 getOrCreateDwarfCompileUnit(SP->getUnit()),
824 [&](DwarfCompileUnit &CU) { CU.finishSubprogramDefinition(SP); });
825 }
Eric Christopher960ac372012-11-22 00:59:49 +0000826}
827
828void DwarfDebug::finalizeModuleInfo() {
Rafael Espindola063d7252015-03-10 16:58:10 +0000829 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
830
David Blaikie3c2fff32014-05-27 18:37:48 +0000831 finishSubprogramDefinitions();
832
Hsiangkai Wang2532ac82018-08-17 15:22:04 +0000833 finishEntityDefinitions();
David Blaikieeb1a2722014-06-13 22:18:23 +0000834
Mehdi Amini96ab48f2017-05-29 06:32:34 +0000835 // Include the DWO file name in the hash if there's more than one CU.
836 // This handles ThinLTO's situation where imported CUs may very easily be
837 // duplicate with the same CU partially imported into another ThinLTO unit.
838 StringRef DWOName;
839 if (CUMap.size() > 1)
840 DWOName = Asm->TM.Options.MCOptions.SplitDwarfFile;
841
Eric Christopherad10cb52013-12-04 23:24:38 +0000842 // Handle anything that needs to be done on a per-unit basis after
843 // all other generation.
David Blaikie1998a2e2014-11-01 01:11:19 +0000844 for (const auto &P : CUMap) {
845 auto &TheCU = *P.second;
Alexey Bataevd4dd7212018-08-01 19:38:20 +0000846 if (TheCU.getCUNode()->isDebugDirectivesOnly())
847 continue;
Eric Christopher60eb7692013-08-12 20:27:48 +0000848 // Emit DW_AT_containing_type attribute to connect types with their
849 // vtable holding type.
David Blaikie1998a2e2014-11-01 01:11:19 +0000850 TheCU.constructContainingTypeDIEs();
Eric Christopher60eb7692013-08-12 20:27:48 +0000851
Eric Christopher46e23432013-12-20 04:16:18 +0000852 // Add CU specific attributes if we need to add any.
David Blaikie1998a2e2014-11-01 01:11:19 +0000853 // If we're splitting the dwarf out now that we've got the entire
854 // CU then add the dwo id to it.
855 auto *SkCU = TheCU.getSkeleton();
David Blaikie560ff352018-12-14 22:44:46 +0000856 if (useSplitDwarf() && !empty(TheCU.getUnitDie().children())) {
857 finishUnitAttributes(TheCU.getCUNode(), TheCU);
858 TheCU.addString(TheCU.getUnitDie(), dwarf::DW_AT_GNU_dwo_name,
859 Asm->TM.Options.MCOptions.SplitDwarfFile);
860 SkCU->addString(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_name,
861 Asm->TM.Options.MCOptions.SplitDwarfFile);
David Blaikie1998a2e2014-11-01 01:11:19 +0000862 // Emit a unique identifier for this CU.
Mehdi Amini96ab48f2017-05-29 06:32:34 +0000863 uint64_t ID =
864 DIEHash(Asm).computeCUSignature(DWOName, TheCU.getUnitDie());
Paul Robinson543c0e12018-05-22 17:27:31 +0000865 if (getDwarfVersion() >= 5) {
866 TheCU.setDWOId(ID);
867 SkCU->setDWOId(ID);
868 } else {
869 TheCU.addUInt(TheCU.getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
870 dwarf::DW_FORM_data8, ID);
871 SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
872 dwarf::DW_FORM_data8, ID);
873 }
George Rimar425f7512018-09-20 09:17:36 +0000874
David Blaikiec4af8bf2018-10-20 07:36:39 +0000875 if (getDwarfVersion() < 5 && !SkeletonHolder.getRangeLists().empty()) {
Rafael Espindola063d7252015-03-10 16:58:10 +0000876 const MCSymbol *Sym = TLOF.getDwarfRangesSection()->getBeginSymbol();
David Blaikie1998a2e2014-11-01 01:11:19 +0000877 SkCU->addSectionLabel(SkCU->getUnitDie(), dwarf::DW_AT_GNU_ranges_base,
Rafael Espindola063d7252015-03-10 16:58:10 +0000878 Sym, Sym);
879 }
David Blaikie560ff352018-12-14 22:44:46 +0000880 } else if (SkCU) {
881 finishUnitAttributes(SkCU->getCUNode(), *SkCU);
David Blaikie1998a2e2014-11-01 01:11:19 +0000882 }
Eric Christopherd8667202013-12-30 17:22:27 +0000883
David Blaikie1998a2e2014-11-01 01:11:19 +0000884 // If we have code split among multiple sections or non-contiguous
885 // ranges of code then emit a DW_AT_ranges attribute on the unit that will
886 // remain in the .o file, otherwise add a DW_AT_low_pc.
887 // FIXME: We should use ranges allow reordering of code ala
888 // .subsections_via_symbols in mach-o. This would mean turning on
889 // ranges for all subprogram DIEs for mach-o.
David Blaikiea8be0a72014-11-01 01:15:24 +0000890 DwarfCompileUnit &U = SkCU ? *SkCU : TheCU;
David Blaikie161dd3c2018-10-20 06:02:15 +0000891
892 // We don't keep track of which addresses are used in which CU so this
893 // is a bit pessimistic under LTO.
David Blaikie560ff352018-12-14 22:44:46 +0000894 if (!AddrPool.isEmpty() &&
895 (getDwarfVersion() >= 5 ||
896 (SkCU && !empty(TheCU.getUnitDie().children()))))
David Blaikie161dd3c2018-10-20 06:02:15 +0000897 U.addAddrTableBase();
898
David Blaikie5b02a192014-11-03 23:10:59 +0000899 if (unsigned NumRanges = TheCU.getRanges().size()) {
Alexey Bataev858a7dd2018-03-20 20:21:38 +0000900 if (NumRanges > 1 && useRangesSection())
David Blaikie1998a2e2014-11-01 01:11:19 +0000901 // A DW_AT_low_pc attribute may also be specified in combination with
902 // DW_AT_ranges to specify the default base address for use in
903 // location lists (see Section 2.6.2) and range lists (see Section
904 // 2.17.3).
905 U.addUInt(U.getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
David Blaikie5b02a192014-11-03 23:10:59 +0000906 else
David Blaikie72d03ef2015-05-02 02:31:49 +0000907 U.setBaseAddress(TheCU.getRanges().front().getStart());
David Blaikie5b02a192014-11-03 23:10:59 +0000908 U.attachRangesOrLowHighPC(U.getUnitDie(), TheCU.takeRanges());
Eric Christopher60eb7692013-08-12 20:27:48 +0000909 }
Amjad Aboudd7cfb482016-01-07 14:28:20 +0000910
George Rimar088d96b2018-10-26 11:25:12 +0000911 if (getDwarfVersion() >= 5) {
912 if (U.hasRangeLists())
913 U.addRnglistsBase();
914
915 if (!DebugLocs.getLists().empty() && !useSplitDwarf())
916 U.addLoclistsBase();
917 }
Wolfgang Pieb9ea65082018-07-26 22:48:52 +0000918
Amjad Aboudd7cfb482016-01-07 14:28:20 +0000919 auto *CUNode = cast<DICompileUnit>(P.first);
Amjad Aboud8bbce8a2016-02-01 14:09:41 +0000920 // If compile Unit has macros, emit "DW_AT_macro_info" attribute.
921 if (CUNode->getMacros())
922 U.addSectionLabel(U.getUnitDie(), dwarf::DW_AT_macro_info,
923 U.getMacroLabelBegin(),
924 TLOF.getDwarfMacinfoSection()->getBeginSymbol());
Eric Christopher60eb7692013-08-12 20:27:48 +0000925 }
926
Adrian Prantl833ad372017-07-26 18:48:32 +0000927 // Emit all frontend-produced Skeleton CUs, i.e., Clang modules.
928 for (auto *CUNode : MMI->getModule()->debug_compile_units())
Adrian Prantl960e7662017-07-27 15:24:20 +0000929 if (CUNode->getDWOId())
Adrian Prantl833ad372017-07-26 18:48:32 +0000930 getOrCreateDwarfCompileUnit(CUNode);
931
Eric Christopher60eb7692013-08-12 20:27:48 +0000932 // Compute DIE offsets and sizes.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000933 InfoHolder.computeSizeAndOffsets();
934 if (useSplitDwarf())
935 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher960ac372012-11-22 00:59:49 +0000936}
937
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000938// Emit all Dwarf sections that should come after the content.
Eric Christopher960ac372012-11-22 00:59:49 +0000939void DwarfDebug::endModule() {
Craig Toppere73658d2014-04-28 04:05:08 +0000940 assert(CurFn == nullptr);
941 assert(CurMI == nullptr);
Eric Christopher960ac372012-11-22 00:59:49 +0000942
David Blaikie0dc623c2014-10-24 17:53:38 +0000943 // If we aren't actually generating debug info (check beginModule -
944 // conditionalized on !DisableDebugInfoPrinting and the presence of the
945 // llvm.dbg.cu metadata node)
Rafael Espindolaf1a13f52015-03-11 00:51:37 +0000946 if (!MMI->hasDebugInfo())
Eric Christopherb4bef6d2013-11-19 09:04:36 +0000947 return;
Eric Christopher960ac372012-11-22 00:59:49 +0000948
Eric Christopher960ac372012-11-22 00:59:49 +0000949 // Finalize the debug info for the module.
950 finalizeModuleInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +0000951
Eric Christopher9a8f5ed2013-11-19 09:04:50 +0000952 emitDebugStr();
Eric Christopher9cd26af2013-09-20 23:22:52 +0000953
Rafael Espindola063d7252015-03-10 16:58:10 +0000954 if (useSplitDwarf())
955 emitDebugLocDWO();
956 else
957 // Emit info into a debug loc section.
958 emitDebugLoc();
959
Eric Christopher9a8f5ed2013-11-19 09:04:50 +0000960 // Corresponding abbreviations into a abbrev section.
961 emitAbbreviations();
Eric Christopher95198f502012-11-27 22:43:42 +0000962
Rafael Espindolaf1a13f52015-03-11 00:51:37 +0000963 // Emit all the DIEs into a debug info section.
964 emitDebugInfo();
965
Eric Christopher9a8f5ed2013-11-19 09:04:50 +0000966 // Emit info into a debug aranges section.
Eric Christopher02dbadb2014-02-14 01:26:55 +0000967 if (GenerateARangeSection)
968 emitDebugARanges();
Eric Christopher95198f502012-11-27 22:43:42 +0000969
Eric Christopher9a8f5ed2013-11-19 09:04:50 +0000970 // Emit info into a debug ranges section.
971 emitDebugRanges();
Eric Christopher95198f502012-11-27 22:43:42 +0000972
Amjad Aboudd7cfb482016-01-07 14:28:20 +0000973 // Emit info into a debug macinfo section.
974 emitDebugMacinfo();
975
Eric Christopher9a8f5ed2013-11-19 09:04:50 +0000976 if (useSplitDwarf()) {
977 emitDebugStrDWO();
Eric Christopher9c2ecd92012-11-30 23:59:06 +0000978 emitDebugInfoDWO();
Eric Christopher3c5a1912012-12-19 22:02:53 +0000979 emitDebugAbbrevDWO();
David Blaikie4a2f95f2014-03-18 01:17:26 +0000980 emitDebugLineDWO();
David Blaikie32e09de2018-10-20 08:12:36 +0000981 emitDebugRangesDWO();
Rafael Espindola063d7252015-03-10 16:58:10 +0000982 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000983
David Blaikie161dd3c2018-10-20 06:02:15 +0000984 emitDebugAddr();
985
Eric Christophera876b822012-08-23 07:32:06 +0000986 // Emit info into the dwarf accelerator table sections.
Pavel Labath6088c232018-04-04 14:42:14 +0000987 switch (getAccelTableKind()) {
988 case AccelTableKind::Apple:
Eric Christopher4996c702011-11-07 09:24:32 +0000989 emitAccelNames();
990 emitAccelObjC();
991 emitAccelNamespaces();
992 emitAccelTypes();
Pavel Labath6088c232018-04-04 14:42:14 +0000993 break;
994 case AccelTableKind::Dwarf:
995 emitAccelDebugNames();
996 break;
997 case AccelTableKind::None:
998 break;
999 case AccelTableKind::Default:
1000 llvm_unreachable("Default should have already been resolved.");
Eric Christopher4996c702011-11-07 09:24:32 +00001001 }
Eric Christopher6a841382012-11-19 22:42:10 +00001002
Eric Christopher4b358182013-08-30 00:40:17 +00001003 // Emit the pubnames and pubtypes sections if requested.
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001004 emitDebugPubSections();
Devang Patel04d2f2d2009-11-24 01:14:22 +00001005
Devang Pateld0701282010-08-02 17:32:15 +00001006 // clean up.
David Blaikie488393f2017-05-12 01:13:45 +00001007 // FIXME: AbstractVariables.clear();
Bill Wendling2b128d72009-05-20 23:19:06 +00001008}
1009
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001010void DwarfDebug::ensureAbstractEntityIsCreated(DwarfCompileUnit &CU,
1011 const DINode *Node,
1012 const MDNode *ScopeNode) {
1013 if (CU.getExistingAbstractEntity(Node))
David Blaikie6f9e8672014-06-13 23:52:55 +00001014 return;
David Blaikie36408e72014-06-04 23:50:52 +00001015
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001016 CU.createAbstractEntity(Node, LScopes.getOrCreateAbstractScope(
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001017 cast<DILocalScope>(ScopeNode)));
David Blaikie36408e72014-06-04 23:50:52 +00001018}
1019
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001020void DwarfDebug::ensureAbstractEntityIsCreatedIfScoped(DwarfCompileUnit &CU,
1021 const DINode *Node, const MDNode *ScopeNode) {
1022 if (CU.getExistingAbstractEntity(Node))
David Blaikie6f9e8672014-06-13 23:52:55 +00001023 return;
David Blaikie36408e72014-06-04 23:50:52 +00001024
Duncan P. N. Exon Smith33af7a82015-03-30 23:21:21 +00001025 if (LexicalScope *Scope =
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001026 LScopes.findAbstractScope(cast_or_null<DILocalScope>(ScopeNode)))
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001027 CU.createAbstractEntity(Node, Scope);
David Blaikie36408e72014-06-04 23:50:52 +00001028}
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +00001029
Matthias Braunef331ef2016-11-30 23:48:50 +00001030// Collect variable information from side table maintained by MF.
1031void DwarfDebug::collectVariableInfoFromMFTable(
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001032 DwarfCompileUnit &TheCU, DenseSet<InlinedEntity> &Processed) {
1033 SmallDenseMap<InlinedEntity, DbgVariable *> MFVars;
Matthias Braunef331ef2016-11-30 23:48:50 +00001034 for (const auto &VI : Asm->MF->getVariableDbgInfo()) {
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001035 if (!VI.Var)
Eric Christopherb4bef6d2013-11-19 09:04:36 +00001036 continue;
Duncan P. N. Exon Smith78a95272015-04-16 22:12:59 +00001037 assert(VI.Var->isValidLocationForIntrinsic(VI.Loc) &&
1038 "Expected inlined-at fields to agree");
1039
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001040 InlinedEntity Var(VI.Var, VI.Loc->getInlinedAt());
Duncan P. N. Exon Smith62e0f452015-04-15 22:29:27 +00001041 Processed.insert(Var);
Benjamin Kramer2abfd6c72014-03-09 15:44:39 +00001042 LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001043
Devang Patelcdb7d442009-11-10 23:20:04 +00001044 // If variable scope is not found then skip this variable.
Craig Topper353eda42014-04-24 06:44:33 +00001045 if (!Scope)
Devang Patelcdb7d442009-11-10 23:20:04 +00001046 continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001047
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001048 ensureAbstractEntityIsCreatedIfScoped(TheCU, Var.first, Scope->getScopeNode());
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001049 auto RegVar = llvm::make_unique<DbgVariable>(
1050 cast<DILocalVariable>(Var.first), Var.second);
Duncan P. N. Exon Smithe6cc5312015-06-21 16:50:43 +00001051 RegVar->initializeMMI(VI.Expr, VI.Slot);
Adrian Prantlbe662712017-07-25 23:32:59 +00001052 if (DbgVariable *DbgVar = MFVars.lookup(Var))
1053 DbgVar->addMMIEntry(*RegVar);
1054 else if (InfoHolder.addScopeVariable(Scope, RegVar.get())) {
1055 MFVars.insert({Var, RegVar.get()});
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001056 ConcreteEntities.push_back(std::move(RegVar));
Adrian Prantlbe662712017-07-25 23:32:59 +00001057 }
Devang Patel475d32a2009-10-06 01:26:37 +00001058 }
Devang Patel490c8ab2010-05-20 19:57:06 +00001059}
Devang Patela3e9c9c2010-03-15 18:33:46 +00001060
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001061// Get .debug_loc entry for the instruction range starting at MI.
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001062static DebugLocEntry::Value getDebugLocValue(const MachineInstr *MI) {
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001063 const DIExpression *Expr = MI->getDebugExpression();
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001064 assert(MI->getNumOperands() == 4);
Adrian Prantl418d1d12013-07-09 20:28:37 +00001065 if (MI->getOperand(0).isReg()) {
Adrian Prantlbd6d2912017-08-02 17:19:13 +00001066 auto RegOp = MI->getOperand(0);
1067 auto Op1 = MI->getOperand(1);
Adrian Prantl418d1d12013-07-09 20:28:37 +00001068 // If the second operand is an immediate, this is a
1069 // register-indirect address.
Adrian Prantlbd6d2912017-08-02 17:19:13 +00001070 assert((!Op1.isImm() || (Op1.getImm() == 0)) && "unexpected offset");
1071 MachineLocation MLoc(RegOp.getReg(), Op1.isImm());
Duncan P. N. Exon Smith546c8be2015-04-17 16:33:37 +00001072 return DebugLocEntry::Value(Expr, MLoc);
Devang Patel2442a892011-07-08 17:09:57 +00001073 }
1074 if (MI->getOperand(0).isImm())
Duncan P. N. Exon Smith546c8be2015-04-17 16:33:37 +00001075 return DebugLocEntry::Value(Expr, MI->getOperand(0).getImm());
Devang Patel2442a892011-07-08 17:09:57 +00001076 if (MI->getOperand(0).isFPImm())
Duncan P. N. Exon Smith546c8be2015-04-17 16:33:37 +00001077 return DebugLocEntry::Value(Expr, MI->getOperand(0).getFPImm());
Devang Patel2442a892011-07-08 17:09:57 +00001078 if (MI->getOperand(0).isCImm())
Duncan P. N. Exon Smith546c8be2015-04-17 16:33:37 +00001079 return DebugLocEntry::Value(Expr, MI->getOperand(0).getCImm());
Devang Patel2442a892011-07-08 17:09:57 +00001080
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001081 llvm_unreachable("Unexpected 4-operand DBG_VALUE instruction!");
Devang Patel2442a892011-07-08 17:09:57 +00001082}
1083
Adrian Prantl5f8f34e42018-05-01 15:54:18 +00001084/// If this and Next are describing different fragments of the same
Keno Fischerf8eb6a12016-01-16 01:11:33 +00001085/// variable, merge them by appending Next's values to the current
1086/// list of values.
1087/// Return true if the merge was successful.
1088bool DebugLocEntry::MergeValues(const DebugLocEntry &Next) {
1089 if (Begin == Next.Begin) {
Keno Fischer6c1e47a2016-02-03 21:13:33 +00001090 auto *FirstExpr = cast<DIExpression>(Values[0].Expression);
1091 auto *FirstNextExpr = cast<DIExpression>(Next.Values[0].Expression);
Adrian Prantl941fa752016-12-05 18:04:47 +00001092 if (!FirstExpr->isFragment() || !FirstNextExpr->isFragment())
Keno Fischer6c1e47a2016-02-03 21:13:33 +00001093 return false;
1094
Adrian Prantl941fa752016-12-05 18:04:47 +00001095 // We can only merge entries if none of the fragments overlap any others.
Keno Fischer6c1e47a2016-02-03 21:13:33 +00001096 // In doing so, we can take advantage of the fact that both lists are
1097 // sorted.
1098 for (unsigned i = 0, j = 0; i < Values.size(); ++i) {
1099 for (; j < Next.Values.size(); ++j) {
Bjorn Petterssona223f8152018-03-12 18:02:39 +00001100 int res = cast<DIExpression>(Values[i].Expression)->fragmentCmp(
Reid Klecknerf9c275f2016-02-10 20:55:49 +00001101 cast<DIExpression>(Next.Values[j].Expression));
Keno Fischer6c1e47a2016-02-03 21:13:33 +00001102 if (res == 0) // The two expressions overlap, we can't merge.
1103 return false;
1104 // Values[i] is entirely before Next.Values[j],
1105 // so go back to the next entry of Values.
1106 else if (res == -1)
1107 break;
1108 // Next.Values[j] is entirely before Values[i], so go on to the
1109 // next entry of Next.Values.
1110 }
Keno Fischerf8eb6a12016-01-16 01:11:33 +00001111 }
Keno Fischer6c1e47a2016-02-03 21:13:33 +00001112
1113 addValues(Next.Values);
1114 End = Next.End;
1115 return true;
Keno Fischerf8eb6a12016-01-16 01:11:33 +00001116 }
1117 return false;
1118}
1119
Adrian Prantlb1416832014-08-01 22:11:58 +00001120/// Build the location list for all DBG_VALUEs in the function that
1121/// describe the same variable. If the ranges of several independent
Adrian Prantl941fa752016-12-05 18:04:47 +00001122/// fragments of the same variable overlap partially, split them up and
Adrian Prantlb1416832014-08-01 22:11:58 +00001123/// combine the ranges. The resulting DebugLocEntries are will have
1124/// strict monotonically increasing begin addresses and will never
1125/// overlap.
1126//
1127// Input:
1128//
Adrian Prantl941fa752016-12-05 18:04:47 +00001129// Ranges History [var, loc, fragment ofs size]
1130// 0 | [x, (reg0, fragment 0, 32)]
1131// 1 | | [x, (reg1, fragment 32, 32)] <- IsFragmentOfPrevEntry
Adrian Prantlb1416832014-08-01 22:11:58 +00001132// 2 | | ...
1133// 3 | [clobber reg0]
Adrian Prantl941fa752016-12-05 18:04:47 +00001134// 4 [x, (mem, fragment 0, 64)] <- overlapping with both previous fragments of
Eric Christopherffc5ff32015-02-17 20:02:28 +00001135// x.
Adrian Prantlb1416832014-08-01 22:11:58 +00001136//
1137// Output:
1138//
Adrian Prantl941fa752016-12-05 18:04:47 +00001139// [0-1] [x, (reg0, fragment 0, 32)]
1140// [1-3] [x, (reg0, fragment 0, 32), (reg1, fragment 32, 32)]
1141// [3-4] [x, (reg1, fragment 32, 32)]
1142// [4- ] [x, (mem, fragment 0, 64)]
David Blaikiee1a26a62014-08-05 23:14:16 +00001143void
1144DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
1145 const DbgValueHistoryMap::InstrRanges &Ranges) {
Adrian Prantlcaaf0532014-08-11 21:05:57 +00001146 SmallVector<DebugLocEntry::Value, 4> OpenRanges;
Adrian Prantlb1416832014-08-01 22:11:58 +00001147
1148 for (auto I = Ranges.begin(), E = Ranges.end(); I != E; ++I) {
1149 const MachineInstr *Begin = I->first;
1150 const MachineInstr *End = I->second;
1151 assert(Begin->isDebugValue() && "Invalid History entry");
1152
1153 // Check if a variable is inaccessible in this range.
Adrian Prantl5e1fa852014-08-12 21:55:58 +00001154 if (Begin->getNumOperands() > 1 &&
1155 Begin->getOperand(0).isReg() && !Begin->getOperand(0).getReg()) {
Adrian Prantlb1416832014-08-01 22:11:58 +00001156 OpenRanges.clear();
1157 continue;
1158 }
1159
Adrian Prantl941fa752016-12-05 18:04:47 +00001160 // If this fragment overlaps with any open ranges, truncate them.
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001161 const DIExpression *DIExpr = Begin->getDebugExpression();
David Majnemer0a16c222016-08-11 21:15:00 +00001162 auto Last = remove_if(OpenRanges, [&](DebugLocEntry::Value R) {
Bjorn Petterssona223f8152018-03-12 18:02:39 +00001163 return DIExpr->fragmentsOverlap(R.getExpression());
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001164 });
Adrian Prantlb1416832014-08-01 22:11:58 +00001165 OpenRanges.erase(Last, OpenRanges.end());
1166
1167 const MCSymbol *StartLabel = getLabelBeforeInsn(Begin);
1168 assert(StartLabel && "Forgot label before DBG_VALUE starting a range!");
1169
1170 const MCSymbol *EndLabel;
1171 if (End != nullptr)
1172 EndLabel = getLabelAfterInsn(End);
1173 else if (std::next(I) == Ranges.end())
Rafael Espindola07c03d32015-03-05 02:05:42 +00001174 EndLabel = Asm->getFunctionEnd();
Adrian Prantlb1416832014-08-01 22:11:58 +00001175 else
1176 EndLabel = getLabelBeforeInsn(std::next(I)->first);
1177 assert(EndLabel && "Forgot label after instruction ending a range!");
1178
Nicola Zaghend34e60c2018-05-14 12:53:11 +00001179 LLVM_DEBUG(dbgs() << "DotDebugLoc: " << *Begin << "\n");
Adrian Prantlb1416832014-08-01 22:11:58 +00001180
1181 auto Value = getDebugLocValue(Begin);
David Stenberg33b192d2019-01-09 09:58:59 +00001182
1183 // Omit entries with empty ranges as they do not have any effect in DWARF.
1184 if (StartLabel == EndLabel) {
1185 // If this is a fragment, we must still add the value to the list of
1186 // open ranges, since it may describe non-overlapping parts of the
1187 // variable.
1188 if (DIExpr->isFragment())
1189 OpenRanges.push_back(Value);
1190 LLVM_DEBUG(dbgs() << "Omitting location list entry with empty range.\n");
1191 continue;
1192 }
1193
David Blaikiee1a26a62014-08-05 23:14:16 +00001194 DebugLocEntry Loc(StartLabel, EndLabel, Value);
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001195 bool couldMerge = false;
1196
Adrian Prantl941fa752016-12-05 18:04:47 +00001197 // If this is a fragment, it may belong to the current DebugLocEntry.
1198 if (DIExpr->isFragment()) {
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001199 // Add this value to the list of open ranges.
Adrian Prantlcaaf0532014-08-11 21:05:57 +00001200 OpenRanges.push_back(Value);
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001201
Adrian Prantl941fa752016-12-05 18:04:47 +00001202 // Attempt to add the fragment to the last entry.
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001203 if (!DebugLoc.empty())
1204 if (DebugLoc.back().MergeValues(Loc))
1205 couldMerge = true;
1206 }
1207
1208 if (!couldMerge) {
1209 // Need to add a new DebugLocEntry. Add all values from still
Adrian Prantl941fa752016-12-05 18:04:47 +00001210 // valid non-overlapping fragments.
Adrian Prantl1c6f2ec2014-08-11 21:06:00 +00001211 if (OpenRanges.size())
1212 Loc.addValues(OpenRanges);
1213
Adrian Prantlb1416832014-08-01 22:11:58 +00001214 DebugLoc.push_back(std::move(Loc));
1215 }
Adrian Prantle09ee3f2014-08-11 20:59:28 +00001216
1217 // Attempt to coalesce the ranges of two otherwise identical
1218 // DebugLocEntries.
1219 auto CurEntry = DebugLoc.rbegin();
Nicola Zaghend34e60c2018-05-14 12:53:11 +00001220 LLVM_DEBUG({
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001221 dbgs() << CurEntry->getValues().size() << " Values:\n";
Adrian Prantl6f8c1b62015-05-26 20:06:51 +00001222 for (auto &Value : CurEntry->getValues())
Adrian Prantldba58fb2016-02-29 22:28:22 +00001223 Value.dump();
Adrian Prantl87b7eb92014-10-01 18:55:02 +00001224 dbgs() << "-----\n";
1225 });
Adrian Prantl75707312015-05-26 20:06:48 +00001226
1227 auto PrevEntry = std::next(CurEntry);
1228 if (PrevEntry != DebugLoc.rend() && PrevEntry->MergeRanges(*CurEntry))
1229 DebugLoc.pop_back();
Adrian Prantlb1416832014-08-01 22:11:58 +00001230 }
1231}
1232
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001233DbgEntity *DwarfDebug::createConcreteEntity(DwarfCompileUnit &TheCU,
1234 LexicalScope &Scope,
1235 const DINode *Node,
1236 const DILocation *Location,
1237 const MCSymbol *Sym) {
1238 ensureAbstractEntityIsCreatedIfScoped(TheCU, Node, Scope.getScopeNode());
1239 if (isa<const DILocalVariable>(Node)) {
1240 ConcreteEntities.push_back(
1241 llvm::make_unique<DbgVariable>(cast<const DILocalVariable>(Node),
1242 Location));
1243 InfoHolder.addScopeVariable(&Scope,
1244 cast<DbgVariable>(ConcreteEntities.back().get()));
1245 } else if (isa<const DILabel>(Node)) {
1246 ConcreteEntities.push_back(
1247 llvm::make_unique<DbgLabel>(cast<const DILabel>(Node),
1248 Location, Sym));
1249 InfoHolder.addScopeLabel(&Scope,
1250 cast<DbgLabel>(ConcreteEntities.back().get()));
1251 }
1252 return ConcreteEntities.back().get();
Duncan P. N. Exon Smithe6cc5312015-06-21 16:50:43 +00001253}
Adrian Prantlb1416832014-08-01 22:11:58 +00001254
Adrian Prantl274bcbc2017-06-16 22:40:04 +00001255/// Determine whether a *singular* DBG_VALUE is valid for the entirety of its
1256/// enclosing lexical scope. The check ensures there are no other instructions
1257/// in the same lexical scope preceding the DBG_VALUE and that its range is
1258/// either open or otherwise rolls off the end of the scope.
1259static bool validThroughout(LexicalScopes &LScopes,
1260 const MachineInstr *DbgValue,
1261 const MachineInstr *RangeEnd) {
1262 assert(DbgValue->getDebugLoc() && "DBG_VALUE without a debug location");
1263 auto MBB = DbgValue->getParent();
1264 auto DL = DbgValue->getDebugLoc();
1265 auto *LScope = LScopes.findLexicalScope(DL);
1266 // Scope doesn't exist; this is a dead DBG_VALUE.
1267 if (!LScope)
Adrian Prantlfb2add22016-02-29 19:49:46 +00001268 return false;
Adrian Prantl274bcbc2017-06-16 22:40:04 +00001269 auto &LSRange = LScope->getRanges();
1270 if (LSRange.size() == 0)
1271 return false;
1272
1273 // Determine if the DBG_VALUE is valid at the beginning of its lexical block.
1274 const MachineInstr *LScopeBegin = LSRange.front().first;
1275 // Early exit if the lexical scope begins outside of the current block.
1276 if (LScopeBegin->getParent() != MBB)
1277 return false;
1278 MachineBasicBlock::const_reverse_iterator Pred(DbgValue);
1279 for (++Pred; Pred != MBB->rend(); ++Pred) {
1280 if (Pred->getFlag(MachineInstr::FrameSetup))
1281 break;
1282 auto PredDL = Pred->getDebugLoc();
Adrian Prantl25422dc2017-06-20 21:08:52 +00001283 if (!PredDL || Pred->isMetaInstruction())
Adrian Prantl274bcbc2017-06-16 22:40:04 +00001284 continue;
1285 // Check whether the instruction preceding the DBG_VALUE is in the same
1286 // (sub)scope as the DBG_VALUE.
Adrian Prantl25422dc2017-06-20 21:08:52 +00001287 if (DL->getScope() == PredDL->getScope())
1288 return false;
1289 auto *PredScope = LScopes.findLexicalScope(PredDL);
1290 if (!PredScope || LScope->dominates(PredScope))
Adrian Prantlfb2add22016-02-29 19:49:46 +00001291 return false;
Adrian Prantl274bcbc2017-06-16 22:40:04 +00001292 }
1293
1294 // If the range of the DBG_VALUE is open-ended, report success.
1295 if (!RangeEnd)
1296 return true;
1297
1298 // Fail if there are instructions belonging to our scope in another block.
1299 const MachineInstr *LScopeEnd = LSRange.back().second;
1300 if (LScopeEnd->getParent() != MBB)
1301 return false;
1302
1303 // Single, constant DBG_VALUEs in the prologue are promoted to be live
1304 // throughout the function. This is a hack, presumably for DWARF v2 and not
1305 // necessarily correct. It would be much better to use a dbg.declare instead
1306 // if we know the constant is live throughout the scope.
1307 if (DbgValue->getOperand(0).isImm() && MBB->pred_empty())
1308 return true;
1309
1310 return false;
Adrian Prantlfb2add22016-02-29 19:49:46 +00001311}
1312
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001313// Find variables for each lexical scope.
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001314void DwarfDebug::collectEntityInfo(DwarfCompileUnit &TheCU,
1315 const DISubprogram *SP,
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001316 DenseSet<InlinedEntity> &Processed) {
Eric Christopher270a12c2013-07-03 21:37:03 +00001317 // Grab the variable info that was squirreled away in the MMI side-table.
David Blaikie488393f2017-05-12 01:13:45 +00001318 collectVariableInfoFromMFTable(TheCU, Processed);
Devang Patel490c8ab2010-05-20 19:57:06 +00001319
Alexey Samsonov0436caa2014-04-30 23:02:40 +00001320 for (const auto &I : DbgValues) {
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001321 InlinedEntity IV = I.first;
Duncan P. N. Exon Smith62e0f452015-04-15 22:29:27 +00001322 if (Processed.count(IV))
Devang Patel490c8ab2010-05-20 19:57:06 +00001323 continue;
1324
Duncan P. N. Exon Smith62e0f452015-04-15 22:29:27 +00001325 // Instruction ranges, specifying where IV is accessible.
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001326 const auto &Ranges = I.second;
1327 if (Ranges.empty())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001328 continue;
Devang Patel9fc11702010-05-25 23:40:22 +00001329
Craig Topper353eda42014-04-24 06:44:33 +00001330 LexicalScope *Scope = nullptr;
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001331 const DILocalVariable *LocalVar = cast<DILocalVariable>(IV.first);
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001332 if (const DILocation *IA = IV.second)
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001333 Scope = LScopes.findInlinedScope(LocalVar->getScope(), IA);
Duncan P. N. Exon Smithb4749372015-02-17 00:02:27 +00001334 else
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001335 Scope = LScopes.findLexicalScope(LocalVar->getScope());
Devang Patel490c8ab2010-05-20 19:57:06 +00001336 // If variable scope is not found then skip this variable.
Devang Patelfbd6c452010-05-21 00:10:20 +00001337 if (!Scope)
Devang Patel490c8ab2010-05-20 19:57:06 +00001338 continue;
1339
Duncan P. N. Exon Smith62e0f452015-04-15 22:29:27 +00001340 Processed.insert(IV);
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001341 DbgVariable *RegVar = cast<DbgVariable>(createConcreteEntity(TheCU,
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001342 *Scope, LocalVar, IV.second));
Duncan P. N. Exon Smithe6cc5312015-06-21 16:50:43 +00001343
Alexey Samsonovbb2990d2014-05-27 23:09:50 +00001344 const MachineInstr *MInsn = Ranges.front().first;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001345 assert(MInsn->isDebugValue() && "History must begin with debug value");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001346
Adrian Prantl274bcbc2017-06-16 22:40:04 +00001347 // Check if there is a single DBG_VALUE, valid throughout the var's scope.
Adrian Prantlfb2add22016-02-29 19:49:46 +00001348 if (Ranges.size() == 1 &&
Adrian Prantl274bcbc2017-06-16 22:40:04 +00001349 validThroughout(LScopes, MInsn, Ranges.front().second)) {
Duncan P. N. Exon Smith3a73d9e2015-06-21 16:54:56 +00001350 RegVar->initializeDbgValue(MInsn);
Devang Patel9fc11702010-05-25 23:40:22 +00001351 continue;
Duncan P. N. Exon Smith3a73d9e2015-06-21 16:54:56 +00001352 }
Alexey Bataev2a03d422018-06-29 14:23:28 +00001353 // Do not emit location lists if .debug_loc secton is disabled.
1354 if (!useLocSection())
1355 continue;
Devang Patel9fc11702010-05-25 23:40:22 +00001356
Eric Christopher59cc0712013-01-28 17:33:26 +00001357 // Handle multiple DBG_VALUE instructions describing one variable.
Duncan P. N. Exon Smith3a73d9e2015-06-21 16:54:56 +00001358 DebugLocStream::ListBuilder List(DebugLocs, TheCU, *Asm, *RegVar, *MInsn);
Jakob Stoklund Olesen9c057ee2011-03-22 00:21:41 +00001359
Adrian Prantlb1416832014-08-01 22:11:58 +00001360 // Build the location list for this variable.
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001361 SmallVector<DebugLocEntry, 8> Entries;
1362 buildLocationList(Entries, Ranges);
Duncan P. N. Exon Smithfba25d62015-04-17 16:28:58 +00001363
Adrian Prantl693e8de2016-02-29 17:06:46 +00001364 // If the variable has a DIBasicType, extract it. Basic types cannot have
Duncan P. N. Exon Smithfba25d62015-04-17 16:28:58 +00001365 // unique identifiers, so don't bother resolving the type with the
1366 // identifier map.
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001367 const DIBasicType *BT = dyn_cast<DIBasicType>(
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001368 static_cast<const Metadata *>(LocalVar->getType()));
Duncan P. N. Exon Smithfba25d62015-04-17 16:28:58 +00001369
Adrian Prantl92da14b2015-03-02 22:02:33 +00001370 // Finalize the entry by lowering it into a DWARF bytestream.
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001371 for (auto &Entry : Entries)
Duncan P. N. Exon Smith3a73d9e2015-06-21 16:54:56 +00001372 Entry.finalize(*Asm, List, BT);
Devang Patela3e9c9c2010-03-15 18:33:46 +00001373 }
Devang Patele0a94bf2010-05-14 21:01:35 +00001374
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001375 // For each InlinedEntity collected from DBG_LABEL instructions, convert to
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001376 // DWARF-related DbgLabel.
1377 for (const auto &I : DbgLabels) {
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001378 InlinedEntity IL = I.first;
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001379 const MachineInstr *MI = I.second;
1380 if (MI == nullptr)
1381 continue;
1382
1383 LexicalScope *Scope = nullptr;
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001384 const DILabel *Label = cast<DILabel>(IL.first);
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001385 // Get inlined DILocation if it is inlined label.
1386 if (const DILocation *IA = IL.second)
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001387 Scope = LScopes.findInlinedScope(Label->getScope(), IA);
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001388 else
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001389 Scope = LScopes.findLexicalScope(Label->getScope());
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001390 // If label scope is not found then skip this label.
1391 if (!Scope)
1392 continue;
1393
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001394 Processed.insert(IL);
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001395 /// At this point, the temporary label is created.
1396 /// Save the temporary label to DbgLabel entity to get the
1397 /// actually address when generating Dwarf DIE.
1398 MCSymbol *Sym = getLabelBeforeInsn(MI);
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001399 createConcreteEntity(TheCU, *Scope, Label, IL.second, Sym);
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001400 }
1401
1402 // Collect info for variables/labels that were optimized out.
Shiva Chen2c864552018-05-09 02:40:45 +00001403 for (const DINode *DN : SP->getRetainedNodes()) {
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001404 if (!Processed.insert(InlinedEntity(DN, nullptr)).second)
1405 continue;
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001406 LexicalScope *Scope = nullptr;
Shiva Chen2c864552018-05-09 02:40:45 +00001407 if (auto *DV = dyn_cast<DILocalVariable>(DN)) {
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001408 Scope = LScopes.findLexicalScope(DV->getScope());
1409 } else if (auto *DL = dyn_cast<DILabel>(DN)) {
1410 Scope = LScopes.findLexicalScope(DL->getScope());
Shiva Chen2c864552018-05-09 02:40:45 +00001411 }
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001412
1413 if (Scope)
1414 createConcreteEntity(TheCU, *Scope, DN, nullptr);
Devang Patele0a94bf2010-05-14 21:01:35 +00001415 }
Devang Patel9fc11702010-05-25 23:40:22 +00001416}
Devang Patele0a94bf2010-05-14 21:01:35 +00001417
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001418// Process beginning of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001419void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Reid Klecknerf9c275f2016-02-10 20:55:49 +00001420 DebugHandlerBase::beginInstruction(MI);
1421 assert(CurMI);
1422
Matthias Braunf1caa282017-12-15 22:22:58 +00001423 const auto *SP = MI->getMF()->getFunction().getSubprogram();
David Blaikie7f2b7172017-05-26 17:05:15 +00001424 if (!SP || SP->getUnit()->getEmissionKind() == DICompileUnit::NoDebug)
1425 return;
1426
Paul Robinson4fa7b57a2016-12-09 19:15:32 +00001427 // Check if source location changes, but ignore DBG_VALUE and CFI locations.
Paul Robinsonee88ed62018-02-14 17:35:52 +00001428 // If the instruction is part of the function frame setup code, do not emit
1429 // any line record, as there is no correspondence with any user code.
1430 if (MI->isMetaInstruction() || MI->getFlag(MachineInstr::FrameSetup))
Paul Robinsonf428c9b2016-11-22 19:46:51 +00001431 return;
1432 const DebugLoc &DL = MI->getDebugLoc();
Paul Robinsonac7fe5e2016-12-12 20:49:11 +00001433 // When we emit a line-0 record, we don't update PrevInstLoc; so look at
1434 // the last line number actually emitted, to see if it was line 0.
1435 unsigned LastAsmLine =
1436 Asm->OutStreamer->getContext().getCurrentDwarfLoc().getLine();
Paul Robinson96de8c72016-11-29 22:41:16 +00001437
Vedant Kumar5931b4e2018-10-05 20:37:17 +00001438 // Request a label after the call in order to emit AT_return_pc information
1439 // in call site entries. TODO: Add support for targets with delay slots.
1440 if (SP->areAllCallsDescribed() && MI->isCall() && !MI->hasDelaySlot())
1441 requestLabelAfterInsn(MI);
1442
Paul Robinsonac7fe5e2016-12-12 20:49:11 +00001443 if (DL == PrevInstLoc) {
1444 // If we have an ongoing unspecified location, nothing to do here.
1445 if (!DL)
1446 return;
1447 // We have an explicit location, same as the previous location.
1448 // But we might be coming back to it after a line 0 record.
1449 if (LastAsmLine == 0 && DL.getLine() != 0) {
1450 // Reinstate the source location but not marked as a statement.
1451 const MDNode *Scope = DL.getScope();
1452 recordSourceLine(DL.getLine(), DL.getCol(), Scope, /*Flags=*/0);
Paul Robinson37a13dd2016-11-30 22:49:55 +00001453 }
1454 return;
1455 }
1456
Paul Robinsonac7fe5e2016-12-12 20:49:11 +00001457 if (!DL) {
1458 // We have an unspecified location, which might want to be line 0.
1459 // If we have already emitted a line-0 record, don't repeat it.
1460 if (LastAsmLine == 0)
1461 return;
1462 // If user said Don't Do That, don't do that.
1463 if (UnknownLocations == Disable)
1464 return;
Matthias Braunc7efb6f2018-10-11 23:37:58 +00001465 // See if we have a reason to emit a line-0 record now.
1466 // Reasons to emit a line-0 record include:
1467 // - User asked for it (UnknownLocations).
1468 // - Instruction has a label, so it's referenced from somewhere else,
1469 // possibly debug information; we want it to have a source location.
1470 // - Instruction is at the top of a block; we don't want to inherit the
1471 // location from the physically previous (maybe unrelated) block.
1472 if (UnknownLocations == Enable || PrevLabel ||
1473 (PrevInstBB && PrevInstBB != MI->getParent())) {
1474 // Preserve the file and column numbers, if we can, to save space in
1475 // the encoded line table.
1476 // Do not update PrevInstLoc, it remembers the last non-0 line.
1477 const MDNode *Scope = nullptr;
1478 unsigned Column = 0;
1479 if (PrevInstLoc) {
1480 Scope = PrevInstLoc.getScope();
1481 Column = PrevInstLoc.getCol();
1482 }
1483 recordSourceLine(/*Line=*/0, Column, Scope, /*Flags=*/0);
Paul Robinsonac7fe5e2016-12-12 20:49:11 +00001484 }
1485 return;
1486 }
1487
Matthias Braunc7efb6f2018-10-11 23:37:58 +00001488 // We have an explicit location, different from the previous location.
1489 // Don't repeat a line-0 record, but otherwise emit the new location.
1490 // (The new location might be an explicit line 0, which we do emit.)
Jonas Devlieghere669edb52019-01-16 23:26:29 +00001491 if (DL.getLine() == 0 && LastAsmLine == 0)
Matthias Braunc7efb6f2018-10-11 23:37:58 +00001492 return;
1493 unsigned Flags = 0;
1494 if (DL == PrologEndLoc) {
1495 Flags |= DWARF2_FLAG_PROLOGUE_END | DWARF2_FLAG_IS_STMT;
1496 PrologEndLoc = DebugLoc();
1497 }
1498 // If the line changed, we call that a new statement; unless we went to
1499 // line 0 and came back, in which case it is not a new statement.
1500 unsigned OldLine = PrevInstLoc ? PrevInstLoc.getLine() : LastAsmLine;
1501 if (DL.getLine() && DL.getLine() != OldLine)
1502 Flags |= DWARF2_FLAG_IS_STMT;
1503
1504 const MDNode *Scope = DL.getScope();
1505 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
1506
1507 // If we're not at line 0, remember this location.
1508 if (DL.getLine())
1509 PrevInstLoc = DL;
Devang Patel75cc16c2009-10-01 20:31:14 +00001510}
1511
Alexey Samsonov8a86d6d2014-05-27 22:47:41 +00001512static DebugLoc findPrologueEndLoc(const MachineFunction *MF) {
1513 // First known non-DBG_VALUE and non-frame setup location marks
1514 // the beginning of the function body.
1515 for (const auto &MBB : *MF)
1516 for (const auto &MI : MBB)
Adrian Prantlfb31da12017-05-22 20:47:09 +00001517 if (!MI.isMetaInstruction() && !MI.getFlag(MachineInstr::FrameSetup) &&
Michael Kuperstein2b3c16c2015-10-08 07:48:49 +00001518 MI.getDebugLoc())
Alexey Samsonov8a86d6d2014-05-27 22:47:41 +00001519 return MI.getDebugLoc();
1520 return DebugLoc();
1521}
1522
Alexey Bataev9d5974a2019-01-22 17:24:16 +00001523/// Register a source line with debug info. Returns the unique label that was
1524/// emitted and which provides correspondence to the source line list.
1525static void recordSourceLine(AsmPrinter &Asm, unsigned Line, unsigned Col,
1526 const MDNode *S, unsigned Flags, unsigned CUID,
1527 uint16_t DwarfVersion,
1528 ArrayRef<std::unique_ptr<DwarfCompileUnit>> DCUs) {
1529 StringRef Fn;
1530 unsigned FileNo = 1;
1531 unsigned Discriminator = 0;
1532 if (auto *Scope = cast_or_null<DIScope>(S)) {
1533 Fn = Scope->getFilename();
1534 if (Line != 0 && DwarfVersion >= 4)
1535 if (auto *LBF = dyn_cast<DILexicalBlockFile>(Scope))
1536 Discriminator = LBF->getDiscriminator();
1537
1538 FileNo = static_cast<DwarfCompileUnit &>(*DCUs[CUID])
1539 .getOrCreateSourceID(Scope->getFile());
1540 }
1541 Asm.OutStreamer->EmitDwarfLocDirective(FileNo, Line, Col, Flags, 0,
1542 Discriminator, Fn);
1543}
1544
1545DebugLoc DwarfDebug::emitInitialLocDirective(const MachineFunction &MF,
1546 unsigned CUID) {
1547 // Get beginning of function.
1548 if (DebugLoc PrologEndLoc = findPrologueEndLoc(&MF)) {
1549 // Ensure the compile unit is created if the function is called before
1550 // beginFunction().
1551 (void)getOrCreateDwarfCompileUnit(
1552 MF.getFunction().getSubprogram()->getUnit());
1553 // We'd like to list the prologue as "not statements" but GDB behaves
1554 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
1555 const DISubprogram *SP = PrologEndLoc->getInlinedAtScope()->getSubprogram();
1556 ::recordSourceLine(*Asm, SP->getScopeLine(), 0, SP, DWARF2_FLAG_IS_STMT,
1557 CUID, getDwarfVersion(), getUnits());
1558 return PrologEndLoc;
1559 }
1560 return DebugLoc();
1561}
1562
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001563// Gather pre-function debug information. Assumes being called immediately
1564// after the function entry point has been emitted.
David Blaikieb2fbb4b2017-02-16 18:48:33 +00001565void DwarfDebug::beginFunctionImpl(const MachineFunction *MF) {
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001566 CurFn = MF;
Eric Christopherfedfa442013-11-01 23:14:17 +00001567
Matthias Braunf1caa282017-12-15 22:22:58 +00001568 auto *SP = MF->getFunction().getSubprogram();
David Blaikie2c78f182017-05-25 23:11:28 +00001569 assert(LScopes.empty() || SP == LScopes.getCurrentFunctionScope()->getScopeNode());
David Blaikie07963bd2017-05-26 18:52:56 +00001570 if (SP->getUnit()->getEmissionKind() == DICompileUnit::NoDebug)
Adrian Prantl5992a722016-04-08 22:43:03 +00001571 return;
David Blaikie07963bd2017-05-26 18:52:56 +00001572
1573 DwarfCompileUnit &CU = getOrCreateDwarfCompileUnit(SP->getUnit());
David Blaikie2c78f182017-05-25 23:11:28 +00001574
1575 // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function
1576 // belongs to so that we add to the correct per-cu line table in the
1577 // non-asm case.
Lang Hames9ff69c82015-04-24 19:11:51 +00001578 if (Asm->OutStreamer->hasRawTextSupport())
Rafael Espindolab4eec1d2014-02-05 18:00:21 +00001579 // Use a single line table if we are generating assembly.
Lang Hames9ff69c82015-04-24 19:11:51 +00001580 Asm->OutStreamer->getContext().setDwarfCompileUnitID(0);
Manman Ren9d4c7352013-05-21 00:57:22 +00001581 else
David Blaikie07963bd2017-05-26 18:52:56 +00001582 Asm->OutStreamer->getContext().setDwarfCompileUnitID(CU.getUniqueID());
Manman Ren4e042a62013-02-05 21:52:47 +00001583
Devang Patel34a66202011-05-11 19:22:19 +00001584 // Record beginning of function.
Alexey Bataev9d5974a2019-01-22 17:24:16 +00001585 PrologEndLoc = emitInitialLocDirective(
1586 *MF, Asm->OutStreamer->getContext().getDwarfCompileUnitID());
Bill Wendling2b128d72009-05-20 23:19:06 +00001587}
1588
David Blaikieb2fbb4b2017-02-16 18:48:33 +00001589void DwarfDebug::skippedNonDebugFunction() {
1590 // If we don't have a subprogram for this function then there will be a hole
1591 // in the range information. Keep note of this by setting the previously used
1592 // section to nullptr.
1593 PrevCU = nullptr;
1594 CurFn = nullptr;
1595}
1596
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001597// Gather and emit post-function debug information.
David Blaikieb2fbb4b2017-02-16 18:48:33 +00001598void DwarfDebug::endFunctionImpl(const MachineFunction *MF) {
Matthias Braunf1caa282017-12-15 22:22:58 +00001599 const DISubprogram *SP = MF->getFunction().getSubprogram();
David Blaikieb2fbb4b2017-02-16 18:48:33 +00001600
David Blaikiee75f9632014-10-14 17:12:02 +00001601 assert(CurFn == MF &&
1602 "endFunction should be called with the same function as beginFunction");
Timur Iskhodzhanov1cd14442013-12-03 15:10:23 +00001603
Eric Christopher4287a492013-12-09 23:57:44 +00001604 // Set DwarfDwarfCompileUnitID in MCContext to default value.
Lang Hames9ff69c82015-04-24 19:11:51 +00001605 Asm->OutStreamer->getContext().setDwarfCompileUnitID(0);
Eric Christopher6a841382012-11-19 22:42:10 +00001606
Devang Patel3acc70e2011-08-15 22:04:40 +00001607 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
David Blaikie3e3eb332016-12-15 23:17:52 +00001608 assert(!FnScope || SP == FnScope->getScopeNode());
Adrian Prantl75819ae2016-04-15 15:57:41 +00001609 DwarfCompileUnit &TheCU = *CUMap.lookup(SP->getUnit());
Alexey Bataevd4dd7212018-08-01 19:38:20 +00001610 if (TheCU.getCUNode()->isDebugDirectivesOnly()) {
1611 PrevLabel = nullptr;
1612 CurFn = nullptr;
1613 return;
1614 }
David Blaikie263a0082014-10-23 00:06:27 +00001615
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001616 DenseSet<InlinedEntity> Processed;
1617 collectEntityInfo(TheCU, SP, Processed);
Devang Patel3acc70e2011-08-15 22:04:40 +00001618
David Blaikie3a7ce252014-09-19 17:03:16 +00001619 // Add the range of this function to the list of ranges for the CU.
Rafael Espindola07c03d32015-03-05 02:05:42 +00001620 TheCU.addRange(RangeSpan(Asm->getFunctionBegin(), Asm->getFunctionEnd()));
David Blaikie3a7ce252014-09-19 17:03:16 +00001621
1622 // Under -gmlt, skip building the subprogram if there are no inlined
Dehao Chen1ce8d6c2017-01-19 00:44:11 +00001623 // subroutines inside it. But with -fdebug-info-for-profiling, the subprogram
1624 // is still needed as we need its source location.
Dehao Chen0944a8c2017-02-01 22:45:09 +00001625 if (!TheCU.getCUNode()->getDebugInfoForProfiling() &&
Dehao Chen1ce8d6c2017-01-19 00:44:11 +00001626 TheCU.getCUNode()->getEmissionKind() == DICompileUnit::LineTablesOnly &&
David Blaikiee1c79742014-09-30 21:28:32 +00001627 LScopes.getAbstractScopesList().empty() && !IsDarwin) {
David Blaikie80e5b1e2014-10-24 17:57:34 +00001628 assert(InfoHolder.getScopeVariables().empty());
David Blaikie3a7ce252014-09-19 17:03:16 +00001629 PrevLabel = nullptr;
1630 CurFn = nullptr;
1631 return;
1632 }
1633
Adrian Prantl049d21c2014-10-13 20:44:58 +00001634#ifndef NDEBUG
1635 size_t NumAbstractScopes = LScopes.getAbstractScopesList().size();
1636#endif
Devang Patel7e623022011-08-10 20:55:27 +00001637 // Construct abstract scopes.
Benjamin Kramer15596c72014-03-07 19:09:39 +00001638 for (LexicalScope *AScope : LScopes.getAbstractScopesList()) {
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001639 auto *SP = cast<DISubprogram>(AScope->getScopeNode());
Shiva Chen2c864552018-05-09 02:40:45 +00001640 for (const DINode *DN : SP->getRetainedNodes()) {
Hsiangkai Wang760c1ab2018-09-06 02:22:06 +00001641 if (!Processed.insert(InlinedEntity(DN, nullptr)).second)
1642 continue;
1643
1644 const MDNode *Scope = nullptr;
1645 if (auto *DV = dyn_cast<DILocalVariable>(DN))
1646 Scope = DV->getScope();
1647 else if (auto *DL = dyn_cast<DILabel>(DN))
1648 Scope = DL->getScope();
1649 else
1650 llvm_unreachable("Unexpected DI type!");
1651
1652 // Collect info for variables/labels that were optimized out.
1653 ensureAbstractEntityIsCreated(TheCU, DN, Scope);
1654 assert(LScopes.getAbstractScopesList().size() == NumAbstractScopes
1655 && "ensureAbstractEntityIsCreated inserted abstract scopes");
Devang Patel5c0f85c2010-06-25 22:07:34 +00001656 }
David Blaikie488393f2017-05-12 01:13:45 +00001657 constructAbstractSubprogramScopeDIE(TheCU, AScope);
Bill Wendling2b128d72009-05-20 23:19:06 +00001658 }
Eric Christopher6a841382012-11-19 22:42:10 +00001659
David Blaikie38b74bf2016-12-15 23:37:38 +00001660 ProcessedSPNodes.insert(SP);
Vedant Kumar5931b4e2018-10-05 20:37:17 +00001661 DIE &ScopeDIE = TheCU.constructSubprogramScopeDIE(SP, FnScope);
David Blaikie3a443c22014-11-04 22:12:25 +00001662 if (auto *SkelCU = TheCU.getSkeleton())
David Blaikiea01f2952016-08-24 18:29:49 +00001663 if (!LScopes.getAbstractScopesList().empty() &&
1664 TheCU.getCUNode()->getSplitDebugInlining())
David Blaikie3e3eb332016-12-15 23:17:52 +00001665 SkelCU->constructSubprogramScopeDIE(SP, FnScope);
Devang Patel3acc70e2011-08-15 22:04:40 +00001666
Vedant Kumar5931b4e2018-10-05 20:37:17 +00001667 // Construct call site entries.
1668 constructCallSiteEntryDIEs(*SP, TheCU, ScopeDIE, *MF);
1669
Bill Wendling2b128d72009-05-20 23:19:06 +00001670 // Clear debug info
David Blaikie825bdd22014-05-21 22:41:17 +00001671 // Ownership of DbgVariables is a bit subtle - ScopeVariables owns all the
1672 // DbgVariables except those that are also in AbstractVariables (since they
1673 // can be used cross-function)
David Blaikie80e5b1e2014-10-24 17:57:34 +00001674 InfoHolder.getScopeVariables().clear();
Hsiangkai Wang2532ac82018-08-17 15:22:04 +00001675 InfoHolder.getScopeLabels().clear();
Craig Topper353eda42014-04-24 06:44:33 +00001676 PrevLabel = nullptr;
1677 CurFn = nullptr;
Bill Wendling2b128d72009-05-20 23:19:06 +00001678}
1679
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001680// Register a source line with debug info. Returns the unique label that was
1681// emitted and which provides correspondence to the source line list.
Devang Patel34a66202011-05-11 19:22:19 +00001682void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1683 unsigned Flags) {
Alexey Bataev9d5974a2019-01-22 17:24:16 +00001684 ::recordSourceLine(*Asm, Line, Col, S, Flags,
1685 Asm->OutStreamer->getContext().getDwarfCompileUnitID(),
1686 getDwarfVersion(), getUnits());
Bill Wendling2b128d72009-05-20 23:19:06 +00001687}
1688
Bill Wendling806535f2009-05-20 23:22:40 +00001689//===----------------------------------------------------------------------===//
1690// Emit Methods
1691//===----------------------------------------------------------------------===//
1692
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001693// Emit the debug info section.
1694void DwarfDebug::emitDebugInfo() {
Eric Christopherf8194852013-12-05 18:06:10 +00001695 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Rafael Espindola063d7252015-03-10 16:58:10 +00001696 Holder.emitUnits(/* UseOffsets */ false);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001697}
1698
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001699// Emit the abbreviation section.
Eric Christopher38371952012-11-20 23:30:11 +00001700void DwarfDebug::emitAbbreviations() {
Eric Christopherf8194852013-12-05 18:06:10 +00001701 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
David Blaikie0504cda2013-12-05 07:43:55 +00001702
1703 Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
Eric Christopher3c5a1912012-12-19 22:02:53 +00001704}
Bill Wendling480ff322009-05-20 23:21:38 +00001705
Wolfgang Pieb456b5552018-01-26 18:52:58 +00001706void DwarfDebug::emitStringOffsetsTableHeader() {
1707 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Pavel Labath7bfa5d62018-07-26 14:36:07 +00001708 Holder.getStringPool().emitStringOffsetsTableHeader(
1709 *Asm, Asm->getObjFileLowering().getDwarfStrOffSection(),
1710 Holder.getStringOffsetsStartSym());
Wolfgang Pieb456b5552018-01-26 18:52:58 +00001711}
1712
Jonas Devliegheree699dfa2018-01-29 14:52:34 +00001713template <typename AccelTableT>
1714void DwarfDebug::emitAccel(AccelTableT &Accel, MCSection *Section,
Rafael Espindola6b9998b2015-03-10 22:00:25 +00001715 StringRef TableName) {
Lang Hames9ff69c82015-04-24 19:11:51 +00001716 Asm->OutStreamer->SwitchSection(Section);
Eric Christopher4996c702011-11-07 09:24:32 +00001717
1718 // Emit the full data.
Pavel Labatha7c457d2018-02-19 16:12:20 +00001719 emitAppleAccelTable(Asm, Accel, TableName, Section->getBeginSymbol());
David Blaikie6741bb02014-09-11 21:12:48 +00001720}
1721
Pavel Labath6088c232018-04-04 14:42:14 +00001722void DwarfDebug::emitAccelDebugNames() {
Pavel Labatheadfac82018-04-09 14:38:53 +00001723 // Don't emit anything if we have no compilation units to index.
1724 if (getUnits().empty())
1725 return;
1726
Pavel Labath6088c232018-04-04 14:42:14 +00001727 emitDWARF5AccelTable(Asm, AccelDebugNames, *this, getUnits());
1728}
1729
David Blaikie6741bb02014-09-11 21:12:48 +00001730// Emit visible names into a hashed accelerator table section.
1731void DwarfDebug::emitAccelNames() {
1732 emitAccel(AccelNames, Asm->getObjFileLowering().getDwarfAccelNamesSection(),
Rafael Espindola6b9998b2015-03-10 22:00:25 +00001733 "Names");
Eric Christopher4996c702011-11-07 09:24:32 +00001734}
1735
Eric Christopher48fef592012-12-20 21:58:40 +00001736// Emit objective C classes and categories into a hashed accelerator table
1737// section.
Eric Christopher4996c702011-11-07 09:24:32 +00001738void DwarfDebug::emitAccelObjC() {
David Blaikie6741bb02014-09-11 21:12:48 +00001739 emitAccel(AccelObjC, Asm->getObjFileLowering().getDwarfAccelObjCSection(),
Rafael Espindola6b9998b2015-03-10 22:00:25 +00001740 "ObjC");
Eric Christopher4996c702011-11-07 09:24:32 +00001741}
1742
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001743// Emit namespace dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00001744void DwarfDebug::emitAccelNamespaces() {
David Blaikie6741bb02014-09-11 21:12:48 +00001745 emitAccel(AccelNamespace,
1746 Asm->getObjFileLowering().getDwarfAccelNamespaceSection(),
Rafael Espindola6b9998b2015-03-10 22:00:25 +00001747 "namespac");
Eric Christopher4996c702011-11-07 09:24:32 +00001748}
1749
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001750// Emit type dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00001751void DwarfDebug::emitAccelTypes() {
David Blaikie6741bb02014-09-11 21:12:48 +00001752 emitAccel(AccelTypes, Asm->getObjFileLowering().getDwarfAccelTypesSection(),
Rafael Espindola6b9998b2015-03-10 22:00:25 +00001753 "types");
Eric Christopher4996c702011-11-07 09:24:32 +00001754}
1755
Eric Christopherdd1a0122013-09-13 00:35:05 +00001756// Public name handling.
1757// The format for the various pubnames:
1758//
1759// dwarf pubnames - offset/name pairs where the offset is the offset into the CU
1760// for the DIE that is named.
1761//
1762// gnu pubnames - offset/index value/name tuples where the offset is the offset
1763// into the CU and the index value is computed according to the type of value
1764// for the DIE that is named.
1765//
1766// For type units the offset is the offset of the skeleton DIE. For split dwarf
1767// it's the offset within the debug_info/debug_types dwo section, however, the
1768// reference in the pubname header doesn't change.
1769
1770/// computeIndexValue - Compute the gdb index value for the DIE and CU.
Eric Christophera5a79422013-12-09 23:32:48 +00001771static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU,
Eric Christopher0fe676a2013-11-21 00:48:22 +00001772 const DIE *Die) {
David Blaikiea0e3c752017-02-03 00:44:18 +00001773 // Entities that ended up only in a Type Unit reference the CU instead (since
1774 // the pub entry has offsets within the CU there's no real offset that can be
1775 // provided anyway). As it happens all such entities (namespaces and types,
1776 // types only in C++ at that) are rendered as TYPE+EXTERNAL. If this turns out
1777 // not to be true it would be necessary to persist this information from the
1778 // point at which the entry is added to the index data structure - since by
1779 // the time the index is built from that, the original type/namespace DIE in a
1780 // type unit has already been destroyed so it can't be queried for properties
1781 // like tag, etc.
1782 if (Die->getTag() == dwarf::DW_TAG_compile_unit)
1783 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE,
1784 dwarf::GIEL_EXTERNAL);
Eric Christopherd2b497b2013-10-16 01:37:49 +00001785 dwarf::GDBIndexEntryLinkage Linkage = dwarf::GIEL_STATIC;
1786
1787 // We could have a specification DIE that has our most of our knowledge,
1788 // look for that now.
Duncan P. N. Exon Smithe7e1d0c2015-05-27 22:14:58 +00001789 if (DIEValue SpecVal = Die->findAttribute(dwarf::DW_AT_specification)) {
1790 DIE &SpecDIE = SpecVal.getDIEEntry().getEntry();
David Blaikie8dbcc3f2014-04-25 19:33:43 +00001791 if (SpecDIE.findAttribute(dwarf::DW_AT_external))
Eric Christopherd2b497b2013-10-16 01:37:49 +00001792 Linkage = dwarf::GIEL_EXTERNAL;
1793 } else if (Die->findAttribute(dwarf::DW_AT_external))
1794 Linkage = dwarf::GIEL_EXTERNAL;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001795
1796 switch (Die->getTag()) {
1797 case dwarf::DW_TAG_class_type:
1798 case dwarf::DW_TAG_structure_type:
1799 case dwarf::DW_TAG_union_type:
1800 case dwarf::DW_TAG_enumeration_type:
Eric Christopher261d2342013-09-23 20:55:35 +00001801 return dwarf::PubIndexEntryDescriptor(
1802 dwarf::GIEK_TYPE, CU->getLanguage() != dwarf::DW_LANG_C_plus_plus
1803 ? dwarf::GIEL_STATIC
1804 : dwarf::GIEL_EXTERNAL);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001805 case dwarf::DW_TAG_typedef:
1806 case dwarf::DW_TAG_base_type:
1807 case dwarf::DW_TAG_subrange_type:
David Blaikie8dec4072013-09-19 20:40:26 +00001808 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE, dwarf::GIEL_STATIC);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001809 case dwarf::DW_TAG_namespace:
David Blaikie8dec4072013-09-19 20:40:26 +00001810 return dwarf::GIEK_TYPE;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001811 case dwarf::DW_TAG_subprogram:
Eric Christopherccac5c42013-09-23 22:59:14 +00001812 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_FUNCTION, Linkage);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001813 case dwarf::DW_TAG_variable:
Eric Christopherccac5c42013-09-23 22:59:14 +00001814 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, Linkage);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001815 case dwarf::DW_TAG_enumerator:
David Blaikie8dec4072013-09-19 20:40:26 +00001816 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE,
1817 dwarf::GIEL_STATIC);
Eric Christopherdd1a0122013-09-13 00:35:05 +00001818 default:
David Blaikie8dec4072013-09-19 20:40:26 +00001819 return dwarf::GIEK_NONE;
Eric Christopherdd1a0122013-09-13 00:35:05 +00001820 }
Eric Christopherdd1a0122013-09-13 00:35:05 +00001821}
1822
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001823/// emitDebugPubSections - Emit visible names and types into debug pubnames and
1824/// pubtypes sections.
1825void DwarfDebug::emitDebugPubSections() {
David Blaikiec3d9e9e2014-03-06 01:42:00 +00001826 for (const auto &NU : CUMap) {
1827 DwarfCompileUnit *TheU = NU.second;
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001828 if (!TheU->hasDwarfPubSections())
David Blaikiece2f1cb2014-03-11 23:35:06 +00001829 continue;
1830
David Blaikie66cf14d2018-08-16 21:29:55 +00001831 bool GnuStyle = TheU->getCUNode()->getNameTableKind() ==
1832 DICompileUnit::DebugNameTableKind::GNU;
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001833
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001834 Asm->OutStreamer->SwitchSection(
1835 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection()
1836 : Asm->getObjFileLowering().getDwarfPubNamesSection());
1837 emitDebugPubSection(GnuStyle, "Names", TheU, TheU->getGlobalNames());
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001838
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001839 Asm->OutStreamer->SwitchSection(
1840 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
1841 : Asm->getObjFileLowering().getDwarfPubTypesSection());
1842 emitDebugPubSection(GnuStyle, "Types", TheU, TheU->getGlobalTypes());
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001843 }
1844}
1845
Alexey Bataevbff36082018-03-23 13:35:54 +00001846void DwarfDebug::emitSectionReference(const DwarfCompileUnit &CU) {
1847 if (useSectionsAsReferences())
1848 Asm->EmitDwarfOffset(CU.getSection()->getBeginSymbol(),
1849 CU.getDebugSectionOffset());
1850 else
1851 Asm->emitDwarfSymbolReference(CU.getLabelBegin());
1852}
1853
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001854void DwarfDebug::emitDebugPubSection(bool GnuStyle, StringRef Name,
1855 DwarfCompileUnit *TheU,
1856 const StringMap<const DIE *> &Globals) {
1857 if (auto *Skeleton = TheU->getSkeleton())
1858 TheU = Skeleton;
Eric Christopher8b3737f2013-09-13 00:34:58 +00001859
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001860 // Emit the header.
1861 Asm->OutStreamer->AddComment("Length of Public " + Name + " Info");
1862 MCSymbol *BeginLabel = Asm->createTempSymbol("pub" + Name + "_begin");
1863 MCSymbol *EndLabel = Asm->createTempSymbol("pub" + Name + "_end");
1864 Asm->EmitLabelDifference(EndLabel, BeginLabel, 4);
1865
1866 Asm->OutStreamer->EmitLabel(BeginLabel);
1867
1868 Asm->OutStreamer->AddComment("DWARF Version");
Rafael Espindola4b4d85f2018-03-29 23:32:54 +00001869 Asm->emitInt16(dwarf::DW_PUBNAMES_VERSION);
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001870
1871 Asm->OutStreamer->AddComment("Offset of Compilation Unit Info");
Alexey Bataevbff36082018-03-23 13:35:54 +00001872 emitSectionReference(*TheU);
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001873
1874 Asm->OutStreamer->AddComment("Compilation Unit Length");
Rafael Espindola4b4d85f2018-03-29 23:32:54 +00001875 Asm->emitInt32(TheU->getLength());
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001876
1877 // Emit the pubnames for this compilation unit.
1878 for (const auto &GI : Globals) {
1879 const char *Name = GI.getKeyData();
1880 const DIE *Entity = GI.second;
1881
1882 Asm->OutStreamer->AddComment("DIE offset");
Rafael Espindola4b4d85f2018-03-29 23:32:54 +00001883 Asm->emitInt32(Entity->getOffset());
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001884
1885 if (GnuStyle) {
1886 dwarf::PubIndexEntryDescriptor Desc = computeIndexValue(TheU, Entity);
1887 Asm->OutStreamer->AddComment(
Fangrui Songd8fd0ec2018-11-13 20:18:08 +00001888 Twine("Attributes: ") + dwarf::GDBIndexEntryKindString(Desc.Kind) +
1889 ", " + dwarf::GDBIndexEntryLinkageString(Desc.Linkage));
Rafael Espindola4b4d85f2018-03-29 23:32:54 +00001890 Asm->emitInt8(Desc.toBits());
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001891 }
1892
1893 Asm->OutStreamer->AddComment("External Name");
1894 Asm->OutStreamer->EmitBytes(StringRef(Name, GI.getKeyLength() + 1));
1895 }
1896
1897 Asm->OutStreamer->AddComment("End Mark");
Rafael Espindola4b4d85f2018-03-29 23:32:54 +00001898 Asm->emitInt32(0);
Peter Collingbourneb52e2362017-09-12 21:50:41 +00001899 Asm->OutStreamer->EmitLabel(EndLabel);
Devang Patel04d2f2d2009-11-24 01:14:22 +00001900}
1901
Amjad Aboudc0778412016-01-24 08:18:55 +00001902/// Emit null-terminated strings into a debug str section.
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001903void DwarfDebug::emitDebugStr() {
Wolfgang Pieb456b5552018-01-26 18:52:58 +00001904 MCSection *StringOffsetsSection = nullptr;
1905 if (useSegmentedStringOffsetsTable()) {
1906 emitStringOffsetsTableHeader();
1907 StringOffsetsSection = Asm->getObjFileLowering().getDwarfStrOffSection();
1908 }
Eric Christopherf8194852013-12-05 18:06:10 +00001909 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Wolfgang Pieb456b5552018-01-26 18:52:58 +00001910 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection(),
1911 StringOffsetsSection, /* UseRelativeOffsets = */ true);
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001912}
1913
Eric Christopher29e874d2014-03-07 22:40:37 +00001914void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer,
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001915 const DebugLocStream::Entry &Entry) {
1916 auto &&Comments = DebugLocs.getComments(Entry);
1917 auto Comment = Comments.begin();
1918 auto End = Comments.end();
1919 for (uint8_t Byte : DebugLocs.getBytes(Entry))
Adrian Prantl92da14b2015-03-02 22:02:33 +00001920 Streamer.EmitInt8(Byte, Comment != End ? *(Comment++) : "");
Adrian Prantlb1416832014-08-01 22:11:58 +00001921}
1922
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001923static void emitDebugLocValue(const AsmPrinter &AP, const DIBasicType *BT,
Adrian Prantl92da14b2015-03-02 22:02:33 +00001924 const DebugLocEntry::Value &Value,
Adrian Prantl8fafb8d2016-12-09 20:43:40 +00001925 DwarfExpression &DwarfExpr) {
Adrian Prantl956484b2017-03-20 21:35:09 +00001926 auto *DIExpr = Value.getExpression();
1927 DIExpressionCursor ExprCursor(DIExpr);
1928 DwarfExpr.addFragmentOffset(DIExpr);
Adrian Prantlb1416832014-08-01 22:11:58 +00001929 // Regular entry.
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001930 if (Value.isInt()) {
Duncan P. N. Exon Smithfba25d62015-04-17 16:28:58 +00001931 if (BT && (BT->getEncoding() == dwarf::DW_ATE_signed ||
1932 BT->getEncoding() == dwarf::DW_ATE_signed_char))
Adrian Prantla63b8e82017-03-16 17:42:45 +00001933 DwarfExpr.addSignedConstant(Value.getInt());
Adrian Prantl66f25952015-01-13 00:04:06 +00001934 else
Adrian Prantla63b8e82017-03-16 17:42:45 +00001935 DwarfExpr.addUnsignedConstant(Value.getInt());
Adrian Prantle19e5ef2014-04-27 18:25:40 +00001936 } else if (Value.isLocation()) {
Adrian Prantl956484b2017-03-20 21:35:09 +00001937 MachineLocation Location = Value.getLoc();
Adrian Prantlc12cee32017-04-19 23:42:25 +00001938 if (Location.isIndirect())
1939 DwarfExpr.setMemoryLocationKind();
Adrian Prantl2049c0d2017-08-02 15:22:17 +00001940 DIExpressionCursor Cursor(DIExpr);
Adrian Prantl8fafb8d2016-12-09 20:43:40 +00001941 const TargetRegisterInfo &TRI = *AP.MF->getSubtarget().getRegisterInfo();
Adrian Prantlc12cee32017-04-19 23:42:25 +00001942 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg()))
Adrian Prantl956484b2017-03-20 21:35:09 +00001943 return;
1944 return DwarfExpr.addExpression(std::move(Cursor));
Adrian Prantl3e9c8872016-04-08 00:38:37 +00001945 } else if (Value.isConstantFP()) {
1946 APInt RawBytes = Value.getConstantFP()->getValueAPF().bitcastToAPInt();
Adrian Prantla63b8e82017-03-16 17:42:45 +00001947 DwarfExpr.addUnsignedConstant(RawBytes);
Eric Christopher29e874d2014-03-07 22:40:37 +00001948 }
Adrian Prantla63b8e82017-03-16 17:42:45 +00001949 DwarfExpr.addExpression(std::move(ExprCursor));
Eric Christopher29e874d2014-03-07 22:40:37 +00001950}
1951
Duncan P. N. Exon Smith3a73d9e2015-06-21 16:54:56 +00001952void DebugLocEntry::finalize(const AsmPrinter &AP,
1953 DebugLocStream::ListBuilder &List,
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00001954 const DIBasicType *BT) {
David Stenberg33b192d2019-01-09 09:58:59 +00001955 assert(Begin != End && "unexpected location list entry with empty range");
Duncan P. N. Exon Smith3a73d9e2015-06-21 16:54:56 +00001956 DebugLocStream::EntryBuilder Entry(List, Begin, End);
1957 BufferByteStreamer Streamer = Entry.getStreamer();
Adrian Prantl8fafb8d2016-12-09 20:43:40 +00001958 DebugLocDwarfExpression DwarfExpr(AP.getDwarfVersion(), Streamer);
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001959 const DebugLocEntry::Value &Value = Values[0];
Adrian Prantl941fa752016-12-05 18:04:47 +00001960 if (Value.isFragment()) {
1961 // Emit all fragments that belong to the same variable and range.
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +00001962 assert(llvm::all_of(Values, [](DebugLocEntry::Value P) {
Adrian Prantl941fa752016-12-05 18:04:47 +00001963 return P.isFragment();
1964 }) && "all values are expected to be fragments");
Adrian Prantl92da14b2015-03-02 22:02:33 +00001965 assert(std::is_sorted(Values.begin(), Values.end()) &&
Adrian Prantl941fa752016-12-05 18:04:47 +00001966 "fragments are expected to be sorted");
Duncan P. N. Exon Smithc82570b2015-04-13 18:53:11 +00001967
Adrian Prantl8fafb8d2016-12-09 20:43:40 +00001968 for (auto Fragment : Values)
Petar Jovanovicd175aeb2018-06-28 04:50:40 +00001969 emitDebugLocValue(AP, BT, Fragment, DwarfExpr);
Adrian Prantl8fafb8d2016-12-09 20:43:40 +00001970
Adrian Prantl92da14b2015-03-02 22:02:33 +00001971 } else {
Adrian Prantl941fa752016-12-05 18:04:47 +00001972 assert(Values.size() == 1 && "only fragments may have >1 value");
Petar Jovanovicd175aeb2018-06-28 04:50:40 +00001973 emitDebugLocValue(AP, BT, Value, DwarfExpr);
Adrian Prantl92da14b2015-03-02 22:02:33 +00001974 }
Adrian Prantl8fafb8d2016-12-09 20:43:40 +00001975 DwarfExpr.finalize();
Adrian Prantl92da14b2015-03-02 22:02:33 +00001976}
1977
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00001978void DwarfDebug::emitDebugLocEntryLocation(const DebugLocStream::Entry &Entry) {
Duncan P. N. Exon Smith653c1092015-05-06 19:11:20 +00001979 // Emit the size.
Lang Hames9ff69c82015-04-24 19:11:51 +00001980 Asm->OutStreamer->AddComment("Loc expr size");
Wolfgang Pieb58513b72019-02-01 17:11:58 +00001981 if (getDwarfVersion() >= 5)
1982 Asm->EmitULEB128(DebugLocs.getBytes(Entry).size());
1983 else
1984 Asm->emitInt16(DebugLocs.getBytes(Entry).size());
David Blaikie0e84adc2014-04-01 16:17:41 +00001985 // Emit the entry.
1986 APByteStreamer Streamer(*Asm);
1987 emitDebugLocEntry(Streamer, Entry);
David Blaikie0e84adc2014-04-01 16:17:41 +00001988}
1989
George Rimar088d96b2018-10-26 11:25:12 +00001990// Emit the common part of the DWARF 5 range/locations list tables header.
1991static void emitListsTableHeaderStart(AsmPrinter *Asm, const DwarfFile &Holder,
1992 MCSymbol *TableStart,
1993 MCSymbol *TableEnd) {
1994 // Build the table header, which starts with the length field.
1995 Asm->OutStreamer->AddComment("Length");
1996 Asm->EmitLabelDifference(TableEnd, TableStart, 4);
1997 Asm->OutStreamer->EmitLabel(TableStart);
1998 // Version number (DWARF v5 and later).
1999 Asm->OutStreamer->AddComment("Version");
2000 Asm->emitInt16(Asm->OutStreamer->getContext().getDwarfVersion());
2001 // Address size.
2002 Asm->OutStreamer->AddComment("Address size");
2003 Asm->emitInt8(Asm->MAI->getCodePointerSize());
2004 // Segment selector size.
2005 Asm->OutStreamer->AddComment("Segment selector size");
2006 Asm->emitInt8(0);
2007}
2008
2009// Emit the header of a DWARF 5 range list table list table. Returns the symbol
2010// that designates the end of the table for the caller to emit when the table is
2011// complete.
2012static MCSymbol *emitRnglistsTableHeader(AsmPrinter *Asm,
2013 const DwarfFile &Holder) {
2014 MCSymbol *TableStart = Asm->createTempSymbol("debug_rnglist_table_start");
2015 MCSymbol *TableEnd = Asm->createTempSymbol("debug_rnglist_table_end");
2016 emitListsTableHeaderStart(Asm, Holder, TableStart, TableEnd);
2017
2018 Asm->OutStreamer->AddComment("Offset entry count");
2019 Asm->emitInt32(Holder.getRangeLists().size());
2020 Asm->OutStreamer->EmitLabel(Holder.getRnglistsTableBaseSym());
2021
2022 for (const RangeSpanList &List : Holder.getRangeLists())
2023 Asm->EmitLabelDifference(List.getSym(), Holder.getRnglistsTableBaseSym(),
2024 4);
2025
2026 return TableEnd;
2027}
2028
2029// Emit the header of a DWARF 5 locations list table. Returns the symbol that
2030// designates the end of the table for the caller to emit when the table is
2031// complete.
2032static MCSymbol *emitLoclistsTableHeader(AsmPrinter *Asm,
2033 const DwarfFile &Holder) {
2034 MCSymbol *TableStart = Asm->createTempSymbol("debug_loclist_table_start");
2035 MCSymbol *TableEnd = Asm->createTempSymbol("debug_loclist_table_end");
2036 emitListsTableHeaderStart(Asm, Holder, TableStart, TableEnd);
2037
2038 // FIXME: Generate the offsets table and use DW_FORM_loclistx with the
2039 // DW_AT_loclists_base attribute. Until then set the number of offsets to 0.
2040 Asm->OutStreamer->AddComment("Offset entry count");
2041 Asm->emitInt32(0);
2042 Asm->OutStreamer->EmitLabel(Holder.getLoclistsTableBaseSym());
2043
2044 return TableEnd;
2045}
2046
2047// Emit locations into the .debug_loc/.debug_rnglists section.
Devang Patel930143b2009-11-21 02:48:08 +00002048void DwarfDebug::emitDebugLoc() {
David Blaikie07963bd2017-05-26 18:52:56 +00002049 if (DebugLocs.getLists().empty())
2050 return;
2051
George Rimar088d96b2018-10-26 11:25:12 +00002052 bool IsLocLists = getDwarfVersion() >= 5;
2053 MCSymbol *TableEnd = nullptr;
2054 if (IsLocLists) {
2055 Asm->OutStreamer->SwitchSection(
2056 Asm->getObjFileLowering().getDwarfLoclistsSection());
2057 TableEnd = emitLoclistsTableHeader(Asm, useSplitDwarf() ? SkeletonHolder
2058 : InfoHolder);
2059 } else {
2060 Asm->OutStreamer->SwitchSection(
2061 Asm->getObjFileLowering().getDwarfLocSection());
2062 }
2063
Konstantin Zhuravlyovdc77b2e2017-04-17 17:41:25 +00002064 unsigned char Size = Asm->MAI->getCodePointerSize();
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00002065 for (const auto &List : DebugLocs.getLists()) {
Lang Hames9ff69c82015-04-24 19:11:51 +00002066 Asm->OutStreamer->EmitLabel(List.Label);
George Rimar088d96b2018-10-26 11:25:12 +00002067
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00002068 const DwarfCompileUnit *CU = List.CU;
George Rimar088d96b2018-10-26 11:25:12 +00002069 const MCSymbol *Base = CU->getBaseAddress();
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00002070 for (const auto &Entry : DebugLocs.getEntries(List)) {
George Rimar088d96b2018-10-26 11:25:12 +00002071 if (Base) {
2072 // Set up the range. This range is relative to the entry point of the
2073 // compile unit. This is a hard coded 0 for low_pc when we're emitting
2074 // ranges, or the DW_AT_low_pc on the compile unit otherwise.
2075 if (IsLocLists) {
2076 Asm->OutStreamer->AddComment("DW_LLE_offset_pair");
2077 Asm->OutStreamer->EmitIntValue(dwarf::DW_LLE_offset_pair, 1);
2078 Asm->OutStreamer->AddComment(" starting offset");
2079 Asm->EmitLabelDifferenceAsULEB128(Entry.BeginSym, Base);
2080 Asm->OutStreamer->AddComment(" ending offset");
2081 Asm->EmitLabelDifferenceAsULEB128(Entry.EndSym, Base);
2082 } else {
2083 Asm->EmitLabelDifference(Entry.BeginSym, Base, Size);
2084 Asm->EmitLabelDifference(Entry.EndSym, Base, Size);
2085 }
2086
2087 emitDebugLocEntryLocation(Entry);
2088 continue;
2089 }
2090
2091 // We have no base address.
2092 if (IsLocLists) {
2093 // TODO: Use DW_LLE_base_addressx + DW_LLE_offset_pair, or
2094 // DW_LLE_startx_length in case if there is only a single range.
2095 // That should reduce the size of the debug data emited.
2096 // For now just use the DW_LLE_startx_length for all cases.
2097 Asm->OutStreamer->AddComment("DW_LLE_startx_length");
2098 Asm->emitInt8(dwarf::DW_LLE_startx_length);
2099 Asm->OutStreamer->AddComment(" start idx");
2100 Asm->EmitULEB128(AddrPool.getIndex(Entry.BeginSym));
2101 Asm->OutStreamer->AddComment(" length");
2102 Asm->EmitLabelDifferenceAsULEB128(Entry.EndSym, Entry.BeginSym);
Eric Christopher384f3fe2014-03-20 19:16:16 +00002103 } else {
Lang Hames9ff69c82015-04-24 19:11:51 +00002104 Asm->OutStreamer->EmitSymbolValue(Entry.BeginSym, Size);
2105 Asm->OutStreamer->EmitSymbolValue(Entry.EndSym, Size);
Eric Christopher384f3fe2014-03-20 19:16:16 +00002106 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002107
David Blaikie0e84adc2014-04-01 16:17:41 +00002108 emitDebugLocEntryLocation(Entry);
Devang Patel9fc11702010-05-25 23:40:22 +00002109 }
George Rimar088d96b2018-10-26 11:25:12 +00002110
2111 if (IsLocLists) {
2112 // .debug_loclists section ends with DW_LLE_end_of_list.
2113 Asm->OutStreamer->AddComment("DW_LLE_end_of_list");
2114 Asm->OutStreamer->EmitIntValue(dwarf::DW_LLE_end_of_list, 1);
2115 } else {
2116 // Terminate the .debug_loc list with two 0 values.
2117 Asm->OutStreamer->EmitIntValue(0, Size);
2118 Asm->OutStreamer->EmitIntValue(0, Size);
2119 }
David Blaikie94c1d7f2014-04-02 01:50:20 +00002120 }
George Rimar088d96b2018-10-26 11:25:12 +00002121
2122 if (TableEnd)
2123 Asm->OutStreamer->EmitLabel(TableEnd);
David Blaikie94c1d7f2014-04-02 01:50:20 +00002124}
2125
2126void DwarfDebug::emitDebugLocDWO() {
Lang Hames9ff69c82015-04-24 19:11:51 +00002127 Asm->OutStreamer->SwitchSection(
David Blaikie94c1d7f2014-04-02 01:50:20 +00002128 Asm->getObjFileLowering().getDwarfLocDWOSection());
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00002129 for (const auto &List : DebugLocs.getLists()) {
Lang Hames9ff69c82015-04-24 19:11:51 +00002130 Asm->OutStreamer->EmitLabel(List.Label);
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00002131 for (const auto &Entry : DebugLocs.getEntries(List)) {
David Blaikie73c2f192018-10-25 22:26:25 +00002132 // GDB only supports startx_length in pre-standard split-DWARF.
2133 // (in v5 standard loclists, it currently* /only/ supports base_address +
2134 // offset_pair, so the implementations can't really share much since they
2135 // need to use different representations)
2136 // * as of October 2018, at least
2137 // Ideally/in v5, this could use SectionLabels to reuse existing addresses
2138 // in the address pool to minimize object size/relocations.
Rafael Espindola4b4d85f2018-03-29 23:32:54 +00002139 Asm->emitInt8(dwarf::DW_LLE_startx_length);
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00002140 unsigned idx = AddrPool.getIndex(Entry.BeginSym);
David Blaikie94c1d7f2014-04-02 01:50:20 +00002141 Asm->EmitULEB128(idx);
Duncan P. N. Exon Smith364a3002015-04-17 21:34:47 +00002142 Asm->EmitLabelDifference(Entry.EndSym, Entry.BeginSym, 4);
David Blaikie94c1d7f2014-04-02 01:50:20 +00002143
2144 emitDebugLocEntryLocation(Entry);
David Blaikie9c550ac2014-03-25 01:44:02 +00002145 }
Rafael Espindola4b4d85f2018-03-29 23:32:54 +00002146 Asm->emitInt8(dwarf::DW_LLE_end_of_list);
Devang Patel9fc11702010-05-25 23:40:22 +00002147 }
Bill Wendling480ff322009-05-20 23:21:38 +00002148}
2149
Richard Mitton21101b32013-09-19 23:21:01 +00002150struct ArangeSpan {
2151 const MCSymbol *Start, *End;
2152};
2153
2154// Emit a debug aranges section, containing a CU lookup for any
2155// address we can tie back to a CU.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00002156void DwarfDebug::emitDebugARanges() {
Rafael Espindolae8fd00d2015-02-26 22:02:02 +00002157 // Provides a unique id per text section.
Rafael Espindola0709a7b2015-05-21 19:20:38 +00002158 MapVector<MCSection *, SmallVector<SymbolCU, 8>> SectionMap;
Richard Mitton21101b32013-09-19 23:21:01 +00002159
Rafael Espindolae8fd00d2015-02-26 22:02:02 +00002160 // Filter labels by section.
2161 for (const SymbolCU &SCU : ArangeLabels) {
2162 if (SCU.Sym->isInSection()) {
2163 // Make a note of this symbol and it's section.
Rafael Espindola0709a7b2015-05-21 19:20:38 +00002164 MCSection *Section = &SCU.Sym->getSection();
Rafael Espindolae8fd00d2015-02-26 22:02:02 +00002165 if (!Section->getKind().isMetadata())
2166 SectionMap[Section].push_back(SCU);
2167 } else {
2168 // Some symbols (e.g. common/bss on mach-o) can have no section but still
2169 // appear in the output. This sucks as we rely on sections to build
2170 // arange spans. We can do it without, but it's icky.
2171 SectionMap[nullptr].push_back(SCU);
2172 }
2173 }
Richard Mitton21101b32013-09-19 23:21:01 +00002174
Rafael Espindolae8fd00d2015-02-26 22:02:02 +00002175 DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan>> Spans;
2176
Rafael Espindola4f4ef152015-03-09 22:08:37 +00002177 for (auto &I : SectionMap) {
Rafael Espindola78d947b2016-05-20 00:38:28 +00002178 MCSection *Section = I.first;
Rafael Espindola4f4ef152015-03-09 22:08:37 +00002179 SmallVector<SymbolCU, 8> &List = I.second;
Rafael Espindola78d947b2016-05-20 00:38:28 +00002180 if (List.size() < 1)
Richard Mitton21101b32013-09-19 23:21:01 +00002181 continue;
2182
Rafael Espindola6ffb1d72015-02-02 19:22:51 +00002183 // If we have no section (e.g. common), just write out
2184 // individual spans for each symbol.
2185 if (!Section) {
2186 for (const SymbolCU &Cur : List) {
2187 ArangeSpan Span;
2188 Span.Start = Cur.Sym;
2189 Span.End = nullptr;
Rafael Espindola78d947b2016-05-20 00:38:28 +00002190 assert(Cur.CU);
2191 Spans[Cur.CU].push_back(Span);
Rafael Espindola6ffb1d72015-02-02 19:22:51 +00002192 }
2193 continue;
2194 }
2195
Richard Mitton21101b32013-09-19 23:21:01 +00002196 // Sort the symbols by offset within the section.
Mandeep Singh Grang46d02de2018-02-25 19:52:34 +00002197 std::stable_sort(
Rafael Espindola0a78f8c2016-05-19 23:17:37 +00002198 List.begin(), List.end(), [&](const SymbolCU &A, const SymbolCU &B) {
2199 unsigned IA = A.Sym ? Asm->OutStreamer->GetSymbolOrder(A.Sym) : 0;
2200 unsigned IB = B.Sym ? Asm->OutStreamer->GetSymbolOrder(B.Sym) : 0;
Benjamin Kramer571e2fe2014-03-07 19:41:22 +00002201
Rafael Espindola0a78f8c2016-05-19 23:17:37 +00002202 // Symbols with no order assigned should be placed at the end.
2203 // (e.g. section end labels)
2204 if (IA == 0)
2205 return false;
2206 if (IB == 0)
2207 return true;
2208 return IA < IB;
2209 });
Richard Mitton21101b32013-09-19 23:21:01 +00002210
Rafael Espindola78d947b2016-05-20 00:38:28 +00002211 // Insert a final terminator.
2212 List.push_back(SymbolCU(nullptr, Asm->OutStreamer->endSection(Section)));
2213
Rafael Espindola6ffb1d72015-02-02 19:22:51 +00002214 // Build spans between each label.
2215 const MCSymbol *StartSym = List[0].Sym;
2216 for (size_t n = 1, e = List.size(); n < e; n++) {
2217 const SymbolCU &Prev = List[n - 1];
2218 const SymbolCU &Cur = List[n];
Richard Mitton21101b32013-09-19 23:21:01 +00002219
Rafael Espindola6ffb1d72015-02-02 19:22:51 +00002220 // Try and build the longest span we can within the same CU.
2221 if (Cur.CU != Prev.CU) {
2222 ArangeSpan Span;
2223 Span.Start = StartSym;
2224 Span.End = Cur.Sym;
Rafael Espindola78d947b2016-05-20 00:38:28 +00002225 assert(Prev.CU);
Rafael Espindola6ffb1d72015-02-02 19:22:51 +00002226 Spans[Prev.CU].push_back(Span);
2227 StartSym = Cur.Sym;
Richard Mitton21101b32013-09-19 23:21:01 +00002228 }
2229 }
2230 }
2231
Rafael Espindolae8fd00d2015-02-26 22:02:02 +00002232 // Start the dwarf aranges section.
Lang Hames9ff69c82015-04-24 19:11:51 +00002233 Asm->OutStreamer->SwitchSection(
Rafael Espindolae8fd00d2015-02-26 22:02:02 +00002234 Asm->getObjFileLowering().getDwarfARangesSection());
2235
Konstantin Zhuravlyovdc77b2e2017-04-17 17:41:25 +00002236 unsigned PtrSize = Asm->MAI->getCodePointerSize();
Richard Mitton21101b32013-09-19 23:21:01 +00002237
2238 // Build a list of CUs used.
Eric Christopher4287a492013-12-09 23:57:44 +00002239 std::vector<DwarfCompileUnit *> CUs;
Benjamin Kramer15596c72014-03-07 19:09:39 +00002240 for (const auto &it : Spans) {
2241 DwarfCompileUnit *CU = it.first;
Richard Mitton21101b32013-09-19 23:21:01 +00002242 CUs.push_back(CU);
2243 }
2244
2245 // Sort the CU list (again, to ensure consistent output order).
Fangrui Song0cac7262018-09-27 02:13:45 +00002246 llvm::sort(CUs, [](const DwarfCompileUnit *A, const DwarfCompileUnit *B) {
2247 return A->getUniqueID() < B->getUniqueID();
2248 });
Richard Mitton21101b32013-09-19 23:21:01 +00002249
2250 // Emit an arange table for each CU we used.
Benjamin Kramer15596c72014-03-07 19:09:39 +00002251 for (DwarfCompileUnit *CU : CUs) {
Richard Mitton21101b32013-09-19 23:21:01 +00002252 std::vector<ArangeSpan> &List = Spans[CU];
2253
David Blaikie27e35f22014-11-02 01:21:43 +00002254 // Describe the skeleton CU's offset and length, not the dwo file's.
2255 if (auto *Skel = CU->getSkeleton())
2256 CU = Skel;
2257
Richard Mitton21101b32013-09-19 23:21:01 +00002258 // Emit size of content not including length itself.
Eric Christopherb4bef6d2013-11-19 09:04:36 +00002259 unsigned ContentSize =
2260 sizeof(int16_t) + // DWARF ARange version number
2261 sizeof(int32_t) + // Offset of CU in the .debug_info section
2262 sizeof(int8_t) + // Pointer Size (in bytes)
2263 sizeof(int8_t); // Segment Size (in bytes)
Richard Mitton21101b32013-09-19 23:21:01 +00002264
2265 unsigned TupleSize = PtrSize * 2;
2266
2267 // 7.20 in the Dwarf specs requires the table to be aligned to a tuple.
Benjamin Kramer8a68ab32014-01-07 19:28:14 +00002268 unsigned Padding =
2269 OffsetToAlignment(sizeof(int32_t) + ContentSize, TupleSize);
Richard Mitton21101b32013-09-19 23:21:01 +00002270
2271 ContentSize += Padding;
2272 ContentSize += (List.size() + 1) * TupleSize;
2273
2274 // For each compile unit, write the list of spans it covers.
Lang Hames9ff69c82015-04-24 19:11:51 +00002275 Asm->OutStreamer->AddComment("Length of ARange Set");
Rafael Espindola4b4d85f2018-03-29 23:32:54 +00002276 Asm->emitInt32(ContentSize);
Lang Hames9ff69c82015-04-24 19:11:51 +00002277 Asm->OutStreamer->AddComment("DWARF Arange version number");
Rafael Espindola4b4d85f2018-03-29 23:32:54 +00002278 Asm->emitInt16(dwarf::DW_ARANGES_VERSION);
Lang Hames9ff69c82015-04-24 19:11:51 +00002279 Asm->OutStreamer->AddComment("Offset Into Debug Info Section");
Alexey Bataevbff36082018-03-23 13:35:54 +00002280 emitSectionReference(*CU);
Lang Hames9ff69c82015-04-24 19:11:51 +00002281 Asm->OutStreamer->AddComment("Address Size (in bytes)");
Rafael Espindola4b4d85f2018-03-29 23:32:54 +00002282 Asm->emitInt8(PtrSize);
Lang Hames9ff69c82015-04-24 19:11:51 +00002283 Asm->OutStreamer->AddComment("Segment Size (in bytes)");
Rafael Espindola4b4d85f2018-03-29 23:32:54 +00002284 Asm->emitInt8(0);
Richard Mitton21101b32013-09-19 23:21:01 +00002285
Petr Hosekfaef3202016-06-01 01:59:58 +00002286 Asm->OutStreamer->emitFill(Padding, 0xff);
Richard Mitton21101b32013-09-19 23:21:01 +00002287
Benjamin Kramer15596c72014-03-07 19:09:39 +00002288 for (const ArangeSpan &Span : List) {
Richard Mitton21101b32013-09-19 23:21:01 +00002289 Asm->EmitLabelReference(Span.Start, PtrSize);
2290
2291 // Calculate the size as being from the span start to it's end.
Richard Mitton089ed892013-09-23 17:56:20 +00002292 if (Span.End) {
Richard Mitton21101b32013-09-19 23:21:01 +00002293 Asm->EmitLabelDifference(Span.End, Span.Start, PtrSize);
Richard Mitton089ed892013-09-23 17:56:20 +00002294 } else {
2295 // For symbols without an end marker (e.g. common), we
2296 // write a single arange entry containing just that one symbol.
2297 uint64_t Size = SymSize[Span.Start];
2298 if (Size == 0)
2299 Size = 1;
2300
Lang Hames9ff69c82015-04-24 19:11:51 +00002301 Asm->OutStreamer->EmitIntValue(Size, PtrSize);
Richard Mitton089ed892013-09-23 17:56:20 +00002302 }
Richard Mitton21101b32013-09-19 23:21:01 +00002303 }
2304
Lang Hames9ff69c82015-04-24 19:11:51 +00002305 Asm->OutStreamer->AddComment("ARange terminator");
2306 Asm->OutStreamer->EmitIntValue(0, PtrSize);
2307 Asm->OutStreamer->EmitIntValue(0, PtrSize);
Richard Mitton21101b32013-09-19 23:21:01 +00002308 }
Bill Wendling480ff322009-05-20 23:21:38 +00002309}
2310
Wolfgang Piebfcf38102018-07-12 18:18:21 +00002311/// Emit a single range list. We handle both DWARF v5 and earlier.
David Blaikiec4af8bf2018-10-20 07:36:39 +00002312static void emitRangeList(DwarfDebug &DD, AsmPrinter *Asm,
Wolfgang Piebe194f732018-07-10 00:10:11 +00002313 const RangeSpanList &List) {
Wolfgang Piebfcf38102018-07-12 18:18:21 +00002314
David Blaikiec4af8bf2018-10-20 07:36:39 +00002315 auto DwarfVersion = DD.getDwarfVersion();
Wolfgang Piebe194f732018-07-10 00:10:11 +00002316 // Emit our symbol so we can find the beginning of the range.
2317 Asm->OutStreamer->EmitLabel(List.getSym());
2318 // Gather all the ranges that apply to the same section so they can share
2319 // a base address entry.
2320 MapVector<const MCSection *, std::vector<const RangeSpan *>> SectionRanges;
2321 // Size for our labels.
2322 auto Size = Asm->MAI->getCodePointerSize();
2323
2324 for (const RangeSpan &Range : List.getRanges())
2325 SectionRanges[&Range.getStart()->getSection()].push_back(&Range);
2326
David Blaikiec8f7e6c2018-11-08 00:35:54 +00002327 const DwarfCompileUnit &CU = List.getCU();
2328 const MCSymbol *CUBase = CU.getBaseAddress();
Wolfgang Piebe194f732018-07-10 00:10:11 +00002329 bool BaseIsSet = false;
2330 for (const auto &P : SectionRanges) {
2331 // Don't bother with a base address entry if there's only one range in
2332 // this section in this range list - for example ranges for a CU will
2333 // usually consist of single regions from each of many sections
2334 // (-ffunction-sections, or just C++ inline functions) except under LTO
2335 // or optnone where there may be holes in a single CU's section
Wolfgang Piebfcf38102018-07-12 18:18:21 +00002336 // contributions.
Wolfgang Piebe194f732018-07-10 00:10:11 +00002337 auto *Base = CUBase;
David Blaikie14cfa0d2018-10-20 09:16:49 +00002338 if (!Base && (P.second.size() > 1 || DwarfVersion < 5) &&
David Blaikiebb279112018-11-13 20:08:10 +00002339 (CU.getCUNode()->getRangesBaseAddress() || DwarfVersion >= 5)) {
Wolfgang Piebe194f732018-07-10 00:10:11 +00002340 BaseIsSet = true;
2341 // FIXME/use care: This may not be a useful base address if it's not
2342 // the lowest address/range in this object.
2343 Base = P.second.front()->getStart();
David Blaikied6614052018-07-18 18:04:42 +00002344 if (DwarfVersion >= 5) {
David Blaikie60fddac2018-10-24 23:36:29 +00002345 Base = DD.getSectionLabel(&Base->getSection());
David Blaikiec4af8bf2018-10-20 07:36:39 +00002346 Asm->OutStreamer->AddComment("DW_RLE_base_addressx");
2347 Asm->OutStreamer->EmitIntValue(dwarf::DW_RLE_base_addressx, 1);
2348 Asm->OutStreamer->AddComment(" base address index");
2349 Asm->EmitULEB128(DD.getAddressPool().getIndex(Base));
2350 } else {
Wolfgang Piebfcf38102018-07-12 18:18:21 +00002351 Asm->OutStreamer->EmitIntValue(-1, Size);
David Blaikiec4af8bf2018-10-20 07:36:39 +00002352 Asm->OutStreamer->AddComment(" base address");
2353 Asm->OutStreamer->EmitSymbolValue(Base, Size);
2354 }
David Blaikied6614052018-07-18 18:04:42 +00002355 } else if (BaseIsSet && DwarfVersion < 5) {
Wolfgang Piebe194f732018-07-10 00:10:11 +00002356 BaseIsSet = false;
David Blaikied6614052018-07-18 18:04:42 +00002357 assert(!Base);
2358 Asm->OutStreamer->EmitIntValue(-1, Size);
Wolfgang Piebe194f732018-07-10 00:10:11 +00002359 Asm->OutStreamer->EmitIntValue(0, Size);
2360 }
2361
2362 for (const auto *RS : P.second) {
2363 const MCSymbol *Begin = RS->getStart();
2364 const MCSymbol *End = RS->getEnd();
2365 assert(Begin && "Range without a begin symbol?");
2366 assert(End && "Range without an end symbol?");
2367 if (Base) {
Wolfgang Piebfcf38102018-07-12 18:18:21 +00002368 if (DwarfVersion >= 5) {
2369 // Emit DW_RLE_offset_pair when we have a base.
David Blaikied6614052018-07-18 18:04:42 +00002370 Asm->OutStreamer->AddComment("DW_RLE_offset_pair");
Wolfgang Piebfcf38102018-07-12 18:18:21 +00002371 Asm->OutStreamer->EmitIntValue(dwarf::DW_RLE_offset_pair, 1);
David Blaikied6614052018-07-18 18:04:42 +00002372 Asm->OutStreamer->AddComment(" starting offset");
Wolfgang Piebfcf38102018-07-12 18:18:21 +00002373 Asm->EmitLabelDifferenceAsULEB128(Begin, Base);
David Blaikied6614052018-07-18 18:04:42 +00002374 Asm->OutStreamer->AddComment(" ending offset");
Wolfgang Piebfcf38102018-07-12 18:18:21 +00002375 Asm->EmitLabelDifferenceAsULEB128(End, Base);
2376 } else {
2377 Asm->EmitLabelDifference(Begin, Base, Size);
2378 Asm->EmitLabelDifference(End, Base, Size);
2379 }
2380 } else if (DwarfVersion >= 5) {
David Blaikiec4af8bf2018-10-20 07:36:39 +00002381 Asm->OutStreamer->AddComment("DW_RLE_startx_length");
2382 Asm->OutStreamer->EmitIntValue(dwarf::DW_RLE_startx_length, 1);
2383 Asm->OutStreamer->AddComment(" start index");
2384 Asm->EmitULEB128(DD.getAddressPool().getIndex(Begin));
David Blaikied6614052018-07-18 18:04:42 +00002385 Asm->OutStreamer->AddComment(" length");
Wolfgang Piebfcf38102018-07-12 18:18:21 +00002386 Asm->EmitLabelDifferenceAsULEB128(End, Begin);
Wolfgang Piebe194f732018-07-10 00:10:11 +00002387 } else {
2388 Asm->OutStreamer->EmitSymbolValue(Begin, Size);
2389 Asm->OutStreamer->EmitSymbolValue(End, Size);
2390 }
2391 }
2392 }
David Blaikied6614052018-07-18 18:04:42 +00002393 if (DwarfVersion >= 5) {
2394 Asm->OutStreamer->AddComment("DW_RLE_end_of_list");
Wolfgang Piebfcf38102018-07-12 18:18:21 +00002395 Asm->OutStreamer->EmitIntValue(dwarf::DW_RLE_end_of_list, 1);
David Blaikied6614052018-07-18 18:04:42 +00002396 } else {
Wolfgang Piebfcf38102018-07-12 18:18:21 +00002397 // Terminate the list with two 0 values.
2398 Asm->OutStreamer->EmitIntValue(0, Size);
2399 Asm->OutStreamer->EmitIntValue(0, Size);
2400 }
Wolfgang Piebe194f732018-07-10 00:10:11 +00002401}
2402
Benjamin Kramerb17d2132019-01-12 18:36:22 +00002403static void emitDebugRangesImpl(DwarfDebug &DD, AsmPrinter *Asm,
2404 const DwarfFile &Holder, MCSymbol *TableEnd) {
David Blaikiec4af8bf2018-10-20 07:36:39 +00002405 for (const RangeSpanList &List : Holder.getRangeLists())
2406 emitRangeList(DD, Asm, List);
2407
2408 if (TableEnd)
2409 Asm->OutStreamer->EmitLabel(TableEnd);
2410}
2411
Wolfgang Pieb9ea65082018-07-26 22:48:52 +00002412/// Emit address ranges into the .debug_ranges section or into the DWARF v5
2413/// .debug_rnglists section.
Devang Patel930143b2009-11-21 02:48:08 +00002414void DwarfDebug::emitDebugRanges() {
David Blaikie07963bd2017-05-26 18:52:56 +00002415 if (CUMap.empty())
2416 return;
2417
David Blaikiec4af8bf2018-10-20 07:36:39 +00002418 const auto &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Wolfgang Pieb9ea65082018-07-26 22:48:52 +00002419
David Blaikiec4af8bf2018-10-20 07:36:39 +00002420 if (Holder.getRangeLists().empty())
Alexey Bataevd4dd7212018-08-01 19:38:20 +00002421 return;
Alexey Bataevd4dd7212018-08-01 19:38:20 +00002422
David Blaikiec4af8bf2018-10-20 07:36:39 +00002423 assert(useRangesSection());
2424 assert(llvm::none_of(CUMap, [](const decltype(CUMap)::value_type &Pair) {
2425 return Pair.second->getCUNode()->isDebugDirectivesOnly();
2426 }));
Wolfgang Piebfcf38102018-07-12 18:18:21 +00002427
Bill Wendling480ff322009-05-20 23:21:38 +00002428 // Start the dwarf ranges section.
Wolfgang Pieb9ea65082018-07-26 22:48:52 +00002429 MCSymbol *TableEnd = nullptr;
2430 if (getDwarfVersion() >= 5) {
2431 Asm->OutStreamer->SwitchSection(
2432 Asm->getObjFileLowering().getDwarfRnglistsSection());
David Blaikiec4af8bf2018-10-20 07:36:39 +00002433 TableEnd = emitRnglistsTableHeader(Asm, Holder);
Wolfgang Pieb9ea65082018-07-26 22:48:52 +00002434 } else
2435 Asm->OutStreamer->SwitchSection(
2436 Asm->getObjFileLowering().getDwarfRangesSection());
Eric Christopher4751d702013-11-23 00:05:29 +00002437
David Blaikiec4af8bf2018-10-20 07:36:39 +00002438 emitDebugRangesImpl(*this, Asm, Holder, TableEnd);
Bill Wendling480ff322009-05-20 23:21:38 +00002439}
2440
David Blaikie32e09de2018-10-20 08:12:36 +00002441void DwarfDebug::emitDebugRangesDWO() {
2442 assert(useSplitDwarf());
2443
2444 if (CUMap.empty())
2445 return;
2446
2447 const auto &Holder = InfoHolder;
2448
2449 if (Holder.getRangeLists().empty())
2450 return;
2451
2452 assert(getDwarfVersion() >= 5);
2453 assert(useRangesSection());
2454 assert(llvm::none_of(CUMap, [](const decltype(CUMap)::value_type &Pair) {
2455 return Pair.second->getCUNode()->isDebugDirectivesOnly();
2456 }));
2457
2458 // Start the dwarf ranges section.
2459 Asm->OutStreamer->SwitchSection(
2460 Asm->getObjFileLowering().getDwarfRnglistsDWOSection());
2461 MCSymbol *TableEnd = emitRnglistsTableHeader(Asm, Holder);
2462
2463 emitDebugRangesImpl(*this, Asm, Holder, TableEnd);
2464}
2465
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002466void DwarfDebug::handleMacroNodes(DIMacroNodeArray Nodes, DwarfCompileUnit &U) {
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002467 for (auto *MN : Nodes) {
2468 if (auto *M = dyn_cast<DIMacro>(MN))
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002469 emitMacro(*M);
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002470 else if (auto *F = dyn_cast<DIMacroFile>(MN))
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002471 emitMacroFile(*F, U);
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002472 else
2473 llvm_unreachable("Unexpected DI type!");
2474 }
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002475}
2476
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002477void DwarfDebug::emitMacro(DIMacro &M) {
2478 Asm->EmitULEB128(M.getMacinfoType());
2479 Asm->EmitULEB128(M.getLine());
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002480 StringRef Name = M.getName();
2481 StringRef Value = M.getValue();
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002482 Asm->OutStreamer->EmitBytes(Name);
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002483 if (!Value.empty()) {
2484 // There should be one space between macro name and macro value.
Rafael Espindola4b4d85f2018-03-29 23:32:54 +00002485 Asm->emitInt8(' ');
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002486 Asm->OutStreamer->EmitBytes(Value);
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002487 }
Rafael Espindola4b4d85f2018-03-29 23:32:54 +00002488 Asm->emitInt8('\0');
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002489}
2490
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002491void DwarfDebug::emitMacroFile(DIMacroFile &F, DwarfCompileUnit &U) {
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002492 assert(F.getMacinfoType() == dwarf::DW_MACINFO_start_file);
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002493 Asm->EmitULEB128(dwarf::DW_MACINFO_start_file);
2494 Asm->EmitULEB128(F.getLine());
Paul Robinson612e89d2018-01-12 19:17:50 +00002495 Asm->EmitULEB128(U.getOrCreateSourceID(F.getFile()));
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002496 handleMacroNodes(F.getElements(), U);
2497 Asm->EmitULEB128(dwarf::DW_MACINFO_end_file);
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002498}
2499
Amjad Aboudc0778412016-01-24 08:18:55 +00002500/// Emit macros into a debug macinfo section.
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002501void DwarfDebug::emitDebugMacinfo() {
David Blaikie07963bd2017-05-26 18:52:56 +00002502 if (CUMap.empty())
2503 return;
2504
Alexey Bataevd4dd7212018-08-01 19:38:20 +00002505 if (llvm::all_of(CUMap, [](const decltype(CUMap)::value_type &Pair) {
2506 return Pair.second->getCUNode()->isDebugDirectivesOnly();
2507 }))
2508 return;
2509
Amjad Aboud8bbce8a2016-02-01 14:09:41 +00002510 // Start the dwarf macinfo section.
2511 Asm->OutStreamer->SwitchSection(
2512 Asm->getObjFileLowering().getDwarfMacinfoSection());
2513
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002514 for (const auto &P : CUMap) {
2515 auto &TheCU = *P.second;
Alexey Bataevd4dd7212018-08-01 19:38:20 +00002516 if (TheCU.getCUNode()->isDebugDirectivesOnly())
2517 continue;
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002518 auto *SkCU = TheCU.getSkeleton();
2519 DwarfCompileUnit &U = SkCU ? *SkCU : TheCU;
2520 auto *CUNode = cast<DICompileUnit>(P.first);
Alexey Bataevbd7869442018-02-22 16:20:30 +00002521 DIMacroNodeArray Macros = CUNode->getMacros();
2522 if (!Macros.empty()) {
2523 Asm->OutStreamer->EmitLabel(U.getMacroLabelBegin());
2524 handleMacroNodes(Macros, U);
2525 }
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002526 }
2527 Asm->OutStreamer->AddComment("End Of Macro List Mark");
Rafael Espindola4b4d85f2018-03-29 23:32:54 +00002528 Asm->emitInt8(0);
Amjad Aboudd7cfb482016-01-07 14:28:20 +00002529}
2530
Eric Christopherd692c1d2012-12-11 19:42:09 +00002531// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002532
David Blaikie65a74662014-04-25 18:26:14 +00002533void DwarfDebug::initSkeletonUnit(const DwarfUnit &U, DIE &Die,
Peter Collingbourne7c384cc2016-02-11 19:57:46 +00002534 std::unique_ptr<DwarfCompileUnit> NewU) {
David Blaikie38fe6342014-01-09 04:28:46 +00002535
David Blaikie38fe6342014-01-09 04:28:46 +00002536 if (!CompilationDir.empty())
David Blaikiecafd9622014-11-02 08:51:37 +00002537 NewU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
David Blaikie38fe6342014-01-09 04:28:46 +00002538
David Blaikief9b6a552014-04-22 22:39:41 +00002539 addGnuPubAttributes(*NewU, Die);
David Blaikie38fe6342014-01-09 04:28:46 +00002540
David Blaikief9b6a552014-04-22 22:39:41 +00002541 SkeletonHolder.addUnit(std::move(NewU));
David Blaikie38fe6342014-01-09 04:28:46 +00002542}
2543
David Blaikief9b6a552014-04-22 22:39:41 +00002544DwarfCompileUnit &DwarfDebug::constructSkeletonCU(const DwarfCompileUnit &CU) {
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002545
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +00002546 auto OwnedUnit = llvm::make_unique<DwarfCompileUnit>(
David Blaikiebd579052014-04-28 21:14:27 +00002547 CU.getUniqueID(), CU.getCUNode(), Asm, this, &SkeletonHolder);
David Blaikief9b6a552014-04-22 22:39:41 +00002548 DwarfCompileUnit &NewCU = *OwnedUnit;
Greg Clayton35630c32016-12-01 18:56:29 +00002549 NewCU.setSection(Asm->getObjFileLowering().getDwarfInfoSection());
Eric Christopher4c7765f2013-01-17 03:00:04 +00002550
Rafael Espindola063d7252015-03-10 16:58:10 +00002551 NewCU.initStmtList();
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002552
Wolfgang Pieb456b5552018-01-26 18:52:58 +00002553 if (useSegmentedStringOffsetsTable())
2554 NewCU.addStringOffsetsStart();
2555
David Blaikie92a2f8a2014-04-28 21:04:29 +00002556 initSkeletonUnit(CU, NewCU.getUnitDie(), std::move(OwnedUnit));
Eric Christopherc8a310e2012-12-10 23:34:43 +00002557
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002558 return NewCU;
2559}
2560
Eric Christopherd692c1d2012-12-11 19:42:09 +00002561// Emit the .debug_info.dwo section for separated dwarf. This contains the
2562// compile units that would normally be in debug_info.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002563void DwarfDebug::emitDebugInfoDWO() {
Eric Christophercdf218d2012-12-10 19:51:21 +00002564 assert(useSplitDwarf() && "No split dwarf debug info?");
Rafael Espindola063d7252015-03-10 16:58:10 +00002565 // Don't emit relocations into the dwo file.
2566 InfoHolder.emitUnits(/* UseOffsets */ true);
Eric Christopher3c5a1912012-12-19 22:02:53 +00002567}
2568
2569// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2570// abbreviations for the .debug_info.dwo section.
2571void DwarfDebug::emitDebugAbbrevDWO() {
2572 assert(useSplitDwarf() && "No split dwarf?");
David Blaikie0504cda2013-12-05 07:43:55 +00002573 InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection());
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002574}
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002575
David Blaikie4a2f95f2014-03-18 01:17:26 +00002576void DwarfDebug::emitDebugLineDWO() {
2577 assert(useSplitDwarf() && "No split dwarf?");
Paul Robinson7cb26ad2018-03-27 21:28:59 +00002578 SplitTypeUnitFileTable.Emit(
2579 *Asm->OutStreamer, MCDwarfLineTableParams(),
David Blaikie4a2f95f2014-03-18 01:17:26 +00002580 Asm->getObjFileLowering().getDwarfLineDWOSection());
David Blaikie4a2f95f2014-03-18 01:17:26 +00002581}
2582
Wolfgang Pieb456b5552018-01-26 18:52:58 +00002583void DwarfDebug::emitStringOffsetsTableHeaderDWO() {
2584 assert(useSplitDwarf() && "No split dwarf?");
Pavel Labath7bfa5d62018-07-26 14:36:07 +00002585 InfoHolder.getStringPool().emitStringOffsetsTableHeader(
2586 *Asm, Asm->getObjFileLowering().getDwarfStrOffDWOSection(),
2587 InfoHolder.getStringOffsetsStartSym());
Wolfgang Pieb456b5552018-01-26 18:52:58 +00002588}
2589
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002590// Emit the .debug_str.dwo section for separated dwarf. This contains the
2591// string section and is identical in format to traditional .debug_str
2592// sections.
2593void DwarfDebug::emitDebugStrDWO() {
Wolfgang Pieb456b5552018-01-26 18:52:58 +00002594 if (useSegmentedStringOffsetsTable())
2595 emitStringOffsetsTableHeaderDWO();
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002596 assert(useSplitDwarf() && "No split dwarf?");
Rafael Espindola0709a7b2015-05-21 19:20:38 +00002597 MCSection *OffSec = Asm->getObjFileLowering().getDwarfStrOffDWOSection();
Eric Christopher2cbd5762013-01-07 19:32:41 +00002598 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
Wolfgang Pieb456b5552018-01-26 18:52:58 +00002599 OffSec, /* UseRelativeOffsets = */ false);
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002600}
David Blaikie409dd9c2013-11-19 23:08:21 +00002601
David Blaikie161dd3c2018-10-20 06:02:15 +00002602// Emit address pool.
Victor Leschuk64e0c562018-08-01 05:48:06 +00002603void DwarfDebug::emitDebugAddr() {
Victor Leschuk64e0c562018-08-01 05:48:06 +00002604 AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection());
2605}
2606
David Blaikie47f4b822014-03-19 00:11:28 +00002607MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) {
2608 if (!useSplitDwarf())
2609 return nullptr;
Paul Robinsonb271f312018-03-29 17:16:41 +00002610 const DICompileUnit *DIUnit = CU.getCUNode();
2611 SplitTypeUnitFileTable.maybeSetRootFile(
2612 DIUnit->getDirectory(), DIUnit->getFilename(),
2613 CU.getMD5AsBytes(DIUnit->getFile()), DIUnit->getSource());
David Blaikie47f4b822014-03-19 00:11:28 +00002614 return &SplitTypeUnitFileTable;
2615}
2616
Adrian Prantlee5feaf2015-07-15 17:01:41 +00002617uint64_t DwarfDebug::makeTypeSignature(StringRef Identifier) {
David Blaikief3de2ab2014-04-26 16:26:41 +00002618 MD5 Hash;
2619 Hash.update(Identifier);
2620 // ... take the least significant 8 bytes and return those. Our MD5
Zachary Turner82a0c972017-03-20 23:33:18 +00002621 // implementation always returns its results in little endian, so we actually
2622 // need the "high" word.
David Blaikief3de2ab2014-04-26 16:26:41 +00002623 MD5::MD5Result Result;
2624 Hash.final(Result);
Zachary Turner82a0c972017-03-20 23:33:18 +00002625 return Result.high();
David Blaikief3de2ab2014-04-26 16:26:41 +00002626}
2627
David Blaikie15632ae2014-02-12 00:31:30 +00002628void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU,
David Blaikie65a74662014-04-25 18:26:14 +00002629 StringRef Identifier, DIE &RefDie,
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00002630 const DICompositeType *CTy) {
David Blaikiee12b49a2014-04-26 17:27:38 +00002631 // Fast path if we're building some type units and one has already used the
2632 // address pool we know we're going to throw away all this work anyway, so
2633 // don't bother building dependent types.
2634 if (!TypeUnitsUnderConstruction.empty() && AddrPool.hasBeenUsed())
2635 return;
2636
Peter Collingbourne7c384cc2016-02-11 19:57:46 +00002637 auto Ins = TypeSignatures.insert(std::make_pair(CTy, 0));
2638 if (!Ins.second) {
2639 CU.addDIETypeSignature(RefDie, Ins.first->second);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002640 return;
David Blaikie409dd9c2013-11-19 23:08:21 +00002641 }
2642
David Blaikiee12b49a2014-04-26 17:27:38 +00002643 bool TopLevelType = TypeUnitsUnderConstruction.empty();
2644 AddrPool.resetUsedFlag();
2645
Eugene Zelenko6e07bfd2017-08-17 21:26:39 +00002646 auto OwnedUnit = llvm::make_unique<DwarfTypeUnit>(CU, Asm, this, &InfoHolder,
2647 getDwoLineTable(CU));
David Blaikief9b6a552014-04-22 22:39:41 +00002648 DwarfTypeUnit &NewTU = *OwnedUnit;
David Blaikie92a2f8a2014-04-28 21:04:29 +00002649 DIE &UnitDie = NewTU.getUnitDie();
David Majnemer0a16c222016-08-11 21:15:00 +00002650 TypeUnitsUnderConstruction.emplace_back(std::move(OwnedUnit), CTy);
Chandler Carruthb587ab62014-01-20 08:07:07 +00002651
David Blaikie92a2f8a2014-04-28 21:04:29 +00002652 NewTU.addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
David Blaikie637cac42014-04-22 23:09:36 +00002653 CU.getLanguage());
Chandler Carruthb587ab62014-01-20 08:07:07 +00002654
David Blaikief3de2ab2014-04-26 16:26:41 +00002655 uint64_t Signature = makeTypeSignature(Identifier);
David Blaikief9b6a552014-04-22 22:39:41 +00002656 NewTU.setTypeSignature(Signature);
Peter Collingbourne7c384cc2016-02-11 19:57:46 +00002657 Ins.first->second = Signature;
David Blaikief3de2ab2014-04-26 16:26:41 +00002658
Paul Robinson5b302bf2018-11-12 16:55:11 +00002659 if (useSplitDwarf()) {
2660 MCSection *Section =
2661 getDwarfVersion() <= 4
2662 ? Asm->getObjFileLowering().getDwarfTypesDWOSection()
2663 : Asm->getObjFileLowering().getDwarfInfoDWOSection();
2664 NewTU.setSection(Section);
2665 } else {
Paul Robinsonddbde9a2018-11-09 19:06:09 +00002666 MCSection *Section =
2667 getDwarfVersion() <= 4
2668 ? Asm->getObjFileLowering().getDwarfTypesSection(Signature)
2669 : Asm->getObjFileLowering().getDwarfInfoSection(Signature);
2670 NewTU.setSection(Section);
Paul Robinson7cb26ad2018-03-27 21:28:59 +00002671 // Non-split type units reuse the compile unit's line table.
2672 CU.applyStmtList(UnitDie);
David Blaikie29459ae2014-07-25 17:11:58 +00002673 }
Chandler Carruthb587ab62014-01-20 08:07:07 +00002674
Wolfgang Pieb456b5552018-01-26 18:52:58 +00002675 // Add DW_AT_str_offsets_base to the type unit DIE, but not for split type
2676 // units.
2677 if (useSegmentedStringOffsetsTable() && !useSplitDwarf())
2678 NewTU.addStringOffsetsStart();
2679
David Blaikief3de2ab2014-04-26 16:26:41 +00002680 NewTU.setType(NewTU.createTypeDIE(CTy));
2681
David Blaikiee12b49a2014-04-26 17:27:38 +00002682 if (TopLevelType) {
2683 auto TypeUnitsToAdd = std::move(TypeUnitsUnderConstruction);
2684 TypeUnitsUnderConstruction.clear();
2685
2686 // Types referencing entries in the address table cannot be placed in type
2687 // units.
2688 if (AddrPool.hasBeenUsed()) {
2689
2690 // Remove all the types built while building this type.
2691 // This is pessimistic as some of these types might not be dependent on
2692 // the type that used an address.
2693 for (const auto &TU : TypeUnitsToAdd)
Peter Collingbourne7c384cc2016-02-11 19:57:46 +00002694 TypeSignatures.erase(TU.second);
David Blaikiee12b49a2014-04-26 17:27:38 +00002695
2696 // Construct this type in the CU directly.
2697 // This is inefficient because all the dependent types will be rebuilt
2698 // from scratch, including building them in type units, discovering that
2699 // they depend on addresses, throwing them out and rebuilding them.
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +00002700 CU.constructTypeDIE(RefDie, cast<DICompositeType>(CTy));
David Blaikiee12b49a2014-04-26 17:27:38 +00002701 return;
2702 }
2703
2704 // If the type wasn't dependent on fission addresses, finish adding the type
2705 // and all its dependent types.
Peter Collingbourne7c384cc2016-02-11 19:57:46 +00002706 for (auto &TU : TypeUnitsToAdd) {
2707 InfoHolder.computeSizeAndOffsetsForUnit(TU.first.get());
2708 InfoHolder.emitUnit(TU.first.get(), useSplitDwarf());
2709 }
David Blaikiee12b49a2014-04-26 17:27:38 +00002710 }
Peter Collingbourne7c384cc2016-02-11 19:57:46 +00002711 CU.addDIETypeSignature(RefDie, Signature);
David Blaikie409dd9c2013-11-19 23:08:21 +00002712}
David Blaikie4bd13b72014-03-07 18:49:45 +00002713
Pavel Labath7f7e6062018-07-20 15:24:13 +00002714// Add the Name along with its companion DIE to the appropriate accelerator
2715// table (for AccelTableKind::Dwarf it's always AccelDebugNames, for
2716// AccelTableKind::Apple, we use the table we got as an argument). If
2717// accelerator tables are disabled, this function does nothing.
2718template <typename DataT>
David Blaikie66cf14d2018-08-16 21:29:55 +00002719void DwarfDebug::addAccelNameImpl(const DICompileUnit &CU,
2720 AccelTable<DataT> &AppleAccel, StringRef Name,
Pavel Labath7f7e6062018-07-20 15:24:13 +00002721 const DIE &Die) {
2722 if (getAccelTableKind() == AccelTableKind::None)
2723 return;
Pavel Labath3fb39c72018-04-18 12:11:59 +00002724
David Blaikie66cf14d2018-08-16 21:29:55 +00002725 if (getAccelTableKind() != AccelTableKind::Apple &&
2726 CU.getNameTableKind() == DICompileUnit::DebugNameTableKind::None)
2727 return;
2728
Pavel Labath3fb39c72018-04-18 12:11:59 +00002729 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Pavel Labath2f088112018-08-07 09:54:52 +00002730 DwarfStringPoolEntryRef Ref = Holder.getStringPool().getEntry(*Asm, Name);
Pavel Labath3fb39c72018-04-18 12:11:59 +00002731
Pavel Labath6088c232018-04-04 14:42:14 +00002732 switch (getAccelTableKind()) {
2733 case AccelTableKind::Apple:
Pavel Labath7f7e6062018-07-20 15:24:13 +00002734 AppleAccel.addName(Ref, Die);
Pavel Labath6088c232018-04-04 14:42:14 +00002735 break;
2736 case AccelTableKind::Dwarf:
Pavel Labath7f7e6062018-07-20 15:24:13 +00002737 AccelDebugNames.addName(Ref, Die);
Pavel Labath6088c232018-04-04 14:42:14 +00002738 break;
Pavel Labath6088c232018-04-04 14:42:14 +00002739 case AccelTableKind::Default:
2740 llvm_unreachable("Default should have already been resolved.");
Pavel Labath7f7e6062018-07-20 15:24:13 +00002741 case AccelTableKind::None:
2742 llvm_unreachable("None handled above");
Pavel Labath6088c232018-04-04 14:42:14 +00002743 }
David Blaikie2406a0622014-04-23 23:37:35 +00002744}
David Blaikie0ee82b92014-04-24 00:53:32 +00002745
David Blaikie66cf14d2018-08-16 21:29:55 +00002746void DwarfDebug::addAccelName(const DICompileUnit &CU, StringRef Name,
2747 const DIE &Die) {
2748 addAccelNameImpl(CU, AccelNames, Name, Die);
Pavel Labath7f7e6062018-07-20 15:24:13 +00002749}
2750
David Blaikie66cf14d2018-08-16 21:29:55 +00002751void DwarfDebug::addAccelObjC(const DICompileUnit &CU, StringRef Name,
2752 const DIE &Die) {
Pavel Labath7f7e6062018-07-20 15:24:13 +00002753 // ObjC names go only into the Apple accelerator tables.
2754 if (getAccelTableKind() == AccelTableKind::Apple)
David Blaikie66cf14d2018-08-16 21:29:55 +00002755 addAccelNameImpl(CU, AccelObjC, Name, Die);
David Blaikie0ee82b92014-04-24 00:53:32 +00002756}
David Blaikieecf04152014-04-24 01:02:42 +00002757
David Blaikie66cf14d2018-08-16 21:29:55 +00002758void DwarfDebug::addAccelNamespace(const DICompileUnit &CU, StringRef Name,
2759 const DIE &Die) {
2760 addAccelNameImpl(CU, AccelNamespace, Name, Die);
David Blaikieecf04152014-04-24 01:02:42 +00002761}
David Blaikie18d33752014-04-24 01:23:49 +00002762
David Blaikie66cf14d2018-08-16 21:29:55 +00002763void DwarfDebug::addAccelType(const DICompileUnit &CU, StringRef Name,
2764 const DIE &Die, char Flags) {
2765 addAccelNameImpl(CU, AccelTypes, Name, Die);
David Blaikie18d33752014-04-24 01:23:49 +00002766}
Greg Claytone6543972016-11-23 23:30:37 +00002767
2768uint16_t DwarfDebug::getDwarfVersion() const {
2769 return Asm->OutStreamer->getContext().getDwarfVersion();
2770}
David Blaikie60fddac2018-10-24 23:36:29 +00002771
2772void DwarfDebug::addSectionLabel(const MCSymbol *Sym) {
2773 SectionLabels.insert(std::make_pair(&Sym->getSection(), Sym));
2774}
2775
2776const MCSymbol *DwarfDebug::getSectionLabel(const MCSection *S) {
2777 return SectionLabels.find(S)->second;
2778}