1 //===- lib/MC/MCDwarf.cpp - MCDwarf implementation ------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/MC/MCDwarf.h"
11 #include "llvm/ADT/ArrayRef.h"
12 #include "llvm/ADT/DenseMap.h"
13 #include "llvm/ADT/Hashing.h"
14 #include "llvm/ADT/Optional.h"
15 #include "llvm/ADT/STLExtras.h"
16 #include "llvm/ADT/SmallString.h"
17 #include "llvm/ADT/SmallVector.h"
18 #include "llvm/ADT/StringRef.h"
19 #include "llvm/ADT/Twine.h"
20 #include "llvm/BinaryFormat/Dwarf.h"
21 #include "llvm/Config/config.h"
22 #include "llvm/MC/MCAsmInfo.h"
23 #include "llvm/MC/MCContext.h"
24 #include "llvm/MC/MCExpr.h"
25 #include "llvm/MC/MCObjectFileInfo.h"
26 #include "llvm/MC/MCObjectStreamer.h"
27 #include "llvm/MC/MCRegisterInfo.h"
28 #include "llvm/MC/MCSection.h"
29 #include "llvm/MC/MCStreamer.h"
30 #include "llvm/MC/MCSymbol.h"
31 #include "llvm/MC/StringTableBuilder.h"
32 #include "llvm/Support/Casting.h"
33 #include "llvm/Support/Endian.h"
34 #include "llvm/Support/EndianStream.h"
35 #include "llvm/Support/ErrorHandling.h"
36 #include "llvm/Support/LEB128.h"
37 #include "llvm/Support/MathExtras.h"
38 #include "llvm/Support/Path.h"
39 #include "llvm/Support/SourceMgr.h"
40 #include "llvm/Support/raw_ostream.h"
49 /// Manage the .debug_line_str section contents, if we use it.
50 class llvm::MCDwarfLineStr
{
51 MCSymbol
*LineStrLabel
= nullptr;
52 StringTableBuilder LineStrings
{StringTableBuilder::DWARF
};
53 bool UseRelocs
= false;
56 /// Construct an instance that can emit .debug_line_str (for use in a normal
58 explicit MCDwarfLineStr(MCContext
&Ctx
) {
59 UseRelocs
= Ctx
.getAsmInfo()->doesDwarfUseRelocationsAcrossSections();
62 Ctx
.getObjectFileInfo()->getDwarfLineStrSection()->getBeginSymbol();
65 /// Emit a reference to the string.
66 void emitRef(MCStreamer
*MCOS
, StringRef Path
);
68 /// Emit the .debug_line_str section if appropriate.
69 void emitSection(MCStreamer
*MCOS
);
72 static inline uint64_t ScaleAddrDelta(MCContext
&Context
, uint64_t AddrDelta
) {
73 unsigned MinInsnLength
= Context
.getAsmInfo()->getMinInstAlignment();
74 if (MinInsnLength
== 1)
76 if (AddrDelta
% MinInsnLength
!= 0) {
77 // TODO: report this error, but really only once.
80 return AddrDelta
/ MinInsnLength
;
84 // This is called when an instruction is assembled into the specified section
85 // and if there is information from the last .loc directive that has yet to have
86 // a line entry made for it is made.
88 void MCDwarfLineEntry::Make(MCObjectStreamer
*MCOS
, MCSection
*Section
) {
89 if (!MCOS
->getContext().getDwarfLocSeen())
92 // Create a symbol at in the current section for use in the line entry.
93 MCSymbol
*LineSym
= MCOS
->getContext().createTempSymbol();
94 // Set the value of the symbol to use for the MCDwarfLineEntry.
95 MCOS
->EmitLabel(LineSym
);
97 // Get the current .loc info saved in the context.
98 const MCDwarfLoc
&DwarfLoc
= MCOS
->getContext().getCurrentDwarfLoc();
100 // Create a (local) line entry with the symbol and the current .loc info.
101 MCDwarfLineEntry
LineEntry(LineSym
, DwarfLoc
);
103 // clear DwarfLocSeen saying the current .loc info is now used.
104 MCOS
->getContext().clearDwarfLocSeen();
106 // Add the line entry to this section's entries.
108 .getMCDwarfLineTable(MCOS
->getContext().getDwarfCompileUnitID())
110 .addLineEntry(LineEntry
, Section
);
114 // This helper routine returns an expression of End - Start + IntVal .
116 static inline const MCExpr
*MakeStartMinusEndExpr(const MCStreamer
&MCOS
,
117 const MCSymbol
&Start
,
120 MCSymbolRefExpr::VariantKind Variant
= MCSymbolRefExpr::VK_None
;
122 MCSymbolRefExpr::create(&End
, Variant
, MCOS
.getContext());
124 MCSymbolRefExpr::create(&Start
, Variant
, MCOS
.getContext());
126 MCBinaryExpr::create(MCBinaryExpr::Sub
, Res
, RHS
, MCOS
.getContext());
128 MCConstantExpr::create(IntVal
, MCOS
.getContext());
130 MCBinaryExpr::create(MCBinaryExpr::Sub
, Res1
, Res2
, MCOS
.getContext());
135 // This helper routine returns an expression of Start + IntVal .
137 static inline const MCExpr
*
138 makeStartPlusIntExpr(MCContext
&Ctx
, const MCSymbol
&Start
, int IntVal
) {
139 MCSymbolRefExpr::VariantKind Variant
= MCSymbolRefExpr::VK_None
;
140 const MCExpr
*LHS
= MCSymbolRefExpr::create(&Start
, Variant
, Ctx
);
141 const MCExpr
*RHS
= MCConstantExpr::create(IntVal
, Ctx
);
142 const MCExpr
*Res
= MCBinaryExpr::create(MCBinaryExpr::Add
, LHS
, RHS
, Ctx
);
147 // This emits the Dwarf line table for the specified section from the entries
148 // in the LineSection.
151 EmitDwarfLineTable(MCObjectStreamer
*MCOS
, MCSection
*Section
,
152 const MCLineSection::MCDwarfLineEntryCollection
&LineEntries
) {
153 unsigned FileNum
= 1;
154 unsigned LastLine
= 1;
156 unsigned Flags
= DWARF2_LINE_DEFAULT_IS_STMT
? DWARF2_FLAG_IS_STMT
: 0;
158 unsigned Discriminator
= 0;
159 MCSymbol
*LastLabel
= nullptr;
161 // Loop through each MCDwarfLineEntry and encode the dwarf line number table.
162 for (const MCDwarfLineEntry
&LineEntry
: LineEntries
) {
163 int64_t LineDelta
= static_cast<int64_t>(LineEntry
.getLine()) - LastLine
;
165 if (FileNum
!= LineEntry
.getFileNum()) {
166 FileNum
= LineEntry
.getFileNum();
167 MCOS
->EmitIntValue(dwarf::DW_LNS_set_file
, 1);
168 MCOS
->EmitULEB128IntValue(FileNum
);
170 if (Column
!= LineEntry
.getColumn()) {
171 Column
= LineEntry
.getColumn();
172 MCOS
->EmitIntValue(dwarf::DW_LNS_set_column
, 1);
173 MCOS
->EmitULEB128IntValue(Column
);
175 if (Discriminator
!= LineEntry
.getDiscriminator() &&
176 MCOS
->getContext().getDwarfVersion() >= 4) {
177 Discriminator
= LineEntry
.getDiscriminator();
178 unsigned Size
= getULEB128Size(Discriminator
);
179 MCOS
->EmitIntValue(dwarf::DW_LNS_extended_op
, 1);
180 MCOS
->EmitULEB128IntValue(Size
+ 1);
181 MCOS
->EmitIntValue(dwarf::DW_LNE_set_discriminator
, 1);
182 MCOS
->EmitULEB128IntValue(Discriminator
);
184 if (Isa
!= LineEntry
.getIsa()) {
185 Isa
= LineEntry
.getIsa();
186 MCOS
->EmitIntValue(dwarf::DW_LNS_set_isa
, 1);
187 MCOS
->EmitULEB128IntValue(Isa
);
189 if ((LineEntry
.getFlags() ^ Flags
) & DWARF2_FLAG_IS_STMT
) {
190 Flags
= LineEntry
.getFlags();
191 MCOS
->EmitIntValue(dwarf::DW_LNS_negate_stmt
, 1);
193 if (LineEntry
.getFlags() & DWARF2_FLAG_BASIC_BLOCK
)
194 MCOS
->EmitIntValue(dwarf::DW_LNS_set_basic_block
, 1);
195 if (LineEntry
.getFlags() & DWARF2_FLAG_PROLOGUE_END
)
196 MCOS
->EmitIntValue(dwarf::DW_LNS_set_prologue_end
, 1);
197 if (LineEntry
.getFlags() & DWARF2_FLAG_EPILOGUE_BEGIN
)
198 MCOS
->EmitIntValue(dwarf::DW_LNS_set_epilogue_begin
, 1);
200 MCSymbol
*Label
= LineEntry
.getLabel();
202 // At this point we want to emit/create the sequence to encode the delta in
203 // line numbers and the increment of the address from the previous Label
204 // and the current Label.
205 const MCAsmInfo
*asmInfo
= MCOS
->getContext().getAsmInfo();
206 MCOS
->EmitDwarfAdvanceLineAddr(LineDelta
, LastLabel
, Label
,
207 asmInfo
->getCodePointerSize());
210 LastLine
= LineEntry
.getLine();
214 // Emit a DW_LNE_end_sequence for the end of the section.
215 // Use the section end label to compute the address delta and use INT64_MAX
216 // as the line delta which is the signal that this is actually a
217 // DW_LNE_end_sequence.
218 MCSymbol
*SectionEnd
= MCOS
->endSection(Section
);
220 // Switch back the dwarf line section, in case endSection had to switch the
222 MCContext
&Ctx
= MCOS
->getContext();
223 MCOS
->SwitchSection(Ctx
.getObjectFileInfo()->getDwarfLineSection());
225 const MCAsmInfo
*AsmInfo
= Ctx
.getAsmInfo();
226 MCOS
->EmitDwarfAdvanceLineAddr(INT64_MAX
, LastLabel
, SectionEnd
,
227 AsmInfo
->getCodePointerSize());
231 // This emits the Dwarf file and the line tables.
233 void MCDwarfLineTable::Emit(MCObjectStreamer
*MCOS
,
234 MCDwarfLineTableParams Params
) {
235 MCContext
&context
= MCOS
->getContext();
237 auto &LineTables
= context
.getMCDwarfLineTables();
239 // Bail out early so we don't switch to the debug_line section needlessly and
240 // in doing so create an unnecessary (if empty) section.
241 if (LineTables
.empty())
244 // In a v5 non-split line table, put the strings in a separate section.
245 Optional
<MCDwarfLineStr
> LineStr
;
246 if (context
.getDwarfVersion() >= 5)
247 LineStr
= MCDwarfLineStr(context
);
249 // Switch to the section where the table will be emitted into.
250 MCOS
->SwitchSection(context
.getObjectFileInfo()->getDwarfLineSection());
252 // Handle the rest of the Compile Units.
253 for (const auto &CUIDTablePair
: LineTables
) {
254 CUIDTablePair
.second
.EmitCU(MCOS
, Params
, LineStr
);
258 LineStr
->emitSection(MCOS
);
261 void MCDwarfDwoLineTable::Emit(MCStreamer
&MCOS
, MCDwarfLineTableParams Params
,
262 MCSection
*Section
) const {
263 if (Header
.MCDwarfFiles
.empty())
265 Optional
<MCDwarfLineStr
> NoLineStr(None
);
266 MCOS
.SwitchSection(Section
);
267 MCOS
.EmitLabel(Header
.Emit(&MCOS
, Params
, None
, NoLineStr
).second
);
270 std::pair
<MCSymbol
*, MCSymbol
*>
271 MCDwarfLineTableHeader::Emit(MCStreamer
*MCOS
, MCDwarfLineTableParams Params
,
272 Optional
<MCDwarfLineStr
> &LineStr
) const {
273 static const char StandardOpcodeLengths
[] = {
274 0, // length of DW_LNS_copy
275 1, // length of DW_LNS_advance_pc
276 1, // length of DW_LNS_advance_line
277 1, // length of DW_LNS_set_file
278 1, // length of DW_LNS_set_column
279 0, // length of DW_LNS_negate_stmt
280 0, // length of DW_LNS_set_basic_block
281 0, // length of DW_LNS_const_add_pc
282 1, // length of DW_LNS_fixed_advance_pc
283 0, // length of DW_LNS_set_prologue_end
284 0, // length of DW_LNS_set_epilogue_begin
287 assert(array_lengthof(StandardOpcodeLengths
) >=
288 (Params
.DWARF2LineOpcodeBase
- 1U));
291 makeArrayRef(StandardOpcodeLengths
, Params
.DWARF2LineOpcodeBase
- 1),
295 static const MCExpr
*forceExpAbs(MCStreamer
&OS
, const MCExpr
* Expr
) {
296 MCContext
&Context
= OS
.getContext();
297 assert(!isa
<MCSymbolRefExpr
>(Expr
));
298 if (Context
.getAsmInfo()->hasAggressiveSymbolFolding())
301 MCSymbol
*ABS
= Context
.createTempSymbol();
302 OS
.EmitAssignment(ABS
, Expr
);
303 return MCSymbolRefExpr::create(ABS
, Context
);
306 static void emitAbsValue(MCStreamer
&OS
, const MCExpr
*Value
, unsigned Size
) {
307 const MCExpr
*ABS
= forceExpAbs(OS
, Value
);
308 OS
.EmitValue(ABS
, Size
);
311 void MCDwarfLineStr::emitSection(MCStreamer
*MCOS
) {
312 // Switch to the .debug_line_str section.
314 MCOS
->getContext().getObjectFileInfo()->getDwarfLineStrSection());
315 // Emit the strings without perturbing the offsets we used.
316 LineStrings
.finalizeInOrder();
318 Data
.resize(LineStrings
.getSize());
319 LineStrings
.write((uint8_t *)Data
.data());
320 MCOS
->EmitBinaryData(Data
.str());
323 void MCDwarfLineStr::emitRef(MCStreamer
*MCOS
, StringRef Path
) {
324 int RefSize
= 4; // FIXME: Support DWARF-64
325 size_t Offset
= LineStrings
.add(Path
);
327 MCContext
&Ctx
= MCOS
->getContext();
328 MCOS
->EmitValue(makeStartPlusIntExpr(Ctx
, *LineStrLabel
, Offset
), RefSize
);
330 MCOS
->EmitIntValue(Offset
, RefSize
);
333 void MCDwarfLineTableHeader::emitV2FileDirTables(MCStreamer
*MCOS
) const {
334 // First the directory table.
335 for (auto &Dir
: MCDwarfDirs
) {
336 MCOS
->EmitBytes(Dir
); // The DirectoryName, and...
337 MCOS
->EmitBytes(StringRef("\0", 1)); // its null terminator.
339 MCOS
->EmitIntValue(0, 1); // Terminate the directory list.
341 // Second the file table.
342 for (unsigned i
= 1; i
< MCDwarfFiles
.size(); i
++) {
343 assert(!MCDwarfFiles
[i
].Name
.empty());
344 MCOS
->EmitBytes(MCDwarfFiles
[i
].Name
); // FileName and...
345 MCOS
->EmitBytes(StringRef("\0", 1)); // its null terminator.
346 MCOS
->EmitULEB128IntValue(MCDwarfFiles
[i
].DirIndex
); // Directory number.
347 MCOS
->EmitIntValue(0, 1); // Last modification timestamp (always 0).
348 MCOS
->EmitIntValue(0, 1); // File size (always 0).
350 MCOS
->EmitIntValue(0, 1); // Terminate the file list.
353 static void emitOneV5FileEntry(MCStreamer
*MCOS
, const MCDwarfFile
&DwarfFile
,
354 bool EmitMD5
, bool HasSource
,
355 Optional
<MCDwarfLineStr
> &LineStr
) {
356 assert(!DwarfFile
.Name
.empty());
358 LineStr
->emitRef(MCOS
, DwarfFile
.Name
);
360 MCOS
->EmitBytes(DwarfFile
.Name
); // FileName and...
361 MCOS
->EmitBytes(StringRef("\0", 1)); // its null terminator.
363 MCOS
->EmitULEB128IntValue(DwarfFile
.DirIndex
); // Directory number.
365 MD5::MD5Result
*Cksum
= DwarfFile
.Checksum
;
366 MCOS
->EmitBinaryData(
367 StringRef(reinterpret_cast<const char *>(Cksum
->Bytes
.data()),
368 Cksum
->Bytes
.size()));
372 LineStr
->emitRef(MCOS
, DwarfFile
.Source
.getValueOr(StringRef()));
375 DwarfFile
.Source
.getValueOr(StringRef())); // Source and...
376 MCOS
->EmitBytes(StringRef("\0", 1)); // its null terminator.
381 void MCDwarfLineTableHeader::emitV5FileDirTables(
382 MCStreamer
*MCOS
, Optional
<MCDwarfLineStr
> &LineStr
,
383 StringRef CtxCompilationDir
) const {
384 // The directory format, which is just a list of the directory paths. In a
385 // non-split object, these are references to .debug_line_str; in a split
386 // object, they are inline strings.
387 MCOS
->EmitIntValue(1, 1);
388 MCOS
->EmitULEB128IntValue(dwarf::DW_LNCT_path
);
389 MCOS
->EmitULEB128IntValue(LineStr
? dwarf::DW_FORM_line_strp
390 : dwarf::DW_FORM_string
);
391 MCOS
->EmitULEB128IntValue(MCDwarfDirs
.size() + 1);
392 // Try not to emit an empty compilation directory.
393 const StringRef CompDir
=
394 CompilationDir
.empty() ? CtxCompilationDir
: StringRef(CompilationDir
);
396 // Record path strings, emit references here.
397 LineStr
->emitRef(MCOS
, CompDir
);
398 for (const auto &Dir
: MCDwarfDirs
)
399 LineStr
->emitRef(MCOS
, Dir
);
401 // The list of directory paths. Compilation directory comes first.
402 MCOS
->EmitBytes(CompDir
);
403 MCOS
->EmitBytes(StringRef("\0", 1));
404 for (const auto &Dir
: MCDwarfDirs
) {
405 MCOS
->EmitBytes(Dir
); // The DirectoryName, and...
406 MCOS
->EmitBytes(StringRef("\0", 1)); // its null terminator.
410 // The file format, which is the inline null-terminated filename and a
411 // directory index. We don't track file size/timestamp so don't emit them
412 // in the v5 table. Emit MD5 checksums and source if we have them.
413 uint64_t Entries
= 2;
418 MCOS
->EmitIntValue(Entries
, 1);
419 MCOS
->EmitULEB128IntValue(dwarf::DW_LNCT_path
);
420 MCOS
->EmitULEB128IntValue(LineStr
? dwarf::DW_FORM_line_strp
421 : dwarf::DW_FORM_string
);
422 MCOS
->EmitULEB128IntValue(dwarf::DW_LNCT_directory_index
);
423 MCOS
->EmitULEB128IntValue(dwarf::DW_FORM_udata
);
425 MCOS
->EmitULEB128IntValue(dwarf::DW_LNCT_MD5
);
426 MCOS
->EmitULEB128IntValue(dwarf::DW_FORM_data16
);
429 MCOS
->EmitULEB128IntValue(dwarf::DW_LNCT_LLVM_source
);
430 MCOS
->EmitULEB128IntValue(LineStr
? dwarf::DW_FORM_line_strp
431 : dwarf::DW_FORM_string
);
433 // Then the counted list of files. The root file is file #0, then emit the
434 // files as provide by .file directives. To accommodate assembler source
435 // written for DWARF v4 but trying to emit v5, if we didn't see a root file
436 // explicitly, replicate file #1.
437 MCOS
->EmitULEB128IntValue(MCDwarfFiles
.size());
438 emitOneV5FileEntry(MCOS
, RootFile
.Name
.empty() ? MCDwarfFiles
[1] : RootFile
,
439 HasAllMD5
, HasSource
, LineStr
);
440 for (unsigned i
= 1; i
< MCDwarfFiles
.size(); ++i
)
441 emitOneV5FileEntry(MCOS
, MCDwarfFiles
[i
], HasAllMD5
, HasSource
, LineStr
);
444 std::pair
<MCSymbol
*, MCSymbol
*>
445 MCDwarfLineTableHeader::Emit(MCStreamer
*MCOS
, MCDwarfLineTableParams Params
,
446 ArrayRef
<char> StandardOpcodeLengths
,
447 Optional
<MCDwarfLineStr
> &LineStr
) const {
448 MCContext
&context
= MCOS
->getContext();
450 // Create a symbol at the beginning of the line table.
451 MCSymbol
*LineStartSym
= Label
;
453 LineStartSym
= context
.createTempSymbol();
454 // Set the value of the symbol, as we are at the start of the line table.
455 MCOS
->EmitLabel(LineStartSym
);
457 // Create a symbol for the end of the section (to be set when we get there).
458 MCSymbol
*LineEndSym
= context
.createTempSymbol();
460 // The first 4 bytes is the total length of the information for this
461 // compilation unit (not including these 4 bytes for the length).
463 MakeStartMinusEndExpr(*MCOS
, *LineStartSym
, *LineEndSym
, 4), 4);
465 // Next 2 bytes is the Version.
466 unsigned LineTableVersion
= context
.getDwarfVersion();
467 MCOS
->EmitIntValue(LineTableVersion
, 2);
469 // Keep track of the bytes between the very start and where the header length
471 unsigned PreHeaderLengthBytes
= 4 + 2;
473 // In v5, we get address info next.
474 if (LineTableVersion
>= 5) {
475 MCOS
->EmitIntValue(context
.getAsmInfo()->getCodePointerSize(), 1);
476 MCOS
->EmitIntValue(0, 1); // Segment selector; same as EmitGenDwarfAranges.
477 PreHeaderLengthBytes
+= 2;
480 // Create a symbol for the end of the prologue (to be set when we get there).
481 MCSymbol
*ProEndSym
= context
.createTempSymbol(); // Lprologue_end
483 // Length of the prologue, is the next 4 bytes. This is actually the length
484 // from after the length word, to the end of the prologue.
486 MakeStartMinusEndExpr(*MCOS
, *LineStartSym
, *ProEndSym
,
487 (PreHeaderLengthBytes
+ 4)),
490 // Parameters of the state machine, are next.
491 MCOS
->EmitIntValue(context
.getAsmInfo()->getMinInstAlignment(), 1);
492 // maximum_operations_per_instruction
493 // For non-VLIW architectures this field is always 1.
494 // FIXME: VLIW architectures need to update this field accordingly.
495 if (LineTableVersion
>= 4)
496 MCOS
->EmitIntValue(1, 1);
497 MCOS
->EmitIntValue(DWARF2_LINE_DEFAULT_IS_STMT
, 1);
498 MCOS
->EmitIntValue(Params
.DWARF2LineBase
, 1);
499 MCOS
->EmitIntValue(Params
.DWARF2LineRange
, 1);
500 MCOS
->EmitIntValue(StandardOpcodeLengths
.size() + 1, 1);
502 // Standard opcode lengths
503 for (char Length
: StandardOpcodeLengths
)
504 MCOS
->EmitIntValue(Length
, 1);
506 // Put out the directory and file tables. The formats vary depending on
508 if (LineTableVersion
>= 5)
509 emitV5FileDirTables(MCOS
, LineStr
, context
.getCompilationDir());
511 emitV2FileDirTables(MCOS
);
513 // This is the end of the prologue, so set the value of the symbol at the
514 // end of the prologue (that was used in a previous expression).
515 MCOS
->EmitLabel(ProEndSym
);
517 return std::make_pair(LineStartSym
, LineEndSym
);
520 void MCDwarfLineTable::EmitCU(MCObjectStreamer
*MCOS
,
521 MCDwarfLineTableParams Params
,
522 Optional
<MCDwarfLineStr
> &LineStr
) const {
523 MCSymbol
*LineEndSym
= Header
.Emit(MCOS
, Params
, LineStr
).second
;
525 // Put out the line tables.
526 for (const auto &LineSec
: MCLineSections
.getMCLineEntries())
527 EmitDwarfLineTable(MCOS
, LineSec
.first
, LineSec
.second
);
529 // This is the end of the section, so set the value of the symbol at the end
530 // of this section (that was used in a previous expression).
531 MCOS
->EmitLabel(LineEndSym
);
534 Expected
<unsigned> MCDwarfLineTable::tryGetFile(StringRef
&Directory
,
536 MD5::MD5Result
*Checksum
,
537 Optional
<StringRef
> Source
,
538 unsigned FileNumber
) {
539 return Header
.tryGetFile(Directory
, FileName
, Checksum
, Source
, FileNumber
);
543 MCDwarfLineTableHeader::tryGetFile(StringRef
&Directory
,
545 MD5::MD5Result
*Checksum
,
546 Optional
<StringRef
> &Source
,
547 unsigned FileNumber
) {
548 if (Directory
== CompilationDir
)
550 if (FileName
.empty()) {
551 FileName
= "<stdin>";
554 assert(!FileName
.empty());
555 // Keep track of whether any or all files have an MD5 checksum.
556 // If any files have embedded source, they all must.
557 if (MCDwarfFiles
.empty()) {
558 trackMD5Usage(Checksum
);
559 HasSource
= (Source
!= None
);
561 if (FileNumber
== 0) {
562 // File numbers start with 1 and/or after any file numbers
563 // allocated by inline-assembler .file directives.
564 FileNumber
= MCDwarfFiles
.empty() ? 1 : MCDwarfFiles
.size();
565 SmallString
<256> Buffer
;
566 auto IterBool
= SourceIdMap
.insert(
567 std::make_pair((Directory
+ Twine('\0') + FileName
).toStringRef(Buffer
),
569 if (!IterBool
.second
)
570 return IterBool
.first
->second
;
572 // Make space for this FileNumber in the MCDwarfFiles vector if needed.
573 if (FileNumber
>= MCDwarfFiles
.size())
574 MCDwarfFiles
.resize(FileNumber
+ 1);
576 // Get the new MCDwarfFile slot for this FileNumber.
577 MCDwarfFile
&File
= MCDwarfFiles
[FileNumber
];
579 // It is an error to see the same number more than once.
580 if (!File
.Name
.empty())
581 return make_error
<StringError
>("file number already allocated",
582 inconvertibleErrorCode());
584 // If any files have embedded source, they all must.
585 if (HasSource
!= (Source
!= None
))
586 return make_error
<StringError
>("inconsistent use of embedded source",
587 inconvertibleErrorCode());
589 if (Directory
.empty()) {
590 // Separate the directory part from the basename of the FileName.
591 StringRef tFileName
= sys::path::filename(FileName
);
592 if (!tFileName
.empty()) {
593 Directory
= sys::path::parent_path(FileName
);
594 if (!Directory
.empty())
595 FileName
= tFileName
;
599 // Find or make an entry in the MCDwarfDirs vector for this Directory.
600 // Capture directory name.
602 if (Directory
.empty()) {
603 // For FileNames with no directories a DirIndex of 0 is used.
607 for (unsigned End
= MCDwarfDirs
.size(); DirIndex
< End
; DirIndex
++) {
608 if (Directory
== MCDwarfDirs
[DirIndex
])
611 if (DirIndex
>= MCDwarfDirs
.size())
612 MCDwarfDirs
.push_back(Directory
);
613 // The DirIndex is one based, as DirIndex of 0 is used for FileNames with
614 // no directories. MCDwarfDirs[] is unlike MCDwarfFiles[] in that the
615 // directory names are stored at MCDwarfDirs[DirIndex-1] where FileNames
616 // are stored at MCDwarfFiles[FileNumber].Name .
620 File
.Name
= FileName
;
621 File
.DirIndex
= DirIndex
;
622 File
.Checksum
= Checksum
;
623 trackMD5Usage(Checksum
);
624 File
.Source
= Source
;
628 // return the allocated FileNumber.
632 /// Utility function to emit the encoding to a streamer.
633 void MCDwarfLineAddr::Emit(MCStreamer
*MCOS
, MCDwarfLineTableParams Params
,
634 int64_t LineDelta
, uint64_t AddrDelta
) {
635 MCContext
&Context
= MCOS
->getContext();
636 SmallString
<256> Tmp
;
637 raw_svector_ostream
OS(Tmp
);
638 MCDwarfLineAddr::Encode(Context
, Params
, LineDelta
, AddrDelta
, OS
);
639 MCOS
->EmitBytes(OS
.str());
642 /// Given a special op, return the address skip amount (in units of
643 /// DWARF2_LINE_MIN_INSN_LENGTH).
644 static uint64_t SpecialAddr(MCDwarfLineTableParams Params
, uint64_t op
) {
645 return (op
- Params
.DWARF2LineOpcodeBase
) / Params
.DWARF2LineRange
;
648 /// Utility function to encode a Dwarf pair of LineDelta and AddrDeltas.
649 void MCDwarfLineAddr::Encode(MCContext
&Context
, MCDwarfLineTableParams Params
,
650 int64_t LineDelta
, uint64_t AddrDelta
,
652 uint64_t Temp
, Opcode
;
653 bool NeedCopy
= false;
655 // The maximum address skip amount that can be encoded with a special op.
656 uint64_t MaxSpecialAddrDelta
= SpecialAddr(Params
, 255);
658 // Scale the address delta by the minimum instruction length.
659 AddrDelta
= ScaleAddrDelta(Context
, AddrDelta
);
661 // A LineDelta of INT64_MAX is a signal that this is actually a
662 // DW_LNE_end_sequence. We cannot use special opcodes here, since we want the
663 // end_sequence to emit the matrix entry.
664 if (LineDelta
== INT64_MAX
) {
665 if (AddrDelta
== MaxSpecialAddrDelta
)
666 OS
<< char(dwarf::DW_LNS_const_add_pc
);
667 else if (AddrDelta
) {
668 OS
<< char(dwarf::DW_LNS_advance_pc
);
669 encodeULEB128(AddrDelta
, OS
);
671 OS
<< char(dwarf::DW_LNS_extended_op
);
673 OS
<< char(dwarf::DW_LNE_end_sequence
);
677 // Bias the line delta by the base.
678 Temp
= LineDelta
- Params
.DWARF2LineBase
;
680 // If the line increment is out of range of a special opcode, we must encode
681 // it with DW_LNS_advance_line.
682 if (Temp
>= Params
.DWARF2LineRange
||
683 Temp
+ Params
.DWARF2LineOpcodeBase
> 255) {
684 OS
<< char(dwarf::DW_LNS_advance_line
);
685 encodeSLEB128(LineDelta
, OS
);
688 Temp
= 0 - Params
.DWARF2LineBase
;
692 // Use DW_LNS_copy instead of a "line +0, addr +0" special opcode.
693 if (LineDelta
== 0 && AddrDelta
== 0) {
694 OS
<< char(dwarf::DW_LNS_copy
);
698 // Bias the opcode by the special opcode base.
699 Temp
+= Params
.DWARF2LineOpcodeBase
;
701 // Avoid overflow when addr_delta is large.
702 if (AddrDelta
< 256 + MaxSpecialAddrDelta
) {
703 // Try using a special opcode.
704 Opcode
= Temp
+ AddrDelta
* Params
.DWARF2LineRange
;
710 // Try using DW_LNS_const_add_pc followed by special op.
711 Opcode
= Temp
+ (AddrDelta
- MaxSpecialAddrDelta
) * Params
.DWARF2LineRange
;
713 OS
<< char(dwarf::DW_LNS_const_add_pc
);
719 // Otherwise use DW_LNS_advance_pc.
720 OS
<< char(dwarf::DW_LNS_advance_pc
);
721 encodeULEB128(AddrDelta
, OS
);
724 OS
<< char(dwarf::DW_LNS_copy
);
726 assert(Temp
<= 255 && "Buggy special opcode encoding.");
731 bool MCDwarfLineAddr::FixedEncode(MCContext
&Context
,
732 MCDwarfLineTableParams Params
,
733 int64_t LineDelta
, uint64_t AddrDelta
,
735 uint32_t *Offset
, uint32_t *Size
) {
736 if (LineDelta
!= INT64_MAX
) {
737 OS
<< char(dwarf::DW_LNS_advance_line
);
738 encodeSLEB128(LineDelta
, OS
);
741 // Use address delta to adjust address or use absolute address to adjust
744 // According to DWARF spec., the DW_LNS_fixed_advance_pc opcode takes a
745 // single uhalf (unencoded) operand. So, the maximum value of AddrDelta
746 // is 65535. We set a conservative upper bound for it for relaxation.
747 if (AddrDelta
> 60000) {
748 const MCAsmInfo
*asmInfo
= Context
.getAsmInfo();
749 unsigned AddrSize
= asmInfo
->getCodePointerSize();
751 OS
<< char(dwarf::DW_LNS_extended_op
);
752 encodeULEB128(1 + AddrSize
, OS
);
753 OS
<< char(dwarf::DW_LNE_set_address
);
754 // Generate fixup for the address.
758 std::vector
<uint8_t> FillData
;
759 FillData
.insert(FillData
.begin(), AddrSize
, 0);
760 OS
.write(reinterpret_cast<char *>(FillData
.data()), AddrSize
);
762 OS
<< char(dwarf::DW_LNS_fixed_advance_pc
);
763 // Generate fixup for 2-bytes address delta.
771 if (LineDelta
== INT64_MAX
) {
772 OS
<< char(dwarf::DW_LNS_extended_op
);
774 OS
<< char(dwarf::DW_LNE_end_sequence
);
776 OS
<< char(dwarf::DW_LNS_copy
);
782 // Utility function to write a tuple for .debug_abbrev.
783 static void EmitAbbrev(MCStreamer
*MCOS
, uint64_t Name
, uint64_t Form
) {
784 MCOS
->EmitULEB128IntValue(Name
);
785 MCOS
->EmitULEB128IntValue(Form
);
788 // When generating dwarf for assembly source files this emits
789 // the data for .debug_abbrev section which contains three DIEs.
790 static void EmitGenDwarfAbbrev(MCStreamer
*MCOS
) {
791 MCContext
&context
= MCOS
->getContext();
792 MCOS
->SwitchSection(context
.getObjectFileInfo()->getDwarfAbbrevSection());
794 // DW_TAG_compile_unit DIE abbrev (1).
795 MCOS
->EmitULEB128IntValue(1);
796 MCOS
->EmitULEB128IntValue(dwarf::DW_TAG_compile_unit
);
797 MCOS
->EmitIntValue(dwarf::DW_CHILDREN_yes
, 1);
798 EmitAbbrev(MCOS
, dwarf::DW_AT_stmt_list
, context
.getDwarfVersion() >= 4
799 ? dwarf::DW_FORM_sec_offset
800 : dwarf::DW_FORM_data4
);
801 if (context
.getGenDwarfSectionSyms().size() > 1 &&
802 context
.getDwarfVersion() >= 3) {
803 EmitAbbrev(MCOS
, dwarf::DW_AT_ranges
, context
.getDwarfVersion() >= 4
804 ? dwarf::DW_FORM_sec_offset
805 : dwarf::DW_FORM_data4
);
807 EmitAbbrev(MCOS
, dwarf::DW_AT_low_pc
, dwarf::DW_FORM_addr
);
808 EmitAbbrev(MCOS
, dwarf::DW_AT_high_pc
, dwarf::DW_FORM_addr
);
810 EmitAbbrev(MCOS
, dwarf::DW_AT_name
, dwarf::DW_FORM_string
);
811 if (!context
.getCompilationDir().empty())
812 EmitAbbrev(MCOS
, dwarf::DW_AT_comp_dir
, dwarf::DW_FORM_string
);
813 StringRef DwarfDebugFlags
= context
.getDwarfDebugFlags();
814 if (!DwarfDebugFlags
.empty())
815 EmitAbbrev(MCOS
, dwarf::DW_AT_APPLE_flags
, dwarf::DW_FORM_string
);
816 EmitAbbrev(MCOS
, dwarf::DW_AT_producer
, dwarf::DW_FORM_string
);
817 EmitAbbrev(MCOS
, dwarf::DW_AT_language
, dwarf::DW_FORM_data2
);
818 EmitAbbrev(MCOS
, 0, 0);
820 // DW_TAG_label DIE abbrev (2).
821 MCOS
->EmitULEB128IntValue(2);
822 MCOS
->EmitULEB128IntValue(dwarf::DW_TAG_label
);
823 MCOS
->EmitIntValue(dwarf::DW_CHILDREN_yes
, 1);
824 EmitAbbrev(MCOS
, dwarf::DW_AT_name
, dwarf::DW_FORM_string
);
825 EmitAbbrev(MCOS
, dwarf::DW_AT_decl_file
, dwarf::DW_FORM_data4
);
826 EmitAbbrev(MCOS
, dwarf::DW_AT_decl_line
, dwarf::DW_FORM_data4
);
827 EmitAbbrev(MCOS
, dwarf::DW_AT_low_pc
, dwarf::DW_FORM_addr
);
828 EmitAbbrev(MCOS
, dwarf::DW_AT_prototyped
, dwarf::DW_FORM_flag
);
829 EmitAbbrev(MCOS
, 0, 0);
831 // DW_TAG_unspecified_parameters DIE abbrev (3).
832 MCOS
->EmitULEB128IntValue(3);
833 MCOS
->EmitULEB128IntValue(dwarf::DW_TAG_unspecified_parameters
);
834 MCOS
->EmitIntValue(dwarf::DW_CHILDREN_no
, 1);
835 EmitAbbrev(MCOS
, 0, 0);
837 // Terminate the abbreviations for this compilation unit.
838 MCOS
->EmitIntValue(0, 1);
841 // When generating dwarf for assembly source files this emits the data for
842 // .debug_aranges section. This section contains a header and a table of pairs
843 // of PointerSize'ed values for the address and size of section(s) with line
845 static void EmitGenDwarfAranges(MCStreamer
*MCOS
,
846 const MCSymbol
*InfoSectionSymbol
) {
847 MCContext
&context
= MCOS
->getContext();
849 auto &Sections
= context
.getGenDwarfSectionSyms();
851 MCOS
->SwitchSection(context
.getObjectFileInfo()->getDwarfARangesSection());
853 // This will be the length of the .debug_aranges section, first account for
854 // the size of each item in the header (see below where we emit these items).
855 int Length
= 4 + 2 + 4 + 1 + 1;
857 // Figure the padding after the header before the table of address and size
858 // pairs who's values are PointerSize'ed.
859 const MCAsmInfo
*asmInfo
= context
.getAsmInfo();
860 int AddrSize
= asmInfo
->getCodePointerSize();
861 int Pad
= 2 * AddrSize
- (Length
& (2 * AddrSize
- 1));
862 if (Pad
== 2 * AddrSize
)
866 // Add the size of the pair of PointerSize'ed values for the address and size
867 // of each section we have in the table.
868 Length
+= 2 * AddrSize
* Sections
.size();
869 // And the pair of terminating zeros.
870 Length
+= 2 * AddrSize
;
872 // Emit the header for this section.
873 // The 4 byte length not including the 4 byte value for the length.
874 MCOS
->EmitIntValue(Length
- 4, 4);
875 // The 2 byte version, which is 2.
876 MCOS
->EmitIntValue(2, 2);
877 // The 4 byte offset to the compile unit in the .debug_info from the start
878 // of the .debug_info.
879 if (InfoSectionSymbol
)
880 MCOS
->EmitSymbolValue(InfoSectionSymbol
, 4,
881 asmInfo
->needsDwarfSectionOffsetDirective());
883 MCOS
->EmitIntValue(0, 4);
884 // The 1 byte size of an address.
885 MCOS
->EmitIntValue(AddrSize
, 1);
886 // The 1 byte size of a segment descriptor, we use a value of zero.
887 MCOS
->EmitIntValue(0, 1);
888 // Align the header with the padding if needed, before we put out the table.
889 for(int i
= 0; i
< Pad
; i
++)
890 MCOS
->EmitIntValue(0, 1);
892 // Now emit the table of pairs of PointerSize'ed values for the section
893 // addresses and sizes.
894 for (MCSection
*Sec
: Sections
) {
895 const MCSymbol
*StartSymbol
= Sec
->getBeginSymbol();
896 MCSymbol
*EndSymbol
= Sec
->getEndSymbol(context
);
897 assert(StartSymbol
&& "StartSymbol must not be NULL");
898 assert(EndSymbol
&& "EndSymbol must not be NULL");
900 const MCExpr
*Addr
= MCSymbolRefExpr::create(
901 StartSymbol
, MCSymbolRefExpr::VK_None
, context
);
902 const MCExpr
*Size
= MakeStartMinusEndExpr(*MCOS
,
903 *StartSymbol
, *EndSymbol
, 0);
904 MCOS
->EmitValue(Addr
, AddrSize
);
905 emitAbsValue(*MCOS
, Size
, AddrSize
);
908 // And finally the pair of terminating zeros.
909 MCOS
->EmitIntValue(0, AddrSize
);
910 MCOS
->EmitIntValue(0, AddrSize
);
913 // When generating dwarf for assembly source files this emits the data for
914 // .debug_info section which contains three parts. The header, the compile_unit
915 // DIE and a list of label DIEs.
916 static void EmitGenDwarfInfo(MCStreamer
*MCOS
,
917 const MCSymbol
*AbbrevSectionSymbol
,
918 const MCSymbol
*LineSectionSymbol
,
919 const MCSymbol
*RangesSectionSymbol
) {
920 MCContext
&context
= MCOS
->getContext();
922 MCOS
->SwitchSection(context
.getObjectFileInfo()->getDwarfInfoSection());
924 // Create a symbol at the start and end of this section used in here for the
925 // expression to calculate the length in the header.
926 MCSymbol
*InfoStart
= context
.createTempSymbol();
927 MCOS
->EmitLabel(InfoStart
);
928 MCSymbol
*InfoEnd
= context
.createTempSymbol();
930 // First part: the header.
932 // The 4 byte total length of the information for this compilation unit, not
933 // including these 4 bytes.
934 const MCExpr
*Length
= MakeStartMinusEndExpr(*MCOS
, *InfoStart
, *InfoEnd
, 4);
935 emitAbsValue(*MCOS
, Length
, 4);
937 // The 2 byte DWARF version.
938 MCOS
->EmitIntValue(context
.getDwarfVersion(), 2);
940 // The DWARF v5 header has unit type, address size, abbrev offset.
941 // Earlier versions have abbrev offset, address size.
942 const MCAsmInfo
&AsmInfo
= *context
.getAsmInfo();
943 int AddrSize
= AsmInfo
.getCodePointerSize();
944 if (context
.getDwarfVersion() >= 5) {
945 MCOS
->EmitIntValue(dwarf::DW_UT_compile
, 1);
946 MCOS
->EmitIntValue(AddrSize
, 1);
948 // The 4 byte offset to the debug abbrevs from the start of the .debug_abbrev,
949 // it is at the start of that section so this is zero.
950 if (AbbrevSectionSymbol
== nullptr)
951 MCOS
->EmitIntValue(0, 4);
953 MCOS
->EmitSymbolValue(AbbrevSectionSymbol
, 4,
954 AsmInfo
.needsDwarfSectionOffsetDirective());
955 if (context
.getDwarfVersion() <= 4)
956 MCOS
->EmitIntValue(AddrSize
, 1);
958 // Second part: the compile_unit DIE.
960 // The DW_TAG_compile_unit DIE abbrev (1).
961 MCOS
->EmitULEB128IntValue(1);
963 // DW_AT_stmt_list, a 4 byte offset from the start of the .debug_line section,
964 // which is at the start of that section so this is zero.
965 if (LineSectionSymbol
)
966 MCOS
->EmitSymbolValue(LineSectionSymbol
, 4,
967 AsmInfo
.needsDwarfSectionOffsetDirective());
969 MCOS
->EmitIntValue(0, 4);
971 if (RangesSectionSymbol
) {
972 // There are multiple sections containing code, so we must use the
973 // .debug_ranges sections.
975 // AT_ranges, the 4 byte offset from the start of the .debug_ranges section
976 // to the address range list for this compilation unit.
977 MCOS
->EmitSymbolValue(RangesSectionSymbol
, 4);
979 // If we only have one non-empty code section, we can use the simpler
980 // AT_low_pc and AT_high_pc attributes.
982 // Find the first (and only) non-empty text section
983 auto &Sections
= context
.getGenDwarfSectionSyms();
984 const auto TextSection
= Sections
.begin();
985 assert(TextSection
!= Sections
.end() && "No text section found");
987 MCSymbol
*StartSymbol
= (*TextSection
)->getBeginSymbol();
988 MCSymbol
*EndSymbol
= (*TextSection
)->getEndSymbol(context
);
989 assert(StartSymbol
&& "StartSymbol must not be NULL");
990 assert(EndSymbol
&& "EndSymbol must not be NULL");
992 // AT_low_pc, the first address of the default .text section.
993 const MCExpr
*Start
= MCSymbolRefExpr::create(
994 StartSymbol
, MCSymbolRefExpr::VK_None
, context
);
995 MCOS
->EmitValue(Start
, AddrSize
);
997 // AT_high_pc, the last address of the default .text section.
998 const MCExpr
*End
= MCSymbolRefExpr::create(
999 EndSymbol
, MCSymbolRefExpr::VK_None
, context
);
1000 MCOS
->EmitValue(End
, AddrSize
);
1003 // AT_name, the name of the source file. Reconstruct from the first directory
1004 // and file table entries.
1005 const SmallVectorImpl
<std::string
> &MCDwarfDirs
= context
.getMCDwarfDirs();
1006 if (MCDwarfDirs
.size() > 0) {
1007 MCOS
->EmitBytes(MCDwarfDirs
[0]);
1008 MCOS
->EmitBytes(sys::path::get_separator());
1010 const SmallVectorImpl
<MCDwarfFile
> &MCDwarfFiles
=
1011 MCOS
->getContext().getMCDwarfFiles();
1012 MCOS
->EmitBytes(MCDwarfFiles
[1].Name
);
1013 MCOS
->EmitIntValue(0, 1); // NULL byte to terminate the string.
1015 // AT_comp_dir, the working directory the assembly was done in.
1016 if (!context
.getCompilationDir().empty()) {
1017 MCOS
->EmitBytes(context
.getCompilationDir());
1018 MCOS
->EmitIntValue(0, 1); // NULL byte to terminate the string.
1021 // AT_APPLE_flags, the command line arguments of the assembler tool.
1022 StringRef DwarfDebugFlags
= context
.getDwarfDebugFlags();
1023 if (!DwarfDebugFlags
.empty()){
1024 MCOS
->EmitBytes(DwarfDebugFlags
);
1025 MCOS
->EmitIntValue(0, 1); // NULL byte to terminate the string.
1028 // AT_producer, the version of the assembler tool.
1029 StringRef DwarfDebugProducer
= context
.getDwarfDebugProducer();
1030 if (!DwarfDebugProducer
.empty())
1031 MCOS
->EmitBytes(DwarfDebugProducer
);
1033 MCOS
->EmitBytes(StringRef("llvm-mc (based on LLVM " PACKAGE_VERSION
")"));
1034 MCOS
->EmitIntValue(0, 1); // NULL byte to terminate the string.
1036 // AT_language, a 4 byte value. We use DW_LANG_Mips_Assembler as the dwarf2
1037 // draft has no standard code for assembler.
1038 MCOS
->EmitIntValue(dwarf::DW_LANG_Mips_Assembler
, 2);
1040 // Third part: the list of label DIEs.
1042 // Loop on saved info for dwarf labels and create the DIEs for them.
1043 const std::vector
<MCGenDwarfLabelEntry
> &Entries
=
1044 MCOS
->getContext().getMCGenDwarfLabelEntries();
1045 for (const auto &Entry
: Entries
) {
1046 // The DW_TAG_label DIE abbrev (2).
1047 MCOS
->EmitULEB128IntValue(2);
1049 // AT_name, of the label without any leading underbar.
1050 MCOS
->EmitBytes(Entry
.getName());
1051 MCOS
->EmitIntValue(0, 1); // NULL byte to terminate the string.
1053 // AT_decl_file, index into the file table.
1054 MCOS
->EmitIntValue(Entry
.getFileNumber(), 4);
1056 // AT_decl_line, source line number.
1057 MCOS
->EmitIntValue(Entry
.getLineNumber(), 4);
1059 // AT_low_pc, start address of the label.
1060 const MCExpr
*AT_low_pc
= MCSymbolRefExpr::create(Entry
.getLabel(),
1061 MCSymbolRefExpr::VK_None
, context
);
1062 MCOS
->EmitValue(AT_low_pc
, AddrSize
);
1064 // DW_AT_prototyped, a one byte flag value of 0 saying we have no prototype.
1065 MCOS
->EmitIntValue(0, 1);
1067 // The DW_TAG_unspecified_parameters DIE abbrev (3).
1068 MCOS
->EmitULEB128IntValue(3);
1070 // Add the NULL DIE terminating the DW_TAG_unspecified_parameters DIE's.
1071 MCOS
->EmitIntValue(0, 1);
1074 // Add the NULL DIE terminating the Compile Unit DIE's.
1075 MCOS
->EmitIntValue(0, 1);
1077 // Now set the value of the symbol at the end of the info section.
1078 MCOS
->EmitLabel(InfoEnd
);
1081 // When generating dwarf for assembly source files this emits the data for
1082 // .debug_ranges section. We only emit one range list, which spans all of the
1083 // executable sections of this file.
1084 static void EmitGenDwarfRanges(MCStreamer
*MCOS
) {
1085 MCContext
&context
= MCOS
->getContext();
1086 auto &Sections
= context
.getGenDwarfSectionSyms();
1088 const MCAsmInfo
*AsmInfo
= context
.getAsmInfo();
1089 int AddrSize
= AsmInfo
->getCodePointerSize();
1091 MCOS
->SwitchSection(context
.getObjectFileInfo()->getDwarfRangesSection());
1093 for (MCSection
*Sec
: Sections
) {
1094 const MCSymbol
*StartSymbol
= Sec
->getBeginSymbol();
1095 MCSymbol
*EndSymbol
= Sec
->getEndSymbol(context
);
1096 assert(StartSymbol
&& "StartSymbol must not be NULL");
1097 assert(EndSymbol
&& "EndSymbol must not be NULL");
1099 // Emit a base address selection entry for the start of this section
1100 const MCExpr
*SectionStartAddr
= MCSymbolRefExpr::create(
1101 StartSymbol
, MCSymbolRefExpr::VK_None
, context
);
1102 MCOS
->emitFill(AddrSize
, 0xFF);
1103 MCOS
->EmitValue(SectionStartAddr
, AddrSize
);
1105 // Emit a range list entry spanning this section
1106 const MCExpr
*SectionSize
= MakeStartMinusEndExpr(*MCOS
,
1107 *StartSymbol
, *EndSymbol
, 0);
1108 MCOS
->EmitIntValue(0, AddrSize
);
1109 emitAbsValue(*MCOS
, SectionSize
, AddrSize
);
1112 // Emit end of list entry
1113 MCOS
->EmitIntValue(0, AddrSize
);
1114 MCOS
->EmitIntValue(0, AddrSize
);
1118 // When generating dwarf for assembly source files this emits the Dwarf
1121 void MCGenDwarfInfo::Emit(MCStreamer
*MCOS
) {
1122 MCContext
&context
= MCOS
->getContext();
1124 // Create the dwarf sections in this order (.debug_line already created).
1125 const MCAsmInfo
*AsmInfo
= context
.getAsmInfo();
1126 bool CreateDwarfSectionSymbols
=
1127 AsmInfo
->doesDwarfUseRelocationsAcrossSections();
1128 MCSymbol
*LineSectionSymbol
= nullptr;
1129 if (CreateDwarfSectionSymbols
)
1130 LineSectionSymbol
= MCOS
->getDwarfLineTableSymbol(0);
1131 MCSymbol
*AbbrevSectionSymbol
= nullptr;
1132 MCSymbol
*InfoSectionSymbol
= nullptr;
1133 MCSymbol
*RangesSectionSymbol
= nullptr;
1135 // Create end symbols for each section, and remove empty sections
1136 MCOS
->getContext().finalizeDwarfSections(*MCOS
);
1138 // If there are no sections to generate debug info for, we don't need
1140 if (MCOS
->getContext().getGenDwarfSectionSyms().empty())
1143 // We only use the .debug_ranges section if we have multiple code sections,
1144 // and we are emitting a DWARF version which supports it.
1145 const bool UseRangesSection
=
1146 MCOS
->getContext().getGenDwarfSectionSyms().size() > 1 &&
1147 MCOS
->getContext().getDwarfVersion() >= 3;
1148 CreateDwarfSectionSymbols
|= UseRangesSection
;
1150 MCOS
->SwitchSection(context
.getObjectFileInfo()->getDwarfInfoSection());
1151 if (CreateDwarfSectionSymbols
) {
1152 InfoSectionSymbol
= context
.createTempSymbol();
1153 MCOS
->EmitLabel(InfoSectionSymbol
);
1155 MCOS
->SwitchSection(context
.getObjectFileInfo()->getDwarfAbbrevSection());
1156 if (CreateDwarfSectionSymbols
) {
1157 AbbrevSectionSymbol
= context
.createTempSymbol();
1158 MCOS
->EmitLabel(AbbrevSectionSymbol
);
1160 if (UseRangesSection
) {
1161 MCOS
->SwitchSection(context
.getObjectFileInfo()->getDwarfRangesSection());
1162 if (CreateDwarfSectionSymbols
) {
1163 RangesSectionSymbol
= context
.createTempSymbol();
1164 MCOS
->EmitLabel(RangesSectionSymbol
);
1168 assert((RangesSectionSymbol
!= nullptr) || !UseRangesSection
);
1170 MCOS
->SwitchSection(context
.getObjectFileInfo()->getDwarfARangesSection());
1172 // Output the data for .debug_aranges section.
1173 EmitGenDwarfAranges(MCOS
, InfoSectionSymbol
);
1175 if (UseRangesSection
)
1176 EmitGenDwarfRanges(MCOS
);
1178 // Output the data for .debug_abbrev section.
1179 EmitGenDwarfAbbrev(MCOS
);
1181 // Output the data for .debug_info section.
1182 EmitGenDwarfInfo(MCOS
, AbbrevSectionSymbol
, LineSectionSymbol
,
1183 RangesSectionSymbol
);
1187 // When generating dwarf for assembly source files this is called when symbol
1188 // for a label is created. If this symbol is not a temporary and is in the
1189 // section that dwarf is being generated for, save the needed info to create
1192 void MCGenDwarfLabelEntry::Make(MCSymbol
*Symbol
, MCStreamer
*MCOS
,
1193 SourceMgr
&SrcMgr
, SMLoc
&Loc
) {
1194 // We won't create dwarf labels for temporary symbols.
1195 if (Symbol
->isTemporary())
1197 MCContext
&context
= MCOS
->getContext();
1198 // We won't create dwarf labels for symbols in sections that we are not
1199 // generating debug info for.
1200 if (!context
.getGenDwarfSectionSyms().count(MCOS
->getCurrentSectionOnly()))
1203 // The dwarf label's name does not have the symbol name's leading
1205 StringRef Name
= Symbol
->getName();
1206 if (Name
.startswith("_"))
1207 Name
= Name
.substr(1, Name
.size()-1);
1209 // Get the dwarf file number to be used for the dwarf label.
1210 unsigned FileNumber
= context
.getGenDwarfFileNumber();
1212 // Finding the line number is the expensive part which is why we just don't
1213 // pass it in as for some symbols we won't create a dwarf label.
1214 unsigned CurBuffer
= SrcMgr
.FindBufferContainingLoc(Loc
);
1215 unsigned LineNumber
= SrcMgr
.FindLineNumber(Loc
, CurBuffer
);
1217 // We create a temporary symbol for use for the AT_high_pc and AT_low_pc
1218 // values so that they don't have things like an ARM thumb bit from the
1219 // original symbol. So when used they won't get a low bit set after
1221 MCSymbol
*Label
= context
.createTempSymbol();
1222 MCOS
->EmitLabel(Label
);
1224 // Create and entry for the info and add it to the other entries.
1225 MCOS
->getContext().addMCGenDwarfLabelEntry(
1226 MCGenDwarfLabelEntry(Name
, FileNumber
, LineNumber
, Label
));
1229 static int getDataAlignmentFactor(MCStreamer
&streamer
) {
1230 MCContext
&context
= streamer
.getContext();
1231 const MCAsmInfo
*asmInfo
= context
.getAsmInfo();
1232 int size
= asmInfo
->getCalleeSaveStackSlotSize();
1233 if (asmInfo
->isStackGrowthDirectionUp())
1239 static unsigned getSizeForEncoding(MCStreamer
&streamer
,
1240 unsigned symbolEncoding
) {
1241 MCContext
&context
= streamer
.getContext();
1242 unsigned format
= symbolEncoding
& 0x0f;
1244 default: llvm_unreachable("Unknown Encoding");
1245 case dwarf::DW_EH_PE_absptr
:
1246 case dwarf::DW_EH_PE_signed
:
1247 return context
.getAsmInfo()->getCodePointerSize();
1248 case dwarf::DW_EH_PE_udata2
:
1249 case dwarf::DW_EH_PE_sdata2
:
1251 case dwarf::DW_EH_PE_udata4
:
1252 case dwarf::DW_EH_PE_sdata4
:
1254 case dwarf::DW_EH_PE_udata8
:
1255 case dwarf::DW_EH_PE_sdata8
:
1260 static void emitFDESymbol(MCObjectStreamer
&streamer
, const MCSymbol
&symbol
,
1261 unsigned symbolEncoding
, bool isEH
) {
1262 MCContext
&context
= streamer
.getContext();
1263 const MCAsmInfo
*asmInfo
= context
.getAsmInfo();
1264 const MCExpr
*v
= asmInfo
->getExprForFDESymbol(&symbol
,
1267 unsigned size
= getSizeForEncoding(streamer
, symbolEncoding
);
1268 if (asmInfo
->doDwarfFDESymbolsUseAbsDiff() && isEH
)
1269 emitAbsValue(streamer
, v
, size
);
1271 streamer
.EmitValue(v
, size
);
1274 static void EmitPersonality(MCStreamer
&streamer
, const MCSymbol
&symbol
,
1275 unsigned symbolEncoding
) {
1276 MCContext
&context
= streamer
.getContext();
1277 const MCAsmInfo
*asmInfo
= context
.getAsmInfo();
1278 const MCExpr
*v
= asmInfo
->getExprForPersonalitySymbol(&symbol
,
1281 unsigned size
= getSizeForEncoding(streamer
, symbolEncoding
);
1282 streamer
.EmitValue(v
, size
);
1287 class FrameEmitterImpl
{
1289 int InitialCFAOffset
= 0;
1291 MCObjectStreamer
&Streamer
;
1294 FrameEmitterImpl(bool IsEH
, MCObjectStreamer
&Streamer
)
1295 : IsEH(IsEH
), Streamer(Streamer
) {}
1297 /// Emit the unwind information in a compact way.
1298 void EmitCompactUnwind(const MCDwarfFrameInfo
&frame
);
1300 const MCSymbol
&EmitCIE(const MCDwarfFrameInfo
&F
);
1301 void EmitFDE(const MCSymbol
&cieStart
, const MCDwarfFrameInfo
&frame
,
1302 bool LastInSection
, const MCSymbol
&SectionStart
);
1303 void EmitCFIInstructions(ArrayRef
<MCCFIInstruction
> Instrs
,
1304 MCSymbol
*BaseLabel
);
1305 void EmitCFIInstruction(const MCCFIInstruction
&Instr
);
1308 } // end anonymous namespace
1310 static void emitEncodingByte(MCObjectStreamer
&Streamer
, unsigned Encoding
) {
1311 Streamer
.EmitIntValue(Encoding
, 1);
1314 void FrameEmitterImpl::EmitCFIInstruction(const MCCFIInstruction
&Instr
) {
1315 int dataAlignmentFactor
= getDataAlignmentFactor(Streamer
);
1316 auto *MRI
= Streamer
.getContext().getRegisterInfo();
1318 switch (Instr
.getOperation()) {
1319 case MCCFIInstruction::OpRegister
: {
1320 unsigned Reg1
= Instr
.getRegister();
1321 unsigned Reg2
= Instr
.getRegister2();
1323 Reg1
= MRI
->getDwarfRegNumFromDwarfEHRegNum(Reg1
);
1324 Reg2
= MRI
->getDwarfRegNumFromDwarfEHRegNum(Reg2
);
1326 Streamer
.EmitIntValue(dwarf::DW_CFA_register
, 1);
1327 Streamer
.EmitULEB128IntValue(Reg1
);
1328 Streamer
.EmitULEB128IntValue(Reg2
);
1331 case MCCFIInstruction::OpWindowSave
:
1332 Streamer
.EmitIntValue(dwarf::DW_CFA_GNU_window_save
, 1);
1335 case MCCFIInstruction::OpUndefined
: {
1336 unsigned Reg
= Instr
.getRegister();
1337 Streamer
.EmitIntValue(dwarf::DW_CFA_undefined
, 1);
1338 Streamer
.EmitULEB128IntValue(Reg
);
1341 case MCCFIInstruction::OpAdjustCfaOffset
:
1342 case MCCFIInstruction::OpDefCfaOffset
: {
1343 const bool IsRelative
=
1344 Instr
.getOperation() == MCCFIInstruction::OpAdjustCfaOffset
;
1346 Streamer
.EmitIntValue(dwarf::DW_CFA_def_cfa_offset
, 1);
1349 CFAOffset
+= Instr
.getOffset();
1351 CFAOffset
= -Instr
.getOffset();
1353 Streamer
.EmitULEB128IntValue(CFAOffset
);
1357 case MCCFIInstruction::OpDefCfa
: {
1358 unsigned Reg
= Instr
.getRegister();
1360 Reg
= MRI
->getDwarfRegNumFromDwarfEHRegNum(Reg
);
1361 Streamer
.EmitIntValue(dwarf::DW_CFA_def_cfa
, 1);
1362 Streamer
.EmitULEB128IntValue(Reg
);
1363 CFAOffset
= -Instr
.getOffset();
1364 Streamer
.EmitULEB128IntValue(CFAOffset
);
1368 case MCCFIInstruction::OpDefCfaRegister
: {
1369 unsigned Reg
= Instr
.getRegister();
1371 Reg
= MRI
->getDwarfRegNumFromDwarfEHRegNum(Reg
);
1372 Streamer
.EmitIntValue(dwarf::DW_CFA_def_cfa_register
, 1);
1373 Streamer
.EmitULEB128IntValue(Reg
);
1377 case MCCFIInstruction::OpOffset
:
1378 case MCCFIInstruction::OpRelOffset
: {
1379 const bool IsRelative
=
1380 Instr
.getOperation() == MCCFIInstruction::OpRelOffset
;
1382 unsigned Reg
= Instr
.getRegister();
1384 Reg
= MRI
->getDwarfRegNumFromDwarfEHRegNum(Reg
);
1386 int Offset
= Instr
.getOffset();
1388 Offset
-= CFAOffset
;
1389 Offset
= Offset
/ dataAlignmentFactor
;
1392 Streamer
.EmitIntValue(dwarf::DW_CFA_offset_extended_sf
, 1);
1393 Streamer
.EmitULEB128IntValue(Reg
);
1394 Streamer
.EmitSLEB128IntValue(Offset
);
1395 } else if (Reg
< 64) {
1396 Streamer
.EmitIntValue(dwarf::DW_CFA_offset
+ Reg
, 1);
1397 Streamer
.EmitULEB128IntValue(Offset
);
1399 Streamer
.EmitIntValue(dwarf::DW_CFA_offset_extended
, 1);
1400 Streamer
.EmitULEB128IntValue(Reg
);
1401 Streamer
.EmitULEB128IntValue(Offset
);
1405 case MCCFIInstruction::OpRememberState
:
1406 Streamer
.EmitIntValue(dwarf::DW_CFA_remember_state
, 1);
1408 case MCCFIInstruction::OpRestoreState
:
1409 Streamer
.EmitIntValue(dwarf::DW_CFA_restore_state
, 1);
1411 case MCCFIInstruction::OpSameValue
: {
1412 unsigned Reg
= Instr
.getRegister();
1413 Streamer
.EmitIntValue(dwarf::DW_CFA_same_value
, 1);
1414 Streamer
.EmitULEB128IntValue(Reg
);
1417 case MCCFIInstruction::OpRestore
: {
1418 unsigned Reg
= Instr
.getRegister();
1420 Reg
= MRI
->getDwarfRegNumFromDwarfEHRegNum(Reg
);
1421 Streamer
.EmitIntValue(dwarf::DW_CFA_restore
| Reg
, 1);
1424 case MCCFIInstruction::OpGnuArgsSize
:
1425 Streamer
.EmitIntValue(dwarf::DW_CFA_GNU_args_size
, 1);
1426 Streamer
.EmitULEB128IntValue(Instr
.getOffset());
1429 case MCCFIInstruction::OpEscape
:
1430 Streamer
.EmitBytes(Instr
.getValues());
1433 llvm_unreachable("Unhandled case in switch");
1436 /// Emit frame instructions to describe the layout of the frame.
1437 void FrameEmitterImpl::EmitCFIInstructions(ArrayRef
<MCCFIInstruction
> Instrs
,
1438 MCSymbol
*BaseLabel
) {
1439 for (const MCCFIInstruction
&Instr
: Instrs
) {
1440 MCSymbol
*Label
= Instr
.getLabel();
1441 // Throw out move if the label is invalid.
1442 if (Label
&& !Label
->isDefined()) continue; // Not emitted, in dead code.
1444 // Advance row if new location.
1445 if (BaseLabel
&& Label
) {
1446 MCSymbol
*ThisSym
= Label
;
1447 if (ThisSym
!= BaseLabel
) {
1448 Streamer
.EmitDwarfAdvanceFrameAddr(BaseLabel
, ThisSym
);
1449 BaseLabel
= ThisSym
;
1453 EmitCFIInstruction(Instr
);
1457 /// Emit the unwind information in a compact way.
1458 void FrameEmitterImpl::EmitCompactUnwind(const MCDwarfFrameInfo
&Frame
) {
1459 MCContext
&Context
= Streamer
.getContext();
1460 const MCObjectFileInfo
*MOFI
= Context
.getObjectFileInfo();
1462 // range-start range-length compact-unwind-enc personality-func lsda
1463 // _foo LfooEnd-_foo 0x00000023 0 0
1464 // _bar LbarEnd-_bar 0x00000025 __gxx_personality except_tab1
1466 // .section __LD,__compact_unwind,regular,debug
1468 // # compact unwind for _foo
1470 // .set L1,LfooEnd-_foo
1476 // # compact unwind for _bar
1478 // .set L2,LbarEnd-_bar
1481 // .quad __gxx_personality
1482 // .quad except_tab1
1484 uint32_t Encoding
= Frame
.CompactUnwindEncoding
;
1485 if (!Encoding
) return;
1486 bool DwarfEHFrameOnly
= (Encoding
== MOFI
->getCompactUnwindDwarfEHFrameOnly());
1488 // The encoding needs to know we have an LSDA.
1489 if (!DwarfEHFrameOnly
&& Frame
.Lsda
)
1490 Encoding
|= 0x40000000;
1493 unsigned FDEEncoding
= MOFI
->getFDEEncoding();
1494 unsigned Size
= getSizeForEncoding(Streamer
, FDEEncoding
);
1495 Streamer
.EmitSymbolValue(Frame
.Begin
, Size
);
1498 const MCExpr
*Range
= MakeStartMinusEndExpr(Streamer
, *Frame
.Begin
,
1500 emitAbsValue(Streamer
, Range
, 4);
1503 Size
= getSizeForEncoding(Streamer
, dwarf::DW_EH_PE_udata4
);
1504 Streamer
.EmitIntValue(Encoding
, Size
);
1506 // Personality Function
1507 Size
= getSizeForEncoding(Streamer
, dwarf::DW_EH_PE_absptr
);
1508 if (!DwarfEHFrameOnly
&& Frame
.Personality
)
1509 Streamer
.EmitSymbolValue(Frame
.Personality
, Size
);
1511 Streamer
.EmitIntValue(0, Size
); // No personality fn
1514 Size
= getSizeForEncoding(Streamer
, Frame
.LsdaEncoding
);
1515 if (!DwarfEHFrameOnly
&& Frame
.Lsda
)
1516 Streamer
.EmitSymbolValue(Frame
.Lsda
, Size
);
1518 Streamer
.EmitIntValue(0, Size
); // No LSDA
1521 static unsigned getCIEVersion(bool IsEH
, unsigned DwarfVersion
) {
1524 switch (DwarfVersion
) {
1533 llvm_unreachable("Unknown version");
1536 const MCSymbol
&FrameEmitterImpl::EmitCIE(const MCDwarfFrameInfo
&Frame
) {
1537 MCContext
&context
= Streamer
.getContext();
1538 const MCRegisterInfo
*MRI
= context
.getRegisterInfo();
1539 const MCObjectFileInfo
*MOFI
= context
.getObjectFileInfo();
1541 MCSymbol
*sectionStart
= context
.createTempSymbol();
1542 Streamer
.EmitLabel(sectionStart
);
1544 MCSymbol
*sectionEnd
= context
.createTempSymbol();
1547 const MCExpr
*Length
=
1548 MakeStartMinusEndExpr(Streamer
, *sectionStart
, *sectionEnd
, 4);
1549 emitAbsValue(Streamer
, Length
, 4);
1552 unsigned CIE_ID
= IsEH
? 0 : -1;
1553 Streamer
.EmitIntValue(CIE_ID
, 4);
1556 uint8_t CIEVersion
= getCIEVersion(IsEH
, context
.getDwarfVersion());
1557 Streamer
.EmitIntValue(CIEVersion
, 1);
1559 // Augmentation String
1560 SmallString
<8> Augmentation
;
1562 Augmentation
+= "z";
1563 if (Frame
.Personality
)
1564 Augmentation
+= "P";
1566 Augmentation
+= "L";
1567 Augmentation
+= "R";
1568 if (Frame
.IsSignalFrame
)
1569 Augmentation
+= "S";
1570 Streamer
.EmitBytes(Augmentation
);
1572 Streamer
.EmitIntValue(0, 1);
1574 if (CIEVersion
>= 4) {
1576 Streamer
.EmitIntValue(context
.getAsmInfo()->getCodePointerSize(), 1);
1578 // Segment Descriptor Size
1579 Streamer
.EmitIntValue(0, 1);
1582 // Code Alignment Factor
1583 Streamer
.EmitULEB128IntValue(context
.getAsmInfo()->getMinInstAlignment());
1585 // Data Alignment Factor
1586 Streamer
.EmitSLEB128IntValue(getDataAlignmentFactor(Streamer
));
1588 // Return Address Register
1589 unsigned RAReg
= Frame
.RAReg
;
1590 if (RAReg
== static_cast<unsigned>(INT_MAX
))
1591 RAReg
= MRI
->getDwarfRegNum(MRI
->getRARegister(), IsEH
);
1593 if (CIEVersion
== 1) {
1594 assert(RAReg
<= 255 &&
1595 "DWARF 2 encodes return_address_register in one byte");
1596 Streamer
.EmitIntValue(RAReg
, 1);
1598 Streamer
.EmitULEB128IntValue(RAReg
);
1601 // Augmentation Data Length (optional)
1602 unsigned augmentationLength
= 0;
1604 if (Frame
.Personality
) {
1605 // Personality Encoding
1606 augmentationLength
+= 1;
1608 augmentationLength
+=
1609 getSizeForEncoding(Streamer
, Frame
.PersonalityEncoding
);
1612 augmentationLength
+= 1;
1613 // Encoding of the FDE pointers
1614 augmentationLength
+= 1;
1616 Streamer
.EmitULEB128IntValue(augmentationLength
);
1618 // Augmentation Data (optional)
1619 if (Frame
.Personality
) {
1620 // Personality Encoding
1621 emitEncodingByte(Streamer
, Frame
.PersonalityEncoding
);
1623 EmitPersonality(Streamer
, *Frame
.Personality
, Frame
.PersonalityEncoding
);
1627 emitEncodingByte(Streamer
, Frame
.LsdaEncoding
);
1629 // Encoding of the FDE pointers
1630 emitEncodingByte(Streamer
, MOFI
->getFDEEncoding());
1633 // Initial Instructions
1635 const MCAsmInfo
*MAI
= context
.getAsmInfo();
1636 if (!Frame
.IsSimple
) {
1637 const std::vector
<MCCFIInstruction
> &Instructions
=
1638 MAI
->getInitialFrameState();
1639 EmitCFIInstructions(Instructions
, nullptr);
1642 InitialCFAOffset
= CFAOffset
;
1645 Streamer
.EmitValueToAlignment(IsEH
? 4 : MAI
->getCodePointerSize());
1647 Streamer
.EmitLabel(sectionEnd
);
1648 return *sectionStart
;
1651 void FrameEmitterImpl::EmitFDE(const MCSymbol
&cieStart
,
1652 const MCDwarfFrameInfo
&frame
,
1654 const MCSymbol
&SectionStart
) {
1655 MCContext
&context
= Streamer
.getContext();
1656 MCSymbol
*fdeStart
= context
.createTempSymbol();
1657 MCSymbol
*fdeEnd
= context
.createTempSymbol();
1658 const MCObjectFileInfo
*MOFI
= context
.getObjectFileInfo();
1660 CFAOffset
= InitialCFAOffset
;
1663 const MCExpr
*Length
= MakeStartMinusEndExpr(Streamer
, *fdeStart
, *fdeEnd
, 0);
1664 emitAbsValue(Streamer
, Length
, 4);
1666 Streamer
.EmitLabel(fdeStart
);
1669 const MCAsmInfo
*asmInfo
= context
.getAsmInfo();
1671 const MCExpr
*offset
=
1672 MakeStartMinusEndExpr(Streamer
, cieStart
, *fdeStart
, 0);
1673 emitAbsValue(Streamer
, offset
, 4);
1674 } else if (!asmInfo
->doesDwarfUseRelocationsAcrossSections()) {
1675 const MCExpr
*offset
=
1676 MakeStartMinusEndExpr(Streamer
, SectionStart
, cieStart
, 0);
1677 emitAbsValue(Streamer
, offset
, 4);
1679 Streamer
.EmitSymbolValue(&cieStart
, 4);
1683 unsigned PCEncoding
=
1684 IsEH
? MOFI
->getFDEEncoding() : (unsigned)dwarf::DW_EH_PE_absptr
;
1685 unsigned PCSize
= getSizeForEncoding(Streamer
, PCEncoding
);
1686 emitFDESymbol(Streamer
, *frame
.Begin
, PCEncoding
, IsEH
);
1689 const MCExpr
*Range
=
1690 MakeStartMinusEndExpr(Streamer
, *frame
.Begin
, *frame
.End
, 0);
1691 emitAbsValue(Streamer
, Range
, PCSize
);
1694 // Augmentation Data Length
1695 unsigned augmentationLength
= 0;
1698 augmentationLength
+= getSizeForEncoding(Streamer
, frame
.LsdaEncoding
);
1700 Streamer
.EmitULEB128IntValue(augmentationLength
);
1702 // Augmentation Data
1704 emitFDESymbol(Streamer
, *frame
.Lsda
, frame
.LsdaEncoding
, true);
1707 // Call Frame Instructions
1708 EmitCFIInstructions(frame
.Instructions
, frame
.Begin
);
1711 // The size of a .eh_frame section has to be a multiple of the alignment
1712 // since a null CIE is interpreted as the end. Old systems overaligned
1713 // .eh_frame, so we do too and account for it in the last FDE.
1714 unsigned Align
= LastInSection
? asmInfo
->getCodePointerSize() : PCSize
;
1715 Streamer
.EmitValueToAlignment(Align
);
1717 Streamer
.EmitLabel(fdeEnd
);
1723 static const CIEKey
getEmptyKey() {
1724 return CIEKey(nullptr, 0, -1, false, false, static_cast<unsigned>(INT_MAX
));
1727 static const CIEKey
getTombstoneKey() {
1728 return CIEKey(nullptr, -1, 0, false, false, static_cast<unsigned>(INT_MAX
));
1731 CIEKey(const MCSymbol
*Personality
, unsigned PersonalityEncoding
,
1732 unsigned LSDAEncoding
, bool IsSignalFrame
, bool IsSimple
,
1734 : Personality(Personality
), PersonalityEncoding(PersonalityEncoding
),
1735 LsdaEncoding(LSDAEncoding
), IsSignalFrame(IsSignalFrame
),
1736 IsSimple(IsSimple
), RAReg(RAReg
) {}
1738 explicit CIEKey(const MCDwarfFrameInfo
&Frame
)
1739 : Personality(Frame
.Personality
),
1740 PersonalityEncoding(Frame
.PersonalityEncoding
),
1741 LsdaEncoding(Frame
.LsdaEncoding
), IsSignalFrame(Frame
.IsSignalFrame
),
1742 IsSimple(Frame
.IsSimple
), RAReg(Frame
.RAReg
) {}
1744 const MCSymbol
*Personality
;
1745 unsigned PersonalityEncoding
;
1746 unsigned LsdaEncoding
;
1752 } // end anonymous namespace
1756 template <> struct DenseMapInfo
<CIEKey
> {
1757 static CIEKey
getEmptyKey() { return CIEKey::getEmptyKey(); }
1758 static CIEKey
getTombstoneKey() { return CIEKey::getTombstoneKey(); }
1760 static unsigned getHashValue(const CIEKey
&Key
) {
1761 return static_cast<unsigned>(
1762 hash_combine(Key
.Personality
, Key
.PersonalityEncoding
, Key
.LsdaEncoding
,
1763 Key
.IsSignalFrame
, Key
.IsSimple
, Key
.RAReg
));
1766 static bool isEqual(const CIEKey
&LHS
, const CIEKey
&RHS
) {
1767 return LHS
.Personality
== RHS
.Personality
&&
1768 LHS
.PersonalityEncoding
== RHS
.PersonalityEncoding
&&
1769 LHS
.LsdaEncoding
== RHS
.LsdaEncoding
&&
1770 LHS
.IsSignalFrame
== RHS
.IsSignalFrame
&&
1771 LHS
.IsSimple
== RHS
.IsSimple
&&
1772 LHS
.RAReg
== RHS
.RAReg
;
1776 } // end namespace llvm
1778 void MCDwarfFrameEmitter::Emit(MCObjectStreamer
&Streamer
, MCAsmBackend
*MAB
,
1780 Streamer
.generateCompactUnwindEncodings(MAB
);
1782 MCContext
&Context
= Streamer
.getContext();
1783 const MCObjectFileInfo
*MOFI
= Context
.getObjectFileInfo();
1784 const MCAsmInfo
*AsmInfo
= Context
.getAsmInfo();
1785 FrameEmitterImpl
Emitter(IsEH
, Streamer
);
1786 ArrayRef
<MCDwarfFrameInfo
> FrameArray
= Streamer
.getDwarfFrameInfos();
1788 // Emit the compact unwind info if available.
1789 bool NeedsEHFrameSection
= !MOFI
->getSupportsCompactUnwindWithoutEHFrame();
1790 if (IsEH
&& MOFI
->getCompactUnwindSection()) {
1791 bool SectionEmitted
= false;
1792 for (const MCDwarfFrameInfo
&Frame
: FrameArray
) {
1793 if (Frame
.CompactUnwindEncoding
== 0) continue;
1794 if (!SectionEmitted
) {
1795 Streamer
.SwitchSection(MOFI
->getCompactUnwindSection());
1796 Streamer
.EmitValueToAlignment(AsmInfo
->getCodePointerSize());
1797 SectionEmitted
= true;
1799 NeedsEHFrameSection
|=
1800 Frame
.CompactUnwindEncoding
==
1801 MOFI
->getCompactUnwindDwarfEHFrameOnly();
1802 Emitter
.EmitCompactUnwind(Frame
);
1806 if (!NeedsEHFrameSection
) return;
1808 MCSection
&Section
=
1809 IsEH
? *const_cast<MCObjectFileInfo
*>(MOFI
)->getEHFrameSection()
1810 : *MOFI
->getDwarfFrameSection();
1812 Streamer
.SwitchSection(&Section
);
1813 MCSymbol
*SectionStart
= Context
.createTempSymbol();
1814 Streamer
.EmitLabel(SectionStart
);
1816 DenseMap
<CIEKey
, const MCSymbol
*> CIEStarts
;
1818 const MCSymbol
*DummyDebugKey
= nullptr;
1819 bool CanOmitDwarf
= MOFI
->getOmitDwarfIfHaveCompactUnwind();
1820 for (auto I
= FrameArray
.begin(), E
= FrameArray
.end(); I
!= E
;) {
1821 const MCDwarfFrameInfo
&Frame
= *I
;
1823 if (CanOmitDwarf
&& Frame
.CompactUnwindEncoding
!=
1824 MOFI
->getCompactUnwindDwarfEHFrameOnly())
1825 // Don't generate an EH frame if we don't need one. I.e., it's taken care
1826 // of by the compact unwind encoding.
1830 const MCSymbol
*&CIEStart
= IsEH
? CIEStarts
[Key
] : DummyDebugKey
;
1832 CIEStart
= &Emitter
.EmitCIE(Frame
);
1834 Emitter
.EmitFDE(*CIEStart
, Frame
, I
== E
, *SectionStart
);
1838 void MCDwarfFrameEmitter::EmitAdvanceLoc(MCObjectStreamer
&Streamer
,
1839 uint64_t AddrDelta
) {
1840 MCContext
&Context
= Streamer
.getContext();
1841 SmallString
<256> Tmp
;
1842 raw_svector_ostream
OS(Tmp
);
1843 MCDwarfFrameEmitter::EncodeAdvanceLoc(Context
, AddrDelta
, OS
);
1844 Streamer
.EmitBytes(OS
.str());
1847 void MCDwarfFrameEmitter::EncodeAdvanceLoc(MCContext
&Context
,
1850 // Scale the address delta by the minimum instruction length.
1851 AddrDelta
= ScaleAddrDelta(Context
, AddrDelta
);
1853 support::endianness E
=
1854 Context
.getAsmInfo()->isLittleEndian() ? support::little
: support::big
;
1855 if (AddrDelta
== 0) {
1856 } else if (isUIntN(6, AddrDelta
)) {
1857 uint8_t Opcode
= dwarf::DW_CFA_advance_loc
| AddrDelta
;
1859 } else if (isUInt
<8>(AddrDelta
)) {
1860 OS
<< uint8_t(dwarf::DW_CFA_advance_loc1
);
1861 OS
<< uint8_t(AddrDelta
);
1862 } else if (isUInt
<16>(AddrDelta
)) {
1863 OS
<< uint8_t(dwarf::DW_CFA_advance_loc2
);
1864 support::endian::write
<uint16_t>(OS
, AddrDelta
, E
);
1866 assert(isUInt
<32>(AddrDelta
));
1867 OS
<< uint8_t(dwarf::DW_CFA_advance_loc4
);
1868 support::endian::write
<uint32_t>(OS
, AddrDelta
, E
);