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