xref: /llvm-project/bolt/lib/Core/BinaryEmitter.cpp (revision fed958c6cc596e53971fca0e884b33483a85c12e)
1 //===- bolt/Core/BinaryEmitter.cpp - Emit code and data -------------------===//
2 //
3 // 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
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the collection of functions and classes used for
10 // emission of code and data into object/binary file.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "bolt/Core/BinaryEmitter.h"
15 #include "bolt/Core/BinaryContext.h"
16 #include "bolt/Core/BinaryFunction.h"
17 #include "bolt/Core/DebugData.h"
18 #include "bolt/Utils/CommandLineOpts.h"
19 #include "bolt/Utils/Utils.h"
20 #include "llvm/DebugInfo/DWARF/DWARFCompileUnit.h"
21 #include "llvm/MC/MCSection.h"
22 #include "llvm/MC/MCStreamer.h"
23 #include "llvm/Support/CommandLine.h"
24 #include "llvm/Support/LEB128.h"
25 #include "llvm/Support/SMLoc.h"
26 
27 #define DEBUG_TYPE "bolt"
28 
29 using namespace llvm;
30 using namespace bolt;
31 
32 namespace opts {
33 
34 extern cl::opt<JumpTableSupportLevel> JumpTables;
35 extern cl::opt<bool> PreserveBlocksAlignment;
36 
37 cl::opt<bool>
38 AlignBlocks("align-blocks",
39   cl::desc("align basic blocks"),
40   cl::init(false),
41   cl::ZeroOrMore,
42   cl::cat(BoltOptCategory));
43 
44 cl::opt<MacroFusionType>
45 AlignMacroOpFusion("align-macro-fusion",
46   cl::desc("fix instruction alignment for macro-fusion (x86 relocation mode)"),
47   cl::init(MFT_HOT),
48   cl::values(clEnumValN(MFT_NONE, "none",
49                "do not insert alignment no-ops for macro-fusion"),
50              clEnumValN(MFT_HOT, "hot",
51                "only insert alignment no-ops on hot execution paths (default)"),
52              clEnumValN(MFT_ALL, "all",
53                "always align instructions to allow macro-fusion")),
54   cl::ZeroOrMore,
55   cl::cat(BoltRelocCategory));
56 
57 static cl::list<std::string>
58 BreakFunctionNames("break-funcs",
59   cl::CommaSeparated,
60   cl::desc("list of functions to core dump on (debugging)"),
61   cl::value_desc("func1,func2,func3,..."),
62   cl::Hidden,
63   cl::cat(BoltCategory));
64 
65 static cl::list<std::string>
66 FunctionPadSpec("pad-funcs",
67   cl::CommaSeparated,
68   cl::desc("list of functions to pad with amount of bytes"),
69   cl::value_desc("func1:pad1,func2:pad2,func3:pad3,..."),
70   cl::Hidden,
71   cl::cat(BoltCategory));
72 
73 static cl::opt<bool>
74 MarkFuncs("mark-funcs",
75   cl::desc("mark function boundaries with break instruction to make "
76            "sure we accidentally don't cross them"),
77   cl::ReallyHidden,
78   cl::ZeroOrMore,
79   cl::cat(BoltCategory));
80 
81 static cl::opt<bool>
82 PrintJumpTables("print-jump-tables",
83   cl::desc("print jump tables"),
84   cl::ZeroOrMore,
85   cl::Hidden,
86   cl::cat(BoltCategory));
87 
88 static cl::opt<bool>
89 X86AlignBranchBoundaryHotOnly("x86-align-branch-boundary-hot-only",
90   cl::desc("only apply branch boundary alignment in hot code"),
91   cl::init(true),
92   cl::cat(BoltOptCategory));
93 
94 size_t padFunction(const BinaryFunction &Function) {
95   static std::map<std::string, size_t> FunctionPadding;
96 
97   if (FunctionPadding.empty() && !FunctionPadSpec.empty()) {
98     for (std::string &Spec : FunctionPadSpec) {
99       size_t N = Spec.find(':');
100       if (N == std::string::npos)
101         continue;
102       std::string Name = Spec.substr(0, N);
103       size_t Padding = std::stoull(Spec.substr(N + 1));
104       FunctionPadding[Name] = Padding;
105     }
106   }
107 
108   for (auto &FPI : FunctionPadding) {
109     std::string Name = FPI.first;
110     size_t Padding = FPI.second;
111     if (Function.hasNameRegex(Name))
112       return Padding;
113   }
114 
115   return 0;
116 }
117 
118 } // namespace opts
119 
120 namespace {
121 using JumpTable = bolt::JumpTable;
122 
123 class BinaryEmitter {
124 private:
125   BinaryEmitter(const BinaryEmitter &) = delete;
126   BinaryEmitter &operator=(const BinaryEmitter &) = delete;
127 
128   MCStreamer &Streamer;
129   BinaryContext &BC;
130 
131 public:
132   BinaryEmitter(MCStreamer &Streamer, BinaryContext &BC)
133       : Streamer(Streamer), BC(BC) {}
134 
135   /// Emit all code and data.
136   void emitAll(StringRef OrgSecPrefix);
137 
138   /// Emit function code. The caller is responsible for emitting function
139   /// symbol(s) and setting the section to emit the code to.
140   void emitFunctionBody(BinaryFunction &BF, bool EmitColdPart,
141                         bool EmitCodeOnly = false);
142 
143 private:
144   /// Emit function code.
145   void emitFunctions();
146 
147   /// Emit a single function.
148   bool emitFunction(BinaryFunction &BF, bool EmitColdPart);
149 
150   /// Helper for emitFunctionBody to write data inside a function
151   /// (used for AArch64)
152   void emitConstantIslands(BinaryFunction &BF, bool EmitColdPart,
153                            BinaryFunction *OnBehalfOf = nullptr);
154 
155   /// Emit jump tables for the function.
156   void emitJumpTables(const BinaryFunction &BF);
157 
158   /// Emit jump table data. Callee supplies sections for the data.
159   void emitJumpTable(const JumpTable &JT, MCSection *HotSection,
160                      MCSection *ColdSection);
161 
162   void emitCFIInstruction(const MCCFIInstruction &Inst) const;
163 
164   /// Emit exception handling ranges for the function.
165   void emitLSDA(BinaryFunction &BF, bool EmitColdPart);
166 
167   /// Emit line number information corresponding to \p NewLoc. \p PrevLoc
168   /// provides a context for de-duplication of line number info.
169   /// \p FirstInstr indicates if \p NewLoc represents the first instruction
170   /// in a sequence, such as a function fragment.
171   ///
172   /// Return new current location which is either \p NewLoc or \p PrevLoc.
173   SMLoc emitLineInfo(const BinaryFunction &BF, SMLoc NewLoc, SMLoc PrevLoc,
174                      bool FirstInstr);
175 
176   /// Use \p FunctionEndSymbol to mark the end of the line info sequence.
177   /// Note that it does not automatically result in the insertion of the EOS
178   /// marker in the line table program, but provides one to the DWARF generator
179   /// when it needs it.
180   void emitLineInfoEnd(const BinaryFunction &BF, MCSymbol *FunctionEndSymbol);
181 
182   /// Emit debug line info for unprocessed functions from CUs that include
183   /// emitted functions.
184   void emitDebugLineInfoForOriginalFunctions();
185 
186   /// Emit debug line for CUs that were not modified.
187   void emitDebugLineInfoForUnprocessedCUs();
188 
189   /// Emit data sections that have code references in them.
190   void emitDataSections(StringRef OrgSecPrefix);
191 };
192 
193 } // anonymous namespace
194 
195 void BinaryEmitter::emitAll(StringRef OrgSecPrefix) {
196   Streamer.initSections(false, *BC.STI);
197 
198   if (opts::UpdateDebugSections && BC.isELF()) {
199     // Force the emission of debug line info into allocatable section to ensure
200     // RuntimeDyld will process it without ProcessAllSections flag.
201     //
202     // NB: on MachO all sections are required for execution, hence no need
203     //     to change flags/attributes.
204     MCSectionELF *ELFDwarfLineSection =
205         static_cast<MCSectionELF *>(BC.MOFI->getDwarfLineSection());
206     ELFDwarfLineSection->setFlags(ELF::SHF_ALLOC);
207   }
208 
209   if (RuntimeLibrary *RtLibrary = BC.getRuntimeLibrary())
210     RtLibrary->emitBinary(BC, Streamer);
211 
212   BC.getTextSection()->setAlignment(Align(opts::AlignText));
213 
214   emitFunctions();
215 
216   if (opts::UpdateDebugSections) {
217     emitDebugLineInfoForOriginalFunctions();
218     DwarfLineTable::emit(BC, Streamer);
219   }
220 
221   emitDataSections(OrgSecPrefix);
222 
223   Streamer.emitLabel(BC.Ctx->getOrCreateSymbol("_end"));
224 }
225 
226 void BinaryEmitter::emitFunctions() {
227   auto emit = [&](const std::vector<BinaryFunction *> &Functions) {
228     const bool HasProfile = BC.NumProfiledFuncs > 0;
229     const bool OriginalAllowAutoPadding = Streamer.getAllowAutoPadding();
230     for (BinaryFunction *Function : Functions) {
231       if (!BC.shouldEmit(*Function))
232         continue;
233 
234       LLVM_DEBUG(dbgs() << "BOLT: generating code for function \"" << *Function
235                         << "\" : " << Function->getFunctionNumber() << '\n');
236 
237       // Was any part of the function emitted.
238       bool Emitted = false;
239 
240       // Turn off Intel JCC Erratum mitigation for cold code if requested
241       if (HasProfile && opts::X86AlignBranchBoundaryHotOnly &&
242           !Function->hasValidProfile())
243         Streamer.setAllowAutoPadding(false);
244 
245       Emitted |= emitFunction(*Function, /*EmitColdPart=*/false);
246 
247       if (Function->isSplit()) {
248         if (opts::X86AlignBranchBoundaryHotOnly)
249           Streamer.setAllowAutoPadding(false);
250         Emitted |= emitFunction(*Function, /*EmitColdPart=*/true);
251       }
252       Streamer.setAllowAutoPadding(OriginalAllowAutoPadding);
253 
254       if (Emitted)
255         Function->setEmitted(/*KeepCFG=*/opts::PrintCacheMetrics);
256     }
257   };
258 
259   // Mark the start of hot text.
260   if (opts::HotText) {
261     Streamer.SwitchSection(BC.getTextSection());
262     Streamer.emitLabel(BC.getHotTextStartSymbol());
263   }
264 
265   // Emit functions in sorted order.
266   std::vector<BinaryFunction *> SortedFunctions = BC.getSortedFunctions();
267   emit(SortedFunctions);
268 
269   // Emit functions added by BOLT.
270   emit(BC.getInjectedBinaryFunctions());
271 
272   // Mark the end of hot text.
273   if (opts::HotText) {
274     Streamer.SwitchSection(BC.getTextSection());
275     Streamer.emitLabel(BC.getHotTextEndSymbol());
276   }
277 }
278 
279 bool BinaryEmitter::emitFunction(BinaryFunction &Function, bool EmitColdPart) {
280   if (Function.size() == 0 && !Function.hasIslandsInfo())
281     return false;
282 
283   if (Function.getState() == BinaryFunction::State::Empty)
284     return false;
285 
286   MCSection *Section =
287       BC.getCodeSection(EmitColdPart ? Function.getColdCodeSectionName()
288                                      : Function.getCodeSectionName());
289   Streamer.SwitchSection(Section);
290   Section->setHasInstructions(true);
291   BC.Ctx->addGenDwarfSection(Section);
292 
293   if (BC.HasRelocations) {
294     // Set section alignment to at least maximum possible object alignment.
295     // We need this to support LongJmp and other passes that calculates
296     // tentative layout.
297     if (Section->getAlignment() < opts::AlignFunctions)
298       Section->setAlignment(Align(opts::AlignFunctions));
299 
300     Streamer.emitCodeAlignment(BinaryFunction::MinAlign, &*BC.STI);
301     uint16_t MaxAlignBytes = EmitColdPart ? Function.getMaxColdAlignmentBytes()
302                                           : Function.getMaxAlignmentBytes();
303     if (MaxAlignBytes > 0)
304       Streamer.emitCodeAlignment(Function.getAlignment(), &*BC.STI,
305                                  MaxAlignBytes);
306   } else {
307     Streamer.emitCodeAlignment(Function.getAlignment(), &*BC.STI);
308   }
309 
310   MCContext &Context = Streamer.getContext();
311   const MCAsmInfo *MAI = Context.getAsmInfo();
312 
313   MCSymbol *StartSymbol = nullptr;
314 
315   // Emit all symbols associated with the main function entry.
316   if (!EmitColdPart) {
317     StartSymbol = Function.getSymbol();
318     for (MCSymbol *Symbol : Function.getSymbols()) {
319       Streamer.emitSymbolAttribute(Symbol, MCSA_ELF_TypeFunction);
320       Streamer.emitLabel(Symbol);
321     }
322   } else {
323     StartSymbol = Function.getColdSymbol();
324     Streamer.emitSymbolAttribute(StartSymbol, MCSA_ELF_TypeFunction);
325     Streamer.emitLabel(StartSymbol);
326   }
327 
328   // Emit CFI start
329   if (Function.hasCFI()) {
330     Streamer.emitCFIStartProc(/*IsSimple=*/false);
331     if (Function.getPersonalityFunction() != nullptr) {
332       Streamer.emitCFIPersonality(Function.getPersonalityFunction(),
333                                   Function.getPersonalityEncoding());
334     }
335     MCSymbol *LSDASymbol =
336         EmitColdPart ? Function.getColdLSDASymbol() : Function.getLSDASymbol();
337     if (LSDASymbol)
338       Streamer.emitCFILsda(LSDASymbol, BC.LSDAEncoding);
339     else
340       Streamer.emitCFILsda(0, dwarf::DW_EH_PE_omit);
341     // Emit CFI instructions relative to the CIE
342     for (const MCCFIInstruction &CFIInstr : Function.cie()) {
343       // Only write CIE CFI insns that LLVM will not already emit
344       const std::vector<MCCFIInstruction> &FrameInstrs =
345           MAI->getInitialFrameState();
346       if (std::find(FrameInstrs.begin(), FrameInstrs.end(), CFIInstr) ==
347           FrameInstrs.end())
348         emitCFIInstruction(CFIInstr);
349     }
350   }
351 
352   assert((Function.empty() || !(*Function.begin()).isCold()) &&
353          "first basic block should never be cold");
354 
355   // Emit UD2 at the beginning if requested by user.
356   if (!opts::BreakFunctionNames.empty()) {
357     for (std::string &Name : opts::BreakFunctionNames) {
358       if (Function.hasNameRegex(Name)) {
359         Streamer.emitIntValue(0x0B0F, 2); // UD2: 0F 0B
360         break;
361       }
362     }
363   }
364 
365   // Emit code.
366   emitFunctionBody(Function, EmitColdPart, /*EmitCodeOnly=*/false);
367 
368   // Emit padding if requested.
369   if (size_t Padding = opts::padFunction(Function)) {
370     LLVM_DEBUG(dbgs() << "BOLT-DEBUG: padding function " << Function << " with "
371                       << Padding << " bytes\n");
372     Streamer.emitFill(Padding, MAI->getTextAlignFillValue());
373   }
374 
375   if (opts::MarkFuncs)
376     Streamer.emitIntValue(BC.MIB->getTrapFillValue(), 1);
377 
378   // Emit CFI end
379   if (Function.hasCFI())
380     Streamer.emitCFIEndProc();
381 
382   MCSymbol *EndSymbol = EmitColdPart ? Function.getFunctionColdEndLabel()
383                                      : Function.getFunctionEndLabel();
384   Streamer.emitLabel(EndSymbol);
385 
386   if (MAI->hasDotTypeDotSizeDirective()) {
387     const MCExpr *SizeExpr = MCBinaryExpr::createSub(
388         MCSymbolRefExpr::create(EndSymbol, Context),
389         MCSymbolRefExpr::create(StartSymbol, Context), Context);
390     Streamer.emitELFSize(StartSymbol, SizeExpr);
391   }
392 
393   if (opts::UpdateDebugSections && Function.getDWARFUnit())
394     emitLineInfoEnd(Function, EndSymbol);
395 
396   // Exception handling info for the function.
397   emitLSDA(Function, EmitColdPart);
398 
399   if (!EmitColdPart && opts::JumpTables > JTS_NONE)
400     emitJumpTables(Function);
401 
402   return true;
403 }
404 
405 void BinaryEmitter::emitFunctionBody(BinaryFunction &BF, bool EmitColdPart,
406                                      bool EmitCodeOnly) {
407   if (!EmitCodeOnly && EmitColdPart && BF.hasConstantIsland())
408     BF.duplicateConstantIslands();
409 
410   // Track the first emitted instruction with debug info.
411   bool FirstInstr = true;
412   for (BinaryBasicBlock *BB : BF.layout()) {
413     if (EmitColdPart != BB->isCold())
414       continue;
415 
416     if ((opts::AlignBlocks || opts::PreserveBlocksAlignment) &&
417         BB->getAlignment() > 1) {
418       Streamer.emitCodeAlignment(BB->getAlignment(), &*BC.STI,
419                                  BB->getAlignmentMaxBytes());
420     }
421     Streamer.emitLabel(BB->getLabel());
422     if (!EmitCodeOnly) {
423       if (MCSymbol *EntrySymbol = BF.getSecondaryEntryPointSymbol(*BB))
424         Streamer.emitLabel(EntrySymbol);
425     }
426 
427     // Check if special alignment for macro-fusion is needed.
428     bool MayNeedMacroFusionAlignment =
429         (opts::AlignMacroOpFusion == MFT_ALL) ||
430         (opts::AlignMacroOpFusion == MFT_HOT && BB->getKnownExecutionCount());
431     BinaryBasicBlock::const_iterator MacroFusionPair;
432     if (MayNeedMacroFusionAlignment) {
433       MacroFusionPair = BB->getMacroOpFusionPair();
434       if (MacroFusionPair == BB->end())
435         MayNeedMacroFusionAlignment = false;
436     }
437 
438     SMLoc LastLocSeen;
439     // Remember if the last instruction emitted was a prefix.
440     bool LastIsPrefix = false;
441     for (auto I = BB->begin(), E = BB->end(); I != E; ++I) {
442       MCInst &Instr = *I;
443 
444       if (EmitCodeOnly && BC.MIB->isPseudo(Instr))
445         continue;
446 
447       // Handle pseudo instructions.
448       if (BC.MIB->isEHLabel(Instr)) {
449         const MCSymbol *Label = BC.MIB->getTargetSymbol(Instr);
450         assert(Instr.getNumOperands() >= 1 && Label &&
451                "bad EH_LABEL instruction");
452         Streamer.emitLabel(const_cast<MCSymbol *>(Label));
453         continue;
454       }
455       if (BC.MIB->isCFI(Instr)) {
456         emitCFIInstruction(*BF.getCFIFor(Instr));
457         continue;
458       }
459 
460       // Handle macro-fusion alignment. If we emitted a prefix as
461       // the last instruction, we should've already emitted the associated
462       // alignment hint, so don't emit it twice.
463       if (MayNeedMacroFusionAlignment && !LastIsPrefix &&
464           I == MacroFusionPair) {
465         // This assumes the second instruction in the macro-op pair will get
466         // assigned to its own MCRelaxableFragment. Since all JCC instructions
467         // are relaxable, we should be safe.
468       }
469 
470       if (!EmitCodeOnly && opts::UpdateDebugSections && BF.getDWARFUnit()) {
471         LastLocSeen = emitLineInfo(BF, Instr.getLoc(), LastLocSeen, FirstInstr);
472         FirstInstr = false;
473       }
474 
475       // Prepare to tag this location with a label if we need to keep track of
476       // the location of calls/returns for BOLT address translation maps
477       if (!EmitCodeOnly && BF.requiresAddressTranslation() &&
478           BC.MIB->getOffset(Instr)) {
479         const uint32_t Offset = *BC.MIB->getOffset(Instr);
480         MCSymbol *LocSym = BC.Ctx->createTempSymbol();
481         Streamer.emitLabel(LocSym);
482         BB->getLocSyms().emplace_back(Offset, LocSym);
483       }
484 
485       Streamer.emitInstruction(Instr, *BC.STI);
486       LastIsPrefix = BC.MIB->isPrefix(Instr);
487     }
488   }
489 
490   if (!EmitCodeOnly)
491     emitConstantIslands(BF, EmitColdPart);
492 }
493 
494 void BinaryEmitter::emitConstantIslands(BinaryFunction &BF, bool EmitColdPart,
495                                         BinaryFunction *OnBehalfOf) {
496   if (!BF.hasIslandsInfo())
497     return;
498 
499   BinaryFunction::IslandInfo &Islands = BF.getIslandInfo();
500   if (Islands.DataOffsets.empty() && Islands.Dependency.empty())
501     return;
502 
503   // AArch64 requires CI to be aligned to 8 bytes due to access instructions
504   // restrictions. E.g. the ldr with imm, where imm must be aligned to 8 bytes.
505   const uint16_t Alignment = OnBehalfOf
506                                  ? OnBehalfOf->getConstantIslandAlignment()
507                                  : BF.getConstantIslandAlignment();
508   Streamer.emitCodeAlignment(Alignment, &*BC.STI);
509 
510   if (!OnBehalfOf) {
511     if (!EmitColdPart)
512       Streamer.emitLabel(BF.getFunctionConstantIslandLabel());
513     else
514       Streamer.emitLabel(BF.getFunctionColdConstantIslandLabel());
515   }
516 
517   assert((!OnBehalfOf || Islands.Proxies[OnBehalfOf].size() > 0) &&
518          "spurious OnBehalfOf constant island emission");
519 
520   assert(!BF.isInjected() &&
521          "injected functions should not have constant islands");
522   // Raw contents of the function.
523   StringRef SectionContents = BF.getOriginSection()->getContents();
524 
525   // Raw contents of the function.
526   StringRef FunctionContents = SectionContents.substr(
527       BF.getAddress() - BF.getOriginSection()->getAddress(), BF.getMaxSize());
528 
529   if (opts::Verbosity && !OnBehalfOf)
530     outs() << "BOLT-INFO: emitting constant island for function " << BF << "\n";
531 
532   // We split the island into smaller blocks and output labels between them.
533   auto IS = Islands.Offsets.begin();
534   for (auto DataIter = Islands.DataOffsets.begin();
535        DataIter != Islands.DataOffsets.end(); ++DataIter) {
536     uint64_t FunctionOffset = *DataIter;
537     uint64_t EndOffset = 0ULL;
538 
539     // Determine size of this data chunk
540     auto NextData = std::next(DataIter);
541     auto CodeIter = Islands.CodeOffsets.lower_bound(*DataIter);
542     if (CodeIter == Islands.CodeOffsets.end() &&
543         NextData == Islands.DataOffsets.end()) {
544       EndOffset = BF.getMaxSize();
545     } else if (CodeIter == Islands.CodeOffsets.end()) {
546       EndOffset = *NextData;
547     } else if (NextData == Islands.DataOffsets.end()) {
548       EndOffset = *CodeIter;
549     } else {
550       EndOffset = (*CodeIter > *NextData) ? *NextData : *CodeIter;
551     }
552 
553     if (FunctionOffset == EndOffset)
554       continue; // Size is zero, nothing to emit
555 
556     auto emitCI = [&](uint64_t &FunctionOffset, uint64_t EndOffset) {
557       if (FunctionOffset >= EndOffset)
558         return;
559 
560       for (auto It = Islands.Relocations.lower_bound(FunctionOffset);
561            It != Islands.Relocations.end(); ++It) {
562         if (It->first >= EndOffset)
563           break;
564 
565         const Relocation &Relocation = It->second;
566         if (FunctionOffset < Relocation.Offset) {
567           Streamer.emitBytes(
568               FunctionContents.slice(FunctionOffset, Relocation.Offset));
569           FunctionOffset = Relocation.Offset;
570         }
571 
572         LLVM_DEBUG(
573             dbgs() << "BOLT-DEBUG: emitting constant island relocation"
574                    << " for " << BF << " at offset 0x"
575                    << Twine::utohexstr(Relocation.Offset) << " with size "
576                    << Relocation::getSizeForType(Relocation.Type) << '\n');
577 
578         FunctionOffset += Relocation.emit(&Streamer);
579       }
580 
581       assert(FunctionOffset <= EndOffset && "overflow error");
582       if (FunctionOffset < EndOffset) {
583         Streamer.emitBytes(FunctionContents.slice(FunctionOffset, EndOffset));
584         FunctionOffset = EndOffset;
585       }
586     };
587 
588     // Emit labels, relocs and data
589     while (IS != Islands.Offsets.end() && IS->first < EndOffset) {
590       auto NextLabelOffset =
591           IS == Islands.Offsets.end() ? EndOffset : IS->first;
592       auto NextStop = std::min(NextLabelOffset, EndOffset);
593       assert(NextStop <= EndOffset && "internal overflow error");
594       emitCI(FunctionOffset, NextStop);
595       if (IS != Islands.Offsets.end() && FunctionOffset == IS->first) {
596         // This is a slightly complex code to decide which label to emit. We
597         // have 4 cases to handle: regular symbol, cold symbol, regular or cold
598         // symbol being emitted on behalf of an external function.
599         if (!OnBehalfOf) {
600           if (!EmitColdPart) {
601             LLVM_DEBUG(dbgs() << "BOLT-DEBUG: emitted label "
602                               << IS->second->getName() << " at offset 0x"
603                               << Twine::utohexstr(IS->first) << '\n');
604             if (IS->second->isUndefined())
605               Streamer.emitLabel(IS->second);
606             else
607               assert(BF.hasName(std::string(IS->second->getName())));
608           } else if (Islands.ColdSymbols.count(IS->second) != 0) {
609             LLVM_DEBUG(dbgs()
610                        << "BOLT-DEBUG: emitted label "
611                        << Islands.ColdSymbols[IS->second]->getName() << '\n');
612             if (Islands.ColdSymbols[IS->second]->isUndefined())
613               Streamer.emitLabel(Islands.ColdSymbols[IS->second]);
614           }
615         } else {
616           if (!EmitColdPart) {
617             if (MCSymbol *Sym = Islands.Proxies[OnBehalfOf][IS->second]) {
618               LLVM_DEBUG(dbgs() << "BOLT-DEBUG: emitted label "
619                                 << Sym->getName() << '\n');
620               Streamer.emitLabel(Sym);
621             }
622           } else if (MCSymbol *Sym =
623                          Islands.ColdProxies[OnBehalfOf][IS->second]) {
624             LLVM_DEBUG(dbgs() << "BOLT-DEBUG: emitted label " << Sym->getName()
625                               << '\n');
626             Streamer.emitLabel(Sym);
627           }
628         }
629         ++IS;
630       }
631     }
632     assert(FunctionOffset <= EndOffset && "overflow error");
633     emitCI(FunctionOffset, EndOffset);
634   }
635   assert(IS == Islands.Offsets.end() && "some symbols were not emitted!");
636 
637   if (OnBehalfOf)
638     return;
639   // Now emit constant islands from other functions that we may have used in
640   // this function.
641   for (BinaryFunction *ExternalFunc : Islands.Dependency)
642     emitConstantIslands(*ExternalFunc, EmitColdPart, &BF);
643 }
644 
645 SMLoc BinaryEmitter::emitLineInfo(const BinaryFunction &BF, SMLoc NewLoc,
646                                   SMLoc PrevLoc, bool FirstInstr) {
647   DWARFUnit *FunctionCU = BF.getDWARFUnit();
648   const DWARFDebugLine::LineTable *FunctionLineTable = BF.getDWARFLineTable();
649   assert(FunctionCU && "cannot emit line info for function without CU");
650 
651   DebugLineTableRowRef RowReference = DebugLineTableRowRef::fromSMLoc(NewLoc);
652 
653   // Check if no new line info needs to be emitted.
654   if (RowReference == DebugLineTableRowRef::NULL_ROW ||
655       NewLoc.getPointer() == PrevLoc.getPointer())
656     return PrevLoc;
657 
658   unsigned CurrentFilenum = 0;
659   const DWARFDebugLine::LineTable *CurrentLineTable = FunctionLineTable;
660 
661   // If the CU id from the current instruction location does not
662   // match the CU id from the current function, it means that we
663   // have come across some inlined code.  We must look up the CU
664   // for the instruction's original function and get the line table
665   // from that.
666   const uint64_t FunctionUnitIndex = FunctionCU->getOffset();
667   const uint32_t CurrentUnitIndex = RowReference.DwCompileUnitIndex;
668   if (CurrentUnitIndex != FunctionUnitIndex) {
669     CurrentLineTable = BC.DwCtx->getLineTableForUnit(
670         BC.DwCtx->getCompileUnitForOffset(CurrentUnitIndex));
671     // Add filename from the inlined function to the current CU.
672     CurrentFilenum = BC.addDebugFilenameToUnit(
673         FunctionUnitIndex, CurrentUnitIndex,
674         CurrentLineTable->Rows[RowReference.RowIndex - 1].File);
675   }
676 
677   const DWARFDebugLine::Row &CurrentRow =
678       CurrentLineTable->Rows[RowReference.RowIndex - 1];
679   if (!CurrentFilenum)
680     CurrentFilenum = CurrentRow.File;
681 
682   unsigned Flags = (DWARF2_FLAG_IS_STMT * CurrentRow.IsStmt) |
683                    (DWARF2_FLAG_BASIC_BLOCK * CurrentRow.BasicBlock) |
684                    (DWARF2_FLAG_PROLOGUE_END * CurrentRow.PrologueEnd) |
685                    (DWARF2_FLAG_EPILOGUE_BEGIN * CurrentRow.EpilogueBegin);
686 
687   // Always emit is_stmt at the beginning of function fragment.
688   if (FirstInstr)
689     Flags |= DWARF2_FLAG_IS_STMT;
690 
691   BC.Ctx->setCurrentDwarfLoc(CurrentFilenum, CurrentRow.Line, CurrentRow.Column,
692                              Flags, CurrentRow.Isa, CurrentRow.Discriminator);
693   const MCDwarfLoc &DwarfLoc = BC.Ctx->getCurrentDwarfLoc();
694   BC.Ctx->clearDwarfLocSeen();
695 
696   MCSymbol *LineSym = BC.Ctx->createTempSymbol();
697   Streamer.emitLabel(LineSym);
698 
699   BC.getDwarfLineTable(FunctionUnitIndex)
700       .getMCLineSections()
701       .addLineEntry(MCDwarfLineEntry(LineSym, DwarfLoc),
702                     Streamer.getCurrentSectionOnly());
703 
704   return NewLoc;
705 }
706 
707 void BinaryEmitter::emitLineInfoEnd(const BinaryFunction &BF,
708                                     MCSymbol *FunctionEndLabel) {
709   DWARFUnit *FunctionCU = BF.getDWARFUnit();
710   assert(FunctionCU && "DWARF unit expected");
711   BC.Ctx->setCurrentDwarfLoc(0, 0, 0, DWARF2_FLAG_END_SEQUENCE, 0, 0);
712   const MCDwarfLoc &DwarfLoc = BC.Ctx->getCurrentDwarfLoc();
713   BC.Ctx->clearDwarfLocSeen();
714   BC.getDwarfLineTable(FunctionCU->getOffset())
715       .getMCLineSections()
716       .addLineEntry(MCDwarfLineEntry(FunctionEndLabel, DwarfLoc),
717                     Streamer.getCurrentSectionOnly());
718 }
719 
720 void BinaryEmitter::emitJumpTables(const BinaryFunction &BF) {
721   MCSection *ReadOnlySection = BC.MOFI->getReadOnlySection();
722   MCSection *ReadOnlyColdSection = BC.MOFI->getContext().getELFSection(
723       ".rodata.cold", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
724 
725   if (!BF.hasJumpTables())
726     return;
727 
728   if (opts::PrintJumpTables)
729     outs() << "BOLT-INFO: jump tables for function " << BF << ":\n";
730 
731   for (auto &JTI : BF.jumpTables()) {
732     JumpTable &JT = *JTI.second;
733     if (opts::PrintJumpTables)
734       JT.print(outs());
735     if ((opts::JumpTables == JTS_BASIC || !BF.isSimple()) &&
736         BC.HasRelocations) {
737       JT.updateOriginal();
738     } else {
739       MCSection *HotSection, *ColdSection;
740       if (opts::JumpTables == JTS_BASIC) {
741         // In non-relocation mode we have to emit jump tables in local sections.
742         // This way we only overwrite them when the corresponding function is
743         // overwritten.
744         std::string Name = ".local." + JT.Labels[0]->getName().str();
745         std::replace(Name.begin(), Name.end(), '/', '.');
746         BinarySection &Section =
747             BC.registerOrUpdateSection(Name, ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
748         Section.setAnonymous(true);
749         JT.setOutputSection(Section);
750         HotSection = BC.getDataSection(Name);
751         ColdSection = HotSection;
752       } else {
753         if (BF.isSimple()) {
754           HotSection = ReadOnlySection;
755           ColdSection = ReadOnlyColdSection;
756         } else {
757           HotSection = BF.hasProfile() ? ReadOnlySection : ReadOnlyColdSection;
758           ColdSection = HotSection;
759         }
760       }
761       emitJumpTable(JT, HotSection, ColdSection);
762     }
763   }
764 }
765 
766 void BinaryEmitter::emitJumpTable(const JumpTable &JT, MCSection *HotSection,
767                                   MCSection *ColdSection) {
768   // Pre-process entries for aggressive splitting.
769   // Each label represents a separate switch table and gets its own count
770   // determining its destination.
771   std::map<MCSymbol *, uint64_t> LabelCounts;
772   if (opts::JumpTables > JTS_SPLIT && !JT.Counts.empty()) {
773     MCSymbol *CurrentLabel = JT.Labels.at(0);
774     uint64_t CurrentLabelCount = 0;
775     for (unsigned Index = 0; Index < JT.Entries.size(); ++Index) {
776       auto LI = JT.Labels.find(Index * JT.EntrySize);
777       if (LI != JT.Labels.end()) {
778         LabelCounts[CurrentLabel] = CurrentLabelCount;
779         CurrentLabel = LI->second;
780         CurrentLabelCount = 0;
781       }
782       CurrentLabelCount += JT.Counts[Index].Count;
783     }
784     LabelCounts[CurrentLabel] = CurrentLabelCount;
785   } else {
786     Streamer.SwitchSection(JT.Count > 0 ? HotSection : ColdSection);
787     Streamer.emitValueToAlignment(JT.EntrySize);
788   }
789   MCSymbol *LastLabel = nullptr;
790   uint64_t Offset = 0;
791   for (MCSymbol *Entry : JT.Entries) {
792     auto LI = JT.Labels.find(Offset);
793     if (LI != JT.Labels.end()) {
794       LLVM_DEBUG(dbgs() << "BOLT-DEBUG: emitting jump table "
795                         << LI->second->getName()
796                         << " (originally was at address 0x"
797                         << Twine::utohexstr(JT.getAddress() + Offset)
798                         << (Offset ? "as part of larger jump table\n" : "\n"));
799       if (!LabelCounts.empty()) {
800         LLVM_DEBUG(dbgs() << "BOLT-DEBUG: jump table count: "
801                           << LabelCounts[LI->second] << '\n');
802         if (LabelCounts[LI->second] > 0)
803           Streamer.SwitchSection(HotSection);
804         else
805           Streamer.SwitchSection(ColdSection);
806         Streamer.emitValueToAlignment(JT.EntrySize);
807       }
808       Streamer.emitLabel(LI->second);
809       LastLabel = LI->second;
810     }
811     if (JT.Type == JumpTable::JTT_NORMAL) {
812       Streamer.emitSymbolValue(Entry, JT.OutputEntrySize);
813     } else { // JTT_PIC
814       const MCSymbolRefExpr *JTExpr =
815           MCSymbolRefExpr::create(LastLabel, Streamer.getContext());
816       const MCSymbolRefExpr *E =
817           MCSymbolRefExpr::create(Entry, Streamer.getContext());
818       const MCBinaryExpr *Value =
819           MCBinaryExpr::createSub(E, JTExpr, Streamer.getContext());
820       Streamer.emitValue(Value, JT.EntrySize);
821     }
822     Offset += JT.EntrySize;
823   }
824 }
825 
826 void BinaryEmitter::emitCFIInstruction(const MCCFIInstruction &Inst) const {
827   switch (Inst.getOperation()) {
828   default:
829     llvm_unreachable("Unexpected instruction");
830   case MCCFIInstruction::OpDefCfaOffset:
831     Streamer.emitCFIDefCfaOffset(Inst.getOffset());
832     break;
833   case MCCFIInstruction::OpAdjustCfaOffset:
834     Streamer.emitCFIAdjustCfaOffset(Inst.getOffset());
835     break;
836   case MCCFIInstruction::OpDefCfa:
837     Streamer.emitCFIDefCfa(Inst.getRegister(), Inst.getOffset());
838     break;
839   case MCCFIInstruction::OpDefCfaRegister:
840     Streamer.emitCFIDefCfaRegister(Inst.getRegister());
841     break;
842   case MCCFIInstruction::OpOffset:
843     Streamer.emitCFIOffset(Inst.getRegister(), Inst.getOffset());
844     break;
845   case MCCFIInstruction::OpRegister:
846     Streamer.emitCFIRegister(Inst.getRegister(), Inst.getRegister2());
847     break;
848   case MCCFIInstruction::OpWindowSave:
849     Streamer.emitCFIWindowSave();
850     break;
851   case MCCFIInstruction::OpNegateRAState:
852     Streamer.emitCFINegateRAState();
853     break;
854   case MCCFIInstruction::OpSameValue:
855     Streamer.emitCFISameValue(Inst.getRegister());
856     break;
857   case MCCFIInstruction::OpGnuArgsSize:
858     Streamer.emitCFIGnuArgsSize(Inst.getOffset());
859     break;
860   case MCCFIInstruction::OpEscape:
861     Streamer.AddComment(Inst.getComment());
862     Streamer.emitCFIEscape(Inst.getValues());
863     break;
864   case MCCFIInstruction::OpRestore:
865     Streamer.emitCFIRestore(Inst.getRegister());
866     break;
867   case MCCFIInstruction::OpUndefined:
868     Streamer.emitCFIUndefined(Inst.getRegister());
869     break;
870   }
871 }
872 
873 // The code is based on EHStreamer::emitExceptionTable().
874 void BinaryEmitter::emitLSDA(BinaryFunction &BF, bool EmitColdPart) {
875   const BinaryFunction::CallSitesType *Sites =
876       EmitColdPart ? &BF.getColdCallSites() : &BF.getCallSites();
877   if (Sites->empty()) {
878     return;
879   }
880 
881   // Calculate callsite table size. Size of each callsite entry is:
882   //
883   //  sizeof(start) + sizeof(length) + sizeof(LP) + sizeof(uleb128(action))
884   //
885   // or
886   //
887   //  sizeof(dwarf::DW_EH_PE_data4) * 3 + sizeof(uleb128(action))
888   uint64_t CallSiteTableLength = Sites->size() * 4 * 3;
889   for (const BinaryFunction::CallSite &CallSite : *Sites) {
890     CallSiteTableLength += getULEB128Size(CallSite.Action);
891   }
892 
893   Streamer.SwitchSection(BC.MOFI->getLSDASection());
894 
895   const unsigned TTypeEncoding = BC.TTypeEncoding;
896   const unsigned TTypeEncodingSize = BC.getDWARFEncodingSize(TTypeEncoding);
897   const uint16_t TTypeAlignment = 4;
898 
899   // Type tables have to be aligned at 4 bytes.
900   Streamer.emitValueToAlignment(TTypeAlignment);
901 
902   // Emit the LSDA label.
903   MCSymbol *LSDASymbol =
904       EmitColdPart ? BF.getColdLSDASymbol() : BF.getLSDASymbol();
905   assert(LSDASymbol && "no LSDA symbol set");
906   Streamer.emitLabel(LSDASymbol);
907 
908   // Corresponding FDE start.
909   const MCSymbol *StartSymbol =
910       EmitColdPart ? BF.getColdSymbol() : BF.getSymbol();
911 
912   // Emit the LSDA header.
913 
914   // If LPStart is omitted, then the start of the FDE is used as a base for
915   // landing pad displacements. Then if a cold fragment starts with
916   // a landing pad, this means that the first landing pad offset will be 0.
917   // As a result, the exception handling runtime will ignore this landing pad
918   // because zero offset denotes the absence of a landing pad.
919   // For this reason, when the binary has fixed starting address we emit LPStart
920   // as 0 and output the absolute value of the landing pad in the table.
921   //
922   // If the base address can change, we cannot use absolute addresses for
923   // landing pads (at least not without runtime relocations). Hence, we fall
924   // back to emitting landing pads relative to the FDE start.
925   // As we are emitting label differences, we have to guarantee both labels are
926   // defined in the same section and hence cannot place the landing pad into a
927   // cold fragment when the corresponding call site is in the hot fragment.
928   // Because of this issue and the previously described issue of possible
929   // zero-offset landing pad we disable splitting of exception-handling
930   // code for shared objects.
931   std::function<void(const MCSymbol *)> emitLandingPad;
932   if (BC.HasFixedLoadAddress) {
933     Streamer.emitIntValue(dwarf::DW_EH_PE_udata4, 1); // LPStart format
934     Streamer.emitIntValue(0, 4);                      // LPStart
935     emitLandingPad = [&](const MCSymbol *LPSymbol) {
936       if (!LPSymbol)
937         Streamer.emitIntValue(0, 4);
938       else
939         Streamer.emitSymbolValue(LPSymbol, 4);
940     };
941   } else {
942     assert(!EmitColdPart &&
943            "cannot have exceptions in cold fragment for shared object");
944     Streamer.emitIntValue(dwarf::DW_EH_PE_omit, 1); // LPStart format
945     emitLandingPad = [&](const MCSymbol *LPSymbol) {
946       if (!LPSymbol)
947         Streamer.emitIntValue(0, 4);
948       else
949         Streamer.emitAbsoluteSymbolDiff(LPSymbol, StartSymbol, 4);
950     };
951   }
952 
953   Streamer.emitIntValue(TTypeEncoding, 1); // TType format
954 
955   // See the comment in EHStreamer::emitExceptionTable() on to use
956   // uleb128 encoding (which can use variable number of bytes to encode the same
957   // value) to ensure type info table is properly aligned at 4 bytes without
958   // iteratively fixing sizes of the tables.
959   unsigned CallSiteTableLengthSize = getULEB128Size(CallSiteTableLength);
960   unsigned TTypeBaseOffset =
961       sizeof(int8_t) +                 // Call site format
962       CallSiteTableLengthSize +        // Call site table length size
963       CallSiteTableLength +            // Call site table length
964       BF.getLSDAActionTable().size() + // Actions table size
965       BF.getLSDATypeTable().size() * TTypeEncodingSize; // Types table size
966   unsigned TTypeBaseOffsetSize = getULEB128Size(TTypeBaseOffset);
967   unsigned TotalSize = sizeof(int8_t) +      // LPStart format
968                        sizeof(int8_t) +      // TType format
969                        TTypeBaseOffsetSize + // TType base offset size
970                        TTypeBaseOffset;      // TType base offset
971   unsigned SizeAlign = (4 - TotalSize) & 3;
972 
973   // Account for any extra padding that will be added to the call site table
974   // length.
975   Streamer.emitULEB128IntValue(TTypeBaseOffset,
976                                /*PadTo=*/TTypeBaseOffsetSize + SizeAlign);
977 
978   // Emit the landing pad call site table. We use signed data4 since we can emit
979   // a landing pad in a different part of the split function that could appear
980   // earlier in the address space than LPStart.
981   Streamer.emitIntValue(dwarf::DW_EH_PE_sdata4, 1);
982   Streamer.emitULEB128IntValue(CallSiteTableLength);
983 
984   for (const BinaryFunction::CallSite &CallSite : *Sites) {
985     const MCSymbol *BeginLabel = CallSite.Start;
986     const MCSymbol *EndLabel = CallSite.End;
987 
988     assert(BeginLabel && "start EH label expected");
989     assert(EndLabel && "end EH label expected");
990 
991     // Start of the range is emitted relative to the start of current
992     // function split part.
993     Streamer.emitAbsoluteSymbolDiff(BeginLabel, StartSymbol, 4);
994     Streamer.emitAbsoluteSymbolDiff(EndLabel, BeginLabel, 4);
995     emitLandingPad(CallSite.LP);
996     Streamer.emitULEB128IntValue(CallSite.Action);
997   }
998 
999   // Write out action, type, and type index tables at the end.
1000   //
1001   // For action and type index tables there's no need to change the original
1002   // table format unless we are doing function splitting, in which case we can
1003   // split and optimize the tables.
1004   //
1005   // For type table we (re-)encode the table using TTypeEncoding matching
1006   // the current assembler mode.
1007   for (uint8_t const &Byte : BF.getLSDAActionTable())
1008     Streamer.emitIntValue(Byte, 1);
1009 
1010   const BinaryFunction::LSDATypeTableTy &TypeTable =
1011       (TTypeEncoding & dwarf::DW_EH_PE_indirect) ? BF.getLSDATypeAddressTable()
1012                                                  : BF.getLSDATypeTable();
1013   assert(TypeTable.size() == BF.getLSDATypeTable().size() &&
1014          "indirect type table size mismatch");
1015 
1016   for (int Index = TypeTable.size() - 1; Index >= 0; --Index) {
1017     const uint64_t TypeAddress = TypeTable[Index];
1018     switch (TTypeEncoding & 0x70) {
1019     default:
1020       llvm_unreachable("unsupported TTypeEncoding");
1021     case dwarf::DW_EH_PE_absptr:
1022       Streamer.emitIntValue(TypeAddress, TTypeEncodingSize);
1023       break;
1024     case dwarf::DW_EH_PE_pcrel: {
1025       if (TypeAddress) {
1026         const MCSymbol *TypeSymbol =
1027             BC.getOrCreateGlobalSymbol(TypeAddress, "TI", 0, TTypeAlignment);
1028         MCSymbol *DotSymbol = BC.Ctx->createNamedTempSymbol();
1029         Streamer.emitLabel(DotSymbol);
1030         const MCBinaryExpr *SubDotExpr = MCBinaryExpr::createSub(
1031             MCSymbolRefExpr::create(TypeSymbol, *BC.Ctx),
1032             MCSymbolRefExpr::create(DotSymbol, *BC.Ctx), *BC.Ctx);
1033         Streamer.emitValue(SubDotExpr, TTypeEncodingSize);
1034       } else {
1035         Streamer.emitIntValue(0, TTypeEncodingSize);
1036       }
1037       break;
1038     }
1039     }
1040   }
1041   for (uint8_t const &Byte : BF.getLSDATypeIndexTable())
1042     Streamer.emitIntValue(Byte, 1);
1043 }
1044 
1045 void BinaryEmitter::emitDebugLineInfoForOriginalFunctions() {
1046   // If a function is in a CU containing at least one processed function, we
1047   // have to rewrite the whole line table for that CU. For unprocessed functions
1048   // we use data from the input line table.
1049   for (auto &It : BC.getBinaryFunctions()) {
1050     const BinaryFunction &Function = It.second;
1051 
1052     // If the function was emitted, its line info was emitted with it.
1053     if (Function.isEmitted())
1054       continue;
1055 
1056     const DWARFDebugLine::LineTable *LineTable = Function.getDWARFLineTable();
1057     if (!LineTable)
1058       continue; // nothing to update for this function
1059 
1060     const uint64_t Address = Function.getAddress();
1061     std::vector<uint32_t> Results;
1062     if (!LineTable->lookupAddressRange(
1063             {Address, object::SectionedAddress::UndefSection},
1064             Function.getSize(), Results))
1065       continue;
1066 
1067     if (Results.empty())
1068       continue;
1069 
1070     // The first row returned could be the last row matching the start address.
1071     // Find the first row with the same address that is not the end of the
1072     // sequence.
1073     uint64_t FirstRow = Results.front();
1074     while (FirstRow > 0) {
1075       const DWARFDebugLine::Row &PrevRow = LineTable->Rows[FirstRow - 1];
1076       if (PrevRow.Address.Address != Address || PrevRow.EndSequence)
1077         break;
1078       --FirstRow;
1079     }
1080 
1081     const uint64_t EndOfSequenceAddress =
1082         Function.getAddress() + Function.getMaxSize();
1083     BC.getDwarfLineTable(Function.getDWARFUnit()->getOffset())
1084         .addLineTableSequence(LineTable, FirstRow, Results.back(),
1085                               EndOfSequenceAddress);
1086   }
1087 
1088   // For units that are completely unprocessed, use original debug line contents
1089   // eliminating the need to regenerate line info program.
1090   emitDebugLineInfoForUnprocessedCUs();
1091 }
1092 
1093 void BinaryEmitter::emitDebugLineInfoForUnprocessedCUs() {
1094   // Sorted list of section offsets provides boundaries for section fragments,
1095   // where each fragment is the unit's contribution to debug line section.
1096   std::vector<uint64_t> StmtListOffsets;
1097   StmtListOffsets.reserve(BC.DwCtx->getNumCompileUnits());
1098   for (const std::unique_ptr<DWARFUnit> &CU : BC.DwCtx->compile_units()) {
1099     DWARFDie CUDie = CU->getUnitDIE();
1100     auto StmtList = dwarf::toSectionOffset(CUDie.find(dwarf::DW_AT_stmt_list));
1101     if (!StmtList)
1102       continue;
1103 
1104     StmtListOffsets.push_back(*StmtList);
1105   }
1106   std::sort(StmtListOffsets.begin(), StmtListOffsets.end());
1107 
1108   // For each CU that was not processed, emit its line info as a binary blob.
1109   for (const std::unique_ptr<DWARFUnit> &CU : BC.DwCtx->compile_units()) {
1110     if (BC.ProcessedCUs.count(CU.get()))
1111       continue;
1112 
1113     DWARFDie CUDie = CU->getUnitDIE();
1114     auto StmtList = dwarf::toSectionOffset(CUDie.find(dwarf::DW_AT_stmt_list));
1115     if (!StmtList)
1116       continue;
1117 
1118     StringRef DebugLineContents = CU->getLineSection().Data;
1119 
1120     const uint64_t Begin = *StmtList;
1121 
1122     // Statement list ends where the next unit contribution begins, or at the
1123     // end of the section.
1124     auto It =
1125         std::upper_bound(StmtListOffsets.begin(), StmtListOffsets.end(), Begin);
1126     const uint64_t End =
1127         It == StmtListOffsets.end() ? DebugLineContents.size() : *It;
1128 
1129     BC.getDwarfLineTable(CU->getOffset())
1130         .addRawContents(DebugLineContents.slice(Begin, End));
1131   }
1132 }
1133 
1134 void BinaryEmitter::emitDataSections(StringRef OrgSecPrefix) {
1135   for (BinarySection &Section : BC.sections()) {
1136     if (!Section.hasRelocations() || !Section.hasSectionRef())
1137       continue;
1138 
1139     StringRef SectionName = Section.getName();
1140     std::string EmitName = Section.isReordered()
1141                                ? std::string(Section.getOutputName())
1142                                : OrgSecPrefix.str() + std::string(SectionName);
1143     Section.emitAsData(Streamer, EmitName);
1144     Section.clearRelocations();
1145   }
1146 }
1147 
1148 namespace llvm {
1149 namespace bolt {
1150 
1151 void emitBinaryContext(MCStreamer &Streamer, BinaryContext &BC,
1152                        StringRef OrgSecPrefix) {
1153   BinaryEmitter(Streamer, BC).emitAll(OrgSecPrefix);
1154 }
1155 
1156 void emitFunctionBody(MCStreamer &Streamer, BinaryFunction &BF,
1157                       bool EmitColdPart, bool EmitCodeOnly) {
1158   BinaryEmitter(Streamer, BF.getBinaryContext())
1159       .emitFunctionBody(BF, EmitColdPart, EmitCodeOnly);
1160 }
1161 
1162 } // namespace bolt
1163 } // namespace llvm
1164